Preview Ruby 4.1 is a preview. It can change before the final release. Switch to Ruby 4.0 →
class method
OpenSSL::PKCS12.new
(?::String der, ?::String pass) -> ::OpenSSL::PKCS12
PKCS12.new → pkcs12
PKCS12.new(str) → pkcs12
PKCS12.new(str, pass) → pkcs12
ext/openssl/ossl_pkcs12.c
View on GitHub ↗
static VALUE
ossl_pkcs12_initialize(int argc, VALUE *argv, VALUE self)
{
PKCS12 *p12;
BIO *in;
VALUE arg, pass, pkey, cert, ca;
char *passphrase;
EVP_PKEY *key;
X509 *x509;
STACK_OF(X509) *x509s = NULL;
int st = 0;
rb_scan_args(argc, argv, "02", &arg, &pass);
ossl_want_uninitialized(self, &ossl_pkcs12_type);
if (argc == 0) {
p12 = PKCS12_new();
if (!p12)
ossl_raise(ePKCS12Error, "PKCS12_new");
RTYPEDDATA_DATA(self) = p12;
return self;
}
passphrase = NIL_P(pass) ? NULL : StringValueCStr(pass);
in = ossl_obj2bio(&arg);
p12 = d2i_PKCS12_bio(in, NULL);
BIO_free(in);
if (!p12)
ossl_raise(ePKCS12Error, "d2i_PKCS12_bio");
RTYPEDDATA_DATA(self) = p12;
pkey = cert = ca = Qnil;
if (!PKCS12_parse(p12, passphrase, &key, &x509, &x509s))
ossl_raise(ePKCS12Error, "PKCS12_parse");
if (key) {
pkey = rb_protect(ossl_pkey_wrap_i, (VALUE)key, &st);
if (st) goto err;
}
if (x509) {
cert = rb_protect(ossl_x509_new_i, (VALUE)x509, &st);
if (st) goto err;
}
if (x509s) {
ca = rb_protect(ossl_x509_sk2ary_i, (VALUE)x509s, &st);
if (st) goto err;
}
err:
X509_free(x509);
sk_X509_pop_free(x509s, X509_free);
ossl_pkcs12_set_key(self, pkey);
ossl_pkcs12_set_cert(self, cert);
ossl_pkcs12_set_ca_certs(self, ca);
if(st) rb_jump_tag(st);
return self;
}
Parameters
-
str - Must be a DER encoded
PKCS12string. -
pass - string