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