diff --git a/src/pyelliptic/ecc.py b/src/pyelliptic/ecc.py index d25b0129..c670d023 100644 --- a/src/pyelliptic/ecc.py +++ b/src/pyelliptic/ecc.py @@ -107,12 +107,19 @@ class ECC(object): High level function which returns : curve(2) + len_of_pubkeyX(2) + pubkeyX + len_of_pubkeyY + pubkeyY """ + ctx = OpenSSL.BN_CTX_new() + n = OpenSSL.BN_new() + group = OpenSSL.EC_GROUP_new_by_curve_name(self.curve) + OpenSSL.EC_GROUP_get_order(group, n, ctx) + key_len = OpenSSL.BN_num_bytes(n) + pubkey_x = self.pubkey_x.rjust(key_len, b'\x00') + pubkey_y = self.pubkey_y.rjust(key_len, b'\x00') return b''.join(( pack('!H', self.curve), - pack('!H', len(self.pubkey_x)), - self.pubkey_x, - pack('!H', len(self.pubkey_y)), - self.pubkey_y, + pack('!H', len(pubkey_x)), + pubkey_x, + pack('!H', len(pubkey_y)), + pubkey_y, )) def get_privkey(self): diff --git a/src/pyelliptic/tests/test_ecc.py b/src/pyelliptic/tests/test_ecc.py index 6327d333..e87d1c21 100644 --- a/src/pyelliptic/tests/test_ecc.py +++ b/src/pyelliptic/tests/test_ecc.py @@ -1,5 +1,6 @@ """Tests for ECC object""" +import os import unittest from hashlib import sha512 @@ -26,10 +27,28 @@ class TestECC(unittest.TestCase): def test_random_keys(self): """A dummy test for random keys in ECC object""" eccobj = pyelliptic.ECC(curve='secp256k1') - self.assertEqual(len(eccobj.privkey), 32) + self.assertTrue(len(eccobj.privkey) <= 32) pubkey = eccobj.get_pubkey() self.assertEqual(pubkey[:4], b'\x02\xca\x00\x20') + def test_short_keys(self): + """Check formatting of the keys with leading zeroes""" + # pylint: disable=protected-access + def sample_key(_): + """Fake ECC keypair""" + return os.urandom(32), os.urandom(31), os.urandom(30) + + try: + gen_orig = pyelliptic.ECC._generate + pyelliptic.ECC._generate = sample_key + eccobj = pyelliptic.ECC(curve='secp256k1') + pubkey = eccobj.get_pubkey() + self.assertEqual(pubkey[:4], b'\x02\xca\x00\x20') + self.assertEqual(pubkey[36:38], b'\x00\x20') + self.assertEqual(len(pubkey[38:]), 32) + finally: + pyelliptic.ECC._generate = gen_orig + def test_decode_keys(self): """Check keys decoding""" # pylint: disable=protected-access