Net-DNS-SEC
view release on metacpan or search on metacpan
UNUSED(e1_SV); UNUSED(e2_SV); UNUSED(c_SV); /* suppress unused variable warnings */
#else
RETVAL = NULL;
checkerr( OSSL_PARAM_BLD_push_BN( bld, OSSL_PKEY_PARAM_RSA_N, n=SV2BN(n_SV) ) );
checkerr( OSSL_PARAM_BLD_push_BN( bld, OSSL_PKEY_PARAM_RSA_E, e=SV2BN(e_SV) ) );
if ( SvCUR(d_SV) > 0 ) {
checkerr( OSSL_PARAM_BLD_push_BN( bld, OSSL_PKEY_PARAM_RSA_D, d=SV2BN(d_SV) ) );
checkerr( OSSL_PARAM_BLD_push_BN( bld, OSSL_PKEY_PARAM_RSA_FACTOR1, p1=SV2BN(p1_SV) ) );
checkerr( OSSL_PARAM_BLD_push_BN( bld, OSSL_PKEY_PARAM_RSA_FACTOR2, p2=SV2BN(p2_SV) ) );
checkerr( OSSL_PARAM_BLD_push_BN( bld, OSSL_PKEY_PARAM_RSA_EXPONENT1, e1=SV2BN(e1_SV) ) );
checkerr( OSSL_PARAM_BLD_push_BN( bld, OSSL_PKEY_PARAM_RSA_EXPONENT2, e2=SV2BN(e2_SV) ) );
checkerr( OSSL_PARAM_BLD_push_BN( bld, OSSL_PKEY_PARAM_RSA_COEFFICIENT1, c=SV2BN(c_SV) ) );
checkerr( EVP_PKEY_fromparams( ctx, &RETVAL, EVP_PKEY_KEYPAIR, bld ) );
BN_free(d);
BN_free(p1);
BN_free(p2);
BN_free(e1);
BN_free(e2);
BN_free(c);
} else {
checkerr( EVP_PKEY_fromparams( ctx, &RETVAL, EVP_PKEY_PUBLIC_KEY, bld ) );
}
OSSL_PARAM_BLD_free(bld);
EVP_PKEY_CTX_free(ctx);
BN_free(n);
BN_free(e);
#endif
OUTPUT:
RETVAL
#endif
#### ECDSA ####
#ifndef NO_ECDSA
EVP_PKEY*
EVP_PKEY_new_ECDSA(SV *curve, SV *qx_SV, SV *qy_SV=UNDEF )
INIT:
#ifdef API_1_1_1
EC_KEY *eckey = NULL;
BIGNUM *qx, *qy;
#else
EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_name( libctx, "EC", NULL );
OSSL_PARAM_BLD *bld = OSSL_PARAM_BLD_new();
SV *ksv = newSVpvn("\4",1);
BIGNUM *qx;
#endif
char *name = SvPVX(curve);
CODE:
#ifdef API_1_1_1
RETVAL = EVP_PKEY_new();
if ( strcmp(name,"P-256") == 0 ) eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
if ( strcmp(name,"P-384") == 0 ) eckey = EC_KEY_new_by_curve_name(NID_secp384r1);
if ( SvCUR(qy_SV) > 0 ) {
checkerr( EC_KEY_set_public_key_affine_coordinates( eckey, qx=SV2BN(qx_SV), qy=SV2BN(qy_SV) ) );
BN_free(qx);
BN_free(qy);
} else {
checkerr( EC_KEY_set_private_key( eckey, qx=SV2BN(qx_SV) ) );
BN_clear_free(qx);
}
checkerr( EVP_PKEY_assign( RETVAL, EVP_PKEY_EC, (char*)eckey ) );
#else
RETVAL = NULL;
checkerr( OSSL_PARAM_BLD_push_utf8_string( bld, OSSL_PKEY_PARAM_GROUP_NAME, name, 0 ) );
if ( SvCUR(qy_SV) > 0 ) {
sv_catpvn_nomg(ksv, SvPVX(qx_SV), SvCUR(qx_SV));
sv_catpvn_nomg(ksv, SvPVX(qy_SV), SvCUR(qy_SV));
checkerr( OSSL_PARAM_BLD_push_octet_string( bld, OSSL_PKEY_PARAM_PUB_KEY, SvPVX(ksv), SvCUR(ksv) ) );
checkerr( EVP_PKEY_fromparams( ctx, &RETVAL, EVP_PKEY_PUBLIC_KEY, bld ) );
} else {
checkerr( OSSL_PARAM_BLD_push_BN( bld, OSSL_PKEY_PARAM_PRIV_KEY, qx=SV2BN(qx_SV) ) );
checkerr( EVP_PKEY_fromparams( ctx, &RETVAL, EVP_PKEY_KEYPAIR, bld ) );
BN_clear_free(qx);
}
OSSL_PARAM_BLD_free(bld);
EVP_PKEY_CTX_free(ctx);
#endif
OUTPUT:
RETVAL
#endif
#### EdDSA ####
#ifndef NO_EdDSA
EVP_PKEY*
EVP_PKEY_new_EdDSA(SV *curve, SV *public, SV *private=NULL)
INIT:
#ifdef API_1_1_1
char *name = SvPVX(curve);
int nid = 0;
#else
OSSL_PARAM_BLD *bld = OSSL_PARAM_BLD_new();
EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_name( libctx, SvPVX(curve), NULL );
#endif
CODE:
RETVAL = NULL;
#ifdef API_1_1_1
if ( strcmp(name,"ED25519") == 0 ) nid = NID_ED25519;
#ifdef NID_ED448 /* not implemented in BoringSSL & LibreSSL */
if ( strcmp(name,"ED448") == 0 ) nid = NID_ED448;
#endif
if ( private == NULL ) {
RETVAL = EVP_PKEY_new_raw_public_key( nid, NULL, (unsigned char*) SvPVX(public), SvCUR(public) );
} else {
RETVAL = EVP_PKEY_new_raw_private_key( nid, NULL, (unsigned char*) SvPVX(private), SvCUR(private) );
}
#else
if ( private == NULL ) {
checkerr( OSSL_PARAM_BLD_push_octet_string( bld, OSSL_PKEY_PARAM_PUB_KEY, SvPVX(public), SvCUR(public) ) );
checkerr( EVP_PKEY_fromparams( ctx, &RETVAL, EVP_PKEY_PUBLIC_KEY, bld ) );
} else {
checkerr( OSSL_PARAM_BLD_push_octet_string( bld, OSSL_PKEY_PARAM_PRIV_KEY, SvPVX(private), SvCUR(private) ) );
checkerr( EVP_PKEY_fromparams( ctx, &RETVAL, EVP_PKEY_KEYPAIR, bld ) );
}
OSSL_PARAM_BLD_free(bld);
EVP_PKEY_CTX_free(ctx);
#endif
OUTPUT:
RETVAL
#endif
####################
void
checkerr(int ret)
#ifdef croak_memory_wrap
void
croak_memory_wrap()
#endif
#ifdef DEBUG
void
ERR_print_errors(SV *filename)
CODE:
BIO *bio = BIO_new_file( SvPVX(filename), "w" );
ERR_print_errors(bio);
BIO_free(bio);
#endif
####################
( run in 0.517 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )