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