Skip to content

Commit 4186a9f

Browse files
committed
split src/nginx_ssl_fingerprint.c
1 parent 2935e94 commit 4186a9f

File tree

3 files changed

+250
-243
lines changed

3 files changed

+250
-243
lines changed

config

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ STREAM_MODULES="ngx_stream_ssl_fingerprint_preread_module $STREAM_MODULES"
99
HTTP_MODULES="$HTTP_MODULES ngx_http_ssl_fingerprint_module"
1010

1111
NGX_ADDON_SRCS="$NGX_ADDON_SRCS \
12+
$ngx_addon_dir/src/nginx_ssl_fingerprint.c \
1213
$ngx_addon_dir/src/ngx_stream_ssl_fingerprint_preread_module.c \
1314
$ngx_addon_dir/src/ngx_http_ssl_fingerprint_module.c
1415
"

src/nginx_ssl_fingerprint.c

+248
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
1+
#include <ngx_config.h>
2+
#include <ngx_core.h>
3+
#include <ngx_http.h>
4+
#include <ngx_log.h>
5+
#include <ngx_http_v2.h>
6+
7+
static inline
8+
unsigned char *append_uint8(unsigned char* dst, uint8_t n)
9+
{
10+
if (n < 10) {
11+
*dst = n + '0';
12+
dst++;
13+
} else if (n < 100) {
14+
*(dst+1) = n % 10 + '0';
15+
*dst = n / 10 + '0';
16+
dst += 2;
17+
} else {
18+
*(dst+2) = n % 10 + '0';
19+
n /= 10;
20+
*(dst+1) = n % 10 + '0';
21+
*dst = n / 10 + '0';
22+
dst += 3;
23+
}
24+
25+
return dst;
26+
}
27+
28+
static inline
29+
unsigned char *append_uint16(unsigned char* dst, uint16_t n)
30+
{
31+
if (n < 10) {
32+
*dst = n + '0';
33+
dst++;
34+
} else if (n < 100) {
35+
*(dst+1) = n % 10 + '0';
36+
*dst = n / 10 + '0';
37+
dst += 2;
38+
} else if (n < 1000) {
39+
*(dst+2) = n % 10 + '0';
40+
n /= 10;
41+
*(dst+1) = n % 10 + '0';
42+
*dst = n / 10 + '0';
43+
dst += 3;
44+
} else if (n < 10000) {
45+
*(dst+3) = n % 10 + '0';
46+
n /= 10;
47+
*(dst+2) = n % 10 + '0';
48+
n /= 10;
49+
*(dst+1) = n % 10 + '0';
50+
*dst = n / 10 + '0';
51+
dst += 4;
52+
} else {
53+
*(dst+4) = n % 10 + '0';
54+
n /= 10;
55+
*(dst+3) = n % 10 + '0';
56+
n /= 10;
57+
*(dst+2) = n % 10 + '0';
58+
n /= 10;
59+
*(dst+1) = n % 10 + '0';
60+
*dst = n / 10 + '0';
61+
dst += 5;
62+
}
63+
64+
return dst;
65+
}
66+
67+
static inline
68+
unsigned char *append_uint32(unsigned char* dst, uint32_t n)
69+
{
70+
if (n < 10) {
71+
*dst = n + '0';
72+
dst++;
73+
} else if (n < 100) {
74+
*(dst+1) = n % 10 + '0';
75+
*dst = n / 10 + '0';
76+
dst += 2;
77+
} else if (n < 1000) {
78+
*(dst+2) = n % 10 + '0';
79+
n /= 10;
80+
*(dst+1) = n % 10 + '0';
81+
*dst = n / 10 + '0';
82+
dst += 3;
83+
} else if (n < 10000) {
84+
*(dst+3) = n % 10 + '0';
85+
n /= 10;
86+
*(dst+2) = n % 10 + '0';
87+
n /= 10;
88+
*(dst+1) = n % 10 + '0';
89+
*dst = n / 10 + '0';
90+
dst += 4;
91+
} else if (n < 100000) {
92+
*(dst+4) = n % 10 + '0';
93+
n /= 10;
94+
*(dst+3) = n % 10 + '0';
95+
n /= 10;
96+
*(dst+2) = n % 10 + '0';
97+
n /= 10;
98+
*(dst+1) = n % 10 + '0';
99+
*dst = n / 10 + '0';
100+
dst += 5;
101+
} else if (n < 1000000) {
102+
*(dst+5) = n % 10 + '0';
103+
n /= 10;
104+
*(dst+4) = n % 10 + '0';
105+
n /= 10;
106+
*(dst+3) = n % 10 + '0';
107+
n /= 10;
108+
*(dst+2) = n % 10 + '0';
109+
n /= 10;
110+
*(dst+1) = n % 10 + '0';
111+
*dst = n / 10 + '0';
112+
dst += 6;
113+
} else if (n < 10000000) {
114+
*(dst+6) = n % 10 + '0';
115+
n /= 10;
116+
*(dst+5) = n % 10 + '0';
117+
n /= 10;
118+
*(dst+4) = n % 10 + '0';
119+
n /= 10;
120+
*(dst+3) = n % 10 + '0';
121+
n /= 10;
122+
*(dst+2) = n % 10 + '0';
123+
n /= 10;
124+
*(dst+1) = n % 10 + '0';
125+
*dst = n / 10 + '0';
126+
dst += 7;
127+
} else if (n < 100000000) {
128+
*(dst+7) = n % 10 + '0';
129+
n /= 10;
130+
*(dst+6) = n % 10 + '0';
131+
n /= 10;
132+
*(dst+5) = n % 10 + '0';
133+
n /= 10;
134+
*(dst+4) = n % 10 + '0';
135+
n /= 10;
136+
*(dst+3) = n % 10 + '0';
137+
n /= 10;
138+
*(dst+2) = n % 10 + '0';
139+
n /= 10;
140+
*(dst+1) = n % 10 + '0';
141+
*dst = n / 10 + '0';
142+
dst += 8;
143+
} else if (n < 1000000000) {
144+
*(dst+8) = n % 10 + '0';
145+
n /= 10;
146+
*(dst+7) = n % 10 + '0';
147+
n /= 10;
148+
*(dst+6) = n % 10 + '0';
149+
n /= 10;
150+
*(dst+5) = n % 10 + '0';
151+
n /= 10;
152+
*(dst+4) = n % 10 + '0';
153+
n /= 10;
154+
*(dst+3) = n % 10 + '0';
155+
n /= 10;
156+
*(dst+2) = n % 10 + '0';
157+
n /= 10;
158+
*(dst+1) = n % 10 + '0';
159+
*dst = n / 10 + '0';
160+
dst += 9;
161+
} else {
162+
*(dst+9) = n % 10 + '0';
163+
n /= 10;
164+
*(dst+8) = n % 10 + '0';
165+
n /= 10;
166+
*(dst+7) = n % 10 + '0';
167+
n /= 10;
168+
*(dst+6) = n % 10 + '0';
169+
n /= 10;
170+
*(dst+5) = n % 10 + '0';
171+
n /= 10;
172+
*(dst+4) = n % 10 + '0';
173+
n /= 10;
174+
*(dst+3) = n % 10 + '0';
175+
n /= 10;
176+
*(dst+2) = n % 10 + '0';
177+
n /= 10;
178+
*(dst+1) = n % 10 + '0';
179+
*dst = n / 10 + '0';
180+
dst += 10;
181+
}
182+
183+
return dst;
184+
}
185+
186+
int ngx_http2_fingerprint(ngx_connection_t *c, ngx_http_v2_connection_t *h2c, ngx_pool_t *pool, ngx_str_t *fingerprint)
187+
{
188+
unsigned char *pstr = NULL;
189+
unsigned short n = 0;
190+
size_t i;
191+
192+
if (!h2c) {
193+
return NGX_DECLINED;
194+
}
195+
196+
n = 4 + h2c->fp_settings.len * 3 + 10 + h2c->fp_priorities.len * 2 + h2c->fp_pseudoheaders.len * 2;
197+
fingerprint->data = ngx_pnalloc(pool, n);
198+
pstr = fingerprint->data;
199+
200+
#if (NGX_DEBUG)
201+
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "http2 fingerprint alloc bytes: [%d]\n", n);
202+
#endif
203+
204+
/* setting */
205+
for (i = 0; i < h2c->fp_settings.len; i+=5) {
206+
pstr = append_uint8(pstr, h2c->fp_settings.data[i]);
207+
*pstr++ = ':';
208+
pstr = append_uint32(pstr, *(uint32_t*)(h2c->fp_settings.data+i+1));
209+
*pstr++ = ';';
210+
}
211+
*(pstr-1) = '|';
212+
213+
/* windows update */
214+
pstr = append_uint32(pstr, h2c->fp_windowupdate);
215+
*pstr++ = '|';
216+
217+
/* priorities */
218+
for (i = 0; i < h2c->fp_priorities.len; i+=4) {
219+
pstr = append_uint8(pstr, h2c->fp_priorities.data[i]);
220+
*pstr++ = ':';
221+
pstr = append_uint8(pstr, h2c->fp_priorities.data[i+1]);
222+
*pstr++ = ':';
223+
pstr = append_uint8(pstr, h2c->fp_priorities.data[i+2]);
224+
*pstr++ = ':';
225+
pstr = append_uint16(pstr, (uint16_t)h2c->fp_priorities.data[i+3]+1);
226+
*pstr++ = ',';
227+
}
228+
*(pstr-1) = '|';
229+
230+
/* fp_pseudoheaders */
231+
for (i = 0; i < h2c->fp_pseudoheaders.len; i++) {
232+
*pstr++ = h2c->fp_pseudoheaders.data[i];
233+
*pstr++ = ',';
234+
}
235+
236+
/* null terminator */
237+
*--pstr = 0;
238+
239+
fingerprint->len = pstr - fingerprint->data;
240+
241+
h2c->fp_fingerprinted = 1;
242+
243+
#if (NGX_DEBUG)
244+
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "http2 fingerprint: [%V]\n", fingerprint);
245+
#endif
246+
247+
return NGX_OK;
248+
}

0 commit comments

Comments
 (0)