@@ -184,7 +184,8 @@ ngx_ssl_ja3_detail_print(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3)
184
184
void
185
185
ngx_ssl_ja3_fp (ngx_pool_t * pool , ngx_ssl_ja3_t * ja3 , ngx_str_t * out )
186
186
{
187
- size_t len = 0 , cur = 0 ;
187
+ size_t len = 0 , cur = 0 , added = 0 ;
188
+ unsigned short us = 0 ;
188
189
189
190
if (pool == NULL || ja3 == NULL || out == NULL ) {
190
191
return ;
@@ -256,13 +257,21 @@ ngx_ssl_ja3_fp(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3, ngx_str_t *out)
256
257
ngx_snprintf (out -> data + (cur ++ ), 1 , "," );
257
258
258
259
if (ja3 -> curves_sz ) {
260
+ added = 0 ;
259
261
for (size_t i = 0 ; i < ja3 -> curves_sz ; i ++ ) {
260
- if (i > 0 ) {
261
- ngx_snprintf (out -> data + (cur ++ ), 1 , "-" );
262
+ us = ntohs (ja3 -> curves [i ]);
263
+ if (!ngx_ssl_ja3_is_ext_greased (us )) {
264
+ if (added > 0 ) {
265
+ ngx_snprintf (out -> data + (cur ++ ), 1 , "-" );
266
+ }
267
+ len = ngx_ssj_ja3_num_digits (ja3 -> curves [i ]);
268
+ ngx_snprintf (out -> data + cur , len , "%d" , ja3 -> curves [i ]);
269
+ cur += len ;
270
+
271
+ if (added == 0 ) {
272
+ added = 1 ;
273
+ }
262
274
}
263
- len = ngx_ssj_ja3_num_digits (ja3 -> curves [i ]);
264
- ngx_snprintf (out -> data + cur , len , "%d" , ja3 -> curves [i ]);
265
- cur += len ;
266
275
}
267
276
}
268
277
ngx_snprintf (out -> data + (cur ++ ), 1 , "," );
@@ -299,6 +308,7 @@ ngx_ssl_ja3(ngx_connection_t *c, ngx_pool_t *pool, ngx_ssl_ja3_t *ja3) {
299
308
SSL * ssl ;
300
309
size_t len = 0 ;
301
310
unsigned short us = 0 ;
311
+ unsigned short alternate = 1 ;
302
312
303
313
if (! c -> ssl ) {
304
314
return NGX_DECLINED ;
@@ -344,15 +354,21 @@ ngx_ssl_ja3(ngx_connection_t *c, ngx_pool_t *pool, ngx_ssl_ja3_t *ja3) {
344
354
ja3 -> extensions = NULL ;
345
355
ja3 -> extensions_sz = 0 ;
346
356
if (c -> ssl -> extensions_size && c -> ssl -> extensions ) {
347
- len = c -> ssl -> extensions_size * sizeof (int );
357
+ len = c -> ssl -> extensions_size * sizeof (int ) * 2 ;
348
358
ja3 -> extensions = ngx_pnalloc (pool , len );
349
359
if (ja3 -> extensions == NULL ) {
350
360
return NGX_DECLINED ;
351
361
}
352
362
for (size_t i = 0 ; i < c -> ssl -> extensions_size ; ++ i ) {
353
- if (! ngx_ssl_ja3_is_ext_greased (c -> ssl -> extensions [i ])) {
363
+ if (! ngx_ssl_ja3_is_ext_greased (c -> ssl -> extensions [i ]) && alternate ) {
354
364
ja3 -> extensions [ja3 -> extensions_sz ++ ] = c -> ssl -> extensions [i ];
355
365
}
366
+
367
+ if (alternate ) {
368
+ alternate = 0 ;
369
+ } else {
370
+ alternate = 1 ;
371
+ }
356
372
}
357
373
}
358
374
0 commit comments