Class: OpenSSL::X509::CRL

Inherits:
Object
  • Object
show all
Includes:
Marshal, Extension::AuthorityKeyIdentifier
Defined in:
lib/openssl/x509.rb,
ext/openssl/ossl_x509crl.c

Instance Method Summary collapse

Methods included from Extension::AuthorityKeyIdentifier

#authority_key_identifier

Methods included from Extension::Helpers

#find_extension

Methods included from Marshal

#_dump, included

Constructor Details

#initialize(*args) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'ext/openssl/ossl_x509crl.c', line 93

static VALUE
ossl_x509crl_initialize(int argc, VALUE *argv, VALUE self)
{
    BIO *in;
    X509_CRL *crl, *crl_orig = RTYPEDDATA_DATA(self);
    VALUE arg;

    rb_check_frozen(self);
    if (rb_scan_args(argc, argv, "01", &arg) == 0) {
        return self;
    }
    arg = ossl_to_der_if_possible(arg);
    in = ossl_obj2bio(&arg);
    crl = d2i_X509_CRL_bio(in, NULL);
    if (!crl) {
        OSSL_BIO_reset(in);
        crl = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
    }
    BIO_free(in);
    if (!crl)
        ossl_raise(eX509CRLError, "PEM_read_bio_X509_CRL");

    RTYPEDDATA_DATA(self) = crl;
    X509_CRL_free(crl_orig);

    return self;
}

Instance Method Details

#==(other) ⇒ Object



378
379
380
381
# File 'lib/openssl/x509.rb', line 378

def ==(other)
  return false unless CRL === other
  to_der == other.to_der
end

#add_extension(extension) ⇒ Object



488
489
490
491
492
493
494
495
496
497
498
499
500
501
# File 'ext/openssl/ossl_x509crl.c', line 488

static VALUE
ossl_x509crl_add_extension(VALUE self, VALUE extension)
{
    X509_CRL *crl;
    X509_EXTENSION *ext;

    GetX509CRL(self, crl);
    ext = GetX509ExtPtr(extension);
    if (!X509_CRL_add_ext(crl, ext, -1)) {
        ossl_raise(eX509CRLError, NULL);
    }

    return extension;
}

#add_revoked(revoked) ⇒ Object



329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
# File 'ext/openssl/ossl_x509crl.c', line 329

static VALUE
ossl_x509crl_add_revoked(VALUE self, VALUE revoked)
{
    X509_CRL *crl;
    X509_REVOKED *rev;

    GetX509CRL(self, crl);
    rev = DupX509RevokedPtr(revoked);
    if (!X509_CRL_add0_revoked(crl, rev)) { /* NO DUP - don't free! */
        X509_REVOKED_free(rev);
        ossl_raise(eX509CRLError, "X509_CRL_add0_revoked");
    }
    X509_CRL_sort(crl);

    return revoked;
}

#extensionsObject

Gets X509v3 extensions as array of X509Ext objects



441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
# File 'ext/openssl/ossl_x509crl.c', line 441

static VALUE
ossl_x509crl_get_extensions(VALUE self)
{
    X509_CRL *crl;
    int count, i;
    X509_EXTENSION *ext;
    VALUE ary;

    GetX509CRL(self, crl);
    count = X509_CRL_get_ext_count(crl);
    ary = rb_ary_new_capa(count);
    for (i=0; i<count; i++) {
        ext = X509_CRL_get_ext(crl, i); /* NO DUP - don't free! */
        rb_ary_push(ary, ossl_x509ext_new(ext));
    }

    return ary;
}

#extensions=(ary) ⇒ Object

Sets X509_EXTENSIONs



463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
# File 'ext/openssl/ossl_x509crl.c', line 463

static VALUE
ossl_x509crl_set_extensions(VALUE self, VALUE ary)
{
    X509_CRL *crl;
    X509_EXTENSION *ext;
    long i;

    Check_Type(ary, T_ARRAY);
    /* All ary members should be X509 Extensions */
    for (i=0; i<RARRAY_LEN(ary); i++) {
        OSSL_Check_Kind(RARRAY_AREF(ary, i), cX509Ext);
    }
    GetX509CRL(self, crl);
    for (i = X509_CRL_get_ext_count(crl); i > 0; i--)
        X509_EXTENSION_free(X509_CRL_delete_ext(crl, 0));
    for (i=0; i<RARRAY_LEN(ary); i++) {
        ext = GetX509ExtPtr(RARRAY_AREF(ary, i)); /* NO NEED TO DUP */
        if (!X509_CRL_add_ext(crl, ext, -1)) {
            ossl_raise(eX509CRLError, "X509_CRL_add_ext");
        }
    }

    return ary;
}

#initialize_copy(other) ⇒ Object

:nodoc:



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'ext/openssl/ossl_x509crl.c', line 122

