Example #1
0
    def addKey(self, cname, key):
        if cname and not isValidUserName(cname):
            return self._error("Bad username.")

        k = RSAKey()
        try:
            k.fromPEM_PublicKey(pemPublicKey)
        except RSAError:
            return self._error("Bad PEM-encoded key.")

        contact = Contact(k, cname)
        self._onAddContact(contact)
Example #2
0
def verifySignature( publicKey, data, updateLevel, signature ) :
    payload = encode( ('DHT-DATA',data,updateLevel) )
    if type(publicKey) is str :
        k = RSAKey()
        try :
            k.fromDER_PublicKey( publicKey )
        except RSAError :
            return False
    else :
        k = publicKey
    try :
        digest = Digest(digestType).digest( payload )
        k.verify( signature, digest, digestType )
        return True
    except RSAError :
        return False
Example #3
0
 def _doConnectPubKey( self, words ) :
     if len(words) != 2 :
         self._writeError( 'Malformed request' )
         return
     hexPubKey, service = words
     if not self.session.isOnline() :
         self._writeError( 'Not online' )
         return
     try :
         pubKeyData = hexDecode( hexPubKey )
         pubKey = RSAKey()
         pubKey.fromDER_PublicKey( pubKeyData )
     except (HexDecodeError,RSAError) :
         self._writeError( 'Malformed publickey' )
         return
     self._connectInternal( pubKey, service )
Example #4
0
    def _onLookupResponse(self, responseCode, data):
        if responseCode != 200:
            self._addOp.notify(None)
            return
        inp = StringIO.StringIO(data)
        name = inp.readline().strip()
        pemPublicKey = inp.read()
        if name and not isValidUserName(name):
            self._addOp.notify(None)
            return

        k = RSAKey()
        try:
            k.fromPEM_PublicKey(pemPublicKey)
        except RSAError:
            self._addOp.notify(None)

        contact = Contact(k, self._addOp.cname)
        self._addOp.notify(contact)
Example #5
0
 def onSSLConnect( err ) :
     global logger
     if err is not None :
         logger.error( 'ssl connect err=%s' % str(err) )
         sslAbort( sslConn )
         op.notify( None )
         return
     try :
         peerCert = sslConn.getPeerCertificate()
         peerKey = RSAKey()
         peerKey.fromPKey_PublicKey(peerCert.get_pubkey())
         CN = peerCert.get_subject().CN
         if CN.count('@'):
             peerName, peerKeyID = CN.split('@')
         else:
             peerName, peerKeyID = CN, ''
     except (SSLError,X509Error,RSAError), e :
         logger.exception( 'ssl connect error' )
         sslAbort( sslConn )
         op.notify( None )
         return
Example #6
0
 def onSSLAccept( err ) :
     global logger
     if err is not None :
         sslAbort( sslConn )
         op.notify( None )
         return
     try :
         peerCert = sslConn.getPeerCertificate()
         peerKey = RSAKey()
         peerKey.fromPKey_PublicKey(peerCert.get_pubkey())
         CN = peerCert.get_subject().CN
         if CN.count('@'):
             peerName, peerKeyID = CN.split('@')
         else:
             peerName, peerKeyID = CN, ''
     except (SSLError,X509Error,RSAError) :
         logger.exception('ssl accept error')
         sslAbort( sslConn )
         op.notify( None )
         return
     data = (sslConn,peerKey,peerName,peerKeyID)
     # logger.info('onSSLAccept SUCCESSFUL with %s' % str(peerName))
     op.notify( data )
Example #7
0
def loadProfile( entry, password, location='CSpaceProfiles') :
    ps = profileSettings(location)
    userName = ps.getData( entry+'/Name' )
    keyId = ps.getData( entry+'/KeyID' )
    encKey = ps.getData( entry+'/PrivateKey' )
    rsaKey = RSAKey()
    try :
        rsaKey.fromPEM_PrivateKey( encKey, password )
    except RSAError :
        return None
    profile = Profile( rsaKey, userName, keyId, entry )
    contactsData = ps.getData( entry+'/ContactList', '' )
    for line in contactsData.split('\n') :
        line = line.strip()
        if not line : continue
        name,hexKey = line.split(':')
        assert isValidUserName(name)
        pubKey = RSAKey()
        pubKey.fromDER_PublicKey( hexDecode(hexKey) )
        contact = Contact( pubKey, name )
        profile.addContact( contact )
    return profile