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