def test_magnet(self): """Test calculation of a magnet link""" ctx = rhash.RHash(rhash.MD5 | rhash.TTH) ctx.update('abc').finish() self.assertEqual( 'magnet:?xl=3&dn=file.txt&xt=urn:md5:900150983cd24fb0d6963f7d28e17f72&xt=urn:tree:tiger:asd4ujseh5m47pdyb46kbtsqtsgdklbhyxomuia', ctx.magnet('file.txt'))
def test_update(self): """Test the sequential update calls""" ctx = rhash.RHash(rhash.CRC32 | rhash.MD5) ctx.update('Hello, ').update('world!').finish() self.assertEqual('EBE6C6E6', ctx.HEX(rhash.CRC32)) self.assertEqual('6cd3556deb0da54bca060b4c39479839', ctx.hex(rhash.MD5))
def test_all_hashes(self): r = rhash.RHash(rhash.ALL) r.update('a') r.finish() self.assertEqual('e8b7be43', r.hash(rhash.CRC32)) self.assertEqual('bde52cb31de33e46245e05fbdbd6fb24', r.hash(rhash.MD4)) self.assertEqual('0cc175b9c0f1b6a831c399e269772661', r.hash(rhash.MD5)) self.assertEqual('86f7e437faa5a7fce15d1ddcb9eaeaea377667b8', r.hash(rhash.SHA1)) self.assertEqual('77befbef2e7ef8ab2ec8f93bf587a7fc613e247f5f247809', r.hash(rhash.TIGER)) self.assertEqual('czquwh3iyxbf5l3bgyugzhassmxu647ip2ike4y', r.hash(rhash.TTH)) self.assertEqual('fd408e9d024b58a57aa1313eff14005ff8b2c5d1', r.hash(rhash.BTIH)) self.assertEqual('bde52cb31de33e46245e05fbdbd6fb24', r.hash(rhash.ED2K)) self.assertEqual('q336in72uwt7zyk5dxolt2xk5i3xmz5y', r.hash(rhash.AICH)) self.assertEqual( '8aca2602792aec6f11a67206531fb7d7f0dff59413145e6973c45001d0087b42d11bc645413aeff63a42391a39145a591a92200d560195e53b478584fdae231a', r.hash(rhash.WHIRLPOOL)) self.assertEqual('0bdc9d2d256b3ee9daae347be6f4dc835a467ffe', r.hash(rhash.RIPEMD160)) self.assertEqual( 'd42c539e367c66e9c88a801f6649349c21871b4344c6a573f849fdce62f314dd', r.hash(rhash.GOST)) self.assertEqual( 'e74c52dd282183bf37af0079c9f78055715a103f17e3133ceff1aacf2f403011', r.hash(rhash.GOST_CRYPTOPRO)) self.assertEqual('4872bcbc4cd0f0a9dc7c2f7045e5b43b6c830db8', r.hash(rhash.HAS160)) self.assertEqual('bf5ce540ae51bc50399f96746c5a15bd', r.hash(rhash.SNEFRU128)) self.assertEqual( '45161589ac317be0ceba70db2573ddda6e668a31984b39bf65e4b664b584c63d', r.hash(rhash.SNEFRU256)) self.assertEqual( 'abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5', r.hash(rhash.SHA224)) self.assertEqual( 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb', r.hash(rhash.SHA256)) self.assertEqual( '54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31', r.hash(rhash.SHA384)) self.assertEqual( '1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75', r.hash(rhash.SHA512)) self.assertEqual( '943aa9225a2cf154ec2e4dd81237720ba538ca8df2fd83c0b893c5d265f353a0', r.hash(rhash.EDONR256)) self.assertEqual( 'b59ec44f7beef8a04ceed38a973d77c65e22e9458d5f67b497948da34986c093b5efc5483fbee55f2f740fcad31f18d80db44bb6b8843e7fd599188e7c07233b', r.hash(rhash.EDONR512)) # test reset self.assertEqual('d41d8cd98f00b204e9800998ecf8427e', r.reset().finish().hash(rhash.MD5)) # MD5( '' )
def test_output_formats(self): r = rhash.RHash(rhash.MD5 | rhash.TTH).finish() self.assertEqual('5d9ed00a030e638bdb753a6a24fb900e5a63b8e73e6c25b6', r.hex(rhash.TTH)) self.assertEqual('2qoyzwmpaczaj2mabgmoz6ccpy', r.base32(rhash.MD5)) self.assertEqual('1B2M2Y8AsgTpgAmY7PhCfg==', r.base64(rhash.MD5)) self.assertEqual( '\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e', r.raw(rhash.MD5))
def multi_hash_file(path, hash_types, base=None, mode="rb", encoding=None, errors=None, chunk_size=FILE_IO_BUFFER_SIZE): """ Hashes `path` with multiple hash functions. `hash_types` is a list of names, eg. ("CRC32", "SHA1"). """ hashdict = { "CRC32": rhash.CRC32, "MD4": rhash.MD4, "MD5": rhash.MD5, "SHA1": rhash.SHA1, "TIGER": rhash.TIGER, "TTH": rhash.TTH, "BTIH": rhash.BTIH, "ED2K": rhash.ED2K, "AICH": rhash.AICH, "WHIRLPOOL": rhash.WHIRLPOOL, "RIPEMD-160": rhash.RIPEMD160, "GOST12_256": rhash.GOST12_256, "GOST12_512": rhash.GOST12_512, "GOST94": rhash.GOST94, "GOST94_CRYPTOPRO": rhash.GOST94_CRYPTOPRO, "HAS-160": rhash.HAS160, "SNEFRU-128": rhash.SNEFRU128, "SNEFRU-256": rhash.SNEFRU256, "SHA-224": rhash.SHA224, "SHA-256": rhash.SHA256, "SHA-384": rhash.SHA384, "SHA-512": rhash.SHA512, "EDON-R256": rhash.EDONR256, "EDON-R512": rhash.EDONR512 } basedict = { "upper": rhash.RHPR_UPPERCASE, "raw": rhash.RHPR_RAW, "hex": rhash.RHPR_HEX, "HEX": rhash.RHPR_HEX|rhash.RHPR_UPPERCASE, "base32": rhash.RHPR_BASE32, "BASE32": rhash.RHPR_BASE32|rhash.RHPR_UPPERCASE, "base64": rhash.RHPR_BASE64, } hashlist = tuple(hashdict[i.upper()] for i in hash_types) flags = basedict.get(base, 0) hasher = rhash.RHash(reduce(bit_or, hashlist)) for data in blockfileiter(path, mode, encoding, errors, chunk_size=chunk_size): hasher.update(data) hasher.finish() return tuple(hasher._print(i, flags) for i in hashlist)
def test_update_file(self): path = 'python_test_input_123.txt' f = open(path, 'wb') f.write("\0\1\2\n") f.close() r = rhash.RHash(rhash.SHA1) r.update_file(path).finish() self.assertEqual('e3869ec477661fad6b9fc25914bb2eee5455b483', str(r)) self.assertEqual('e3869ec477661fad6b9fc25914bb2eee5455b483', rhash.hash_for_file(path, rhash.SHA1)) self.assertEqual( 'magnet:?xl=4&dn=python_test_input_123.txt&xt=urn:tree:tiger:c6docz63fpef5pdfpz35z7mw2iozshxlpr4erza', rhash.magnet_for_file(path, rhash.TTH)) os.remove(path)
def test_update_file(self): """Test the update_file() method.""" path = 'python_test_input_123.txt' file = open(path, 'wb') file.write(b"\0\1\2\n") file.close() ctx = rhash.RHash(rhash.SHA1) ctx.update_file(path).finish() self.assertEqual('e3869ec477661fad6b9fc25914bb2eee5455b483', str(ctx)) self.assertEqual('e3869ec477661fad6b9fc25914bb2eee5455b483', rhash.hash_file(path, rhash.SHA1)) self.assertEqual( 'magnet:?xl=4&dn=python_test_input_123.txt&xt=urn:tree:tiger:c6docz63fpef5pdfpz35z7mw2iozshxlpr4erza', rhash.make_magnet(path, rhash.TTH)) os.remove(path)
def test_all_hashes(self): """Verify all hash functions""" ctx = rhash.RHash(rhash.ALL) ctx.update('a') ctx.finish() self.assertEqual('e8b7be43', ctx.hash(rhash.CRC32)) self.assertEqual('c1d04330', ctx.hash(rhash.CRC32C)) self.assertEqual('bde52cb31de33e46245e05fbdbd6fb24', ctx.hash(rhash.MD4)) self.assertEqual('0cc175b9c0f1b6a831c399e269772661', ctx.hash(rhash.MD5)) self.assertEqual('86f7e437faa5a7fce15d1ddcb9eaeaea377667b8', ctx.hash(rhash.SHA1)) self.assertEqual('77befbef2e7ef8ab2ec8f93bf587a7fc613e247f5f247809', ctx.hash(rhash.TIGER)) self.assertEqual('czquwh3iyxbf5l3bgyugzhassmxu647ip2ike4y', ctx.hash(rhash.TTH)) self.assertEqual(40, len(ctx.hash(rhash.BTIH))) self.assertEqual('bde52cb31de33e46245e05fbdbd6fb24', ctx.hash(rhash.ED2K)) self.assertEqual('q336in72uwt7zyk5dxolt2xk5i3xmz5y', ctx.hash(rhash.AICH)) self.assertEqual( '8aca2602792aec6f11a67206531fb7d7f0dff59413145e6973c45001d0087b42d11bc645413aeff63a42391a39145a591a92200d560195e53b478584fdae231a', ctx.hash(rhash.WHIRLPOOL)) self.assertEqual('0bdc9d2d256b3ee9daae347be6f4dc835a467ffe', ctx.hash(rhash.RIPEMD160)) self.assertEqual( 'd42c539e367c66e9c88a801f6649349c21871b4344c6a573f849fdce62f314dd', ctx.hash(rhash.GOST94)) self.assertEqual( 'e74c52dd282183bf37af0079c9f78055715a103f17e3133ceff1aacf2f403011', ctx.hash(rhash.GOST94_CRYPTOPRO)) self.assertEqual( 'ba31099b9cc84ec2a671e9313572378920a705b363b031a1cb4fc03e01ce8df3', ctx.hash(rhash.GOST12_256)) self.assertEqual( '8b2a40ecab7b7496bc4cc0f773595452baf658849b495acc3ba017206810efb00420ccd73fb3297e0f7890941b84ac4a8bc27e3c95e1f97c094609e2136abb7e', ctx.hash(rhash.GOST12_512)) self.assertEqual('4872bcbc4cd0f0a9dc7c2f7045e5b43b6c830db8', ctx.hash(rhash.HAS160)) self.assertEqual('bf5ce540ae51bc50399f96746c5a15bd', ctx.hash(rhash.SNEFRU128)) self.assertEqual( '45161589ac317be0ceba70db2573ddda6e668a31984b39bf65e4b664b584c63d', ctx.hash(rhash.SNEFRU256)) self.assertEqual( 'abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5', ctx.hash(rhash.SHA224)) self.assertEqual( 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb', ctx.hash(rhash.SHA256)) self.assertEqual( '54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31', ctx.hash(rhash.SHA384)) self.assertEqual( '1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75', ctx.hash(rhash.SHA512)) self.assertEqual( '943aa9225a2cf154ec2e4dd81237720ba538ca8df2fd83c0b893c5d265f353a0', ctx.hash(rhash.EDONR256)) self.assertEqual( 'b59ec44f7beef8a04ceed38a973d77c65e22e9458d5f67b497948da34986c093b5efc5483fbee55f2f740fcad31f18d80db44bb6b8843e7fd599188e7c07233b', ctx.hash(rhash.EDONR512)) self.assertEqual( '9e86ff69557ca95f405f081269685b38e3a819b309ee942f482b6a8b', ctx.hash(rhash.SHA3_224)) self.assertEqual( '80084bf2fba02475726feb2cab2d8215eab14bc6bdd8bfb2c8151257032ecd8b', ctx.hash(rhash.SHA3_256)) self.assertEqual( '1815f774f320491b48569efec794d249eeb59aae46d22bf77dafe25c5edc28d7ea44f93ee1234aa88f61c91912a4ccd9', ctx.hash(rhash.SHA3_384)) self.assertEqual( '697f2d856172cb8309d6b8b97dac4de344b549d4dee61edfb4962d8698b7fa803f4f93ff24393586e28b5b957ac3d1d369420ce53332712f997bd336d09ab02a', ctx.hash(rhash.SHA3_512)) # test reset self.assertEqual('d41d8cd98f00b204e9800998ecf8427e', ctx.reset().finish().hash(rhash.MD5)) # MD5( '' )
def test_shift_operator(self): """Test the << operator""" ctx = rhash.RHash(rhash.MD5) ctx << 'a' << 'bc' # MD5( 'abc' ) self.assertEqual('900150983cd24fb0d6963f7d28e17f72', str(ctx.finish()))
def test_shift_operator(self): r = rhash.RHash(rhash.MD5) r << 'a' << 'bc' self.assertEqual('900150983cd24fb0d6963f7d28e17f72', str(r.finish())) # MD5( 'abc' )
def test_update(self): r = rhash.RHash(rhash.CRC32 | rhash.MD5) r.update('Hello, ').update('world!').finish() self.assertEqual('EBE6C6E6', r.HEX(rhash.CRC32)) self.assertEqual('6cd3556deb0da54bca060b4c39479839', r.hex(rhash.MD5))