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:
Sean Parkinson
2022-09-05 12:21:51 +10:00
parent 49065373aa
commit f807c70637
3 changed files with 41 additions and 5 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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;