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)
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
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 )
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)
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
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 )
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