diff options
author | william <william@25tandclement.com> | 2014-10-15 14:57:07 -0700 |
---|---|---|
committer | william <william@25tandclement.com> | 2014-10-15 14:57:07 -0700 |
commit | b8860e791f886b510bd8539bb26fa22558b9f42d (patch) | |
tree | 9c76af1bbf7363985be00162a63de2bf4bc4bf44 | |
parent | c3bdfe8cc6985d54f989aa1538fc19458abaa973 (diff) | |
download | luaossl-b8860e791f886b510bd8539bb26fa22558b9f42d.tar.gz luaossl-b8860e791f886b510bd8539bb26fa22558b9f42d.tar.bz2 luaossl-b8860e791f886b510bd8539bb26fa22558b9f42d.zip |
add ssl:getVersion and ssl:getClientVersion methods
-rw-r--r-- | src/openssl.c | 81 |
1 files changed, 74 insertions, 7 deletions
diff --git a/src/openssl.c b/src/openssl.c index 5695b58..034806b 100644 --- a/src/openssl.c +++ b/src/openssl.c | |||
@@ -4706,6 +4706,56 @@ static int ssl_setHostName(lua_State *L) { | |||
4706 | } /* ssl_setHostName() */ | 4706 | } /* ssl_setHostName() */ |
4707 | 4707 | ||
4708 | 4708 | ||
4709 | static int ssl_getVersion(lua_State *L) { | ||
4710 | SSL *ssl = checksimple(L, 1, SSL_CLASS); | ||
4711 | int format = luaL_checkoption(L, 2, "d", (const char *[]){ "d", ".", "f", NULL }); | ||
4712 | int version = SSL_version(ssl); | ||
4713 | int major, minor; | ||
4714 | |||
4715 | switch (format) { | ||
4716 | case 1: case 2: | ||
4717 | major = 0xff & ((version >> 8)); | ||
4718 | minor = (0xff & version); | ||
4719 | |||
4720 | luaL_argcheck(L, minor < 10, 2, "unable to convert SSL version to float because minor version >= 10"); | ||
4721 | lua_pushnumber(L, major + ((double)minor / 10)); | ||
4722 | |||
4723 | break; | ||
4724 | default: | ||
4725 | lua_pushinteger(L, version); | ||
4726 | |||
4727 | break; | ||
4728 | } | ||
4729 | |||
4730 | return 1; | ||
4731 | } /* ssl_getVersion() */ | ||
4732 | |||
4733 | |||
4734 | static int ssl_getClientVersion(lua_State *L) { | ||
4735 | SSL *ssl = checksimple(L, 1, SSL_CLASS); | ||
4736 | int format = luaL_checkoption(L, 2, "d", (const char *[]){ "d", ".", "f", NULL }); | ||
4737 | int version = ssl->client_version; | ||
4738 | int major, minor; | ||
4739 | |||
4740 | switch (format) { | ||
4741 | case 1: case 2: | ||
4742 | major = 0xff & ((version >> 8)); | ||
4743 | minor = (0xff & version); | ||
4744 | |||
4745 | luaL_argcheck(L, minor < 10, 2, "unable to convert SSL client version to float because minor version >= 10"); | ||
4746 | lua_pushnumber(L, major + ((double)minor / 10)); | ||
4747 | |||
4748 | break; | ||
4749 | default: | ||
4750 | lua_pushinteger(L, version); | ||
4751 | |||
4752 | break; | ||
4753 | } | ||
4754 | |||
4755 | return 1; | ||
4756 | } /* ssl_getClientVersion() */ | ||
4757 | |||
4758 | |||
4709 | static int ssl__gc(lua_State *L) { | 4759 | static int ssl__gc(lua_State *L) { |
4710 | SSL **ud = luaL_checkudata(L, 1, SSL_CLASS); | 4760 | SSL **ud = luaL_checkudata(L, 1, SSL_CLASS); |
4711 | 4761 | ||
@@ -4719,14 +4769,16 @@ static int ssl__gc(lua_State *L) { | |||
4719 | 4769 | ||
4720 | 4770 | ||
4721 | static const luaL_Reg ssl_methods[] = { | 4771 | static const luaL_Reg ssl_methods[] = { |
4722 | { "setOptions", &ssl_setOptions }, | 4772 | { "setOptions", &ssl_setOptions }, |
4723 | { "getOptions", &ssl_getOptions }, | 4773 | { "getOptions", &ssl_getOptions }, |
4724 | { "clearOptions", &ssl_clearOptions }, | 4774 | { "clearOptions", &ssl_clearOptions }, |
4725 | { "getPeerCertificate", &ssl_getPeerCertificate }, | 4775 | { "getPeerCertificate", &ssl_getPeerCertificate }, |
4726 | { "getPeerChain", &ssl_getPeerChain }, | 4776 | { "getPeerChain", &ssl_getPeerChain }, |
4727 | { "getCipherInfo", &ssl_getCipherInfo }, | 4777 | { "getCipherInfo", &ssl_getCipherInfo }, |
4728 | { "getHostName", &ssl_getHostName }, | 4778 | { "getHostName", &ssl_getHostName }, |
4729 | { "setHostName", &ssl_setHostName }, | 4779 | { "setHostName", &ssl_setHostName }, |
4780 | { "getVersion", &ssl_getVersion }, | ||
4781 | { "getClientVersion", &ssl_getClientVersion }, | ||
4730 | { NULL, NULL }, | 4782 | { NULL, NULL }, |
4731 | }; | 4783 | }; |
4732 | 4784 | ||
@@ -4741,10 +4793,25 @@ static const luaL_Reg ssl_globals[] = { | |||
4741 | { NULL, NULL }, | 4793 | { NULL, NULL }, |
4742 | }; | 4794 | }; |
4743 | 4795 | ||
4796 | static const integer_Reg ssl_version[] = { | ||
4797 | { "SSL2_VERSION", SSL2_VERSION }, | ||
4798 | { "SSL3_VERSION", SSL3_VERSION }, | ||
4799 | { "TLS1_VERSION", TLS1_VERSION }, | ||
4800 | #if defined TLS1_1_VERSION | ||
4801 | { "TLS1_1_VERSION", TLS1_1_VERSION }, | ||
4802 | #endif | ||
4803 | #if defined TLS1_2_VERSION | ||
4804 | { "TLS1_2_VERSION", TLS1_2_VERSION }, | ||
4805 | #endif | ||
4806 | { NULL, 0 }, | ||
4807 | }; | ||
4808 | |||
4809 | |||
4744 | int luaopen__openssl_ssl(lua_State *L) { | 4810 | int luaopen__openssl_ssl(lua_State *L) { |
4745 | initall(L); | 4811 | initall(L); |
4746 | 4812 | ||
4747 | luaL_newlib(L, ssl_globals); | 4813 | luaL_newlib(L, ssl_globals); |
4814 | lib_setintegers(L, ssl_version); | ||
4748 | lib_setintegers(L, sx_verify); | 4815 | lib_setintegers(L, sx_verify); |
4749 | lib_setintegers(L, sx_option); | 4816 | lib_setintegers(L, sx_option); |
4750 | 4817 | ||