Alt-Crypt-OpenSSL-PKCS12-Broadbean
view release on metacpan or search on metacpan
STACK_OF(PKCS7) *asafes;
STACK_OF(PKCS12_SAFEBAG) *bags;
int i, bagnid;
PKCS7 *p7;
HV * bag_hv = NULL;
HV * parameters_hv = NULL;
AV * pkcs7_bags_av = newAV();
AV * pkcs7_enc_bags_av = newAV();
if ((asafes = PKCS12_unpack_authsafes(p12)) == NULL) {
croak("Unable to PKCS12_unpack_authsafes");
return 0;
}
for (i = 0; i < sk_PKCS7_num(asafes); i++) {
if (orig_hash) {
parameters_hv = newHV();
bag_hv = newHV();
}
p7 = sk_PKCS7_value(asafes, i);
bagnid = OBJ_obj2nid(p7->type);
if (bagnid == NID_pkcs7_data) {
if (options & INFO) {
if (orig_hash) {
bag_hv = newHV();
av_push(pkcs7_bags_av, newRV_inc((SV *) bag_hv));
}
else
BIO_printf(bio, "PKCS7 Data\n");
}
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)
{
( run in 0.415 second using v1.01-cache-2.11-cpan-39bf76dae61 )