Crypt-OpenSSL-PKCS10

 view release on metacpan or  search on metacpan

PKCS10.xs  view on Meta::CPAN

}

/*  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 )