@@ -455,7 +455,7 @@ add_ec_parameters_to_builder(VALUE key, VALUE value, VALUE arg) {
455455
456456 if (strcmp (OSSL_PKEY_PARAM_PRIV_KEY , key_ptr ) == 0 ) {
457457 if (!OSSL_PARAM_BLD_push_BN (params_builder , OSSL_PKEY_PARAM_PRIV_KEY , GetBNPtr (value ))) // unsigned integer, but presented as BN will work just fine
458- ossl_raise (ePKeyError , "OSSL_PARAM_BLD_push_octet_string " );
458+ ossl_raise (ePKeyError , "OSSL_PARAM_BLD_push_BN " );
459459 return ST_CONTINUE ;
460460 }
461461
@@ -492,44 +492,98 @@ add_rsa_parameters_to_builder(VALUE key, VALUE value, VALUE arg) {
492492 }
493493 }
494494
495- if ((strcmp (OSSL_PKEY_PARAM_RSA_N , key_ptr ) != 0 &&
496- strcmp (OSSL_PKEY_PARAM_RSA_E , key_ptr ) != 0 &&
497- strcmp (OSSL_PKEY_PARAM_RSA_D , key_ptr ) != 0 &&
498- strcmp (OSSL_PKEY_PARAM_RSA_FACTOR1 , key_ptr ) != 0 &&
499- strcmp (OSSL_PKEY_PARAM_RSA_FACTOR2 , key_ptr ) != 0 &&
500- strcmp (OSSL_PKEY_PARAM_RSA_FACTOR3 , key_ptr ) != 0 &&
501- strcmp (OSSL_PKEY_PARAM_RSA_FACTOR4 , key_ptr ) != 0 &&
502- strcmp (OSSL_PKEY_PARAM_RSA_FACTOR5 , key_ptr ) != 0 &&
503- strcmp (OSSL_PKEY_PARAM_RSA_FACTOR6 , key_ptr ) != 0 &&
504- strcmp (OSSL_PKEY_PARAM_RSA_FACTOR7 , key_ptr ) != 0 &&
505- strcmp (OSSL_PKEY_PARAM_RSA_FACTOR8 , key_ptr ) != 0 &&
506- strcmp (OSSL_PKEY_PARAM_RSA_FACTOR9 , key_ptr ) != 0 &&
507- strcmp (OSSL_PKEY_PARAM_RSA_FACTOR10 , key_ptr ) != 0 &&
508- strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT1 , key_ptr ) != 0 &&
509- strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT2 , key_ptr ) != 0 &&
510- strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT3 , key_ptr ) != 0 &&
511- strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT4 , key_ptr ) != 0 &&
512- strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT5 , key_ptr ) != 0 &&
513- strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT6 , key_ptr ) != 0 &&
514- strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT7 , key_ptr ) != 0 &&
515- strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT8 , key_ptr ) != 0 &&
516- strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT9 , key_ptr ) != 0 &&
517- strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT10 , key_ptr ) != 0 &&
518- strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT1 , key_ptr ) != 0 &&
519- strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT2 , key_ptr ) != 0 &&
520- strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT3 , key_ptr ) != 0 &&
521- strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT4 , key_ptr ) != 0 &&
522- strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT5 , key_ptr ) != 0 &&
523- strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT6 , key_ptr ) != 0 &&
524- strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT7 , key_ptr ) != 0 &&
525- strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT8 , key_ptr ) != 0 &&
526- strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT9 , key_ptr )) != 0 )
527- ossl_raise (ePKeyError , "Unsupported RSA parameter \"%s\"" , key_ptr );
528-
529- if (!OSSL_PARAM_BLD_push_BN (params_builder , key_ptr , GetBNPtr (value )))
530- ossl_raise (ePKeyError , "OSSL_PARAM_BLD_push_BN" );
531-
532- return ST_CONTINUE ;
495+ if (strcmp (OSSL_PKEY_PARAM_RSA_N , key_ptr ) == 0 ||
496+ strcmp (OSSL_PKEY_PARAM_RSA_E , key_ptr ) == 0 ||
497+ strcmp (OSSL_PKEY_PARAM_RSA_D , key_ptr ) == 0 ||
498+ strcmp (OSSL_PKEY_PARAM_RSA_FACTOR1 , key_ptr ) == 0 ||
499+ strcmp (OSSL_PKEY_PARAM_RSA_FACTOR2 , key_ptr ) == 0 ||
500+ strcmp (OSSL_PKEY_PARAM_RSA_FACTOR3 , key_ptr ) == 0 ||
501+ strcmp (OSSL_PKEY_PARAM_RSA_FACTOR4 , key_ptr ) == 0 ||
502+ strcmp (OSSL_PKEY_PARAM_RSA_FACTOR5 , key_ptr ) == 0 ||
503+ strcmp (OSSL_PKEY_PARAM_RSA_FACTOR6 , key_ptr ) == 0 ||
504+ strcmp (OSSL_PKEY_PARAM_RSA_FACTOR7 , key_ptr ) == 0 ||
505+ strcmp (OSSL_PKEY_PARAM_RSA_FACTOR8 , key_ptr ) == 0 ||
506+ strcmp (OSSL_PKEY_PARAM_RSA_FACTOR9 , key_ptr ) == 0 ||
507+ strcmp (OSSL_PKEY_PARAM_RSA_FACTOR10 , key_ptr ) == 0 ||
508+ strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT1 , key_ptr ) == 0 ||
509+ strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT2 , key_ptr ) == 0 ||
510+ strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT3 , key_ptr ) == 0 ||
511+ strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT4 , key_ptr ) == 0 ||
512+ strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT5 , key_ptr ) == 0 ||
513+ strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT6 , key_ptr ) == 0 ||
514+ strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT7 , key_ptr ) == 0 ||
515+ strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT8 , key_ptr ) == 0 ||
516+ strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT9 , key_ptr ) == 0 ||
517+ strcmp (OSSL_PKEY_PARAM_RSA_EXPONENT10 , key_ptr ) == 0 ||
518+ strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT1 , key_ptr ) == 0 ||
519+ strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT2 , key_ptr ) == 0 ||
520+ strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT3 , key_ptr ) == 0 ||
521+ strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT4 , key_ptr ) == 0 ||
522+ strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT5 , key_ptr ) == 0 ||
523+ strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT6 , key_ptr ) == 0 ||
524+ strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT7 , key_ptr ) == 0 ||
525+ strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT8 , key_ptr ) == 0 ||
526+ strcmp (OSSL_PKEY_PARAM_RSA_COEFFICIENT9 , key_ptr ) == 0 ) {
527+ if (!OSSL_PARAM_BLD_push_BN (params_builder , key_ptr , GetBNPtr (value )))
528+ ossl_raise (ePKeyError , "OSSL_PARAM_BLD_push_BN" );
529+ return ST_CONTINUE ;
530+ }
531+
532+ ossl_raise (ePKeyError , "Unsupported RSA parameter \"%s\"" , key_ptr );
533+ }
534+
535+ static int
536+ add_dsa_parameters_to_builder (VALUE key , VALUE value , VALUE arg ) {
537+ OSSL_PARAM_BLD * params_builder = (OSSL_PARAM_BLD * ) arg ;
538+
539+ if (NIL_P (value ))
540+ return ST_CONTINUE ;
541+
542+ if (SYMBOL_P (key ))
543+ key = rb_sym2str (key );
544+
545+ static const struct {
546+ char alias [10 ];
547+ char param_name [20 ];
548+ } key_aliases [] = {
549+ { "pub_key" , OSSL_PKEY_PARAM_PUB_KEY },
550+ { "priv_key" , OSSL_PKEY_PARAM_PRIV_KEY }
551+ };
552+
553+ const char * key_ptr = StringValueCStr (key );
554+
555+ for (int i = 0 ; i < (int )(sizeof (key_aliases )/sizeof ((key_aliases )[0 ])); i ++ ) {
556+ if (strcmp (key_aliases [i ].alias , key_ptr ) == 0 ) {
557+ key_ptr = key_aliases [i ].param_name ;
558+ break ;
559+ }
560+ }
561+
562+ if (strcmp (OSSL_PKEY_PARAM_PUB_KEY , key_ptr ) == 0 ||
563+ strcmp (OSSL_PKEY_PARAM_PRIV_KEY , key_ptr ) == 0 ||
564+ strcmp (OSSL_PKEY_PARAM_FFC_P , key_ptr ) == 0 ||
565+ strcmp (OSSL_PKEY_PARAM_FFC_G , key_ptr ) == 0 ||
566+ strcmp (OSSL_PKEY_PARAM_FFC_Q , key_ptr ) == 0 ||
567+ strcmp (OSSL_PKEY_PARAM_FFC_GINDEX , key_ptr ) == 0 ||
568+ strcmp (OSSL_PKEY_PARAM_FFC_PCOUNTER , key_ptr ) == 0 ||
569+ strcmp (OSSL_PKEY_PARAM_FFC_H , key_ptr ) == 0 ||
570+ strcmp (OSSL_PKEY_PARAM_FFC_COFACTOR , key_ptr ) == 0 ||
571+ strcmp (OSSL_PKEY_PARAM_FFC_VALIDATE_PQ , key_ptr ) == 0 ||
572+ strcmp (OSSL_PKEY_PARAM_FFC_VALIDATE_G , key_ptr ) == 0 ||
573+ strcmp (OSSL_PKEY_PARAM_FFC_VALIDATE_LEGACY , key_ptr ) == 0 ) {
574+ if (!OSSL_PARAM_BLD_push_BN (params_builder , key_ptr , GetBNPtr (value )))
575+ ossl_raise (ePKeyError , "OSSL_PARAM_BLD_push_BN" );
576+ return ST_CONTINUE ;
577+ }
578+
579+ if (strcmp (OSSL_PKEY_PARAM_FFC_SEED , key_ptr ) == 0 ) {
580+ StringValue (value );
581+ if (!OSSL_PARAM_BLD_push_octet_string (params_builder , key_ptr , RSTRING_PTR (value ), RSTRING_LENINT (value )))
582+ ossl_raise (ePKeyError , "OSSL_PARAM_BLD_push_octet_string" );
583+ return ST_CONTINUE ;
584+ }
585+
586+ ossl_raise (ePKeyError , "Unsupported DSA parameter \"%s\"" , key_ptr );
533587}
534588
535589static VALUE
@@ -549,6 +603,8 @@ pkey_from_parameters(int argc, VALUE *argv, VALUE self)
549603 param_adder = & add_rsa_parameters_to_builder ;
550604 else if (strcmp ("EC" , StringValueCStr (alg )) == 0 )
551605 param_adder = & add_ec_parameters_to_builder ;
606+ else if (strcmp ("DSA" , StringValueCStr (alg )) == 0 )
607+ param_adder = & add_dsa_parameters_to_builder ;
552608 else
553609 ossl_raise (ePKeyError , "\"%s\" is not a supported algorithm" , StringValueCStr (alg ));
554610
0 commit comments