Crypto-Utils

 view release on metacpan or  search on metacpan

ffi/openssl-func.c  view on Meta::CPAN

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

BF_EXPORT size_t rsa_oaep_decrypt(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;
}

BF_EXPORT 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);

  BN_free(priv_bn);

  return priv_hex;
}

BF_EXPORT 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;
}

BF_EXPORT 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;
}

BF_EXPORT 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_free(inf);

  if (pkey == NULL) {
    inf = BIO_new_file(keyfile, "r");
    pkey = PEM_read_bio_PUBKEY(inf, NULL, NULL, NULL);
    BIO_free(inf);
  }

  return pkey;
}

ffi/openssl-func.c  view on Meta::CPAN

  return okm_len;
}

BF_EXPORT unsigned char *ecdh(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);

  EVP_PKEY_CTX_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;
}

BF_EXPORT 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) {
    EVP_PKEY_CTX_free(ctx);
    OPENSSL_free(priv);
    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);
  }

  EVP_PKEY_CTX_free(ctx);
  OPENSSL_free(priv);

  return pkey;
}

BF_EXPORT 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);



( run in 0.500 second using v1.01-cache-2.11-cpan-6aa56a78535 )