From bbf4aa5af2b44069eded0704c6f7b3d926af75c6 Mon Sep 17 00:00:00 2001 From: William Ahern Date: Tue, 26 Feb 2013 19:32:59 -0800 Subject: -n wrap EVP_Sign and EVP_Verify --- openssl.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/openssl.c b/openssl.c index 145deef..bd65533 100644 --- a/openssl.c +++ b/openssl.c @@ -940,6 +940,52 @@ static int pk_setPrivateKey(lua_State *L) { } /* pk_setPrivateKEY() */ +static int pk_sign(lua_State *L) { + EVP_PKEY *key = checksimple(L, 1, PUBKEY_CLASS); + EVP_MD_CTX *md = luaL_checkudata(L, 2, DIGEST_CLASS); + luaL_Buffer B; + unsigned n; + + if (LUAL_BUFFERSIZE < EVP_PKEY_size(key)) + return luaL_error(L, "pubkey:sign: LUAL_BUFFERSIZE(%zu) < EVP_PKEY_size(%zu)", (size_t)LUAL_BUFFERSIZE, (size_t)EVP_PKEY_size(key)); + + luaL_buffinit(L, &B); + n = LUAL_BUFFERSIZE; + + if (!EVP_SignFinal(md, (void *)luaL_prepbuffer(&B), &n, key)) + return throwssl(L, "pubkey:sign"); + + luaL_addsize(&B, n); + luaL_pushresult(&B); + + return 1; +} /* pk_sign() */ + + +static int pk_verify(lua_State *L) { + EVP_PKEY *key = checksimple(L, 1, PUBKEY_CLASS); + size_t len; + const void *sig = luaL_checklstring(L, 2, &len); + EVP_MD_CTX *md = luaL_checkudata(L, 3, DIGEST_CLASS); + + switch (EVP_VerifyFinal(md, sig, len, key)) { + case 0: /* WRONG */ + ERR_clear_error(); + lua_pushboolean(L, 0); + + break; + case 1: /* OK */ + lua_pushboolean(L, 1); + + break; + default: + return throwssl(L, "pubkey:verify"); + } + + return 1; +} /* pk_verify() */ + + static int pk_toPEM(lua_State *L) { EVP_PKEY *key = checksimple(L, 1, PUBKEY_CLASS); int top, i, ok; @@ -1074,6 +1120,8 @@ static const luaL_Reg pk_methods[] = { { "type", &pk_type }, { "setPublicKey", &pk_setPublicKey }, { "setPrivateKey", &pk_setPrivateKey }, + { "sign", &pk_sign }, + { "verify", &pk_verify }, { "toPEM", &pk_toPEM }, { NULL, NULL }, }; -- cgit v1.2.3-55-g6feb