lws-genec.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. /*
  2. * libwebsockets - small server side websockets and web server implementation
  3. *
  4. * Copyright (C) 2010 - 2019 Andy Green <[email protected]>
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to
  8. * deal in the Software without restriction, including without limitation the
  9. * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  10. * sell copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  22. * IN THE SOFTWARE.
  23. *
  24. * lws_genec provides an EC abstraction api in lws that works the
  25. * same whether you are using openssl or mbedtls crypto functions underneath.
  26. */
  27. #include "private-lib-core.h"
  28. #include "private-lib-tls-openssl.h"
  29. /*
  30. * Care: many openssl apis return 1 for success. These are translated to the
  31. * lws convention of 0 for success.
  32. */
  33. #if !defined(LWS_HAVE_ECDSA_SIG_set0)
  34. static void
  35. ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps)
  36. {
  37. if (pr != NULL)
  38. *pr = sig->r;
  39. if (ps != NULL)
  40. *ps = sig->s;
  41. }
  42. static int
  43. ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s)
  44. {
  45. if (r == NULL || s == NULL)
  46. return 0;
  47. BN_clear_free(sig->r);
  48. BN_clear_free(sig->s);
  49. sig->r = r;
  50. sig->s = s;
  51. return 1;
  52. }
  53. #endif
  54. #if !defined(LWS_HAVE_BN_bn2binpad)
  55. int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen)
  56. {
  57. int i;
  58. BN_ULONG l;
  59. bn_check_top(a);
  60. i = BN_num_bytes(a);
  61. /* Add leading zeroes if necessary */
  62. if (tolen > i) {
  63. memset(to, 0, tolen - i);
  64. to += tolen - i;
  65. }
  66. while (i--) {
  67. l = a->d[i / BN_BYTES];
  68. *(to++) = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff;
  69. }
  70. return tolen;
  71. }
  72. #endif
  73. const struct lws_ec_curves lws_ec_curves[4] = {
  74. /*
  75. * These are the curves we are willing to use by default...
  76. *
  77. * The 3 recommended+ (P-256) and optional curves in RFC7518 7.6
  78. *
  79. * Specific keys lengths from RFC8422 p20
  80. */
  81. { "P-256", NID_X9_62_prime256v1, 32 },
  82. { "P-384", NID_secp384r1, 48 },
  83. { "P-521", NID_secp521r1, 66 },
  84. { NULL, 0, 0 }
  85. };
  86. static int
  87. lws_genec_eckey_import(int nid, EVP_PKEY *pkey, struct lws_gencrypto_keyelem *el)
  88. {
  89. EC_KEY *ec = EC_KEY_new_by_curve_name(nid);
  90. BIGNUM *bn_d, *bn_x, *bn_y;
  91. int n;
  92. if (!ec)
  93. return -1;
  94. /*
  95. * EC_KEY contains
  96. *
  97. * EC_GROUP * group
  98. * EC_POINT * pub_key
  99. * BIGNUM * priv_key (ie, d)
  100. */
  101. bn_x = BN_bin2bn(el[LWS_GENCRYPTO_EC_KEYEL_X].buf,
  102. el[LWS_GENCRYPTO_EC_KEYEL_X].len, NULL);
  103. if (!bn_x) {
  104. lwsl_err("%s: BN_bin2bn (x) fail\n", __func__);
  105. goto bail;
  106. }
  107. bn_y = BN_bin2bn(el[LWS_GENCRYPTO_EC_KEYEL_Y].buf,
  108. el[LWS_GENCRYPTO_EC_KEYEL_Y].len, NULL);
  109. if (!bn_y) {
  110. lwsl_err("%s: BN_bin2bn (y) fail\n", __func__);
  111. goto bail1;
  112. }
  113. n = EC_KEY_set_public_key_affine_coordinates(ec, bn_x, bn_y);
  114. BN_free(bn_x);
  115. BN_free(bn_y);
  116. if (n != 1) {
  117. lwsl_err("%s: EC_KEY_set_public_key_affine_coordinates fail:\n",
  118. __func__);
  119. lws_tls_err_describe_clear();
  120. goto bail;
  121. }
  122. if (el[LWS_GENCRYPTO_EC_KEYEL_D].len) {
  123. bn_d = BN_bin2bn(el[LWS_GENCRYPTO_EC_KEYEL_D].buf,
  124. el[LWS_GENCRYPTO_EC_KEYEL_D].len, NULL);
  125. if (!bn_d) {
  126. lwsl_err("%s: BN_bin2bn (d) fail\n", __func__);
  127. goto bail;
  128. }
  129. n = EC_KEY_set_private_key(ec, bn_d);
  130. BN_clear_free(bn_d);
  131. if (n != 1) {
  132. lwsl_err("%s: EC_KEY_set_private_key fail\n", __func__);
  133. goto bail;
  134. }
  135. }
  136. /* explicitly confirm the key pieces are consistent */
  137. if (EC_KEY_check_key(ec) != 1) {
  138. lwsl_err("%s: EC_KEY_set_private_key fail\n", __func__);
  139. goto bail;
  140. }
  141. n = EVP_PKEY_assign_EC_KEY(pkey, ec);
  142. if (n != 1) {
  143. lwsl_err("%s: EVP_PKEY_set1_EC_KEY failed\n", __func__);
  144. return -1;
  145. }
  146. return 0;
  147. bail1:
  148. BN_free(bn_x);
  149. bail:
  150. EC_KEY_free(ec);
  151. return -1;
  152. }
  153. static int
  154. lws_genec_keypair_import(struct lws_genec_ctx *ctx,
  155. const struct lws_ec_curves *curve_table,
  156. EVP_PKEY_CTX **pctx, struct lws_gencrypto_keyelem *el)
  157. {
  158. EVP_PKEY *pkey = NULL;
  159. const struct lws_ec_curves *curve;
  160. if (el[LWS_GENCRYPTO_EC_KEYEL_CRV].len < 4)
  161. return -2;
  162. curve = lws_genec_curve(curve_table,
  163. (char *)el[LWS_GENCRYPTO_EC_KEYEL_CRV].buf);
  164. if (!curve)
  165. return -3;
  166. if ((el[LWS_GENCRYPTO_EC_KEYEL_D].len &&
  167. el[LWS_GENCRYPTO_EC_KEYEL_D].len != curve->key_bytes) ||
  168. el[LWS_GENCRYPTO_EC_KEYEL_X].len != curve->key_bytes ||
  169. el[LWS_GENCRYPTO_EC_KEYEL_Y].len != curve->key_bytes)
  170. return -4;
  171. ctx->has_private = !!el[LWS_GENCRYPTO_EC_KEYEL_D].len;
  172. pkey = EVP_PKEY_new();
  173. if (!pkey)
  174. return -7;
  175. if (lws_genec_eckey_import(curve->tls_lib_nid, pkey, el)) {
  176. lwsl_err("%s: lws_genec_eckey_import fail\n", __func__);
  177. goto bail;
  178. }
  179. *pctx = EVP_PKEY_CTX_new(pkey, NULL);
  180. EVP_PKEY_free(pkey);
  181. pkey = NULL;
  182. if (!*pctx)
  183. goto bail;
  184. return 0;
  185. bail:
  186. if (pkey)
  187. EVP_PKEY_free(pkey);
  188. if (*pctx) {
  189. EVP_PKEY_CTX_free(*pctx);
  190. *pctx = NULL;
  191. }
  192. return -9;
  193. }
  194. int
  195. lws_genecdh_create(struct lws_genec_ctx *ctx, struct lws_context *context,
  196. const struct lws_ec_curves *curve_table)
  197. {
  198. ctx->context = context;
  199. ctx->ctx[0] = NULL;
  200. ctx->ctx[1] = NULL;
  201. ctx->curve_table = curve_table;
  202. ctx->genec_alg = LEGENEC_ECDH;
  203. return 0;
  204. }
  205. int
  206. lws_genecdsa_create(struct lws_genec_ctx *ctx, struct lws_context *context,
  207. const struct lws_ec_curves *curve_table)
  208. {
  209. ctx->context = context;
  210. ctx->ctx[0] = NULL;
  211. ctx->ctx[1] = NULL;
  212. ctx->curve_table = curve_table;
  213. ctx->genec_alg = LEGENEC_ECDSA;
  214. return 0;
  215. }
  216. int
  217. lws_genecdh_set_key(struct lws_genec_ctx *ctx, struct lws_gencrypto_keyelem *el,
  218. enum enum_lws_dh_side side)
  219. {
  220. if (ctx->genec_alg != LEGENEC_ECDH)
  221. return -1;
  222. return lws_genec_keypair_import(ctx, ctx->curve_table, &ctx->ctx[side], el);
  223. }
  224. int
  225. lws_genecdsa_set_key(struct lws_genec_ctx *ctx,
  226. struct lws_gencrypto_keyelem *el)
  227. {
  228. if (ctx->genec_alg != LEGENEC_ECDSA)
  229. return -1;
  230. return lws_genec_keypair_import(ctx, ctx->curve_table, &ctx->ctx[0], el);
  231. }
  232. static void
  233. lws_genec_keypair_destroy(EVP_PKEY_CTX **pctx)
  234. {
  235. if (!*pctx)
  236. return;
  237. // lwsl_err("%p\n", EVP_PKEY_get1_EC_KEY(EVP_PKEY_CTX_get0_pkey(*pctx)));
  238. // EC_KEY_free(EVP_PKEY_get1_EC_KEY(EVP_PKEY_CTX_get0_pkey(*pctx)));
  239. EVP_PKEY_CTX_free(*pctx);
  240. *pctx = NULL;
  241. }
  242. void
  243. lws_genec_destroy(struct lws_genec_ctx *ctx)
  244. {
  245. if (ctx->ctx[0])
  246. lws_genec_keypair_destroy(&ctx->ctx[0]);
  247. if (ctx->ctx[1])
  248. lws_genec_keypair_destroy(&ctx->ctx[1]);
  249. }
  250. static int
  251. lws_genec_new_keypair(struct lws_genec_ctx *ctx, enum enum_lws_dh_side side,
  252. const char *curve_name, struct lws_gencrypto_keyelem *el)
  253. {
  254. const struct lws_ec_curves *curve;
  255. const EC_POINT *pubkey;
  256. EVP_PKEY *pkey = NULL;
  257. int ret = -29, n, m;
  258. BIGNUM *bn[3];
  259. EC_KEY *ec;
  260. curve = lws_genec_curve(ctx->curve_table, curve_name);
  261. if (!curve) {
  262. lwsl_err("%s: curve '%s' not supported\n",
  263. __func__, curve_name);
  264. return -22;
  265. }
  266. ec = EC_KEY_new_by_curve_name(curve->tls_lib_nid);
  267. if (!ec) {
  268. lwsl_err("%s: unknown nid %d\n", __func__, curve->tls_lib_nid);
  269. return -23;
  270. }
  271. if (EC_KEY_generate_key(ec) != 1) {
  272. lwsl_err("%s: EC_KEY_generate_key failed\n", __func__);
  273. goto bail;
  274. }
  275. pkey = EVP_PKEY_new();
  276. if (!pkey)
  277. goto bail;
  278. if (EVP_PKEY_set1_EC_KEY(pkey, ec) != 1) {
  279. lwsl_err("%s: EVP_PKEY_assign_EC_KEY failed\n", __func__);
  280. goto bail1;
  281. }
  282. ctx->ctx[side] = EVP_PKEY_CTX_new(pkey, NULL);
  283. if (!ctx->ctx[side]) {
  284. lwsl_err("%s: EVP_PKEY_CTX_new failed\n", __func__);
  285. goto bail1;
  286. }
  287. /*
  288. * we need to capture the individual element BIGNUMs into
  289. * lws_gencrypto_keyelem, so they can be serialized, used in jwk etc
  290. */
  291. pubkey = EC_KEY_get0_public_key(ec);
  292. if (!pubkey) {
  293. lwsl_err("%s: EC_KEY_get0_public_key failed\n", __func__);
  294. goto bail1;
  295. }
  296. bn[0] = BN_new();
  297. bn[1] = (BIGNUM *)EC_KEY_get0_private_key(ec);
  298. bn[2] = BN_new();
  299. #if defined(LWS_HAVE_EC_POINT_get_affine_coordinates)
  300. if (EC_POINT_get_affine_coordinates(EC_KEY_get0_group(ec),
  301. #else
  302. if (EC_POINT_get_affine_coordinates_GFp(EC_KEY_get0_group(ec),
  303. #endif
  304. pubkey, bn[0], bn[2], NULL) != 1) {
  305. lwsl_err("%s: EC_POINT_get_affine_coordinates_GFp failed\n",
  306. __func__);
  307. goto bail2;
  308. }
  309. el[LWS_GENCRYPTO_EC_KEYEL_CRV].len = (uint32_t)strlen(curve_name) + 1;
  310. el[LWS_GENCRYPTO_EC_KEYEL_CRV].buf =
  311. lws_malloc(el[LWS_GENCRYPTO_EC_KEYEL_CRV].len, "ec");
  312. if (!el[LWS_GENCRYPTO_EC_KEYEL_CRV].buf) {
  313. lwsl_err("%s: OOM\n", __func__);
  314. goto bail2;
  315. }
  316. strcpy((char *)el[LWS_GENCRYPTO_EC_KEYEL_CRV].buf, curve_name);
  317. for (n = LWS_GENCRYPTO_EC_KEYEL_X; n < LWS_GENCRYPTO_EC_KEYEL_COUNT;
  318. n++) {
  319. el[n].len = curve->key_bytes;
  320. el[n].buf = lws_malloc(curve->key_bytes, "ec");
  321. if (!el[n].buf)
  322. goto bail2;
  323. m = BN_bn2binpad(bn[n - 1], el[n].buf, el[n].len);
  324. if ((uint32_t)m != el[n].len)
  325. goto bail2;
  326. }
  327. ctx->has_private = 1;
  328. ret = 0;
  329. bail2:
  330. BN_clear_free(bn[0]);
  331. BN_clear_free(bn[2]);
  332. bail1:
  333. EVP_PKEY_free(pkey);
  334. bail:
  335. EC_KEY_free(ec);
  336. return ret;
  337. }
  338. int
  339. lws_genecdh_new_keypair(struct lws_genec_ctx *ctx, enum enum_lws_dh_side side,
  340. const char *curve_name,
  341. struct lws_gencrypto_keyelem *el)
  342. {
  343. if (ctx->genec_alg != LEGENEC_ECDH)
  344. return -1;
  345. return lws_genec_new_keypair(ctx, side, curve_name, el);
  346. }
  347. int
  348. lws_genecdsa_new_keypair(struct lws_genec_ctx *ctx, const char *curve_name,
  349. struct lws_gencrypto_keyelem *el)
  350. {
  351. if (ctx->genec_alg != LEGENEC_ECDSA)
  352. return -1;
  353. return lws_genec_new_keypair(ctx, LDHS_OURS, curve_name, el);
  354. }
  355. #if 0
  356. int
  357. lws_genecdsa_hash_sign(struct lws_genec_ctx *ctx, const uint8_t *in,
  358. enum lws_genhash_types hash_type,
  359. uint8_t *sig, size_t sig_len)
  360. {
  361. const EVP_MD *md = lws_gencrypto_openssl_hash_to_EVP_MD(hash_type);
  362. EVP_MD_CTX *mdctx = NULL;
  363. if (ctx->genec_alg != LEGENEC_ECDSA)
  364. return -1;
  365. if (!md)
  366. return -1;
  367. mdctx = EVP_MD_CTX_create();
  368. if (!mdctx)
  369. goto bail;
  370. if (EVP_DigestSignInit(mdctx, NULL, md, NULL,
  371. EVP_PKEY_CTX_get0_pkey(ctx->ctx))) {
  372. lwsl_err("%s: EVP_DigestSignInit failed\n", __func__);
  373. goto bail;
  374. }
  375. if (EVP_DigestSignUpdate(mdctx, in, EVP_MD_size(md))) {
  376. lwsl_err("%s: EVP_DigestSignUpdate failed\n", __func__);
  377. goto bail;
  378. }
  379. if (EVP_DigestSignFinal(mdctx, sig, &sig_len)) {
  380. lwsl_err("%s: EVP_DigestSignFinal failed\n", __func__);
  381. goto bail;
  382. }
  383. EVP_MD_CTX_free(mdctx);
  384. return (int)sig_len;
  385. bail:
  386. if (mdctx)
  387. EVP_MD_CTX_free(mdctx);
  388. return -1;
  389. }
  390. #endif
  391. int
  392. lws_genecdsa_hash_sign_jws(struct lws_genec_ctx *ctx, const uint8_t *in,
  393. enum lws_genhash_types hash_type, int keybits,
  394. uint8_t *sig, size_t sig_len)
  395. {
  396. int ret = -1, n, keybytes = lws_gencrypto_bits_to_bytes(keybits);
  397. const BIGNUM *r = NULL, *s = NULL;
  398. ECDSA_SIG *ecdsasig;
  399. EC_KEY *eckey;
  400. if (ctx->genec_alg != LEGENEC_ECDSA) {
  401. lwsl_notice("%s: ctx alg %d\n", __func__, ctx->genec_alg);
  402. return -1;
  403. }
  404. if (!ctx->has_private)
  405. return -1;
  406. if ((int)sig_len < keybytes * 2) {
  407. lwsl_notice("%s: sig buff %d < %d\n", __func__,
  408. (int)sig_len, keybytes * 2);
  409. return -1;
  410. }
  411. eckey = EVP_PKEY_get1_EC_KEY(EVP_PKEY_CTX_get0_pkey(ctx->ctx[0]));
  412. /*
  413. * The ECDSA P-256 SHA-256 digital signature is generated as follows:
  414. *
  415. * 1. Generate a digital signature of the JWS Signing Input using ECDSA
  416. * P-256 SHA-256 with the desired private key. The output will be
  417. * the pair (R, S), where R and S are 256-bit unsigned integers.
  418. *
  419. * 2. Turn R and S into octet sequences in big-endian order, with each
  420. * array being be 32 octets long. The octet sequence
  421. * representations MUST NOT be shortened to omit any leading zero
  422. * octets contained in the values.
  423. *
  424. * 3. Concatenate the two octet sequences in the order R and then S.
  425. * (Note that many ECDSA implementations will directly produce this
  426. * concatenation as their output.)
  427. *
  428. * 4. The resulting 64-octet sequence is the JWS Signature value.
  429. */
  430. ecdsasig = ECDSA_do_sign(in, (int)lws_genhash_size(hash_type), eckey);
  431. EC_KEY_free(eckey);
  432. if (!ecdsasig) {
  433. lwsl_notice("%s: ECDSA_do_sign fail\n", __func__);
  434. goto bail;
  435. }
  436. ECDSA_SIG_get0(ecdsasig, &r, &s);
  437. /*
  438. * in the 521-bit case, we have to pad the last byte as it only
  439. * generates 65 bytes
  440. */
  441. n = BN_bn2binpad(r, sig, keybytes);
  442. if (n != keybytes) {
  443. lwsl_notice("%s: bignum r fail %d %d\n", __func__, n, keybytes);
  444. goto bail;
  445. }
  446. n = BN_bn2binpad(s, sig + keybytes, keybytes);
  447. if (n != keybytes) {
  448. lwsl_notice("%s: bignum s fail %d %d\n", __func__, n, keybytes);
  449. goto bail;
  450. }
  451. ret = 0;
  452. bail:
  453. if (ecdsasig)
  454. ECDSA_SIG_free(ecdsasig);
  455. return ret;
  456. }
  457. /* in is the JWS Signing Input hash */
  458. int
  459. lws_genecdsa_hash_sig_verify_jws(struct lws_genec_ctx *ctx, const uint8_t *in,
  460. enum lws_genhash_types hash_type, int keybits,
  461. const uint8_t *sig, size_t sig_len)
  462. {
  463. int ret = -1, n, keybytes = lws_gencrypto_bits_to_bytes(keybits),
  464. hlen = (int)lws_genhash_size(hash_type);
  465. ECDSA_SIG *ecsig = ECDSA_SIG_new();
  466. BIGNUM *r = NULL, *s = NULL;
  467. EC_KEY *eckey;
  468. if (!ecsig)
  469. return -1;
  470. if (ctx->genec_alg != LEGENEC_ECDSA)
  471. goto bail;
  472. if ((int)sig_len != keybytes * 2) {
  473. lwsl_err("%s: sig buf too small %d vs %d\n", __func__,
  474. (int)sig_len, keybytes * 2);
  475. goto bail;
  476. }
  477. /*
  478. * 1. The JWS Signature value MUST be a 64-octet sequence. If it is
  479. * not a 64-octet sequence, the validation has failed.
  480. *
  481. * 2. Split the 64-octet sequence into two 32-octet sequences. The
  482. * first octet sequence represents R and the second S. The values R
  483. * and S are represented as octet sequences using the Integer-to-
  484. * OctetString Conversion defined in Section 2.3.7 of SEC1 [SEC1]
  485. * (in big-endian octet order).
  486. *
  487. * 3. Submit the JWS Signing Input, R, S, and the public key (x, y) to
  488. * the ECDSA P-256 SHA-256 validator.
  489. */
  490. r = BN_bin2bn(sig, keybytes, NULL);
  491. if (!r) {
  492. lwsl_err("%s: BN_bin2bn (r) fail\n", __func__);
  493. goto bail;
  494. }
  495. s = BN_bin2bn(sig + keybytes, keybytes, NULL);
  496. if (!s) {
  497. lwsl_err("%s: BN_bin2bn (s) fail\n", __func__);
  498. goto bail1;
  499. }
  500. if (ECDSA_SIG_set0(ecsig, r, s) != 1) {
  501. lwsl_err("%s: ECDSA_SIG_set0 fail\n", __func__);
  502. goto bail1;
  503. }
  504. eckey = EVP_PKEY_get1_EC_KEY(EVP_PKEY_CTX_get0_pkey(ctx->ctx[0]));
  505. n = ECDSA_do_verify(in, hlen, ecsig, eckey);
  506. EC_KEY_free(eckey);
  507. if (n != 1) {
  508. lwsl_err("%s: ECDSA_do_verify fail\n", __func__);
  509. lws_tls_err_describe_clear();
  510. goto bail;
  511. }
  512. ret = 0;
  513. goto bail;
  514. bail1:
  515. if (r)
  516. BN_free(r);
  517. if (s)
  518. BN_free(s);
  519. bail:
  520. ECDSA_SIG_free(ecsig);
  521. return ret;
  522. }
  523. int
  524. lws_genecdh_compute_shared_secret(struct lws_genec_ctx *ctx, uint8_t *ss,
  525. int *ss_len)
  526. {
  527. int len, ret = -1;
  528. EC_KEY *eckey[2];
  529. if (!ctx->ctx[LDHS_OURS] || !ctx->ctx[LDHS_THEIRS]) {
  530. lwsl_err("%s: both sides must be set up\n", __func__);
  531. return -1;
  532. }
  533. eckey[LDHS_OURS] = EVP_PKEY_get1_EC_KEY(
  534. EVP_PKEY_CTX_get0_pkey(ctx->ctx[LDHS_OURS]));
  535. eckey[LDHS_THEIRS] = EVP_PKEY_get1_EC_KEY(
  536. EVP_PKEY_CTX_get0_pkey(ctx->ctx[LDHS_THEIRS]));
  537. len = (EC_GROUP_get_degree(EC_KEY_get0_group(eckey[LDHS_OURS])) + 7) / 8;
  538. if (len <= *ss_len) {
  539. *ss_len = ECDH_compute_key(ss, len,
  540. EC_KEY_get0_public_key(eckey[LDHS_THEIRS]),
  541. eckey[LDHS_OURS], NULL);
  542. ret = -(*ss_len < 0);
  543. }
  544. EC_KEY_free(eckey[LDHS_OURS]);
  545. EC_KEY_free(eckey[LDHS_THEIRS]);
  546. return ret;
  547. }