diff options
author | daurnimator <quae@daurnimator.com> | 2018-05-28 19:05:29 +1000 |
---|---|---|
committer | daurnimator <quae@daurnimator.com> | 2018-05-28 19:05:29 +1000 |
commit | 0f65d1689618fb2addc98e1271ad3c87be04f462 (patch) | |
tree | 6fa39ec1a4cae772ca8a911a9d1795cd24031597 | |
parent | 90bda23d4930d472b9cbe8c0b41318ef9af57167 (diff) | |
parent | 09402eb482df069d21b07a0c8468824a5efff30a (diff) | |
download | luaossl-0f65d1689618fb2addc98e1271ad3c87be04f462.tar.gz luaossl-0f65d1689618fb2addc98e1271ad3c87be04f462.tar.bz2 luaossl-0f65d1689618fb2addc98e1271ad3c87be04f462.zip |
Merge remote-tracking branch 'daurnimator/bn-mod-functions'
-rw-r--r-- | src/openssl.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/openssl.c b/src/openssl.c index 72c818a..f93b1cf 100644 --- a/src/openssl.c +++ b/src/openssl.c @@ -2805,6 +2805,20 @@ static void bn_prepbop(lua_State *L, BIGNUM **r, BIGNUM **a, BIGNUM **b, _Bool c } /* bn_prepbop() */ +/* prepare numbers at top of stack for ternary operation, and push result object onto stack */ +static void bn_preptop(lua_State *L, BIGNUM **r, BIGNUM **a, BIGNUM **b, BIGNUM **c) { + _Bool a_lvalue, b_lvalue, c_lvalue; + + *a = checkbig(L, 1, &a_lvalue); + *b = checkbig(L, 2, &b_lvalue); + *c = checkbig(L, 3, &c_lvalue); + + bn_push(L); + + *r = *(BIGNUM **)lua_touserdata(L, -1); +} /* bn_preptop() */ + + static int ctx__gc(lua_State *L) { BN_CTX **ctx = lua_touserdata(L, 1); @@ -2953,6 +2967,58 @@ static int bn_nnmod(lua_State *L) { } /* bn_nnmod() */ +static int bn_mod_add(lua_State *L) { + BIGNUM *r, *a, *b, *c; + + lua_settop(L, 3); + bn_preptop(L, &r, &a, &b, &c); + + if (!BN_mod_add(r, a, b, c, getctx(L))) + return auxL_error(L, auxL_EOPENSSL, "bignum:mod_add"); + + return 1; +} /* bn_mod_add() */ + + +static int bn_mod_sub(lua_State *L) { + BIGNUM *r, *a, *b, *c; + + lua_settop(L, 3); + bn_preptop(L, &r, &a, &b, &c); + + if (!BN_mod_sub(r, a, b, c, getctx(L))) + return auxL_error(L, auxL_EOPENSSL, "bignum:mod_sub"); + + return 1; +} /* bn_mod_sub() */ + + +static int bn_mod_mul(lua_State *L) { + BIGNUM *r, *a, *b, *c; + + lua_settop(L, 3); + bn_preptop(L, &r, &a, &b, &c); + + if (!BN_mod_mul(r, a, b, c, getctx(L))) + return auxL_error(L, auxL_EOPENSSL, "bignum:mod_mul"); + + return 1; +} /* bn_mod_mul() */ + + +static int bn_mod_sqr(lua_State *L) { + BIGNUM *r, *a, *b; + + lua_settop(L, 2); + bn_prepbop(L, &r, &a, &b, 0); + + if (!BN_mod_sqr(r, a, b, getctx(L))) + return auxL_error(L, auxL_EOPENSSL, "bignum:mod_sqr"); + + return 1; +} /* bn_mod_sqr() */ + + static int bn__pow(lua_State *L) { BIGNUM *r, *a, *b; @@ -2966,6 +3032,19 @@ static int bn__pow(lua_State *L) { } /* bn__pow() */ +static int bn_mod_exp(lua_State *L) { + BIGNUM *r, *a, *b, *c; + + lua_settop(L, 3); + bn_preptop(L, &r, &a, &b, &c); + + if (!BN_mod_exp(r, a, b, c, getctx(L))) + return auxL_error(L, auxL_EOPENSSL, "bignum:mod_exp"); + + return 1; +} /* bn_mod_exp() */ + + static int bn_gcd(lua_State *L) { BIGNUM *r, *a, *b; @@ -3159,7 +3238,12 @@ static const auxL_Reg bn_methods[] = { { "idiv", &bn__idiv }, { "mod", &bn__mod }, { "nnmod", &bn_nnmod }, + { "mod_add", &bn_mod_add }, + { "mod_sub", &bn_mod_sub }, + { "mod_mul", &bn_mod_mul }, + { "mod_sqr", &bn_mod_sqr }, { "exp", &bn__pow }, + { "mod_exp", &bn_mod_exp }, { "gcd", &bn_gcd }, { "lshift", &bn__shl }, { "rshift", &bn__shr }, |