static LUA_FUNCTION(openssl_dsa_parse) { DSA* dsa = CHECK_OBJECT(1, DSA, "openssl.rsa"); lua_newtable(L); OPENSSL_PKEY_GET_BN(dsa->p, p); OPENSSL_PKEY_GET_BN(dsa->q, q); OPENSSL_PKEY_GET_BN(dsa->g, g); OPENSSL_PKEY_GET_BN(dsa->priv_key, priv_key); OPENSSL_PKEY_GET_BN(dsa->pub_key, pub_key); return 1; }
static LUA_FUNCTION(openssl_rsa_parse) { const BIGNUM *n = NULL, *e = NULL, *d = NULL; const BIGNUM *p = NULL, *q = NULL; const BIGNUM *dmp1 = NULL, *dmq1 = NULL, *iqmp = NULL; RSA* rsa = CHECK_OBJECT(1, RSA, "openssl.rsa"); RSA_get0_key(rsa, &n, &e, &d); RSA_get0_factors(rsa, &p, &q); RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp); lua_newtable(L); lua_pushinteger(L, RSA_size(rsa)); lua_setfield(L, -2, "size"); lua_pushinteger(L, RSA_bits(rsa)); lua_setfield(L, -2, "bits"); OPENSSL_PKEY_GET_BN(n, n); OPENSSL_PKEY_GET_BN(e, e); OPENSSL_PKEY_GET_BN(d, d); OPENSSL_PKEY_GET_BN(p, p); OPENSSL_PKEY_GET_BN(q, q); OPENSSL_PKEY_GET_BN(dmp1, dmp1); OPENSSL_PKEY_GET_BN(dmq1, dmq1); OPENSSL_PKEY_GET_BN(iqmp, iqmp); return 1; }
static LUA_FUNCTION(openssl_dh_parse) { const BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *pri = NULL; DH* dh = CHECK_OBJECT(1, DH, "openssl.dh"); lua_newtable(L); lua_pushinteger(L, DH_size(dh)); lua_setfield(L, -2, "size"); lua_pushinteger(L, DH_bits(dh)); lua_setfield(L, -2, "bits"); DH_get0_pqg(dh, &p, &q, &g); DH_get0_key(dh, &pub, &pri); OPENSSL_PKEY_GET_BN(p, p); OPENSSL_PKEY_GET_BN(q, q); OPENSSL_PKEY_GET_BN(g, g); OPENSSL_PKEY_GET_BN(pub, priv_key); OPENSSL_PKEY_GET_BN(pri, pub_key); return 1; }
static int openssl_ec_key_parse(lua_State*L) { EC_KEY* ec = CHECK_OBJECT(1, EC_KEY, "openssl.ec_key"); int basic = luaL_opt(L,lua_toboolean, 2, 0); const EC_POINT* point = EC_KEY_get0_public_key(ec); const EC_GROUP* group = EC_KEY_get0_group(ec); const BIGNUM *priv = EC_KEY_get0_private_key(ec); lua_newtable(L); if (basic) { BIGNUM* x = BN_new(); BIGNUM* y = BN_new(); AUXILIAR_SET(L, -1, "enc_flag", EC_KEY_get_enc_flags(ec), integer); AUXILIAR_SET(L, -1, "conv_form", EC_KEY_get_conv_form(ec), integer); AUXILIAR_SET(L, -1, "curve_name", EC_GROUP_get_curve_name(group), integer); AUXILIAR_SETOBJECT(L, BN_dup(priv), "openssl.bn", -1, "d"); if (EC_POINT_get_affine_coordinates_GFp(group, point, x, y, NULL) == 1) { AUXILIAR_SETOBJECT(L, x, "openssl.bn", -1, "x"); AUXILIAR_SETOBJECT(L, y, "openssl.bn", -1, "y"); }; } else { AUXILIAR_SET(L, -1, "enc_flag", EC_KEY_get_enc_flags(ec), integer); AUXILIAR_SET(L, -1, "conv_form", EC_KEY_get_conv_form(ec), integer); point = EC_POINT_dup(point, group); AUXILIAR_SETOBJECT(L, point, "openssl.ec_point", -1, "pub_key"); group = EC_GROUP_dup(group); AUXILIAR_SETOBJECT(L, group, "openssl.ec_group", -1, "group"); OPENSSL_PKEY_GET_BN(priv, priv_key); } return 1; };