1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * lws-minimal-secure-streams-policy2c
3*1c60b9acSAndroid Build Coastguard Worker *
4*1c60b9acSAndroid Build Coastguard Worker * Written in 2010-2021 by Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker *
6*1c60b9acSAndroid Build Coastguard Worker * This file is made available under the Creative Commons CC0 1.0
7*1c60b9acSAndroid Build Coastguard Worker * Universal Public Domain Dedication.
8*1c60b9acSAndroid Build Coastguard Worker *
9*1c60b9acSAndroid Build Coastguard Worker *
10*1c60b9acSAndroid Build Coastguard Worker * This reads policy JSON on stdin and emits it as compileable
11*1c60b9acSAndroid Build Coastguard Worker * C structs.
12*1c60b9acSAndroid Build Coastguard Worker *
13*1c60b9acSAndroid Build Coastguard Worker * It's useful if your platform is too space-constrained for a
14*1c60b9acSAndroid Build Coastguard Worker * JSON policy and needs to build a static policy in C via
15*1c60b9acSAndroid Build Coastguard Worker * LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY... this way you can
16*1c60b9acSAndroid Build Coastguard Worker * still create and maintain the JSON policy but implement it directly
17*1c60b9acSAndroid Build Coastguard Worker * as C structs in your code.
18*1c60b9acSAndroid Build Coastguard Worker */
19*1c60b9acSAndroid Build Coastguard Worker
20*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
21*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
22*1c60b9acSAndroid Build Coastguard Worker #include <signal.h>
23*1c60b9acSAndroid Build Coastguard Worker #include <stdio.h>
24*1c60b9acSAndroid Build Coastguard Worker #include <assert.h>
25*1c60b9acSAndroid Build Coastguard Worker
26*1c60b9acSAndroid Build Coastguard Worker static int interrupted, bad = 1;
27*1c60b9acSAndroid Build Coastguard Worker
28*1c60b9acSAndroid Build Coastguard Worker
29*1c60b9acSAndroid Build Coastguard Worker static void
sigint_handler(int sig)30*1c60b9acSAndroid Build Coastguard Worker sigint_handler(int sig)
31*1c60b9acSAndroid Build Coastguard Worker {
32*1c60b9acSAndroid Build Coastguard Worker interrupted = 1;
33*1c60b9acSAndroid Build Coastguard Worker }
34*1c60b9acSAndroid Build Coastguard Worker
35*1c60b9acSAndroid Build Coastguard Worker struct aggstr {
36*1c60b9acSAndroid Build Coastguard Worker struct aggstr *next;
37*1c60b9acSAndroid Build Coastguard Worker
38*1c60b9acSAndroid Build Coastguard Worker const char *orig;
39*1c60b9acSAndroid Build Coastguard Worker size_t offset;
40*1c60b9acSAndroid Build Coastguard Worker };
41*1c60b9acSAndroid Build Coastguard Worker
42*1c60b9acSAndroid Build Coastguard Worker static struct aggstr *rbomap, /* retry / backoff object map */
43*1c60b9acSAndroid Build Coastguard Worker *trustmap, /* trust store map */
44*1c60b9acSAndroid Build Coastguard Worker *certmap; /* x.509 cert map */
45*1c60b9acSAndroid Build Coastguard Worker static size_t last_offset;
46*1c60b9acSAndroid Build Coastguard Worker
47*1c60b9acSAndroid Build Coastguard Worker
48*1c60b9acSAndroid Build Coastguard Worker
49*1c60b9acSAndroid Build Coastguard Worker static const char *
purify_csymbol(const char * in,char * temp,size_t templen)50*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(const char *in, char *temp, size_t templen)
51*1c60b9acSAndroid Build Coastguard Worker {
52*1c60b9acSAndroid Build Coastguard Worker const char *otemp = temp;
53*1c60b9acSAndroid Build Coastguard Worker
54*1c60b9acSAndroid Build Coastguard Worker assert (strlen(in) < templen);
55*1c60b9acSAndroid Build Coastguard Worker
56*1c60b9acSAndroid Build Coastguard Worker while (*in) {
57*1c60b9acSAndroid Build Coastguard Worker if ((*in >= 'a' && *in <= 'z') || (*in >= 'A' && *in <= 'Z') ||
58*1c60b9acSAndroid Build Coastguard Worker (*in >= '0' && *in <= '9'))
59*1c60b9acSAndroid Build Coastguard Worker *temp++ = *in;
60*1c60b9acSAndroid Build Coastguard Worker else
61*1c60b9acSAndroid Build Coastguard Worker *temp++ = '_';
62*1c60b9acSAndroid Build Coastguard Worker
63*1c60b9acSAndroid Build Coastguard Worker in++;
64*1c60b9acSAndroid Build Coastguard Worker }
65*1c60b9acSAndroid Build Coastguard Worker
66*1c60b9acSAndroid Build Coastguard Worker *temp = '\0';
67*1c60b9acSAndroid Build Coastguard Worker
68*1c60b9acSAndroid Build Coastguard Worker return otemp;
69*1c60b9acSAndroid Build Coastguard Worker }
70*1c60b9acSAndroid Build Coastguard Worker
main(int argc,const char ** argv)71*1c60b9acSAndroid Build Coastguard Worker int main(int argc, const char **argv)
72*1c60b9acSAndroid Build Coastguard Worker {
73*1c60b9acSAndroid Build Coastguard Worker const lws_ss_policy_t *pol, *lastpol = NULL;
74*1c60b9acSAndroid Build Coastguard Worker struct lws_context_creation_info info;
75*1c60b9acSAndroid Build Coastguard Worker size_t json_size = 0, est = 0;
76*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context;
77*1c60b9acSAndroid Build Coastguard Worker const lws_ss_auth_t *auth;
78*1c60b9acSAndroid Build Coastguard Worker char prev[128], curr[128];
79*1c60b9acSAndroid Build Coastguard Worker int unique_rbo = 0, m, n;
80*1c60b9acSAndroid Build Coastguard Worker char buf[64], buf1[64];
81*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t *md;
82*1c60b9acSAndroid Build Coastguard Worker struct aggstr *a, *a1;
83*1c60b9acSAndroid Build Coastguard Worker
84*1c60b9acSAndroid Build Coastguard Worker signal(SIGINT, sigint_handler);
85*1c60b9acSAndroid Build Coastguard Worker
86*1c60b9acSAndroid Build Coastguard Worker memset(&info, 0, sizeof info);
87*1c60b9acSAndroid Build Coastguard Worker lws_cmdline_option_handle_builtin(argc, argv, &info);
88*1c60b9acSAndroid Build Coastguard Worker
89*1c60b9acSAndroid Build Coastguard Worker lwsl_user("LWS secure streams policy2c [-d<verb>]\n");
90*1c60b9acSAndroid Build Coastguard Worker
91*1c60b9acSAndroid Build Coastguard Worker info.fd_limit_per_thread = 1 + 6 + 1;
92*1c60b9acSAndroid Build Coastguard Worker info.port = CONTEXT_PORT_NO_LISTEN;
93*1c60b9acSAndroid Build Coastguard Worker
94*1c60b9acSAndroid Build Coastguard Worker info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS |
95*1c60b9acSAndroid Build Coastguard Worker LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
96*1c60b9acSAndroid Build Coastguard Worker
97*1c60b9acSAndroid Build Coastguard Worker /* create the context */
98*1c60b9acSAndroid Build Coastguard Worker
99*1c60b9acSAndroid Build Coastguard Worker context = lws_create_context(&info);
100*1c60b9acSAndroid Build Coastguard Worker if (!context) {
101*1c60b9acSAndroid Build Coastguard Worker lwsl_err("lws init failed\n");
102*1c60b9acSAndroid Build Coastguard Worker return 1;
103*1c60b9acSAndroid Build Coastguard Worker }
104*1c60b9acSAndroid Build Coastguard Worker
105*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_parse_begin(context, 0);
106*1c60b9acSAndroid Build Coastguard Worker
107*1c60b9acSAndroid Build Coastguard Worker printf("/*\n * Autogenerated from the following JSON policy\n */\n\n#if 0\n");
108*1c60b9acSAndroid Build Coastguard Worker
109*1c60b9acSAndroid Build Coastguard Worker do {
110*1c60b9acSAndroid Build Coastguard Worker int m, n = (int)read(0, buf, sizeof(buf));
111*1c60b9acSAndroid Build Coastguard Worker
112*1c60b9acSAndroid Build Coastguard Worker if (n < 1)
113*1c60b9acSAndroid Build Coastguard Worker break;
114*1c60b9acSAndroid Build Coastguard Worker
115*1c60b9acSAndroid Build Coastguard Worker m = lws_ss_policy_parse(context, (uint8_t *)buf, (size_t)n);
116*1c60b9acSAndroid Build Coastguard Worker
117*1c60b9acSAndroid Build Coastguard Worker printf("%.*s", n, buf);
118*1c60b9acSAndroid Build Coastguard Worker json_size += (unsigned int)n;
119*1c60b9acSAndroid Build Coastguard Worker
120*1c60b9acSAndroid Build Coastguard Worker if (m < 0 && m != LEJP_CONTINUE) {
121*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: policy parse failed... lws has WITH_ROLEs"
122*1c60b9acSAndroid Build Coastguard Worker "for what's in the JSON?\n", __func__);
123*1c60b9acSAndroid Build Coastguard Worker goto bail;
124*1c60b9acSAndroid Build Coastguard Worker }
125*1c60b9acSAndroid Build Coastguard Worker } while (1);
126*1c60b9acSAndroid Build Coastguard Worker
127*1c60b9acSAndroid Build Coastguard Worker printf("\n\n Original JSON size: %zu\n#endif\n\n", json_size);
128*1c60b9acSAndroid Build Coastguard Worker
129*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%s: parsed JSON\n", __func__);
130*1c60b9acSAndroid Build Coastguard Worker
131*1c60b9acSAndroid Build Coastguard Worker /*
132*1c60b9acSAndroid Build Coastguard Worker * Well, this is fun, isn't it... we have parsed the JSON into in-memory
133*1c60b9acSAndroid Build Coastguard Worker * policy objects, and it has set the context policy pointer to the head
134*1c60b9acSAndroid Build Coastguard Worker * of those but has not set the new policy (which would free the x.509).
135*1c60b9acSAndroid Build Coastguard Worker *
136*1c60b9acSAndroid Build Coastguard Worker * We want to walk the streamtype list first discovering unique objects
137*1c60b9acSAndroid Build Coastguard Worker * and strings referenced there and emitting them compactly as C data,
138*1c60b9acSAndroid Build Coastguard Worker * and then second to emit the streamtype linked-list referring to those
139*1c60b9acSAndroid Build Coastguard Worker * objects.
140*1c60b9acSAndroid Build Coastguard Worker *
141*1c60b9acSAndroid Build Coastguard Worker * For const strings, we aggregate them and avoid generating extra
142*1c60b9acSAndroid Build Coastguard Worker * pointers by encoding the reference as &_lws_ss_staticpol_str[xxx]
143*1c60b9acSAndroid Build Coastguard Worker * where xxx is the fixed offset in the aggregated monster-string. When
144*1c60b9acSAndroid Build Coastguard Worker * doing that, we keep a map of original pointers to offsets.
145*1c60b9acSAndroid Build Coastguard Worker *
146*1c60b9acSAndroid Build Coastguard Worker * Although we want to minimize memory used by the emitted C, we don't
147*1c60b9acSAndroid Build Coastguard Worker * have to sweat memory during this conversion since it's happening on a
148*1c60b9acSAndroid Build Coastguard Worker * PC
149*1c60b9acSAndroid Build Coastguard Worker */
150*1c60b9acSAndroid Build Coastguard Worker
151*1c60b9acSAndroid Build Coastguard Worker pol = lws_ss_policy_get(context);
152*1c60b9acSAndroid Build Coastguard Worker
153*1c60b9acSAndroid Build Coastguard Worker while (pol) {
154*1c60b9acSAndroid Build Coastguard Worker
155*1c60b9acSAndroid Build Coastguard Worker /*
156*1c60b9acSAndroid Build Coastguard Worker * Walk the metadata list gathering strings and issuing the
157*1c60b9acSAndroid Build Coastguard Worker * C struct
158*1c60b9acSAndroid Build Coastguard Worker */
159*1c60b9acSAndroid Build Coastguard Worker
160*1c60b9acSAndroid Build Coastguard Worker md = pol->metadata;
161*1c60b9acSAndroid Build Coastguard Worker
162*1c60b9acSAndroid Build Coastguard Worker if (md) {
163*1c60b9acSAndroid Build Coastguard Worker int idx = 0;
164*1c60b9acSAndroid Build Coastguard Worker
165*1c60b9acSAndroid Build Coastguard Worker printf("\nstatic const lws_ss_metadata_t ");
166*1c60b9acSAndroid Build Coastguard Worker
167*1c60b9acSAndroid Build Coastguard Worker prev[0] = '\0';
168*1c60b9acSAndroid Build Coastguard Worker md = pol->metadata;
169*1c60b9acSAndroid Build Coastguard Worker while (md) {
170*1c60b9acSAndroid Build Coastguard Worker
171*1c60b9acSAndroid Build Coastguard Worker est += sizeof(lws_ss_metadata_t);
172*1c60b9acSAndroid Build Coastguard Worker
173*1c60b9acSAndroid Build Coastguard Worker lws_snprintf(curr, sizeof(curr), "_md_%s_%s",
174*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(pol->streamtype, buf,
175*1c60b9acSAndroid Build Coastguard Worker sizeof(buf)),
176*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(md->name, buf1,
177*1c60b9acSAndroid Build Coastguard Worker sizeof(buf1)));
178*1c60b9acSAndroid Build Coastguard Worker
179*1c60b9acSAndroid Build Coastguard Worker printf("%s = {\n", curr);
180*1c60b9acSAndroid Build Coastguard Worker if (prev[0])
181*1c60b9acSAndroid Build Coastguard Worker printf("\t.next = (void *)&%s, \n", prev);
182*1c60b9acSAndroid Build Coastguard Worker
183*1c60b9acSAndroid Build Coastguard Worker printf("\t.name = \"%s\",\n", (const char *)md->name);
184*1c60b9acSAndroid Build Coastguard Worker if (md->value__may_own_heap) {
185*1c60b9acSAndroid Build Coastguard Worker printf("\t.value__may_own_heap = (void *)\"%s\",\n",
186*1c60b9acSAndroid Build Coastguard Worker (const char *)md->value__may_own_heap);
187*1c60b9acSAndroid Build Coastguard Worker printf("\t.value_length = 0x%x,\n",
188*1c60b9acSAndroid Build Coastguard Worker (unsigned int)strlen(
189*1c60b9acSAndroid Build Coastguard Worker (const char *)md->value__may_own_heap));
190*1c60b9acSAndroid Build Coastguard Worker }
191*1c60b9acSAndroid Build Coastguard Worker
192*1c60b9acSAndroid Build Coastguard Worker printf("\t.length = %d,\n", idx++); // md->length);
193*1c60b9acSAndroid Build Coastguard Worker printf("\t.value_is_http_token = 0x%x,\n",
194*1c60b9acSAndroid Build Coastguard Worker (unsigned int)md->value_is_http_token);
195*1c60b9acSAndroid Build Coastguard Worker printf("}");
196*1c60b9acSAndroid Build Coastguard Worker if (md->next)
197*1c60b9acSAndroid Build Coastguard Worker printf(",\n");
198*1c60b9acSAndroid Build Coastguard Worker
199*1c60b9acSAndroid Build Coastguard Worker lws_strncpy(prev, curr, sizeof(prev));
200*1c60b9acSAndroid Build Coastguard Worker
201*1c60b9acSAndroid Build Coastguard Worker md = md->next;
202*1c60b9acSAndroid Build Coastguard Worker }
203*1c60b9acSAndroid Build Coastguard Worker
204*1c60b9acSAndroid Build Coastguard Worker printf(";\n\n");
205*1c60b9acSAndroid Build Coastguard Worker }
206*1c60b9acSAndroid Build Coastguard Worker
207*1c60b9acSAndroid Build Coastguard Worker /*
208*1c60b9acSAndroid Build Coastguard Worker * Create unique retry policies... have we seen this guy?
209*1c60b9acSAndroid Build Coastguard Worker */
210*1c60b9acSAndroid Build Coastguard Worker
211*1c60b9acSAndroid Build Coastguard Worker if (pol->retry_bo) {
212*1c60b9acSAndroid Build Coastguard Worker a = rbomap;
213*1c60b9acSAndroid Build Coastguard Worker while (a) {
214*1c60b9acSAndroid Build Coastguard Worker if (a->orig == (const char *)pol->retry_bo)
215*1c60b9acSAndroid Build Coastguard Worker break;
216*1c60b9acSAndroid Build Coastguard Worker
217*1c60b9acSAndroid Build Coastguard Worker a = a->next;
218*1c60b9acSAndroid Build Coastguard Worker }
219*1c60b9acSAndroid Build Coastguard Worker
220*1c60b9acSAndroid Build Coastguard Worker if (!a) {
221*1c60b9acSAndroid Build Coastguard Worker
222*1c60b9acSAndroid Build Coastguard Worker /* We haven't seen it before and need to create it */
223*1c60b9acSAndroid Build Coastguard Worker
224*1c60b9acSAndroid Build Coastguard Worker a = malloc(sizeof(*a));
225*1c60b9acSAndroid Build Coastguard Worker if (!a)
226*1c60b9acSAndroid Build Coastguard Worker goto bail;
227*1c60b9acSAndroid Build Coastguard Worker a->next = rbomap;
228*1c60b9acSAndroid Build Coastguard Worker a->offset = (unsigned int)unique_rbo++;
229*1c60b9acSAndroid Build Coastguard Worker a->orig = (const char *)pol->retry_bo;
230*1c60b9acSAndroid Build Coastguard Worker rbomap = a;
231*1c60b9acSAndroid Build Coastguard Worker
232*1c60b9acSAndroid Build Coastguard Worker printf("static const uint32_t _rbo_bo_%zu[] = {\n",
233*1c60b9acSAndroid Build Coastguard Worker a->offset);
234*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < pol->retry_bo->retry_ms_table_count; n++)
235*1c60b9acSAndroid Build Coastguard Worker printf(" %u, ", (unsigned int)
236*1c60b9acSAndroid Build Coastguard Worker pol->retry_bo->retry_ms_table[n]);
237*1c60b9acSAndroid Build Coastguard Worker
238*1c60b9acSAndroid Build Coastguard Worker est += sizeof(uint32_t) *
239*1c60b9acSAndroid Build Coastguard Worker pol->retry_bo->retry_ms_table_count;
240*1c60b9acSAndroid Build Coastguard Worker
241*1c60b9acSAndroid Build Coastguard Worker printf("\n};\nstatic const "
242*1c60b9acSAndroid Build Coastguard Worker "lws_retry_bo_t _rbo_%zu = {\n", a->offset);
243*1c60b9acSAndroid Build Coastguard Worker
244*1c60b9acSAndroid Build Coastguard Worker printf("\t.retry_ms_table = _rbo_bo_%zu,\n",
245*1c60b9acSAndroid Build Coastguard Worker a->offset);
246*1c60b9acSAndroid Build Coastguard Worker printf("\t.retry_ms_table_count = %u,\n",
247*1c60b9acSAndroid Build Coastguard Worker pol->retry_bo->retry_ms_table_count);
248*1c60b9acSAndroid Build Coastguard Worker printf("\t.conceal_count = %u,\n",
249*1c60b9acSAndroid Build Coastguard Worker pol->retry_bo->conceal_count);
250*1c60b9acSAndroid Build Coastguard Worker printf("\t.secs_since_valid_ping = %u,\n",
251*1c60b9acSAndroid Build Coastguard Worker pol->retry_bo->secs_since_valid_ping);
252*1c60b9acSAndroid Build Coastguard Worker printf("\t.secs_since_valid_hangup = %u,\n",
253*1c60b9acSAndroid Build Coastguard Worker pol->retry_bo->secs_since_valid_hangup);
254*1c60b9acSAndroid Build Coastguard Worker printf("\t.jitter_percent = %u,\n",
255*1c60b9acSAndroid Build Coastguard Worker pol->retry_bo->jitter_percent);
256*1c60b9acSAndroid Build Coastguard Worker printf("};\n");
257*1c60b9acSAndroid Build Coastguard Worker
258*1c60b9acSAndroid Build Coastguard Worker est += sizeof(lws_retry_bo_t);
259*1c60b9acSAndroid Build Coastguard Worker }
260*1c60b9acSAndroid Build Coastguard Worker }
261*1c60b9acSAndroid Build Coastguard Worker
262*1c60b9acSAndroid Build Coastguard Worker /*
263*1c60b9acSAndroid Build Coastguard Worker * How about his trust store, it's new to us?
264*1c60b9acSAndroid Build Coastguard Worker */
265*1c60b9acSAndroid Build Coastguard Worker
266*1c60b9acSAndroid Build Coastguard Worker if (pol->trust.store) {
267*1c60b9acSAndroid Build Coastguard Worker a = trustmap;
268*1c60b9acSAndroid Build Coastguard Worker while (a) {
269*1c60b9acSAndroid Build Coastguard Worker if (a->orig == (const char *)pol->trust.store)
270*1c60b9acSAndroid Build Coastguard Worker break;
271*1c60b9acSAndroid Build Coastguard Worker
272*1c60b9acSAndroid Build Coastguard Worker a = a->next;
273*1c60b9acSAndroid Build Coastguard Worker }
274*1c60b9acSAndroid Build Coastguard Worker
275*1c60b9acSAndroid Build Coastguard Worker if (!a) {
276*1c60b9acSAndroid Build Coastguard Worker
277*1c60b9acSAndroid Build Coastguard Worker /* it's new to us... */
278*1c60b9acSAndroid Build Coastguard Worker
279*1c60b9acSAndroid Build Coastguard Worker a = malloc(sizeof(*a));
280*1c60b9acSAndroid Build Coastguard Worker if (!a)
281*1c60b9acSAndroid Build Coastguard Worker goto bail;
282*1c60b9acSAndroid Build Coastguard Worker a->next = trustmap;
283*1c60b9acSAndroid Build Coastguard Worker a->offset = 0; /* don't care, just track seen */
284*1c60b9acSAndroid Build Coastguard Worker a->orig = (const char *)pol->trust.store;
285*1c60b9acSAndroid Build Coastguard Worker trustmap = a;
286*1c60b9acSAndroid Build Coastguard Worker
287*1c60b9acSAndroid Build Coastguard Worker /*
288*1c60b9acSAndroid Build Coastguard Worker * Have a look through his x.509 stack...
289*1c60b9acSAndroid Build Coastguard Worker * any that're new to us?
290*1c60b9acSAndroid Build Coastguard Worker */
291*1c60b9acSAndroid Build Coastguard Worker
292*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < pol->trust.store->count; n++) {
293*1c60b9acSAndroid Build Coastguard Worker if (!pol->trust.store->ssx509[n])
294*1c60b9acSAndroid Build Coastguard Worker continue;
295*1c60b9acSAndroid Build Coastguard Worker a1 = certmap;
296*1c60b9acSAndroid Build Coastguard Worker while (a1) {
297*1c60b9acSAndroid Build Coastguard Worker if (a1->orig == (const char *)pol->trust.store->ssx509[n])
298*1c60b9acSAndroid Build Coastguard Worker break;
299*1c60b9acSAndroid Build Coastguard Worker a1 = a1->next;
300*1c60b9acSAndroid Build Coastguard Worker }
301*1c60b9acSAndroid Build Coastguard Worker
302*1c60b9acSAndroid Build Coastguard Worker if (!a1) {
303*1c60b9acSAndroid Build Coastguard Worker /*
304*1c60b9acSAndroid Build Coastguard Worker * This x.509 cert is new to us...
305*1c60b9acSAndroid Build Coastguard Worker * let's capture the DER
306*1c60b9acSAndroid Build Coastguard Worker */
307*1c60b9acSAndroid Build Coastguard Worker
308*1c60b9acSAndroid Build Coastguard Worker a1 = malloc(sizeof(*a1));
309*1c60b9acSAndroid Build Coastguard Worker if (!a1)
310*1c60b9acSAndroid Build Coastguard Worker goto bail;
311*1c60b9acSAndroid Build Coastguard Worker a1->next = certmap;
312*1c60b9acSAndroid Build Coastguard Worker a1->offset = 0; /* don't care, just track seen */
313*1c60b9acSAndroid Build Coastguard Worker a1->orig = (const char *)pol->trust.store->ssx509[n];
314*1c60b9acSAndroid Build Coastguard Worker certmap = a1;
315*1c60b9acSAndroid Build Coastguard Worker
316*1c60b9acSAndroid Build Coastguard Worker printf("static const uint8_t _ss_der_%s[] = {\n",
317*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(pol->trust.store->ssx509[n]->vhost_name,
318*1c60b9acSAndroid Build Coastguard Worker buf, sizeof(buf)));
319*1c60b9acSAndroid Build Coastguard Worker
320*1c60b9acSAndroid Build Coastguard Worker for (m = 0; m < (int)pol->trust.store->ssx509[n]->ca_der_len; m++) {
321*1c60b9acSAndroid Build Coastguard Worker if ((m & 7) == 0)
322*1c60b9acSAndroid Build Coastguard Worker printf("\t/* 0x%3x */ ", m);
323*1c60b9acSAndroid Build Coastguard Worker
324*1c60b9acSAndroid Build Coastguard Worker printf("0x%02X, ", pol->trust.store->ssx509[n]->ca_der[m]);
325*1c60b9acSAndroid Build Coastguard Worker if ((m & 7) == 7)
326*1c60b9acSAndroid Build Coastguard Worker printf("\n");
327*1c60b9acSAndroid Build Coastguard Worker }
328*1c60b9acSAndroid Build Coastguard Worker
329*1c60b9acSAndroid Build Coastguard Worker printf("\n};\nstatic const lws_ss_x509_t _ss_x509_%s = {\n",
330*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(pol->trust.store->ssx509[n]->vhost_name,
331*1c60b9acSAndroid Build Coastguard Worker buf, sizeof(buf)));
332*1c60b9acSAndroid Build Coastguard Worker printf("\t.vhost_name = \"%s\",\n", pol->trust.store->ssx509[n]->vhost_name);
333*1c60b9acSAndroid Build Coastguard Worker printf("\t.ca_der = _ss_der_%s,\n",
334*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(pol->trust.store->ssx509[n]->vhost_name,
335*1c60b9acSAndroid Build Coastguard Worker buf, sizeof(buf)));
336*1c60b9acSAndroid Build Coastguard Worker printf("\t.ca_der_len = %zu,\n", pol->trust.store->ssx509[n]->ca_der_len);
337*1c60b9acSAndroid Build Coastguard Worker printf("};\n");
338*1c60b9acSAndroid Build Coastguard Worker
339*1c60b9acSAndroid Build Coastguard Worker est += sizeof(lws_ss_x509_t) + pol->trust.store->ssx509[n]->ca_der_len;
340*1c60b9acSAndroid Build Coastguard Worker }
341*1c60b9acSAndroid Build Coastguard Worker
342*1c60b9acSAndroid Build Coastguard Worker }
343*1c60b9acSAndroid Build Coastguard Worker
344*1c60b9acSAndroid Build Coastguard Worker
345*1c60b9acSAndroid Build Coastguard Worker printf("static const lws_ss_trust_store_t _ss_ts_%s = {\n",
346*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(pol->trust.store->name,
347*1c60b9acSAndroid Build Coastguard Worker buf, sizeof(buf)));
348*1c60b9acSAndroid Build Coastguard Worker
349*1c60b9acSAndroid Build Coastguard Worker printf("\t.name = \"%s\",\n", pol->trust.store->name);
350*1c60b9acSAndroid Build Coastguard Worker printf("\t.count = %d,\n", pol->trust.store->count);
351*1c60b9acSAndroid Build Coastguard Worker printf("\t.ssx509 = {\n");
352*1c60b9acSAndroid Build Coastguard Worker
353*1c60b9acSAndroid Build Coastguard Worker for (n = pol->trust.store->count - 1; n >= 0 ; n--)
354*1c60b9acSAndroid Build Coastguard Worker printf("\t\t&_ss_x509_%s,\n",
355*1c60b9acSAndroid Build Coastguard Worker pol->trust.store->ssx509[n]->vhost_name);
356*1c60b9acSAndroid Build Coastguard Worker
357*1c60b9acSAndroid Build Coastguard Worker printf("\t}\n};\n");
358*1c60b9acSAndroid Build Coastguard Worker
359*1c60b9acSAndroid Build Coastguard Worker est += sizeof(lws_ss_trust_store_t);
360*1c60b9acSAndroid Build Coastguard Worker
361*1c60b9acSAndroid Build Coastguard Worker }
362*1c60b9acSAndroid Build Coastguard Worker }
363*1c60b9acSAndroid Build Coastguard Worker
364*1c60b9acSAndroid Build Coastguard Worker pol = pol->next;
365*1c60b9acSAndroid Build Coastguard Worker }
366*1c60b9acSAndroid Build Coastguard Worker
367*1c60b9acSAndroid Build Coastguard Worker
368*1c60b9acSAndroid Build Coastguard Worker /* dump any streamtype's http resp map */
369*1c60b9acSAndroid Build Coastguard Worker
370*1c60b9acSAndroid Build Coastguard Worker pol = lws_ss_policy_get(context);
371*1c60b9acSAndroid Build Coastguard Worker m = 0;
372*1c60b9acSAndroid Build Coastguard Worker
373*1c60b9acSAndroid Build Coastguard Worker while (pol) {
374*1c60b9acSAndroid Build Coastguard Worker
375*1c60b9acSAndroid Build Coastguard Worker lws_snprintf(curr, sizeof(curr), "_ssp_%s",
376*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(pol->streamtype, buf, sizeof(buf)));
377*1c60b9acSAndroid Build Coastguard Worker
378*1c60b9acSAndroid Build Coastguard Worker /* if relevant, dump http resp map */
379*1c60b9acSAndroid Build Coastguard Worker
380*1c60b9acSAndroid Build Coastguard Worker switch (pol->protocol) {
381*1c60b9acSAndroid Build Coastguard Worker case LWSSSP_H1:
382*1c60b9acSAndroid Build Coastguard Worker case LWSSSP_H2:
383*1c60b9acSAndroid Build Coastguard Worker case LWSSSP_WS:
384*1c60b9acSAndroid Build Coastguard Worker
385*1c60b9acSAndroid Build Coastguard Worker if (!pol->u.http.count_respmap)
386*1c60b9acSAndroid Build Coastguard Worker break;
387*1c60b9acSAndroid Build Coastguard Worker
388*1c60b9acSAndroid Build Coastguard Worker if (!m)
389*1c60b9acSAndroid Build Coastguard Worker printf("\nstatic const lws_ss_http_respmap_t ");
390*1c60b9acSAndroid Build Coastguard Worker else
391*1c60b9acSAndroid Build Coastguard Worker printf(",\n");
392*1c60b9acSAndroid Build Coastguard Worker m++;
393*1c60b9acSAndroid Build Coastguard Worker
394*1c60b9acSAndroid Build Coastguard Worker printf("%s_http_respmap[] = {\n", curr);
395*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < pol->u.http.count_respmap; n++) {
396*1c60b9acSAndroid Build Coastguard Worker printf("\t{ %d, 0x%x },\n",
397*1c60b9acSAndroid Build Coastguard Worker pol->u.http.respmap[n].resp,
398*1c60b9acSAndroid Build Coastguard Worker pol->u.http.respmap[n].state);
399*1c60b9acSAndroid Build Coastguard Worker
400*1c60b9acSAndroid Build Coastguard Worker est += sizeof(lws_ss_http_respmap_t);
401*1c60b9acSAndroid Build Coastguard Worker }
402*1c60b9acSAndroid Build Coastguard Worker printf("}");
403*1c60b9acSAndroid Build Coastguard Worker break;
404*1c60b9acSAndroid Build Coastguard Worker }
405*1c60b9acSAndroid Build Coastguard Worker
406*1c60b9acSAndroid Build Coastguard Worker pol = pol->next;
407*1c60b9acSAndroid Build Coastguard Worker }
408*1c60b9acSAndroid Build Coastguard Worker
409*1c60b9acSAndroid Build Coastguard Worker if (m)
410*1c60b9acSAndroid Build Coastguard Worker printf(";\n");
411*1c60b9acSAndroid Build Coastguard Worker
412*1c60b9acSAndroid Build Coastguard Worker /*
413*1c60b9acSAndroid Build Coastguard Worker * The auth map
414*1c60b9acSAndroid Build Coastguard Worker */
415*1c60b9acSAndroid Build Coastguard Worker
416*1c60b9acSAndroid Build Coastguard Worker auth = lws_ss_auth_get(context);
417*1c60b9acSAndroid Build Coastguard Worker if (auth)
418*1c60b9acSAndroid Build Coastguard Worker printf("\nstatic const lws_ss_auth_t ");
419*1c60b9acSAndroid Build Coastguard Worker prev[0] = '\0';
420*1c60b9acSAndroid Build Coastguard Worker
421*1c60b9acSAndroid Build Coastguard Worker while (auth) {
422*1c60b9acSAndroid Build Coastguard Worker lws_snprintf(curr, sizeof(curr), "_ssau_%s",
423*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(auth->name, buf, sizeof(buf)));
424*1c60b9acSAndroid Build Coastguard Worker
425*1c60b9acSAndroid Build Coastguard Worker printf("%s = {\n", curr);
426*1c60b9acSAndroid Build Coastguard Worker if (prev[0])
427*1c60b9acSAndroid Build Coastguard Worker printf("\t.next = (void *)&%s,\n", prev);
428*1c60b9acSAndroid Build Coastguard Worker
429*1c60b9acSAndroid Build Coastguard Worker printf("\t.name = \"%s\",\n", auth->name);
430*1c60b9acSAndroid Build Coastguard Worker printf("\t.type= \"%s\",\n", auth->type);
431*1c60b9acSAndroid Build Coastguard Worker printf("\t.streamtype = \"%s\",\n", auth->streamtype);
432*1c60b9acSAndroid Build Coastguard Worker printf("\t.blob_index = %d,\n", auth->blob_index);
433*1c60b9acSAndroid Build Coastguard Worker printf("}");
434*1c60b9acSAndroid Build Coastguard Worker if (auth->next)
435*1c60b9acSAndroid Build Coastguard Worker printf(",");
436*1c60b9acSAndroid Build Coastguard Worker else
437*1c60b9acSAndroid Build Coastguard Worker printf(";");
438*1c60b9acSAndroid Build Coastguard Worker printf("\n");
439*1c60b9acSAndroid Build Coastguard Worker
440*1c60b9acSAndroid Build Coastguard Worker lws_strncpy(prev, curr, sizeof(prev));
441*1c60b9acSAndroid Build Coastguard Worker
442*1c60b9acSAndroid Build Coastguard Worker auth = auth->next;
443*1c60b9acSAndroid Build Coastguard Worker }
444*1c60b9acSAndroid Build Coastguard Worker
445*1c60b9acSAndroid Build Coastguard Worker if (lws_ss_auth_get(context))
446*1c60b9acSAndroid Build Coastguard Worker printf("\n");
447*1c60b9acSAndroid Build Coastguard Worker
448*1c60b9acSAndroid Build Coastguard Worker /*
449*1c60b9acSAndroid Build Coastguard Worker * The streamtypes
450*1c60b9acSAndroid Build Coastguard Worker */
451*1c60b9acSAndroid Build Coastguard Worker
452*1c60b9acSAndroid Build Coastguard Worker pol = lws_ss_policy_get(context);
453*1c60b9acSAndroid Build Coastguard Worker
454*1c60b9acSAndroid Build Coastguard Worker printf("\nstatic const lws_ss_policy_t ");
455*1c60b9acSAndroid Build Coastguard Worker prev[0] = '\0';
456*1c60b9acSAndroid Build Coastguard Worker
457*1c60b9acSAndroid Build Coastguard Worker while (pol) {
458*1c60b9acSAndroid Build Coastguard Worker
459*1c60b9acSAndroid Build Coastguard Worker est += sizeof(*pol);
460*1c60b9acSAndroid Build Coastguard Worker
461*1c60b9acSAndroid Build Coastguard Worker lws_snprintf(curr, sizeof(curr), "_ssp_%s",
462*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(pol->streamtype, buf, sizeof(buf)));
463*1c60b9acSAndroid Build Coastguard Worker
464*1c60b9acSAndroid Build Coastguard Worker printf("%s = {\n", curr);
465*1c60b9acSAndroid Build Coastguard Worker
466*1c60b9acSAndroid Build Coastguard Worker if (prev[0])
467*1c60b9acSAndroid Build Coastguard Worker printf("\t.next = (void *)&%s,\n", prev);
468*1c60b9acSAndroid Build Coastguard Worker
469*1c60b9acSAndroid Build Coastguard Worker printf("\t.streamtype = \"%s\",\n", pol->streamtype);
470*1c60b9acSAndroid Build Coastguard Worker if (pol->endpoint)
471*1c60b9acSAndroid Build Coastguard Worker printf("\t.endpoint = \"%s\",\n", pol->endpoint);
472*1c60b9acSAndroid Build Coastguard Worker if (pol->rideshare_streamtype)
473*1c60b9acSAndroid Build Coastguard Worker printf("\t.rideshare_streamtype = \"%s\",\n",
474*1c60b9acSAndroid Build Coastguard Worker pol->rideshare_streamtype);
475*1c60b9acSAndroid Build Coastguard Worker if (pol->payload_fmt)
476*1c60b9acSAndroid Build Coastguard Worker printf("\t.payload_fmt = \"%s\",\n",
477*1c60b9acSAndroid Build Coastguard Worker pol->payload_fmt);
478*1c60b9acSAndroid Build Coastguard Worker if (pol->socks5_proxy)
479*1c60b9acSAndroid Build Coastguard Worker printf("\t.socks5_proxy = \"%s\",\n",
480*1c60b9acSAndroid Build Coastguard Worker pol->socks5_proxy);
481*1c60b9acSAndroid Build Coastguard Worker
482*1c60b9acSAndroid Build Coastguard Worker if (pol->auth)
483*1c60b9acSAndroid Build Coastguard Worker printf("\t.auth = &_ssau_%s,\n",
484*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(pol->auth->name, buf, sizeof(buf)));
485*1c60b9acSAndroid Build Coastguard Worker
486*1c60b9acSAndroid Build Coastguard Worker {
487*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t *nv = pol->metadata, *last = NULL;
488*1c60b9acSAndroid Build Coastguard Worker
489*1c60b9acSAndroid Build Coastguard Worker while (nv) {
490*1c60b9acSAndroid Build Coastguard Worker last = nv;
491*1c60b9acSAndroid Build Coastguard Worker nv = nv->next;
492*1c60b9acSAndroid Build Coastguard Worker }
493*1c60b9acSAndroid Build Coastguard Worker if (pol->metadata)
494*1c60b9acSAndroid Build Coastguard Worker printf("\t.metadata = (void *)&_md_%s_%s,\n",
495*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(pol->streamtype, buf, sizeof(buf)),
496*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(last->name, buf1, sizeof(buf1)));
497*1c60b9acSAndroid Build Coastguard Worker }
498*1c60b9acSAndroid Build Coastguard Worker
499*1c60b9acSAndroid Build Coastguard Worker
500*1c60b9acSAndroid Build Coastguard Worker switch (pol->protocol) {
501*1c60b9acSAndroid Build Coastguard Worker case LWSSSP_H1:
502*1c60b9acSAndroid Build Coastguard Worker case LWSSSP_H2:
503*1c60b9acSAndroid Build Coastguard Worker case LWSSSP_WS:
504*1c60b9acSAndroid Build Coastguard Worker
505*1c60b9acSAndroid Build Coastguard Worker printf("\t.u = {\n\t\t.http = {\n");
506*1c60b9acSAndroid Build Coastguard Worker
507*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.method)
508*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.method = \"%s\",\n",
509*1c60b9acSAndroid Build Coastguard Worker pol->u.http.method);
510*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.url)
511*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.url = \"%s\",\n",
512*1c60b9acSAndroid Build Coastguard Worker pol->u.http.url);
513*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.multipart_name)
514*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.multipart_name = \"%s\",\n",
515*1c60b9acSAndroid Build Coastguard Worker pol->u.http.multipart_name);
516*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.multipart_filename)
517*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.multipart_filename = \"%s\",\n",
518*1c60b9acSAndroid Build Coastguard Worker pol->u.http.multipart_filename);
519*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.multipart_content_type)
520*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.multipart_content_type = \"%s\",\n",
521*1c60b9acSAndroid Build Coastguard Worker pol->u.http.multipart_content_type);
522*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.auth_preamble)
523*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.auth_preamble = \"%s\",\n",
524*1c60b9acSAndroid Build Coastguard Worker pol->u.http.auth_preamble);
525*1c60b9acSAndroid Build Coastguard Worker
526*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.respmap) {
527*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.respmap = (void *)&%s_http_respmap,\n",
528*1c60b9acSAndroid Build Coastguard Worker curr);
529*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.count_respmap = %d,\n",
530*1c60b9acSAndroid Build Coastguard Worker pol->u.http.count_respmap);
531*1c60b9acSAndroid Build Coastguard Worker }
532*1c60b9acSAndroid Build Coastguard Worker
533*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.blob_header[0]) {
534*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.blob_header = {\n");
535*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < (int)LWS_ARRAY_SIZE(pol->u.http.blob_header); n++)
536*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.blob_header[n])
537*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t\t\"%s\",\n",
538*1c60b9acSAndroid Build Coastguard Worker pol->u.http.blob_header[n]);
539*1c60b9acSAndroid Build Coastguard Worker
540*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t},\n");
541*1c60b9acSAndroid Build Coastguard Worker }
542*1c60b9acSAndroid Build Coastguard Worker
543*1c60b9acSAndroid Build Coastguard Worker if (pol->protocol == LWSSSP_WS) {
544*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.u = {\n\t\t\t\t.ws = {\n");
545*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.u.ws.subprotocol)
546*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t\t\t.subprotocol = \"%s\",\n",
547*1c60b9acSAndroid Build Coastguard Worker pol->u.http.u.ws.subprotocol);
548*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t\t\t.binary = %u\n", pol->u.http.u.ws.binary);
549*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t\t}\n\t\t\t},\n");
550*1c60b9acSAndroid Build Coastguard Worker }
551*1c60b9acSAndroid Build Coastguard Worker
552*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.resp_expect)
553*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.resp_expect = %u,\n", pol->u.http.resp_expect);
554*1c60b9acSAndroid Build Coastguard Worker if (pol->u.http.fail_redirect)
555*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.fail_redirect = %u,\n", pol->u.http.fail_redirect);
556*1c60b9acSAndroid Build Coastguard Worker
557*1c60b9acSAndroid Build Coastguard Worker printf("\t\t}\n\t},\n");
558*1c60b9acSAndroid Build Coastguard Worker
559*1c60b9acSAndroid Build Coastguard Worker break;
560*1c60b9acSAndroid Build Coastguard Worker case LWSSSP_MQTT:
561*1c60b9acSAndroid Build Coastguard Worker
562*1c60b9acSAndroid Build Coastguard Worker printf("\t.u = {\n\t\t.mqtt = {\n");
563*1c60b9acSAndroid Build Coastguard Worker
564*1c60b9acSAndroid Build Coastguard Worker if (pol->u.mqtt.topic)
565*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.topic = \"%s\",\n",
566*1c60b9acSAndroid Build Coastguard Worker pol->u.mqtt.topic);
567*1c60b9acSAndroid Build Coastguard Worker if (pol->u.mqtt.subscribe)
568*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.subscribe = \"%s\",\n",
569*1c60b9acSAndroid Build Coastguard Worker pol->u.mqtt.subscribe);
570*1c60b9acSAndroid Build Coastguard Worker if (pol->u.mqtt.will_topic)
571*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.will_topic = \"%s\",\n",
572*1c60b9acSAndroid Build Coastguard Worker pol->u.mqtt.will_topic);
573*1c60b9acSAndroid Build Coastguard Worker if (pol->u.mqtt.will_message)
574*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.will_message = \"%s\",\n",
575*1c60b9acSAndroid Build Coastguard Worker pol->u.mqtt.will_message);
576*1c60b9acSAndroid Build Coastguard Worker
577*1c60b9acSAndroid Build Coastguard Worker if (pol->u.mqtt.keep_alive)
578*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.keep_alive = %u,\n",
579*1c60b9acSAndroid Build Coastguard Worker pol->u.mqtt.keep_alive);
580*1c60b9acSAndroid Build Coastguard Worker if (pol->u.mqtt.qos)
581*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.qos = %u,\n",
582*1c60b9acSAndroid Build Coastguard Worker pol->u.mqtt.qos);
583*1c60b9acSAndroid Build Coastguard Worker if (pol->u.mqtt.clean_start)
584*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.clean_start = %u,\n",
585*1c60b9acSAndroid Build Coastguard Worker pol->u.mqtt.clean_start);
586*1c60b9acSAndroid Build Coastguard Worker if (pol->u.mqtt.will_qos)
587*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.will_qos = %u,\n",
588*1c60b9acSAndroid Build Coastguard Worker pol->u.mqtt.will_qos);
589*1c60b9acSAndroid Build Coastguard Worker if (pol->u.mqtt.will_retain)
590*1c60b9acSAndroid Build Coastguard Worker printf("\t\t\t.will_retain = %u,\n",
591*1c60b9acSAndroid Build Coastguard Worker pol->u.mqtt.will_retain);
592*1c60b9acSAndroid Build Coastguard Worker
593*1c60b9acSAndroid Build Coastguard Worker printf("\t\t}\n\t},\n");
594*1c60b9acSAndroid Build Coastguard Worker
595*1c60b9acSAndroid Build Coastguard Worker break;
596*1c60b9acSAndroid Build Coastguard Worker default:
597*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: unknown ss protocol index %d\n", __func__,
598*1c60b9acSAndroid Build Coastguard Worker pol->protocol);
599*1c60b9acSAndroid Build Coastguard Worker goto bail;
600*1c60b9acSAndroid Build Coastguard Worker }
601*1c60b9acSAndroid Build Coastguard Worker
602*1c60b9acSAndroid Build Coastguard Worker #if 0
603*1c60b9acSAndroid Build Coastguard Worker const lws_ss_trust_store_t *trust_store; /**< CA certs needed for conn
604*1c60b9acSAndroid Build Coastguard Worker validation, only set between policy parsing and vhost creation */
605*1c60b9acSAndroid Build Coastguard Worker #endif
606*1c60b9acSAndroid Build Coastguard Worker
607*1c60b9acSAndroid Build Coastguard Worker if (pol->retry_bo) {
608*1c60b9acSAndroid Build Coastguard Worker a = rbomap;
609*1c60b9acSAndroid Build Coastguard Worker while (a) {
610*1c60b9acSAndroid Build Coastguard Worker if (a->orig == (const char *)pol->retry_bo)
611*1c60b9acSAndroid Build Coastguard Worker break;
612*1c60b9acSAndroid Build Coastguard Worker
613*1c60b9acSAndroid Build Coastguard Worker a = a->next;
614*1c60b9acSAndroid Build Coastguard Worker }
615*1c60b9acSAndroid Build Coastguard Worker if (!a)
616*1c60b9acSAndroid Build Coastguard Worker goto bail;
617*1c60b9acSAndroid Build Coastguard Worker
618*1c60b9acSAndroid Build Coastguard Worker printf("\t.retry_bo = &_rbo_%zu,\n", a->offset);
619*1c60b9acSAndroid Build Coastguard Worker }
620*1c60b9acSAndroid Build Coastguard Worker
621*1c60b9acSAndroid Build Coastguard Worker if (pol->timeout_ms)
622*1c60b9acSAndroid Build Coastguard Worker printf("\t.timeout_ms = %u,\n", pol->timeout_ms);
623*1c60b9acSAndroid Build Coastguard Worker if (pol->flags)
624*1c60b9acSAndroid Build Coastguard Worker printf("\t.flags = 0x%x,\n", pol->flags);
625*1c60b9acSAndroid Build Coastguard Worker if (pol->flags)
626*1c60b9acSAndroid Build Coastguard Worker printf("\t.priority = 0x%x,\n", (unsigned int)pol->priority);
627*1c60b9acSAndroid Build Coastguard Worker if (pol->port)
628*1c60b9acSAndroid Build Coastguard Worker printf("\t.port = %u,\n", pol->port);
629*1c60b9acSAndroid Build Coastguard Worker if (pol->metadata_count)
630*1c60b9acSAndroid Build Coastguard Worker printf("\t.metadata_count = %u,\n", pol->metadata_count);
631*1c60b9acSAndroid Build Coastguard Worker printf("\t.protocol = %u,\n", pol->protocol);
632*1c60b9acSAndroid Build Coastguard Worker if (pol->client_cert)
633*1c60b9acSAndroid Build Coastguard Worker printf("\t.client_cert = %u,\n", pol->client_cert);
634*1c60b9acSAndroid Build Coastguard Worker
635*1c60b9acSAndroid Build Coastguard Worker if (pol->trust.store)
636*1c60b9acSAndroid Build Coastguard Worker printf("\t.trust = {.store = &_ss_ts_%s},\n",
637*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(pol->trust.store->name,
638*1c60b9acSAndroid Build Coastguard Worker buf, sizeof(buf)));
639*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4)
640*1c60b9acSAndroid Build Coastguard Worker if (pol->aws_region)
641*1c60b9acSAndroid Build Coastguard Worker printf("\t.aws_region= \"%s\",\n", pol->aws_region);
642*1c60b9acSAndroid Build Coastguard Worker if (pol->aws_service)
643*1c60b9acSAndroid Build Coastguard Worker printf("\t.aws_service= \"%s\",\n", pol->aws_service);
644*1c60b9acSAndroid Build Coastguard Worker
645*1c60b9acSAndroid Build Coastguard Worker #endif
646*1c60b9acSAndroid Build Coastguard Worker
647*1c60b9acSAndroid Build Coastguard Worker
648*1c60b9acSAndroid Build Coastguard Worker printf("}");
649*1c60b9acSAndroid Build Coastguard Worker if (pol->next)
650*1c60b9acSAndroid Build Coastguard Worker printf(",\n");
651*1c60b9acSAndroid Build Coastguard Worker
652*1c60b9acSAndroid Build Coastguard Worker lws_strncpy(prev, curr, sizeof(prev));
653*1c60b9acSAndroid Build Coastguard Worker
654*1c60b9acSAndroid Build Coastguard Worker lastpol = pol;
655*1c60b9acSAndroid Build Coastguard Worker
656*1c60b9acSAndroid Build Coastguard Worker pol = pol->next;
657*1c60b9acSAndroid Build Coastguard Worker }
658*1c60b9acSAndroid Build Coastguard Worker
659*1c60b9acSAndroid Build Coastguard Worker printf(";\n");
660*1c60b9acSAndroid Build Coastguard Worker if (lastpol)
661*1c60b9acSAndroid Build Coastguard Worker printf("#define _ss_static_policy_entry _ssp_%s\n",
662*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(lastpol->streamtype, buf, sizeof(buf)));
663*1c60b9acSAndroid Build Coastguard Worker
664*1c60b9acSAndroid Build Coastguard Worker est += last_offset;
665*1c60b9acSAndroid Build Coastguard Worker
666*1c60b9acSAndroid Build Coastguard Worker printf("/* estimated footprint %zu (when sizeof void * = %zu) */\n",
667*1c60b9acSAndroid Build Coastguard Worker est, sizeof(void *));
668*1c60b9acSAndroid Build Coastguard Worker
669*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_parse_abandon(context);
670*1c60b9acSAndroid Build Coastguard Worker bad = 0;
671*1c60b9acSAndroid Build Coastguard Worker
672*1c60b9acSAndroid Build Coastguard Worker bail:
673*1c60b9acSAndroid Build Coastguard Worker
674*1c60b9acSAndroid Build Coastguard Worker
675*1c60b9acSAndroid Build Coastguard Worker lws_context_destroy(context);
676*1c60b9acSAndroid Build Coastguard Worker
677*1c60b9acSAndroid Build Coastguard Worker lwsl_user("Completed: %s\n", bad ? "failed" : "OK");
678*1c60b9acSAndroid Build Coastguard Worker
679*1c60b9acSAndroid Build Coastguard Worker return bad;
680*1c60b9acSAndroid Build Coastguard Worker }
681