@@ -85,6 +85,7 @@ void rsa_shrink_key(rsa_key *key)
8585int rsa_init (rsa_key * key )
8686{
8787 LTC_ARGCHK (key != NULL );
88+ key -> pss_oaep = 0 ;
8889 XMEMSET (& key -> params , 0 , sizeof (key -> params ));
8990 return ltc_mp_init_multi (& key -> e , & key -> d , & key -> N , & key -> dQ , & key -> dP , & key -> qP , & key -> p , & key -> q , LTC_NULL );
9091}
@@ -97,29 +98,27 @@ void rsa_free(rsa_key *key)
9798{
9899 LTC_ARGCHKVD (key != NULL );
99100 ltc_mp_cleanup_multi (& key -> q , & key -> p , & key -> qP , & key -> dP , & key -> dQ , & key -> N , & key -> d , & key -> e , LTC_NULL );
101+ key -> pss_oaep = 0 ;
100102 XMEMSET (& key -> params , 0 , sizeof (key -> params ));
101103}
102104
103105static LTC_INLINE int s_rsa_key_valid_rsa_params (ltc_rsa_op_checked * check )
104106{
105- const ltc_rsa_parameters * key_params , * op_params ;
107+ const ltc_rsa_parameters * key_params ;
106108 /* This is called from PKCS#1 de-/encoder code, so we can't check the key */
107109 if (check -> key == NULL ) {
108110 return CRYPT_OK ;
109111 }
110112 key_params = & check -> key -> params ;
111- op_params = & check -> params -> params ;
112- /* The key is restricted to PSS, so check the op's params */
113- if (key_params -> pss_oaep
114- && !rsa_params_equal (key_params , op_params )) {
115- return CRYPT_PK_TYPE_MISMATCH ;
116- }
117- /* No PSS or OAEP, so we're fine. */
118- if (!key_params -> pss_oaep
119- || !op_params -> pss_oaep ) {
113+ /* Key has no PSS/OAEP constraints */
114+ if (!check -> key -> pss_oaep ) {
120115 return CRYPT_OK ;
121116 }
122- /* Verify hash algs */
117+ /* Key is constrained - operation must use matching PSS/OAEP params */
118+ if (check -> params -> padding != LTC_PKCS_1_PSS
119+ && check -> params -> padding != LTC_PKCS_1_OAEP ) {
120+ return CRYPT_PK_TYPE_MISMATCH ;
121+ }
123122 if (key_params -> hash_alg == NULL
124123 || find_hash (key_params -> hash_alg ) != check -> hash_alg ) {
125124 return CRYPT_INVALID_HASH ;
@@ -139,7 +138,7 @@ static LTC_INLINE int s_rsa_key_set_hash_algs(ltc_rsa_op_checked *check)
139138 return CRYPT_INVALID_HASH ;
140139 }
141140 if (params -> params .mgf1_hash_alg == NULL ) {
142- if (! params -> params . pss_oaep )
141+ if (params -> padding != LTC_PKCS_1_PSS && params -> padding != LTC_PKCS_1_OAEP )
143142 return CRYPT_OK ;
144143 } else if ((check -> mgf1_hash_alg = find_hash (params -> params .mgf1_hash_alg )) != -1 ) {
145144 return CRYPT_OK ;
@@ -211,8 +210,6 @@ int rsa_key_valid_op(ltc_rsa_op op, ltc_rsa_op_checked *check)
211210 /* PKCS#1 ops don't need an RSA key */
212211 LTC_ARGCHK (check -> key != NULL );
213212 }
214- check -> params -> params .pss_oaep = check -> params -> padding == LTC_PKCS_1_OAEP
215- || check -> params -> padding == LTC_PKCS_1_PSS ;
216213 if ((op & LTC_RSA_OP_SEND ) == LTC_RSA_OP_SEND ) {
217214 if ((err = s_rsa_check_prng (op , check -> params )) != CRYPT_OK ) {
218215 return err ;
@@ -235,10 +232,6 @@ int rsa_key_valid_op(ltc_rsa_op op, ltc_rsa_op_checked *check)
235232
236233int rsa_params_equal (const ltc_rsa_parameters * a , const ltc_rsa_parameters * b )
237234{
238- if (!a -> pss_oaep )
239- return 0 ;
240- if (a -> pss_oaep != b -> pss_oaep )
241- return 0 ;
242235 if (a -> saltlen != b -> saltlen )
243236 return 0 ;
244237 if (!a -> hash_alg || !b -> hash_alg )
0 commit comments