xref: /aosp_15_r20/external/libwebsockets/minimal-examples/api-tests/api-test-gencrypto/lws-genec.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
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