Crypt-JWS
view release on metacpan or search on metacpan
include/cjws/cjws_compat.h view on Meta::CPAN
static int cjws_pkey_get_ec(EVP_PKEY *pkey, int *bits, BIGNUM **x, BIGNUM **y) {
char group[64];
*x = *y = NULL;
if (EVP_PKEY_get_utf8_string_param(pkey, OSSL_PKEY_PARAM_GROUP_NAME,
group, sizeof group, NULL) != 1)
return 0;
if (strcmp(group, "prime256v1") == 0 || strcmp(group, "P-256") == 0)
*bits = 256;
else if (strcmp(group, "secp384r1") == 0 || strcmp(group, "P-384") == 0)
*bits = 384;
else if (strcmp(group, "secp521r1") == 0 || strcmp(group, "P-521") == 0)
*bits = 521;
else return 0;
if (EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_EC_PUB_X, x) != 1) return 0;
if (EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_EC_PUB_Y, y) != 1) {
BN_free(*x); *x = NULL;
return 0;
}
return 1;
}
#else /* CJWS_HAVE_SET0: OpenSSL 1.1 struct API */
static EVP_PKEY *cjws_pkey_from_rsa(const BIGNUM *n, const BIGNUM *e,
const BIGNUM *d) {
RSA *rsa = RSA_new();
EVP_PKEY *pkey = NULL;
BIGNUM *nn, *ee, *dd = NULL;
if (!rsa) return NULL;
nn = BN_dup(n);
ee = BN_dup(e);
if (d) dd = BN_dup(d);
if (!nn || !ee || (d && !dd)
|| RSA_set0_key(rsa, nn, ee, dd) != 1) {
BN_free(nn); BN_free(ee); BN_free(dd);
RSA_free(rsa);
return NULL;
}
pkey = EVP_PKEY_new();
if (!pkey || EVP_PKEY_assign_RSA(pkey, rsa) != 1) {
EVP_PKEY_free(pkey);
RSA_free(rsa);
return NULL;
}
return pkey;
}
static EVP_PKEY *cjws_pkey_from_ec(int bits, const BIGNUM *x, const BIGNUM *y,
const BIGNUM *d) {
int nid = cjws_curve_nid(bits);
EC_KEY *ec;
EVP_PKEY *pkey = NULL;
if (nid == NID_undef) return NULL;
ec = EC_KEY_new_by_curve_name(nid);
if (!ec) return NULL;
if (EC_KEY_set_public_key_affine_coordinates(ec, (BIGNUM *)x,
(BIGNUM *)y) != 1) {
EC_KEY_free(ec);
return NULL;
}
if (d && EC_KEY_set_private_key(ec, d) != 1) {
EC_KEY_free(ec);
return NULL;
}
pkey = EVP_PKEY_new();
if (!pkey || EVP_PKEY_assign_EC_KEY(pkey, ec) != 1) {
EVP_PKEY_free(pkey);
EC_KEY_free(ec);
return NULL;
}
return pkey;
}
static int cjws_pkey_get_rsa(EVP_PKEY *pkey, BIGNUM **n, BIGNUM **e) {
const RSA *rsa = EVP_PKEY_get0_RSA(pkey);
const BIGNUM *cn, *ce;
*n = *e = NULL;
if (!rsa) return 0;
RSA_get0_key(rsa, &cn, &ce, NULL);
if (!cn || !ce) return 0;
*n = BN_dup(cn);
*e = BN_dup(ce);
if (!*n || !*e) {
BN_free(*n); BN_free(*e);
*n = *e = NULL;
return 0;
}
return 1;
}
static int cjws_pkey_get_ec(EVP_PKEY *pkey, int *bits, BIGNUM **x, BIGNUM **y) {
const EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
const EC_GROUP *grp;
const EC_POINT *pt;
BN_CTX *bnctx;
int nid, ok = 0;
*x = *y = NULL;
if (!ec) return 0;
grp = EC_KEY_get0_group(ec);
pt = EC_KEY_get0_public_key(ec);
if (!grp || !pt) return 0;
nid = EC_GROUP_get_curve_name(grp);
if (nid == NID_X9_62_prime256v1) *bits = 256;
else if (nid == NID_secp384r1) *bits = 384;
else if (nid == NID_secp521r1) *bits = 521;
else return 0;
*x = BN_new();
*y = BN_new();
bnctx = BN_CTX_new();
if (*x && *y && bnctx
&& EC_POINT_get_affine_coordinates(grp, pt, *x, *y, bnctx) == 1)
ok = 1;
BN_CTX_free(bnctx);
if (!ok) {
BN_free(*x); BN_free(*y);
*x = *y = NULL;
}
return ok;
}
#endif
( run in 1.149 second using v1.01-cache-2.11-cpan-8dfa8b56332 )