@@ -62,6 +62,15 @@ ffi.cdef[[
6262 void ngx_http_lua_ffi_free_priv_key(void *cdata);
6363
6464 int ngx_http_lua_ffi_ssl_clear_certs(void *r, char **err);
65+
66+ int ngx_http_lua_ffi_ssl_set_psk_key(void *r,
67+ const char *key, size_t len, char **err);
68+
69+ int ngx_http_lua_ffi_ssl_get_psk_identity(void *r,
70+ char *buf, char **err);
71+
72+ int ngx_http_lua_ffi_ssl_get_psk_identity_size(void *r,
73+ char **err);
6574]]
6675_EOC_
6776 }
@@ -811,3 +820,150 @@ lua ssl server name: "test.com"
811820--- no_error_log
812821[error]
813822[alert]
823+
824+
825+
826+ === TEST 6: TLS-PSK
827+ --- http_config
828+ server {
829+ listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
830+ server_name test.com;
831+
832+ ssl_psk_by_lua_block {
833+ collectgarbage()
834+
835+ local ffi = require "ffi"
836+ require "defines"
837+
838+ local errmsg = ffi.new("char *[1]")
839+
840+ local r = getfenv(0).__ngx_req
841+ if not r then
842+ ngx.log(ngx.ERR, "no request found")
843+ return
844+ end
845+
846+ local len = ffi.C.ngx_http_lua_ffi_ssl_get_psk_identity_size(r, errmsg)
847+
848+ if len < 0 then
849+ ngx.log(ngx.ERR, "failed to get psk identity size: ", ffi.string(errmsg[0]))
850+ return
851+ end
852+
853+ if len > 4096 then
854+ ngx.log(ngx.ERR, "psk identity size too long")
855+ return
856+ end
857+
858+ local buf = ffi.new("char[?]", 4096)
859+
860+ local rc = ffi.C.ngx_http_lua_ffi_ssl_get_psk_identity(r, buf, errmsg)
861+ if rc ~= 0 then
862+ ngx.log(ngx.ERR, "failed to get psk identity: ", ffi.string(errmsg[0]))
863+ return
864+ end
865+
866+ local psk_identity = ffi.string(buf, len)
867+ if not psk_identity then
868+ ngx.log(ngx.ERR, "psk_identity is undefined")
869+ return
870+ end
871+
872+ local psk_key = "psk_test_key"
873+
874+ local rc = ffi.C.ngx_http_lua_ffi_ssl_set_psk_key(r, psk_key, #psk_key, errmsg)
875+ if rc ~= 0 then
876+ ngx.log(ngx.ERR, "failed to set psk key: ", ffi.string(errmsg[0]))
877+ return
878+ end
879+ }
880+
881+ ssl_certificate ../../cert/test.crt;
882+ ssl_certificate_key ../../cert/test.key;
883+
884+ lua_ssl_psk_identity psk_test_identity_hint;
885+
886+ server_tokens off;
887+ location /foo {
888+ default_type 'text/plain';
889+ content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }
890+ more_clear_headers Date;
891+ }
892+ }
893+ --- config
894+ server_tokens off;
895+
896+ location /t {
897+ lua_ssl_ciphers PSK-AES256-CBC-SHA;
898+ lua_ssl_psk_identity psk_test_identity;
899+ lua_ssl_psk_key psk_test_key;
900+
901+ content_by_lua_block {
902+ do
903+ local sock = ngx.socket.tcp()
904+
905+ sock:settimeout(2000)
906+
907+ local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")
908+ if not ok then
909+ ngx.say("failed to connect: ", err)
910+ return
911+ end
912+
913+ ngx.say("connected: ", ok)
914+
915+ local sess, err = sock:sslhandshake(nil, "test.com", false)
916+ if not sess then
917+ ngx.say("failed to do SSL handshake: ", err)
918+ return
919+ end
920+
921+ ngx.say("ssl handshake: ", type(sess))
922+
923+ local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"
924+ local bytes, err = sock:send(req)
925+ if not bytes then
926+ ngx.say("failed to send http request: ", err)
927+ return
928+ end
929+
930+ ngx.say("sent http request: ", bytes, " bytes.")
931+
932+ while true do
933+ local line, err = sock:receive()
934+ if not line then
935+ -- ngx.say("failed to recieve response status line: ", err)
936+ break
937+ end
938+
939+ ngx.say("received: ", line)
940+ end
941+
942+ local ok, err = sock:close()
943+ ngx.say("close: ", ok, " ", err)
944+ end -- do
945+ -- collectgarbage()
946+ }
947+ }
948+
949+ --- request
950+ GET /t
951+ --- response_body
952+ connected: 1
953+ ssl handshake: userdata
954+ sent http request: 56 bytes.
955+ received: HTTP/1.1 201 Created
956+ received: Server: nginx
957+ received: Content-Type: text/plain
958+ received: Content-Length: 4
959+ received: Connection: close
960+ received:
961+ received: foo
962+ close: 1 nil
963+
964+ --- error_log
965+ lua ssl server name: "test.com"
966+
967+ --- no_error_log
968+ [error]
969+ [alert]
0 commit comments