@@ -471,13 +471,14 @@ static const struct pkey_from_data_alias fcc_aliases[] = {
471
471
};
472
472
473
473
struct pkey_from_data_arg {
474
+ VALUE options ;
474
475
OSSL_PARAM_BLD * param_bld ;
475
476
const OSSL_PARAM * settable_params ;
476
477
const struct pkey_from_data_alias * aliases ;
477
478
};
478
479
479
480
static int
480
- add_parameter_to_builder (VALUE key , VALUE value , VALUE arg ) {
481
+ add_data_to_builder (VALUE key , VALUE value , VALUE arg ) {
481
482
if (NIL_P (value ))
482
483
return ST_CONTINUE ;
483
484
@@ -500,55 +501,53 @@ add_parameter_to_builder(VALUE key, VALUE value, VALUE arg) {
500
501
case OSSL_PARAM_INTEGER :
501
502
case OSSL_PARAM_UNSIGNED_INTEGER :
502
503
if (!OSSL_PARAM_BLD_push_BN (params -> param_bld , key_ptr , GetBNPtr (value ))) {
503
- OSSL_PARAM_BLD_free (params -> param_bld );
504
504
ossl_raise (ePKeyError , "OSSL_PARAM_BLD_push_BN" );
505
505
}
506
506
break ;
507
507
case OSSL_PARAM_UTF8_STRING :
508
508
StringValue (value );
509
509
if (!OSSL_PARAM_BLD_push_utf8_string (params -> param_bld , key_ptr , RSTRING_PTR (value ), RSTRING_LENINT (value ))) {
510
- OSSL_PARAM_BLD_free (params -> param_bld );
511
510
ossl_raise (ePKeyError , "OSSL_PARAM_BLD_push_utf8_string" );
512
511
}
513
512
break ;
514
513
515
514
case OSSL_PARAM_OCTET_STRING :
516
515
StringValue (value );
517
516
if (!OSSL_PARAM_BLD_push_octet_string (params -> param_bld , key_ptr , RSTRING_PTR (value ), RSTRING_LENINT (value ))) {
518
- OSSL_PARAM_BLD_free (params -> param_bld );
519
517
ossl_raise (ePKeyError , "OSSL_PARAM_BLD_push_octet_string" );
520
518
}
521
519
break ;
522
520
case OSSL_PARAM_UTF8_PTR :
523
521
case OSSL_PARAM_OCTET_PTR :
524
- OSSL_PARAM_BLD_free (params -> param_bld );
525
522
ossl_raise (ePKeyError , "Unsupported parameter \"%s\", handling of OSSL_PARAM_UTF8_PTR and OSSL_PARAM_OCTET_PTR not implemented" , key_ptr );
526
523
break ;
527
524
}
528
525
529
526
return ST_CONTINUE ;
530
527
}
531
528
}
532
- OSSL_PARAM_BLD_free (params -> param_bld );
533
529
534
- char message_buffer [512 ] = { 0 };
535
- char * cur = message_buffer ;
536
- char * end = message_buffer + sizeof (message_buffer );
530
+ VALUE supported_parameters = rb_ary_new ();
531
+
537
532
for (const OSSL_PARAM * settable_params = params -> settable_params ; settable_params -> key != NULL ; settable_params ++ ) {
538
- const char * fmt = cur == message_buffer ? "%s" : ", %s" ;
539
- if (cur > end )
540
- break ;
541
- cur += snprintf (cur , end - cur , fmt , settable_params -> key );
533
+ rb_ary_push (supported_parameters , rb_str_new_cstr (settable_params -> key ));
542
534
}
543
535
544
536
for (int i = 0 ; strlen (params -> aliases [i ].alias ) > 0 ; i ++ ) {
545
- const char * fmt = cur == message_buffer ? "%s" : ", %s" ;
546
- if (cur > end )
547
- break ;
548
- cur += snprintf (cur , end - cur , fmt , params -> aliases [i ].alias );
537
+ rb_ary_push (supported_parameters , rb_str_new_cstr (params -> aliases [i ].alias ));
549
538
}
550
539
551
- ossl_raise (ePKeyError , "Invalid parameter \"%s\". Supported parameters: \"%s\"" , key_ptr , message_buffer );
540
+ ossl_raise (ePKeyError , "Invalid parameter \"%s\". Supported parameters: %" PRIsVALUE , key_ptr , rb_ary_join (supported_parameters , rb_str_new2 (", " )));
541
+ }
542
+
543
+ static VALUE
544
+ add_data_to_builder_protected (VALUE value )
545
+ {
546
+ struct pkey_from_data_arg * args = (void * )value ;
547
+
548
+ rb_hash_foreach (args -> options , & add_data_to_builder , (VALUE ) args );
549
+
550
+ return Qnil ;
552
551
}
553
552
554
553
static VALUE
@@ -567,6 +566,7 @@ pkey_from_data(int argc, VALUE *argv, VALUE self)
567
566
struct pkey_from_data_arg from_data_args = { 0 };
568
567
569
568
from_data_args .param_bld = OSSL_PARAM_BLD_new ();
569
+ from_data_args .options = options ;
570
570
571
571
if (from_data_args .param_bld == NULL ) {
572
572
EVP_PKEY_CTX_free (ctx );
@@ -577,6 +577,7 @@ pkey_from_data(int argc, VALUE *argv, VALUE self)
577
577
578
578
if (from_data_args .settable_params == NULL ) {
579
579
EVP_PKEY_CTX_free (ctx );
580
+ OSSL_PARAM_BLD_free (from_data_args .param_bld );
580
581
ossl_raise (ePKeyError , "EVP_PKEY_fromdata_settable" );
581
582
}
582
583
@@ -585,7 +586,14 @@ pkey_from_data(int argc, VALUE *argv, VALUE self)
585
586
else
586
587
from_data_args .aliases = fcc_aliases ;
587
588
588
- rb_hash_foreach (options , & add_parameter_to_builder , (VALUE ) & from_data_args );
589
+ int state ;
590
+ rb_protect (add_data_to_builder_protected , (VALUE ) & from_data_args , & state );
591
+
592
+ if (state ) {
593
+ EVP_PKEY_CTX_free (ctx );
594
+ OSSL_PARAM_BLD_free (from_data_args .param_bld );
595
+ rb_jump_tag (state );
596
+ }
589
597
590
598
OSSL_PARAM * params = OSSL_PARAM_BLD_to_param (from_data_args .param_bld );
591
599
OSSL_PARAM_BLD_free (from_data_args .param_bld );
@@ -612,6 +620,7 @@ pkey_from_data(int argc, VALUE *argv, VALUE self)
612
620
613
621
return ossl_pkey_new (pkey );
614
622
}
623
+
615
624
#endif
616
625
617
626
/*
@@ -686,11 +695,11 @@ ossl_pkey_s_generate_key(int argc, VALUE *argv, VALUE self)
686
695
static VALUE
687
696
ossl_pkey_s_from_data (int argc , VALUE * argv , VALUE self )
688
697
{
689
- #if OSSL_OPENSSL_PREREQ (3 , 0 , 0 )
698
+ #if OSSL_OPENSSL_PREREQ (3 , 0 , 0 )
690
699
return pkey_from_data (argc , argv , self );
691
- #else
700
+ #else
692
701
rb_raise (ePKeyError , "OpenSSL::PKey.from_data requires OpenSSL 3.0 or later" );
693
- #endif
702
+ #endif
694
703
}
695
704
696
705
/*
0 commit comments