Commit 694d6f3b authored by Sam Rushing's avatar Sam Rushing

add support for compressed keys & more tests.

parent 348f7c85
...@@ -164,11 +164,22 @@ cdef extern from "openssl/ec.h": ...@@ -164,11 +164,22 @@ cdef extern from "openssl/ec.h":
EC_KEY * o2i_ECPublicKey (EC_KEY **, const unsigned char **, long) EC_KEY * o2i_ECPublicKey (EC_KEY **, const unsigned char **, long)
int i2d_ECPrivateKey (EC_KEY *, unsigned char **) int i2d_ECPrivateKey (EC_KEY *, unsigned char **)
int i2o_ECPublicKey (EC_KEY *, unsigned char **) int i2o_ECPublicKey (EC_KEY *, unsigned char **)
ctypedef enum point_conversion_form_t:
POINT_CONVERSION_COMPRESSED
POINT_CONVERSION_UNCOMPRESSED
POINT_CONVERSION_HYBRID
void EC_KEY_set_conv_form (EC_KEY *, point_conversion_form_t)
cdef extern from "openssl/ecdsa.h": cdef extern from "openssl/ecdsa.h":
int ECDSA_size (const EC_KEY * eckey) int ECDSA_size (const EC_KEY * eckey)
int ECDSA_sign (int type, const unsigned char *dgst, int dgstlen, unsigned char *sig, unsigned int *siglen, EC_KEY *eckey) int ECDSA_sign (
int ECDSA_verify (int type, const unsigned char *dgst, int dgstlen, const unsigned char *sig, int siglen, EC_KEY *eckey) int type, const unsigned char *dgst, int dgstlen,
unsigned char *sig, unsigned int *siglen, EC_KEY *eckey
)
int ECDSA_verify (
int type, const unsigned char *dgst, int dgstlen,
const unsigned char *sig, int siglen, EC_KEY *eckey
)
cdef extern from "openssl/x509.h": cdef extern from "openssl/x509.h":
ctypedef struct X509 ctypedef struct X509
......
...@@ -1363,6 +1363,14 @@ cdef class ecdsa: ...@@ -1363,6 +1363,14 @@ cdef class ecdsa:
else: else:
return result return result
def set_compressed (self, bint compressed):
cdef point_conversion_form_t form
if compressed:
form = POINT_CONVERSION_COMPRESSED
else:
form = POINT_CONVERSION_UNCOMPRESSED
EC_KEY_set_conv_form (self.key, form)
# ================================================================================ # ================================================================================
def random_status(): def random_status():
......
...@@ -3,13 +3,23 @@ ...@@ -3,13 +3,23 @@
import hashlib import hashlib
import unittest import unittest
import coro.ssl.openssl from coro.ssl.openssl import ecdsa
import coro_unittest import coro_unittest
test_key = (
'30820113020101042027a4909da59e97e1854a6d5ea26575b953d72da4cf285849ff9acce0d2156c'
'42a081a53081a2020101302c06072a8648ce3d0101022100ffffffffffffffffffffffffffffffff'
'fffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce'
'870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a6'
'8554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd2'
'5e8cd0364141020101a144034200042c26ab996dcc1645ea103015b0a9b008c434e2cf33f3374834'
'0747061ab9d1070f7b6884b862c78a0ccd66cc94cf80de6de33f6b7adff73dfa19328ee3d509db'
).decode ('hex')
class Test (unittest.TestCase): class Test (unittest.TestCase):
def test_gen_key (self): def test_gen_key (self):
e = coro.ssl.openssl.ecdsa ("secp256k1") e = ecdsa ("secp256k1")
e.generate() e.generate()
h = hashlib.new ('sha256') h = hashlib.new ('sha256')
h.update ('asdfasdfasdfasdfasdf') h.update ('asdfasdfasdfasdfasdf')
...@@ -18,13 +28,36 @@ class Test (unittest.TestCase): ...@@ -18,13 +28,36 @@ class Test (unittest.TestCase):
self.assertEqual (e.verify (d, sig), 1) self.assertEqual (e.verify (d, sig), 1)
def test_get_keys (self): def test_get_keys (self):
e = coro.ssl.openssl.ecdsa ("secp256k1") e = ecdsa ("secp256k1")
e.generate() e.generate()
k = e.get_privkey() k = e.get_privkey()
p = e.get_pubkey() p = e.get_pubkey()
def test_set_get (self):
e0 = ecdsa ('secp256k1')
e0.set_privkey (test_key)
e0.set_compressed (True)
p = e0.get_pubkey()
self.assertEqual (
p,
'032c26ab996dcc1645ea103015b0a9b008c434e2cf33f33748340747061ab9d107'.decode ('hex')
)
def test_714 (self):
e0 = ecdsa ('secp256k1')
e0.set_privkey (test_key)
h = hashlib.new ('sha256')
h.update ('asdfasdfasdfasdfasdf')
d = h.digest()
sig0 = e0.sign (d)
self.assertEqual (e0.verify (d, sig0), 1)
e1 = ecdsa (714) # NID_secp256k1
e1.set_privkey (test_key)
sig1 = e1.sign (d)
self.assertEqual (e1.verify (d, sig1), 1)
def test_pub_sig (self): def test_pub_sig (self):
e0 = coro.ssl.openssl.ecdsa ("secp256k1") e0 = ecdsa ("secp256k1")
e0.generate() e0.generate()
k0 = e0.get_privkey() k0 = e0.get_privkey()
p0 = e0.get_pubkey() p0 = e0.get_pubkey()
...@@ -33,9 +66,44 @@ class Test (unittest.TestCase): ...@@ -33,9 +66,44 @@ class Test (unittest.TestCase):
d = h.digest() d = h.digest()
sig = e0.sign (d) sig = e0.sign (d)
self.assertEqual (e0.verify (d, sig), 1) self.assertEqual (e0.verify (d, sig), 1)
e1 = coro.ssl.openssl.ecdsa ("secp256k1") e1 = ecdsa ("secp256k1")
e1.set_pubkey (p0) e1.set_pubkey (p0)
self.assertEqual (e1.verify (d, sig), 1) self.assertEqual (e1.verify (d, sig), 1)
def test_compressed (self):
e = ecdsa ("secp256k1")
e.set_compressed (True)
e.generate()
p = e.get_pubkey()
self.assertTrue (p[0] in ('\x02', '\x03'))
def test_uncompressed (self):
e = ecdsa ("secp256k1")
e.set_compressed (False)
e.generate()
p = e.get_pubkey()
self.assertTrue (p[0] in ('\x04'))
def test_hybrid (self):
e = ecdsa ("secp256k1")
e.set_compressed (False)
e.generate()
p = e.get_pubkey()
self.assertTrue (p[0] in ('\x04'))
def test_mode_change (self):
e = ecdsa ("secp256k1")
p0 = (
'04875a41657e777b0d13f89aa765f954f78eb47d25c831de472b38e2e6792792b'
'fe4083113bb0398cfa908dc80dd8778a6af693ff605e3ea1cd2a71037424d6260'
).decode ('hex')
e.set_pubkey (p0)
e.set_compressed (True)
p1 = e.get_pubkey()
self.assertEquals (
p1,
'02875a41657e777b0d13f89aa765f954f78eb47d25c831de472b38e2e6792792bf'.decode ("hex")
)
if __name__ == '__main__': if __name__ == '__main__':
coro_unittest.run_tests() coro_unittest.run_tests()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment