Added pycrypto fallback for RIPEMD160 hash function
parent
4eec124225
commit
e163137893
@ -1,2 +1,3 @@
|
||||
python_prctl
|
||||
psutil
|
||||
pycrypto
|
||||
|
@ -1,3 +1,26 @@
|
||||
"""
|
||||
.. todo:: hello world
|
||||
"""
|
||||
|
||||
import hashlib
|
||||
|
||||
# We need to check hashlib for RIPEMD-160, as it won't be available
|
||||
# if OpenSSL is not linked against or the linked OpenSSL has RIPEMD
|
||||
# disabled.
|
||||
|
||||
try:
|
||||
hashlib.new('ripemd160')
|
||||
except ValueError:
|
||||
try:
|
||||
from Crypto.Hash import RIPEMD
|
||||
except ImportError:
|
||||
RIPEMD160Hash = None
|
||||
else:
|
||||
RIPEMD160Hash = RIPEMD.RIPEMD160Hash
|
||||
else:
|
||||
def RIPEMD160Hash(data=None):
|
||||
"""hashlib based RIPEMD160Hash"""
|
||||
hasher = hashlib.new('ripemd160')
|
||||
if data:
|
||||
hasher.update(data)
|
||||
return hasher
|
||||
|
@ -0,0 +1,60 @@
|
||||
"""
|
||||
Test the alternatives for crypto primitives
|
||||
"""
|
||||
|
||||
import hashlib
|
||||
import unittest
|
||||
from abc import ABCMeta, abstractmethod
|
||||
from binascii import hexlify, unhexlify
|
||||
|
||||
try:
|
||||
from Crypto.Hash import RIPEMD
|
||||
except ImportError:
|
||||
RIPEMD = None
|
||||
|
||||
|
||||
# These keys are from addresses test script
|
||||
sample_pubsigningkey = unhexlify(
|
||||
'044a367f049ec16cb6b6118eb734a9962d10b8db59c890cd08f210c43ff08bdf09d'
|
||||
'16f502ca26cd0713f38988a1237f1fc8fa07b15653c996dc4013af6d15505ce')
|
||||
sample_pubencryptionkey = unhexlify(
|
||||
'044597d59177fc1d89555d38915f581b5ff2286b39d022ca0283d2bdd5c36be5d3c'
|
||||
'e7b9b97792327851a562752e4b79475d1f51f5a71352482b241227f45ed36a9')
|
||||
|
||||
sample_ripe = '003cd097eb7f35c87b5dc8b4538c22cb55312a9f'
|
||||
|
||||
_sha = hashlib.new('sha512')
|
||||
_sha.update(sample_pubsigningkey + sample_pubencryptionkey)
|
||||
|
||||
pubkey_sha = _sha.digest()
|
||||
|
||||
|
||||
class RIPEMD160TestCase(object):
|
||||
"""Base class for RIPEMD160 test case"""
|
||||
__metaclass__ = ABCMeta
|
||||
|
||||
@abstractmethod
|
||||
def _hashdigest(self, data):
|
||||
"""RIPEMD160 digest implementation"""
|
||||
pass
|
||||
|
||||
def test_hash_string(self):
|
||||
"""Check RIPEMD160 hash function on string"""
|
||||
self.assertEqual(hexlify(self._hashdigest(pubkey_sha)), sample_ripe)
|
||||
|
||||
|
||||
class TestHashlib(RIPEMD160TestCase, unittest.TestCase):
|
||||
"""RIPEMD160 test case for hashlib"""
|
||||
@staticmethod
|
||||
def _hashdigest(data):
|
||||
hasher = hashlib.new('ripemd160')
|
||||
hasher.update(data)
|
||||
return hasher.digest()
|
||||
|
||||
|
||||
@unittest.skipUnless(RIPEMD, 'pycrypto package not found')
|
||||
class TestCrypto(RIPEMD160TestCase, unittest.TestCase):
|
||||
"""RIPEMD160 test case for Crypto"""
|
||||
@staticmethod
|
||||
def _hashdigest(data):
|
||||
return RIPEMD.RIPEMD160Hash(data).digest()
|
Loading…
Reference in New Issue