Skip to content

Commit 4461bf3

Browse files
alexwarner
authored andcommitted
Made the rfc6979 module not dependent on the represetation of ECDSA generators.
1 parent c096a32 commit 4461bf3

File tree

3 files changed

+10
-8
lines changed

3 files changed

+10
-8
lines changed

ecdsa/keys.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,8 @@ def sign_digest_deterministic(self, digest, hashfunc=None, sigencode=sigencode_s
232232
See RFC 6979 for more details.
233233
"""
234234
secexp = self.privkey.secret_multiplier
235-
k = rfc6979.generate_k(self.curve.generator, secexp, hashfunc, digest)
235+
k = rfc6979.generate_k(
236+
self.curve.generator.order(), secexp, hashfunc, digest)
236237

237238
return self.sign_digest(digest, sigencode=sigencode, k=k)
238239

ecdsa/rfc6979.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,18 @@ def bits2octets(data, order):
5151
return number_to_string_crop(z2, order)
5252

5353
# https://tools.ietf.org/html/rfc6979#section-3.2
54-
def generate_k(generator, secexp, hash_func, data):
54+
def generate_k(order, secexp, hash_func, data):
5555
'''
56-
generator - ECDSA generator used in the signature
56+
generator - order of the DSA generator used in the signature
5757
secexp - secure exponent (private key) in numeric form
5858
hash_func - reference to the same hash function used for generating hash
5959
data - hash in binary form of the signing data
6060
'''
6161

62-
qlen = bit_length(generator.order())
62+
qlen = bit_length(order)
6363
holen = hash_func().digest_size
6464
rolen = (qlen + 7) / 8
65-
bx = number_to_string(secexp, generator.order()) + bits2octets(data, generator.order())
65+
bx = number_to_string(secexp, order) + bits2octets(data, order)
6666

6767
# Step B
6868
v = b('\x01') * holen
@@ -96,7 +96,7 @@ def generate_k(generator, secexp, hash_func, data):
9696
# Step H3
9797
secret = bits2int(t, qlen)
9898

99-
if secret >= 1 and secret < generator.order():
99+
if secret >= 1 and secret < order:
100100
return secret
101101

102102
k = hmac.new(k, v+b('\x00'), hash_func).digest()

ecdsa/test_pyecdsa.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ def test_deterministic(self):
5757
priv = SigningKey.from_secret_exponent(secexp, SECP256k1, sha256)
5858
pub = priv.get_verifying_key()
5959

60-
k = rfc6979.generate_k(SECP256k1.generator, secexp, sha256, sha256(data).digest())
60+
k = rfc6979.generate_k(
61+
SECP256k1.generator.order(), secexp, sha256, sha256(data).digest())
6162

6263
sig1 = priv.sign(data, k=k)
6364
self.assertTrue(pub.verify(sig1, data))
@@ -522,7 +523,7 @@ def OFF_test_prove_uniformity(self):
522523
class RFC6979(unittest.TestCase):
523524
# https://tools.ietf.org/html/rfc6979#appendix-A.1
524525
def _do(self, generator, secexp, hsh, hash_func, expected):
525-
actual = rfc6979.generate_k(generator, secexp, hash_func, hsh)
526+
actual = rfc6979.generate_k(generator.order(), secexp, hash_func, hsh)
526527
self.assertEqual(expected, actual)
527528

528529
def test_SECP256k1(self):

0 commit comments

Comments
 (0)