Crypt-OpenSSL-BaseFunc
view release on metacpan or search on metacpan
BaseFunc.xs view on Meta::CPAN
OSSL_PARAM params[3];
params[0] = OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_PAD_MODE, OSSL_PKEY_RSA_PAD_MODE_OAEP, 0);
params[1]= OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST, digest_name, 0);
params[2] = OSSL_PARAM_construct_end();
ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pub, propq);
EVP_PKEY_encrypt_init_ex(ctx, params);
EVP_PKEY_encrypt(ctx, NULL, &out_len, in, in_len);
*out = OPENSSL_zalloc(out_len);
if( EVP_PKEY_encrypt(ctx, *out, &out_len, in, in_len) <=0 ){
OPENSSL_free(*out);
out_len = -1;
}
EVP_PKEY_CTX_free(ctx);
return out_len;
}
size_t rsa_oaep_decrypt_raw(unsigned char *digest_name, EVP_PKEY *priv, unsigned char* in, size_t in_len, unsigned char ** out)
{
int ret=0;
OSSL_LIB_CTX *libctx=NULL;
EVP_PKEY_CTX *ctx = NULL;
char *propq = NULL;
size_t out_len;
OSSL_PARAM params[3];
params[0] = OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_PAD_MODE, OSSL_PKEY_RSA_PAD_MODE_OAEP, 0);
params[1]= OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST, digest_name, 0);
params[2] = OSSL_PARAM_construct_end();
ctx = EVP_PKEY_CTX_new_from_pkey(libctx, priv, propq);
EVP_PKEY_decrypt_init_ex(ctx, params);
EVP_PKEY_decrypt(ctx, NULL, &out_len, in, in_len);
*out = OPENSSL_zalloc(out_len);
if( EVP_PKEY_decrypt(ctx, *out, &out_len, in, in_len) <=0 ){
OPENSSL_free(*out);
out_len = -1;
}
EVP_PKEY_CTX_free(ctx);
return out_len;
}
unsigned char* read_key(EVP_PKEY *pkey)
{
BIGNUM *priv_bn = NULL;
char* priv_hex = NULL;
char* priv = NULL;
size_t priv_len=0;
EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_PRIV_KEY, &priv_bn);
if(priv_bn==NULL){
EVP_PKEY_get_raw_private_key(pkey, NULL, &priv_len);
priv = OPENSSL_malloc(priv_len);
EVP_PKEY_get_raw_private_key(pkey, priv, &priv_len);
priv_bn = BN_bin2bn(priv, priv_len, NULL);
OPENSSL_free(priv);
}
priv_hex = BN_bn2hex(priv_bn);
OPENSSL_free(priv_bn);
return priv_hex;
}
EVP_PKEY* read_key_from_der(unsigned char* keyfile)
{
EVP_PKEY *pkey = NULL;
/*BIO *inf=NULL;*/
/*inf = BIO_new_file(keyfile, "r");*/
/*pkey = d2i_PrivateKey_bio(inf, &pkey);*/
/*BIO_set_close(inf, BIO_CLOSE);*/
FILE *inf = NULL;
inf = fopen(keyfile, "r");
pkey = d2i_PrivateKey_fp(inf, &pkey);
fclose(inf);
return pkey;
}
EVP_PKEY* read_pubkey_from_der(unsigned char* keyfile)
{
EVP_PKEY *pkey = NULL;
unsigned char *buf = NULL;
size_t buf_len = slurp(keyfile, &buf);
d2i_PUBKEY(&pkey, (const unsigned char **) &buf, buf_len);
return pkey;
}
EVP_PKEY* read_key_from_pem(unsigned char* keyfile)
{
EVP_PKEY *pkey = NULL;
BIO *inf=NULL;
inf = BIO_new_file(keyfile, "r");
pkey = PEM_read_bio_PrivateKey(inf, NULL, NULL, NULL);
BIO_set_close(inf, BIO_CLOSE);
return pkey;
}
BaseFunc.xs view on Meta::CPAN
}
EC_POINT * gen_ec_point(unsigned char *group_name,
BIGNUM *x_bn, BIGNUM *y_bn, int clear_cofactor_flag
//unsigned char* x, size_t x_len, unsigned char *y, size_t y_len
)
{
int nid = OBJ_txt2nid(group_name);
EC_GROUP *group = EC_GROUP_new_by_curve_name(nid);
BN_CTX *ctx = BN_CTX_new();
EC_POINT *Q = EC_POINT_new(group);
//BIGNUM *x_bn = BN_bin2bn(x, x_len, NULL);
//BIGNUM *y_bn = BN_bin2bn(y, y_len, NULL);
EC_POINT_set_affine_coordinates( group, Q, x_bn, y_bn, ctx );
if(clear_cofactor_flag){
EC_POINT *P = EC_POINT_new(group);
clear_cofactor(group, P, Q, ctx);
OPENSSL_free(Q);
Q = P;
}
//printf("point2hex::: %s\n", EC_POINT_point2hex(group, Q, 4, ctx));
OPENSSL_free(group);
OPENSSL_free(ctx);
//OPENSSL_free(x_bn);
//OPENSSL_free(y_bn);
return Q;
// int EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *p, const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx);
}
EVP_PKEY * gen_ec_key(unsigned char *group_name, unsigned char* priv_hex)
{
int nid;
EVP_PKEY_CTX *ctx=NULL;
EVP_PKEY *pkey = NULL;
OSSL_PARAM params[4];
OSSL_PARAM *p = params;
unsigned char* priv=NULL;
size_t priv_len;
BIGNUM *priv_bn = NULL;
nid = OBJ_sn2nid(group_name);
priv = OPENSSL_hexstr2buf(priv_hex, &priv_len);
if(priv){
pkey = EVP_PKEY_new_raw_private_key(nid, NULL, priv, priv_len);
}else{
ctx = EVP_PKEY_CTX_new_id(nid, NULL);
if(ctx){
EVP_PKEY_keygen_init(ctx);
EVP_PKEY_keygen(ctx, &pkey);
}
}
if(pkey)
return pkey;
*p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME, group_name, 0);
if(priv){
BN_hex2bn(&priv_bn, priv_hex);
BN_bn2nativepad(priv_bn, priv, priv_len);
*p++ = OSSL_PARAM_construct_BN(OSSL_PKEY_PARAM_PRIV_KEY, priv, priv_len);
size_t pubkey_len;
unsigned char* pubkey;
pubkey_len = calc_ec_pub_from_priv(group_name, priv_bn, &pubkey);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_PUB_KEY, pubkey, pubkey_len);
BN_free(priv_bn);
}
*p = OSSL_PARAM_construct_end();
ctx = EVP_PKEY_CTX_new_from_name(NULL, "EC",NULL);
if(priv){
EVP_PKEY_fromdata_init(ctx);
EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_KEYPAIR, params);
}else{
EVP_PKEY_keygen_init(ctx);
EVP_PKEY_CTX_set_params(ctx, params);
EVP_PKEY_keygen(ctx, &pkey);
}
OPENSSL_free(ctx);
OPENSSL_free(priv);
return pkey;
}
EVP_PKEY * gen_ec_pubkey(unsigned char *group_name, unsigned char* point_hex)
{
unsigned char *point;
size_t point_len;
int nid;
EVP_PKEY *pkey = NULL;
EVP_PKEY_CTX* pctx = NULL;
point = OPENSSL_hexstr2buf(point_hex, &point_len);
nid = OBJ_txt2nid(group_name);
pctx = EVP_PKEY_CTX_new_id(nid, NULL);
if(!pctx){
( run in 1.026 second using v1.01-cache-2.11-cpan-39bf76dae61 )