Alt-Crypt-OpenSSL-PKCS12-Broadbean
view release on metacpan or search on metacpan
}
bags = PKCS12_unpack_p7data(p7);
} else if (bagnid == NID_pkcs7_encrypted) {
if (options & INFO) {
if (orig_hash) {
bag_hv = newHV();
if (p7->d.encrypted != NULL)
alg_print(aTHX_ bio, p7->d.encrypted->enc_data->algorithm, parameters_hv);
if((hv_store(bag_hv, "parameters", strlen("parameters"), newRV_inc((SV *) parameters_hv), 0)) == NULL)
croak("unable to add parameters to the hash");
if((hv_store(orig_hash, "pkcs7_encrypted_data", strlen("pkcs7_encrypted_data"), newRV_inc((SV *) bag_hv), 0)) == NULL)
croak("unable to add pkcs7_encrypted_data to the orig_hash");
av_push(pkcs7_enc_bags_av, newRV_inc((SV *) bag_hv));
} else {
BIO_printf(bio, "PKCS7 Encrypted data: ");
if (p7->d.encrypted == NULL) {
BIO_printf(bio, "<no data>\n");
} else {
alg_print(aTHX_ bio, p7->d.encrypted->enc_data->algorithm, NULL);
}
}
}
bags = PKCS12_unpack_p7encdata(p7, pass, passlen);
} else {
continue;
}
if (bags == NULL) return 0;
if (!dump_certs_pkeys_bags(aTHX_ bio, bags, pass, passlen, options, pempass, enc, bag_hv)) {
sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free);
return 0;
}
if (orig_hash) {
if((hv_store(orig_hash, "pkcs7_data", strlen("pkcs7_data"), newRV_inc((SV *) pkcs7_bags_av), 0)) == NULL)
croak("unable to add bags to the hash");
if((hv_store(orig_hash, "pkcs7_encrypted_data", strlen("pkcs7_encrypted_data"), newRV_inc((SV *) pkcs7_enc_bags_av), 0)) == NULL)
croak("unable to add bags to the hash");
}
sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free);
}
sk_PKCS7_pop_free(asafes, PKCS7_free);
return 1;
}
#ifdef TIM
# define B_FORMAT_TEXT 0x8000
# define FORMAT_TEXT (1 | B_FORMAT_TEXT) /* Generic text */
int FMT_istext(int format)
{
return (format & B_FORMAT_TEXT) == B_FORMAT_TEXT;
}
BIO *dup_bio_err(int format)
{
BIO *b = BIO_new_fp(stderr,
BIO_NOCLOSE | (FMT_istext(format) ? BIO_FP_TEXT : 0));
return b;
}
#endif
static unsigned long nmflag = 0;
static char nmflag_set = 0;
# define XN_FLAG_SPC_EQ (1 << 23)/* Put spaces round '=' */
#define CHARTYPE_BS_ESC (ASN1_STRFLGS_ESC_2253 | CHARTYPE_FIRST_ESC_2253 | CHARTYPE_LAST_ESC_2253)
#define ESC_FLAGS (ASN1_STRFLGS_ESC_2253 | \
ASN1_STRFLGS_ESC_QUOTE | \
ASN1_STRFLGS_ESC_CTRL | \
ASN1_STRFLGS_ESC_MSB)
unsigned long get_nameopt(void)
{
return
nmflag_set ? nmflag : ESC_FLAGS | XN_FLAG_SEP_CPLUS_SPC | ASN1_STRFLGS_UTF8_CONVERT | XN_FLAG_SPC_EQ;
}
void print_name(BIO *out, const char *title, CONST_X509_NAME *nm)
{
char *buf;
char mline = 0;
int indent = 0;
unsigned long lflags = get_nameopt();
if (out == NULL)
return;
if (title != NULL)
BIO_puts(out, title);
if ((lflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
mline = 1;
indent = 4;
}
if (lflags == XN_FLAG_COMPAT) {
buf = X509_NAME_oneline(nm, 0, 0);
BIO_puts(out, buf);
BIO_puts(out, "\n");
OPENSSL_free(buf);
} else {
if (mline)
BIO_puts(out, "\n");
X509_NAME_print_ex(out, nm, indent, lflags);
BIO_puts(out, "\n");
}
}
void dump_cert_text(BIO *out, X509 *x)
{
print_name(out, "subject=", X509_get_subject_name(x));
print_name(out, "issuer=", X509_get_issuer_name(x));
}
SV * get_cert_subject_name(pTHX_ X509 *x)
{
BIO *bio;
RETVAL = extractBioString(aTHX_ bio);
OUTPUT:
RETVAL
SV*
mac_ok(pkcs12, pwd = "")
Crypt::OpenSSL::PKCS12 pkcs12
char *pwd
CODE:
if (!(PKCS12_verify_mac(pkcs12, pwd, strlen(pwd)))) {
croak("PKCS12_verify_mac: \n%s", ssl_error(aTHX));
}
RETVAL = (PKCS12_verify_mac(pkcs12, pwd, strlen(pwd))) ? &PL_sv_yes : &PL_sv_no;
OUTPUT:
RETVAL
SV*
changepass(pkcs12, oldpwd = "", newpwd = "")
Crypt::OpenSSL::PKCS12 pkcs12
char *oldpwd
char *newpwd
CODE:
if (!(PKCS12_newpass(pkcs12, oldpwd, newpwd))) {
warn("PKCS12_newpass: %s %s\n%s", oldpwd, newpwd, ssl_error(aTHX));
RETVAL = &PL_sv_no;
} else {
RETVAL = &PL_sv_yes;
}
OUTPUT:
RETVAL
SV*
create(pkcs12, cert_chain_pem = "", pk = "", pass = 0, file = 0, name = "PKCS12 Certificate")
char *cert_chain_pem
char *pk
char *pass
char *file
char *name
PREINIT:
FILE *fp;
EVP_PKEY* pkey;
PKCS12 *p12;
STACK_OF(X509) *cert_chain = NULL;
CODE:
pkey = _load_pkey(pk, PEM_read_bio_PrivateKey);
cert_chain = _load_cert_chain(cert_chain_pem, PEM_X509_INFO_read_bio);
p12 = PKCS12_create(pass, name, pkey, sk_X509_shift(cert_chain), cert_chain, 0, 0, 0, 0, 0);
if (!p12) {
ERR_print_errors_fp(stderr);
croak("Error creating PKCS#12 structure\n");
}
if (!(fp = fopen(file, "wb"))) {
ERR_print_errors_fp(stderr);
croak("Error opening file %s\n", file);
}
i2d_PKCS12_fp(fp, p12);
PKCS12_free(p12);
fclose(fp);
RETVAL = &PL_sv_yes;
OUTPUT:
RETVAL
SV*
create_as_string(pkcs12, cert_chain_pem = "", pk = "", pass = 0, name = "PKCS12 Certificate")
char *cert_chain_pem
char *pk
char *pass
char *name
PREINIT:
BIO *bio;
EVP_PKEY* pkey;
PKCS12 *p12;
STACK_OF(X509) *cert_chain = NULL;
CODE:
pkey = _load_pkey(pk, PEM_read_bio_PrivateKey);
cert_chain = _load_cert_chain(cert_chain_pem, PEM_X509_INFO_read_bio);
p12 = PKCS12_create(pass, name, pkey, sk_X509_shift(cert_chain), cert_chain, 0, 0, 0, 0, 0);
if (!p12) {
ERR_print_errors_fp(stderr);
croak("Error creating PKCS#12 structure\n");
}
CHECK_OPEN_SSL(bio = BIO_new(BIO_s_mem()));
i2d_PKCS12_bio(bio, p12);
RETVAL = extractBioString(aTHX_ bio);
PKCS12_free(p12);
OUTPUT:
RETVAL
SV*
certificate(pkcs12, pwd = "")
Crypt::OpenSSL::PKCS12 pkcs12
char *pwd
PREINIT:
BIO *bio;
STACK_OF(PKCS7) *asafes = NULL;
CODE:
CHECK_OPEN_SSL(bio = BIO_new(BIO_s_mem()));
if ((asafes = PKCS12_unpack_authsafes(pkcs12)) == NULL)
RETVAL = newSVpvn("",0);
dump_certs_keys_p12(aTHX_ bio, pkcs12, pwd, strlen(pwd), CLCERTS|NOKEYS, NULL, NULL);
RETVAL = extractBioString(aTHX_ bio);
OUTPUT:
RETVAL
SV*
ca_certificate(pkcs12, pwd = "")
Crypt::OpenSSL::PKCS12 pkcs12
char *pwd
PREINIT:
BIO *bio;
CODE:
CHECK_OPEN_SSL(bio = BIO_new(BIO_s_mem()));
PKCS12_unpack_authsafes(pkcs12);
dump_certs_keys_p12(aTHX_ bio, pkcs12, pwd, strlen(pwd), CACERTS|NOKEYS, NULL, NULL);
RETVAL = extractBioString(aTHX_ bio);
OUTPUT:
RETVAL
SV*
private_key(pkcs12, pwd = "")
Crypt::OpenSSL::PKCS12 pkcs12
char *pwd
( run in 1.121 second using v1.01-cache-2.11-cpan-39bf76dae61 )