Crypt-OpenSSL-X509
view release on metacpan or search on metacpan
{
if (p != NULL)
*p = d->p;
if (q != NULL)
*q = d->q;
if (g != NULL)
*g = d->g;
}
static void DSA_get0_key(const DSA *d,
const BIGNUM **pub_key, const BIGNUM **priv_key)
{
if (pub_key != NULL)
*pub_key = d->pub_key;
if (priv_key != NULL)
*priv_key = d->priv_key;
}
static DSA *EVP_PKEY_get0_DSA(EVP_PKEY *pkey)
{
if (pkey->type != EVP_PKEY_DSA)
return NULL;
return pkey->pkey.dsa;
}
static EC_KEY *EVP_PKEY_get0_EC_KEY(EVP_PKEY *pkey)
{
if (pkey->type != EVP_PKEY_EC)
return NULL;
return pkey->pkey.ec;
}
#else
#define const_ossl11 const
#endif
/* Unicode 0xfffd */
static U8 utf8_substitute_char[3] = { 0xef, 0xbf, 0xbd };
/* stolen from OpenSSL.xs */
long bio_write_cb(struct bio_st *bm, int m, const char *ptr, int l, long x, long y) {
if (m == BIO_CB_WRITE) {
SV *sv = (SV *) BIO_get_callback_arg(bm);
sv_catpvn(sv, ptr, l);
}
if (m == BIO_CB_PUTS) {
SV *sv = (SV *) BIO_get_callback_arg(bm);
l = strlen(ptr);
sv_catpvn(sv, ptr, l);
}
return l;
}
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());
BIO_set_callback(bio, bio_write_cb);
BIO_set_callback_arg(bio, (void *)sv);
return bio;
}
static SV* sv_bio_final(BIO *bio) {
SV* sv;
(void)BIO_flush(bio);
sv = (SV *)BIO_get_callback_arg(bio);
BIO_set_callback_arg(bio, (void *)NULL);
BIO_set_callback(bio, (void *)NULL);
BIO_free_all(bio);
if (!sv) sv = &PL_sv_undef;
return sv;
}
/* call this just before sv_bio_final if the BIO got an UTF8 encoded text and you want native perl utf-8 strings. */
static SV* sv_bio_utf8_on(BIO *bio) {
SV* sv = (SV *)BIO_get_callback_arg(bio);
/* Illegal utf-8 in the string */
if (!sv_utf8_decode(sv)) {
STRLEN len;
SV *nsv = newSVpvn("", 0);
const U8* start = (U8 *) SvPV(sv, len);
const U8* end = start + len;
const U8* cur;
while ((start < end) && !is_utf8_string_loclen(start, len, &cur, 0)) {
sv_catpvn(nsv, (const char*)start, (cur - start) + 1); /* text that was ok */
sv_catpvn(nsv, (const char*)utf8_substitute_char, 3); /* insert \x{fffd} */
start = cur + 1;
len = end - cur;
}
if (start < end) {
sv_catpvn(nsv, (const char*)start, (cur - start) - 1); /* rest of the string */
}
sv_copypv(sv, nsv);
SvREFCNT_dec(nsv);
sv_utf8_decode(sv); /* should be ok now */
}
return sv;
}
/*
static void sv_bio_error(BIO *bio) {
SV* sv = (SV *)BIO_get_callback_arg(bio);
( run in 1.668 second using v1.01-cache-2.11-cpan-39bf76dae61 )