@@ -83,14 +83,14 @@ ossl_pkey_new(EVP_PKEY *pkey)
83
83
# include <openssl/decoder.h>
84
84
85
85
EVP_PKEY *
86
- ossl_pkey_read_generic (BIO * bio , VALUE pass )
86
+ ossl_pkey_read_generic (BIO * bio , VALUE pass , const char * input_type )
87
87
{
88
88
void * ppass = (void * )pass ;
89
89
OSSL_DECODER_CTX * dctx ;
90
90
EVP_PKEY * pkey = NULL ;
91
91
int pos = 0 , pos2 ;
92
92
93
- dctx = OSSL_DECODER_CTX_new_for_pkey (& pkey , "DER" , NULL , NULL , 0 , NULL , NULL );
93
+ dctx = OSSL_DECODER_CTX_new_for_pkey (& pkey , "DER" , NULL , input_type , 0 , NULL , NULL );
94
94
if (!dctx )
95
95
goto out ;
96
96
if (OSSL_DECODER_CTX_set_pem_password_cb (dctx , ossl_pem_passwd_cb , ppass ) != 1 )
@@ -119,7 +119,7 @@ ossl_pkey_read_generic(BIO *bio, VALUE pass)
119
119
}
120
120
#else
121
121
EVP_PKEY *
122
- ossl_pkey_read_generic (BIO * bio , VALUE pass )
122
+ ossl_pkey_read_generic (BIO * bio , VALUE pass , const char * input_type )
123
123
{
124
124
void * ppass = (void * )pass ;
125
125
EVP_PKEY * pkey ;
@@ -144,6 +144,31 @@ ossl_pkey_read_generic(BIO *bio, VALUE pass)
144
144
goto out ;
145
145
146
146
out :
147
+ /* This is to mimic OSSL_DECODER_CTX's input_type parameter */
148
+ if (pkey && input_type ) {
149
+ switch (EVP_PKEY_base_id (pkey )) {
150
+ case EVP_PKEY_RSA :
151
+ if (!strcmp (input_type , "RSA" ))
152
+ return pkey ;
153
+ break ;
154
+ case EVP_PKEY_DSA :
155
+ if (!strcmp (input_type , "DSA" ))
156
+ return pkey ;
157
+ break ;
158
+ case EVP_PKEY_DH :
159
+ if (!strcmp (input_type , "DH" ))
160
+ return pkey ;
161
+ break ;
162
+ #if !defined(OPENSSL_NO_EC )
163
+ case EVP_PKEY_EC :
164
+ if (!strcmp (input_type , "EC" ))
165
+ return pkey ;
166
+ break ;
167
+ #endif
168
+ }
169
+ EVP_PKEY_free (pkey );
170
+ return NULL ;
171
+ }
147
172
return pkey ;
148
173
}
149
174
#endif
@@ -173,7 +198,7 @@ ossl_pkey_new_from_data(int argc, VALUE *argv, VALUE self)
173
198
174
199
rb_scan_args (argc , argv , "11" , & data , & pass );
175
200
bio = ossl_obj2bio (& data );
176
- pkey = ossl_pkey_read_generic (bio , ossl_pem_passwd_value (pass ));
201
+ pkey = ossl_pkey_read_generic (bio , ossl_pem_passwd_value (pass ), NULL );
177
202
BIO_free (bio );
178
203
if (!pkey )
179
204
ossl_raise (ePKeyError , "Could not parse PKey" );
0 commit comments