/* * lws-api-test-gencrypto - lws-genec * * Written in 2010-2018 by Andy Green * * This file is made available under the Creative Commons CC0 1.0 * Universal Public Domain Dedication. */ #include static const uint8_t *jwk_ec1 = (uint8_t *) "{\"kty\":\"EC\"," "\"crv\":\"P-256\"," "\"x\":\"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4\"," "\"y\":\"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM\"," "\"d\":\"870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE\"," "\"use\":\"enc\"," "\"kid\":\"rfc7517-A.2-example private key\"}" ; static int test_genec1(struct lws_context *context) { struct lws_genec_ctx ctx; struct lws_jwk jwk; struct lws_gencrypto_keyelem el[LWS_GENCRYPTO_EC_KEYEL_COUNT]; //uint8_t res[32], res1[32]; int n; memset(el, 0, sizeof(el)); if (lws_genecdh_create(&ctx, context, NULL)) return 1; /* let's create a new key */ if (lws_genecdh_new_keypair(&ctx, LDHS_OURS, "P-256", el)) { lwsl_err("%s: lws_genec_new_keypair failed\n", __func__); return 1; } lws_genec_dump(el); lws_genec_destroy_elements(el); lws_genec_destroy(&ctx); if (lws_jwk_import(&jwk, NULL, NULL, (char *)jwk_ec1, strlen((char *)jwk_ec1)) < 0) { lwsl_notice("Failed to decode JWK test key\n"); return 1; } lws_jwk_dump(&jwk); if (jwk.kty != LWS_GENCRYPTO_KTY_EC) { lws_jwk_destroy(&jwk); lwsl_err("%s: jwk is not an EC key\n", __func__); return 1; } if (lws_genecdh_create(&ctx, context, NULL)) return 1; n = lws_genecdh_set_key(&ctx, jwk.e, LDHS_OURS); if (n) { lws_jwk_destroy(&jwk); lwsl_err("%s: lws_genec_create failed: %d\n", __func__, n); return 1; } #if 0 if (lws_genec_crypt(&ctx, cbc256, 16, res, (uint8_t *)cbc256_iv, NULL, NULL)) { lwsl_err("%s: lws_genec_crypt failed\n", __func__); goto bail; } if (lws_timingsafe_bcmp(cbc256_enc, res, 16)) { lwsl_err("%s: lws_genec_crypt encoding mismatch\n", __func__); lwsl_hexdump_notice(res, 16); goto bail; } lws_genec_destroy(&ctx); if (lws_genec_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_CBC, &e, NULL)) { lwsl_err("%s: lws_genec_create dec failed\n", __func__); return -1; } if (lws_genec_crypt(&ctx, res, 16, res1, (uint8_t *)cbc256_iv, NULL, NULL)) { lwsl_err("%s: lws_genec_crypt dec failed\n", __func__); goto bail; } if (lws_timingsafe_bcmp(cbc256, res1, 16)) { lwsl_err("%s: lws_genec_crypt decoding mismatch\n", __func__); lwsl_hexdump_notice(res, 16); goto bail; } #endif lws_genec_destroy(&ctx); lws_jwk_destroy(&jwk); return 0; //bail: // lws_genec_destroy(&ctx); // return -1; } int test_genec(struct lws_context *context) { if (test_genec1(context)) goto bail; /* end */ lwsl_notice("%s: selftest OK\n", __func__); return 0; bail: lwsl_err("%s: selftest failed ++++++++++++++++++++\n", __func__); return 1; }