Example #1
0
 def setupDB(self,nickname):
     # Change at runtime. Must be set before DB inserts
     self.session.set_nickname(nickname)
     
     self.torrent_db = self.session.open_dbhandler(NTFY_TORRENTS)
     self.channelcast_db = self.session.open_dbhandler(NTFY_CHANNELCAST)
     self.votecast_db = self.session.open_dbhandler(NTFY_VOTECAST)
     try:
         # Add some torrents belonging to own channel
         tdef1, self.bmetainfo1 = self.get_default_torrent('sumfilename1','Hallo S01E10')
         dbrec= self.torrent_db.addExternalTorrent(tdef1, extra_info={"filename":"sumfilename1"})
         self.infohash1 = tdef1.get_infohash()
         self.channelcast_db.addOwnTorrent(tdef1)
         
         tdef2, self.bmetainfo2 = self.get_default_torrent('sumfilename2','Hallo S02E01')
         dbrec = self.torrent_db.addExternalTorrent(tdef2, extra_info={"filename":"sumfilename2"})
         self.infohash2 = tdef2.get_infohash()
         self.torrenthash2 = sha(self.bmetainfo2).digest()
         self.channelcast_db.addOwnTorrent(tdef2)
 
         tdef3, self.bmetainfo3 = self.get_default_torrent('sumfilename3','Halo Demo')
         self.torrent_db.addExternalTorrent(tdef3, extra_info={"filename":"sumfilename3"})
         self.infohash3 = tdef3.get_infohash()
         self.torrenthash3 = sha(self.bmetainfo3).digest()
         self.channelcast_db.addOwnTorrent(tdef3)
         
         # Now, add some votes
         self.votecast_db.subscribe("MFIwEAYHKoZIzj0CAQYFK4EEABoDPgAEAIV8h+eS+vQ+0uqZNv3MYYTLo5s0JP+cmkvJ7U4JAHhfRv1wCqZSKIuY7Q+3ESezhRnnmmX4pbOVhKTU")
         self.votecast_db.spam("MFIwEAYHKoZIzj0CAQYFK4EEABoDPgAEAIV8h+eS+vQ+0uqZNv3MYYTLo5s0JP+cmkvJ7U4JAHhfRv1wCqZSKIuY7Q+3ESezhRnnmmX4pbOVhKTX")
         vote = {'mod_id':"MFIwEAYHKoZIzj0CAQYFK4EEABoDPgAEAIV8h+eS+vQ+0uqZNv3MYYTLo5s0JP+cmkvJ7U4JAHhfRv1wCqZSKIuY7Q+3ESezhRnnmmX4pbOVhKTU", 'voter_id':"MFIwEAYHKoZIzj0CAQYFK4EEABoDPgAEAIV8h+eS+vQ+0uqZNv3MYYTLo5s0JP+cmkvJ7U4JAHhfRv1wCqZSKIuY7Q+3ESezhRnnmmX4pbOVhKTX",'vote':1, 'time_stamp':132314}
         self.votecast_db.addVote(vote)
     except:
         print_exc()
Example #2
0
    def getSomeMetadata(self, channel_id, infohash):

            
        s1 = SubtitleInfo("eng", None)
        s2 = SubtitleInfo("rus", None)
        
        self.content1 = u"Subtitle Content 1"
        self.content2 = u"Subtitle Content 2"
        
        hasher = sha()
        hasher.update(self.content1)
        s1.checksum = hasher.digest()
        
        hasher = sha()
        hasher.update(self.content2)
        s2.checksum = hasher.digest()
            
        metadata = MetadataDTO(channel_id, infohash, time.time(),
                               "", {"eng":s1, "rus":s2})
        
        if self.nextKeypair is None:
            metadata.signature = "fake"
        else:
            metadata.sign(self.nextKeypair)
   
        return metadata
    def setUpPostSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPostSession(self)

        self.mypermid = str(self.my_keypair.pub().get_der())
        self.hispermid = str(self.his_keypair.pub().get_der())        
        self.myhash = sha(self.mypermid).digest()
