static VALUE ossl_x509crl_initialize(int argc, VALUE *argv, VALUE self) { BIO *in; X509_CRL *crl = rb_rdata_fetch(self); X509_CRL *x = crl; VALUE arg; if (rb_scan_args(argc, argv, "01", &arg) == 0) { return self; } arg = ossl_to_der_if_possible(arg); in = ossl_obj2bio(arg); crl = PEM_read_bio_X509_CRL(in, &x, NULL, NULL); rb_rdata_store(self, x); if (!crl) { OSSL_BIO_reset(in); crl = d2i_X509_CRL_bio(in, &x); rb_rdata_store(self, x); } BIO_free(in); if (!crl) ossl_raise(eX509CRLError, NULL); return self; }
/* * call-seq: * PKCS7.new => pkcs7 * PKCS7.new(string) => pkcs7 * * Many methods in this class aren't documented. */ static VALUE ossl_pkcs7_initialize(int argc, VALUE *argv, VALUE self) { PKCS7 *p7, *pkcs = 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); p7 = PEM_read_bio_PKCS7(in, &pkcs, NULL, NULL); DATA_PTR(self) = pkcs; if (!p7) { OSSL_BIO_reset(in); p7 = d2i_PKCS7_bio(in, &pkcs); if (!p7) ossl_raise(rb_eArgError, "Could not parse the PKCS7"); DATA_PTR(self) = pkcs; } BIO_free(in); ossl_pkcs7_set_data(self, Qnil); ossl_pkcs7_set_err_string(self, Qnil); return self; }
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; }
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; }
static VALUE join_der_i(VALUE i, VALUE str) { i = ossl_to_der_if_possible(i); StringValue(i); rb_str_append(str, i); return Qnil; }
static VALUE ossl_asn1_traverse(VALUE self, SEL sel, VALUE obj) { unsigned char *p; long offset = 0; volatile VALUE tmp; obj = ossl_to_der_if_possible(obj); tmp = rb_str_new4(StringValue(obj)); p = (unsigned char *)RSTRING_PTR(tmp); ossl_asn1_decode0(&p, RSTRING_LEN(tmp), &offset, 0, 0, 1); return Qnil; }
static VALUE ossl_asn1_decode_all(VALUE self, VALUE obj) { VALUE ret; unsigned char *p; long offset = 0; volatile VALUE tmp; obj = ossl_to_der_if_possible(obj); tmp = rb_str_new4(StringValue(obj)); p = (unsigned char *)RSTRING_PTR(tmp); ret = ossl_asn1_decode0(&p, RSTRING_LEN(tmp), &offset, 0, 0, 0); return ret; }
static VALUE ossl_ocspres_initialize(int argc, VALUE *argv, VALUE self) { VALUE arg; unsigned char *p; rb_scan_args(argc, argv, "01", &arg); if(!NIL_P(arg)) { arg = ossl_to_der_if_possible(arg); StringValue(arg); p = RSTRING_PTR(arg); if(!d2i_OCSP_RESPONSE((OCSP_RESPONSE**)&DATA_PTR(self), &p, RSTRING_LEN(arg))) { ossl_raise(eOCSPError, "cannot load DER encoded response"); } } return self; }
static VALUE ossl_ocspreq_initialize(int argc, VALUE *argv, VALUE self) { VALUE arg; const unsigned char *p; rb_scan_args(argc, argv, "01", &arg); if(!NIL_P(arg)){ OCSP_REQUEST *req = DATA_PTR(self), *x; arg = ossl_to_der_if_possible(arg); StringValue(arg); p = (unsigned char*)RSTRING_PTR(arg); x = d2i_OCSP_REQUEST(&req, &p, RSTRING_LEN(arg)); DATA_PTR(self) = req; if(!x){ ossl_raise(eOCSPError, "cannot load DER encoded request"); } } return self; }
/* * call-seq: * DH.new([size [, generator] | string]) -> dh * * Either generates a DH instance from scratch or by reading already existing * DH parameters from +string+. Note that when reading a DH instance from * data that was encoded from a DH instance by using DH#to_pem or DH#to_der * the result will *not* contain a public/private key pair yet. This needs to * be generated using DH#generate_key! first. * * === Parameters * * +size+ is an integer representing the desired key size. Keys smaller than 1024 bits should be considered insecure. * * +generator+ is a small number > 1, typically 2 or 5. * * +string+ contains the DER or PEM encoded key. * * === Examples * DH.new # -> dh * DH.new(1024) # -> dh * DH.new(1024, 5) # -> dh * #Reading DH parameters * dh = DH.new(File.read('parameters.pem')) # -> dh, but no public/private key yet * dh.generate_key! # -> dh with public and private key */ static VALUE ossl_dh_initialize(int argc, VALUE *argv, VALUE self) { EVP_PKEY *pkey; DH *dh; int g = 2; BIO *in; VALUE arg, gen; GetPKey(self, pkey); if(RB_SCAN_ARGS_02(argc, argv, "02", &arg, &gen) == 0) { dh = DH_new(); } else if (FIXNUM_P(arg)) { if (!NIL_P(gen)) { g = NUM2INT(gen); } if (!(dh = dh_generate(FIX2INT(arg), g))) { ossl_raise(eDHError, NULL); } } else { arg = ossl_to_der_if_possible(arg); in = ossl_obj2bio(arg); dh = PEM_read_bio_DHparams(in, NULL, NULL, NULL); if (!dh){ OSSL_BIO_reset(in); dh = d2i_DHparams_bio(in, NULL); } BIO_free(in); if (!dh) { ossl_raise(eDHError, NULL); } } if (!EVP_PKEY_assign_DH(pkey, dh)) { DH_free(dh); ossl_raise(eDHError, NULL); } return self; }
static VALUE ossl_x509crl_initialize(int argc, VALUE *argv, VALUE self) { BIO *in; X509_CRL *crl; VALUE arg; if (rb_scan_args(argc, argv, "01", &arg) == 0) { return self; } arg = ossl_to_der_if_possible(arg); in = ossl_obj2bio(arg); crl = PEM_read_bio_X509_CRL(in, (X509_CRL **)&DATA_PTR(self), NULL, NULL); if (!crl) { BIO_reset(in); crl = d2i_X509_CRL_bio(in, (X509_CRL **)&DATA_PTR(self)); } BIO_free(in); if (!crl) ossl_raise(eX509CRLError, NULL); return self; }
/* * call-seq: * PKCS7.new => pkcs7 * PKCS7.new(string) => pkcs7 * * Many methods in this class aren't documented. */ static VALUE ossl_pkcs7_initialize(int argc, VALUE *argv, VALUE self) { PKCS7 *p7; 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); p7 = PEM_read_bio_PKCS7(in, (PKCS7 **)&DATA_PTR(self), NULL, NULL); if (!p7) { BIO_reset(in); p7 = d2i_PKCS7_bio(in, (PKCS7 **)&DATA_PTR(self)); } BIO_free(in); ossl_pkcs7_set_data(self, Qnil); ossl_pkcs7_set_err_string(self, Qnil); return self; }