@@ -635,6 +635,29 @@ ossl_pkey_initialize_copy(VALUE self, VALUE other)
635635}
636636#endif
637637
638+ #ifndef OSSL_USE_PROVIDER
639+ static int
640+ lookup_pkey_type (VALUE type )
641+ {
642+ const EVP_PKEY_ASN1_METHOD * ameth ;
643+ int pkey_id ;
644+
645+ StringValue (type );
646+ /*
647+ * XXX: EVP_PKEY_asn1_find_str() looks up a PEM type string. Should we use
648+ * OBJ_txt2nid() instead (and then somehow check if the NID is an acceptable
649+ * EVP_PKEY type)?
650+ * It is probably fine, though, since it can handle all algorithms that
651+ * support raw keys in 1.1.1: { X25519, X448, ED25519, ED448, HMAC }.
652+ */
653+ ameth = EVP_PKEY_asn1_find_str (NULL , RSTRING_PTR (type ), RSTRING_LENINT (type ));
654+ if (!ameth )
655+ ossl_raise (ePKeyError , "algorithm %" PRIsVALUE " not found" , type );
656+ EVP_PKEY_asn1_get0_info (& pkey_id , NULL , NULL , NULL , NULL , ameth );
657+ return pkey_id ;
658+ }
659+ #endif
660+
638661/*
639662 * call-seq:
640663 * OpenSSL::PKey.new_raw_private_key(algo, string) -> PKey
@@ -646,22 +669,23 @@ static VALUE
646669ossl_pkey_new_raw_private_key (VALUE self , VALUE type , VALUE key )
647670{
648671 EVP_PKEY * pkey ;
649- const EVP_PKEY_ASN1_METHOD * ameth ;
650- int pkey_id ;
651672 size_t keylen ;
652673
653- StringValue (type );
654674 StringValue (key );
655- ameth = EVP_PKEY_asn1_find_str (NULL , RSTRING_PTR (type ), RSTRING_LENINT (type ));
656- if (!ameth )
657- ossl_raise (ePKeyError , "algorithm %" PRIsVALUE " not found" , type );
658- EVP_PKEY_asn1_get0_info (& pkey_id , NULL , NULL , NULL , NULL , ameth );
659-
660675 keylen = RSTRING_LEN (key );
661676
677+ #ifdef OSSL_USE_PROVIDER
678+ pkey = EVP_PKEY_new_raw_private_key_ex (NULL , StringValueCStr (type ), NULL ,
679+ (unsigned char * )RSTRING_PTR (key ),
680+ keylen );
681+ if (!pkey )
682+ ossl_raise (ePKeyError , "EVP_PKEY_new_raw_private_key_ex" );
683+ #else
684+ int pkey_id = lookup_pkey_type (type );
662685 pkey = EVP_PKEY_new_raw_private_key (pkey_id , NULL , (unsigned char * )RSTRING_PTR (key ), keylen );
663686 if (!pkey )
664687 ossl_raise (ePKeyError , "EVP_PKEY_new_raw_private_key" );
688+ #endif
665689
666690 return ossl_pkey_new (pkey );
667691}
@@ -677,22 +701,23 @@ static VALUE
677701ossl_pkey_new_raw_public_key (VALUE self , VALUE type , VALUE key )
678702{
679703 EVP_PKEY * pkey ;
680- const EVP_PKEY_ASN1_METHOD * ameth ;
681- int pkey_id ;
682704 size_t keylen ;
683705
684- StringValue (type );
685706 StringValue (key );
686- ameth = EVP_PKEY_asn1_find_str (NULL , RSTRING_PTR (type ), RSTRING_LENINT (type ));
687- if (!ameth )
688- ossl_raise (ePKeyError , "algorithm %" PRIsVALUE " not found" , type );
689- EVP_PKEY_asn1_get0_info (& pkey_id , NULL , NULL , NULL , NULL , ameth );
690-
691707 keylen = RSTRING_LEN (key );
692708
709+ #ifdef OSSL_USE_PROVIDER
710+ pkey = EVP_PKEY_new_raw_public_key_ex (NULL , StringValueCStr (type ), NULL ,
711+ (unsigned char * )RSTRING_PTR (key ),
712+ keylen );
713+ if (!pkey )
714+ ossl_raise (ePKeyError , "EVP_PKEY_new_raw_public_key_ex" );
715+ #else
716+ int pkey_id = lookup_pkey_type (type );
693717 pkey = EVP_PKEY_new_raw_public_key (pkey_id , NULL , (unsigned char * )RSTRING_PTR (key ), keylen );
694718 if (!pkey )
695719 ossl_raise (ePKeyError , "EVP_PKEY_new_raw_public_key" );
720+ #endif
696721
697722 return ossl_pkey_new (pkey );
698723}
@@ -711,6 +736,10 @@ ossl_pkey_oid(VALUE self)
711736
712737 GetPKey (self , pkey );
713738 nid = EVP_PKEY_id (pkey );
739+ #ifdef OSSL_USE_PROVIDER
740+ if (nid == EVP_PKEY_KEYMGMT )
741+ ossl_raise (ePKeyError , "EVP_PKEY_id" );
742+ #endif
714743 return rb_str_new_cstr (OBJ_nid2sn (nid ));
715744}
716745
@@ -724,13 +753,23 @@ static VALUE
724753ossl_pkey_inspect (VALUE self )
725754{
726755 EVP_PKEY * pkey ;
727- int nid ;
728756
729757 GetPKey (self , pkey );
730- nid = EVP_PKEY_id (pkey );
731- return rb_sprintf ("#<%" PRIsVALUE ":%p oid=%s>" ,
732- rb_class_name (CLASS_OF (self )), (void * )self ,
733- OBJ_nid2sn (nid ));
758+ VALUE str = rb_sprintf ("#<%" PRIsVALUE ":%p" ,
759+ rb_obj_class (self ), (void * )self );
760+ int nid = EVP_PKEY_id (pkey );
761+ #ifdef OSSL_USE_PROVIDER
762+ if (nid != EVP_PKEY_KEYMGMT )
763+ #endif
764+ rb_str_catf (str , " oid=%s" , OBJ_nid2sn (nid ));
765+ #ifdef OSSL_USE_PROVIDER
766+ rb_str_catf (str , " type_name=%s" , EVP_PKEY_get0_type_name (pkey ));
767+ const OSSL_PROVIDER * prov = EVP_PKEY_get0_provider (pkey );
768+ if (prov )
769+ rb_str_catf (str , " provider=%s" , OSSL_PROVIDER_get0_name (prov ));
770+ #endif
771+ rb_str_catf (str , ">" );
772+ return str ;
734773}
735774
736775/*
0 commit comments