1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * lws-minimal-secure-streams-server
3*1c60b9acSAndroid Build Coastguard Worker *
4*1c60b9acSAndroid Build Coastguard Worker * Written in 2010-2020 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 #include <libwebsockets.h>
11*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
12*1c60b9acSAndroid Build Coastguard Worker #include <signal.h>
13*1c60b9acSAndroid Build Coastguard Worker
14*1c60b9acSAndroid Build Coastguard Worker extern const lws_ss_info_t ssi_client, ssi_server;
15*1c60b9acSAndroid Build Coastguard Worker
16*1c60b9acSAndroid Build Coastguard Worker static struct lws_context *context;
17*1c60b9acSAndroid Build Coastguard Worker int interrupted, bad = 1, multipart;
18*1c60b9acSAndroid Build Coastguard Worker static const char * const default_ss_policy =
19*1c60b9acSAndroid Build Coastguard Worker "{"
20*1c60b9acSAndroid Build Coastguard Worker "\"release\":" "\"01234567\","
21*1c60b9acSAndroid Build Coastguard Worker "\"product\":" "\"myproduct\","
22*1c60b9acSAndroid Build Coastguard Worker "\"schema-version\":" "1,"
23*1c60b9acSAndroid Build Coastguard Worker "\"retry\": [" /* named backoff / retry strategies */
24*1c60b9acSAndroid Build Coastguard Worker "{\"default\": {"
25*1c60b9acSAndroid Build Coastguard Worker "\"backoff\": [" "1000,"
26*1c60b9acSAndroid Build Coastguard Worker "2000,"
27*1c60b9acSAndroid Build Coastguard Worker "3000,"
28*1c60b9acSAndroid Build Coastguard Worker "5000,"
29*1c60b9acSAndroid Build Coastguard Worker "10000"
30*1c60b9acSAndroid Build Coastguard Worker "],"
31*1c60b9acSAndroid Build Coastguard Worker "\"conceal\":" "5,"
32*1c60b9acSAndroid Build Coastguard Worker "\"jitterpc\":" "20,"
33*1c60b9acSAndroid Build Coastguard Worker "\"svalidping\":" "300,"
34*1c60b9acSAndroid Build Coastguard Worker "\"svalidhup\":" "310"
35*1c60b9acSAndroid Build Coastguard Worker "}}"
36*1c60b9acSAndroid Build Coastguard Worker "],"
37*1c60b9acSAndroid Build Coastguard Worker "\"certs\": [" /* named individual certificates in BASE64 DER */
38*1c60b9acSAndroid Build Coastguard Worker /*
39*1c60b9acSAndroid Build Coastguard Worker * Need to be in order from root cert... notice sometimes as
40*1c60b9acSAndroid Build Coastguard Worker * with Let's Encrypt there are multiple possible validation
41*1c60b9acSAndroid Build Coastguard Worker * paths, all the pieces for one validation path must be
42*1c60b9acSAndroid Build Coastguard Worker * given, excluding the server cert itself. Let's Encrypt
43*1c60b9acSAndroid Build Coastguard Worker * intermediate is signed by their ISRG Root CA but also is
44*1c60b9acSAndroid Build Coastguard Worker * cross-signed by an IdenTrust intermediate that's widely
45*1c60b9acSAndroid Build Coastguard Worker * deployed in browsers. We use the ISRG path because that
46*1c60b9acSAndroid Build Coastguard Worker * way we can skip the extra IdenTrust root cert.
47*1c60b9acSAndroid Build Coastguard Worker */
48*1c60b9acSAndroid Build Coastguard Worker "{\"isrg_root_x1\": \""
49*1c60b9acSAndroid Build Coastguard Worker "MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw"
50*1c60b9acSAndroid Build Coastguard Worker "TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh"
51*1c60b9acSAndroid Build Coastguard Worker "cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4"
52*1c60b9acSAndroid Build Coastguard Worker "WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu"
53*1c60b9acSAndroid Build Coastguard Worker "ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY"
54*1c60b9acSAndroid Build Coastguard Worker "MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc"
55*1c60b9acSAndroid Build Coastguard Worker "h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+"
56*1c60b9acSAndroid Build Coastguard Worker "0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U"
57*1c60b9acSAndroid Build Coastguard Worker "A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW"
58*1c60b9acSAndroid Build Coastguard Worker "T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH"
59*1c60b9acSAndroid Build Coastguard Worker "B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC"
60*1c60b9acSAndroid Build Coastguard Worker "B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv"
61*1c60b9acSAndroid Build Coastguard Worker "KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn"
62*1c60b9acSAndroid Build Coastguard Worker "OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn"
63*1c60b9acSAndroid Build Coastguard Worker "jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw"
64*1c60b9acSAndroid Build Coastguard Worker "qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI"
65*1c60b9acSAndroid Build Coastguard Worker "rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV"
66*1c60b9acSAndroid Build Coastguard Worker "HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq"
67*1c60b9acSAndroid Build Coastguard Worker "hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL"
68*1c60b9acSAndroid Build Coastguard Worker "ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ"
69*1c60b9acSAndroid Build Coastguard Worker "3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK"
70*1c60b9acSAndroid Build Coastguard Worker "NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5"
71*1c60b9acSAndroid Build Coastguard Worker "ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur"
72*1c60b9acSAndroid Build Coastguard Worker "TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC"
73*1c60b9acSAndroid Build Coastguard Worker "jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc"
74*1c60b9acSAndroid Build Coastguard Worker "oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq"
75*1c60b9acSAndroid Build Coastguard Worker "4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA"
76*1c60b9acSAndroid Build Coastguard Worker "mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d"
77*1c60b9acSAndroid Build Coastguard Worker "emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc="
78*1c60b9acSAndroid Build Coastguard Worker "\"},"
79*1c60b9acSAndroid Build Coastguard Worker /*
80*1c60b9acSAndroid Build Coastguard Worker * a selfsigned cert for localhost for 100 years
81*1c60b9acSAndroid Build Coastguard Worker */
82*1c60b9acSAndroid Build Coastguard Worker "{\"self_localhost\": \""
83*1c60b9acSAndroid Build Coastguard Worker "MIIF5jCCA86gAwIBAgIJANq50IuwPFKgMA0GCSqGSIb3DQEBCwUAMIGGMQswCQYD"
84*1c60b9acSAndroid Build Coastguard Worker "VQQGEwJHQjEQMA4GA1UECAwHRXJld2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEb"
85*1c60b9acSAndroid Build Coastguard Worker "MBkGA1UECgwSbGlid2Vic29ja2V0cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3Qx"
86*1c60b9acSAndroid Build Coastguard Worker "HzAdBgkqhkiG9w0BCQEWEG5vbmVAaW52YWxpZC5vcmcwIBcNMTgwMzIwMDQxNjA3"
87*1c60b9acSAndroid Build Coastguard Worker "WhgPMjExODAyMjQwNDE2MDdaMIGGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRXJl"
88*1c60b9acSAndroid Build Coastguard Worker "d2hvbjETMBEGA1UEBwwKQWxsIGFyb3VuZDEbMBkGA1UECgwSbGlid2Vic29ja2V0"
89*1c60b9acSAndroid Build Coastguard Worker "cy10ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEG5vbmVA"
90*1c60b9acSAndroid Build Coastguard Worker "aW52YWxpZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjYtuW"
91*1c60b9acSAndroid Build Coastguard Worker "aICCY0tJPubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8"
92*1c60b9acSAndroid Build Coastguard Worker "Di3DAmHKnSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTek"
93*1c60b9acSAndroid Build Coastguard Worker "LWcfI5ZZtoGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnH"
94*1c60b9acSAndroid Build Coastguard Worker "KT/m6DSU0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6"
95*1c60b9acSAndroid Build Coastguard Worker "jzhNyMBTJ1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQ"
96*1c60b9acSAndroid Build Coastguard Worker "Ujy5N8pSNp7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAz"
97*1c60b9acSAndroid Build Coastguard Worker "TK4l2pHNuC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBK"
98*1c60b9acSAndroid Build Coastguard Worker "Izv9cgi9fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0"
99*1c60b9acSAndroid Build Coastguard Worker "nPN1IMSnzXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzo"
100*1c60b9acSAndroid Build Coastguard Worker "GMTvP/AuehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9p"
101*1c60b9acSAndroid Build Coastguard Worker "sNcjTMaBQLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABo1MwUTAdBgNVHQ4EFgQU"
102*1c60b9acSAndroid Build Coastguard Worker "9mYU23tW2zsomkKTAXarjr2vjuswHwYDVR0jBBgwFoAU9mYU23tW2zsomkKTAXar"
103*1c60b9acSAndroid Build Coastguard Worker "jr2vjuswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEANjIBMrow"
104*1c60b9acSAndroid Build Coastguard Worker "YNCbhAJdP7dhlhT2RUFRdeRUJD0IxrH/hkvb6myHHnK8nOYezFPjUlmRKUgNEDuA"
105*1c60b9acSAndroid Build Coastguard Worker "xbnXZzPdCRNV9V2mShbXvCyiDY7WCQE2Bn44z26O0uWVk+7DNNLH9BnkwUtOnM9P"
106*1c60b9acSAndroid Build Coastguard Worker "wtmD9phWexm4q2GnTsiL6Ul6cy0QlTJWKVLEUQQ6yda582e23J1AXqtqFcpfoE34"
107*1c60b9acSAndroid Build Coastguard Worker "H3afEiGy882b+ZBiwkeV+oq6XVF8sFyr9zYrv9CvWTYlkpTQfLTZSsgPdEHYVcjv"
108*1c60b9acSAndroid Build Coastguard Worker "xQ2D+XyDR0aRLRlvxUa9dHGFHLICG34Juq5Ai6lM1EsoD8HSsJpMcmrH7MWw2cKk"
109*1c60b9acSAndroid Build Coastguard Worker "ujC3rMdFTtte83wF1uuF4FjUC72+SmcQN7A386BC/nk2TTsJawTDzqwOu/VdZv2g"
110*1c60b9acSAndroid Build Coastguard Worker "1WpTHlumlClZeP+G/jkSyDwqNnTu1aodDmUa4xZodfhP1HWPwUKFcq8oQr148QYA"
111*1c60b9acSAndroid Build Coastguard Worker "AOlbUOJQU7QwRWd1VbnwhDtQWXC92A2w1n/xkZSR1BM/NUSDhkBSUU1WjMbWg6Gg"
112*1c60b9acSAndroid Build Coastguard Worker "mnIZLRerQCu1Oozr87rOQqQakPkyt8BUSNK3K42j2qcfhAONdRl8Hq8Qs5pupy+s"
113*1c60b9acSAndroid Build Coastguard Worker "8sdCGDlwR3JNCMv6u48OK87F4mcIxhkSefFJUFII25pCGN5WtE4p5l+9cnO1GrIX"
114*1c60b9acSAndroid Build Coastguard Worker "e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE="
115*1c60b9acSAndroid Build Coastguard Worker "\"},"
116*1c60b9acSAndroid Build Coastguard Worker /*
117*1c60b9acSAndroid Build Coastguard Worker * the private key for above
118*1c60b9acSAndroid Build Coastguard Worker */
119*1c60b9acSAndroid Build Coastguard Worker "{\"self_localhost_key\": \""
120*1c60b9acSAndroid Build Coastguard Worker "MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCjYtuWaICCY0tJ"
121*1c60b9acSAndroid Build Coastguard Worker "PubxpIgIL+WWmz/fmK8IQr11Wtee6/IUyUlo5I602mq1qcLhT/kmpoR8Di3DAmHK"
122*1c60b9acSAndroid Build Coastguard Worker "nSWdPWtn1BtXLErLlUiHgZDrZWInmEBjKM1DZf+CvNGZ+EzPgBv5nTekLWcfI5ZZ"
123*1c60b9acSAndroid Build Coastguard Worker "toGuIP1Dl/IkNDw8zFz4cpiMe/BFGemyxdHhLrKHSm8Eo+nT734tItnHKT/m6DSU"
124*1c60b9acSAndroid Build Coastguard Worker "0xlZ13d6ehLRm7/+Nx47M3XMTRH5qKP/7TTE2s0U6+M0tsGI2zpRi+m6jzhNyMBT"
125*1c60b9acSAndroid Build Coastguard Worker "J1u58qAe3ZW5/+YAiuZYAB6n5bhUp4oFuB5wYbcBywVR8ujInpF8buWQUjy5N8pS"
126*1c60b9acSAndroid Build Coastguard Worker "Np7szdYsnLJpvAd0sibrNPjC0FQCNrpNjgJmIK3+mKk4kXX7ZTwefoAzTK4l2pHN"
127*1c60b9acSAndroid Build Coastguard Worker "uC53QVc/EF++GBLAxmvCDq9ZpMIYi7OmzkkAKKC9Ue6Ef217LFQCFIBKIzv9cgi9"
128*1c60b9acSAndroid Build Coastguard Worker "fwPMLhrKleoVRNsecBsCP569WgJXhUnwf2lon4fEZr3+vRuc9shfqnV0nPN1IMSn"
129*1c60b9acSAndroid Build Coastguard Worker "zXCast7I2fiuRXdIz96KjlGQpP4XfNVA+RGL7aMnWOFIaVrKWLzAtgzoGMTvP/Au"
130*1c60b9acSAndroid Build Coastguard Worker "ehKXncBJhYtW0ltTioVx+5yTYSAZWl+IssmXjefxJqYi2/7QWmv1QC9psNcjTMaB"
131*1c60b9acSAndroid Build Coastguard Worker "QLN03T1Qelbs7Y27sxdEnNUth4kI+wIDAQABAoICAFWe8MQZb37k2gdAV3Y6aq8f"
132*1c60b9acSAndroid Build Coastguard Worker "qokKQqbCNLd3giGFwYkezHXoJfg6Di7oZxNcKyw35LFEghkgtQqErQqo35VPIoH+"
133*1c60b9acSAndroid Build Coastguard Worker "vXUpWOjnCmM4muFA9/cX6mYMc8TmJsg0ewLdBCOZVw+wPABlaqz+0UOiSMMftpk9"
134*1c60b9acSAndroid Build Coastguard Worker "fz9JwGd8ERyBsT+tk3Qi6D0vPZVsC1KqxxL/cwIFd3Hf2ZBtJXe0KBn1pktWht5A"
135*1c60b9acSAndroid Build Coastguard Worker "Kqx9mld2Ovl7NjgiC1Fx9r+fZw/iOabFFwQA4dr+R8mEMK/7bd4VXfQ1o/QGGbMT"
136*1c60b9acSAndroid Build Coastguard Worker "G+ulFrsiDyP+rBIAaGC0i7gDjLAIBQeDhP409ZhswIEc/GBtODU372a2CQK/u4Q/"
137*1c60b9acSAndroid Build Coastguard Worker "HBQvuBtKFNkGUooLgCCbFxzgNUGc83GB/6IwbEM7R5uXqsFiE71LpmroDyjKTlQ8"
138*1c60b9acSAndroid Build Coastguard Worker "YZkpIcLNVLw0usoGYHFm2rvCyEVlfsE3Ub8cFyTFk50SeOcF2QL2xzKmmbZEpXgl"
139*1c60b9acSAndroid Build Coastguard Worker "xBHR0hjgon0IKJDGfor4bHO7Nt+1Ece8u2oTEKvpz5aIn44OeC5mApRGy83/0bvs"
140*1c60b9acSAndroid Build Coastguard Worker "esnWjDE/bGpoT8qFuy+0urDEPNId44XcJm1IRIlG56ErxC3l0s11wrIpTmXXckqw"
141*1c60b9acSAndroid Build Coastguard Worker "zFR9s2z7f0zjeyxqZg4NTPI7wkM3M8BXlvp2GTBIeoxrWB4V3YArwu8QF80QBgVz"
142*1c60b9acSAndroid Build Coastguard Worker "mgHl24nTg00UH1OjZsABAoIBAQDOxftSDbSqGytcWqPYP3SZHAWDA0O4ACEM+eCw"
143*1c60b9acSAndroid Build Coastguard Worker "au9ASutl0IDlNDMJ8nC2ph25BMe5hHDWp2cGQJog7pZ/3qQogQho2gUniKDifN77"
144*1c60b9acSAndroid Build Coastguard Worker "40QdykllTzTVROqmP8+efreIvqlzHmuqaGfGs5oTkZaWj5su+B+bT+9rIwZcwfs5"
145*1c60b9acSAndroid Build Coastguard Worker "YRINhQRx17qa++xh5mfE25c+M9fiIBTiNSo4lTxWMBShnK8xrGaMEmN7W0qTMbFH"
146*1c60b9acSAndroid Build Coastguard Worker "PgQz5FcxRjCCqwHilwNBeLDTp/ZECEB7y34khVh531mBE2mNzSVIQcGZP1I/DvXj"
147*1c60b9acSAndroid Build Coastguard Worker "W7UUNdgFwii/GW+6M0uUDy23UVQpbFzcV8o1C2nZc4Fb4zwBAoIBAQDKSJkFwwuR"
148*1c60b9acSAndroid Build Coastguard Worker "naVJS6WxOKjX8MCu9/cKPnwBv2mmI2jgGxHTw5sr3ahmF5eTb8Zo19BowytN+tr6"
149*1c60b9acSAndroid Build Coastguard Worker "2ZFoIBA9Ubc9esEAU8l3fggdfM82cuR9sGcfQVoCh8tMg6BP8IBLOmbSUhN3PG2m"
150*1c60b9acSAndroid Build Coastguard Worker "39I802u0fFNVQCJKhx1m1MFFLOu7lVcDS9JN+oYVPb6MDfBLm5jOiPuYkFZ4gH79"
151*1c60b9acSAndroid Build Coastguard Worker "J7gXI0/YKhaJ7yXthYVkdrSF6Eooer4RZgma62Dd1VNzSq3JBo6rYjF7Lvd+RwDC"
152*1c60b9acSAndroid Build Coastguard Worker "R1thHrmf/IXplxpNVkoMVxtzbrrbgnC25QmvRYc0rlS/kvM4yQhMH3eA7IycDZMp"
153*1c60b9acSAndroid Build Coastguard Worker "Y+0xm7I7jTT7AoIBAGKzKIMDXdCxBWKhNYJ8z7hiItNl1IZZMW2TPUiY0rl6yaCh"
154*1c60b9acSAndroid Build Coastguard Worker "BVXjM9W0r07QPnHZsUiByqb743adkbTUjmxdJzjaVtxN7ZXwZvOVrY7I7fPWYnCE"
155*1c60b9acSAndroid Build Coastguard Worker "fXCr4+IVpZI/ZHZWpGX6CGSgT6EOjCZ5IUufIvEpqVSmtF8MqfXO9o9uIYLokrWQ"
156*1c60b9acSAndroid Build Coastguard Worker "x1dBl5UnuTLDqw8bChq7O5y6yfuWaOWvL7nxI8NvSsfj4y635gIa/0dFeBYZEfHI"
157*1c60b9acSAndroid Build Coastguard Worker "UlGdNVomwXwYEzgE/c19ruIowX7HU/NgxMWTMZhpazlxgesXybel+YNcfDQ4e3RM"
158*1c60b9acSAndroid Build Coastguard Worker "OMz3ZFiaMaJsGGNf4++d9TmMgk4Ns6oDs6Tb9AECggEBAJYzd+SOYo26iBu3nw3L"
159*1c60b9acSAndroid Build Coastguard Worker "65uEeh6xou8pXH0Tu4gQrPQTRZZ/nT3iNgOwqu1gRuxcq7TOjt41UdqIKO8vN7/A"
160*1c60b9acSAndroid Build Coastguard Worker "aJavCpaKoIMowy/aGCbvAvjNPpU3unU8jdl/t08EXs79S5IKPcgAx87sTTi7KDN5"
161*1c60b9acSAndroid Build Coastguard Worker "SYt4tr2uPEe53NTXuSatilG5QCyExIELOuzWAMKzg7CAiIlNS9foWeLyVkBgCQ6S"
162*1c60b9acSAndroid Build Coastguard Worker "me/L8ta+mUDy37K6vC34jh9vK9yrwF6X44ItRoOJafCaVfGI+175q/eWcqTX4q+I"
163*1c60b9acSAndroid Build Coastguard Worker "G4tKls4sL4mgOJLq+ra50aYMxbcuommctPMXU6CrrYyQpPTHMNVDQy2ttFdsq9iK"
164*1c60b9acSAndroid Build Coastguard Worker "TncCggEBAMmt/8yvPflS+xv3kg/ZBvR9JB1In2n3rUCYYD47ReKFqJ03Vmq5C9nY"
165*1c60b9acSAndroid Build Coastguard Worker "56s9w7OUO8perBXlJYmKZQhO4293lvxZD2Iq4NcZbVSCMoHAUzhzY3brdgtSIxa2"
166*1c60b9acSAndroid Build Coastguard Worker "gGveGAezZ38qKIU26dkz7deECY4vrsRkwhpTW0LGVCpjcQoaKvymAoCmAs8V2oMr"
167*1c60b9acSAndroid Build Coastguard Worker "Ziw1YQ9uOUoWwOqm1wZqmVcOXvPIS2gWAs3fQlWjH9hkcQTMsUaXQDOD0aqkSY3E"
168*1c60b9acSAndroid Build Coastguard Worker "NqOvbCV1/oUpRi3076khCoAXI1bKSn/AvR3KDP14B5toHI/F5OTSEiGhhHesgRrs"
169*1c60b9acSAndroid Build Coastguard Worker "fBrpEY1IATtPq1taBZZogRqI3rOkkPk="
170*1c60b9acSAndroid Build Coastguard Worker "\"}"
171*1c60b9acSAndroid Build Coastguard Worker "],"
172*1c60b9acSAndroid Build Coastguard Worker "\"trust_stores\": [" /* named cert chains */
173*1c60b9acSAndroid Build Coastguard Worker "{"
174*1c60b9acSAndroid Build Coastguard Worker "\"name\": \"le_via_isrg\","
175*1c60b9acSAndroid Build Coastguard Worker "\"stack\": ["
176*1c60b9acSAndroid Build Coastguard Worker "\"isrg_root_x1\""
177*1c60b9acSAndroid Build Coastguard Worker "]"
178*1c60b9acSAndroid Build Coastguard Worker "}"
179*1c60b9acSAndroid Build Coastguard Worker "],"
180*1c60b9acSAndroid Build Coastguard Worker "\"s\": ["
181*1c60b9acSAndroid Build Coastguard Worker /*
182*1c60b9acSAndroid Build Coastguard Worker * Client streamtypes
183*1c60b9acSAndroid Build Coastguard Worker */
184*1c60b9acSAndroid Build Coastguard Worker
185*1c60b9acSAndroid Build Coastguard Worker "{\"mintest\": {"
186*1c60b9acSAndroid Build Coastguard Worker "\"endpoint\":" "\"warmcat.com\","
187*1c60b9acSAndroid Build Coastguard Worker "\"port\":" "443,"
188*1c60b9acSAndroid Build Coastguard Worker "\"protocol\":" "\"h2\","
189*1c60b9acSAndroid Build Coastguard Worker "\"http_method\":" "\"GET\","
190*1c60b9acSAndroid Build Coastguard Worker "\"http_url\":" "\"index.html\","
191*1c60b9acSAndroid Build Coastguard Worker "\"tls\":" "true,"
192*1c60b9acSAndroid Build Coastguard Worker "\"retry\":" "\"default\","
193*1c60b9acSAndroid Build Coastguard Worker "\"tls_trust_store\":" "\"le_via_isrg\""
194*1c60b9acSAndroid Build Coastguard Worker "}},"
195*1c60b9acSAndroid Build Coastguard Worker
196*1c60b9acSAndroid Build Coastguard Worker /*
197*1c60b9acSAndroid Build Coastguard Worker * This streamtype represents an h2 server listening on :7681,
198*1c60b9acSAndroid Build Coastguard Worker * using a 100-y self-signed tls cert
199*1c60b9acSAndroid Build Coastguard Worker */
200*1c60b9acSAndroid Build Coastguard Worker
201*1c60b9acSAndroid Build Coastguard Worker "{\"myserver\": {"
202*1c60b9acSAndroid Build Coastguard Worker /* if given, "endpoint" is network if to bind to */
203*1c60b9acSAndroid Build Coastguard Worker "\"server\":" "true,"
204*1c60b9acSAndroid Build Coastguard Worker "\"port\":" "7681,"
205*1c60b9acSAndroid Build Coastguard Worker "\"protocol\":" "\"h1\","
206*1c60b9acSAndroid Build Coastguard Worker "\"metadata\": [{"
207*1c60b9acSAndroid Build Coastguard Worker "\"mime\": \"Content-Type:\","
208*1c60b9acSAndroid Build Coastguard Worker "\"method\": \"\","
209*1c60b9acSAndroid Build Coastguard Worker "\"path\": \"\""
210*1c60b9acSAndroid Build Coastguard Worker "}],"
211*1c60b9acSAndroid Build Coastguard Worker "\"tls\":" "true,"
212*1c60b9acSAndroid Build Coastguard Worker /*
213*1c60b9acSAndroid Build Coastguard Worker * A ws server is an http server, if you give a
214*1c60b9acSAndroid Build Coastguard Worker * ws_subprotocol here it's understood we also serve
215*1c60b9acSAndroid Build Coastguard Worker * that ove ws or wss according to tls
216*1c60b9acSAndroid Build Coastguard Worker */
217*1c60b9acSAndroid Build Coastguard Worker "\"ws_subprotocol\":" "\"mywsprotocol\","
218*1c60b9acSAndroid Build Coastguard Worker "\"server_cert\":" "\"self_localhost\","
219*1c60b9acSAndroid Build Coastguard Worker "\"server_key\":" "\"self_localhost_key\""
220*1c60b9acSAndroid Build Coastguard Worker "}},"
221*1c60b9acSAndroid Build Coastguard Worker
222*1c60b9acSAndroid Build Coastguard Worker "]"
223*1c60b9acSAndroid Build Coastguard Worker "}"
224*1c60b9acSAndroid Build Coastguard Worker ;
225*1c60b9acSAndroid Build Coastguard Worker
226*1c60b9acSAndroid Build Coastguard Worker static int
smd_cb(void * opaque,lws_smd_class_t c,lws_usec_t ts,void * buf,size_t len)227*1c60b9acSAndroid Build Coastguard Worker smd_cb(void *opaque, lws_smd_class_t c, lws_usec_t ts, void *buf, size_t len)
228*1c60b9acSAndroid Build Coastguard Worker {
229*1c60b9acSAndroid Build Coastguard Worker if ((c & LWSSMDCL_SYSTEM_STATE) &&
230*1c60b9acSAndroid Build Coastguard Worker !lws_json_simple_strcmp(buf, len, "\"state\":", "OPERATIONAL")) {
231*1c60b9acSAndroid Build Coastguard Worker
232*1c60b9acSAndroid Build Coastguard Worker /* create the secure streams */
233*1c60b9acSAndroid Build Coastguard Worker
234*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%s: creating server stream\n", __func__);
235*1c60b9acSAndroid Build Coastguard Worker
236*1c60b9acSAndroid Build Coastguard Worker if (lws_ss_create(context, 0, &ssi_server, NULL, NULL,
237*1c60b9acSAndroid Build Coastguard Worker NULL, NULL)) {
238*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: failed to create secure stream\n",
239*1c60b9acSAndroid Build Coastguard Worker __func__);
240*1c60b9acSAndroid Build Coastguard Worker bad = 1;
241*1c60b9acSAndroid Build Coastguard Worker interrupted = 1;
242*1c60b9acSAndroid Build Coastguard Worker lws_cancel_service(context);
243*1c60b9acSAndroid Build Coastguard Worker return -1;
244*1c60b9acSAndroid Build Coastguard Worker }
245*1c60b9acSAndroid Build Coastguard Worker #if 0
246*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%s: creating client stream\n", __func__);
247*1c60b9acSAndroid Build Coastguard Worker
248*1c60b9acSAndroid Build Coastguard Worker if (lws_ss_create(context, 0, &ssi_client, NULL, NULL,
249*1c60b9acSAndroid Build Coastguard Worker NULL, NULL)) {
250*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: failed to create secure stream\n",
251*1c60b9acSAndroid Build Coastguard Worker __func__);
252*1c60b9acSAndroid Build Coastguard Worker return -1;
253*1c60b9acSAndroid Build Coastguard Worker }
254*1c60b9acSAndroid Build Coastguard Worker #endif
255*1c60b9acSAndroid Build Coastguard Worker }
256*1c60b9acSAndroid Build Coastguard Worker
257*1c60b9acSAndroid Build Coastguard Worker return 0;
258*1c60b9acSAndroid Build Coastguard Worker }
259*1c60b9acSAndroid Build Coastguard Worker
260*1c60b9acSAndroid Build Coastguard Worker static void
sigint_handler(int sig)261*1c60b9acSAndroid Build Coastguard Worker sigint_handler(int sig)
262*1c60b9acSAndroid Build Coastguard Worker {
263*1c60b9acSAndroid Build Coastguard Worker interrupted = 1;
264*1c60b9acSAndroid Build Coastguard Worker }
265*1c60b9acSAndroid Build Coastguard Worker
main(int argc,const char ** argv)266*1c60b9acSAndroid Build Coastguard Worker int main(int argc, const char **argv)
267*1c60b9acSAndroid Build Coastguard Worker {
268*1c60b9acSAndroid Build Coastguard Worker struct lws_context_creation_info info;
269*1c60b9acSAndroid Build Coastguard Worker int n = 0;
270*1c60b9acSAndroid Build Coastguard Worker
271*1c60b9acSAndroid Build Coastguard Worker signal(SIGINT, sigint_handler);
272*1c60b9acSAndroid Build Coastguard Worker
273*1c60b9acSAndroid Build Coastguard Worker memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */
274*1c60b9acSAndroid Build Coastguard Worker lws_cmdline_option_handle_builtin(argc, argv, &info);
275*1c60b9acSAndroid Build Coastguard Worker
276*1c60b9acSAndroid Build Coastguard Worker if (lws_cmdline_option(argc, argv, "-m"))
277*1c60b9acSAndroid Build Coastguard Worker multipart = 1;
278*1c60b9acSAndroid Build Coastguard Worker
279*1c60b9acSAndroid Build Coastguard Worker lwsl_user("LWS Secure Streams Server\n");
280*1c60b9acSAndroid Build Coastguard Worker
281*1c60b9acSAndroid Build Coastguard Worker info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS |
282*1c60b9acSAndroid Build Coastguard Worker LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
283*1c60b9acSAndroid Build Coastguard Worker info.fd_limit_per_thread = 1 + 6 + 1;
284*1c60b9acSAndroid Build Coastguard Worker info.pss_policies_json = default_ss_policy;
285*1c60b9acSAndroid Build Coastguard Worker info.port = CONTEXT_PORT_NO_LISTEN;
286*1c60b9acSAndroid Build Coastguard Worker info.early_smd_cb = smd_cb;
287*1c60b9acSAndroid Build Coastguard Worker info.early_smd_class_filter = LWSSMDCL_SYSTEM_STATE;
288*1c60b9acSAndroid Build Coastguard Worker
289*1c60b9acSAndroid Build Coastguard Worker context = lws_create_context(&info);
290*1c60b9acSAndroid Build Coastguard Worker if (!context) {
291*1c60b9acSAndroid Build Coastguard Worker lwsl_err("lws init failed\n");
292*1c60b9acSAndroid Build Coastguard Worker return 1;
293*1c60b9acSAndroid Build Coastguard Worker }
294*1c60b9acSAndroid Build Coastguard Worker
295*1c60b9acSAndroid Build Coastguard Worker /* the event loop */
296*1c60b9acSAndroid Build Coastguard Worker
297*1c60b9acSAndroid Build Coastguard Worker while (n >= 0 && !interrupted)
298*1c60b9acSAndroid Build Coastguard Worker n = lws_service(context, 0);
299*1c60b9acSAndroid Build Coastguard Worker
300*1c60b9acSAndroid Build Coastguard Worker bad = 0;
301*1c60b9acSAndroid Build Coastguard Worker
302*1c60b9acSAndroid Build Coastguard Worker lws_context_destroy(context);
303*1c60b9acSAndroid Build Coastguard Worker lwsl_user("Completed: %s\n", bad ? "failed" : "OK");
304*1c60b9acSAndroid Build Coastguard Worker
305*1c60b9acSAndroid Build Coastguard Worker return bad;
306*1c60b9acSAndroid Build Coastguard Worker }
307