summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Warner <warner@lothar.com>2013-10-01 16:12:40 -0700
committerBrian Warner <warner@lothar.com>2013-10-01 16:12:40 -0700
commit13d645ddabe57b53dc62272ee4cb9ad14493a7f6 (patch)
tree5962289afbb5f3b8e227b57fb492709a45888f52
parent6e1a6f9fe0116816a72a256e4cc1662fb904e68b (diff)
downloadecdsa-13d645ddabe57b53dc62272ee4cb9ad14493a7f6.tar.gz
update new code for py3 compatibility, add 3.2/3.3 to travis
-rw-r--r--.travis.yml2
-rw-r--r--ecdsa/rfc6979.py17
-rw-r--r--ecdsa/test_pyecdsa.py44
3 files changed, 33 insertions, 30 deletions
diff --git a/.travis.yml b/.travis.yml
index e452544..bb87cb5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,6 +3,8 @@ python:
- "2.5"
- "2.6"
- "2.7"
+ - "3.2"
+ - "3.3"
install: true
script:
- python setup.py test
diff --git a/ecdsa/rfc6979.py b/ecdsa/rfc6979.py
index b36c20a..d1a0a8e 100644
--- a/ecdsa/rfc6979.py
+++ b/ecdsa/rfc6979.py
@@ -13,7 +13,8 @@ Many thanks to Coda Hale for his implementation in Go language:
import hmac
from binascii import hexlify
-from util import number_to_string, number_to_string_crop
+from .util import number_to_string, number_to_string_crop
+from .six import b
try:
bin(0)
@@ -61,25 +62,25 @@ def generate_k(generator, secexp, hash_func, data):
'''
qlen = bit_length(generator.order())
- holen = hash_func().digestsize
+ holen = hash_func().digest_size
rolen = (qlen + 7) / 8
bx = number_to_string(secexp, generator.order()) + bits2octets(data, generator.order())
# Step B
- v = '\x01' * holen
+ v = b('\x01') * holen
# Step C
- k = '\x00' * holen
+ k = b('\x00') * holen
# Step D
- k = hmac.new(k, v+'\x00'+bx, hash_func).digest()
+ k = hmac.new(k, v+b('\x00')+bx, hash_func).digest()
# Step E
v = hmac.new(k, v, hash_func).digest()
# Step F
- k = hmac.new(k, v+'\x01'+bx, hash_func).digest()
+ k = hmac.new(k, v+b('\x01')+bx, hash_func).digest()
# Step G
v = hmac.new(k, v, hash_func).digest()
@@ -87,7 +88,7 @@ def generate_k(generator, secexp, hash_func, data):
# Step H
while True:
# Step H1
- t = ''
+ t = b('')
# Step H2
while len(t) < rolen:
@@ -100,5 +101,5 @@ def generate_k(generator, secexp, hash_func, data):
if secret >= 1 and secret < generator.order():
return secret
- k = hmac.new(k, v+'\x00', hash_func).digest()
+ k = hmac.new(k, v+b('\x00'), hash_func).digest()
v = hmac.new(k, v, hash_func).digest()
diff --git a/ecdsa/test_pyecdsa.py b/ecdsa/test_pyecdsa.py
index f7ec9ac..2c851b5 100644
--- a/ecdsa/test_pyecdsa.py
+++ b/ecdsa/test_pyecdsa.py
@@ -51,7 +51,7 @@ class ECDSA(unittest.TestCase):
self.assertTrue(pub2.verify(sig, data))
def test_deterministic(self):
- data = "blahblah"
+ data = b("blahblah")
secexp = int("9d0219792467d7d37b4d43298a7d0c05", 16)
priv = SigningKey.from_secret_exponent(secexp, SECP256k1, sha256)
@@ -60,16 +60,16 @@ class ECDSA(unittest.TestCase):
k = rfc6979.generate_k(SECP256k1.generator, secexp, sha256, sha256(data).digest())
sig1 = priv.sign(data, k=k)
- self.failUnless(pub.verify(sig1, data))
+ self.assertTrue(pub.verify(sig1, data))
sig2 = priv.sign(data, k=k)
- self.failUnless(pub.verify(sig2, data))
+ self.assertTrue(pub.verify(sig2, data))
sig3 = priv.sign_deterministic(data, sha256)
- self.failUnless(pub.verify(sig3, data))
+ self.assertTrue(pub.verify(sig3, data))
- self.failUnlessEqual(sig1, sig2)
- self.failUnlessEqual(sig1, sig3)
+ self.assertEqual(sig1, sig2)
+ self.assertEqual(sig1, sig3)
def test_bad_usage(self):
# sk=SigningKey() is wrong
@@ -511,7 +511,7 @@ class RFC6979(unittest.TestCase):
# https://tools.ietf.org/html/rfc6979#appendix-A.1
def _do(self, generator, secexp, hsh, hash_func, expected):
actual = rfc6979.generate_k(generator, secexp, hash_func, hsh)
- self.failUnlessEqual(expected, actual)
+ self.assertEqual(expected, actual)
def test_SECP256k1(self):
'''RFC doesn't contain test vectors for SECP256k1 used in bitcoin.
@@ -519,7 +519,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator = SECP256k1.generator,
secexp = int("9d0219792467d7d37b4d43298a7d0c05", 16),
- hsh = sha256("sample").digest(),
+ hsh = sha256(b("sample")).digest(),
hash_func = sha256,
expected = int("8fa1f95d514760e498f28957b824ee6ec39ed64826ff4fecc2b5739ec45b91cd", 16))
@@ -527,7 +527,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=SECP256k1.generator,
secexp=int("cca9fbcc1b41e5a95d369eaa6ddcff73b61a4efaa279cfc6567e8daa39cbaf50", 16),
- hsh=sha256("sample").digest(),
+ hsh=sha256(b("sample")).digest(),
hash_func=sha256,
expected=int("2df40ca70e639d89528a6b670d9d48d9165fdc0febc0974056bdce192b8e16a3", 16))
@@ -535,7 +535,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=SECP256k1.generator,
secexp=0x1,
- hsh=sha256("Satoshi Nakamoto").digest(),
+ hsh=sha256(b("Satoshi Nakamoto")).digest(),
hash_func=sha256,
expected=0x8F8A276C19F4149656B280621E358CCE24F5F52542772691EE69063B74F15D15)
@@ -543,7 +543,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=SECP256k1.generator,
secexp=0x1,
- hsh=sha256("All those moments will be lost in time, like tears in rain. Time to die...").digest(),
+ hsh=sha256(b("All those moments will be lost in time, like tears in rain. Time to die...")).digest(),
hash_func=sha256,
expected=0x38AA22D72376B4DBC472E06C3BA403EE0A394DA63FC58D88686C611ABA98D6B3)
@@ -551,7 +551,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=SECP256k1.generator,
secexp=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140,
- hsh=sha256("Satoshi Nakamoto").digest(),
+ hsh=sha256(b("Satoshi Nakamoto")).digest(),
hash_func=sha256,
expected=0x33A19B60E25FB6F4435AF53A3D42D493644827367E6453928554F43E49AA6F90)
@@ -559,7 +559,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=SECP256k1.generator,
secexp=0xf8b8af8ce3c7cca5e300d33939540c10d45ce001b8f252bfbc57ba0342904181,
- hsh=sha256("Alan Turing").digest(),
+ hsh=sha256(b("Alan Turing")).digest(),
hash_func=sha256,
expected=0x525A82B70E67874398067543FD84C83D30C175FDC45FDEEE082FE13B1D7CFDF1)
@@ -576,7 +576,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh = sha1("sample").digest(),
+ hsh = sha1(b("sample")).digest(),
hash_func = sha1,
expected = int("37D7CA00D2C7B0E5E412AC03BD44BA837FDD5B28CD3B0021", 16))
@@ -584,7 +584,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh = sha256("sample").digest(),
+ hsh = sha256(b("sample")).digest(),
hash_func = sha256,
expected = int("32B1B6D7D42A05CB449065727A84804FB1A3E34D8F261496", 16))
@@ -592,7 +592,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh = sha512("sample").digest(),
+ hsh = sha512(b("sample")).digest(),
hash_func = sha512,
expected = int("A2AC7AB055E4F20692D49209544C203A7D1F2C0BFBC75DB1", 16))
@@ -600,7 +600,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh = sha1("test").digest(),
+ hsh = sha1(b("test")).digest(),
hash_func = sha1,
expected = int("D9CF9C3D3297D3260773A1DA7418DB5537AB8DD93DE7FA25", 16))
@@ -608,7 +608,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh = sha256("test").digest(),
+ hsh = sha256(b("test")).digest(),
hash_func = sha256,
expected = int("5C4CE89CF56D9E7C77C8585339B006B97B5F0680B4306C6C", 16))
@@ -616,7 +616,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp = int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh = sha512("test").digest(),
+ hsh = sha512(b("test")).digest(),
hash_func = sha512,
expected = int("0758753A5254759C7CFBAD2E2D9B0792EEE44136C9480527", 16))
@@ -624,7 +624,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST521p.generator,
secexp = int("0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538", 16),
- hsh = sha1("sample").digest(),
+ hsh = sha1(b("sample")).digest(),
hash_func = sha1,
expected = int("089C071B419E1C2820962321787258469511958E80582E95D8378E0C2CCDB3CB42BEDE42F50E3FA3C71F5A76724281D31D9C89F0F91FC1BE4918DB1C03A5838D0F9", 16))
@@ -632,7 +632,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST521p.generator,
secexp = int("0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538", 16),
- hsh = sha256("sample").digest(),
+ hsh = sha256(b("sample")).digest(),
hash_func = sha256,
expected = int("0EDF38AFCAAECAB4383358B34D67C9F2216C8382AAEA44A3DAD5FDC9C32575761793FEF24EB0FC276DFC4F6E3EC476752F043CF01415387470BCBD8678ED2C7E1A0", 16))
@@ -640,7 +640,7 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST521p.generator,
secexp = int("0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538", 16),
- hsh = sha512("test").digest(),
+ hsh = sha512(b("test")).digest(),
hash_func = sha512,
expected = int("16200813020EC986863BEDFC1B121F605C1215645018AEA1A7B215A564DE9EB1B38A67AA1128B80CE391C4FB71187654AAA3431027BFC7F395766CA988C964DC56D", 16))