mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-30 02:37:28 +02:00
Ed make public key wasn't checking whether private key set
Ed25519 and Ed448 make public key APIs now check whether the private key was set. The private key and public key flags setting and clearing also updated. Testing of unset private key and calling make public key added for Ed25519 and Ed448.
This commit is contained in:
20
tests/api.c
20
tests/api.c
@ -21426,11 +21426,21 @@ static int test_wc_ed25519_make_key(void)
|
||||
#if defined(HAVE_ED25519)
|
||||
ed25519_key key;
|
||||
WC_RNG rng;
|
||||
unsigned char pubkey[ED25519_PUB_KEY_SIZE];
|
||||
|
||||
ret = wc_InitRng(&rng);
|
||||
if (ret == 0) {
|
||||
ret = wc_ed25519_init(&key);
|
||||
}
|
||||
if (ret == 0) {
|
||||
ret = wc_ed25519_make_public(&key, pubkey, sizeof(pubkey));
|
||||
if (ret == ECC_PRIV_KEY_E) {
|
||||
ret = 0;
|
||||
}
|
||||
else if (ret == 0) {
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
printf(testingFmt, "wc_ed25519_make_key()");
|
||||
if (ret == 0) {
|
||||
ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key);
|
||||
@ -23249,11 +23259,21 @@ static int test_wc_ed448_make_key(void)
|
||||
#if defined(HAVE_ED448)
|
||||
ed448_key key;
|
||||
WC_RNG rng;
|
||||
unsigned char pubkey[ED448_PUB_KEY_SIZE];
|
||||
|
||||
ret = wc_InitRng(&rng);
|
||||
if (ret == 0) {
|
||||
ret = wc_ed448_init(&key);
|
||||
}
|
||||
if (ret == 0) {
|
||||
ret = wc_ed448_make_public(&key, pubkey, sizeof(pubkey));
|
||||
if (ret == ECC_PRIV_KEY_E) {
|
||||
ret = 0;
|
||||
}
|
||||
else if (ret == 0) {
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
printf(testingFmt, "wc_ed448_make_key()");
|
||||
if (ret == 0) {
|
||||
ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key);
|
||||
|
@ -182,6 +182,10 @@ int wc_ed25519_make_public(ed25519_key* key, unsigned char* pubKey,
|
||||
if (key == NULL || pubKey == NULL || pubKeySz != ED25519_PUB_KEY_SIZE)
|
||||
ret = BAD_FUNC_ARG;
|
||||
|
||||
if ((ret == 0) && (!key->privKeySet)) {
|
||||
ret = ECC_PRIV_KEY_E;
|
||||
}
|
||||
|
||||
if (ret == 0)
|
||||
ret = ed25519_hash(key, key->k, ED25519_KEY_SIZE, az);
|
||||
if (ret == 0) {
|
||||
@ -201,6 +205,8 @@ int wc_ed25519_make_public(ed25519_key* key, unsigned char* pubKey,
|
||||
ge_scalarmult_base(&A, az);
|
||||
ge_p3_tobytes(pubKey, &A);
|
||||
#endif
|
||||
|
||||
key->pubKeySet = 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -220,6 +226,9 @@ int wc_ed25519_make_key(WC_RNG* rng, int keySz, ed25519_key* key)
|
||||
if (keySz != ED25519_KEY_SIZE)
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
key->privKeySet = 0;
|
||||
key->pubKeySet = 0;
|
||||
|
||||
#ifdef WOLF_CRYPTO_CB
|
||||
if (key->devId != INVALID_DEVID) {
|
||||
ret = wc_CryptoCb_Ed25519Gen(rng, keySz, key);
|
||||
@ -233,8 +242,10 @@ int wc_ed25519_make_key(WC_RNG* rng, int keySz, ed25519_key* key)
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
key->privKeySet = 1;
|
||||
ret = wc_ed25519_make_public(key, key->p, ED25519_PUB_KEY_SIZE);
|
||||
if (ret != 0) {
|
||||
key->privKeySet = 0;
|
||||
ForceZero(key->k, ED25519_KEY_SIZE);
|
||||
return ret;
|
||||
}
|
||||
@ -242,9 +253,6 @@ int wc_ed25519_make_key(WC_RNG* rng, int keySz, ed25519_key* key)
|
||||
/* put public key after private key, on the same buffer */
|
||||
XMEMMOVE(key->k + ED25519_KEY_SIZE, key->p, ED25519_PUB_KEY_SIZE);
|
||||
|
||||
key->privKeySet = 1;
|
||||
key->pubKeySet = 1;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -185,6 +185,10 @@ int wc_ed448_make_public(ed448_key* key, unsigned char* pubKey, word32 pubKeySz)
|
||||
ret = BAD_FUNC_ARG;
|
||||
}
|
||||
|
||||
if ((ret == 0) && (!key->privKeySet)) {
|
||||
ret = ECC_PRIV_KEY_E;
|
||||
}
|
||||
|
||||
if (ret == 0)
|
||||
ret = ed448_hash(key, key->k, ED448_KEY_SIZE, az, sizeof(az));
|
||||
|
||||
@ -196,6 +200,8 @@ int wc_ed448_make_public(ed448_key* key, unsigned char* pubKey, word32 pubKeySz)
|
||||
|
||||
ge448_scalarmult_base(&A, az);
|
||||
ge448_to_bytes(pubKey, &A);
|
||||
|
||||
key->pubKeySet = 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -225,20 +231,22 @@ int wc_ed448_make_key(WC_RNG* rng, int keySz, ed448_key* key)
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
key->pubKeySet = 0;
|
||||
key->privKeySet = 0;
|
||||
|
||||
ret = wc_RNG_GenerateBlock(rng, key->k, ED448_KEY_SIZE);
|
||||
}
|
||||
if (ret == 0) {
|
||||
key->privKeySet = 1;
|
||||
ret = wc_ed448_make_public(key, key->p, ED448_PUB_KEY_SIZE);
|
||||
if (ret != 0) {
|
||||
key->privKeySet = 0;
|
||||
ForceZero(key->k, ED448_KEY_SIZE);
|
||||
}
|
||||
}
|
||||
if (ret == 0) {
|
||||
/* put public key after private key, on the same buffer */
|
||||
XMEMMOVE(key->k + ED448_KEY_SIZE, key->p, ED448_PUB_KEY_SIZE);
|
||||
|
||||
key->pubKeySet = 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
Reference in New Issue
Block a user