summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordaurnimator <quae@daurnimator.com>2015-02-28 19:36:41 -0500
committerdaurnimator <quae@daurnimator.com>2015-02-28 19:36:41 -0500
commit55fd8c9610fd2dda02eb436de8c03a0fa5704048 (patch)
tree897850250535d17183f2578e5457cdc6fcc030be /src
parent978fce0097361adfe473c033d7d61878e73c072a (diff)
downloadluaossl-55fd8c9610fd2dda02eb436de8c03a0fa5704048.tar.gz
luaossl-55fd8c9610fd2dda02eb436de8c03a0fa5704048.tar.bz2
luaossl-55fd8c9610fd2dda02eb436de8c03a0fa5704048.zip
Bind SSL_CTX_set_alpn_protos and SSL_get0_alpn_selected
Diffstat (limited to 'src')
-rw-r--r--src/openssl.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/openssl.c b/src/openssl.c
index 6e3039f..ab19410 100644
--- a/src/openssl.c
+++ b/src/openssl.c
@@ -4516,6 +4516,44 @@ static int sx_setEphemeralKey(lua_State *L) {
4516 return 1; 4516 return 1;
4517} /* sx_setEphemeralKey() */ 4517} /* sx_setEphemeralKey() */
4518 4518
4519static int sx_setAlpnProtos(lua_State *L) {
4520 SSL_CTX *ctx = checksimple(L, 1, SSL_CTX_CLASS);
4521 size_t len;
4522 const char *tmp;
4523 unsigned protos_len = 0;
4524 luaL_Buffer B;
4525 luaL_checktype(L, 2, LUA_TTABLE);
4526 luaL_buffinit(L, &B);
4527
4528 while (1) {
4529 protos_len++;
4530 lua_rawgeti(L, 2, protos_len);
4531 switch (lua_type(L, -1)) {
4532 case LUA_TNIL:
4533 goto done;
4534 case LUA_TSTRING:
4535 break;
4536 default:
4537 return luaL_argerror(L, 2, "array of strings expected");
4538 }
4539 tmp = luaL_checklstring(L, -1, &len);
4540 luaL_argcheck(L, len <= UCHAR_MAX, 2, "proto string too long");
4541 luaL_addchar(&B, (unsigned char)len);
4542 luaL_addlstring(&B, tmp, len);
4543 lua_pop(L, 1);
4544 }
4545done:
4546 luaL_pushresult(&B);
4547
4548 if (0 != SSL_CTX_set_alpn_protos(ctx, (const unsigned char*)lua_tostring(L, -1), protos_len)) {
4549 lua_pushnil(L);
4550 return 1;
4551 }
4552
4553 lua_pushboolean(L, 1);
4554
4555 return 1;
4556} /* sx_setAlpnprotos */
4519 4557
4520static int sx__gc(lua_State *L) { 4558static int sx__gc(lua_State *L) {
4521 SSL_CTX **ud = luaL_checkudata(L, 1, SSL_CTX_CLASS); 4559 SSL_CTX **ud = luaL_checkudata(L, 1, SSL_CTX_CLASS);
@@ -4540,6 +4578,7 @@ static const luaL_Reg sx_methods[] = {
4540 { "setPrivateKey", &sx_setPrivateKey }, 4578 { "setPrivateKey", &sx_setPrivateKey },
4541 { "setCipherList", &sx_setCipherList }, 4579 { "setCipherList", &sx_setCipherList },
4542 { "setEphemeralKey", &sx_setEphemeralKey }, 4580 { "setEphemeralKey", &sx_setEphemeralKey },
4581 { "setAlpnProtos", &sx_setAlpnProtos },
4543 { NULL, NULL }, 4582 { NULL, NULL },
4544}; 4583};
4545 4584
@@ -4790,6 +4829,18 @@ static int ssl_getClientVersion(lua_State *L) {
4790 return 1; 4829 return 1;
4791} /* ssl_getClientVersion() */ 4830} /* ssl_getClientVersion() */
4792 4831
4832static int ssl_getAlpnSelected(lua_State *L) {
4833 SSL *ssl = checksimple(L, 1, SSL_CLASS);
4834 const unsigned char *data;
4835 unsigned len;
4836 SSL_get0_alpn_selected(ssl, &data, &len);
4837 if (0 == len) {
4838 lua_pushnil(L);
4839 } else {
4840 lua_pushlstring(L, data, len);
4841 }
4842 return 1;
4843} /*ssl_getAlpnSelected */
4793 4844
4794static int ssl__gc(lua_State *L) { 4845static int ssl__gc(lua_State *L) {
4795 SSL **ud = luaL_checkudata(L, 1, SSL_CLASS); 4846 SSL **ud = luaL_checkudata(L, 1, SSL_CLASS);
@@ -4814,6 +4865,7 @@ static const luaL_Reg ssl_methods[] = {
4814 { "setHostName", &ssl_setHostName }, 4865 { "setHostName", &ssl_setHostName },
4815 { "getVersion", &ssl_getVersion }, 4866 { "getVersion", &ssl_getVersion },
4816 { "getClientVersion", &ssl_getClientVersion }, 4867 { "getClientVersion", &ssl_getClientVersion },
4868 { "getAlpnSelected", &ssl_getAlpnSelected },
4817 { NULL, NULL }, 4869 { NULL, NULL },
4818}; 4870};
4819 4871