static VALUE
ossl_x509crl_copy(VALUE self, VALUE other)
{
    X509_CRL *a, *b, *crl;

    rb_check_frozen(self);
    if (self == other) return self;
    GetX509CRL(self, a);
    GetX509CRL(other, b);
    if (!(crl = X509_CRL_dup(b))) {
        ossl_raise(eX509CRLError, NULL);
    }
    X509_CRL_free(a);
    DATA_PTR(self) = crl;

    return self;
}

#issuerObject



191
192
193
194
195
196
197
198
199
# File 'ext/openssl/ossl_x509crl.c', line 191

static VALUE
ossl_x509crl_get_issuer(VALUE self)
{
    X509_CRL *crl;

    GetX509CRL(self, crl);

    return ossl_x509name_new(X509_CRL_get_issuer(crl)); /* NO DUP - don't free */
}

#issuer=(issuer) ⇒ Object

NO DUP - don’t free



201
202
203
204
205
206
207
208
209
210
211
212
# File 'ext/openssl/ossl_x509crl.c', line 201

static VALUE
ossl_x509crl_set_issuer(VALUE self, VALUE issuer)
{
    X509_CRL *crl;

    GetX509CRL(self, crl);

    if (!X509_CRL_set_issuer_name(crl, GetX509NamePtr(issuer))) { /* DUPs name */
        ossl_raise(eX509CRLError, NULL);
    }
    return issuer;
}

#last_updateObject



214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'ext/openssl/ossl_x509crl.c', line 214

static VALUE
ossl_x509crl_get_last_update(VALUE self)
{
    X509_CRL *crl;
    const ASN1_TIME *time;

    GetX509CRL(self, crl);
    time = X509_CRL_get0_lastUpdate(crl);
    if (!time)
        return Qnil;

    return asn1time_to_time(time);
}

#last_update=(time) ⇒ Object



228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# File 'ext/openssl/ossl_x509crl.c', line 228

static VALUE
ossl_x509crl_set_last_update(VALUE self, VALUE time)
{
    X509_CRL *crl;
    ASN1_TIME *asn1time;

    GetX509CRL(self, crl);
    asn1time = ossl_x509_time_adjust(NULL, time);
    if (!X509_CRL_set1_lastUpdate(crl, asn1time)) {
        ASN1_TIME_free(asn1time);
        ossl_raise(eX509CRLError, "X509_CRL_set_lastUpdate");
    }
    ASN1_TIME_free(asn1time);

    return time;
}

#next_updateObject



245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'ext/openssl/ossl_x509crl.c', line 245

static VALUE
ossl_x509crl_get_next_update(VALUE self)
{
    X509_CRL *crl;
    const ASN1_TIME *time;

    GetX509CRL(self, crl);
    time = X509_CRL_get0_nextUpdate(crl);
    if (!time)
        return Qnil;

    return asn1time_to_time(time);
}

#next_update=(time) ⇒ Object



259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
# File 'ext/openssl/ossl_x509crl.c', line 259

static VALUE
ossl_x509crl_set_next_update(VALUE self, VALUE time)
{
    X509_CRL *crl;
    ASN1_TIME *asn1time;

    GetX509CRL(self, crl);
    asn1time = ossl_x509_time_adjust(NULL, time);
    if (!X509_CRL_set1_nextUpdate(crl, asn1time)) {
        ASN1_TIME_free(asn1time);
        ossl_raise(eX509CRLError, "X509_CRL_set_nextUpdate");
    }
    ASN1_TIME_free(asn1time);

    return time;
}

#revokedObject



276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
# File 'ext/openssl/ossl_x509crl.c', line 276

static VALUE
ossl_x509crl_get_revoked(VALUE self)
{
    X509_CRL *crl;
    int i, num;
    STACK_OF(X509_REVOKED) *sk;
    VALUE ary;

    GetX509CRL(self, crl);
    sk = X509_CRL_get_REVOKED(crl);
    if (!sk)
        return rb_ary_new();

    num = sk_X509_REVOKED_num(sk);
    ary = rb_ary_new_capa(num);
    for(i=0; i<num; i++) {
        X509_REVOKED *rev = sk_X509_REVOKED_value(sk, i);
        rb_ary_push(ary, ossl_x509revoked_new(rev));
    }

    return ary;
}

#revoked=(ary) ⇒ Object



299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
# File 'ext/openssl/ossl_x509crl.c', line 299

static VALUE
ossl_x509crl_set_revoked(VALUE self, VALUE ary)
{
    X509_CRL *crl;
    X509_REVOKED *rev;
    STACK_OF(X509_REVOKED) *sk;
    long i;

    Check_Type(ary, T_ARRAY);
    /* All ary members should be X509 Revoked */
    for (i=0; i<RARRAY_LEN(ary); i++) {
        OSSL_Check_Kind(RARRAY_AREF(ary, i), cX509Rev);
    }
    GetX509CRL(self, crl);
    if ((sk = X509_CRL_get_REVOKED(crl))) {
        while ((rev = sk_X509_REVOKED_pop(sk)))
            X509_REVOKED_free(rev);
    }
    for (i=0; i<RARRAY_LEN(ary); i++) {
        rev = DupX509RevokedPtr(RARRAY_AREF(ary, i));
        if (!X509_CRL_add0_revoked(crl, rev)) { /* NO DUP - don't free! */
            X509_REVOKED_free(rev);
            ossl_raise(eX509CRLError, "X509_CRL_add0_revoked");
        }
    }
    X509_CRL_sort(crl);

    return ary;
}

