Annotate

util-src/crypto.c @ 13752:49bbdc22846d 13.0

certmanager: Add more debug logging around cert indexing Currently it's not obvious which directories have been indexed (especially when the resulting index is empty), or why certain files have been skipped.
author Matthew Wild <mwild1@gmail.com>
date Mon, 24 Feb 2025 17:48:58 +0000
parent 13537:fb970df95374
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 /* Prosody IM
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- Copyright (C) 2022 Matthew Wild
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 --
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 -- This project is MIT/X11 licensed. Please see the
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 -- COPYING file in the source package for more information.
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 --
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 /*
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 * crypto.c
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 * Lua library for cryptographic operations using OpenSSL
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 #include <string.h>
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 #include <stdlib.h>
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 #ifdef _MSC_VER
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 typedef unsigned __int32 uint32_t;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 #else
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 #include <inttypes.h>
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 #endif
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 #include "lua.h"
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 #include "lauxlib.h"
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 #include <openssl/crypto.h>
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 #include <openssl/ecdsa.h>
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 #include <openssl/err.h>
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 #include <openssl/evp.h>
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 #include <openssl/obj_mac.h>
13537
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
30 #include <openssl/param_build.h>
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 #include <openssl/pem.h>
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 #if (LUA_VERSION_NUM == 501)
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 #define luaL_setfuncs(L, R, N) luaL_register(L, NULL, R)
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 #endif
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36
12735
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
37 /* The max size of an encoded 'R' or 'S' value. P-521 = 521 bits = 66 bytes */
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
38 #define MAX_ECDSA_SIG_INT_BYTES 66
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
39
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 #include "managed_pointer.h"
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 #define PKEY_MT_TAG "util.crypto key"
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43
12876
0ed24f48b6a6 util.crypto: Preemptively silence 'strict-prototypes' warning
Kim Alvefur <zash@zash.se>
parents: 12837
diff changeset
44 static BIO* new_memory_BIO(void) {
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 return BIO_new(BIO_s_mem());
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 MANAGED_POINTER_ALLOCATOR(new_managed_EVP_MD_CTX, EVP_MD_CTX*, EVP_MD_CTX_new, EVP_MD_CTX_free)
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 MANAGED_POINTER_ALLOCATOR(new_managed_BIO_s_mem, BIO*, new_memory_BIO, BIO_free)
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 MANAGED_POINTER_ALLOCATOR(new_managed_EVP_CIPHER_CTX, EVP_CIPHER_CTX*, EVP_CIPHER_CTX_new, EVP_CIPHER_CTX_free)
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51
12698
999663b4e39d util.crypto: Friendlier error message on incorrect key types
Matthew Wild <mwild1@gmail.com>
parents: 12697
diff changeset
52 #define CRYPTO_KEY_TYPE_ERR "unexpected key type: got '%s', expected '%s'"
999663b4e39d util.crypto: Friendlier error message on incorrect key types
Matthew Wild <mwild1@gmail.com>
parents: 12697
diff changeset
53
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 static EVP_PKEY* pkey_from_arg(lua_State *L, int idx, const int type, const int require_private) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 EVP_PKEY *pkey = *(EVP_PKEY**)luaL_checkudata(L, idx, PKEY_MT_TAG);
12697
916871447b2f util.crypto: Add support for RSA signatures (PKCS1-v1.5 + PSS)
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
56 int got_type;
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 if(type || require_private) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 lua_getuservalue(L, idx);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 if(type != 0) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 lua_getfield(L, -1, "type");
12697
916871447b2f util.crypto: Add support for RSA signatures (PKCS1-v1.5 + PSS)
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
61 got_type = lua_tointeger(L, -1);
916871447b2f util.crypto: Add support for RSA signatures (PKCS1-v1.5 + PSS)
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
62 if(got_type != type) {
12698
999663b4e39d util.crypto: Friendlier error message on incorrect key types
Matthew Wild <mwild1@gmail.com>
parents: 12697
diff changeset
63 const char *got_key_type_name = OBJ_nid2sn(got_type);
999663b4e39d util.crypto: Friendlier error message on incorrect key types
Matthew Wild <mwild1@gmail.com>
parents: 12697
diff changeset
64 const char *want_key_type_name = OBJ_nid2sn(type);
999663b4e39d util.crypto: Friendlier error message on incorrect key types
Matthew Wild <mwild1@gmail.com>
parents: 12697
diff changeset
65 lua_pushfstring(L, CRYPTO_KEY_TYPE_ERR, got_key_type_name, want_key_type_name);
999663b4e39d util.crypto: Friendlier error message on incorrect key types
Matthew Wild <mwild1@gmail.com>
parents: 12697
diff changeset
66 luaL_argerror(L, idx, lua_tostring(L, -1));
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 lua_pop(L, 1);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 if(require_private != 0) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 lua_getfield(L, -1, "private");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 if(lua_toboolean(L, -1) != 1) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 luaL_argerror(L, idx, "private key expected, got public key only");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 lua_pop(L, 1);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 lua_pop(L, 1);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 return pkey;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 static int Lpkey_finalizer(lua_State *L) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 EVP_PKEY *pkey = pkey_from_arg(L, 1, 0, 0);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 EVP_PKEY_free(pkey);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 return 0;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 static int Lpkey_meth_get_type(lua_State *L) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 EVP_PKEY *pkey = pkey_from_arg(L, 1, 0, 0);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 int key_type = EVP_PKEY_id(pkey);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 lua_pushstring(L, OBJ_nid2sn(key_type));
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95
13537
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
96 static int Lpkey_meth_derive(lua_State *L) {
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
97 size_t outlen;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
98 EVP_PKEY *key = pkey_from_arg(L, 1, 0, 0);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
99 EVP_PKEY *peer = pkey_from_arg(L, 2, 0, 0);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
100 EVP_PKEY_CTX *ctx;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
101 BUF_MEM *buf;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
102 BIO *bio = new_managed_BIO_s_mem(L);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
103 BIO_get_mem_ptr(bio, &buf);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
104 if (!(ctx = EVP_PKEY_CTX_new(key, NULL)))
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
105 goto sslerr;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
106 if (EVP_PKEY_derive_init(ctx) <= 0)
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
107 goto sslerr;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
108 if (EVP_PKEY_derive_set_peer(ctx, peer) <= 0)
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
109 goto sslerr;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
110 if (EVP_PKEY_derive(ctx, NULL, &outlen) <= 0)
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
111 goto sslerr;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
112 if (!BUF_MEM_grow_clean(buf, outlen))
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
113 goto sslerr;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
114 if (EVP_PKEY_derive(ctx, (unsigned char*)buf->data, &outlen) <= 0)
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
115 goto sslerr;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
116 EVP_PKEY_CTX_free(ctx);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
117 ctx = NULL;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
118 lua_pushlstring(L, buf->data, outlen);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
119 BIO_reset(bio);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
120 return 1;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
121 sslerr:
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
122 if (ctx) {
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
123 EVP_PKEY_CTX_free(ctx);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
124 ctx = NULL;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
125 }
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
126 BIO_reset(bio);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
127 return luaL_error(L, "pkey:derive failed");
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
128 }
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
129
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 static int base_evp_sign(lua_State *L, const int key_type, const EVP_MD *digest_type) {
12697
916871447b2f util.crypto: Add support for RSA signatures (PKCS1-v1.5 + PSS)
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
131 EVP_PKEY *pkey = pkey_from_arg(L, 1, (key_type!=NID_rsassaPss)?key_type:NID_rsaEncryption, 1);
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 luaL_Buffer sigbuf;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 size_t msg_len;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 const unsigned char* msg = (unsigned char*)lua_tolstring(L, 2, &msg_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 size_t sig_len;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 unsigned char *sig = NULL;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 EVP_MD_CTX *md_ctx = new_managed_EVP_MD_CTX(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 if(EVP_DigestSignInit(md_ctx, NULL, digest_type, NULL, pkey) != 1) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144 }
12697
916871447b2f util.crypto: Add support for RSA signatures (PKCS1-v1.5 + PSS)
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
145 if(key_type == NID_rsassaPss) {
916871447b2f util.crypto: Add support for RSA signatures (PKCS1-v1.5 + PSS)
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
146 EVP_PKEY_CTX_set_rsa_padding(EVP_MD_CTX_pkey_ctx(md_ctx), RSA_PKCS1_PSS_PADDING);
916871447b2f util.crypto: Add support for RSA signatures (PKCS1-v1.5 + PSS)
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
147 }
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 if(EVP_DigestSign(md_ctx, NULL, &sig_len, msg, msg_len) != 1) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153 // COMPAT w/ Lua 5.1
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 luaL_buffinit(L, &sigbuf);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 sig = memset(luaL_prepbuffer(&sigbuf), 0, sig_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157 if(EVP_DigestSign(md_ctx, sig, &sig_len, msg, msg_len) != 1) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 else {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 luaL_addsize(&sigbuf, sig_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 luaL_pushresult(&sigbuf);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 static int base_evp_verify(lua_State *L, const int key_type, const EVP_MD *digest_type) {
12697
916871447b2f util.crypto: Add support for RSA signatures (PKCS1-v1.5 + PSS)
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
170 EVP_PKEY *pkey = pkey_from_arg(L, 1, (key_type!=NID_rsassaPss)?key_type:NID_rsaEncryption, 0);
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 size_t msg_len;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 const unsigned char *msg = (unsigned char*)luaL_checklstring(L, 2, &msg_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 size_t sig_len;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 const unsigned char *sig = (unsigned char*)luaL_checklstring(L, 3, &sig_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 if(EVP_DigestVerifyInit(md_ctx, NULL, digest_type, NULL, pkey) != 1) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 goto cleanup;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 }
12697
916871447b2f util.crypto: Add support for RSA signatures (PKCS1-v1.5 + PSS)
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
184 if(key_type == NID_rsassaPss) {
916871447b2f util.crypto: Add support for RSA signatures (PKCS1-v1.5 + PSS)
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
185 EVP_PKEY_CTX_set_rsa_padding(EVP_MD_CTX_pkey_ctx(md_ctx), RSA_PKCS1_PSS_PADDING);
916871447b2f util.crypto: Add support for RSA signatures (PKCS1-v1.5 + PSS)
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
186 }
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187 int result = EVP_DigestVerify(md_ctx, sig, sig_len, msg, msg_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
188 if(result == 0) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
189 lua_pushboolean(L, 0);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 } else if(result != 1) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 else {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 lua_pushboolean(L, 1);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 cleanup:
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 EVP_MD_CTX_free(md_ctx);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200
13537
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
201 static int Lpkey_meth_public_raw(lua_State *L) {
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
202 OSSL_PARAM *params;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
203 EVP_PKEY *pkey = pkey_from_arg(L, 1, 0, 0);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
204
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
205 if (EVP_PKEY_todata(pkey, EVP_PKEY_PUBLIC_KEY, &params)) {
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
206 OSSL_PARAM *item = params;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
207 while (item->key) {
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
208 if (!strcmp("pub", item->key)) {
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
209 lua_pushlstring(L, item->data, item->data_size);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
210 break;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
211 }
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
212 item++;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
213 }
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
214 if (!item->key) lua_pushnil(L);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
215 OSSL_PARAM_free(params);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
216 } else {
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
217 lua_pushnil(L);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
218 }
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
219
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
220 return 1;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
221 }
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
222
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 static int Lpkey_meth_public_pem(lua_State *L) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224 char *data;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 size_t bytes;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 EVP_PKEY *pkey = pkey_from_arg(L, 1, 0, 0);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227 BIO *bio = new_managed_BIO_s_mem(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228 if(PEM_write_bio_PUBKEY(bio, pkey)) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229 bytes = BIO_get_mem_data(bio, &data);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
230 if (bytes > 0) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 lua_pushlstring(L, data, bytes);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 else {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 else {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 static int Lpkey_meth_private_pem(lua_State *L) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 char *data;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 size_t bytes;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 EVP_PKEY *pkey = pkey_from_arg(L, 1, 0, 1);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247 BIO *bio = new_managed_BIO_s_mem(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249 if(PEM_write_bio_PrivateKey(bio, pkey, NULL, NULL, 0, NULL, NULL)) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 bytes = BIO_get_mem_data(bio, &data);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251 if (bytes > 0) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252 lua_pushlstring(L, data, bytes);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 else {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 else {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264 static int push_pkey(lua_State *L, EVP_PKEY *pkey, const int type, const int privkey) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 EVP_PKEY **ud = lua_newuserdata(L, sizeof(EVP_PKEY*));
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 *ud = pkey;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267 luaL_newmetatable(L, PKEY_MT_TAG);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
268 lua_setmetatable(L, -2);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 /* Set some info about the key and attach it as a user value */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271 lua_newtable(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 if(type != 0) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273 lua_pushinteger(L, type);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 lua_setfield(L, -2, "type");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 if(privkey != 0) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277 lua_pushboolean(L, 1);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
278 lua_setfield(L, -2, "private");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
279 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 lua_setuservalue(L, -2);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
282 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284 static int Lgenerate_ed25519_keypair(lua_State *L) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
285 EVP_PKEY *pkey = NULL;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286 EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_ED25519, NULL);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288 /* Generate key */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
289 EVP_PKEY_keygen_init(pctx);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
290 EVP_PKEY_keygen(pctx, &pkey);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
291 EVP_PKEY_CTX_free(pctx);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 push_pkey(L, pkey, NID_ED25519, 1);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
294 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
295 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296
13537
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
297 static int Lgenerate_p256_keypair(lua_State *L) {
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
298 EVP_PKEY *pkey = NULL;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
299 EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
300
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
301 /* Generate key */
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
302 if (EVP_PKEY_keygen_init(pctx) <= 0) goto err;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
303 if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, NID_X9_62_prime256v1) <= 0) goto err;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
304 if (EVP_PKEY_keygen(pctx, &pkey) <= 0) goto err;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
305 EVP_PKEY_CTX_free(pctx);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
306
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
307 push_pkey(L, pkey, NID_X9_62_prime256v1, 1);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
308 return 1;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
309
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
310 err:
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
311 if (pctx) EVP_PKEY_CTX_free(pctx);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
312 lua_pushnil(L);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
313 return 1;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
314 }
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
315
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316 static int Limport_private_pem(lua_State *L) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
317 EVP_PKEY *pkey = NULL;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
319 size_t privkey_bytes;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
320 const char* privkey_data;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 BIO *bio = new_managed_BIO_s_mem(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323 privkey_data = luaL_checklstring(L, 1, &privkey_bytes);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324 BIO_write(bio, privkey_data, privkey_bytes);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 if (pkey) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 push_pkey(L, pkey, EVP_PKEY_id(pkey), 1);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
328 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 else {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
335
13537
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
336 static int Limport_public_ec_raw(lua_State *L) {
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
337 OSSL_PARAM_BLD *param_bld = NULL;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
338 OSSL_PARAM *params = NULL;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
339 EVP_PKEY_CTX *ctx = NULL;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
340 EVP_PKEY *pkey = NULL;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
341
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
342 size_t pubkey_bytes;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
343 const char* pubkey_data = luaL_checklstring(L, 1, &pubkey_bytes);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
344 const char* curve = luaL_checkstring(L, 2);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
345
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
346 param_bld = OSSL_PARAM_BLD_new();
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
347 if (!param_bld) goto err;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
348 if (!OSSL_PARAM_BLD_push_utf8_string(param_bld, "group", curve, 0)) goto err;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
349 if (!OSSL_PARAM_BLD_push_octet_string(param_bld, "pub", pubkey_data, pubkey_bytes)) goto err;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
350 params = OSSL_PARAM_BLD_to_param(param_bld);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
351 if (!params) goto err;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
352 ctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
353 if (!ctx) goto err;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
354 if (!EVP_PKEY_fromdata_init(ctx)) goto err;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
355 if (EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_PUBLIC_KEY, params) <= 0) goto err;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
356
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
357 push_pkey(L, pkey, EVP_PKEY_id(pkey), 0);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
358
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
359 EVP_PKEY_CTX_free(ctx);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
360 OSSL_PARAM_free(params);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
361 OSSL_PARAM_BLD_free(param_bld);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
362
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
363 return 1;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
364 err:
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
365 if (ctx) EVP_PKEY_CTX_free(ctx);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
366 if (params) OSSL_PARAM_free(params);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
367 if (param_bld) OSSL_PARAM_BLD_free(param_bld);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
368 lua_pushnil(L);
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
369 return 1;
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
370 }
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
371
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
372 static int Limport_public_pem(lua_State *L) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
373 EVP_PKEY *pkey = NULL;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
374
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
375 size_t pubkey_bytes;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
376 const char* pubkey_data;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
377 BIO *bio = new_managed_BIO_s_mem(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
378
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
379 pubkey_data = luaL_checklstring(L, 1, &pubkey_bytes);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 BIO_write(bio, pubkey_data, pubkey_bytes);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
381 pkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
382 if (pkey) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
383 push_pkey(L, pkey, EVP_PKEY_id(pkey), 0);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385 else {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
386 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
387 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
388
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
389 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
390 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
391
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
392 static int Led25519_sign(lua_State *L) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
393 return base_evp_sign(L, NID_ED25519, NULL);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
394 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
395
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
396 static int Led25519_verify(lua_State *L) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
397 return base_evp_verify(L, NID_ED25519, NULL);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
398 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
399
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
400 /* encrypt(key, iv, plaintext) */
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
401 static int Levp_encrypt(lua_State *L, const EVP_CIPHER *cipher, const unsigned char expected_key_len, const unsigned char expected_iv_len, const size_t tag_len) {
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
402 EVP_CIPHER_CTX *ctx;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
403 luaL_Buffer ciphertext_buffer;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
404
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
405 size_t key_len, iv_len, plaintext_len;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
406 int ciphertext_len, final_len;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
407
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
408 const unsigned char *key = (unsigned char*)luaL_checklstring(L, 1, &key_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
409 const unsigned char *iv = (unsigned char*)luaL_checklstring(L, 2, &iv_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
410 const unsigned char *plaintext = (unsigned char*)luaL_checklstring(L, 3, &plaintext_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
411
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
412 if(key_len != expected_key_len) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
413 return luaL_error(L, "key must be %d bytes", expected_key_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
414 }
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
415 if(iv_len != expected_iv_len) {
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
416 return luaL_error(L, "iv must be %d bytes", expected_iv_len);
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
417 }
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
418 if(lua_gettop(L) > 3) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
419 return luaL_error(L, "Expected 3 arguments, got %d", lua_gettop(L));
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
420 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
421
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
422 // Create and initialise the context
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
423 ctx = new_managed_EVP_CIPHER_CTX(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
424
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
425 // Initialise the encryption operation
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
426 if(1 != EVP_EncryptInit_ex(ctx, cipher, NULL, NULL, NULL)) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
427 return luaL_error(L, "Error while initializing encryption engine");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
428 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
429
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
430 // Initialise key and IV
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
431 if(1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv)) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
432 return luaL_error(L, "Error while initializing key/iv");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
433 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
434
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
435 luaL_buffinit(L, &ciphertext_buffer);
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
436 unsigned char *ciphertext = (unsigned char*)luaL_prepbuffsize(&ciphertext_buffer, plaintext_len+tag_len);
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
437
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
438 if(1 != EVP_EncryptUpdate(ctx, ciphertext, &ciphertext_len, plaintext, plaintext_len)) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
439 return luaL_error(L, "Error while encrypting data");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
440 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
441
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
442 /*
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
443 * Finalise the encryption. Normally ciphertext bytes may be written at
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
444 * this stage, but this does not occur in GCM mode
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
445 */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
446 if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + ciphertext_len, &final_len)) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
447 return luaL_error(L, "Error while encrypting final data");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
448 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
449 if(final_len != 0) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
450 return luaL_error(L, "Non-zero final data");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
451 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
452
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
453 if(tag_len > 0) {
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
454 /* Get the tag */
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
455 if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, ciphertext + ciphertext_len)) {
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
456 return luaL_error(L, "Unable to read AEAD tag of encrypted data");
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
457 }
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
458 /* Append tag */
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
459 luaL_addsize(&ciphertext_buffer, ciphertext_len + tag_len);
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
460 } else {
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
461 luaL_addsize(&ciphertext_buffer, ciphertext_len);
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
462 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
463 luaL_pushresult(&ciphertext_buffer);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
464
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
465 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
466 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
467
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
468 static int Laes_128_gcm_encrypt(lua_State *L) {
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
469 return Levp_encrypt(L, EVP_aes_128_gcm(), 16, 12, 16);
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
470 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
471
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
472 static int Laes_256_gcm_encrypt(lua_State *L) {
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
473 return Levp_encrypt(L, EVP_aes_256_gcm(), 32, 12, 16);
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
474 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
475
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
476 static int Laes_256_ctr_encrypt(lua_State *L) {
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
477 return Levp_encrypt(L, EVP_aes_256_ctr(), 32, 16, 0);
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
478 }
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
479
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
480 /* decrypt(key, iv, ciphertext) */
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
481 static int Levp_decrypt(lua_State *L, const EVP_CIPHER *cipher, const unsigned char expected_key_len, const unsigned char expected_iv_len, const size_t tag_len) {
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
482 EVP_CIPHER_CTX *ctx;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
483 luaL_Buffer plaintext_buffer;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
484
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
485 size_t key_len, iv_len, ciphertext_len;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
486 int plaintext_len, final_len;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
487
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
488 const unsigned char *key = (unsigned char*)luaL_checklstring(L, 1, &key_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
489 const unsigned char *iv = (unsigned char*)luaL_checklstring(L, 2, &iv_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
490 const unsigned char *ciphertext = (unsigned char*)luaL_checklstring(L, 3, &ciphertext_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
491
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
492 if(key_len != expected_key_len) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
493 return luaL_error(L, "key must be %d bytes", expected_key_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
494 }
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
495 if(iv_len != expected_iv_len) {
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
496 return luaL_error(L, "iv must be %d bytes", expected_iv_len);
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
497 }
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
498 if(ciphertext_len <= tag_len) {
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
499 return luaL_error(L, "ciphertext must be at least %d bytes (including tag)", tag_len);
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
500 }
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
501 if(lua_gettop(L) > 3) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
502 return luaL_error(L, "Expected 3 arguments, got %d", lua_gettop(L));
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
503 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
504
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
505 /* Create and initialise the context */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
506 ctx = new_managed_EVP_CIPHER_CTX(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
507
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
508 /* Initialise the decryption operation. */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
509 if(!EVP_DecryptInit_ex(ctx, cipher, NULL, NULL, NULL)) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
510 return luaL_error(L, "Error while initializing decryption engine");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
511 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
512
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
513 /* Initialise key and IV */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
514 if(!EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv)) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
515 return luaL_error(L, "Error while initializing key/iv");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
516 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
517
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
518 luaL_buffinit(L, &plaintext_buffer);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
519 unsigned char *plaintext = (unsigned char*)luaL_prepbuffsize(&plaintext_buffer, ciphertext_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
520
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
521 /*
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
522 * Provide the message to be decrypted, and obtain the plaintext output.
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
523 * EVP_DecryptUpdate can be called multiple times if necessary
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
524 */
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
525 if(!EVP_DecryptUpdate(ctx, plaintext, &plaintext_len, ciphertext, ciphertext_len-tag_len)) {
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
526 return luaL_error(L, "Error while decrypting data");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
527 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
528
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
529 if(tag_len > 0) {
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
530 /* Set expected tag value. Works in OpenSSL 1.0.1d and later */
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
531 if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, (unsigned char*)ciphertext + (ciphertext_len-tag_len))) {
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
532 return luaL_error(L, "Error while processing authentication tag");
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
533 }
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
534 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
535
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
536 /*
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
537 * Finalise the decryption. A positive return value indicates success,
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
538 * anything else is a failure - the plaintext is not trustworthy.
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
539 */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
540 int ret = EVP_DecryptFinal_ex(ctx, plaintext + plaintext_len, &final_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
541
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
542 if(ret <= 0) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
543 /* Verify failed */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
544 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
545 lua_pushliteral(L, "verify-failed");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
546 return 2;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
547 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
548
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
549 luaL_addsize(&plaintext_buffer, plaintext_len + final_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
550 luaL_pushresult(&plaintext_buffer);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
551 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
552 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
553
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
554 static int Laes_128_gcm_decrypt(lua_State *L) {
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
555 return Levp_decrypt(L, EVP_aes_128_gcm(), 16, 12, 16);
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
556 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
557
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
558 static int Laes_256_gcm_decrypt(lua_State *L) {
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
559 return Levp_decrypt(L, EVP_aes_256_gcm(), 32, 12, 16);
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
560 }
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
561
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
562 static int Laes_256_ctr_decrypt(lua_State *L) {
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
563 return Levp_decrypt(L, EVP_aes_256_ctr(), 32, 16, 0);
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
564 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
565
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
566 /* r, s = parse_ecdsa_sig(sig_der) */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
567 static int Lparse_ecdsa_signature(lua_State *L) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
568 ECDSA_SIG *sig;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
569 size_t sig_der_len;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
570 const unsigned char *sig_der = (unsigned char*)luaL_checklstring(L, 1, &sig_der_len);
12735
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
571 const size_t sig_int_bytes = luaL_checkinteger(L, 2);
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
572 const BIGNUM *r, *s;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
573 int rlen, slen;
12735
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
574 unsigned char rb[MAX_ECDSA_SIG_INT_BYTES];
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
575 unsigned char sb[MAX_ECDSA_SIG_INT_BYTES];
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
576
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
577 if(sig_int_bytes > MAX_ECDSA_SIG_INT_BYTES) {
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
578 luaL_error(L, "requested signature size exceeds supported limit");
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
579 }
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
580
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
581 sig = d2i_ECDSA_SIG(NULL, &sig_der, sig_der_len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
582
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
583 if(sig == NULL) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
584 lua_pushnil(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
585 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
586 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
587
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
588 ECDSA_SIG_get0(sig, &r, &s);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
589
12735
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
590 rlen = BN_bn2binpad(r, rb, sig_int_bytes);
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
591 slen = BN_bn2binpad(s, sb, sig_int_bytes);
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
592
12735
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
593 if (rlen == -1 || slen == -1) {
12714
82bca7191f13 util.crypto: Use stack space buffers
Kim Alvefur <zash@zash.se>
parents: 12702
diff changeset
594 ECDSA_SIG_free(sig);
12735
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
595 luaL_error(L, "encoded integers exceed requested size");
12714
82bca7191f13 util.crypto: Use stack space buffers
Kim Alvefur <zash@zash.se>
parents: 12702
diff changeset
596 }
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
597
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
598 ECDSA_SIG_free(sig);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
599
12714
82bca7191f13 util.crypto: Use stack space buffers
Kim Alvefur <zash@zash.se>
parents: 12702
diff changeset
600 lua_pushlstring(L, (const char*)rb, rlen);
82bca7191f13 util.crypto: Use stack space buffers
Kim Alvefur <zash@zash.se>
parents: 12702
diff changeset
601 lua_pushlstring(L, (const char*)sb, slen);
82bca7191f13 util.crypto: Use stack space buffers
Kim Alvefur <zash@zash.se>
parents: 12702
diff changeset
602
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
603 return 2;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
604 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
605
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
606 /* sig_der = build_ecdsa_signature(r, s) */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
607 static int Lbuild_ecdsa_signature(lua_State *L) {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
608 ECDSA_SIG *sig = ECDSA_SIG_new();
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
609 BIGNUM *r, *s;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
610 luaL_Buffer sigbuf;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
611
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
612 size_t rlen, slen;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
613 const unsigned char *rbin, *sbin;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
614
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
615 rbin = (unsigned char*)luaL_checklstring(L, 1, &rlen);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
616 sbin = (unsigned char*)luaL_checklstring(L, 2, &slen);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
617
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
618 r = BN_bin2bn(rbin, (int)rlen, NULL);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
619 s = BN_bin2bn(sbin, (int)slen, NULL);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
620
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
621 ECDSA_SIG_set0(sig, r, s);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
622
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
623 luaL_buffinit(L, &sigbuf);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
624
12735
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
625 /* DER structure of an ECDSA signature has 7 bytes plus the integers themselves,
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
626 which may gain an extra byte once encoded */
445f7bd6ffc4 util.crypto, util.jwt: Generate consistent signature sizes (via padding)
Matthew Wild <mwild1@gmail.com>
parents: 12715
diff changeset
627 unsigned char *buffer = (unsigned char*)luaL_prepbuffsize(&sigbuf, (rlen+1)+(slen+1)+7);
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
628 int len = i2d_ECDSA_SIG(sig, &buffer);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
629 luaL_addsize(&sigbuf, len);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
630 luaL_pushresult(&sigbuf);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
631
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
632 ECDSA_SIG_free(sig);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
633
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
634 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
635 }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
636
12702
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
637 #define REG_SIGN_VERIFY(algorithm, digest) \
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
638 { #algorithm "_" #digest "_sign", L ## algorithm ## _ ## digest ## _sign },\
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
639 { #algorithm "_" #digest "_verify", L ## algorithm ## _ ## digest ## _verify },
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
640
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
641 #define IMPL_SIGN_VERIFY(algorithm, key_type, digest) \
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
642 static int L ## algorithm ## _ ## digest ## _sign(lua_State *L) { \
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
643 return base_evp_sign(L, key_type, EVP_ ## digest()); \
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
644 } \
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
645 static int L ## algorithm ## _ ## digest ## _verify(lua_State *L) { \
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
646 return base_evp_verify(L, key_type, EVP_ ## digest()); \
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
647 }
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
648
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
649 IMPL_SIGN_VERIFY(ecdsa, NID_X9_62_id_ecPublicKey, sha256)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
650 IMPL_SIGN_VERIFY(ecdsa, NID_X9_62_id_ecPublicKey, sha384)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
651 IMPL_SIGN_VERIFY(ecdsa, NID_X9_62_id_ecPublicKey, sha512)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
652
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
653 IMPL_SIGN_VERIFY(rsassa_pkcs1, NID_rsaEncryption, sha256)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
654 IMPL_SIGN_VERIFY(rsassa_pkcs1, NID_rsaEncryption, sha384)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
655 IMPL_SIGN_VERIFY(rsassa_pkcs1, NID_rsaEncryption, sha512)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
656
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
657 IMPL_SIGN_VERIFY(rsassa_pss, NID_rsassaPss, sha256)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
658 IMPL_SIGN_VERIFY(rsassa_pss, NID_rsassaPss, sha384)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
659 IMPL_SIGN_VERIFY(rsassa_pss, NID_rsassaPss, sha512)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
660
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
661 static const luaL_Reg Reg[] = {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
662 { "ed25519_sign", Led25519_sign },
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
663 { "ed25519_verify", Led25519_verify },
12702
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
664
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
665 REG_SIGN_VERIFY(ecdsa, sha256)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
666 REG_SIGN_VERIFY(ecdsa, sha384)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
667 REG_SIGN_VERIFY(ecdsa, sha512)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
668
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
669 REG_SIGN_VERIFY(rsassa_pkcs1, sha256)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
670 REG_SIGN_VERIFY(rsassa_pkcs1, sha384)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
671 REG_SIGN_VERIFY(rsassa_pkcs1, sha512)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
672
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
673 REG_SIGN_VERIFY(rsassa_pss, sha256)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
674 REG_SIGN_VERIFY(rsassa_pss, sha384)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
675 REG_SIGN_VERIFY(rsassa_pss, sha512)
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
676
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
677 { "aes_128_gcm_encrypt", Laes_128_gcm_encrypt },
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
678 { "aes_128_gcm_decrypt", Laes_128_gcm_decrypt },
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
679 { "aes_256_gcm_encrypt", Laes_256_gcm_encrypt },
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
680 { "aes_256_gcm_decrypt", Laes_256_gcm_decrypt },
12702
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
681
12837
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
682 { "aes_256_ctr_encrypt", Laes_256_ctr_encrypt },
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
683 { "aes_256_ctr_decrypt", Laes_256_ctr_decrypt },
d3ae47d8a7a7 util.crypto: Add support for AES-256-CTR
Matthew Wild <mwild1@gmail.com>
parents: 12735
diff changeset
684
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
685 { "generate_ed25519_keypair", Lgenerate_ed25519_keypair },
13537
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
686 { "generate_p256_keypair", Lgenerate_p256_keypair },
12702
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
687
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
688 { "import_private_pem", Limport_private_pem },
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
689 { "import_public_pem", Limport_public_pem },
13537
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
690 { "import_public_ec_raw", Limport_public_ec_raw },
12702
f63176781940 util.crypto: More digests for sign/verify, use macros for clarity/consistency
Matthew Wild <mwild1@gmail.com>
parents: 12698
diff changeset
691
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
692 { "parse_ecdsa_signature", Lparse_ecdsa_signature },
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
693 { "build_ecdsa_signature", Lbuild_ecdsa_signature },
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
694 { NULL, NULL }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
695 };
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
696
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
697 static const luaL_Reg KeyMethods[] = {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
698 { "private_pem", Lpkey_meth_private_pem },
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
699 { "public_pem", Lpkey_meth_public_pem },
13537
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
700 { "public_raw", Lpkey_meth_public_raw },
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
701 { "get_type", Lpkey_meth_get_type },
13537
fb970df95374 util.crypto: Add more ECC methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 12976
diff changeset
702 { "derive", Lpkey_meth_derive },
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
703 { NULL, NULL }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
704 };
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
705
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
706 static const luaL_Reg KeyMetatable[] = {
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
707 { "__gc", Lpkey_finalizer },
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
708 { NULL, NULL }
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
709 };
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
710
12976
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12876
diff changeset
711 LUALIB_API int luaopen_prosody_util_crypto(lua_State *L) {
12693
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
712 #if (LUA_VERSION_NUM > 501)
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
713 luaL_checkversion(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
714 #endif
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
715
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
716 /* Initialize pkey metatable */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
717 luaL_newmetatable(L, PKEY_MT_TAG);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
718 luaL_setfuncs(L, KeyMetatable, 0);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
719 lua_newtable(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
720 luaL_setfuncs(L, KeyMethods, 0);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
721 lua_setfield(L, -2, "__index");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
722 lua_pop(L, 1);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
723
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
724 /* Initialize lib table */
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
725 lua_newtable(L);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
726 luaL_setfuncs(L, Reg, 0);
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
727 lua_pushliteral(L, "-3.14");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
728 lua_setfield(L, -2, "version");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
729 #ifdef OPENSSL_VERSION
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
730 lua_pushstring(L, OpenSSL_version(OPENSSL_VERSION));
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
731 lua_setfield(L, -2, "_LIBCRYPTO_VERSION");
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
732 #endif
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
733 return 1;
7c5afbdcbc77 util.crypto: New wrapper for some operations in OpenSSL's libcrypto
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
734 }
12976
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12876
diff changeset
735
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12876
diff changeset
736 LUALIB_API int luaopen_util_crypto(lua_State *L) {
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12876
diff changeset
737 return luaopen_prosody_util_crypto(L);
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12876
diff changeset
738 }