Crypt-OpenSSL-Base-Func

 view release on metacpan or  search on metacpan

Func.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;
}

Func.xs  view on Meta::CPAN

    OSSL_LIB_CTX_free(library_context);

    return okm_len;
}

unsigned char* ecdh_raw(EVP_PKEY *priv, EVP_PKEY *peer_pub, size_t *z_len_ptr)
{
    unsigned char* z=NULL;
    EVP_PKEY_CTX *ctx;

    ctx = EVP_PKEY_CTX_new(priv, NULL);

    EVP_PKEY_derive_init(ctx);
    EVP_PKEY_derive_set_peer(ctx, peer_pub);

    EVP_PKEY_derive(ctx, NULL, z_len_ptr);
    z = OPENSSL_malloc(*z_len_ptr);
    EVP_PKEY_derive(ctx, z, z_len_ptr);

    OPENSSL_free(ctx);

    return z;
}

size_t  calc_ec_pub_from_priv(unsigned char* group_name, BIGNUM* priv_bn, unsigned char** pubkey){
    size_t pubkey_len;
    int nid = OBJ_txt2nid(group_name);
    EC_GROUP *group = EC_GROUP_new_by_curve_name(nid);

    EC_POINT* ec_pub_point = EC_POINT_new(group);
    EC_POINT_mul(group, ec_pub_point, priv_bn, NULL, NULL, NULL);

    pubkey_len =  EC_POINT_point2oct(group, ec_pub_point, POINT_CONVERSION_COMPRESSED, NULL, 0, NULL);
    *pubkey=OPENSSL_malloc(pubkey_len);
    EC_POINT_point2oct(group, ec_pub_point, POINT_CONVERSION_COMPRESSED, *pubkey, pubkey_len, NULL);

    EC_POINT_free(ec_pub_point);
    EC_GROUP_free(group);
    return pubkey_len; 
}


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 0.534 second using v1.01-cache-2.11-cpan-1dc43b0fbd2 )