@@ -101,19 +101,24 @@ static const rb_data_type_t ossl_pkcs7_recip_info_type = {
101
101
* (MADE PRIVATE UNTIL SOMEBODY WILL NEED THEM)
102
102
*/
103
103
static PKCS7_SIGNER_INFO *
104
- ossl_PKCS7_SIGNER_INFO_dup (const PKCS7_SIGNER_INFO * si )
104
+ ossl_PKCS7_SIGNER_INFO_dup (PKCS7_SIGNER_INFO * si )
105
105
{
106
- return (PKCS7_SIGNER_INFO * )ASN1_dup ((i2d_of_void * )i2d_PKCS7_SIGNER_INFO ,
107
- (d2i_of_void * )d2i_PKCS7_SIGNER_INFO ,
108
- (char * )si );
106
+ PKCS7_SIGNER_INFO * si_new = ASN1_dup ((i2d_of_void * )i2d_PKCS7_SIGNER_INFO ,
107
+ (d2i_of_void * )d2i_PKCS7_SIGNER_INFO ,
108
+ si );
109
+ if (si_new && si -> pkey ) {
110
+ EVP_PKEY_up_ref (si -> pkey );
111
+ si_new -> pkey = si -> pkey ;
112
+ }
113
+ return si_new ;
109
114
}
110
115
111
116
static PKCS7_RECIP_INFO *
112
- ossl_PKCS7_RECIP_INFO_dup (const PKCS7_RECIP_INFO * si )
117
+ ossl_PKCS7_RECIP_INFO_dup (PKCS7_RECIP_INFO * si )
113
118
{
114
- return ( PKCS7_RECIP_INFO * ) ASN1_dup ((i2d_of_void * )i2d_PKCS7_RECIP_INFO ,
115
- (d2i_of_void * )d2i_PKCS7_RECIP_INFO ,
116
- ( char * ) si );
119
+ return ASN1_dup ((i2d_of_void * )i2d_PKCS7_RECIP_INFO ,
120
+ (d2i_of_void * )d2i_PKCS7_RECIP_INFO ,
121
+ si );
117
122
}
118
123
119
124
static VALUE
@@ -130,19 +135,6 @@ ossl_pkcs7si_new(PKCS7_SIGNER_INFO *p7si)
130
135
return obj ;
131
136
}
132
137
133
- static PKCS7_SIGNER_INFO *
134
- DupPKCS7SignerPtr (VALUE obj )
135
- {
136
- PKCS7_SIGNER_INFO * p7si , * pkcs7 ;
137
-
138
- GetPKCS7si (obj , p7si );
139
- if (!(pkcs7 = ossl_PKCS7_SIGNER_INFO_dup (p7si ))) {
140
- ossl_raise (ePKCS7Error , NULL );
141
- }
142
-
143
- return pkcs7 ;
144
- }
145
-
146
138
static VALUE
147
139
ossl_pkcs7ri_new (PKCS7_RECIP_INFO * p7ri )
148
140
{
@@ -157,19 +149,6 @@ ossl_pkcs7ri_new(PKCS7_RECIP_INFO *p7ri)
157
149
return obj ;
158
150
}
159
151
160
- static PKCS7_RECIP_INFO *
161
- DupPKCS7RecipientPtr (VALUE obj )
162
- {
163
- PKCS7_RECIP_INFO * p7ri , * pkcs7 ;
164
-
165
- GetPKCS7ri (obj , p7ri );
166
- if (!(pkcs7 = ossl_PKCS7_RECIP_INFO_dup (p7ri ))) {
167
- ossl_raise (ePKCS7Error , NULL );
168
- }
169
-
170
- return pkcs7 ;
171
- }
172
-
173
152
/*
174
153
* call-seq:
175
154
* PKCS7.read_smime(string) => pkcs7
@@ -521,17 +500,18 @@ static VALUE
521
500
ossl_pkcs7_add_signer (VALUE self , VALUE signer )
522
501
{
523
502
PKCS7 * pkcs7 ;
524
- PKCS7_SIGNER_INFO * p7si ;
503
+ PKCS7_SIGNER_INFO * si , * si_new ;
525
504
526
- p7si = DupPKCS7SignerPtr (signer ); /* NEED TO DUP */
527
505
GetPKCS7 (self , pkcs7 );
528
- if (!PKCS7_add_signer (pkcs7 , p7si )) {
529
- PKCS7_SIGNER_INFO_free (p7si );
530
- ossl_raise (ePKCS7Error , "Could not add signer." );
531
- }
532
- if (PKCS7_type_is_signed (pkcs7 )){
533
- PKCS7_add_signed_attribute (p7si , NID_pkcs9_contentType ,
534
- V_ASN1_OBJECT , OBJ_nid2obj (NID_pkcs7_data ));
506
+ GetPKCS7si (signer , si );
507
+
508
+ si_new = ossl_PKCS7_SIGNER_INFO_dup (si );
509
+ if (!si_new )
510
+ ossl_raise (ePKCS7Error , "PKCS7_SIGNER_INFO_dup" );
511
+
512
+ if (PKCS7_add_signer (pkcs7 , si_new ) != 1 ) {
513
+ PKCS7_SIGNER_INFO_free (si_new );
514
+ ossl_raise (ePKCS7Error , "PKCS7_add_signer" );
535
515
}
536
516
537
517
return self ;
@@ -567,13 +547,18 @@ static VALUE
567
547
ossl_pkcs7_add_recipient (VALUE self , VALUE recip )
568
548
{
569
549
PKCS7 * pkcs7 ;
570
- PKCS7_RECIP_INFO * ri ;
550
+ PKCS7_RECIP_INFO * ri , * ri_new ;
571
551
572
- ri = DupPKCS7RecipientPtr (recip ); /* NEED TO DUP */
573
552
GetPKCS7 (self , pkcs7 );
574
- if (!PKCS7_add_recipient_info (pkcs7 , ri )) {
575
- PKCS7_RECIP_INFO_free (ri );
576
- ossl_raise (ePKCS7Error , "Could not add recipient." );
553
+ GetPKCS7ri (recip , ri );
554
+
555
+ ri_new = ossl_PKCS7_RECIP_INFO_dup (ri );
556
+ if (!ri_new )
557
+ ossl_raise (ePKCS7Error , "PKCS7_RECIP_INFO_dup" );
558
+
559
+ if (PKCS7_add_recipient_info (pkcs7 , ri_new ) != 1 ) {
560
+ PKCS7_RECIP_INFO_free (ri_new );
561
+ ossl_raise (ePKCS7Error , "PKCS7_add_recipient_info" );
577
562
}
578
563
579
564
return self ;
0 commit comments