forked from wolfSSL/wolfssl
Add more checks of RSA key
Check d is in valid range, p*q == n, and dP, dQ and u are valid.
This commit is contained in:
@ -653,6 +653,91 @@ int wc_CheckRsaKey(RsaKey* key)
|
||||
ret = RSA_KEY_PAIR_E;
|
||||
}
|
||||
|
||||
/* Check d is less than n. */
|
||||
if (ret == 0 ) {
|
||||
if (mp_cmp(&key->d, &key->n) != MP_LT) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
/* Check p*q = n. */
|
||||
if (ret == 0 ) {
|
||||
if (mp_mul(&key->p, &key->q, tmp) != MP_OKAY) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
if (ret == 0 ) {
|
||||
if (mp_cmp(&key->n, tmp) != MP_EQ) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check dP, dQ and u if they exist */
|
||||
if (ret == 0 && !mp_iszero(&key->dP)) {
|
||||
if (ret == 0) {
|
||||
if (mp_sub_d(&key->p, 1, tmp) != MP_OKAY) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
/* Check dP <= p-1. */
|
||||
if (ret == 0) {
|
||||
if (mp_cmp(&key->dP, tmp) != MP_LT) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
/* Check e*dP mod p-1 = 1. (dP = 1/e mod p-1) */
|
||||
if (ret == 0) {
|
||||
if (mp_mulmod(&key->dP, &key->e, tmp, tmp) != MP_OKAY) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
if (ret == 0 ) {
|
||||
if (!mp_isone(tmp)) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
if (mp_sub_d(&key->q, 1, tmp) != MP_OKAY) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
/* Check dQ <= q-1. */
|
||||
if (ret == 0) {
|
||||
if (mp_cmp(&key->dQ, tmp) != MP_LT) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
/* Check e*dP mod p-1 = 1. (dQ = 1/e mod q-1) */
|
||||
if (ret == 0) {
|
||||
if (mp_mulmod(&key->dQ, &key->e, tmp, tmp) != MP_OKAY) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
if (ret == 0 ) {
|
||||
if (!mp_isone(tmp)) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check u <= p. */
|
||||
if (ret == 0) {
|
||||
if (mp_cmp(&key->u, &key->p) != MP_LT) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
/* Check u*q mod p = 1. (u = 1/q mod p) */
|
||||
if (ret == 0) {
|
||||
if (mp_mulmod(&key->u, &key->q, &key->p, tmp) != MP_OKAY) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
if (ret == 0 ) {
|
||||
if (!mp_isone(tmp)) {
|
||||
ret = MP_EXPTMOD_E;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mp_forcezero(tmp);
|
||||
mp_clear(tmp);
|
||||
mp_clear(k);
|
||||
|
Reference in New Issue
Block a user