Example #4
0
 def check_response1(self, resp1_data, rB, myid):
     resp1 = bdecode(resp1_data)
     self.assert_(type(resp1) == DictType)
     self.assert_(resp1.has_key('certA'))
     self.assert_(resp1.has_key('rA'))
     self.assert_(resp1.has_key('B'))
     self.assert_(resp1.has_key('SA'))
     # show throw exception when key no good
     pubA = EC.pub_key_from_der(resp1['certA'])
     rA = resp1['rA']
     self.assert_(type(rA) == StringType)
     self.assert_(len(rA) == random_size)
     B = resp1['B']
     self.assert_(type(B) == StringType)
     self.assert_(B, myid)
     SA = resp1['SA']
     self.assert_(type(SA) == StringType)
     # verify signature
     sig_list = [rA, rB, myid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     self.assert_(pubA.verify_dsa_asn1(sig_hash, SA))
     # Cannot resign the data with his keypair to double check. Signing
     # appears to yield different, supposedly valid sigs each time.
     return resp1
Example #5
0
 def check_response1(self, resp1_data, rB, myid):
     resp1 = bdecode(resp1_data)
     self.assert_(type(resp1) == DictType)
     self.assert_(resp1.has_key("certA"))
     self.assert_(resp1.has_key("rA"))
     self.assert_(resp1.has_key("B"))
     self.assert_(resp1.has_key("SA"))
     # show throw exception when key no good
     pubA = EC.pub_key_from_der(resp1["certA"])
     rA = resp1["rA"]
     self.assert_(type(rA) == StringType)
     self.assert_(len(rA) == random_size)
     B = resp1["B"]
     self.assert_(type(B) == StringType)
     self.assert_(B, myid)
     SA = resp1["SA"]
     self.assert_(type(SA) == StringType)
     # verify signature
     sig_list = [rA, rB, myid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     self.assert_(pubA.verify_dsa_asn1(sig_hash, SA))
     # Cannot resign the data with his keypair to double check. Signing
     # appears to yield different, supposedly valid sigs each time.
     return resp1
    def setUpPostSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPostSession(self)

        self.mypermid = str(self.my_keypair.pub().get_der())
        self.hispermid = str(self.his_keypair.pub().get_der())        
        self.myhash = sha(self.mypermid).digest()

        # Give Tribler some download history
        print >>sys.stderr,"test: Populating MYPREFERENCES table"
        self.myprefdb = self.session.open_dbhandler(NTFY_MYPREFERENCES)
        data = {'destination_path':'.'}
        infohashes = self.create_good_my_prefs(self,btconn.current_version)
        for i in range(0,len(infohashes)):
            commit = (i == len(infohashes)-1) 
            self.myprefdb.addMyPreference(infohashes[i], data, commit=commit)

        # Give Tribler some peers
        print >>sys.stderr,"test: Populating PEERS table"
        self.peerdb = self.session.open_dbhandler(NTFY_PEERS)
        past = int(time.time())-1000000000
        peers = self.create_good_random_peers(btconn.current_version,num=200)
        
        peers = []
        
        for i in range(0,len(peers)):
            peer = peers[i]
            peer.update({'last_seen':past, 'last_connected':past})
            del peer['connect_time']
            peer['num_torrents'] = peer['nfiles'] 
            del peer['nfiles']
            commit = (i == len(peers)-1)
            self.peerdb.addPeer(peer['permid'], peer, update_dns=True, update_connected=True, commit=commit)
Example #7
0
    def setUpPostSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPostSession(self)

        self.mypermid = str(self.my_keypair.pub().get_der())
        self.hispermid = str(self.his_keypair.pub().get_der())
        self.myhash = sha(self.mypermid).digest()
    def save_torrent(self, infohash, metadata, source='BC', extra_info={}):
        # check if disk is full before save it to disk and database
        if not self.initialized:
            return None

        self.check_overflow()
            
        if self.min_free_space != 0 and (self.free_space - len(metadata) < self.min_free_space or self.num_collected_torrents % 10 == 0):
            self.free_space = self.get_free_space()
            if self.free_space - len(metadata) < self.min_free_space:
                self.warn_disk_full()
                return None
        
        file_name = get_collected_torrent_filename(infohash)
        if DEBUG:
            print >> sys.stderr,"metadata: Storing torrent", sha(infohash).hexdigest(),"in",file_name
        
        save_path = self.write_torrent(metadata, self.torrent_dir, file_name)
        if save_path:
            self.num_collected_torrents += 1
            self.free_space -= len(metadata)
            self.addTorrentToDB(save_path, infohash, metadata, source=source, extra_info=extra_info)
            # check if space is enough and remove old torrents
            
        return file_name
Example #9
0
def fill_tree(tree,height,npieces,hashes):
    # 1. Fill bottom of tree with hashes
    startoffset = int(pow(2,height)-1)
    if DEBUG:
        print >> sys.stderr,time.asctime(),'-', "merkle: bottom of tree starts at",startoffset
    for offset in range(startoffset,startoffset+npieces):
        #print >> sys.stderr,time.asctime(),'-', "merkle: copying",offset
        #print >> sys.stderr,time.asctime(),'-', "merkle: hashes[",offset-startoffset,"]=",str(hashes[offset-startoffset])
        tree[offset] = hashes[offset-startoffset]
    # 2. Note that unused leaves are NOT filled. It may be a good idea to fill
    # them as hashing 0 values may create a security problem. However, the
    # filler values would have to be known to any initial seeder, otherwise it 
    # will not be able build the same hash tree as the other initial seeders.
    # Assume anyone should be able to autonomously become a seeder, the filler 
    # must be public info. I don't know whether having public info as filler 
    # instead of 0s is any safer, cryptographically speaking. Hence, we stick 
    # with 0 for the moment

    # 3. Calculate higher level hashes from leaves
    for level in range(height,0,-1):
        if DEBUG:
            print >> sys.stderr,time.asctime(),'-', "merkle: calculating level",level
        for offset in range(int(pow(2,level)-1),int(pow(2,level+1)-2),2):
            #print >> sys.stderr,time.asctime(),'-', "merkle: data offset",offset
            [ parentstartoffset, parentoffset ] = get_parent_offset(offset,level)
            #print >> sys.stderr,time.asctime(),'-', "merkle: parent offset",parentoffset                
            data = tree[offset]+tree[offset+1]
            digester = sha()
            digester.update(data)
            digest = digester.digest()
            tree[parentoffset] = digest
    #for offset in range(0,treesize-1):
    #        print offset,"HASH",str(tree[offset])
    return tree
    def save_torrent(self, infohash, metadata, source='BC', extra_info={}):
        # check if disk is full before save it to disk and database
        if not self.initialized:
            return None

        self.check_overflow()

        if self.min_free_space != 0 and (
                self.free_space - len(metadata) < self.min_free_space
                or self.num_collected_torrents % 10 == 0):
            self.free_space = self.get_free_space()
            if self.free_space - len(metadata) < self.min_free_space:
                self.warn_disk_full()
                return None

        file_name = get_collected_torrent_filename(infohash)
        if DEBUG:
            print >> sys.stderr, "metadata: Storing torrent", sha(
                infohash).hexdigest(), "in", file_name

        save_path = self.write_torrent(metadata, self.torrent_dir, file_name)
        if save_path:
            self.num_collected_torrents += 1
            self.free_space -= len(metadata)
            self.addTorrentToDB(save_path,
                                infohash,
                                metadata,
                                source=source,
                                extra_info=extra_info)
            # check if space is enough and remove old torrents

        return file_name
Example #11
0
def create_torrent_signature(metainfo,keypairfilename):
    keypair = EC.load_key(keypairfilename)
    bmetainfo = bencode(metainfo)
    digester = sha(bmetainfo[:])
    digest = digester.digest()
    sigstr = keypair.sign_dsa_asn1(digest)
    metainfo['signature'] = sigstr
    metainfo['signer'] = str(keypair.pub().get_der())
Example #12
0
def create_torrent_signature(metainfo,keypairfilename):
    keypair = EC.load_key(keypairfilename)
    bmetainfo = bencode(metainfo)
    digester = sha(bmetainfo[:])
    digest = digester.digest()
    sigstr = keypair.sign_dsa_asn1(digest)
    metainfo['signature'] = sigstr
    metainfo['signer'] = str(keypair.pub().get_der())
Example #13
0
 def verify(self,piece,index):
     """ A piece is valid if:
     - the signature is correct,
     - the seqnum % npieces == piecenr.
     - the seqnum is no older than self.seqnum - npieces
     @param piece The piece data as received from peer
     @param index The piece number as received from peer
     @return Boolean
     """
     try:
         # Can we do this without memcpy?
         #print >>sys.stderr,"ECDSAAuth: verify",len(piece)
         extra = piece[-self.OUR_SIGSIZE:-self.OUR_SIGSIZE+self.EXTRA_SIZE]
         lensig = ord(piece[-self.OUR_SIGSIZE+self.EXTRA_SIZE])
         if lensig > self.MAX_ECDSA_ASN1_SIGSIZE:
             print >>sys.stderr,"ECDSAAuth: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ failed piece",index,"lensig wrong",lensig
             return False
         #print >>sys.stderr,"ECDSAAuth: verify lensig",lensig
         diff = lensig-self.MAX_ECDSA_ASN1_SIGSIZE
         if diff == 0:
             sig = piece[-self.OUR_SIGSIZE+self.EXTRA_SIZE+self.LENGTH_SIZE:]
         else:
             sig = piece[-self.OUR_SIGSIZE+self.EXTRA_SIZE+self.LENGTH_SIZE:diff]
         content = piece[:-self.OUR_SIGSIZE]
         if DEBUG:
             print >>sys.stderr,"ECDSAAuth: verify piece",index,"sig",`sig`
             print >>sys.stderr,"ECDSAAuth: verify dig",sha(content).hexdigest()
     
         ret = ecdsa_verify_data_pubkeyobj(content,extra,self.pubkey,sig)
         if ret:
             (seqnum, rtstamp) = self._decode_extra(piece)
             
             if DEBUG:
                 print >>sys.stderr,"ECDSAAuth: verify piece",index,"seq",seqnum,"ts %.5f s" % rtstamp,"ls",lensig
             
             mod = seqnum % self.get_npieces()
             thres = self.seqnum - self.get_npieces()/2
             if seqnum <= thres:
                 print >>sys.stderr,"ECDSAAuth: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ failed piece",index,"old seqnum",seqnum,"<<",self.seqnum
                 return False
             elif mod != index:
                 print >>sys.stderr,"ECDSAAuth: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ failed piece",index,"expected",mod
                 return False 
             elif self.startts is not None and rtstamp < self.startts:
                 print >>sys.stderr,"ECDSAAuth: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ failed piece",index,"older than oldest known ts",rtstamp,self.startts
                 return False
             else:
                 self.seqnum = max(self.seqnum,seqnum)
                 if self.startts is None:
                     self.startts = rtstamp-300.0 # minus 5 min in case we read piece N+1 before piece N
                     print >>sys.stderr,"ECDSAAuth: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@: startts",self.startts
         else:
             print >>sys.stderr,"ECDSAAuth: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ piece",index,"failed sig"
         
         return ret
     except:
         print_exc()
         return False 
Example #14
0
 def create_resp2_bad_sig_input(self, rB, resp1_dict, hisid):
     resp2 = {}
     resp2["certB"] = str(self.my_keypair.pub().get_der())
     resp2["A"] = hisid
     sig_data = "\x00\x00\x00\x00\x00\x30\x00\x00"
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp2["SB"] = sig_asn1
     return self.create_response2_payload(resp2)
Example #15
0
 def create_resp2_bad_sig_input(self, rB, resp1_dict, hisid):
     resp2 = {}
     resp2['certB'] = str(self.my_keypair.pub().get_der())
     resp2['A'] = hisid
     sig_data = '\x00\x00\x00\x00\x00\x30\x00\x00'
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp2['SB'] = sig_asn1
     return self.create_response2_payload(resp2)
Example #16
0
    def testGetSubtitlesFileRelativeName(self):
        # subtitles filenames are build from the sha1 hash
        # of the triple (channel_id, infohash, langCode)
        name = getSubtitleFileRelativeName(testChannelId, testInfohash, "rus")
        hasher = sha()
        for value in (testChannelId, testInfohash, "rus"):
            hasher.update(value)

        self.assertEquals(hasher.hexdigest() + ".srt", name)
Example #17
0
    def verify(self, piece, index):
        """ A piece is valid if:
        - the signature is correct,
        - the seqnum % npieces == piecenr.
        - the seqnum is no older than self.seqnum - npieces
        @param piece The piece data as received from peer
        @param index The piece number as received from peer
        @return Boolean
        """
        try:
            # Can we do this without memcpy?
            #print >>sys.stderr,"ECDSAAuth: verify",len(piece)
            extra = piece[-self.OUR_SIGSIZE:-self.OUR_SIGSIZE +
                          self.EXTRA_SIZE]
            lensig = ord(piece[-self.OUR_SIGSIZE + self.EXTRA_SIZE])
            if lensig > self.MAX_ECDSA_ASN1_SIGSIZE:
                print >> sys.stderr, "ECDSAAuth: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ failed piece", index, "lensig wrong", lensig
                return False
            #print >>sys.stderr,"ECDSAAuth: verify lensig",lensig
            diff = lensig - self.MAX_ECDSA_ASN1_SIGSIZE
            if diff == 0:
                sig = piece[-self.OUR_SIGSIZE + self.EXTRA_SIZE +
                            self.LENGTH_SIZE:]
            else:
                sig = piece[-self.OUR_SIGSIZE + self.EXTRA_SIZE +
                            self.LENGTH_SIZE:diff]
            content = piece[:-self.OUR_SIGSIZE]
            if DEBUG:
                print >> sys.stderr, "ECDSAAuth: verify piece", index, "sig", ` sig `
                print >> sys.stderr, "ECDSAAuth: verify dig", sha(
                    content).hexdigest()

            ret = ecdsa_verify_data_pubkeyobj(content, extra, self.pubkey, sig)
            if ret:
                (seqnum, rtstamp) = struct.unpack('>Qd', extra)

                if DEBUG:
                    print >> sys.stderr, "ECDSAAuth: verify piece", index, "seq", seqnum, "ts %.5f s" % rtstamp, "ls", lensig

                mod = seqnum % self.get_npieces()
                thres = self.seqnum - self.get_npieces() / 2
                if seqnum <= thres:
                    print >> sys.stderr, "ECDSAAuth: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ failed piece", index, "old seqnum", seqnum, "<<", self.seqnum
                    return False
                elif mod != index:
                    print >> sys.stderr, "ECDSAAuth: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ failed piece", index, "expected", mod
                    return False
                else:
                    self.seqnum = max(self.seqnum, seqnum)
            else:
                print >> sys.stderr, "ECDSAAuth: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ piece", index, "failed sig"

            return ret
        except:
            print_exc()
            return False
Example #18
0
def verify_torrent_signature(metainfo):
    r = deepcopy(metainfo)
    signature = r['signature']
    signer = r['signer']
    del r['signature']
    del r['signer']
    bmetainfo = bencode(r)
    digester = sha(bmetainfo[:])
    digest = digester.digest()
    return do_verify_torrent_signature(digest,signature,signer)
Example #19
0
def rsa_verify_data_pubkeyobj(plaintext,extra,pubkey,sig):
    digester = sha(plaintext)
    digester.update(extra)
    digest = digester.digest()
    
    # The type of sig is array.array() at this point (why?), M2Crypto RSA verify
    # will complain if it is not a string or Unicode object. Check if this is a
    # memcpy. 
    s = sig.tostring()
    return pubkey.verify(digest,s)
    def setUpPostSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPostSession(self)

        self.mypermid = str(self.my_keypair.pub().get_der())
        self.hispermid = str(self.his_keypair.pub().get_der())        
        self.myhash = sha(self.mypermid).digest()
        
        self.buddycast = BuddyCastFactory.getInstance(superpeer=True)
        self.buddycast.olthread_register(True)
Example #21
0
 def create_resp2_sig_by_other_keypair(self, rB, resp1_dict, hisid):
     resp2 = {}
     resp2["certB"] = str(self.my_keypair.pub().get_der())
     resp2["A"] = hisid
     sig_list = [rB, resp1_dict["rA"], hisid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.his_keypair.sign_dsa_asn1(sig_hash))
     resp2["SB"] = sig_asn1
     return self.create_response2_payload(resp2)
Example #22
0
def verify_torrent_signature(metainfo):
    r = deepcopy(metainfo)
    signature = r['signature']
    signer = r['signer']
    del r['signature']
    del r['signer']
    bmetainfo = bencode(r)
    digester = sha(bmetainfo[:])
    digest = digester.digest()
    return do_verify_torrent_signature(digest,signature,signer)
Example #23
0
 def create_resp2_wrong_randomA(self, rB, resp1_dict, hisid):
     resp2 = {}
     resp2["certB"] = str(self.my_keypair.pub().get_der())
     resp2["A"] = hisid
     sig_list = [rB, "wrong".zfill(random_size), hisid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp2["SB"] = sig_asn1
     return self.create_response2_payload(resp2)
Example #24
0
 def create_resp2_too_short_randomB(self, rB, resp1_dict, hisid):
     resp2 = {}
     resp2["certB"] = str(self.my_keypair.pub().get_der())
     resp2["A"] = hisid
     sig_list = ["\x00\x00\x00\x00\x00\x30\x00\x00", resp1_dict["rA"], hisid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp2["SB"] = sig_asn1
     return self.create_response2_payload(resp2)
Example #25
0
 def create_resp2_bad_cert(self, rB, resp1_dict, hisid):
     resp2 = {}
     resp2["certB"] = "\x00\x00\x00\x00\x00\x30\x00\x00"
     resp2["A"] = hisid
     sig_list = [rB, resp1_dict["rA"], hisid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp2["SB"] = sig_asn1
     return self.create_response2_payload(resp2)
    def setUpPostSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPostSession(self)

        self.mypermid = str(self.my_keypair.pub().get_der())
        self.hispermid = str(self.his_keypair.pub().get_der())        
        self.myhash = sha(self.mypermid).digest()
        
        self.buddycast = BuddyCastFactory.getInstance(superpeer=True)
        self.buddycast.olthread_register(True)
Example #27
0
 def create_good_response2(self,rB,resp1_dict,hisid):
     resp2 = {}
     resp2['certB'] = str(self.my_keypair.pub().get_der())
     resp2['A'] = hisid
     sig_list = [rB,resp1_dict['rA'],hisid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp2['SB'] = sig_asn1
     return self.create_response2_payload(resp2)
Example #28
0
def rsa_verify_data_pubkeyobj(plaintext, extra, pubkey, sig):
    digester = sha(plaintext)
    digester.update(extra)
    digest = digester.digest()

    # The type of sig is array.array() at this point (why?), M2Crypto RSA verify
    # will complain if it is not a string or Unicode object. Check if this is a
    # memcpy.
    s = sig.tostring()
    return pubkey.verify(digest, s)
Example #29
0
 def create_resp2_wrong_randomA(self, rB, resp1_dict, hisid):
     resp2 = {}
     resp2['certB'] = str(self.my_keypair.pub().get_der())
     resp2['A'] = hisid
     sig_list = [rB, "wrong".zfill(random_size), hisid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp2['SB'] = sig_asn1
     return self.create_response2_payload(resp2)
Example #30
0
 def create_good_response2(self, rB, resp1_dict, hisid):
     resp2 = {}
     resp2['certB'] = str(self.my_keypair.pub().get_der())
     resp2['A'] = hisid
     sig_list = [rB, resp1_dict['rA'], hisid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp2['SB'] = sig_asn1
     return self.create_response2_payload(resp2)
Example #31
0
 def create_bad_resp1_bad_cert(self,rB,hisid):
     resp1 = {}
     resp1['certA'] = '\x00\x00\x00\x00\x00\x30\x00\x00'
     resp1['rA'] = "".zfill(random_size)
     resp1['B'] = hisid
     sig_list = [resp1['rA'],rB,hisid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp1['SA'] = sig_asn1
     return [resp1['rA'],self.create_response1_payload(resp1)]
Example #32
0
 def create_bad_resp1_too_short_randomA(self,rB,hisid):
     resp1 = {}
     resp1['certA'] = str(self.my_keypair.pub().get_der())
     resp1['rA'] = '\x00\x00\x00\x00\x00\x30\x00\x00'
     resp1['B'] = hisid
     sig_list = [resp1['rA'],rB,hisid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp1['SA'] = sig_asn1
     return [resp1['rA'],self.create_response1_payload(resp1)]
Example #33
0
 def create_good_response1(self,rB,hisid):
     resp1 = {}
     resp1['certA'] = str(self.my_keypair.pub().get_der())
     resp1['rA'] = "".zfill(cr_random_size)
     resp1['B'] = hisid
     sig_list = [resp1['rA'],rB,hisid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp1['SA'] = sig_asn1
     return [resp1['rA'],self.create_response1_payload(resp1)]
Example #34
0
 def create_good_response1(self, rB, hisid):
     resp1 = {}
     resp1['certA'] = str(self.my_keypair.pub().get_der())
     resp1['rA'] = "".zfill(cr_random_size)
     resp1['B'] = hisid
     sig_list = [resp1['rA'], rB, hisid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     sig_asn1 = str(self.my_keypair.sign_dsa_asn1(sig_hash))
     resp1['SA'] = sig_asn1
     return [resp1['rA'], self.create_response1_payload(resp1)]
Example #35
0
def pubkey2swarmid(livedict):
    """ Calculate SHA1 of pubkey (or cert). 
    Make X.509 Subject Key Identifier compatible? 
    """
    if DEBUG:
        print >> sys.stderr, "pubkey2swarmid:", livedict.keys()

    if livedict['authmethod'] == "None":
        # No live-source auth
        return Rand.rand_bytes(20)
    else:
        return sha(livedict['pubkey']).digest()
Example #36
0
def pubkey2swarmid(livedict):
    """ Calculate SHA1 of pubkey (or cert). 
    Make X.509 Subject Key Identifier compatible? 
    """
    if DEBUG:
        print >>sys.stderr,time.asctime(),'-', "pubkey2swarmid:",livedict.keys()
    
    if livedict['authmethod'] == "None":
        # No live-source auth
        return Rand.rand_bytes(20)
    else:
        return sha(livedict['pubkey']).digest()
Example #37
0
    def setUpPostSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPostSession(self)

        self.my_permid = str(self.my_keypair.pub().get_der())
        self.my_hash = sha(self.my_permid).digest()
        self.his_permid = str(self.his_keypair.pub().get_der())        

        # Start our server side, to with Tribler will try to connect
        self.listen_port = 4123
        self.listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.listen_socket.bind(("", self.listen_port))
        self.listen_socket.listen(10)
        self.listen_socket.settimeout(10)
Example #38
0
def check_fork(a,b,level):
    myoffset = a[0]
    siblingoffset = b[0]
    if myoffset > siblingoffset:
        data = b[1]+a[1]
        if DEBUG:
            print >> sys.stderr,time.asctime(),'-', "merkle: combining",siblingoffset,myoffset
    else:
        data = a[1]+b[1]
        if DEBUG:
            print >> sys.stderr,time.asctime(),'-', "merkle: combining",myoffset,siblingoffset
    digester = sha()
    digester.update(data)
    digest = digester.digest()
    [parentstartoffset, parentoffset ] = get_parent_offset(myoffset,level-1)
    return [parentoffset,digest]
Example #39
0
 def check_response2(self,resp2_data,rA,rB,myid):
     resp2 = bdecode(resp2_data)
     self.testcase.assert_(type(resp2) == DictType)
     self.testcase.assert_(resp2.has_key('certB'))
     self.testcase.assert_(resp2.has_key('A'))
     self.testcase.assert_(resp2.has_key('SB'))
     # show throw exception when key no good
     pubB = EC.pub_key_from_der(resp2['certB'])
     A = resp2['A']
     self.testcase.assert_(type(A) == StringType)
     self.testcase.assert_(A,myid)
     SB = resp2['SB']
     self.testcase.assert_(type(SB) == StringType)
     # verify signature
     sig_list = [rB,rA,myid]
     sig_data = bencode(sig_list)
     sig_hash = sha(sig_data).digest()
     self.testcase.assert_(pubB.verify_dsa_asn1(sig_hash,SB))
Example #40
0
def getSubtitleFileRelativeName(channel_id, infohash, langCode):
    # subtitles filenames are build from the sha1 hash
    # of the triple (channel_id, infohash, langCode)

    # channel_id and infohash are binary versions

    assert utilities.validPermid(channel_id), "Invalid channel_id %s" % utilities.show_permid_short(channel_id)
    assert utilities.validInfohash(infohash), "Invalid infohash %s" % bin2str(infohash)
    assert LanguagesProvider.getLanguagesInstance().isLangCodeSupported(langCode), (
        "Unsupported language code %s" % langCode
    )

    hasher = sha()
    for data in (channel_id, infohash, langCode):
        hasher.update(data)
    subtitleName = hasher.hexdigest() + SUBS_EXTENSION

    return subtitleName
Example #41
0
    def convert_PeerDB(self, limit=0):
        print >> sys.stderr, "convert_PeerDB"
        peer_db = PeerDB.getInstance(self.bsddb_dir)
        npeers = 0
        for permid, db_data in peer_db._data.iteritems():
            data = {
                'ip': None,
                'port': None,
                'name': None,
                'last_seen': 0,
                'similarity': 0,
                'connected_times': 0,
                'oversion': 0,  # overlay version
                'buddycast_times': 0,
                'last_buddycast_time': 0,
                'thumbnail': None,
                'npeers': 0,
                'ntorrents': 0,
                'nprefs': 0,
                'nqueries': 0,
                'last_connected': 0,
                'friend': 0,
                'superpeer': 0,
            }

            data.update(db_data)
            iconfilename = sha(permid).hexdigest()
            if iconfilename in self.icons:
                icon_str = self.readIcon(iconfilename)
                data['thumbnail'] = icon_str
                icon_path = os.path.join(self.icon_dir, iconfilename + '.jpg')
                if os.path.isfile(icon_path):
                    print >> sys.stderr, 'remove', icon_path
                    os.remove(icon_path)

            self._addPeerToDB(permid, data)
            npeers += 1
            self.permid_id[permid] = npeers
            if limit and npeers >= limit:
                break
        #nconnpeers = self._fetchone('select count(*) from Peer where connected_times>0;')
        #print "npeers", npeers, nconnpeers

        self._commit()
    def convert_PeerDB(self, limit=0):
        print >>sys.stderr, "convert_PeerDB"
        peer_db = PeerDB.getInstance(self.bsddb_dir)
        npeers = 0
        for permid,db_data in peer_db._data.iteritems():
            data = {
            'ip':None,
            'port':None,
            'name':None,
            'last_seen':0,
            'similarity':0,
            'connected_times':0,
            'oversion':0,   # overlay version
            'buddycast_times':0,
            'last_buddycast_time':0,
            'thumbnail':None,
            'npeers':0,
            'ntorrents':0,
            'nprefs':0,
            'nqueries':0,
            'last_connected':0,
            'friend':0,
            'superpeer':0,
            }
            
            data.update(db_data)
            iconfilename = sha(permid).hexdigest()
            if iconfilename in self.icons:
                icon_str = self.readIcon(iconfilename)
                data['thumbnail'] = icon_str
                icon_path = os.path.join(self.icon_dir, iconfilename + '.jpg')
                if os.path.isfile(icon_path):
                    print >> sys.stderr, 'remove', icon_path
                    os.remove(icon_path)

            self._addPeerToDB(permid, data)
            npeers += 1
            self.permid_id[permid] = npeers
            if limit and npeers >= limit:
                break
        #nconnpeers = self._fetchone('select count(*) from Peer where connected_times>0;')
        #print "npeers", npeers, nconnpeers
            
        self._commit()
Example #43
0
    def add_metadata_piece(self, piece, data):
        """
        A metadata piece was received
        """
        if not self._closed:

            for index, block_tuple in zip(xrange(len(self._metadata_blocks)), self._metadata_blocks):
                if block_tuple[1] == piece:
                    block_tuple[0] = max(0, block_tuple[0] - 1)
                    block_tuple[2] = data
                    self._metadata_blocks.sort()
                    break

            # def p(s):
            #     if s is None: return 0
            #     return len(s)
            # if DEBUG: print >> sys.stderr, time.asctime(),'-', "Progress:", [p(t[2]) for t in self._metadata_blocks]

            # see if we are done
            for requested, piece, data in self._metadata_blocks:
                if data is None:
                    break

            else:
                metadata = "".join([data for requested, piece, data in self._metadata_blocks])
                info_hash = sha(metadata).digest()

                if info_hash == self._info_hash:
                    if DEBUG: print >> sys.stderr, time.asctime(),'-', "MiniBitTorrent.add_metadata_piece() Done!"

                    # get nice list with recent BitTorrent peers, sorted
                    # by most recently connected
                    peers = [(timestamp, address) for address, timestamp in self._good_peers.iteritems()]
                    peers.sort(reverse=True)
                    peers = [address for timestamp, address in peers]

                    self._callback(bdecode(metadata), peers)

                else:
                    # todo: hash failed... now what?
                    # quick solution... remove everything and try again
                    self._metadata_blocks = [(requested, piece, None) for requested, piece, data in self._metadata_blocks]
Example #44
0
    def _create(metainfo):  # TODO: replace with constructor
        # raises ValueErrors if not good
        validTorrentFile(metainfo)

        t = TorrentDef()
        t.metainfo = metainfo
        t.metainfo_valid = True
        # copy stuff into self.input
        maketorrent.copy_metainfo_to_input(t.metainfo, t.input)

        # For testing EXISTING LIVE, or EXISTING MERKLE: DISABLE, i.e. keep true infohash
        if t.get_url_compat():
            t.infohash = makeurl.metainfo2swarmid(t.metainfo)
        else:
            # Two places where infohash calculated, here and in maketorrent.py
            # Elsewhere: must use TorrentDef.get_infohash() to allow P2PURLs.
            t.infohash = sha(bencode(metainfo['info'])).digest()

        #print >>sys.stderr,"INFOHASH",`t.infohash`

        return t
    def _create(metainfo): # TODO: replace with constructor
        # raises ValueErrors if not good
        validTorrentFile(metainfo) 
        
        t = TorrentDef()
        t.metainfo = metainfo
        t.metainfo_valid = True
        # copy stuff into self.input
        maketorrent.copy_metainfo_to_input(t.metainfo,t.input)

        # For testing EXISTING LIVE, or EXISTING MERKLE: DISABLE, i.e. keep true infohash
        if t.get_url_compat():
            t.infohash = makeurl.metainfo2swarmid(t.metainfo)
        else:
            # Two places where infohash calculated, here and in maketorrent.py
            # Elsewhere: must use TorrentDef.get_infohash() to allow P2PURLs.
            t.infohash = sha(bencode(metainfo['info'])).digest()
        
        #print >>sys.stderr,"INFOHASH",`t.infohash`

        return t
Example #46
0
    def setUpPostSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPostSession(self)

        self.mypermid = str(self.my_keypair.pub().get_der())
        self.hispermid = str(self.his_keypair.pub().get_der())        
        self.myhash = sha(self.mypermid).digest()
        
        self.buddycast = BuddyCastFactory.getInstance(superpeer=True)
        self.buddycast.olthread_register(True)
        
#        arg0 = sys.argv[0].lower()
#        if arg0.endswith('.exe'):
#            installdir = os.path.abspath(os.path.dirname(sys.argv[0]))
#        else:
#           installdir = os.getcwd()          
#       self.utility = Utility(installdir)        

        
        # wait for buddycast to have completed on run cycle,
        # seems to create problems otherwise
        while not self.buddycast.ranonce:
            pass
def sign_data(plaintext,keypair):
    digest = sha(plaintext).digest()
    return keypair.sign_dsa_asn1(digest)
Example #48
0
def sign_response(randomA,randomB,peeridB,keypairA):
    list = [ randomA, randomB, peeridB ]
    blist = bencode(list)
    digest = sha(blist).digest()
    blob = keypairA.sign_dsa_asn1(digest)
    return blob
Example #49
0
def verify_response(randomA,randomB,peeridB,pubA,sigA):
    list = [ randomA, randomB, peeridB ]
    blist = bencode(list)
    digest = sha(blist).digest()
    return pubA.verify_dsa_asn1(digest,sigA)
Example #50
0
def verify_data_pubkeyobj(plaintext,pubkey,blob):
    digest = sha(plaintext).digest()
    return pubkey.verify_dsa_asn1(digest,blob)
Example #51
0
                piece_len_exp = 15  #   32K pieces
        piece_length = 2**piece_len_exp
    else:
        piece_length = input['piece length']

    # 4. Read files and calc hashes, if not live
    if 'live' not in input:
        for p, f, size in subs:
            pos = 0L

            h = open(f, 'rb')

            if input['makehash_md5']:
                hash_md5 = md5.new()
            if input['makehash_sha1']:
                hash_sha1 = sha()
            if input['makehash_crc32']:
                hash_crc32 = zlib.crc32('')

            while pos < size:
                a = min(size - pos, piece_length - done)

                # See if the user cancelled
                if userabortflag is not None and userabortflag.isSet():
                    return (None, None)

                readpiece = h.read(a)

                # See if the user cancelled
                if userabortflag is not None and userabortflag.isSet():
                    return (None, None)
Example #52
0
def makeinfo(input, userabortflag, userprogresscallback):
    """ Calculate hashes and create torrent file's 'info' part """
    encoding = input['encoding']

    pieces = []
    sh = sha()
    done = 0L
    fs = []
    totalsize = 0L
    totalhashed = 0L

    # 1. Determine which files should go into the torrent (=expand any dirs
    # specified by user in input['files']
    subs = []
    for file in input['files']:
        inpath = file['inpath']
        outpath = file['outpath']

        if DEBUG:
            print >> sys.stderr, "makeinfo: inpath", inpath, "outpath", outpath

        if os.path.isdir(inpath):
            dirsubs = subfiles(inpath)
            subs.extend(dirsubs)
        else:
            if outpath is None:
                subs.append(([os.path.basename(inpath)], inpath))
            else:
                subs.append((filename2pathlist(outpath,
                                               skipfirst=True), inpath))

    subs.sort()

    # 2. Calc total size
    newsubs = []
    for p, f in subs:
        if 'live' in input:
            size = input['files'][0]['length']
        else:
            size = os.path.getsize(f)
        totalsize += size
        newsubs.append((p, f, size))
    subs = newsubs

    # 3. Calc piece length from totalsize if not set
    if input['piece length'] == 0:
        if input['createmerkletorrent']:
            # used to be 15=32K, but this works better with slow python
            piece_len_exp = 18
        else:
            if totalsize > 8L * 1024 * 1024 * 1024:  # > 8 gig =
                piece_len_exp = 21  #   2 meg pieces
            elif totalsize > 2 * 1024 * 1024 * 1024:  # > 2 gig =
                piece_len_exp = 20  #   1 meg pieces
            elif totalsize > 512 * 1024 * 1024:  # > 512M =
                piece_len_exp = 19  #   512K pieces
            elif totalsize > 64 * 1024 * 1024:  # > 64M =
                piece_len_exp = 18  #   256K pieces
            elif totalsize > 16 * 1024 * 1024:  # > 16M =
                piece_len_exp = 17  #   128K pieces
            elif totalsize > 4 * 1024 * 1024:  # > 4M =
                piece_len_exp = 16  #   64K pieces
            else:  # < 4M =
                piece_len_exp = 15  #   32K pieces
Example #53
0
def make_torrent_file(input,
                      userabortflag=None,
                      userprogresscallback=lambda x: None):
    """ Create a torrent file from the supplied input. 
    
    Returns a (infohash,metainfo) pair, or (None,None) on userabort. """

    (info, piece_length) = makeinfo(input, userabortflag, userprogresscallback)
    if userabortflag is not None and userabortflag.isSet():
        return (None, None)
    if info is None:
        return (None, None)

    #if DEBUG:
    #    print >>sys.stderr,"mktorrent: makeinfo returned",`info`

    check_info(info)
    metainfo = {
        'info': info,
        'encoding': input['encoding'],
        'creation date': long(time())
    }

    # http://www.bittorrent.org/DHT_protocol.html says both announce and nodes
    # are not allowed, but some torrents (Azureus?) apparently violate this.
    if input['nodes'] is None and input['announce'] is None:
        raise ValueError('No tracker set')

    for key in [
            'announce', 'announce-list', 'nodes', 'comment', 'created by',
            'httpseeds'
    ]:
        if input[key] is not None and len(input[key]) > 0:
            metainfo[key] = input[key]
            if key == 'comment':
                metainfo['comment.utf-8'] = uniconvert(input['comment'],
                                                       'utf-8')

    # Assuming 1 file, Azureus format no support multi-file torrent with diff
    # bitrates
    bitrate = None
    for file in input['files']:
        if file['playtime'] is not None:
            secs = parse_playtime_to_secs(file['playtime'])
            bitrate = file['length'] / secs
            break
        if input.get('bps') is not None:
            bitrate = input['bps']
            break

    if bitrate is not None or input['thumb'] is not None:
        mdict = {}
        mdict['Publisher'] = 'Tribler'
        if input['comment'] is None:
            descr = ''
        else:
            descr = input['comment']
        mdict['Description'] = descr

        if bitrate is not None:
            mdict['Progressive'] = 1
            mdict['Speed Bps'] = bitrate
        else:
            mdict['Progressive'] = 0

        mdict['Title'] = metainfo['info']['name']
        mdict['Creation Date'] = long(time())
        # Azureus client source code doesn't tell what this is, so just put in random value from real torrent
        mdict['Content Hash'] = 'PT3GQCPW4NPT6WRKKT25IQD4MU5HM4UY'
        mdict['Revision Date'] = long(time())
        if input['thumb'] is not None:
            mdict['Thumbnail'] = input['thumb']
        cdict = {}
        cdict['Content'] = mdict
        metainfo['azureus_properties'] = cdict

    if input['torrentsigkeypairfilename'] is not None:
        from BaseLib.Core.Overlay.permid import create_torrent_signature

        create_torrent_signature(metainfo, input['torrentsigkeypairfilename'])

    if 'url-compat' in input:
        metainfo['info']['url-compat'] = input['url-compat']

    # Two places where infohash calculated, here and in TorrentDef.
    # Elsewhere: must use TorrentDef.get_infohash() to allow P2PURLs.

    infohash = sha(bencode(info)).digest()
    return (infohash, metainfo)
Example #54
0
def add_key(tracker):
    key = ''
    for i in sha(basekeydata + tracker).digest()[-6:]:
        key += mapbase64[ord(i) & 0x3F]
    keys[tracker] = key
Example #55
0
def ecdsa_sign_data(plaintext, extra, ec_keypair):
    digester = sha(plaintext)
    digester.update(extra)
    digest = digester.digest()
    return ec_keypair.sign_dsa_asn1(digest)
Example #56
0
def rsa_sign_data(plaintext, extra, rsa_keypair):
    digester = sha(plaintext)
    digester.update(extra)
    digest = digester.digest()
    return rsa_keypair.sign(digest)
    def got_metadata(self, permid, message, selversion):
        """ receive torrent file from others """

        # Arno, 2007-06-20: Disabled the following code. What's this? Somebody sends
        # us something and we refuse? Also doesn't take into account download help
        #and remote-query extension.

        #if self.upload_rate <= 0:    # if no upload, no download, that's the game
        #    return True    # don't close connection

        try:
            message = bdecode(message[1:])
        except:
            print_exc()
            return False
        if not isinstance(message, dict):
            return False
        try:
            infohash = message['torrent_hash']
            if not isValidInfohash(infohash):
                return False

            if not infohash in self.requested_torrents:  # got a torrent which was not requested
                return True
            if self.torrent_db.hasMetaData(infohash):
                return True

            # P2PURL
            goturl = False
            if selversion >= OLPROTO_VER_ELEVENTH:
                if 'metatype' in message and message[
                        'metatype'] == URL_MIME_TYPE:
                    try:
                        tdef = TorrentDef.load_from_url(metadata['metadata'])
                        # Internal storage format is still .torrent file
                        metainfo = tdef.get_metainfo()
                        metadata = bencode(metainfo)
                        goturl = True
                    except:
                        print_exc()
                        return False
                else:
                    metadata = message['metadata']
            else:
                metadata = message['metadata']

            if not self.valid_metadata(infohash, metadata):
                return False

            if DEBUG:
                torrent_size = len(metadata)
                if goturl:
                    mdt = "URL"
                else:
                    mdt = "torrent"
                print >> sys.stderr, "metadata: Recvd", mdt, ` infohash `, sha(
                    infohash).hexdigest(), torrent_size

            extra_info = {}
            if selversion >= OLPROTO_VER_FOURTH:
                try:
                    extra_info = {
                        'leecher': message.get('leecher', -1),
                        'seeder': message.get('seeder', -1),
                        'last_check_time': message.get('last_check_time', -1),
                        'status': message.get('status', 'unknown')
                    }
                except Exception, msg:
                    print_exc()
                    print >> sys.stderr, "metadata: wrong extra info in msg - ", message
                    extra_info = {}

            filename = self.save_torrent(infohash,
                                         metadata,
                                         extra_info=extra_info)
            self.requested_torrents.remove(infohash)

            #if DEBUG:
            #    print >>sys.stderr,"metadata: Was I asked to dlhelp someone",self.dlhelper

            if filename is not None:
                self.notify_torrent_is_in(infohash, metadata, filename)

            # BarterCast: add bytes of torrent to BarterCastDB
            # Save exchanged KBs in BarterCastDB
            if permid is not None and BARTERCAST_TORRENTS:
                self.overlay_bridge.add_task(
                    lambda: self.olthread_bartercast_torrentexchange(
                        permid, 'downloaded'), 0)
Example #58
0
def ecdsa_verify_data_pubkeyobj(plaintext, extra, pubkey, blob):
    digester = sha(plaintext)
    digester.update(extra)
    digest = digester.digest()
    return pubkey.verify_dsa_asn1(digest, blob)
def verify_data(plaintext,permid,blob):
    pubkey = EC.pub_key_from_der(permid)
    digest = sha(plaintext).digest()
    return pubkey.verify_dsa_asn1(digest,blob)