Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions patches/nginx.1.17.1.ssl.extensions.patch
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
diff -r d964b0aee8e7 src/event/ngx_event_openssl.c
--- a/src/event/ngx_event_openssl.c Thu May 23 16:49:22 2019 +0300
+++ b/src/event/ngx_event_openssl.c Sat Jun 01 14:53:52 2019 +0000
@@ -1588,6 +1588,107 @@
@@ -1588,6 +1588,108 @@
return NGX_OK;
}

Expand All @@ -14,6 +14,7 @@ diff -r d964b0aee8e7 src/event/ngx_event_openssl.c
+ unsigned short *ciphers_out = NULL;
+ int *curves_out = NULL;
+ int *point_formats_out = NULL;
+ size_t i;
+ size_t len = 0;
+ SSL *s = NULL;
+
Expand Down Expand Up @@ -42,7 +43,7 @@ diff -r d964b0aee8e7 src/event/ngx_event_openssl.c
+ len = c->ssl->curves_sz * sizeof(unsigned short);
+ c->ssl->curves = ngx_pnalloc(c->pool, len);
+ if (c->ssl->curves != NULL) {
+ for (size_t i = 0; i < c->ssl->curves_sz; i++) {
+ for (i = 0; i < c->ssl->curves_sz; i++) {
+ c->ssl->curves[i] = curves_out[i];
+ }
+ }
Expand Down
39 changes: 22 additions & 17 deletions src/ngx_ssl_ja3.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ static const unsigned short GREASE[] = {
static int
ngx_ssl_ja3_is_ext_greased(int id)
{
for (size_t i = 0; i < (sizeof(GREASE) / sizeof(GREASE[0])); ++i) {
size_t i;
for (i = 0; i < (sizeof(GREASE) / sizeof(GREASE[0])); ++i) {
if (id == GREASE[i]) {
return 1;
}
Expand Down Expand Up @@ -96,9 +97,10 @@ static const int nid_list[] = {
static unsigned short
ngx_ssl_ja3_nid_to_cid(int nid)
{
unsigned char i;
unsigned char sz = (sizeof(nid_list) / sizeof(nid_list[0]));

for (unsigned char i = 0; i < sz; i++) {
for (i = 0; i < sz; i++) {
if (nid == nid_list[i]) {
return i+1;
}
Expand All @@ -125,6 +127,7 @@ ngx_ssj_ja3_num_digits(int n)
static void
ngx_ssl_ja3_detail_print(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3)
{
size_t i;
/* Version */
ngx_log_debug1(NGX_LOG_DEBUG_EVENT,
pool->log, 0, "ssl_ja3: Version: %d\n", ja3->version);
Expand All @@ -134,7 +137,7 @@ ngx_ssl_ja3_detail_print(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3)
pool->log, 0, "ssl_ja3: ciphers: length: %d\n",
ja3->ciphers_sz);

for (size_t i = 0; i < ja3->ciphers_sz; ++i) {
for (i = 0; i < ja3->ciphers_sz; ++i) {
ngx_log_debug2(NGX_LOG_DEBUG_EVENT,
pool->log, 0, "ssl_ja3: | cipher: 0x%04uxD -> %d",
ja3->ciphers[i],
Expand All @@ -147,7 +150,7 @@ ngx_ssl_ja3_detail_print(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3)
pool->log, 0, "ssl_ja3: extensions: length: %d\n",
ja3->extensions_sz);

for (size_t i = 0; i < ja3->extensions_sz; ++i) {
for (i = 0; i < ja3->extensions_sz; ++i) {
ngx_log_debug2(NGX_LOG_DEBUG_EVENT,
pool->log, 0, "ssl_ja3: | extension: 0x%04uxD -> %d",
ja3->extensions[i],
Expand All @@ -160,7 +163,7 @@ ngx_ssl_ja3_detail_print(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3)
pool->log, 0, "ssl_ja3: curves: length: %d\n",
ja3->curves_sz);

for (size_t i = 0; i < ja3->curves_sz; ++i) {
for (i = 0; i < ja3->curves_sz; ++i) {
ngx_log_debug2(NGX_LOG_DEBUG_EVENT,
pool->log, 0, "ssl_ja3: | curves: 0x%04uxD -> %d",
ja3->curves[i],
Expand All @@ -172,7 +175,7 @@ ngx_ssl_ja3_detail_print(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3)
ngx_log_debug1(NGX_LOG_DEBUG_EVENT,
pool->log, 0, "ssl_ja3: formats: length: %d\n",
ja3->point_formats_sz);
for (size_t i = 0; i < ja3->point_formats_sz; ++i) {
for (i = 0; i < ja3->point_formats_sz; ++i) {
ngx_log_debug1(NGX_LOG_DEBUG_EVENT,
pool->log, 0, "ssl_ja3: | format: %d",
ja3->point_formats[i]
Expand All @@ -185,6 +188,7 @@ ngx_ssl_ja3_detail_print(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3)
void
ngx_ssl_ja3_fp(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3, ngx_str_t *out)
{
size_t i;
size_t len = 0, cur = 0;

if (pool == NULL || ja3 == NULL || out == NULL) {
Expand All @@ -195,31 +199,31 @@ ngx_ssl_ja3_fp(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3, ngx_str_t *out)
++len; /* ',' separator */

if (ja3->ciphers_sz) {
for (size_t i = 0; i < ja3->ciphers_sz; ++i) {
for (i = 0; i < ja3->ciphers_sz; ++i) {
len += ngx_ssj_ja3_num_digits(ja3->ciphers[i]); /* cipher [i] */
}
len += (ja3->ciphers_sz - 1); /* '-' separators */
}
++len; /* ',' separator */

if (ja3->extensions_sz) {
for (size_t i = 0; i < ja3->extensions_sz; ++i) {
for (i = 0; i < ja3->extensions_sz; ++i) {
len += ngx_ssj_ja3_num_digits(ja3->extensions[i]); /* ext [i] */
}
len += (ja3->extensions_sz - 1); /* '-' separators */
}
++len; /* ',' separator */

if (ja3->curves_sz) {
for (size_t i = 0; i < ja3->curves_sz; ++i) {
for (i = 0; i < ja3->curves_sz; ++i) {
len += ngx_ssj_ja3_num_digits(ja3->curves[i]); /* curves [i] */
}
len += (ja3->curves_sz - 1); /* '-' separators */
}
++len; /* ',' separator */

if (ja3->point_formats_sz) {
for (size_t i = 0; i < ja3->point_formats_sz; ++i) {
for (i = 0; i < ja3->point_formats_sz; ++i) {
len += ngx_ssj_ja3_num_digits(ja3->point_formats[i]); /* fmt [i] */
}
len += (ja3->point_formats_sz - 1); /* '-' separators */
Expand All @@ -233,7 +237,7 @@ ngx_ssl_ja3_fp(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3, ngx_str_t *out)
cur += len;

if (ja3->ciphers_sz) {
for (size_t i = 0; i < ja3->ciphers_sz; ++i) {
for (i = 0; i < ja3->ciphers_sz; ++i) {
if (i > 0) {
ngx_snprintf(out->data + (cur++), 1, "-");
}
Expand All @@ -245,7 +249,7 @@ ngx_ssl_ja3_fp(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3, ngx_str_t *out)
ngx_snprintf(out->data + (cur++), 1, ",");

if (ja3->extensions_sz) {
for (size_t i = 0; i < ja3->extensions_sz; i++) {
for (i = 0; i < ja3->extensions_sz; i++) {
if (i > 0) {
ngx_snprintf(out->data + (cur++), 1, "-");
}
Expand All @@ -257,7 +261,7 @@ ngx_ssl_ja3_fp(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3, ngx_str_t *out)
ngx_snprintf(out->data + (cur++), 1, ",");

if (ja3->curves_sz) {
for (size_t i = 0; i < ja3->curves_sz; i++) {
for (i = 0; i < ja3->curves_sz; i++) {
if (i > 0) {
ngx_snprintf(out->data + (cur++), 1, "-");
}
Expand All @@ -269,7 +273,7 @@ ngx_ssl_ja3_fp(ngx_pool_t *pool, ngx_ssl_ja3_t *ja3, ngx_str_t *out)
ngx_snprintf(out->data + (cur++), 1, ",");

if (ja3->point_formats_sz) {
for (size_t i = 0; i < ja3->point_formats_sz; i++) {
for (i = 0; i < ja3->point_formats_sz; i++) {
if (i > 0) {
ngx_snprintf(out->data + (cur++), 1, "-");
}
Expand Down Expand Up @@ -297,6 +301,7 @@ int
ngx_ssl_ja3(ngx_connection_t *c, ngx_pool_t *pool, ngx_ssl_ja3_t *ja3) {

SSL *ssl;
size_t i;
size_t len = 0;
unsigned short us = 0;

Expand Down Expand Up @@ -327,7 +332,7 @@ ngx_ssl_ja3(ngx_connection_t *c, ngx_pool_t *pool, ngx_ssl_ja3_t *ja3) {
return NGX_DECLINED;
}
/* Filter out GREASE extensions */
for (size_t i = 0; i < c->ssl->ciphers_sz; ++i) {
for (i = 0; i < c->ssl->ciphers_sz; ++i) {
us = ntohs(c->ssl->ciphers[i]);
if (! ngx_ssl_ja3_is_ext_greased(us)) {
ja3->ciphers[ja3->ciphers_sz++] = us;
Expand All @@ -344,7 +349,7 @@ ngx_ssl_ja3(ngx_connection_t *c, ngx_pool_t *pool, ngx_ssl_ja3_t *ja3) {
if (ja3->extensions == NULL) {
return NGX_DECLINED;
}
for (size_t i = 0; i < c->ssl->extensions_size; ++i) {
for (i = 0; i < c->ssl->extensions_size; ++i) {
if (! ngx_ssl_ja3_is_ext_greased(c->ssl->extensions[i])) {
ja3->extensions[ja3->extensions_sz++] = c->ssl->extensions[i];
}
Expand All @@ -360,7 +365,7 @@ ngx_ssl_ja3(ngx_connection_t *c, ngx_pool_t *pool, ngx_ssl_ja3_t *ja3) {
if (ja3->curves == NULL) {
return NGX_DECLINED;
}
for (size_t i = 0; i < c->ssl->curves_sz; i++) {
for (i = 0; i < c->ssl->curves_sz; i++) {
us = ntohs(c->ssl->curves[i]);
if (! ngx_ssl_ja3_is_ext_greased(us)) {
ja3->curves[ja3->curves_sz++] = ngx_ssl_ja3_nid_to_cid(c->ssl->curves[i]);
Expand Down