Merge pull request #3 from danielinux/ed25519-pubkey

Ed25519Private: change to handle public keys
pull/5/head
David Garske 2019-04-15 15:24:51 -07:00 committed by GitHub
commit 5e9d6d7bec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 5 deletions

View File

@ -178,6 +178,8 @@ ffi.cdef(
void wc_ed25519_free(ed25519_key* ed25519);
int wc_ed25519_make_key(WC_RNG* rng, int keysize, ed25519_key* key);
int wc_ed25519_make_public(ed25519_key* key, unsigned char* pubKey,
word32 pubKeySz);
int wc_ed25519_size(ed25519_key* key);
int wc_ed25519_sig_size(ed25519_key* key);
int wc_ed25519_sign_msg(const byte* in, word32 inlen, byte* out,

View File

@ -770,11 +770,18 @@ class Ed25519Private(Ed25519Public):
idx[0] = 0
if pub:
ret = _lib.wc_ed25519_import_private_key(key, len(key), pub, len(pub), self.native_object);
if ret < 0:
raise WolfCryptError("Key decode error (%d)" % ret)
else:
ret = _lib.wc_ed25519_import_private_only(key, len(key), self.native_object);
if ret < 0:
raise WolfCryptError("Key decode error (%d)" % ret)
pubkey = _ffi.new("byte[%d]" % (self.size * 4))
ret = _lib.wc_ed25519_make_public(self.native_object, pubkey, self.size)
if ret < 0:
raise WolfCryptError("Public key generate error (%d)" % ret)
ret = _lib.wc_ed25519_import_public(pubkey, self.size, self.native_object);
if ret < 0:
raise WolfCryptError("Key decode error (%d)" % ret)
if self.size <= 0: # pragma: no cover
raise WolfCryptError("Key decode error (%d)" % self.size)
if self.max_signature_size <= 0: # pragma: no cover
@ -788,15 +795,19 @@ class Ed25519Private(Ed25519Public):
Returns the encoded key.
"""
key = _ffi.new("byte[%d]" % (self.size * 4))
pubkey = _ffi.new("byte[%d]" % (self.size * 4))
size = _ffi.new("word32[1]")
size[0] = _lib.wc_ed25519_priv_size(self.native_object)
ret = _lib.wc_ed25519_export_private_only(self.native_object, key, size)
if ret != 0: # pragma: no cover
raise WolfCryptError("Key encode error (%d)" % ret)
raise WolfCryptError("Private key encode error (%d)" % ret)
ret = _lib.wc_ed25519_export_public(self.native_object, pubkey, size)
if ret != 0: # pragma: no cover
raise WolfCryptError("Public key encode error (%d)" % ret)
return _ffi.buffer(key, size[0])[:]
return _ffi.buffer(key, size[0])[:], _ffi.buffer(pubkey, size[0])[:]
def sign(self, plaintext):
"""

View File

@ -392,7 +392,8 @@ def test_ed25519_key_encoding(vectors):
priv.decode_key(vectors[Ed25519Private].key)
pub.decode_key(vectors[Ed25519Public].key)
assert priv.encode_key() == vectors[Ed25519Private].key
assert priv.encode_key()[0] == vectors[Ed25519Private].key
assert priv.encode_key()[1] == vectors[Ed25519Public].key # Automatically re-generated from private-only
assert pub.encode_key() == vectors[Ed25519Public].key