1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * lws-api-test-gencrypto - lws-genec
3*1c60b9acSAndroid Build Coastguard Worker *
4*1c60b9acSAndroid Build Coastguard Worker * Written in 2010-2018 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
12*1c60b9acSAndroid Build Coastguard Worker static const uint8_t
13*1c60b9acSAndroid Build Coastguard Worker *jwk_ec1 = (uint8_t *)
14*1c60b9acSAndroid Build Coastguard Worker "{\"kty\":\"EC\","
15*1c60b9acSAndroid Build Coastguard Worker "\"crv\":\"P-256\","
16*1c60b9acSAndroid Build Coastguard Worker "\"x\":\"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4\","
17*1c60b9acSAndroid Build Coastguard Worker "\"y\":\"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM\","
18*1c60b9acSAndroid Build Coastguard Worker "\"d\":\"870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE\","
19*1c60b9acSAndroid Build Coastguard Worker "\"use\":\"enc\","
20*1c60b9acSAndroid Build Coastguard Worker "\"kid\":\"rfc7517-A.2-example private key\"}"
21*1c60b9acSAndroid Build Coastguard Worker ;
22*1c60b9acSAndroid Build Coastguard Worker
23*1c60b9acSAndroid Build Coastguard Worker static int
test_genec1(struct lws_context * context)24*1c60b9acSAndroid Build Coastguard Worker test_genec1(struct lws_context *context)
25*1c60b9acSAndroid Build Coastguard Worker {
26*1c60b9acSAndroid Build Coastguard Worker struct lws_genec_ctx ctx;
27*1c60b9acSAndroid Build Coastguard Worker struct lws_jwk jwk;
28*1c60b9acSAndroid Build Coastguard Worker struct lws_gencrypto_keyelem el[LWS_GENCRYPTO_EC_KEYEL_COUNT];
29*1c60b9acSAndroid Build Coastguard Worker //uint8_t res[32], res1[32];
30*1c60b9acSAndroid Build Coastguard Worker int n;
31*1c60b9acSAndroid Build Coastguard Worker
32*1c60b9acSAndroid Build Coastguard Worker memset(el, 0, sizeof(el));
33*1c60b9acSAndroid Build Coastguard Worker
34*1c60b9acSAndroid Build Coastguard Worker if (lws_genecdh_create(&ctx, context, NULL))
35*1c60b9acSAndroid Build Coastguard Worker return 1;
36*1c60b9acSAndroid Build Coastguard Worker
37*1c60b9acSAndroid Build Coastguard Worker /* let's create a new key */
38*1c60b9acSAndroid Build Coastguard Worker
39*1c60b9acSAndroid Build Coastguard Worker if (lws_genecdh_new_keypair(&ctx, LDHS_OURS, "P-256", el)) {
40*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_genec_new_keypair failed\n", __func__);
41*1c60b9acSAndroid Build Coastguard Worker return 1;
42*1c60b9acSAndroid Build Coastguard Worker }
43*1c60b9acSAndroid Build Coastguard Worker
44*1c60b9acSAndroid Build Coastguard Worker lws_genec_dump(el);
45*1c60b9acSAndroid Build Coastguard Worker lws_genec_destroy_elements(el);
46*1c60b9acSAndroid Build Coastguard Worker
47*1c60b9acSAndroid Build Coastguard Worker lws_genec_destroy(&ctx);
48*1c60b9acSAndroid Build Coastguard Worker
49*1c60b9acSAndroid Build Coastguard Worker if (lws_jwk_import(&jwk, NULL, NULL, (char *)jwk_ec1,
50*1c60b9acSAndroid Build Coastguard Worker strlen((char *)jwk_ec1)) < 0) {
51*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("Failed to decode JWK test key\n");
52*1c60b9acSAndroid Build Coastguard Worker return 1;
53*1c60b9acSAndroid Build Coastguard Worker }
54*1c60b9acSAndroid Build Coastguard Worker
55*1c60b9acSAndroid Build Coastguard Worker lws_jwk_dump(&jwk);
56*1c60b9acSAndroid Build Coastguard Worker
57*1c60b9acSAndroid Build Coastguard Worker if (jwk.kty != LWS_GENCRYPTO_KTY_EC) {
58*1c60b9acSAndroid Build Coastguard Worker lws_jwk_destroy(&jwk);
59*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: jwk is not an EC key\n", __func__);
60*1c60b9acSAndroid Build Coastguard Worker return 1;
61*1c60b9acSAndroid Build Coastguard Worker }
62*1c60b9acSAndroid Build Coastguard Worker
63*1c60b9acSAndroid Build Coastguard Worker if (lws_genecdh_create(&ctx, context, NULL))
64*1c60b9acSAndroid Build Coastguard Worker return 1;
65*1c60b9acSAndroid Build Coastguard Worker
66*1c60b9acSAndroid Build Coastguard Worker n = lws_genecdh_set_key(&ctx, jwk.e, LDHS_OURS);
67*1c60b9acSAndroid Build Coastguard Worker if (n) {
68*1c60b9acSAndroid Build Coastguard Worker lws_jwk_destroy(&jwk);
69*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_genec_create failed: %d\n", __func__, n);
70*1c60b9acSAndroid Build Coastguard Worker return 1;
71*1c60b9acSAndroid Build Coastguard Worker }
72*1c60b9acSAndroid Build Coastguard Worker #if 0
73*1c60b9acSAndroid Build Coastguard Worker if (lws_genec_crypt(&ctx, cbc256, 16, res, (uint8_t *)cbc256_iv,
74*1c60b9acSAndroid Build Coastguard Worker NULL, NULL)) {
75*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_genec_crypt failed\n", __func__);
76*1c60b9acSAndroid Build Coastguard Worker goto bail;
77*1c60b9acSAndroid Build Coastguard Worker }
78*1c60b9acSAndroid Build Coastguard Worker
79*1c60b9acSAndroid Build Coastguard Worker if (lws_timingsafe_bcmp(cbc256_enc, res, 16)) {
80*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_genec_crypt encoding mismatch\n", __func__);
81*1c60b9acSAndroid Build Coastguard Worker lwsl_hexdump_notice(res, 16);
82*1c60b9acSAndroid Build Coastguard Worker goto bail;
83*1c60b9acSAndroid Build Coastguard Worker }
84*1c60b9acSAndroid Build Coastguard Worker
85*1c60b9acSAndroid Build Coastguard Worker lws_genec_destroy(&ctx);
86*1c60b9acSAndroid Build Coastguard Worker
87*1c60b9acSAndroid Build Coastguard Worker if (lws_genec_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_CBC, &e, NULL)) {
88*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_genec_create dec failed\n", __func__);
89*1c60b9acSAndroid Build Coastguard Worker return -1;
90*1c60b9acSAndroid Build Coastguard Worker }
91*1c60b9acSAndroid Build Coastguard Worker
92*1c60b9acSAndroid Build Coastguard Worker if (lws_genec_crypt(&ctx, res, 16, res1, (uint8_t *)cbc256_iv,
93*1c60b9acSAndroid Build Coastguard Worker NULL, NULL)) {
94*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_genec_crypt dec failed\n", __func__);
95*1c60b9acSAndroid Build Coastguard Worker goto bail;
96*1c60b9acSAndroid Build Coastguard Worker }
97*1c60b9acSAndroid Build Coastguard Worker
98*1c60b9acSAndroid Build Coastguard Worker if (lws_timingsafe_bcmp(cbc256, res1, 16)) {
99*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_genec_crypt decoding mismatch\n", __func__);
100*1c60b9acSAndroid Build Coastguard Worker lwsl_hexdump_notice(res, 16);
101*1c60b9acSAndroid Build Coastguard Worker goto bail;
102*1c60b9acSAndroid Build Coastguard Worker }
103*1c60b9acSAndroid Build Coastguard Worker #endif
104*1c60b9acSAndroid Build Coastguard Worker lws_genec_destroy(&ctx);
105*1c60b9acSAndroid Build Coastguard Worker
106*1c60b9acSAndroid Build Coastguard Worker lws_jwk_destroy(&jwk);
107*1c60b9acSAndroid Build Coastguard Worker
108*1c60b9acSAndroid Build Coastguard Worker return 0;
109*1c60b9acSAndroid Build Coastguard Worker
110*1c60b9acSAndroid Build Coastguard Worker //bail:
111*1c60b9acSAndroid Build Coastguard Worker // lws_genec_destroy(&ctx);
112*1c60b9acSAndroid Build Coastguard Worker
113*1c60b9acSAndroid Build Coastguard Worker // return -1;
114*1c60b9acSAndroid Build Coastguard Worker }
115*1c60b9acSAndroid Build Coastguard Worker
116*1c60b9acSAndroid Build Coastguard Worker int
test_genec(struct lws_context * context)117*1c60b9acSAndroid Build Coastguard Worker test_genec(struct lws_context *context)
118*1c60b9acSAndroid Build Coastguard Worker {
119*1c60b9acSAndroid Build Coastguard Worker if (test_genec1(context))
120*1c60b9acSAndroid Build Coastguard Worker goto bail;
121*1c60b9acSAndroid Build Coastguard Worker
122*1c60b9acSAndroid Build Coastguard Worker /* end */
123*1c60b9acSAndroid Build Coastguard Worker
124*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%s: selftest OK\n", __func__);
125*1c60b9acSAndroid Build Coastguard Worker
126*1c60b9acSAndroid Build Coastguard Worker return 0;
127*1c60b9acSAndroid Build Coastguard Worker
128*1c60b9acSAndroid Build Coastguard Worker bail:
129*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: selftest failed ++++++++++++++++++++\n", __func__);
130*1c60b9acSAndroid Build Coastguard Worker
131*1c60b9acSAndroid Build Coastguard Worker return 1;
132*1c60b9acSAndroid Build Coastguard Worker }
133