'Public key authentication.  Payload::
byte has signature
string algorithm name
string key blob
[string signature] (if has signature is True)
Create a SSHPublicKey credential and verify it using our portal.'

def auth_publickey(self, packet):

    hasSig = ord(packet[0:1])
    (algName, blob, rest) = getNS(packet[1:], 2)
    try:
        pubKey = keys.Key.fromString(blob)
    except keys.BadKeyError:
        error = ('Unsupported    key    type    %s    or    bad    key' % (algName.decode('ascii'),))
        log.msg(error)
        return defer.fail(UnauthorizedLogin(error))
    signature = ((hasSig and getNS(rest)[0]) or None)
    if hasSig:
        b = (((((((NS(self.transport.sessionID) + chr(MSG_USERAUTH_REQUEST)) + NS(self.user)) + NS(self.nextService)) + NS('publickey')) + chr(hasSig)) + NS(pubKey.sshType())) + NS(blob))
        c = credentials.SSHPrivateKey(self.user, algName, blob, b, signature)
        return self.portal.login(c, None, interfaces.IConchUser)
    else:
        c = credentials.SSHPrivateKey(self.user, algName, blob, None, None)
        return self.portal.login(c, None, interfaces.IConchUser).addErrback(self._ebCheckKey, packet[1:])
