mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2026-01-26 21:02:21 +01:00
Rust wrapper: add wolfssl::wolfcrypt::ed25519 module
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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" */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
1237
wrapper/rust/wolfssl/src/wolfcrypt/ed25519.rs
Normal file
1237
wrapper/rust/wolfssl/src/wolfcrypt/ed25519.rs
Normal file
File diff suppressed because it is too large
Load Diff
214
wrapper/rust/wolfssl/tests/test_ed25519.rs
Normal file
214
wrapper/rust/wolfssl/tests/test_ed25519.rs
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user