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