Skip to content

Commit e32456b

Browse files
rsa pki encoding tests and fix for encoding rsapss to pki
1 parent e582de1 commit e32456b

File tree

4 files changed

+487
-122
lines changed

4 files changed

+487
-122
lines changed

src/wp_rsa_kmgmt.c

Lines changed: 113 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,72 @@ static int wp_rsa_get_params_key_data(wp_Rsa* rsa, OSSL_PARAM params[])
909909
return ok;
910910
}
911911

912+
/**
913+
* Convert a wolfCrypt hashType to the equivalent OpenSSL digest name.
914+
*
915+
* @param [in] hashType WolfProvider digest id.
916+
* @param [out] osslDigest Corresponding OpenSSL digest name.
917+
* @return 1 on success.
918+
* @return 0 on failure.
919+
*/
920+
static int wp_digest_to_ossl_digest(enum wc_HashType hashType,
921+
const char** osslDigest)
922+
{
923+
int ok = 1;
924+
925+
switch (hashType) {
926+
case WC_HASH_TYPE_MD5:
927+
*osslDigest = OSSL_DIGEST_NAME_MD5;
928+
break;
929+
930+
case WC_HASH_TYPE_SHA:
931+
*osslDigest = OSSL_DIGEST_NAME_SHA1;
932+
break;
933+
934+
case WC_HASH_TYPE_SHA256:
935+
*osslDigest = OSSL_DIGEST_NAME_SHA2_256;
936+
break;
937+
938+
case WC_HASH_TYPE_SHA384:
939+
*osslDigest = OSSL_DIGEST_NAME_SHA2_384;
940+
break;
941+
942+
case WC_HASH_TYPE_SHA512:
943+
*osslDigest = OSSL_DIGEST_NAME_SHA2_512;
944+
break;
945+
946+
case WC_HASH_TYPE_NONE:
947+
case WC_HASH_TYPE_MD2:
948+
case WC_HASH_TYPE_MD4:
949+
case WC_HASH_TYPE_SHA224:
950+
case WC_HASH_TYPE_MD5_SHA:
951+
case WC_HASH_TYPE_SHA3_224:
952+
case WC_HASH_TYPE_SHA3_256:
953+
case WC_HASH_TYPE_SHA3_384:
954+
case WC_HASH_TYPE_SHA3_512:
955+
case WC_HASH_TYPE_BLAKE2B:
956+
case WC_HASH_TYPE_BLAKE2S:
957+
#ifndef WOLFSSL_NOSHA512_224
958+
case WC_HASH_TYPE_SHA512_224:
959+
#endif
960+
#ifndef WOLFSSL_NOSHA512_256
961+
case WC_HASH_TYPE_SHA512_256:
962+
#endif
963+
#ifdef WOLFSSL_SHAKE128
964+
case WC_HASH_TYPE_SHAKE128:
965+
#endif
966+
#ifdef WOLFSSL_SHAKE256
967+
case WC_HASH_TYPE_SHAKE256:
968+
#endif
969+
#ifdef WOLFSSL_SM3
970+
case WC_HASH_TYPE_SM3:
971+
#endif
972+
ok = 0;
973+
}
974+
975+
return ok;
976+
}
977+
912978
/**
913979
* Get the PSS parameters into the parameters array.
914980
*
@@ -921,19 +987,22 @@ static int wp_rsa_get_params_pss(wp_RsaPssParams* pss, OSSL_PARAM params[])
921987
{
922988
int ok = 1;
923989
OSSL_PARAM* p;
990+
const char* osslDigest = NULL;
924991

925992
WOLFPROV_ENTER(WP_LOG_COMP_RSA, "wp_rsa_get_params_pss");
926993

927994
if (pss->hashType != WP_RSA_PSS_DIGEST_DEF) {
928995
p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_RSA_DIGEST);
929-
if ((p != NULL) && !OSSL_PARAM_set_utf8_string(p, pss->mdName)) {
996+
if ((p != NULL) && wp_digest_to_ossl_digest(pss->hashType, &osslDigest)
997+
&& !OSSL_PARAM_set_utf8_string(p, osslDigest)) {
930998
ok = 0;
931999
}
9321000
}
9331001
/* MGF is default so don't set. */
9341002
if (ok && (pss->mgf != WP_RSA_PSS_MGF_DEF)) {
9351003
p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_RSA_MGF1_DIGEST);
936-
if ((p != NULL) && !OSSL_PARAM_set_utf8_string(p, pss->mgfMdName)) {
1004+
if ((p != NULL) && wp_digest_to_ossl_digest(pss->hashType, &osslDigest)
1005+
&& !OSSL_PARAM_set_utf8_string(p, osslDigest)) {
9371006
ok = 0;
9381007
}
9391008
}
@@ -1144,7 +1213,7 @@ static int wp_rsa_import_key_data(wp_Rsa* rsa, const OSSL_PARAM params[],
11441213

11451214
/* N and E params are the only ones required by OSSL, so match that.
11461215
* See ossl_rsa_fromdata() and RSA_set0_key() in OpenSSL. */
1147-
if (OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_N) == NULL ||
1216+
if (OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_N) == NULL ||
11481217
OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_E) == NULL) {
11491218
WOLFPROV_MSG(WP_LOG_COMP_RSA, "Param N or E is missing");
11501219
ok = 0;
@@ -1160,7 +1229,7 @@ static int wp_rsa_import_key_data(wp_Rsa* rsa, const OSSL_PARAM params[],
11601229
index = -1;
11611230
for (j = 0; j < (int)ARRAY_SIZE(wp_rsa_param_key); j++) {
11621231
if (XSTRNCMP(p->key, wp_rsa_param_key[j], XSTRLEN(p->key)) == 0) {
1163-
index = j;
1232+
index = j;
11641233
break;
11651234
}
11661235
}
@@ -2375,7 +2444,7 @@ static int wp_rsa_decode_enc_pki(wp_Rsa* rsa, unsigned char* data, word32 len,
23752444
size_t passwordSz = sizeof(password);
23762445

23772446
WOLFPROV_ENTER_SILENT(WP_LOG_COMP_RSA, WOLFPROV_FUNC_NAME);
2378-
2447+
23792448
if (!wolfssl_prov_is_running()) {
23802449
ok = 0;
23812450
}
@@ -2568,7 +2637,7 @@ int wp_rsa_pss_encode_alg_id(const wp_Rsa* rsa, const char* mdName,
25682637
WOLFPROV_ENTER(WP_LOG_COMP_RSA, "wp_rsa_pss_encode_alg_id");
25692638

25702639
if (pssAlgId == NULL) {
2571-
/* Length opf header without optional parts. */
2640+
/* Length of header without optional parts. */
25722641
i = 2 + sizeof(rsa_pss_oid) + 2;
25732642
}
25742643
else {
@@ -2929,6 +2998,14 @@ static int wp_rsa_encode_pki_size(const wp_Rsa* rsa, size_t* keyLen, int algoId)
29292998
if (ok) {
29302999
*keyLen = len;
29313000
}
3001+
if (ok && (rsa->type == RSA_FLAG_TYPE_RSASSAPSS)) {
3002+
word32 pssLen = 0;
3003+
ok = wp_rsa_pss_encode_alg_id(rsa, rsa->pssParams.mdName,
3004+
rsa->pssParams.mgfMdName, rsa->pssParams.saltLen, NULL, &pssLen);
3005+
if (ok) {
3006+
*keyLen += pssLen;
3007+
}
3008+
}
29323009

29333010
WOLFPROV_LEAVE(WP_LOG_COMP_RSA, __FILE__ ":" WOLFPROV_STRINGIZE(__LINE__), ok);
29343011
return ok;
@@ -2982,6 +3059,36 @@ static int wp_rsa_encode_pki(const wp_Rsa* rsa, unsigned char* keyData,
29823059
ok = 0;
29833060
}
29843061
}
3062+
if (ok && rsa->type == RSA_FLAG_TYPE_RSASSAPSS) {
3063+
word32 pssLen = 0;
3064+
word32 i;
3065+
3066+
/* Find where Algorithm ID is by looking for RSA PKCS#1 OID. */
3067+
ok = wp_rsa_find_oid(keyData, ret, rsa_pkcs1_oid, RSA_PKCS1_OID_SZ,
3068+
&i);
3069+
if (ok) {
3070+
i += 11;
3071+
/* Get length of encoded RSA-PSS Algorithm ID. */
3072+
ok = wp_rsa_pss_encode_alg_id(rsa, rsa->pssParams.mdName,
3073+
rsa->pssParams.mgfMdName, rsa->pssParams.saltLen, NULL,
3074+
&pssLen);
3075+
}
3076+
if (ok) {
3077+
/* Move rest of key to after RSA-PSS Algorithm ID. */
3078+
XMEMMOVE(keyData + 7 + pssLen, keyData + i, ret - i);
3079+
/* Encode RSA-PSS Algorithm ID. */
3080+
ok = wp_rsa_pss_encode_alg_id(rsa, rsa->pssParams.mdName,
3081+
rsa->pssParams.mgfMdName, rsa->pssParams.saltLen,
3082+
keyData + 7, &pssLen);
3083+
}
3084+
if (ok) {
3085+
/* Update return length. */
3086+
ret += pssLen - 13;
3087+
/* Update first sequence. */
3088+
keyData[2] = (byte)((ret - 4) >> 8);
3089+
keyData[3] = (byte)((ret - 4) & 0xff);
3090+
}
3091+
}
29853092
if (ok) {
29863093
*keyLen = ret;
29873094
}

0 commit comments

Comments
 (0)