aboutsummaryrefslogtreecommitdiffstats
path: root/main/lua-ossl/0008-pkey.new-decryption.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/lua-ossl/0008-pkey.new-decryption.patch')
-rw-r--r--main/lua-ossl/0008-pkey.new-decryption.patch99
1 files changed, 99 insertions, 0 deletions
diff --git a/main/lua-ossl/0008-pkey.new-decryption.patch b/main/lua-ossl/0008-pkey.new-decryption.patch
new file mode 100644
index 0000000000..e143fd0492
--- /dev/null
+++ b/main/lua-ossl/0008-pkey.new-decryption.patch
@@ -0,0 +1,99 @@
+From 132ac48cea935829c31f873aaab920a940bc6b98 Mon Sep 17 00:00:00 2001
+From: Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>
+Date: Mon, 30 Apr 2018 13:49:57 +0300
+Subject: [PATCH 08/10] pkey.new: decryption
+
+---
+ src/openssl.c | 32 +++++++++++++++++++++++++-------
+ 1 file changed, 25 insertions(+), 7 deletions(-)
+
+diff --git a/src/openssl.c b/src/openssl.c
+index 2aaa5d8..937ffa6 100644
+--- a/src/openssl.c
++++ b/src/openssl.c
+@@ -31,7 +31,7 @@
+
+ #include <limits.h> /* INT_MAX INT_MIN LLONG_MAX LLONG_MIN UCHAR_MAX ULLONG_MAX */
+ #include <stdint.h> /* uintptr_t */
+-#include <string.h> /* memset(3) strerror_r(3) strlen(3) */
++#include <string.h> /* memset(3) strerror_r(3) strlen(3) strncpy(3) */
+ #include <math.h> /* INFINITY fabs(3) floor(3) frexp(3) fmod(3) round(3) isfinite(3) */
+ #include <time.h> /* struct tm time_t strptime(3) time(2) */
+ #include <ctype.h> /* isdigit(3), isxdigit(3), tolower(3) */
+@@ -4070,6 +4070,15 @@ static BIO *getbio(lua_State *L) {
+ } /* getbio() */
+
+
++static int pem_pw_cb(char *buf, int size, int rwflag, void *u) {
++ if (!u)
++ return 0;
++ char *pass = (char *) u;
++ strncpy(buf, pass, size);
++ return MIN(strlen(pass), (unsigned int) size);
++} /* pem_pw_cb() */
++
++
+ static int pk_new(lua_State *L) {
+ EVP_PKEY **ud;
+
+@@ -4309,7 +4318,7 @@ static int pk_new(lua_State *L) {
+ } else if (lua_isstring(L, 1)) {
+ int format;
+ int pubonly = 0, prvtonly = 0;
+- const char *type, *data;
++ const char *type, *data, *pass;
+ size_t len;
+ BIO *bio;
+ EVP_PKEY *pub = NULL, *prvt = NULL;
+@@ -4318,12 +4327,14 @@ static int pk_new(lua_State *L) {
+ if (lua_istable(L, 2)) {
+ lua_getfield(L, 2, "format");
+ lua_getfield(L, 2, "type");
+- }
++ lua_getfield(L, 2, "password");
++ } else
++ lua_pushnil(L);
+
+- format = optencoding(L, -2, "*", X509_ANY|X509_PEM|X509_DER);
++ format = optencoding(L, -3, "*", X509_ANY|X509_PEM|X509_DER);
+
+ /* check if specified publickey or privatekey */
+- if ((type = luaL_optstring(L, -1, NULL))) {
++ if ((type = luaL_optstring(L, -2, NULL))) {
+ if (xtolower(type[0]) == 'p' && xtolower(type[1]) == 'u') {
+ pubonly = 1;
+ } else if (xtolower(type[0]) == 'p' && xtolower(type[1]) == 'r') {
+@@ -4333,6 +4344,13 @@ static int pk_new(lua_State *L) {
+ }
+ }
+
++ pass = luaL_optstring(L, -1, NULL);
++ if (pass) {
++ if (format == X509_DER)
++ return luaL_error(L, "decryption supported only for PEM keys");
++ else format = X509_PEM;
++ }
++
+ data = luaL_checklstring(L, 1, &len);
+
+ ud = prepsimple(L, PKEY_CLASS);
+@@ -4349,14 +4367,14 @@ static int pk_new(lua_State *L) {
+ */
+ BIO_reset(bio);
+
+- if (!(pub = PEM_read_bio_PUBKEY(bio, NULL, 0, "")))
++ if (!(pub = PEM_read_bio_PUBKEY(bio, NULL, pem_pw_cb, pass)))
+ goterr = 1;
+ }
+
+ if (!pubonly && !prvt) {
+ BIO_reset(bio);
+
+- if (!(prvt = PEM_read_bio_PrivateKey(bio, NULL, 0, "")))
++ if (!(prvt = PEM_read_bio_PrivateKey(bio, NULL, pem_pw_cb, pass)))
+ goterr = 1;
+ }
+ }
+--
+2.24.1
+