'Return a Key object corresponding to the string data.
type is optionally the type of string, matching a _fromString_*
method.  Otherwise, the _guessStringType() classmethod will be used
to guess a type.  If the key is encrypted, passphrase is used as
the decryption key.
@type data: L{bytes}
@param data: The key data.
@type type: L{str} or L{None}
@param type: A string describing the format the key data is in, or
L{None} to attempt detection of the type.
@type passphrase: L{bytes} or L{None}
@param passphrase: The passphrase the key is encrypted with, or L{None}
if there is no encryption.
@rtype: L{Key}
@return: The loaded key.'

@classmethod
def fromString(cls, data, type=None, passphrase=None):

    if isinstance(data, unicode):
        data = data.encode('utf-8')
    if isinstance(passphrase, unicode):
        passphrase = passphrase.encode('utf-8')
    if (type is None):
        type = cls._guessStringType(data)
    if (type is None):
        raise BadKeyError(('cannot    guess    the    type    of    %r' % (data,)))
    method = getattr(cls, ('_fromString_%s' % (type.upper(),)), None)
    if (method is None):
        raise BadKeyError(('no    _fromString    method    for    %s' % (type,)))
    if (method.__code__.co_argcount == 2):
        if passphrase:
            raise BadKeyError('key    not    encrypted')
        return method(data)
    else:
        return method(data, passphrase)
