@@ -9,9 +9,15 @@ local ffi = require "ffi"
99local C = ffi .C
1010local ffi_str = ffi .string
1111local ffi_gc = ffi .gc
12+ local ffi_copy = ffi .copy
13+ local ffi_sizeof = ffi .sizeof
14+ local ffi_typeof = ffi .typeof
15+ local ffi_new = ffi .new
1216local get_request = base .get_request
1317local error = error
1418local tonumber = tonumber
19+ local format = string.format
20+ local concat = table.concat
1521local errmsg = base .get_errmsg_ptr ()
1622local get_string_buf = base .get_string_buf
1723local get_size_ptr = base .get_size_ptr
@@ -43,6 +49,7 @@ local ngx_lua_ffi_ssl_client_random
4349local ngx_lua_ffi_ssl_export_keying_material
4450local ngx_lua_ffi_ssl_export_keying_material_early
4551local ngx_lua_ffi_get_req_ssl_pointer
52+ local ngx_lua_ffi_req_shared_ssl_ciphers
4653
4754
4855if subsystem == ' http' then
@@ -114,6 +121,15 @@ if subsystem == 'http' then
114121 unsigned char * out , size_t out_size ,
115122 const char * label , size_t llen ,
116123 const unsigned char * ctx , size_t ctxlen , char ** err );
124+
125+ int ngx_http_lua_ffi_req_shared_ssl_ciphers (ngx_http_request_t * r ,
126+ unsigned short * ciphers , unsigned short * nciphers ,
127+ int filter_grease , char ** err );
128+
129+ typedef struct {
130+ uint16_t nciphers ;
131+ uint16_t ciphers [?];
132+ } ngx_lua_ssl_ciphers;
117133 ]]
118134
119135 ngx_lua_ffi_ssl_set_der_certificate =
@@ -143,6 +159,8 @@ if subsystem == 'http' then
143159 ngx_lua_ffi_ssl_export_keying_material_early =
144160 C .ngx_http_lua_ffi_ssl_export_keying_material_early
145161 ngx_lua_ffi_get_req_ssl_pointer = C .ngx_http_lua_ffi_get_req_ssl_pointer
162+ ngx_lua_ffi_req_shared_ssl_ciphers =
163+ C .ngx_http_lua_ffi_req_shared_ssl_ciphers
146164
147165elseif subsystem == ' stream' then
148166 ffi .cdef [[
@@ -237,6 +255,37 @@ local charpp = ffi.new("char*[1]")
237255local intp = ffi .new (" int[1]" )
238256local ushortp = ffi .new (" unsigned short[1]" )
239257
258+ do
259+ local ciphers_buf = ffi_new (" uint16_t [?]" , 256 )
260+
261+ function _M .get_req_shared_ssl_ciphers (filter_grease )
262+ local r = get_request ()
263+ if not r then
264+ error (" no request found" )
265+ end
266+
267+ if filter_grease == nil then
268+ filter_grease = true -- Default to filter GREASE
269+ end
270+
271+ ciphers_buf [0 ] = 255 -- Set max number of ciphers we can hold
272+ local filter_flag = filter_grease and 1 or 0
273+ local rc = ngx_lua_ffi_req_shared_ssl_ciphers (r , ciphers_buf + 1 ,
274+ ciphers_buf , filter_flag ,
275+ errmsg )
276+ if rc ~= FFI_OK then
277+ return nil , ffi_str (errmsg [0 ])
278+ end
279+
280+ -- Build result table
281+ local result = {}
282+ for i = 1 , ciphers_buf [0 ] do
283+ result [i ] = tonumber (ciphers_buf [i ])
284+ end
285+
286+ return result
287+ end
288+ end
240289
241290function _M .clear_certs ()
242291 local r = get_request ()
0 commit comments