@@ -635,6 +635,29 @@ ossl_pkey_initialize_copy(VALUE self, VALUE other)
635
635
}
636
636
#endif
637
637
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
+
638
661
/*
639
662
* call-seq:
640
663
* OpenSSL::PKey.new_raw_private_key(algo, string) -> PKey
@@ -646,22 +669,23 @@ static VALUE
646
669
ossl_pkey_new_raw_private_key (VALUE self , VALUE type , VALUE key )
647
670
{
648
671
EVP_PKEY * pkey ;
649
- const EVP_PKEY_ASN1_METHOD * ameth ;
650
- int pkey_id ;
651
672
size_t keylen ;
652
673
653
- StringValue (type );
654
674
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
-
660
675
keylen = RSTRING_LEN (key );
661
676
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 );
662
685
pkey = EVP_PKEY_new_raw_private_key (pkey_id , NULL , (unsigned char * )RSTRING_PTR (key ), keylen );
663
686
if (!pkey )
664
687
ossl_raise (ePKeyError , "EVP_PKEY_new_raw_private_key" );
688
+ #endif
665
689
666
690
return ossl_pkey_new (pkey );
667
691
}
@@ -677,22 +701,23 @@ static VALUE
677
701
ossl_pkey_new_raw_public_key (VALUE self , VALUE type , VALUE key )
678
702
{
679
703
EVP_PKEY * pkey ;
680
- const EVP_PKEY_ASN1_METHOD * ameth ;
681
- int pkey_id ;
682
704
size_t keylen ;
683
705
684
- StringValue (type );
685
706
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
-
691
707
keylen = RSTRING_LEN (key );
692
708
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 );
693
717
pkey = EVP_PKEY_new_raw_public_key (pkey_id , NULL , (unsigned char * )RSTRING_PTR (key ), keylen );
694
718
if (!pkey )
695
719
ossl_raise (ePKeyError , "EVP_PKEY_new_raw_public_key" );
720
+ #endif
696
721
697
722
return ossl_pkey_new (pkey );
698
723
}
@@ -711,6 +736,10 @@ ossl_pkey_oid(VALUE self)
711
736
712
737
GetPKey (self , pkey );
713
738
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
714
743
return rb_str_new_cstr (OBJ_nid2sn (nid ));
715
744
}
716
745
@@ -724,13 +753,23 @@ static VALUE
724
753
ossl_pkey_inspect (VALUE self )
725
754
{
726
755
EVP_PKEY * pkey ;
727
- int nid ;
728
756
729
757
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 ;
734
773
}
735
774
736
775
/*
0 commit comments