Skip to content

Commit 3481a40

Browse files
make cert/crl/ext/extfactory shareable when frozen
1 parent 63db970 commit 3481a40

File tree

7 files changed

+108
-7
lines changed

7 files changed

+108
-7
lines changed

ext/openssl/ossl_x509attr.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ ossl_x509attr_initialize(int argc, VALUE *argv, VALUE self)
105105
X509_ATTRIBUTE *attr, *x;
106106
const unsigned char *p;
107107

108+
rb_check_frozen(self);
108109
GetX509Attr(self, attr);
109110
if(rb_scan_args(argc, argv, "11", &oid, &value) == 1){
110111
oid = ossl_to_der_if_possible(oid);
@@ -153,6 +154,7 @@ ossl_x509attr_set_oid(VALUE self, VALUE oid)
153154
ASN1_OBJECT *obj;
154155
char *s;
155156

157+
rb_check_frozen(self);
156158
GetX509Attr(self, attr);
157159
s = StringValueCStr(oid);
158160
obj = OBJ_txt2obj(s, 0);
@@ -201,9 +203,12 @@ static VALUE
201203
ossl_x509attr_set_value(VALUE self, VALUE value)
202204
{
203205
X509_ATTRIBUTE *attr;
204-
GetX509Attr(self, attr);
206+
207+
rb_check_frozen(self);
205208

206209
OSSL_Check_Kind(value, cASN1Data);
210+
GetX509Attr(self, attr);
211+
207212
VALUE der = ossl_to_der(value);
208213
const unsigned char *p = (const unsigned char *)RSTRING_PTR(der);
209214
STACK_OF(ASN1_TYPE) *sk = d2i_ASN1_SET_ANY(NULL, &p, RSTRING_LEN(der));

ext/openssl/ossl_x509cert.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ static const rb_data_type_t ossl_x509_type = {
4141
{
4242
0, ossl_x509_free,
4343
},
44-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
44+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE,
4545
};
4646

4747
/*
@@ -279,6 +279,7 @@ ossl_x509_set_version(VALUE self, VALUE version)
279279
X509 *x509;
280280
long ver;
281281

282+
rb_check_frozen(self);
282283
if ((ver = NUM2LONG(version)) < 0) {
283284
ossl_raise(eX509CertError, "version must be >= 0!");
284285
}
@@ -313,6 +314,7 @@ ossl_x509_set_serial(VALUE self, VALUE num)
313314
{
314315
X509 *x509;
315316

317+
rb_check_frozen(self);
316318
GetX509(self, x509);
317319
X509_set_serialNumber(x509, num_to_asn1integer(num, X509_get_serialNumber(x509)));
318320

@@ -370,6 +372,7 @@ ossl_x509_set_subject(VALUE self, VALUE subject)
370372
{
371373
X509 *x509;
372374

375+
rb_check_frozen(self);
373376
GetX509(self, x509);
374377
if (!X509_set_subject_name(x509, GetX509NamePtr(subject))) { /* DUPs name */
375378
ossl_raise(eX509CertError, NULL);
@@ -405,6 +408,7 @@ ossl_x509_set_issuer(VALUE self, VALUE issuer)
405408
{
406409
X509 *x509;
407410

411+
rb_check_frozen(self);
408412
GetX509(self, x509);
409413
if (!X509_set_issuer_name(x509, GetX509NamePtr(issuer))) { /* DUPs name */
410414
ossl_raise(eX509CertError, NULL);
@@ -441,6 +445,7 @@ ossl_x509_set_not_before(VALUE self, VALUE time)
441445
X509 *x509;
442446
ASN1_TIME *asn1time;
443447

448+
rb_check_frozen(self);
444449
GetX509(self, x509);
445450
asn1time = ossl_x509_time_adjust(NULL, time);
446451
if (!X509_set1_notBefore(x509, asn1time)) {
@@ -480,6 +485,7 @@ ossl_x509_set_not_after(VALUE self, VALUE time)
480485
X509 *x509;
481486
ASN1_TIME *asn1time;
482487

488+
rb_check_frozen(self);
483489
GetX509(self, x509);
484490
asn1time = ossl_x509_time_adjust(NULL, time);
485491
if (!X509_set1_notAfter(x509, asn1time)) {
@@ -519,6 +525,7 @@ ossl_x509_set_public_key(VALUE self, VALUE key)
519525
X509 *x509;
520526
EVP_PKEY *pkey;
521527

528+
rb_check_frozen(self);
522529
GetX509(self, x509);
523530
pkey = GetPKeyPtr(key);
524531
ossl_pkey_check_public_key(pkey);
@@ -538,6 +545,7 @@ ossl_x509_sign(VALUE self, VALUE key, VALUE digest)
538545
EVP_PKEY *pkey;
539546
const EVP_MD *md;
540547

548+
rb_check_frozen(self);
541549
pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
542550
if (NIL_P(digest)) {
543551
md = NULL; /* needed for some key types, e.g. Ed25519 */
@@ -641,6 +649,7 @@ ossl_x509_set_extensions(VALUE self, VALUE ary)
641649
long i;
642650

643651
Check_Type(ary, T_ARRAY);
652+
rb_check_frozen(self);
644653
/* All ary's members should be X509Extension */
645654
for (i=0; i<RARRAY_LEN(ary); i++) {
646655
OSSL_Check_Kind(RARRAY_AREF(ary, i), cX509Ext);
@@ -668,6 +677,7 @@ ossl_x509_add_extension(VALUE self, VALUE extension)
668677
X509 *x509;
669678
X509_EXTENSION *ext;
670679

680+
rb_check_frozen(self);
671681
GetX509(self, x509);
672682
ext = GetX509ExtPtr(extension);
673683
if (!X509_add_ext(x509, ext, -1)) { /* DUPs ext - FREE it */
@@ -727,6 +737,7 @@ ossl_x509_tbs_bytes(VALUE self)
727737
unsigned char *p0;
728738
VALUE str;
729739

740+
rb_check_frozen(self);
730741
GetX509(self, x509);
731742
len = i2d_re_X509_tbs(x509, NULL);
732743
if (len <= 0) {

ext/openssl/ossl_x509crl.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ static const rb_data_type_t ossl_x509crl_type = {
4141
{
4242
0, ossl_x509crl_free,
4343
},
44-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
44+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE,
4545
};
4646

4747
/*
@@ -153,6 +153,7 @@ ossl_x509crl_set_version(VALUE self, VALUE version)
153153
X509_CRL *crl;
154154
long ver;
155155

156+
rb_check_frozen(self);
156157
if ((ver = NUM2LONG(version)) < 0) {
157158
ossl_raise(eX509CRLError, "version must be >= 0!");
158159
}
@@ -199,6 +200,7 @@ ossl_x509crl_set_issuer(VALUE self, VALUE issuer)
199200
{
200201
X509_CRL *crl;
201202

203+
rb_check_frozen(self);
202204
GetX509CRL(self, crl);
203205

204206
if (!X509_CRL_set_issuer_name(crl, GetX509NamePtr(issuer))) { /* DUPs name */
@@ -227,6 +229,7 @@ ossl_x509crl_set_last_update(VALUE self, VALUE time)
227229
X509_CRL *crl;
228230
ASN1_TIME *asn1time;
229231

232+
rb_check_frozen(self);
230233
GetX509CRL(self, crl);
231234
asn1time = ossl_x509_time_adjust(NULL, time);
232235
if (!X509_CRL_set1_lastUpdate(crl, asn1time)) {
@@ -258,6 +261,7 @@ ossl_x509crl_set_next_update(VALUE self, VALUE time)
258261
X509_CRL *crl;
259262
ASN1_TIME *asn1time;
260263

264+
rb_check_frozen(self);
261265
GetX509CRL(self, crl);
262266
asn1time = ossl_x509_time_adjust(NULL, time);
263267
if (!X509_CRL_set1_nextUpdate(crl, asn1time)) {
@@ -302,6 +306,7 @@ ossl_x509crl_set_revoked(VALUE self, VALUE ary)
302306
STACK_OF(X509_REVOKED) *sk;
303307
long i;
304308

309+
rb_check_frozen(self);
305310
Check_Type(ary, T_ARRAY);
306311
/* All ary members should be X509 Revoked */
307312
for (i=0; i<RARRAY_LEN(ary); i++) {
@@ -330,6 +335,7 @@ ossl_x509crl_add_revoked(VALUE self, VALUE revoked)
330335
X509_CRL *crl;
331336
X509_REVOKED *rev;
332337

338+
rb_check_frozen(self);
333339
GetX509CRL(self, crl);
334340
rev = DupX509RevokedPtr(revoked);
335341
if (!X509_CRL_add0_revoked(crl, rev)) { /* NO DUP - don't free! */
@@ -348,6 +354,7 @@ ossl_x509crl_sign(VALUE self, VALUE key, VALUE digest)
348354
EVP_PKEY *pkey;
349355
const EVP_MD *md;
350356

357+
rb_check_frozen(self);
351358
GetX509CRL(self, crl);
352359
pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
353360
if (NIL_P(digest)) {
@@ -473,6 +480,7 @@ ossl_x509crl_set_extensions(VALUE self, VALUE ary)
473480
long i;
474481

475482
Check_Type(ary, T_ARRAY);
483+
rb_check_frozen(self);
476484
/* All ary members should be X509 Extensions */
477485
for (i=0; i<RARRAY_LEN(ary); i++) {
478486
OSSL_Check_Kind(RARRAY_AREF(ary, i), cX509Ext);
@@ -496,6 +504,7 @@ ossl_x509crl_add_extension(VALUE self, VALUE extension)
496504
X509_CRL *crl;
497505
X509_EXTENSION *ext;
498506

507+
rb_check_frozen(self);
499508
GetX509CRL(self, crl);
500509
ext = GetX509ExtPtr(extension);
501510
if (!X509_CRL_add_ext(crl, ext, -1)) {

ext/openssl/ossl_x509ext.c

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ static const rb_data_type_t ossl_x509ext_type = {
5555
{
5656
0, ossl_x509ext_free,
5757
},
58-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
58+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE,
5959
};
6060

6161
/*
@@ -108,7 +108,7 @@ static const rb_data_type_t ossl_x509extfactory_type = {
108108
{
109109
0, ossl_x509extfactory_free,
110110
},
111-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
111+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE,
112112
};
113113

114114
static VALUE
@@ -128,6 +128,7 @@ ossl_x509extfactory_set_issuer_cert(VALUE self, VALUE cert)
128128
{
129129
X509V3_CTX *ctx;
130130

131+
rb_check_frozen(self);
131132
GetX509ExtFactory(self, ctx);
132133
rb_iv_set(self, "@issuer_certificate", cert);
133134
ctx->issuer_cert = GetX509CertPtr(cert); /* NO DUP NEEDED */
@@ -140,6 +141,7 @@ ossl_x509extfactory_set_subject_cert(VALUE self, VALUE cert)
140141
{
141142
X509V3_CTX *ctx;
142143

144+
rb_check_frozen(self);
143145
GetX509ExtFactory(self, ctx);
144146
rb_iv_set(self, "@subject_certificate", cert);
145147
ctx->subject_cert = GetX509CertPtr(cert); /* NO DUP NEEDED */
@@ -152,6 +154,7 @@ ossl_x509extfactory_set_subject_req(VALUE self, VALUE req)
152154
{
153155
X509V3_CTX *ctx;
154156

157+
rb_check_frozen(self);
155158
GetX509ExtFactory(self, ctx);
156159
rb_iv_set(self, "@subject_request", req);
157160
ctx->subject_req = GetX509ReqPtr(req); /* NO DUP NEEDED */
@@ -164,6 +167,7 @@ ossl_x509extfactory_set_crl(VALUE self, VALUE crl)
164167
{
165168
X509V3_CTX *ctx;
166169

170+
rb_check_frozen(self);
167171
GetX509ExtFactory(self, ctx);
168172
rb_iv_set(self, "@crl", crl);
169173
ctx->crl = GetX509CRLPtr(crl); /* NO DUP NEEDED */
@@ -181,6 +185,7 @@ ossl_x509extfactory_initialize(int argc, VALUE *argv, VALUE self)
181185

182186
rb_scan_args(argc, argv, "04",
183187
&issuer_cert, &subject_cert, &subject_req, &crl);
188+
rb_check_frozen(self);
184189
if (!NIL_P(issuer_cert))
185190
ossl_x509extfactory_set_issuer_cert(self, issuer_cert);
186191
if (!NIL_P(subject_cert))
@@ -281,6 +286,7 @@ ossl_x509ext_initialize(int argc, VALUE *argv, VALUE self)
281286
const unsigned char *p;
282287
X509_EXTENSION *ext, *x;
283288

289+
rb_check_frozen(self);
284290
GetX509Ext(self, ext);
285291
if(rb_scan_args(argc, argv, "12", &oid, &value, &critical) == 1){
286292
oid = ossl_to_der_if_possible(oid);
@@ -318,12 +324,17 @@ ossl_x509ext_initialize_copy(VALUE self, VALUE other)
318324
return self;
319325
}
320326

327+
/*
328+
* call-seq:
329+
* extension.oid = string
330+
*/
321331
static VALUE
322332
ossl_x509ext_set_oid(VALUE self, VALUE oid)
323333
{
324334
X509_EXTENSION *ext;
325335
ASN1_OBJECT *obj;
326336

337+
rb_check_frozen(self);
327338
GetX509Ext(self, ext);
328339
obj = OBJ_txt2obj(StringValueCStr(oid), 0);
329340
if (!obj)
@@ -337,12 +348,17 @@ ossl_x509ext_set_oid(VALUE self, VALUE oid)
337348
return oid;
338349
}
339350

351+
/*
352+
* call-seq:
353+
* extension.value = string => string
354+
*/
340355
static VALUE
341356
ossl_x509ext_set_value(VALUE self, VALUE data)
342357
{
343358
X509_EXTENSION *ext;
344359
ASN1_OCTET_STRING *asn1s;
345360

361+
rb_check_frozen(self);
346362
GetX509Ext(self, ext);
347363
data = ossl_to_der_if_possible(data);
348364
StringValue(data);
@@ -356,17 +372,26 @@ ossl_x509ext_set_value(VALUE self, VALUE data)
356372
return data;
357373
}
358374

375+
/*
376+
* call-seq:
377+
* extension.critical = bool => bool
378+
*/
359379
static VALUE
360380
ossl_x509ext_set_critical(VALUE self, VALUE flag)
361381
{
362382
X509_EXTENSION *ext;
363383

384+
rb_check_frozen(self);
364385
GetX509Ext(self, ext);
365386
X509_EXTENSION_set_critical(ext, RTEST(flag) ? 1 : 0);
366387

367388
return flag;
368389
}
369390

391+
/*
392+
* call-seq:
393+
* extension.oid => string
394+
*/
370395
static VALUE
371396
ossl_x509ext_get_oid(VALUE obj)
372397
{
@@ -390,6 +415,10 @@ ossl_x509ext_get_oid(VALUE obj)
390415
return ret;
391416
}
392417

418+
/*
419+
* call-seq:
420+
* extension.value => string
421+
*/
393422
static VALUE
394423
ossl_x509ext_get_value(VALUE obj)
395424
{
@@ -420,6 +449,10 @@ ossl_x509ext_get_value_der(VALUE obj)
420449
return rb_str_new((const char *)value->data, value->length);
421450
}
422451

452+
/*
453+
* call-seq:
454+
* extension.critical? => bool
455+
*/
423456
static VALUE
424457
ossl_x509ext_get_critical(VALUE obj)
425458
{
@@ -429,6 +462,10 @@ ossl_x509ext_get_critical(VALUE obj)
429462
return X509_EXTENSION_get_critical(ext) ? Qtrue : Qfalse;
430463
}
431464

465+
/*
466+
* call-seq:
467+
* extension.to_der => string
468+
*/
432469
static VALUE
433470
ossl_x509ext_to_der(VALUE obj)
434471
{

ext/openssl/ossl_x509name.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ ossl_x509name_initialize(int argc, VALUE *argv, VALUE self)
148148
X509_NAME *name;
149149
VALUE arg, template;
150150

151+
rb_check_frozen(self);
151152
GetX509Name(self, name);
152153
if (rb_scan_args(argc, argv, "02", &arg, &template) == 0) {
153154
return self;
@@ -230,6 +231,7 @@ VALUE ossl_x509name_add_entry(int argc, VALUE *argv, VALUE self)
230231
}
231232
rb_scan_args(argc, argv, "21:", &oid, &value, &type, &opts);
232233
rb_get_kwargs(opts, kwargs_ids, 0, 2, kwargs);
234+
rb_check_frozen(self);
233235
oid_name = StringValueCStr(oid);
234236
StringValue(value);
235237
if(NIL_P(type)) type = rb_aref(OBJECT_TYPE_TEMPLATE, oid);

0 commit comments

Comments
 (0)