1111
1212#ifndef OPENSSL_NO_TS
1313
14- #define NewTSRequest (klass ) \
15- TypedData_Wrap_Struct((klass), &ossl_ts_req_type, 0)
16- #define SetTSRequest (obj , req ) do { \
17- if (!(req)) { \
18- ossl_raise(rb_eRuntimeError, "TS_REQ wasn't initialized."); \
19- } \
20- RTYPEDDATA_DATA(obj) = (req); \
21- } while (0)
2214#define GetTSRequest (obj , req ) do { \
2315 TypedData_Get_Struct((obj), TS_REQ, &ossl_ts_req_type, (req)); \
2416 if (!(req)) { \
2517 ossl_raise(rb_eRuntimeError, "TS_REQ wasn't initialized."); \
2618 } \
2719} while (0)
2820
29- #define NewTSResponse (klass ) \
30- TypedData_Wrap_Struct((klass), &ossl_ts_resp_type, 0)
31- #define SetTSResponse (obj , resp ) do { \
32- if (!(resp)) { \
33- ossl_raise(rb_eRuntimeError, "TS_RESP wasn't initialized."); \
34- } \
35- RTYPEDDATA_DATA(obj) = (resp); \
36- } while (0)
3721#define GetTSResponse (obj , resp ) do { \
3822 TypedData_Get_Struct((obj), TS_RESP, &ossl_ts_resp_type, (resp)); \
3923 if (!(resp)) { \
4024 ossl_raise(rb_eRuntimeError, "TS_RESP wasn't initialized."); \
4125 } \
4226} while (0)
4327
44- #define NewTSTokenInfo (klass ) \
45- TypedData_Wrap_Struct((klass), &ossl_ts_token_info_type, 0)
46- #define SetTSTokenInfo (obj , info ) do { \
47- if (!(info)) { \
48- ossl_raise(rb_eRuntimeError, "TS_TST_INFO wasn't initialized."); \
49- } \
50- RTYPEDDATA_DATA(obj) = (info); \
51- } while (0)
5228#define GetTSTokenInfo (obj , info ) do { \
5329 TypedData_Get_Struct((obj), TS_TST_INFO, &ossl_ts_token_info_type, (info)); \
5430 if (!(info)) { \
@@ -141,19 +117,7 @@ obj_to_asn1obj_i(VALUE obj)
141117static VALUE
142118ossl_ts_req_alloc (VALUE klass )
143119{
144- TS_REQ * req ;
145- VALUE obj ;
146-
147- obj = NewTSRequest (klass );
148- if (!(req = TS_REQ_new ()))
149- ossl_raise (eTimestampError , NULL );
150- SetTSRequest (obj , req );
151-
152- /* Defaults */
153- TS_REQ_set_version (req , 1 );
154- TS_REQ_set_cert_req (req , 1 );
155-
156- return obj ;
120+ return TypedData_Wrap_Struct (klass , & ossl_ts_req_type , NULL );
157121}
158122
159123/*
@@ -168,11 +132,24 @@ ossl_ts_req_alloc(VALUE klass)
168132static VALUE
169133ossl_ts_req_initialize (int argc , VALUE * argv , VALUE self )
170134{
171- TS_REQ * req , * req_orig = DATA_PTR ( self ) ;
135+ TS_REQ * req ;
172136 BIO * in ;
173137 VALUE arg ;
174138
175- if (rb_scan_args (argc , argv , "01" , & arg ) == 0 ) {
139+ rb_scan_args (argc , argv , "01" , & arg );
140+ ossl_want_uninitialized (self , & ossl_ts_req_type );
141+ if (argc == 0 ) {
142+ req = TS_REQ_new ();
143+ if (!req )
144+ ossl_raise (eTimestampError , "TS_REQ_new" );
145+ RTYPEDDATA_DATA (self ) = req ;
146+
147+ /* Defaults */
148+ if (!TS_REQ_set_version (req , 1 ))
149+ ossl_raise (eTimestampError , "TS_REQ_set_version" );
150+ if (!TS_REQ_set_cert_req (req , 1 ))
151+ ossl_raise (eTimestampError , "TS_REQ_set_cert_req" );
152+
176153 return self ;
177154 }
178155
@@ -184,7 +161,6 @@ ossl_ts_req_initialize(int argc, VALUE *argv, VALUE self)
184161 ossl_raise (eTimestampError ,
185162 "Error when decoding the timestamp request" );
186163 }
187- TS_REQ_free (req_orig );
188164 RTYPEDDATA_DATA (self ) = req ;
189165
190166 return self ;
@@ -499,15 +475,7 @@ ossl_ts_req_to_text(VALUE self)
499475static VALUE
500476ossl_ts_resp_alloc (VALUE klass )
501477{
502- TS_RESP * resp ;
503- VALUE obj ;
504-
505- obj = NewTSResponse (klass );
506- if (!(resp = TS_RESP_new ()))
507- ossl_raise (eTimestampError , NULL );
508- SetTSResponse (obj , resp );
509-
510- return obj ;
478+ return TypedData_Wrap_Struct (klass , & ossl_ts_resp_type , NULL );
511479}
512480
513481/*
@@ -523,9 +491,10 @@ ossl_ts_resp_alloc(VALUE klass)
523491static VALUE
524492ossl_ts_resp_initialize (VALUE self , VALUE der )
525493{
526- TS_RESP * resp , * resp_orig = DATA_PTR ( self ) ;
494+ TS_RESP * resp ;
527495 BIO * in ;
528496
497+ ossl_want_uninitialized (self , & ossl_ts_resp_type );
529498 der = ossl_to_der_if_possible (der );
530499 in = ossl_obj2bio (& der );
531500 resp = d2i_TS_RESP_bio (in , NULL );
@@ -534,7 +503,6 @@ ossl_ts_resp_initialize(VALUE self, VALUE der)
534503 ossl_raise (eTimestampError ,
535504 "Error when decoding the timestamp response" );
536505 }
537- TS_RESP_free (resp_orig );
538506 RTYPEDDATA_DATA (self ) = resp ;
539507
540508 return self ;
@@ -667,6 +635,8 @@ ossl_ts_resp_get_token(VALUE self)
667635 return ossl_pkcs7_new (p7 );
668636}
669637
638+ static VALUE ossl_ts_token_info_alloc (VALUE klass );
639+
670640/*
671641 * Get the response's token info if present.
672642 *
@@ -684,12 +654,10 @@ ossl_ts_resp_get_token_info(VALUE self)
684654 if (!(info = TS_RESP_get_tst_info (resp )))
685655 return Qnil ;
686656
687- obj = NewTSTokenInfo (cTimestampTokenInfo );
688-
657+ obj = ossl_ts_token_info_alloc (cTimestampTokenInfo );
689658 if (!(copy = TS_TST_INFO_dup (info )))
690- ossl_raise (eTimestampError , NULL );
691-
692- SetTSTokenInfo (obj , copy );
659+ ossl_raise (eTimestampError , "TS_TST_INFO_dup" );
660+ RTYPEDDATA_DATA (obj ) = copy ;
693661
694662 return obj ;
695663}
@@ -854,15 +822,7 @@ ossl_ts_resp_verify(int argc, VALUE *argv, VALUE self)
854822static VALUE
855823ossl_ts_token_info_alloc (VALUE klass )
856824{
857- TS_TST_INFO * info ;
858- VALUE obj ;
859-
860- obj = NewTSTokenInfo (klass );
861- if (!(info = TS_TST_INFO_new ()))
862- ossl_raise (eTimestampError , NULL );
863- SetTSTokenInfo (obj , info );
864-
865- return obj ;
825+ return TypedData_Wrap_Struct (klass , & ossl_ts_token_info_type , NULL );
866826}
867827
868828/*
@@ -878,9 +838,10 @@ ossl_ts_token_info_alloc(VALUE klass)
878838static VALUE
879839ossl_ts_token_info_initialize (VALUE self , VALUE der )
880840{
881- TS_TST_INFO * info , * info_orig = DATA_PTR ( self ) ;
841+ TS_TST_INFO * info ;
882842 BIO * in ;
883843
844+ ossl_want_uninitialized (self , & ossl_ts_token_info_type );
884845 der = ossl_to_der_if_possible (der );
885846 in = ossl_obj2bio (& der );
886847 info = d2i_TS_TST_INFO_bio (in , NULL );
@@ -889,7 +850,6 @@ ossl_ts_token_info_initialize(VALUE self, VALUE der)
889850 ossl_raise (eTimestampError ,
890851 "Error when decoding the timestamp token info" );
891852 }
892- TS_TST_INFO_free (info_orig );
893853 RTYPEDDATA_DATA (self ) = info ;
894854
895855 return self ;
@@ -1184,7 +1144,7 @@ ossl_tsfac_create_ts(VALUE self, VALUE key, VALUE certificate, VALUE request)
11841144 const char * err_msg = NULL ;
11851145 int status = 0 ;
11861146
1187- tsresp = NewTSResponse (cTimestampResponse );
1147+ tsresp = ossl_ts_resp_alloc (cTimestampResponse );
11881148 tsa_cert = GetX509CertPtr (certificate );
11891149 sign_key = GetPrivPKeyPtr (key );
11901150 GetTSRequest (request , req );
@@ -1281,7 +1241,7 @@ ossl_tsfac_create_ts(VALUE self, VALUE key, VALUE certificate, VALUE request)
12811241 * information. */
12821242 ossl_clear_error ();
12831243
1284- SetTSResponse (tsresp , response ) ;
1244+ RTYPEDDATA_DATA (tsresp ) = response ;
12851245 ret = tsresp ;
12861246
12871247 end :
0 commit comments