class OpenSSL::CMS
Attributes
data[R]
error_string[RW]
Public Class Methods
new(p1 = v1)
click to toggle source
static VALUE ossl_cms_initialize(int argc, VALUE *argv, VALUE self) { CMS_ContentInfo *cms, *out = DATA_PTR(self); BIO *in; VALUE arg; if(rb_scan_args(argc, argv, "01", &arg) == 0) return self; arg = ossl_to_der_if_possible(arg); in = ossl_obj2bio(arg); cms = PEM_read_bio_CMS(in, &out, NULL, NULL); if (!cms) { OSSL_BIO_reset(in); cms = d2i_CMS_bio(in, &out); if (!cms) { BIO_free(in); CMS_ContentInfo_free(out); DATA_PTR(self) = NULL; ossl_raise(rb_eArgError, "Could not parse the CMS"); } } DATA_PTR(self) = out; BIO_free(in); ossl_cms_set_data(self, Qnil); ossl_cms_set_err_string(self, Qnil); return self; }
read_cms(p1)
click to toggle source
static VALUE ossl_cms_s_read_cms(VALUE klass, VALUE arg) { BIO *in; CMS_ContentInfo *cms, *out; VALUE ret; arg = ossl_to_der_if_possible(arg); in = ossl_obj2bio(arg); out = CMS_ContentInfo_new(); cms = PEM_read_bio_CMS(in, &out, NULL, NULL); if (!cms) { OSSL_BIO_reset(in); cms = d2i_CMS_bio(in, &out); if (!cms) { BIO_free(in); CMS_ContentInfo_free(out); ossl_raise(rb_eArgError, "Could not parse the CMS"); } } WrapCMS(cCMS, ret, cms); BIO_free(in); ossl_cms_set_data(ret, Qnil); ossl_cms_set_err_string(ret, Qnil); return ret; }
Public Instance Methods
to_der()
click to toggle source
static VALUE ossl_cms_to_der(VALUE self) { CMS_ContentInfo *cms; VALUE str; long len; unsigned char *p; GetCMS(self, cms); if((len = i2d_CMS_ContentInfo(cms, NULL)) <= 0) ossl_raise(eCMSError, NULL); str = rb_str_new(0, len); p = (unsigned char *)RSTRING_PTR(str); if(i2d_CMS_ContentInfo(cms, &p) <= 0) ossl_raise(eCMSError, NULL); ossl_str_adjust(str, p); return str; }
to_pem()
click to toggle source
static VALUE ossl_cms_to_pem(VALUE self) { CMS_ContentInfo *cms; VALUE str; BIO *out; GetCMS(self, cms); if (!(out = BIO_new(BIO_s_mem()))) { ossl_raise(eCMSError, NULL); } if (!PEM_write_bio_CMS(out, cms)) { BIO_free(out); ossl_raise(eCMSError, NULL); } str = ossl_membio2str(out); return str; }
Also aliased as: to_s
verify(p1, p2, p3 = v3, p4 = v4)
click to toggle source
static VALUE ossl_cms_verify(int argc, VALUE *argv, VALUE self) { VALUE certs, store, indata, flags; STACK_OF(X509) *x509s; X509_STORE *x509st; int flg, ok, status = 0; BIO *in, *out; CMS_ContentInfo *cms; VALUE data; const char *msg; rb_scan_args(argc, argv, "22", &certs, &store, &indata, &flags); flg = NIL_P(flags) ? 0 : NUM2INT(flags); if(NIL_P(indata)) indata = ossl_cms_get_data(self); in = NIL_P(indata) ? NULL : ossl_obj2bio(indata); if(NIL_P(certs)) x509s = NULL; else{ x509s = ossl_protect_x509_ary2sk(certs, &status); if(status){ BIO_free(in); rb_jump_tag(status); } } x509st = GetX509StorePtr(store); GetCMS(self, cms); if(!(out = BIO_new(BIO_s_mem()))){ BIO_free(in); sk_X509_pop_free(x509s, X509_free); ossl_raise(eCMSError, NULL); } ok = CMS_verify(cms, x509s, x509st, in, out, flg); BIO_free(in); if (ok < 0) ossl_raise(eCMSError, NULL); msg = ERR_reason_error_string(ERR_get_error()); ossl_cms_set_err_string(self, msg ? rb_str_new2(msg) : Qnil); ERR_clear_error(); data = ossl_membio2str(out); ossl_cms_set_data(self, data); sk_X509_pop_free(x509s, X509_free); return (ok == 1) ? Qtrue : Qfalse; }