Crypt-OpenSSL-PKCS10
view release on metacpan or search on metacpan
}
/* Add an extention by setting the raw ASN1 octet string.
*/
int add_ext_raw(STACK_OF(X509_EXTENSION) *sk, int nid, char *value, int length)
{
X509_EXTENSION *ex;
ASN1_STRING *asn;
asn = ASN1_STRING_type_new(V_ASN1_OCTET_STRING);
ASN1_OCTET_STRING_set(asn, (unsigned char *) value, length);
ex = X509_EXTENSION_create_by_NID(NULL, nid, 0, asn);
if (!ex)
return 0;
sk_X509_EXTENSION_push(sk, ex);
return 1;
}
SV* make_pkcs10_obj(SV* p_proto, X509_REQ* p_req, EVP_PKEY* p_pk, STACK_OF(X509_EXTENSION)* p_exts, RSA **p_rsa)
{
pkcs10Data* pkcs10;
CHECK_NEW(pkcs10, 1, pkcs10Data);
pkcs10->req = p_req;
pkcs10->pk = p_pk;
pkcs10->exts = p_exts;
pkcs10->rsa = p_rsa;
return sv_bless(
newRV_noinc(newSViv((IV) pkcs10)),
(SvROK(p_proto) ? SvSTASH(SvRV(p_proto)) : gv_stashsv(p_proto, 1)));
}
/* stolen from OpenSSL.xs */
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
long bio_write_cb(struct bio_st *bm, int m, const char *ptr, size_t len, int l, long x, int y, size_t *processed) {
#else
long bio_write_cb(struct bio_st *bm, int m, const char *ptr, int len, long x, long y) {
#endif
if (m == BIO_CB_WRITE) {
SV *sv = (SV *) BIO_get_callback_arg(bm);
sv_catpvn(sv, ptr, len);
}
if (m == BIO_CB_PUTS) {
SV *sv = (SV *) BIO_get_callback_arg(bm);
len = strlen(ptr);
sv_catpvn(sv, ptr, len);
}
return len;
}
static BIO* sv_bio_create(void) {
SV *sv = newSVpvn("",0);
/* create an in-memory BIO abstraction and callbacks */
BIO *bio = BIO_new(BIO_s_mem());
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
BIO_set_callback_ex(bio, bio_write_cb);
#else
BIO_set_callback(bio, bio_write_cb);
#endif
BIO_set_callback_arg(bio, (void *)sv);
return bio;
}
static BIO *sv_bio_create_file(SV *filename)
{
STRLEN l;
return BIO_new_file(SvPV(filename, l), "wb");
}
static SV* sv_bio_final(BIO *bio) {
SV* sv;
BIO_flush(bio);
sv = (SV *)BIO_get_callback_arg(bio);
BIO_free_all(bio);
if (!sv) sv = &PL_sv_undef;
return sv;
}
/*
* subject is expected to be in the format /type0=value0/type1=value1/type2=...
* where characters may be escaped by \
*/
static int build_subject(X509_REQ *req, char *subject, unsigned long chtype, int multirdn)
{
X509_NAME *n;
if (!(n = parse_name(subject, chtype, multirdn)))
return 0;
if (!X509_REQ_set_subject_name(req, n))
{
X509_NAME_free(n);
return 0;
}
X509_NAME_free(n);
return 1;
}
const EVP_MD *fetch_digest(char *hash) {
const EVP_MD *md;
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
md = EVP_MD_fetch(NULL, hash, NULL);
#else
OpenSSL_add_all_digests();
md = EVP_get_digestbyname(hash);
#endif
( run in 2.910 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )