aboutsummaryrefslogtreecommitdiffstats
path: root/openssl.c
diff options
context:
space:
mode:
authorLibravatarLibravatar William Ahern <william@server.local> 2013-02-26 19:32:59 -0800
committerLibravatarLibravatar William Ahern <william@server.local> 2013-02-26 19:32:59 -0800
commitbbf4aa5af2b44069eded0704c6f7b3d926af75c6 (patch)
tree49a77157d02332e1703a9ccab184c1fc6d2b8a19 /openssl.c
parent03f20058472fab1d81b9a3f694457b090ab8e9d0 (diff)
downloadluaossl-bbf4aa5af2b44069eded0704c6f7b3d926af75c6.tar.gz
luaossl-bbf4aa5af2b44069eded0704c6f7b3d926af75c6.tar.bz2
luaossl-bbf4aa5af2b44069eded0704c6f7b3d926af75c6.zip
-n
wrap EVP_Sign and EVP_Verify
Diffstat (limited to 'openssl.c')
-rw-r--r--openssl.c48
1 files changed, 48 insertions, 0 deletions
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 },
};