@@ -83,14 +83,14 @@ ossl_pkey_new(EVP_PKEY *pkey)
8383# include <openssl/decoder.h>
8484
8585EVP_PKEY *
86- ossl_pkey_read_generic (BIO * bio , VALUE pass )
86+ ossl_pkey_read_generic (BIO * bio , VALUE pass , const char * input_type )
8787{
8888 void * ppass = (void * )pass ;
8989 OSSL_DECODER_CTX * dctx ;
9090 EVP_PKEY * pkey = NULL ;
9191 int pos = 0 , pos2 ;
9292
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 );
9494 if (!dctx )
9595 goto out ;
9696 if (OSSL_DECODER_CTX_set_pem_password_cb (dctx , ossl_pem_passwd_cb , ppass ) != 1 )
@@ -158,7 +158,7 @@ ossl_pkey_read_generic(BIO *bio, VALUE pass)
158158}
159159#else
160160EVP_PKEY *
161- ossl_pkey_read_generic (BIO * bio , VALUE pass )
161+ ossl_pkey_read_generic (BIO * bio , VALUE pass , const char * input_type )
162162{
163163 void * ppass = (void * )pass ;
164164 EVP_PKEY * pkey ;
@@ -183,6 +183,31 @@ ossl_pkey_read_generic(BIO *bio, VALUE pass)
183183 goto out ;
184184
185185 out :
186+ /* This is to mimic OSSL_DECODER_CTX's input_type parameter */
187+ if (pkey && input_type ) {
188+ switch (EVP_PKEY_base_id (pkey )) {
189+ case EVP_PKEY_RSA :
190+ if (!strcmp (input_type , "RSA" ))
191+ return pkey ;
192+ break ;
193+ case EVP_PKEY_DSA :
194+ if (!strcmp (input_type , "DSA" ))
195+ return pkey ;
196+ break ;
197+ case EVP_PKEY_DH :
198+ if (!strcmp (input_type , "DH" ))
199+ return pkey ;
200+ break ;
201+ #if !defined(OPENSSL_NO_EC )
202+ case EVP_PKEY_EC :
203+ if (!strcmp (input_type , "EC" ))
204+ return pkey ;
205+ break ;
206+ #endif
207+ }
208+ EVP_PKEY_free (pkey );
209+ return NULL ;
210+ }
186211 return pkey ;
187212}
188213#endif
@@ -212,7 +237,7 @@ ossl_pkey_new_from_data(int argc, VALUE *argv, VALUE self)
212237
213238 rb_scan_args (argc , argv , "11" , & data , & pass );
214239 bio = ossl_obj2bio (& data );
215- pkey = ossl_pkey_read_generic (bio , ossl_pem_passwd_value (pass ));
240+ pkey = ossl_pkey_read_generic (bio , ossl_pem_passwd_value (pass ), NULL );
216241 BIO_free (bio );
217242 if (!pkey )
218243 ossl_raise (ePKeyError , "Could not parse PKey" );
0 commit comments