#sign(key, digest) ⇒ Object



346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
# File 'ext/openssl/ossl_x509crl.c', line 346

static VALUE
ossl_x509crl_sign(VALUE self, VALUE key, VALUE digest)
{
    X509_CRL *crl;
    EVP_PKEY *pkey;
    const EVP_MD *md;
    VALUE md_holder;

    GetX509CRL(self, crl);
    pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
    /* NULL needed for some key types, e.g. Ed25519 */
    md = NIL_P(digest) ? NULL : ossl_evp_md_fetch(digest, &md_holder);
    if (!X509_CRL_sign(crl, pkey, md))
        ossl_raise(eX509CRLError, "X509_CRL_sign");

    return self;
}

#signature_algorithmString

Returns the signature algorithm used to sign this CRL.

Returns the long name of the signature algorithm, or the dotted decimal notation if OpenSSL does not define a long name for it.

Returns:

  • (String)


178
179
180
181
182
183
184
185
186
187
188
189
# File 'ext/openssl/ossl_x509crl.c', line 178

static VALUE
ossl_x509crl_get_signature_algorithm(VALUE self)
{
    X509_CRL *crl;
    const X509_ALGOR *alg;
    const ASN1_OBJECT *obj;

    GetX509CRL(self, crl);
    X509_CRL_get0_signature(crl, NULL, &alg);
    X509_ALGOR_get0(&obj, NULL, NULL, alg);
    return ossl_asn1obj_to_string_long_name(obj);
}

#to_derObject



384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
# File 'ext/openssl/ossl_x509crl.c', line 384

static VALUE
ossl_x509crl_to_der(VALUE self)
{
    X509_CRL *crl;
    BIO *out;

    GetX509CRL(self, crl);
    if (!(out = BIO_new(BIO_s_mem()))) {
        ossl_raise(eX509CRLError, NULL);
    }
    if (!i2d_X509_CRL_bio(out, crl)) {
        BIO_free(out);
        ossl_raise(eX509CRLError, NULL);
    }

    return ossl_membio2str(out);
}

#to_pemObject Also known as: to_s



402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
# File 'ext/openssl/ossl_x509crl.c', line 402

static VALUE
ossl_x509crl_to_pem(VALUE self)
{
    X509_CRL *crl;
    BIO *out;

    GetX509CRL(self, crl);
    if (!(out = BIO_new(BIO_s_mem()))) {
        ossl_raise(eX509CRLError, NULL);
    }
    if (!PEM_write_bio_X509_CRL(out, crl)) {
        BIO_free(out);
        ossl_raise(eX509CRLError, NULL);
    }

    return ossl_membio2str(out);
}

#to_textObject



420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
# File 'ext/openssl/ossl_x509crl.c', line 420

static VALUE
ossl_x509crl_to_text(VALUE self)
{
    X509_CRL *crl;
    BIO *out;

    GetX509CRL(self, crl);
    if (!(out = BIO_new(BIO_s_mem()))) {
        ossl_raise(eX509CRLError, NULL);
    }
    if (!X509_CRL_print(out, crl)) {
        BIO_free(out);
        ossl_raise(eX509CRLError, NULL);
    }

    return ossl_membio2str(out);
}

#verify(key) ⇒ Object



364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
# File 'ext/openssl/ossl_x509crl.c', line 364

static VALUE
ossl_x509crl_verify(VALUE self, VALUE key)
{
    X509_CRL *crl;
    EVP_PKEY *pkey;

    GetX509CRL(self, crl);
    pkey = GetPKeyPtr(key);
    ossl_pkey_check_public_key(pkey);
    switch (X509_CRL_verify(crl, pkey)) {
      case 1:
        return Qtrue;
      case 0:
        ossl_clear_error();
        return Qfalse;
      default:
        ossl_raise(eX509CRLError, NULL);
    }
}

#versionObject



140
141
142
143
144
145
146
147
148
149
150
# File 'ext/openssl/ossl_x509crl.c', line 140

static VALUE
ossl_x509crl_get_version(VALUE self)
{
    X509_CRL *crl;
    long ver;

    GetX509CRL(self, crl);
    ver = X509_CRL_get_version(crl);

    return LONG2NUM(ver);
}

#version=(version) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'ext/openssl/ossl_x509crl.c', line 152

static VALUE
ossl_x509crl_set_version(VALUE self, VALUE version)
{
    X509_CRL *crl;
    long ver;

    if ((ver = NUM2LONG(version)) < 0) {
        ossl_raise(eX509CRLError, "version must be >= 0!");
    }
    GetX509CRL(self, crl);
    if (!X509_CRL_set_version(crl, ver)) {
        ossl_raise(eX509CRLError, NULL);
    }

    return version;
}