summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/openssl.c106
1 files changed, 97 insertions, 9 deletions
diff --git a/src/openssl.c b/src/openssl.c
index 4a290a9..03f3f8d 100644
--- a/src/openssl.c
+++ b/src/openssl.c
@@ -465,6 +465,48 @@ static void lib_setintegers(lua_State *L, const integer_Reg *l) {
465} /* lib_setintegers() */ 465} /* lib_setintegers() */
466 466
467 467
468
469#if !HAVE_EVP_PKEY_base_id
470#define EVP_PKEY_base_id(key) compat_EVP_PKEY_base_id((key))
471
472static int compat_EVP_PKEY_base_id(EVP_PKEY *key) {
473 return EVP_PKEY_type(key->type);
474} /* compat_EVP_PKEY_base_id() */
475#endif
476
477
478#if !HAVE_EVP_PKEY_get0
479#define EVP_PKEY_get0(key) compat_EVP_PKEY_get0((key))
480
481static void *compat_EVP_PKEY_get0(EVP_PKEY *key) {
482 void *ptr = NULL;
483
484 switch (EVP_PKEY_base_id(key)) {
485 case EVP_PKEY_RSA:
486 if ((ptr = EVP_PKEY_get1_RSA(key)))
487 RSA_free(ptr);
488 break;
489 case EVP_PKEY_DSA:
490 if ((ptr = EVP_PKEY_get1_DSA(key)))
491 DSA_free(ptr);
492 break;
493 case EVP_PKEY_DH:
494 if ((ptr = EVP_PKEY_get1_DH(key)))
495 DH_free(ptr);
496 break;
497 case EVP_PKEY_EC:
498 if ((ptr = EVP_PKEY_get1_EC_KEY(key)))
499 EC_KEY_free(ptr);
500 break;
501 default:
502 break;
503 }
504
505 return ptr;
506} /* compat_EVP_PKEY_get0() */
507#endif
508
509
468static void initall(lua_State *L); 510static void initall(lua_State *L);
469 511
470 512
@@ -4134,6 +4176,51 @@ static int sx_setCipherList(lua_State *L) {
4134} /* sx_setCipherList() */ 4176} /* sx_setCipherList() */
4135 4177
4136 4178
4179static int sx_setEphemeralKey(lua_State *L) {
4180 SSL_CTX *ctx = checksimple(L, 1, SSL_CTX_CLASS);
4181 EVP_PKEY *key = checksimple(L, 2, PKEY_CLASS);
4182 void *tmp;
4183
4184 /*
4185 * NOTE: SSL_CTX_set_tmp duplicates the keys, so we don't need to
4186 * worry about lifetimes. EVP_PKEY_get0 doesn't increment the
4187 * reference count.
4188 */
4189 switch (EVP_PKEY_base_id(key)) {
4190 case EVP_PKEY_RSA:
4191 if (!(tmp = EVP_PKEY_get0(key)))
4192 return throwssl(L, "ssl.context:setEphemeralKey");
4193
4194 if (!SSL_CTX_set_tmp_rsa(ctx, tmp))
4195 return throwssl(L, "ssl.context:setEphemeralKey");
4196
4197 break;
4198 case EVP_PKEY_DH:
4199 if (!(tmp = EVP_PKEY_get0(key)))
4200 return throwssl(L, "ssl.context:setEphemeralKey");
4201
4202 if (!SSL_CTX_set_tmp_dh(ctx, tmp))
4203 return throwssl(L, "ssl.context:setEphemeralKey");
4204
4205 break;
4206 case EVP_PKEY_EC:
4207 if (!(tmp = EVP_PKEY_get0(key)))
4208 return throwssl(L, "ssl.context:setEphemeralKey");
4209
4210 if (!SSL_CTX_set_tmp_ecdh(ctx, tmp))
4211 return throwssl(L, "ssl.context:setEphemeralKey");
4212
4213 break;
4214 default:
4215 return luaL_error(L, "%d: unsupported EVP base type", EVP_PKEY_base_id(key));
4216 } /* switch() */
4217
4218 lua_pushboolean(L, 1);
4219
4220 return 1;
4221} /* sx_setEphemeralKey() */
4222
4223
4137static int sx__gc(lua_State *L) { 4224static int sx__gc(lua_State *L) {
4138 SSL_CTX **ud = luaL_checkudata(L, 1, SSL_CTX_CLASS); 4225 SSL_CTX **ud = luaL_checkudata(L, 1, SSL_CTX_CLASS);
4139 4226
@@ -4145,15 +4232,16 @@ static int sx__gc(lua_State *L) {
4145 4232
4146 4233
4147static const luaL_Reg sx_methods[] = { 4234static const luaL_Reg sx_methods[] = {
4148 { "setOptions", &sx_setOptions }, 4235 { "setOptions", &sx_setOptions },
4149 { "getOptions", &sx_getOptions }, 4236 { "getOptions", &sx_getOptions },
4150 { "clearOptions", &sx_clearOptions }, 4237 { "clearOptions", &sx_clearOptions },
4151 { "setStore", &sx_setStore }, 4238 { "setStore", &sx_setStore },
4152 { "setVerify", &sx_setVerify }, 4239 { "setVerify", &sx_setVerify },
4153 { "getVerify", &sx_getVerify }, 4240 { "getVerify", &sx_getVerify },
4154 { "setCertificate", &sx_setCertificate }, 4241 { "setCertificate", &sx_setCertificate },
4155 { "setPrivateKey", &sx_setPrivateKey }, 4242 { "setPrivateKey", &sx_setPrivateKey },
4156 { "setCipherList", &sx_setCipherList }, 4243 { "setCipherList", &sx_setCipherList },
4244 { "setEphemeralKey", &sx_setEphemeralKey },
4157 { NULL, NULL }, 4245 { NULL, NULL },
4158}; 4246};
4159 4247