Rust wrapper: add wolfssl::wolfcrypt::ed25519 module

This commit is contained in:
Josh Holtrop
2025-10-28 17:20:12 -04:00
parent b6cfdcb758
commit 7cbcd0b00d
9 changed files with 1493 additions and 37 deletions

View File

@@ -440,8 +440,8 @@ int wc_ed25519ctx_verify_msg(const byte* sig, word32 siglen, const byte* msg,
byte hash[] = { initialize with SHA-512 hash of message };
byte context[] = { initialize with context of signature };
// initialize key with received public key
ret = wc_ed25519ph_verify_hash(sig, sizeof(sig), msg, sizeof(msg),
&verified, &key, );
ret = wc_ed25519ph_verify_hash(sig, sizeof(sig), hash, sizeof(hash),
&verified, &key, context, sizeof(context));
if (ret < 0) {
// error performing verification
} else if (verified == 0)
@@ -496,8 +496,8 @@ int wc_ed25519ph_verify_hash(const byte* sig, word32 siglen, const byte* hash,
byte msg[] = { initialize with message };
byte context[] = { initialize with context of signature };
// initialize key with received public key
ret = wc_ed25519ctx_verify_msg(sig, sizeof(sig), msg, sizeof(msg),
&verified, &key, );
ret = wc_ed25519ph_verify_msg(sig, sizeof(sig), msg, sizeof(msg),
&verified, &key, context, sizeof(context));
if (ret < 0) {
// error performing verification
} else if (verified == 0)
@@ -506,8 +506,8 @@ int wc_ed25519ph_verify_hash(const byte* sig, word32 siglen, const byte* hash,
\endcode
\sa wc_ed25519_verify_msg
\sa wc_ed25519ctx_verify_msg
\sa wc_ed25519ph_verify_hash
\sa wc_ed25519ph_verify_msg
\sa wc_ed25519_sign_msg
*/
@@ -747,7 +747,7 @@ int wc_ed25519_import_private_key(const byte* priv, word32 privSz,
ed25519_key key;
wc_ed25519_init_key(&key);
ret = wc_ed25519_import_private_key(priv, sizeof(priv), pub, sizeof(pub),
ret = wc_ed25519_import_private_key_ex(priv, sizeof(priv), pub, sizeof(pub),
&key, 1);
if (ret != 0) {
// error importing key
@@ -774,7 +774,7 @@ int wc_ed25519_import_private_key_ex(const byte* priv, word32 privSz,
\return 0 Returned upon successfully exporting the public key.
\return BAD_FUNC_ARG Returned if any of the input values evaluate to NULL.
\return BUFFER_E Returned if the buffer provided is not large enough to
store the private key. Upon returning this error, the function sets the
store the public key. Upon returning this error, the function sets the
size required in outLen.
\param [in] key Pointer to an ed25519_key structure from which to export the
@@ -801,10 +801,11 @@ int wc_ed25519_import_private_key_ex(const byte* priv, word32 privSz,
\sa wc_ed25519_import_public
\sa wc_ed25519_import_public_ex
\sa wc_ed25519_export_private
\sa wc_ed25519_export_private_only
*/
int wc_ed25519_export_public(ed25519_key* key, byte* out, word32* outLen);
int wc_ed25519_export_public(const ed25519_key* key, byte* out, word32* outLen);
/*!
\ingroup ED25519
@@ -840,11 +841,12 @@ int wc_ed25519_export_public(ed25519_key* key, byte* out, word32* outLen);
\endcode
\sa wc_ed25519_export_public
\sa wc_ed25519_export_private
\sa wc_ed25519_import_private_key
\sa wc_ed25519_import_private_key_ex
*/
int wc_ed25519_export_private_only(ed25519_key* key, byte* out, word32* outLen);
int wc_ed25519_export_private_only(const ed25519_key* key, byte* out, word32* outLen);
/*!
\ingroup ED25519
@@ -888,7 +890,7 @@ int wc_ed25519_export_private_only(ed25519_key* key, byte* out, word32* outLen);
\sa wc_ed25519_export_private_only
*/
int wc_ed25519_export_private(ed25519_key* key, byte* out, word32* outLen);
int wc_ed25519_export_private(const ed25519_key* key, byte* out, word32* outLen);
/*!
\ingroup ED25519
@@ -935,7 +937,7 @@ int wc_ed25519_export_private(ed25519_key* key, byte* out, word32* outLen);
\sa wc_ed25519_export_public
*/
int wc_ed25519_export_key(ed25519_key* key,
int wc_ed25519_export_key(const ed25519_key* key,
byte* priv, word32 *privSz,
byte* pub, word32 *pubSz);
@@ -999,7 +1001,7 @@ int wc_ed25519_check_key(ed25519_key* key);
\sa wc_ed25519_make_key
*/
int wc_ed25519_size(ed25519_key* key);
int wc_ed25519_size(const ed25519_key* key);
/*!
\ingroup ED25519
@@ -1028,7 +1030,7 @@ int wc_ed25519_size(ed25519_key* key);
\sa wc_ed25519_pub_size
*/
int wc_ed25519_priv_size(ed25519_key* key);
int wc_ed25519_priv_size(const ed25519_key* key);
/*!
\ingroup ED25519
@@ -1056,7 +1058,7 @@ int wc_ed25519_priv_size(ed25519_key* key);
\sa wc_ed25519_priv_size
*/
int wc_ed25519_pub_size(ed25519_key* key);
int wc_ed25519_pub_size(const ed25519_key* key);
/*!
\ingroup ED25519
@@ -1084,4 +1086,4 @@ int wc_ed25519_pub_size(ed25519_key* key);
\sa wc_ed25519_sign_msg
*/
int wc_ed25519_sig_size(ed25519_key* key);
int wc_ed25519_sig_size(const ed25519_key* key);

View File

@@ -13499,7 +13499,7 @@ int SetAsymKeyDerPublic(const byte* pubKey, word32 pubKeyLen,
* @return BAD_FUNC_ARG when key is NULL.
* @return MEMORY_E when dynamic memory allocation failed.
*/
int wc_Ed25519PublicKeyToDer(ed25519_key* key, byte* output, word32 inLen,
int wc_Ed25519PublicKeyToDer(const ed25519_key* key, byte* output, word32 inLen,
int withAlg)
{
int ret;
@@ -37770,7 +37770,7 @@ int SetAsymKeyDer(const byte* privKey, word32 privKeyLen,
#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT)
/* Write a Private ED25519 key, including public to DER format,
* length on success else < 0 */
int wc_Ed25519KeyToDer(ed25519_key* key, byte* output, word32 inLen)
int wc_Ed25519KeyToDer(const ed25519_key* key, byte* output, word32 inLen)
{
if (key == NULL) {
return BAD_FUNC_ARG;
@@ -37781,7 +37781,7 @@ int wc_Ed25519KeyToDer(ed25519_key* key, byte* output, word32 inLen)
/* Write only private ED25519 key to DER format,
* length on success else < 0 */
int wc_Ed25519PrivateKeyToDer(ed25519_key* key, byte* output, word32 inLen)
int wc_Ed25519PrivateKeyToDer(const ed25519_key* key, byte* output, word32 inLen)
{
if (key == NULL) {
return BAD_FUNC_ARG;

View File

@@ -1117,7 +1117,7 @@ void wc_ed25519_free(ed25519_key* key)
to the final output length.
returns 0 on success
*/
int wc_ed25519_export_public(ed25519_key* key, byte* out, word32* outLen)
int wc_ed25519_export_public(const ed25519_key* key, byte* out, word32* outLen)
{
/* sanity check on arguments */
if (key == NULL || out == NULL || outLen == NULL)
@@ -1343,7 +1343,7 @@ int wc_ed25519_import_private_key(const byte* priv, word32 privSz,
to the final output length.
returns 0 on success
*/
int wc_ed25519_export_private_only(ed25519_key* key, byte* out, word32* outLen)
int wc_ed25519_export_private_only(const ed25519_key* key, byte* out, word32* outLen)
{
/* sanity checks on arguments */
if (key == NULL || out == NULL || outLen == NULL)
@@ -1366,7 +1366,7 @@ int wc_ed25519_export_private_only(ed25519_key* key, byte* out, word32* outLen)
to the final output length.
returns 0 on success
*/
int wc_ed25519_export_private(ed25519_key* key, byte* out, word32* outLen)
int wc_ed25519_export_private(const ed25519_key* key, byte* out, word32* outLen)
{
/* sanity checks on arguments */
if (key == NULL || out == NULL || outLen == NULL)
@@ -1386,7 +1386,7 @@ int wc_ed25519_export_private(ed25519_key* key, byte* out, word32* outLen)
/* export full private key and public key
return 0 on success
*/
int wc_ed25519_export_key(ed25519_key* key,
int wc_ed25519_export_key(const ed25519_key* key,
byte* priv, word32 *privSz,
byte* pub, word32 *pubSz)
{
@@ -1487,7 +1487,7 @@ int wc_ed25519_check_key(ed25519_key* key)
}
/* returns the private key size (secret only) in bytes */
int wc_ed25519_size(ed25519_key* key)
int wc_ed25519_size(const ed25519_key* key)
{
if (key == NULL)
return BAD_FUNC_ARG;
@@ -1496,7 +1496,7 @@ int wc_ed25519_size(ed25519_key* key)
}
/* returns the private key size (secret + public) in bytes */
int wc_ed25519_priv_size(ed25519_key* key)
int wc_ed25519_priv_size(const ed25519_key* key)
{
if (key == NULL)
return BAD_FUNC_ARG;
@@ -1505,7 +1505,7 @@ int wc_ed25519_priv_size(ed25519_key* key)
}
/* returns the compressed key size in bytes (public key) */
int wc_ed25519_pub_size(ed25519_key* key)
int wc_ed25519_pub_size(const ed25519_key* key)
{
if (key == NULL)
return BAD_FUNC_ARG;
@@ -1514,7 +1514,7 @@ int wc_ed25519_pub_size(ed25519_key* key)
}
/* returns the size of signature in bytes */
int wc_ed25519_sig_size(ed25519_key* key)
int wc_ed25519_sig_size(const ed25519_key* key)
{
if (key == NULL)
return BAD_FUNC_ARG;

View File

@@ -728,11 +728,11 @@ WOLFSSL_API int wc_Ed25519PublicKeyDecode(const byte* input, word32* inOutIdx,
ed25519_key* key, word32 inSz);
#endif
#ifdef HAVE_ED25519_KEY_EXPORT
WOLFSSL_API int wc_Ed25519KeyToDer(ed25519_key* key, byte* output,
WOLFSSL_API int wc_Ed25519KeyToDer(const ed25519_key* key, byte* output,
word32 inLen);
WOLFSSL_API int wc_Ed25519PrivateKeyToDer(ed25519_key* key, byte* output,
WOLFSSL_API int wc_Ed25519PrivateKeyToDer(const ed25519_key* key, byte* output,
word32 inLen);
WOLFSSL_API int wc_Ed25519PublicKeyToDer(ed25519_key* key, byte* output,
WOLFSSL_API int wc_Ed25519PublicKeyToDer(const ed25519_key* key, byte* output,
word32 inLen, int withAlg);
#endif
#endif /* HAVE_ED25519 */

View File

@@ -207,13 +207,13 @@ int wc_ed25519_import_private_key_ex(const byte* priv, word32 privSz,
#ifdef HAVE_ED25519_KEY_EXPORT
WOLFSSL_API
int wc_ed25519_export_public(ed25519_key* key, byte* out, word32* outLen);
int wc_ed25519_export_public(const ed25519_key* key, byte* out, word32* outLen);
WOLFSSL_API
int wc_ed25519_export_private_only(ed25519_key* key, byte* out, word32* outLen);
int wc_ed25519_export_private_only(const ed25519_key* key, byte* out, word32* outLen);
WOLFSSL_API
int wc_ed25519_export_private(ed25519_key* key, byte* out, word32* outLen);
int wc_ed25519_export_private(const ed25519_key* key, byte* out, word32* outLen);
WOLFSSL_API
int wc_ed25519_export_key(ed25519_key* key,
int wc_ed25519_export_key(const ed25519_key* key,
byte* priv, word32 *privSz,
byte* pub, word32 *pubSz);
#endif /* HAVE_ED25519_KEY_EXPORT */
@@ -223,13 +223,13 @@ int wc_ed25519_check_key(ed25519_key* key);
/* size helper */
WOLFSSL_API
int wc_ed25519_size(ed25519_key* key);
int wc_ed25519_size(const ed25519_key* key);
WOLFSSL_API
int wc_ed25519_priv_size(ed25519_key* key);
int wc_ed25519_priv_size(const ed25519_key* key);
WOLFSSL_API
int wc_ed25519_pub_size(ed25519_key* key);
int wc_ed25519_pub_size(const ed25519_key* key);
WOLFSSL_API
int wc_ed25519_sig_size(ed25519_key* key);
int wc_ed25519_sig_size(const ed25519_key* key);
#ifdef __cplusplus
} /* extern "C" */

View File

@@ -20,6 +20,7 @@ EXTRA_DIST += wrapper/rust/wolfssl/src/wolfcrypt/aes.rs
EXTRA_DIST += wrapper/rust/wolfssl/src/wolfcrypt/cmac.rs
EXTRA_DIST += wrapper/rust/wolfssl/src/wolfcrypt/dh.rs
EXTRA_DIST += wrapper/rust/wolfssl/src/wolfcrypt/ecc.rs
EXTRA_DIST += wrapper/rust/wolfssl/src/wolfcrypt/ed25519.rs
EXTRA_DIST += wrapper/rust/wolfssl/src/wolfcrypt/hkdf.rs
EXTRA_DIST += wrapper/rust/wolfssl/src/wolfcrypt/hmac.rs
EXTRA_DIST += wrapper/rust/wolfssl/src/wolfcrypt/kdf.rs
@@ -31,6 +32,7 @@ EXTRA_DIST += wrapper/rust/wolfssl/tests/test_aes.rs
EXTRA_DIST += wrapper/rust/wolfssl/tests/test_cmac.rs
EXTRA_DIST += wrapper/rust/wolfssl/tests/test_dh.rs
EXTRA_DIST += wrapper/rust/wolfssl/tests/test_ecc.rs
EXTRA_DIST += wrapper/rust/wolfssl/tests/test_ed25519.rs
EXTRA_DIST += wrapper/rust/wolfssl/tests/test_hkdf.rs
EXTRA_DIST += wrapper/rust/wolfssl/tests/test_hmac.rs
EXTRA_DIST += wrapper/rust/wolfssl/tests/test_kdf.rs

View File

@@ -22,6 +22,7 @@ pub mod aes;
pub mod cmac;
pub mod dh;
pub mod ecc;
pub mod ed25519;
pub mod hkdf;
pub mod hmac;
pub mod kdf;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,214 @@
use wolfssl::wolfcrypt::random::RNG;
use wolfssl::wolfcrypt::ed25519::*;
#[test]
fn test_make_public() {
let mut rng = RNG::new().expect("Error creating RNG");
let ed = Ed25519::generate(&mut rng).expect("Error with generate()");
let mut private = [0u8; Ed25519::KEY_SIZE];
ed.export_private_only(&mut private).expect("Error with export_private_only()");
let mut ed = Ed25519::new().expect("Error with new()");
ed.import_private_only(&private).expect("Error with import_private_only()");
let mut public = [0u8; Ed25519::KEY_SIZE];
ed.make_public(&mut public).expect("Error with make_public()");
}
#[test]
fn test_check_key() {
let mut rng = RNG::new().expect("Error creating RNG");
let mut ed = Ed25519::generate(&mut rng).expect("Error with generate()");
ed.check_key().expect("Error with check_key()");
}
#[test]
fn test_sign_verify() {
let private_key = [
0xc5u8,0xaa,0x8d,0xf4,0x3f,0x9f,0x83,0x7b,
0xed,0xb7,0x44,0x2f,0x31,0xdc,0xb7,0xb1,
0x66,0xd3,0x85,0x35,0x07,0x6f,0x09,0x4b,
0x85,0xce,0x3a,0x2e,0x0b,0x44,0x58,0xf7
];
let public_key = [
0xfcu8,0x51,0xcd,0x8e,0x62,0x18,0xa1,0xa3,
0x8d,0xa4,0x7e,0xd0,0x02,0x30,0xf0,0x58,
0x08,0x16,0xed,0x13,0xba,0x33,0x03,0xac,
0x5d,0xeb,0x91,0x15,0x48,0x90,0x80,0x25
];
let message = [0xAFu8, 0x82];
let expected_signature = [
0x62u8,0x91,0xd6,0x57,0xde,0xec,0x24,0x02,
0x48,0x27,0xe6,0x9c,0x3a,0xbe,0x01,0xa3,
0x0c,0xe5,0x48,0xa2,0x84,0x74,0x3a,0x44,
0x5e,0x36,0x80,0xd7,0xdb,0x5a,0xc3,0xac,
0x18,0xff,0x9b,0x53,0x8d,0x16,0xf2,0x90,
0xae,0x67,0xf7,0x60,0x98,0x4d,0xc6,0x59,
0x4a,0x7c,0x15,0xe9,0x71,0x6e,0xd2,0x8d,
0xc0,0x27,0xbe,0xce,0xea,0x1e,0xc4,0x0a
];
let mut ed = Ed25519::new().expect("Error with new()");
ed.import_private_key(&private_key, Some(&public_key)).expect("Error with import_private_key()");
let mut signature = [0u8; Ed25519::SIG_SIZE];
ed.sign_msg(&message, &mut signature).expect("Error with sign_msg()");
assert_eq!(signature, expected_signature);
let signature_valid = ed.verify_msg(&signature, &message).expect("Error with verify_msg()");
assert!(signature_valid);
let mut signature = [0u8; Ed25519::SIG_SIZE];
ed.sign_msg_ex(&message, None, Ed25519::ED25519, &mut signature).expect("Error with sign_msg()");
assert_eq!(signature, expected_signature);
let signature_valid = ed.verify_msg_ex(&signature, &message, None, Ed25519::ED25519).expect("Error with verify_msg()");
assert!(signature_valid);
ed.verify_msg_init(&signature, None, Ed25519::ED25519).expect("Error with verify_msg_init()");
ed.verify_msg_update(&message[0..1]).expect("Error with verify_msg_update()");
ed.verify_msg_update(&message[1..2]).expect("Error with verify_msg_update()");
let signature_valid = ed.verify_msg_final(&signature).expect("Error with verify_msg_final()");
assert!(signature_valid);
}
#[test]
fn test_ctx_sign_verify() {
let private_key = [
0x03u8,0x05,0x33,0x4e,0x38,0x1a,0xf7,0x8f,
0x14,0x1c,0xb6,0x66,0xf6,0x19,0x9f,0x57,
0xbc,0x34,0x95,0x33,0x5a,0x25,0x6a,0x95,
0xbd,0x2a,0x55,0xbf,0x54,0x66,0x63,0xf6
];
let public_key = [
0xdfu8,0xc9,0x42,0x5e,0x4f,0x96,0x8f,0x7f,
0x0c,0x29,0xf0,0x25,0x9c,0xf5,0xf9,0xae,
0xd6,0x85,0x1c,0x2b,0xb4,0xad,0x8b,0xfb,
0x86,0x0c,0xfe,0xe0,0xab,0x24,0x82,0x92
];
let message = [
0xf7u8,0x26,0x93,0x6d,0x19,0xc8,0x00,0x49,
0x4e,0x3f,0xda,0xff,0x20,0xb2,0x76,0xa8
];
let context = [0x66u8,0x6f,0x6f];
let expected_signature = [
0x55u8,0xa4,0xcc,0x2f,0x70,0xa5,0x4e,0x04,
0x28,0x8c,0x5f,0x4c,0xd1,0xe4,0x5a,0x7b,
0xb5,0x20,0xb3,0x62,0x92,0x91,0x18,0x76,
0xca,0xda,0x73,0x23,0x19,0x8d,0xd8,0x7a,
0x8b,0x36,0x95,0x0b,0x95,0x13,0x00,0x22,
0x90,0x7a,0x7f,0xb7,0xc4,0xe9,0xb2,0xd5,
0xf6,0xcc,0xa6,0x85,0xa5,0x87,0xb4,0xb2,
0x1f,0x4b,0x88,0x8e,0x4e,0x7e,0xdb,0x0d
];
let mut ed = Ed25519::new().expect("Error with new()");
ed.import_private_key(&private_key, Some(&public_key)).expect("Error with import_private_key()");
let mut signature = [0u8; Ed25519::SIG_SIZE];
ed.sign_msg_ctx(&message, &context, &mut signature).expect("Error with sign_msg_ctx()");
assert_eq!(signature, expected_signature);
let signature_valid = ed.verify_msg_ctx(&signature, &message, &context).expect("Error with verify_msg_ctx()");
assert!(signature_valid);
}
#[test]
fn test_ph_sign_verify() {
let private_key = [
0x83u8,0x3f,0xe6,0x24,0x09,0x23,0x7b,0x9d,
0x62,0xec,0x77,0x58,0x75,0x20,0x91,0x1e,
0x9a,0x75,0x9c,0xec,0x1d,0x19,0x75,0x5b,
0x7d,0xa9,0x01,0xb9,0x6d,0xca,0x3d,0x42
];
let public_key = [
0xecu8,0x17,0x2b,0x93,0xad,0x5e,0x56,0x3b,
0xf4,0x93,0x2c,0x70,0xe1,0x24,0x50,0x34,
0xc3,0x54,0x67,0xef,0x2e,0xfd,0x4d,0x64,
0xeb,0xf8,0x19,0x68,0x34,0x67,0xe2,0xbf
];
let message = [0x61u8,0x62,0x63];
let context = [0x66u8,0x6f,0x6f];
let hash = [
0xddu8,0xaf,0x35,0xa1,0x93,0x61,0x7a,0xba,
0xcc,0x41,0x73,0x49,0xae,0x20,0x41,0x31,
0x12,0xe6,0xfa,0x4e,0x89,0xa9,0x7e,0xa2,
0x0a,0x9e,0xee,0xe6,0x4b,0x55,0xd3,0x9a,
0x21,0x92,0x99,0x2a,0x27,0x4f,0xc1,0xa8,
0x36,0xba,0x3c,0x23,0xa3,0xfe,0xeb,0xbd,
0x45,0x4d,0x44,0x23,0x64,0x3c,0xe8,0x0e,
0x2a,0x9a,0xc9,0x4f,0xa5,0x4c,0xa4,0x9f
];
let expected_signature = [
0xe0u8,0x39,0x70,0x2b,0x4c,0x25,0x95,0xa6,
0xa5,0x41,0xac,0x85,0x09,0x23,0x6e,0x29,
0x90,0x47,0x47,0x95,0x33,0x0c,0x9b,0x34,
0xa7,0x5f,0x58,0xa6,0x60,0x12,0x9e,0x08,
0xfd,0x73,0x69,0x43,0xfb,0x19,0x43,0xa5,
0x57,0x20,0xb9,0xe0,0x95,0x7b,0x1e,0xd6,
0x73,0x48,0x16,0x61,0x9f,0x13,0x88,0xf4,
0x3f,0x73,0xe6,0xe3,0xba,0xa8,0x1c,0x0e
];
let mut ed = Ed25519::new().expect("Error with new()");
ed.import_private_key(&private_key, Some(&public_key)).expect("Error with import_private_key()");
let mut signature = [0u8; Ed25519::SIG_SIZE];
ed.sign_msg_ph(&message, &context, &mut signature).expect("Error with sign_msg_ph()");
assert_eq!(signature, expected_signature);
let signature_valid = ed.verify_msg_ph(&signature, &message, &context).expect("Error with verify_msg_ph()");
assert!(signature_valid);
let mut signature = [0u8; Ed25519::SIG_SIZE];
ed.sign_hash_ph(&hash, &context, &mut signature).expect("Error with sign_hash_ph()");
assert_eq!(signature, expected_signature);
let signature_valid = ed.verify_hash_ph(&signature, &hash, &context).expect("Error with verify_hash_ph()");
assert!(signature_valid);
}
#[test]
fn test_import_export() {
let mut rng = RNG::new().expect("Error creating RNG");
let ed = Ed25519::generate(&mut rng).expect("Error with generate()");
let mut private = [0u8; Ed25519::PRV_KEY_SIZE];
let mut public = [0u8; Ed25519::PUB_KEY_SIZE];
ed.export_key(&mut private, &mut public).expect("Error with export_key()");
let mut public2 = [0u8; Ed25519::PUB_KEY_SIZE];
ed.export_public(&mut public2).expect("Error with export_public()");
assert_eq!(public2, public);
let mut private2 = [0u8; Ed25519::PRV_KEY_SIZE];
ed.export_private(&mut private2).expect("Error with export_private()");
assert_eq!(private2, private);
let mut private_only = [0u8; Ed25519::KEY_SIZE];
ed.export_private_only(&mut private_only).expect("Error with export_private_only()");
let mut ed = Ed25519::new().expect("Error with new()");
ed.import_private_key_ex(&private, Some(&public), false).expect("Error with import_private_key_ex()");
let mut ed = Ed25519::new().expect("Error with new()");
ed.import_private_only(&private_only).expect("Error with import_private_only()");
ed.import_public(&public).expect("Error with import_public()");
ed.import_public_ex(&public, false).expect("Error with import_public_ex()");
}
#[test]
fn test_sizes() {
let mut rng = RNG::new().expect("Error creating RNG");
let ed = Ed25519::generate(&mut rng).expect("Error with generate()");
let size = ed.size().expect("Error with size()");
assert_eq!(size, Ed25519::KEY_SIZE);
let size = ed.priv_size().expect("Error with priv_size()");
assert_eq!(size, Ed25519::PRV_KEY_SIZE);
let size = ed.pub_size().expect("Error with pub_size()");
assert_eq!(size, Ed25519::PUB_KEY_SIZE);
let size = ed.sig_size().expect("Error with sig_size()");
assert_eq!(size, Ed25519::SIG_SIZE);
}