Skip to content

Commit ff9dea8

Browse files
authored
feature: add ngx_stream_lua_ffi_ssl_client_random.
1 parent fd136cc commit ff9dea8

File tree

2 files changed

+140
-0
lines changed

2 files changed

+140
-0
lines changed

src/ngx_stream_lua_ssl_certby.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,4 +1603,27 @@ ngx_stream_lua_ffi_ssl_verify_client(ngx_stream_lua_request_t *r,
16031603
}
16041604

16051605

1606+
int
1607+
ngx_stream_lua_ffi_ssl_client_random(ngx_stream_lua_request_t *r,
1608+
unsigned char *out, size_t *outlen, char **err)
1609+
{
1610+
ngx_ssl_conn_t *ssl_conn;
1611+
1612+
if (r->connection == NULL || r->connection->ssl == NULL) {
1613+
*err = "bad request";
1614+
return NGX_ERROR;
1615+
}
1616+
1617+
ssl_conn = r->connection->ssl->connection;
1618+
if (ssl_conn == NULL) {
1619+
*err = "bad ssl conn";
1620+
return NGX_ERROR;
1621+
}
1622+
1623+
*outlen = SSL_get_client_random(ssl_conn, out, *outlen);
1624+
1625+
return NGX_OK;
1626+
}
1627+
1628+
16061629
#endif /* NGX_STREAM_SSL */

t/140-ssl-c-api.t

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ ffi.cdef[[
6969
7070
int ngx_stream_lua_ffi_ssl_verify_client(void *r, void *cdata, int depth, char **err);
7171
72+
int ngx_stream_lua_ffi_ssl_client_random(ngx_stream_lua_request_t *r,
73+
unsigned char *out, size_t *outlen, char **err);
74+
7275
]]
7376
_EOC_
7477
}
@@ -1119,3 +1122,117 @@ lua ssl server name: "test.com"
11191122
--- no_error_log
11201123
[error]
11211124
[alert]
1125+
1126+
1127+
1128+
=== TEST 11: client random
1129+
--- stream_config
1130+
server {
1131+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1132+
1133+
ssl_certificate_by_lua_block {
1134+
collectgarbage()
1135+
1136+
local ffi = require "ffi"
1137+
require "defines"
1138+
1139+
local errmsg = ffi.new("char *[1]")
1140+
1141+
local r = require "resty.core.base" .get_request()
1142+
if not r then
1143+
ngx.log(ngx.ERR, "no request found")
1144+
return
1145+
end
1146+
1147+
-- test client random length
1148+
local out = ffi.new("unsigned char[?]", 0)
1149+
local sizep = ffi.new("size_t[1]", 0)
1150+
1151+
local rc = ffi.C.ngx_stream_lua_ffi_ssl_client_random(r, out, sizep, errmsg)
1152+
if rc ~= 0 then
1153+
ngx.log(ngx.ERR, "failed to get client random length: ",
1154+
ffi.string(errmsg[0]))
1155+
return
1156+
end
1157+
1158+
if tonumber(sizep[0]) ~= 32 then
1159+
ngx.log(ngx.ERR, "client random length does not equal 32")
1160+
return
1161+
end
1162+
1163+
-- test client random value
1164+
out = ffi.new("unsigned char[?]", 50)
1165+
sizep = ffi.new("size_t[1]", 50)
1166+
1167+
rc = ffi.C.ngx_stream_lua_ffi_ssl_client_random(r, out, sizep, errmsg)
1168+
if rc ~= 0 then
1169+
ngx.log(ngx.ERR, "failed to get client random: ",
1170+
ffi.string(errmsg[0]))
1171+
return
1172+
end
1173+
1174+
local init_v = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
1175+
if ffi.string(out, sizep[0]) == init_v then
1176+
ngx.log(ngx.ERR, "maybe the client random value is incorrect")
1177+
return
1178+
end
1179+
}
1180+
1181+
ssl_certificate ../../cert/test.crt;
1182+
ssl_certificate_key ../../cert/test.key;
1183+
1184+
return 'it works!\n';
1185+
}
1186+
--- stream_server_config
1187+
lua_ssl_trusted_certificate ../../cert/test.crt;
1188+
1189+
content_by_lua_block {
1190+
do
1191+
local sock = ngx.socket.tcp()
1192+
1193+
sock:settimeout(2000)
1194+
1195+
local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")
1196+
if not ok then
1197+
ngx.say("failed to connect: ", err)
1198+
return
1199+
end
1200+
1201+
ngx.say("connected: ", ok)
1202+
1203+
local sess, err = sock:sslhandshake(nil, "test.com", true)
1204+
if not sess then
1205+
ngx.say("failed to do SSL handshake: ", err)
1206+
return
1207+
end
1208+
1209+
ngx.say("ssl handshake: ", type(sess))
1210+
1211+
while true do
1212+
local line, err = sock:receive()
1213+
if not line then
1214+
-- ngx.say("failed to receive response status line: ", err)
1215+
break
1216+
end
1217+
1218+
ngx.say("received: ", line)
1219+
end
1220+
1221+
local ok, err = sock:close()
1222+
ngx.say("close: ", ok, " ", err)
1223+
end -- do
1224+
-- collectgarbage()
1225+
}
1226+
1227+
--- stream_response
1228+
connected: 1
1229+
ssl handshake: userdata
1230+
received: it works!
1231+
close: 1 nil
1232+
1233+
--- error_log
1234+
lua ssl server name: "test.com"
1235+
1236+
--- no_error_log
1237+
[error]
1238+
[alert]

0 commit comments

Comments
 (0)