@@ -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 )
@@ -119,7 +119,7 @@ ossl_pkey_read_generic(BIO *bio, VALUE pass)
119119}
120120#else
121121EVP_PKEY *
122- ossl_pkey_read_generic (BIO * bio , VALUE pass )
122+ ossl_pkey_read_generic (BIO * bio , VALUE pass , const char * input_type )
123123{
124124 void * ppass = (void * )pass ;
125125 EVP_PKEY * pkey ;
@@ -144,6 +144,31 @@ ossl_pkey_read_generic(BIO *bio, VALUE pass)
144144 goto out ;
145145
146146 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+ }
147172 return pkey ;
148173}
149174#endif
@@ -173,7 +198,7 @@ ossl_pkey_new_from_data(int argc, VALUE *argv, VALUE self)
173198
174199 rb_scan_args (argc , argv , "11" , & data , & pass );
175200 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 );
177202 BIO_free (bio );
178203 if (!pkey )
179204 ossl_raise (ePKeyError , "Could not parse PKey" );
0 commit comments