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