def _create_poa_message(self, msg_id, nonce_a, nonce_b): if not self.poa: raise MissingCertificateException('Missing certificate') msg = [msg_id] + self.poa.serialize_to_list() lst = [nonce_a, nonce_b, self.poa.serialize()] b_list = bencode(lst) digest = permid.sha(b_list).digest() sig = self.my_keypair.sign_dsa_asn1(digest) msg.append(sig) return msg
def verify(self): if self.expire_time and self.expire_time < time.mktime(time.gmtime()): raise POAExpiredException('Expired') try: lst = [self.torrent_id, self.torrent_pub_key, self.node_pub_key] b_list = bencode(lst) digest = permid.sha(b_list).digest() pub = pub_key_from_der(self.torrent_pub_key) if not pub.verify_dsa_asn1(digest, self.signature): raise InvalidPOAException('Proof of access verification failed') except Exception as e: raise InvalidPOAException('Bad POA: %s' % e)
def verify(self): if self.expire_time and self.expire_time < time.mktime(time.gmtime()): raise POAExpiredException('Expired') try: lst = [self.torrent_id, self.torrent_pub_key, self.node_pub_key] b_list = bencode(lst) digest = permid.sha(b_list).digest() pub = pub_key_from_der(self.torrent_pub_key) if not pub.verify_dsa_asn1(digest, self.signature): raise InvalidPOAException( 'Proof of access verification failed') except Exception as e: raise InvalidPOAException('Bad POA: %s' % e)
def _validate_poa_message(self, lst, nonce_a, nonce_b): if len(lst) != 7: raise BadMessageException('Require 7 elements, got %d' % len(lst)) poa = POA.deserialize_from_list(lst[1:-1]) sig = lst[-1] if poa.torrent_id != self.torrent_id: raise WrongSwarmException('Wrong swarm') if poa.get_torrent_pub_key() not in self.torrent_pubkeys: raise InvalidPOAException('Bad POA for this torrent') lst = [nonce_a, nonce_b, poa.serialize()] import sys b_list = bencode(lst) digest = permid.sha(b_list).digest() try: pub = pub_key_from_der(poa.node_pub_key) except: print >> sys.stderr, 'The node_pub_key is no good' print >> sys.stderr, poa.node_pub_key raise Exception("Node's public key is no good...") if not pub.verify_dsa_asn1(digest, sig): raise InvalidSignatureException('Freshness test failed') poa.verify() return poa
def sign(self, torrent_key_pair): lst = [self.torrent_id, self.torrent_pub_key, self.node_pub_key] b_list = bencode(lst) digest = permid.sha(b_list).digest() self.signature = torrent_key_pair.sign_dsa_asn1(digest)