Skip to content

Commit 1de1633

Browse files
committed
validate sphincs key consistency
1 parent 31278ee commit 1de1633

1 file changed

Lines changed: 36 additions & 2 deletions

File tree

wolfcrypt/src/sphincs.c

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -711,12 +711,46 @@ int wc_sphincs_export_key(sphincs_key* key, byte* priv, word32 *privSz,
711711
*/
712712
int wc_sphincs_check_key(sphincs_key* key)
713713
{
714+
int ret;
715+
word32 keySize;
716+
word32 pubSize;
717+
714718
if (key == NULL) {
715719
return BAD_FUNC_ARG;
716720
}
717721

718-
/* Assume everything is fine. */
719-
return 0;
722+
if ((key->optim != FAST_VARIANT) && (key->optim != SMALL_VARIANT)) {
723+
return BAD_FUNC_ARG;
724+
}
725+
726+
if (key->level == 1) {
727+
keySize = SPHINCS_LEVEL1_KEY_SIZE;
728+
pubSize = SPHINCS_LEVEL1_PUB_KEY_SIZE;
729+
}
730+
else if (key->level == 3) {
731+
keySize = SPHINCS_LEVEL3_KEY_SIZE;
732+
pubSize = SPHINCS_LEVEL3_PUB_KEY_SIZE;
733+
}
734+
else if (key->level == 5) {
735+
keySize = SPHINCS_LEVEL5_KEY_SIZE;
736+
pubSize = SPHINCS_LEVEL5_PUB_KEY_SIZE;
737+
}
738+
else {
739+
return BAD_FUNC_ARG;
740+
}
741+
742+
if (!key->pubKeySet || !key->prvKeySet) {
743+
return PUBLIC_KEY_E;
744+
}
745+
746+
/* SPHINCS+ secret key format ends with PK.seed || PK.root, which is the
747+
* public key. Compare it against the stored public key. */
748+
ret = XMEMCMP(key->p, key->k + keySize - pubSize, pubSize);
749+
if (ret != 0) {
750+
ret = PUBLIC_KEY_E;
751+
}
752+
753+
return ret;
720754
}
721755

722756
/* Returns the size of a sphincs private key.

0 commit comments

Comments
 (0)