@@ -134,8 +134,9 @@ ngx_ssl_ja3_detail_print(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3)
134134 ja3 -> ciphers_sz );
135135
136136 for (size_t i = 0 ; i < ja3 -> ciphers_sz ; ++ i ) {
137- ngx_log_debug1 (NGX_LOG_DEBUG_EVENT ,
138- pool -> log , 0 , "ssl_ja3: | cipher: %d" ,
137+ ngx_log_debug2 (NGX_LOG_DEBUG_EVENT ,
138+ pool -> log , 0 , "ssl_ja3: | cipher: 0x%04uxD -> %d" ,
139+ ja3 -> ciphers [i ],
139140 ja3 -> ciphers [i ]
140141 );
141142 }
@@ -146,8 +147,9 @@ ngx_ssl_ja3_detail_print(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3)
146147 ja3 -> extensions_sz );
147148
148149 for (size_t i = 0 ; i < ja3 -> extensions_sz ; ++ i ) {
149- ngx_log_debug1 (NGX_LOG_DEBUG_EVENT ,
150- pool -> log , 0 , "ssl_ja3: | extension: %d" ,
150+ ngx_log_debug2 (NGX_LOG_DEBUG_EVENT ,
151+ pool -> log , 0 , "ssl_ja3: | extension: 0x%04uxD -> %d" ,
152+ ja3 -> extensions [i ],
151153 ja3 -> extensions [i ]
152154 );
153155 }
@@ -158,8 +160,9 @@ ngx_ssl_ja3_detail_print(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3)
158160 ja3 -> curves_sz );
159161
160162 for (size_t i = 0 ; i < ja3 -> curves_sz ; ++ i ) {
161- ngx_log_debug1 (NGX_LOG_DEBUG_EVENT ,
162- pool -> log , 0 , "ssl_ja3: | curves: %d" ,
163+ ngx_log_debug2 (NGX_LOG_DEBUG_EVENT ,
164+ pool -> log , 0 , "ssl_ja3: | curves: 0x%04uxD -> %d" ,
165+ ja3 -> curves [i ],
163166 ja3 -> curves [i ]
164167 );
165168 }
@@ -181,8 +184,7 @@ ngx_ssl_ja3_detail_print(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3)
181184void
182185ngx_ssl_ja3_fp (ngx_pool_t * pool , ngx_ssl_ja3_t * ja3 , ngx_str_t * out )
183186{
184- size_t len = 0 , cur = 0 , added = 0 ;
185- unsigned short us = 0 ;
187+ size_t len = 0 , cur = 0 ;
186188
187189 if (pool == NULL || ja3 == NULL || out == NULL ) {
188190 return ;
@@ -231,18 +233,12 @@ ngx_ssl_ja3_fp(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3, ngx_str_t *out)
231233
232234 if (ja3 -> ciphers_sz ) {
233235 for (size_t i = 0 ; i < ja3 -> ciphers_sz ; ++ i ) {
234- us = ntohs (ja3 -> ciphers [i ]);
235- if (!ngx_ssl_ja3_is_ext_greased (us )) {
236- if (added > 0 ) {
237- ngx_snprintf (out -> data + (cur ++ ), 1 , "-" );
238- }
239- len = ngx_ssj_ja3_num_digits (us );
240- ngx_snprintf (out -> data + cur , len , "%d" , us );
241- cur += len ;
242- if (added == 0 ) {
243- added = 1 ;
244- }
236+ if (i > 0 ) {
237+ ngx_snprintf (out -> data + (cur ++ ), 1 , "-" );
245238 }
239+ len = ngx_ssj_ja3_num_digits (ja3 -> ciphers [i ]);
240+ ngx_snprintf (out -> data + cur , len , "%d" , ja3 -> ciphers [i ]);
241+ cur += len ;
246242 }
247243 }
248244 ngx_snprintf (out -> data + (cur ++ ), 1 , "," );
@@ -301,9 +297,6 @@ ngx_ssl_ja3(ngx_connection_t *c, ngx_pool_t *pool, ngx_ssl_ja3_t *ja3) {
301297
302298 ngx_ssl_session_t * ssl_session ;
303299 SSL * ssl ;
304- unsigned short * ciphers_out = NULL ;
305- int * curves_out = NULL ;
306- int * point_formats_out = NULL ;
307300 size_t len = 0 ;
308301 unsigned short us = 0 ;
309302
@@ -330,71 +323,59 @@ ngx_ssl_ja3(ngx_connection_t *c, ngx_pool_t *pool, ngx_ssl_ja3_t *ja3) {
330323
331324 /* Cipher suites */
332325 ja3 -> ciphers = NULL ;
333- ja3 -> ciphers_sz = SSL_get0_raw_cipherlist (ssl , & ciphers_out );
334- ja3 -> ciphers_sz /= 2 ;
326+ ja3 -> ciphers_sz = 0 ;
335327
336- if (ja3 -> ciphers_sz && ciphers_out ) {
337- len = ja3 -> ciphers_sz * sizeof (unsigned short );
328+ if (c -> ssl -> ciphers && c -> ssl -> ciphers_sz ) {
329+ len = c -> ssl -> ciphers_sz * sizeof (unsigned short );
338330 ja3 -> ciphers = ngx_pnalloc (pool , len );
339331 if (ja3 -> ciphers == NULL ) {
340332 return NGX_DECLINED ;
341333 }
342- ngx_memcpy (ja3 -> ciphers , ciphers_out , len );
334+ /* Filter out GREASE extensions */
335+ for (size_t i = 0 ; i < c -> ssl -> ciphers_sz ; ++ i ) {
336+ us = ntohs (c -> ssl -> ciphers [i ]);
337+ if (! ngx_ssl_ja3_is_ext_greased (us )) {
338+ ja3 -> ciphers [ja3 -> ciphers_sz ++ ] = us ;
339+ }
340+ }
343341 }
344342
345343 /* Extensions */
346344 ja3 -> extensions = NULL ;
347345 ja3 -> extensions_sz = 0 ;
348- if (c -> ssl -> client_extensions_size && c -> ssl -> client_extensions ) {
349- len = c -> ssl -> client_extensions_size * sizeof (int );
346+ if (c -> ssl -> extensions_size && c -> ssl -> extensions ) {
347+ len = c -> ssl -> extensions_size * sizeof (int );
350348 ja3 -> extensions = ngx_pnalloc (pool , len );
351349 if (ja3 -> extensions == NULL ) {
352350 return NGX_DECLINED ;
353351 }
354- for (size_t i = 0 ; i < c -> ssl -> client_extensions_size ; ++ i ) {
355- us = ntohs (c -> ssl -> client_extensions [i ]);
356- if (! ngx_ssl_ja3_is_ext_greased (us )) {
357- ja3 -> extensions [ja3 -> extensions_sz ++ ] =
358- c -> ssl -> client_extensions [i ];
352+ for (size_t i = 0 ; i < c -> ssl -> extensions_size ; ++ i ) {
353+ if (! ngx_ssl_ja3_is_ext_greased (c -> ssl -> extensions [i ])) {
354+ ja3 -> extensions [ja3 -> extensions_sz ++ ] = c -> ssl -> extensions [i ];
359355 }
360356 }
361357 }
362358
363359 /* Elliptic curve points */
364- ja3 -> curves_sz = SSL_get1_curves (ssl , NULL );
365- if (ja3 -> curves_sz ) {
366- curves_out = OPENSSL_malloc (ja3 -> curves_sz * sizeof (int ));
367- if (curves_out == NULL ) {
368- return NGX_DECLINED ;
369- }
370-
371- SSL_get1_curves (ssl , curves_out );
372-
373- len = ja3 -> curves_sz * sizeof (unsigned short );
360+ ja3 -> curves = c -> ssl -> curves ;
361+ ja3 -> curves_sz = 0 ;
362+ if (c -> ssl -> curves && c -> ssl -> curves_sz ) {
363+ len = c -> ssl -> curves_sz * sizeof (int );
374364 ja3 -> curves = ngx_pnalloc (pool , len );
375365 if (ja3 -> curves == NULL ) {
376366 return NGX_DECLINED ;
377367 }
378- for (size_t i = 0 ; i < ja3 -> curves_sz ; i ++ ) {
379- ja3 -> curves [i ] = ngx_ssl_ja3_nid_to_cid (curves_out [i ]);
380- }
381-
382- if (curves_out ) {
383- OPENSSL_free (curves_out );
368+ for (size_t i = 0 ; i < c -> ssl -> curves_sz ; i ++ ) {
369+ us = ntohs (c -> ssl -> curves [i ]);
370+ if (! ngx_ssl_ja3_is_ext_greased (us )) {
371+ ja3 -> curves [ja3 -> curves_sz ++ ] = ngx_ssl_ja3_nid_to_cid (c -> ssl -> curves [i ]);
372+ }
384373 }
385374 }
386375
387376 /* Elliptic curve point formats */
388- ja3 -> point_formats_sz = SSL_get0_ec_point_formats (ssl , & point_formats_out );
389- if (ja3 -> point_formats_sz && point_formats_out != NULL ) {
390-
391- len = ja3 -> point_formats_sz * sizeof (unsigned char );
392- ja3 -> point_formats = ngx_pnalloc (pool , len );
393- if (ja3 -> point_formats == NULL ) {
394- return NGX_DECLINED ;
395- }
396- ngx_memcpy (ja3 -> point_formats , point_formats_out , len );
397- }
377+ ja3 -> point_formats_sz = c -> ssl -> point_formats_sz ;
378+ ja3 -> point_formats = c -> ssl -> point_formats ;
398379
399380 return NGX_OK ;
400381}
0 commit comments