lws-genec.c 2.8 KB

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