crypto_openssl.c 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953
  1. /*
  2. * Wrapper functions for OpenSSL libcrypto
  3. * Copyright (c) 2004-2017, Jouni Malinen <j@w1.fi>
  4. *
  5. * This software may be distributed under the terms of the BSD license.
  6. * See README for more details.
  7. */
  8. #include "includes.h"
  9. #include <openssl/opensslv.h>
  10. #include <openssl/err.h>
  11. #include <openssl/des.h>
  12. #include <openssl/aes.h>
  13. #include <openssl/bn.h>
  14. #include <openssl/evp.h>
  15. #include <openssl/dh.h>
  16. #include <openssl/hmac.h>
  17. #include <openssl/rand.h>
  18. #ifdef CONFIG_OPENSSL_CMAC
  19. #include <openssl/cmac.h>
  20. #endif /* CONFIG_OPENSSL_CMAC */
  21. #ifdef CONFIG_ECC
  22. #include <openssl/ec.h>
  23. #endif /* CONFIG_ECC */
  24. #include "common.h"
  25. #include "wpabuf.h"
  26. #include "dh_group5.h"
  27. #include "sha1.h"
  28. #include "sha256.h"
  29. #include "sha384.h"
  30. #include "md5.h"
  31. #include "aes_wrap.h"
  32. #include "crypto.h"
  33. #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
  34. /* Compatibility wrappers for older versions. */
  35. static HMAC_CTX * HMAC_CTX_new(void)
  36. {
  37. HMAC_CTX *ctx;
  38. ctx = os_zalloc(sizeof(*ctx));
  39. if (ctx)
  40. HMAC_CTX_init(ctx);
  41. return ctx;
  42. }
  43. static void HMAC_CTX_free(HMAC_CTX *ctx)
  44. {
  45. if (!ctx)
  46. return;
  47. HMAC_CTX_cleanup(ctx);
  48. bin_clear_free(ctx, sizeof(*ctx));
  49. }
  50. static EVP_MD_CTX * EVP_MD_CTX_new(void)
  51. {
  52. EVP_MD_CTX *ctx;
  53. ctx = os_zalloc(sizeof(*ctx));
  54. if (ctx)
  55. EVP_MD_CTX_init(ctx);
  56. return ctx;
  57. }
  58. static void EVP_MD_CTX_free(EVP_MD_CTX *ctx)
  59. {
  60. if (!ctx)
  61. return;
  62. EVP_MD_CTX_cleanup(ctx);
  63. bin_clear_free(ctx, sizeof(*ctx));
  64. }
  65. #endif /* OpenSSL version < 1.1.0 */
  66. static BIGNUM * get_group5_prime(void)
  67. {
  68. #if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
  69. return BN_get_rfc3526_prime_1536(NULL);
  70. #elif !defined(OPENSSL_IS_BORINGSSL)
  71. return get_rfc3526_prime_1536(NULL);
  72. #else
  73. static const unsigned char RFC3526_PRIME_1536[] = {
  74. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,
  75. 0x21,0x68,0xC2,0x34,0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,
  76. 0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,0x02,0x0B,0xBE,0xA6,
  77. 0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
  78. 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,
  79. 0xF2,0x5F,0x14,0x37,0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,
  80. 0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6,0xF4,0x4C,0x42,0xE9,
  81. 0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED,
  82. 0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,
  83. 0x7C,0x4B,0x1F,0xE6,0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D,
  84. 0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05,0x98,0xDA,0x48,0x36,
  85. 0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F,
  86. 0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,
  87. 0x20,0x85,0x52,0xBB,0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,
  88. 0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04,0xF1,0x74,0x6C,0x08,
  89. 0xCA,0x23,0x73,0x27,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  90. };
  91. return BN_bin2bn(RFC3526_PRIME_1536, sizeof(RFC3526_PRIME_1536), NULL);
  92. #endif
  93. }
  94. #ifdef OPENSSL_NO_SHA256
  95. #define NO_SHA256_WRAPPER
  96. #endif
  97. #ifdef OPENSSL_NO_SHA512
  98. #define NO_SHA384_WRAPPER
  99. #endif
  100. static int openssl_digest_vector(const EVP_MD *type, size_t num_elem,
  101. const u8 *addr[], const size_t *len, u8 *mac)
  102. {
  103. EVP_MD_CTX *ctx;
  104. size_t i;
  105. unsigned int mac_len;
  106. if (TEST_FAIL())
  107. return -1;
  108. ctx = EVP_MD_CTX_new();
  109. if (!ctx)
  110. return -1;
  111. if (!EVP_DigestInit_ex(ctx, type, NULL)) {
  112. wpa_printf(MSG_ERROR, "OpenSSL: EVP_DigestInit_ex failed: %s",
  113. ERR_error_string(ERR_get_error(), NULL));
  114. EVP_MD_CTX_free(ctx);
  115. return -1;
  116. }
  117. for (i = 0; i < num_elem; i++) {
  118. if (!EVP_DigestUpdate(ctx, addr[i], len[i])) {
  119. wpa_printf(MSG_ERROR, "OpenSSL: EVP_DigestUpdate "
  120. "failed: %s",
  121. ERR_error_string(ERR_get_error(), NULL));
  122. EVP_MD_CTX_free(ctx);
  123. return -1;
  124. }
  125. }
  126. if (!EVP_DigestFinal(ctx, mac, &mac_len)) {
  127. wpa_printf(MSG_ERROR, "OpenSSL: EVP_DigestFinal failed: %s",
  128. ERR_error_string(ERR_get_error(), NULL));
  129. EVP_MD_CTX_free(ctx);
  130. return -1;
  131. }
  132. EVP_MD_CTX_free(ctx);
  133. return 0;
  134. }
  135. #ifndef CONFIG_FIPS
  136. int md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
  137. {
  138. return openssl_digest_vector(EVP_md4(), num_elem, addr, len, mac);
  139. }
  140. #endif /* CONFIG_FIPS */
  141. int des_encrypt(const u8 *clear, const u8 *key, u8 *cypher)
  142. {
  143. u8 pkey[8], next, tmp;
  144. int i;
  145. DES_key_schedule ks;
  146. /* Add parity bits to the key */
  147. next = 0;
  148. for (i = 0; i < 7; i++) {
  149. tmp = key[i];
  150. pkey[i] = (tmp >> i) | next | 1;
  151. next = tmp << (7 - i);
  152. }
  153. pkey[i] = next | 1;
  154. DES_set_key((DES_cblock *) &pkey, &ks);
  155. DES_ecb_encrypt((DES_cblock *) clear, (DES_cblock *) cypher, &ks,
  156. DES_ENCRYPT);
  157. return 0;
  158. }
  159. #ifndef CONFIG_NO_RC4
  160. int rc4_skip(const u8 *key, size_t keylen, size_t skip,
  161. u8 *data, size_t data_len)
  162. {
  163. #ifdef OPENSSL_NO_RC4
  164. return -1;
  165. #else /* OPENSSL_NO_RC4 */
  166. EVP_CIPHER_CTX *ctx;
  167. int outl;
  168. int res = -1;
  169. unsigned char skip_buf[16];
  170. ctx = EVP_CIPHER_CTX_new();
  171. if (!ctx ||
  172. !EVP_CIPHER_CTX_set_padding(ctx, 0) ||
  173. !EVP_CipherInit_ex(ctx, EVP_rc4(), NULL, NULL, NULL, 1) ||
  174. !EVP_CIPHER_CTX_set_key_length(ctx, keylen) ||
  175. !EVP_CipherInit_ex(ctx, NULL, NULL, key, NULL, 1))
  176. goto out;
  177. while (skip >= sizeof(skip_buf)) {
  178. size_t len = skip;
  179. if (len > sizeof(skip_buf))
  180. len = sizeof(skip_buf);
  181. if (!EVP_CipherUpdate(ctx, skip_buf, &outl, skip_buf, len))
  182. goto out;
  183. skip -= len;
  184. }
  185. if (EVP_CipherUpdate(ctx, data, &outl, data, data_len))
  186. res = 0;
  187. out:
  188. if (ctx)
  189. EVP_CIPHER_CTX_free(ctx);
  190. return res;
  191. #endif /* OPENSSL_NO_RC4 */
  192. }
  193. #endif /* CONFIG_NO_RC4 */
  194. #ifndef CONFIG_FIPS
  195. int md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
  196. {
  197. return openssl_digest_vector(EVP_md5(), num_elem, addr, len, mac);
  198. }
  199. #endif /* CONFIG_FIPS */
  200. int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
  201. {
  202. return openssl_digest_vector(EVP_sha1(), num_elem, addr, len, mac);
  203. }
  204. #ifndef NO_SHA256_WRAPPER
  205. int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len,
  206. u8 *mac)
  207. {
  208. return openssl_digest_vector(EVP_sha256(), num_elem, addr, len, mac);
  209. }
  210. #endif /* NO_SHA256_WRAPPER */
  211. #ifndef NO_SHA384_WRAPPER
  212. int sha384_vector(size_t num_elem, const u8 *addr[], const size_t *len,
  213. u8 *mac)
  214. {
  215. return openssl_digest_vector(EVP_sha384(), num_elem, addr, len, mac);
  216. }
  217. #endif /* NO_SHA384_WRAPPER */
  218. #ifndef NO_SHA512_WRAPPER
  219. int sha512_vector(size_t num_elem, const u8 *addr[], const size_t *len,
  220. u8 *mac)
  221. {
  222. return openssl_digest_vector(EVP_sha512(), num_elem, addr, len, mac);
  223. }
  224. #endif /* NO_SHA512_WRAPPER */
  225. static const EVP_CIPHER * aes_get_evp_cipher(size_t keylen)
  226. {
  227. switch (keylen) {
  228. case 16:
  229. return EVP_aes_128_ecb();
  230. #ifndef OPENSSL_IS_BORINGSSL
  231. case 24:
  232. return EVP_aes_192_ecb();
  233. #endif /* OPENSSL_IS_BORINGSSL */
  234. case 32:
  235. return EVP_aes_256_ecb();
  236. }
  237. return NULL;
  238. }
  239. void * aes_encrypt_init(const u8 *key, size_t len)
  240. {
  241. EVP_CIPHER_CTX *ctx;
  242. const EVP_CIPHER *type;
  243. if (TEST_FAIL())
  244. return NULL;
  245. type = aes_get_evp_cipher(len);
  246. if (type == NULL)
  247. return NULL;
  248. ctx = EVP_CIPHER_CTX_new();
  249. if (ctx == NULL)
  250. return NULL;
  251. if (EVP_EncryptInit_ex(ctx, type, NULL, key, NULL) != 1) {
  252. os_free(ctx);
  253. return NULL;
  254. }
  255. EVP_CIPHER_CTX_set_padding(ctx, 0);
  256. return ctx;
  257. }
  258. int aes_encrypt(void *ctx, const u8 *plain, u8 *crypt)
  259. {
  260. EVP_CIPHER_CTX *c = ctx;
  261. int clen = 16;
  262. if (EVP_EncryptUpdate(c, crypt, &clen, plain, 16) != 1) {
  263. wpa_printf(MSG_ERROR, "OpenSSL: EVP_EncryptUpdate failed: %s",
  264. ERR_error_string(ERR_get_error(), NULL));
  265. return -1;
  266. }
  267. return 0;
  268. }
  269. void aes_encrypt_deinit(void *ctx)
  270. {
  271. EVP_CIPHER_CTX *c = ctx;
  272. u8 buf[16];
  273. int len = sizeof(buf);
  274. if (EVP_EncryptFinal_ex(c, buf, &len) != 1) {
  275. wpa_printf(MSG_ERROR, "OpenSSL: EVP_EncryptFinal_ex failed: "
  276. "%s", ERR_error_string(ERR_get_error(), NULL));
  277. }
  278. if (len != 0) {
  279. wpa_printf(MSG_ERROR, "OpenSSL: Unexpected padding length %d "
  280. "in AES encrypt", len);
  281. }
  282. EVP_CIPHER_CTX_free(c);
  283. }
  284. void * aes_decrypt_init(const u8 *key, size_t len)
  285. {
  286. EVP_CIPHER_CTX *ctx;
  287. const EVP_CIPHER *type;
  288. if (TEST_FAIL())
  289. return NULL;
  290. type = aes_get_evp_cipher(len);
  291. if (type == NULL)
  292. return NULL;
  293. ctx = EVP_CIPHER_CTX_new();
  294. if (ctx == NULL)
  295. return NULL;
  296. if (EVP_DecryptInit_ex(ctx, type, NULL, key, NULL) != 1) {
  297. EVP_CIPHER_CTX_free(ctx);
  298. return NULL;
  299. }
  300. EVP_CIPHER_CTX_set_padding(ctx, 0);
  301. return ctx;
  302. }
  303. int aes_decrypt(void *ctx, const u8 *crypt, u8 *plain)
  304. {
  305. EVP_CIPHER_CTX *c = ctx;
  306. int plen = 16;
  307. if (EVP_DecryptUpdate(c, plain, &plen, crypt, 16) != 1) {
  308. wpa_printf(MSG_ERROR, "OpenSSL: EVP_DecryptUpdate failed: %s",
  309. ERR_error_string(ERR_get_error(), NULL));
  310. return -1;
  311. }
  312. return 0;
  313. }
  314. void aes_decrypt_deinit(void *ctx)
  315. {
  316. EVP_CIPHER_CTX *c = ctx;
  317. u8 buf[16];
  318. int len = sizeof(buf);
  319. if (EVP_DecryptFinal_ex(c, buf, &len) != 1) {
  320. wpa_printf(MSG_ERROR, "OpenSSL: EVP_DecryptFinal_ex failed: "
  321. "%s", ERR_error_string(ERR_get_error(), NULL));
  322. }
  323. if (len != 0) {
  324. wpa_printf(MSG_ERROR, "OpenSSL: Unexpected padding length %d "
  325. "in AES decrypt", len);
  326. }
  327. EVP_CIPHER_CTX_free(c);
  328. }
  329. #ifndef CONFIG_FIPS
  330. #ifndef CONFIG_OPENSSL_INTERNAL_AES_WRAP
  331. int aes_wrap(const u8 *kek, size_t kek_len, int n, const u8 *plain, u8 *cipher)
  332. {
  333. AES_KEY actx;
  334. int res;
  335. if (TEST_FAIL())
  336. return -1;
  337. if (AES_set_encrypt_key(kek, kek_len << 3, &actx))
  338. return -1;
  339. res = AES_wrap_key(&actx, NULL, cipher, plain, n * 8);
  340. OPENSSL_cleanse(&actx, sizeof(actx));
  341. return res <= 0 ? -1 : 0;
  342. }
  343. int aes_unwrap(const u8 *kek, size_t kek_len, int n, const u8 *cipher,
  344. u8 *plain)
  345. {
  346. AES_KEY actx;
  347. int res;
  348. if (TEST_FAIL())
  349. return -1;
  350. if (AES_set_decrypt_key(kek, kek_len << 3, &actx))
  351. return -1;
  352. res = AES_unwrap_key(&actx, NULL, plain, cipher, (n + 1) * 8);
  353. OPENSSL_cleanse(&actx, sizeof(actx));
  354. return res <= 0 ? -1 : 0;
  355. }
  356. #endif /* CONFIG_OPENSSL_INTERNAL_AES_WRAP */
  357. #endif /* CONFIG_FIPS */
  358. int aes_128_cbc_encrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len)
  359. {
  360. EVP_CIPHER_CTX *ctx;
  361. int clen, len;
  362. u8 buf[16];
  363. int res = -1;
  364. if (TEST_FAIL())
  365. return -1;
  366. ctx = EVP_CIPHER_CTX_new();
  367. if (!ctx)
  368. return -1;
  369. clen = data_len;
  370. len = sizeof(buf);
  371. if (EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv) == 1 &&
  372. EVP_CIPHER_CTX_set_padding(ctx, 0) == 1 &&
  373. EVP_EncryptUpdate(ctx, data, &clen, data, data_len) == 1 &&
  374. clen == (int) data_len &&
  375. EVP_EncryptFinal_ex(ctx, buf, &len) == 1 && len == 0)
  376. res = 0;
  377. EVP_CIPHER_CTX_free(ctx);
  378. return res;
  379. }
  380. int aes_128_cbc_decrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len)
  381. {
  382. EVP_CIPHER_CTX *ctx;
  383. int plen, len;
  384. u8 buf[16];
  385. int res = -1;
  386. if (TEST_FAIL())
  387. return -1;
  388. ctx = EVP_CIPHER_CTX_new();
  389. if (!ctx)
  390. return -1;
  391. plen = data_len;
  392. len = sizeof(buf);
  393. if (EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv) == 1 &&
  394. EVP_CIPHER_CTX_set_padding(ctx, 0) == 1 &&
  395. EVP_DecryptUpdate(ctx, data, &plen, data, data_len) == 1 &&
  396. plen == (int) data_len &&
  397. EVP_DecryptFinal_ex(ctx, buf, &len) == 1 && len == 0)
  398. res = 0;
  399. EVP_CIPHER_CTX_free(ctx);
  400. return res;
  401. }
  402. int crypto_mod_exp(const u8 *base, size_t base_len,
  403. const u8 *power, size_t power_len,
  404. const u8 *modulus, size_t modulus_len,
  405. u8 *result, size_t *result_len)
  406. {
  407. BIGNUM *bn_base, *bn_exp, *bn_modulus, *bn_result;
  408. int ret = -1;
  409. BN_CTX *ctx;
  410. ctx = BN_CTX_new();
  411. if (ctx == NULL)
  412. return -1;
  413. bn_base = BN_bin2bn(base, base_len, NULL);
  414. bn_exp = BN_bin2bn(power, power_len, NULL);
  415. bn_modulus = BN_bin2bn(modulus, modulus_len, NULL);
  416. bn_result = BN_new();
  417. if (bn_base == NULL || bn_exp == NULL || bn_modulus == NULL ||
  418. bn_result == NULL)
  419. goto error;
  420. if (BN_mod_exp(bn_result, bn_base, bn_exp, bn_modulus, ctx) != 1)
  421. goto error;
  422. *result_len = BN_bn2bin(bn_result, result);
  423. ret = 0;
  424. error:
  425. BN_clear_free(bn_base);
  426. BN_clear_free(bn_exp);
  427. BN_clear_free(bn_modulus);
  428. BN_clear_free(bn_result);
  429. BN_CTX_free(ctx);
  430. return ret;
  431. }
  432. struct crypto_cipher {
  433. EVP_CIPHER_CTX *enc;
  434. EVP_CIPHER_CTX *dec;
  435. };
  436. struct crypto_cipher * crypto_cipher_init(enum crypto_cipher_alg alg,
  437. const u8 *iv, const u8 *key,
  438. size_t key_len)
  439. {
  440. struct crypto_cipher *ctx;
  441. const EVP_CIPHER *cipher;
  442. ctx = os_zalloc(sizeof(*ctx));
  443. if (ctx == NULL)
  444. return NULL;
  445. switch (alg) {
  446. #ifndef CONFIG_NO_RC4
  447. #ifndef OPENSSL_NO_RC4
  448. case CRYPTO_CIPHER_ALG_RC4:
  449. cipher = EVP_rc4();
  450. break;
  451. #endif /* OPENSSL_NO_RC4 */
  452. #endif /* CONFIG_NO_RC4 */
  453. #ifndef OPENSSL_NO_AES
  454. case CRYPTO_CIPHER_ALG_AES:
  455. switch (key_len) {
  456. case 16:
  457. cipher = EVP_aes_128_cbc();
  458. break;
  459. #ifndef OPENSSL_IS_BORINGSSL
  460. case 24:
  461. cipher = EVP_aes_192_cbc();
  462. break;
  463. #endif /* OPENSSL_IS_BORINGSSL */
  464. case 32:
  465. cipher = EVP_aes_256_cbc();
  466. break;
  467. default:
  468. os_free(ctx);
  469. return NULL;
  470. }
  471. break;
  472. #endif /* OPENSSL_NO_AES */
  473. #ifndef OPENSSL_NO_DES
  474. case CRYPTO_CIPHER_ALG_3DES:
  475. cipher = EVP_des_ede3_cbc();
  476. break;
  477. case CRYPTO_CIPHER_ALG_DES:
  478. cipher = EVP_des_cbc();
  479. break;
  480. #endif /* OPENSSL_NO_DES */
  481. #ifndef OPENSSL_NO_RC2
  482. case CRYPTO_CIPHER_ALG_RC2:
  483. cipher = EVP_rc2_ecb();
  484. break;
  485. #endif /* OPENSSL_NO_RC2 */
  486. default:
  487. os_free(ctx);
  488. return NULL;
  489. }
  490. if (!(ctx->enc = EVP_CIPHER_CTX_new()) ||
  491. !EVP_CIPHER_CTX_set_padding(ctx->enc, 0) ||
  492. !EVP_EncryptInit_ex(ctx->enc, cipher, NULL, NULL, NULL) ||
  493. !EVP_CIPHER_CTX_set_key_length(ctx->enc, key_len) ||
  494. !EVP_EncryptInit_ex(ctx->enc, NULL, NULL, key, iv)) {
  495. if (ctx->enc)
  496. EVP_CIPHER_CTX_free(ctx->enc);
  497. os_free(ctx);
  498. return NULL;
  499. }
  500. if (!(ctx->dec = EVP_CIPHER_CTX_new()) ||
  501. !EVP_CIPHER_CTX_set_padding(ctx->dec, 0) ||
  502. !EVP_DecryptInit_ex(ctx->dec, cipher, NULL, NULL, NULL) ||
  503. !EVP_CIPHER_CTX_set_key_length(ctx->dec, key_len) ||
  504. !EVP_DecryptInit_ex(ctx->dec, NULL, NULL, key, iv)) {
  505. EVP_CIPHER_CTX_free(ctx->enc);
  506. if (ctx->dec)
  507. EVP_CIPHER_CTX_free(ctx->dec);
  508. os_free(ctx);
  509. return NULL;
  510. }
  511. return ctx;
  512. }
  513. int crypto_cipher_encrypt(struct crypto_cipher *ctx, const u8 *plain,
  514. u8 *crypt, size_t len)
  515. {
  516. int outl;
  517. if (!EVP_EncryptUpdate(ctx->enc, crypt, &outl, plain, len))
  518. return -1;
  519. return 0;
  520. }
  521. int crypto_cipher_decrypt(struct crypto_cipher *ctx, const u8 *crypt,
  522. u8 *plain, size_t len)
  523. {
  524. int outl;
  525. outl = len;
  526. if (!EVP_DecryptUpdate(ctx->dec, plain, &outl, crypt, len))
  527. return -1;
  528. return 0;
  529. }
  530. void crypto_cipher_deinit(struct crypto_cipher *ctx)
  531. {
  532. EVP_CIPHER_CTX_free(ctx->enc);
  533. EVP_CIPHER_CTX_free(ctx->dec);
  534. os_free(ctx);
  535. }
  536. void * dh5_init(struct wpabuf **priv, struct wpabuf **publ)
  537. {
  538. #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
  539. DH *dh;
  540. struct wpabuf *pubkey = NULL, *privkey = NULL;
  541. size_t publen, privlen;
  542. *priv = NULL;
  543. wpabuf_free(*publ);
  544. *publ = NULL;
  545. dh = DH_new();
  546. if (dh == NULL)
  547. return NULL;
  548. dh->g = BN_new();
  549. if (dh->g == NULL || BN_set_word(dh->g, 2) != 1)
  550. goto err;
  551. dh->p = get_group5_prime();
  552. if (dh->p == NULL)
  553. goto err;
  554. if (DH_generate_key(dh) != 1)
  555. goto err;
  556. publen = BN_num_bytes(dh->pub_key);
  557. pubkey = wpabuf_alloc(publen);
  558. if (pubkey == NULL)
  559. goto err;
  560. privlen = BN_num_bytes(dh->priv_key);
  561. privkey = wpabuf_alloc(privlen);
  562. if (privkey == NULL)
  563. goto err;
  564. BN_bn2bin(dh->pub_key, wpabuf_put(pubkey, publen));
  565. BN_bn2bin(dh->priv_key, wpabuf_put(privkey, privlen));
  566. *priv = privkey;
  567. *publ = pubkey;
  568. return dh;
  569. err:
  570. wpabuf_clear_free(pubkey);
  571. wpabuf_clear_free(privkey);
  572. DH_free(dh);
  573. return NULL;
  574. #else
  575. DH *dh;
  576. struct wpabuf *pubkey = NULL, *privkey = NULL;
  577. size_t publen, privlen;
  578. BIGNUM *p = NULL, *g;
  579. const BIGNUM *priv_key = NULL, *pub_key = NULL;
  580. *priv = NULL;
  581. wpabuf_free(*publ);
  582. *publ = NULL;
  583. dh = DH_new();
  584. if (dh == NULL)
  585. return NULL;
  586. g = BN_new();
  587. p = get_group5_prime();
  588. if (!g || BN_set_word(g, 2) != 1 || !p ||
  589. DH_set0_pqg(dh, p, NULL, g) != 1)
  590. goto err;
  591. p = NULL;
  592. g = NULL;
  593. if (DH_generate_key(dh) != 1)
  594. goto err;
  595. DH_get0_key(dh, &pub_key, &priv_key);
  596. publen = BN_num_bytes(pub_key);
  597. pubkey = wpabuf_alloc(publen);
  598. if (!pubkey)
  599. goto err;
  600. privlen = BN_num_bytes(priv_key);
  601. privkey = wpabuf_alloc(privlen);
  602. if (!privkey)
  603. goto err;
  604. BN_bn2bin(pub_key, wpabuf_put(pubkey, publen));
  605. BN_bn2bin(priv_key, wpabuf_put(privkey, privlen));
  606. *priv = privkey;
  607. *publ = pubkey;
  608. return dh;
  609. err:
  610. BN_free(p);
  611. BN_free(g);
  612. wpabuf_clear_free(pubkey);
  613. wpabuf_clear_free(privkey);
  614. DH_free(dh);
  615. return NULL;
  616. #endif
  617. }
  618. void * dh5_init_fixed(const struct wpabuf *priv, const struct wpabuf *publ)
  619. {
  620. #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
  621. DH *dh;
  622. dh = DH_new();
  623. if (dh == NULL)
  624. return NULL;
  625. dh->g = BN_new();
  626. if (dh->g == NULL || BN_set_word(dh->g, 2) != 1)
  627. goto err;
  628. dh->p = get_group5_prime();
  629. if (dh->p == NULL)
  630. goto err;
  631. dh->priv_key = BN_bin2bn(wpabuf_head(priv), wpabuf_len(priv), NULL);
  632. if (dh->priv_key == NULL)
  633. goto err;
  634. dh->pub_key = BN_bin2bn(wpabuf_head(publ), wpabuf_len(publ), NULL);
  635. if (dh->pub_key == NULL)
  636. goto err;
  637. if (DH_generate_key(dh) != 1)
  638. goto err;
  639. return dh;
  640. err:
  641. DH_free(dh);
  642. return NULL;
  643. #else
  644. DH *dh;
  645. BIGNUM *p = NULL, *g, *priv_key = NULL, *pub_key = NULL;
  646. dh = DH_new();
  647. if (dh == NULL)
  648. return NULL;
  649. g = BN_new();
  650. p = get_group5_prime();
  651. if (!g || BN_set_word(g, 2) != 1 || !p ||
  652. DH_set0_pqg(dh, p, NULL, g) != 1)
  653. goto err;
  654. p = NULL;
  655. g = NULL;
  656. priv_key = BN_bin2bn(wpabuf_head(priv), wpabuf_len(priv), NULL);
  657. pub_key = BN_bin2bn(wpabuf_head(publ), wpabuf_len(publ), NULL);
  658. if (!priv_key || !pub_key || DH_set0_key(dh, pub_key, priv_key) != 1)
  659. goto err;
  660. pub_key = NULL;
  661. priv_key = NULL;
  662. if (DH_generate_key(dh) != 1)
  663. goto err;
  664. return dh;
  665. err:
  666. BN_free(p);
  667. BN_free(g);
  668. BN_free(pub_key);
  669. BN_clear_free(priv_key);
  670. DH_free(dh);
  671. return NULL;
  672. #endif
  673. }
  674. struct wpabuf * dh5_derive_shared(void *ctx, const struct wpabuf *peer_public,
  675. const struct wpabuf *own_private)
  676. {
  677. BIGNUM *pub_key;
  678. struct wpabuf *res = NULL;
  679. size_t rlen;
  680. DH *dh = ctx;
  681. int keylen;
  682. if (ctx == NULL)
  683. return NULL;
  684. pub_key = BN_bin2bn(wpabuf_head(peer_public), wpabuf_len(peer_public),
  685. NULL);
  686. if (pub_key == NULL)
  687. return NULL;
  688. rlen = DH_size(dh);
  689. res = wpabuf_alloc(rlen);
  690. if (res == NULL)
  691. goto err;
  692. keylen = DH_compute_key(wpabuf_mhead(res), pub_key, dh);
  693. if (keylen < 0)
  694. goto err;
  695. wpabuf_put(res, keylen);
  696. BN_clear_free(pub_key);
  697. return res;
  698. err:
  699. BN_clear_free(pub_key);
  700. wpabuf_clear_free(res);
  701. return NULL;
  702. }
  703. void dh5_free(void *ctx)
  704. {
  705. DH *dh;
  706. if (ctx == NULL)
  707. return;
  708. dh = ctx;
  709. DH_free(dh);
  710. }
  711. struct crypto_hash {
  712. HMAC_CTX *ctx;
  713. };
  714. struct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key,
  715. size_t key_len)
  716. {
  717. struct crypto_hash *ctx;
  718. const EVP_MD *md;
  719. switch (alg) {
  720. #ifndef OPENSSL_NO_MD5
  721. case CRYPTO_HASH_ALG_HMAC_MD5:
  722. md = EVP_md5();
  723. break;
  724. #endif /* OPENSSL_NO_MD5 */
  725. #ifndef OPENSSL_NO_SHA
  726. case CRYPTO_HASH_ALG_HMAC_SHA1:
  727. md = EVP_sha1();
  728. break;
  729. #endif /* OPENSSL_NO_SHA */
  730. #ifndef OPENSSL_NO_SHA256
  731. #ifdef CONFIG_SHA256
  732. case CRYPTO_HASH_ALG_HMAC_SHA256:
  733. md = EVP_sha256();
  734. break;
  735. #endif /* CONFIG_SHA256 */
  736. #endif /* OPENSSL_NO_SHA256 */
  737. default:
  738. return NULL;
  739. }
  740. ctx = os_zalloc(sizeof(*ctx));
  741. if (ctx == NULL)
  742. return NULL;
  743. ctx->ctx = HMAC_CTX_new();
  744. if (!ctx->ctx) {
  745. os_free(ctx);
  746. return NULL;
  747. }
  748. if (HMAC_Init_ex(ctx->ctx, key, key_len, md, NULL) != 1) {
  749. HMAC_CTX_free(ctx->ctx);
  750. bin_clear_free(ctx, sizeof(*ctx));
  751. return NULL;
  752. }
  753. return ctx;
  754. }
  755. void crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len)
  756. {
  757. if (ctx == NULL)
  758. return;
  759. HMAC_Update(ctx->ctx, data, len);
  760. }
  761. int crypto_hash_finish(struct crypto_hash *ctx, u8 *mac, size_t *len)
  762. {
  763. unsigned int mdlen;
  764. int res;
  765. if (ctx == NULL)
  766. return -2;
  767. if (mac == NULL || len == NULL) {
  768. HMAC_CTX_free(ctx->ctx);
  769. bin_clear_free(ctx, sizeof(*ctx));
  770. return 0;
  771. }
  772. mdlen = *len;
  773. res = HMAC_Final(ctx->ctx, mac, &mdlen);
  774. HMAC_CTX_free(ctx->ctx);
  775. bin_clear_free(ctx, sizeof(*ctx));
  776. if (res == 1) {
  777. *len = mdlen;
  778. return 0;
  779. }
  780. return -1;
  781. }
  782. static int openssl_hmac_vector(const EVP_MD *type, const u8 *key,
  783. size_t key_len, size_t num_elem,
  784. const u8 *addr[], const size_t *len, u8 *mac,
  785. unsigned int mdlen)
  786. {
  787. HMAC_CTX *ctx;
  788. size_t i;
  789. int res;
  790. if (TEST_FAIL())
  791. return -1;
  792. ctx = HMAC_CTX_new();
  793. if (!ctx)
  794. return -1;
  795. res = HMAC_Init_ex(ctx, key, key_len, type, NULL);
  796. if (res != 1)
  797. goto done;
  798. for (i = 0; i < num_elem; i++)
  799. HMAC_Update(ctx, addr[i], len[i]);
  800. res = HMAC_Final(ctx, mac, &mdlen);
  801. done:
  802. HMAC_CTX_free(ctx);
  803. return res == 1 ? 0 : -1;
  804. }
  805. #ifndef CONFIG_FIPS
  806. int hmac_md5_vector(const u8 *key, size_t key_len, size_t num_elem,
  807. const u8 *addr[], const size_t *len, u8 *mac)
  808. {
  809. return openssl_hmac_vector(EVP_md5(), key ,key_len, num_elem, addr, len,
  810. mac, 16);
  811. }
  812. int hmac_md5(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
  813. u8 *mac)
  814. {
  815. return hmac_md5_vector(key, key_len, 1, &data, &data_len, mac);
  816. }
  817. #endif /* CONFIG_FIPS */
  818. int pbkdf2_sha1(const char *passphrase, const u8 *ssid, size_t ssid_len,
  819. int iterations, u8 *buf, size_t buflen)
  820. {
  821. if (PKCS5_PBKDF2_HMAC_SHA1(passphrase, os_strlen(passphrase), ssid,
  822. ssid_len, iterations, buflen, buf) != 1)
  823. return -1;
  824. return 0;
  825. }
  826. int hmac_sha1_vector(const u8 *key, size_t key_len, size_t num_elem,
  827. const u8 *addr[], const size_t *len, u8 *mac)
  828. {
  829. return openssl_hmac_vector(EVP_sha1(), key, key_len, num_elem, addr,
  830. len, mac, 20);
  831. }
  832. int hmac_sha1(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
  833. u8 *mac)
  834. {
  835. return hmac_sha1_vector(key, key_len, 1, &data, &data_len, mac);
  836. }
  837. #ifdef CONFIG_SHA256
  838. int hmac_sha256_vector(const u8 *key, size_t key_len, size_t num_elem,
  839. const u8 *addr[], const size_t *len, u8 *mac)
  840. {
  841. return openssl_hmac_vector(EVP_sha256(), key, key_len, num_elem, addr,
  842. len, mac, 32);
  843. }
  844. int hmac_sha256(const u8 *key, size_t key_len, const u8 *data,
  845. size_t data_len, u8 *mac)
  846. {
  847. return hmac_sha256_vector(key, key_len, 1, &data, &data_len, mac);
  848. }
  849. #endif /* CONFIG_SHA256 */
  850. #ifdef CONFIG_SHA384
  851. int hmac_sha384_vector(const u8 *key, size_t key_len, size_t num_elem,
  852. const u8 *addr[], const size_t *len, u8 *mac)
  853. {
  854. return openssl_hmac_vector(EVP_sha384(), key, key_len, num_elem, addr,
  855. len, mac, 48);
  856. }
  857. int hmac_sha384(const u8 *key, size_t key_len, const u8 *data,
  858. size_t data_len, u8 *mac)
  859. {
  860. return hmac_sha384_vector(key, key_len, 1, &data, &data_len, mac);
  861. }
  862. #endif /* CONFIG_SHA384 */
  863. #ifdef CONFIG_SHA512
  864. int hmac_sha512_vector(const u8 *key, size_t key_len, size_t num_elem,
  865. const u8 *addr[], const size_t *len, u8 *mac)
  866. {
  867. return openssl_hmac_vector(EVP_sha512(), key, key_len, num_elem, addr,
  868. len, mac, 64);
  869. }
  870. int hmac_sha512(const u8 *key, size_t key_len, const u8 *data,
  871. size_t data_len, u8 *mac)
  872. {
  873. return hmac_sha512_vector(key, key_len, 1, &data, &data_len, mac);
  874. }
  875. #endif /* CONFIG_SHA512 */
  876. int crypto_get_random(void *buf, size_t len)
  877. {
  878. if (RAND_bytes(buf, len) != 1)
  879. return -1;
  880. return 0;
  881. }
  882. #ifdef CONFIG_OPENSSL_CMAC
  883. int omac1_aes_vector(const u8 *key, size_t key_len, size_t num_elem,
  884. const u8 *addr[], const size_t *len, u8 *mac)
  885. {
  886. CMAC_CTX *ctx;
  887. int ret = -1;
  888. size_t outlen, i;
  889. if (TEST_FAIL())
  890. return -1;
  891. ctx = CMAC_CTX_new();
  892. if (ctx == NULL)
  893. return -1;
  894. if (key_len == 32) {
  895. if (!CMAC_Init(ctx, key, 32, EVP_aes_256_cbc(), NULL))
  896. goto fail;
  897. } else if (key_len == 16) {
  898. if (!CMAC_Init(ctx, key, 16, EVP_aes_128_cbc(), NULL))
  899. goto fail;
  900. } else {
  901. goto fail;
  902. }
  903. for (i = 0; i < num_elem; i++) {
  904. if (!CMAC_Update(ctx, addr[i], len[i]))
  905. goto fail;
  906. }
  907. if (!CMAC_Final(ctx, mac, &outlen) || outlen != 16)
  908. goto fail;
  909. ret = 0;
  910. fail:
  911. CMAC_CTX_free(ctx);
  912. return ret;
  913. }
  914. int omac1_aes_128_vector(const u8 *key, size_t num_elem,
  915. const u8 *addr[], const size_t *len, u8 *mac)
  916. {
  917. return omac1_aes_vector(key, 16, num_elem, addr, len, mac);
  918. }
  919. int omac1_aes_128(const u8 *key, const u8 *data, size_t data_len, u8 *mac)
  920. {
  921. return omac1_aes_128_vector(key, 1, &data, &data_len, mac);
  922. }
  923. int omac1_aes_256(const u8 *key, const u8 *data, size_t data_len, u8 *mac)
  924. {
  925. return omac1_aes_vector(key, 32, 1, &data, &data_len, mac);
  926. }
  927. #endif /* CONFIG_OPENSSL_CMAC */
  928. struct crypto_bignum * crypto_bignum_init(void)
  929. {
  930. if (TEST_FAIL())
  931. return NULL;
  932. return (struct crypto_bignum *) BN_new();
  933. }
  934. struct crypto_bignum * crypto_bignum_init_set(const u8 *buf, size_t len)
  935. {
  936. BIGNUM *bn;
  937. if (TEST_FAIL())
  938. return NULL;
  939. bn = BN_bin2bn(buf, len, NULL);
  940. return (struct crypto_bignum *) bn;
  941. }
  942. void crypto_bignum_deinit(struct crypto_bignum *n, int clear)
  943. {
  944. if (clear)
  945. BN_clear_free((BIGNUM *) n);
  946. else
  947. BN_free((BIGNUM *) n);
  948. }
  949. int crypto_bignum_to_bin(const struct crypto_bignum *a,
  950. u8 *buf, size_t buflen, size_t padlen)
  951. {
  952. int num_bytes, offset;
  953. if (TEST_FAIL())
  954. return -1;
  955. if (padlen > buflen)
  956. return -1;
  957. num_bytes = BN_num_bytes((const BIGNUM *) a);
  958. if ((size_t) num_bytes > buflen)
  959. return -1;
  960. if (padlen > (size_t) num_bytes)
  961. offset = padlen - num_bytes;
  962. else
  963. offset = 0;
  964. os_memset(buf, 0, offset);
  965. BN_bn2bin((const BIGNUM *) a, buf + offset);
  966. return num_bytes + offset;
  967. }
  968. int crypto_bignum_add(const struct crypto_bignum *a,
  969. const struct crypto_bignum *b,
  970. struct crypto_bignum *c)
  971. {
  972. return BN_add((BIGNUM *) c, (const BIGNUM *) a, (const BIGNUM *) b) ?
  973. 0 : -1;
  974. }
  975. int crypto_bignum_mod(const struct crypto_bignum *a,
  976. const struct crypto_bignum *b,
  977. struct crypto_bignum *c)
  978. {
  979. int res;
  980. BN_CTX *bnctx;
  981. bnctx = BN_CTX_new();
  982. if (bnctx == NULL)
  983. return -1;
  984. res = BN_mod((BIGNUM *) c, (const BIGNUM *) a, (const BIGNUM *) b,
  985. bnctx);
  986. BN_CTX_free(bnctx);
  987. return res ? 0 : -1;
  988. }
  989. int crypto_bignum_exptmod(const struct crypto_bignum *a,
  990. const struct crypto_bignum *b,
  991. const struct crypto_bignum *c,
  992. struct crypto_bignum *d)
  993. {
  994. int res;
  995. BN_CTX *bnctx;
  996. if (TEST_FAIL())
  997. return -1;
  998. bnctx = BN_CTX_new();
  999. if (bnctx == NULL)
  1000. return -1;
  1001. res = BN_mod_exp((BIGNUM *) d, (const BIGNUM *) a, (const BIGNUM *) b,
  1002. (const BIGNUM *) c, bnctx);
  1003. BN_CTX_free(bnctx);
  1004. return res ? 0 : -1;
  1005. }
  1006. int crypto_bignum_inverse(const struct crypto_bignum *a,
  1007. const struct crypto_bignum *b,
  1008. struct crypto_bignum *c)
  1009. {
  1010. BIGNUM *res;
  1011. BN_CTX *bnctx;
  1012. if (TEST_FAIL())
  1013. return -1;
  1014. bnctx = BN_CTX_new();
  1015. if (bnctx == NULL)
  1016. return -1;
  1017. res = BN_mod_inverse((BIGNUM *) c, (const BIGNUM *) a,
  1018. (const BIGNUM *) b, bnctx);
  1019. BN_CTX_free(bnctx);
  1020. return res ? 0 : -1;
  1021. }
  1022. int crypto_bignum_sub(const struct crypto_bignum *a,
  1023. const struct crypto_bignum *b,
  1024. struct crypto_bignum *c)
  1025. {
  1026. if (TEST_FAIL())
  1027. return -1;
  1028. return BN_sub((BIGNUM *) c, (const BIGNUM *) a, (const BIGNUM *) b) ?
  1029. 0 : -1;
  1030. }
  1031. int crypto_bignum_div(const struct crypto_bignum *a,
  1032. const struct crypto_bignum *b,
  1033. struct crypto_bignum *c)
  1034. {
  1035. int res;
  1036. BN_CTX *bnctx;
  1037. if (TEST_FAIL())
  1038. return -1;
  1039. bnctx = BN_CTX_new();
  1040. if (bnctx == NULL)
  1041. return -1;
  1042. res = BN_div((BIGNUM *) c, NULL, (const BIGNUM *) a,
  1043. (const BIGNUM *) b, bnctx);
  1044. BN_CTX_free(bnctx);
  1045. return res ? 0 : -1;
  1046. }
  1047. int crypto_bignum_mulmod(const struct crypto_bignum *a,
  1048. const struct crypto_bignum *b,
  1049. const struct crypto_bignum *c,
  1050. struct crypto_bignum *d)
  1051. {
  1052. int res;
  1053. BN_CTX *bnctx;
  1054. if (TEST_FAIL())
  1055. return -1;
  1056. bnctx = BN_CTX_new();
  1057. if (bnctx == NULL)
  1058. return -1;
  1059. res = BN_mod_mul((BIGNUM *) d, (const BIGNUM *) a, (const BIGNUM *) b,
  1060. (const BIGNUM *) c, bnctx);
  1061. BN_CTX_free(bnctx);
  1062. return res ? 0 : -1;
  1063. }
  1064. int crypto_bignum_cmp(const struct crypto_bignum *a,
  1065. const struct crypto_bignum *b)
  1066. {
  1067. return BN_cmp((const BIGNUM *) a, (const BIGNUM *) b);
  1068. }
  1069. int crypto_bignum_bits(const struct crypto_bignum *a)
  1070. {
  1071. return BN_num_bits((const BIGNUM *) a);
  1072. }
  1073. int crypto_bignum_is_zero(const struct crypto_bignum *a)
  1074. {
  1075. return BN_is_zero((const BIGNUM *) a);
  1076. }
  1077. int crypto_bignum_is_one(const struct crypto_bignum *a)
  1078. {
  1079. return BN_is_one((const BIGNUM *) a);
  1080. }
  1081. int crypto_bignum_legendre(const struct crypto_bignum *a,
  1082. const struct crypto_bignum *p)
  1083. {
  1084. BN_CTX *bnctx;
  1085. BIGNUM *exp = NULL, *tmp = NULL;
  1086. int res = -2;
  1087. if (TEST_FAIL())
  1088. return -2;
  1089. bnctx = BN_CTX_new();
  1090. if (bnctx == NULL)
  1091. return -2;
  1092. exp = BN_new();
  1093. tmp = BN_new();
  1094. if (!exp || !tmp ||
  1095. /* exp = (p-1) / 2 */
  1096. !BN_sub(exp, (const BIGNUM *) p, BN_value_one()) ||
  1097. !BN_rshift1(exp, exp) ||
  1098. !BN_mod_exp(tmp, (const BIGNUM *) a, exp, (const BIGNUM *) p,
  1099. bnctx))
  1100. goto fail;
  1101. if (BN_is_word(tmp, 1))
  1102. res = 1;
  1103. else if (BN_is_zero(tmp))
  1104. res = 0;
  1105. else
  1106. res = -1;
  1107. fail:
  1108. BN_clear_free(tmp);
  1109. BN_clear_free(exp);
  1110. BN_CTX_free(bnctx);
  1111. return res;
  1112. }
  1113. #ifdef CONFIG_ECC
  1114. struct crypto_ec {
  1115. EC_GROUP *group;
  1116. int nid;
  1117. BN_CTX *bnctx;
  1118. BIGNUM *prime;
  1119. BIGNUM *order;
  1120. BIGNUM *a;
  1121. BIGNUM *b;
  1122. };
  1123. struct crypto_ec * crypto_ec_init(int group)
  1124. {
  1125. struct crypto_ec *e;
  1126. int nid;
  1127. /* Map from IANA registry for IKE D-H groups to OpenSSL NID */
  1128. switch (group) {
  1129. case 19:
  1130. nid = NID_X9_62_prime256v1;
  1131. break;
  1132. case 20:
  1133. nid = NID_secp384r1;
  1134. break;
  1135. case 21:
  1136. nid = NID_secp521r1;
  1137. break;
  1138. case 25:
  1139. nid = NID_X9_62_prime192v1;
  1140. break;
  1141. case 26:
  1142. nid = NID_secp224r1;
  1143. break;
  1144. #ifdef NID_brainpoolP224r1
  1145. case 27:
  1146. nid = NID_brainpoolP224r1;
  1147. break;
  1148. #endif /* NID_brainpoolP224r1 */
  1149. #ifdef NID_brainpoolP256r1
  1150. case 28:
  1151. nid = NID_brainpoolP256r1;
  1152. break;
  1153. #endif /* NID_brainpoolP256r1 */
  1154. #ifdef NID_brainpoolP384r1
  1155. case 29:
  1156. nid = NID_brainpoolP384r1;
  1157. break;
  1158. #endif /* NID_brainpoolP384r1 */
  1159. #ifdef NID_brainpoolP512r1
  1160. case 30:
  1161. nid = NID_brainpoolP512r1;
  1162. break;
  1163. #endif /* NID_brainpoolP512r1 */
  1164. default:
  1165. return NULL;
  1166. }
  1167. e = os_zalloc(sizeof(*e));
  1168. if (e == NULL)
  1169. return NULL;
  1170. e->nid = nid;
  1171. e->bnctx = BN_CTX_new();
  1172. e->group = EC_GROUP_new_by_curve_name(nid);
  1173. e->prime = BN_new();
  1174. e->order = BN_new();
  1175. e->a = BN_new();
  1176. e->b = BN_new();
  1177. if (e->group == NULL || e->bnctx == NULL || e->prime == NULL ||
  1178. e->order == NULL || e->a == NULL || e->b == NULL ||
  1179. !EC_GROUP_get_curve_GFp(e->group, e->prime, e->a, e->b, e->bnctx) ||
  1180. !EC_GROUP_get_order(e->group, e->order, e->bnctx)) {
  1181. crypto_ec_deinit(e);
  1182. e = NULL;
  1183. }
  1184. return e;
  1185. }
  1186. void crypto_ec_deinit(struct crypto_ec *e)
  1187. {
  1188. if (e == NULL)
  1189. return;
  1190. BN_clear_free(e->b);
  1191. BN_clear_free(e->a);
  1192. BN_clear_free(e->order);
  1193. BN_clear_free(e->prime);
  1194. EC_GROUP_free(e->group);
  1195. BN_CTX_free(e->bnctx);
  1196. os_free(e);
  1197. }
  1198. struct crypto_ec_point * crypto_ec_point_init(struct crypto_ec *e)
  1199. {
  1200. if (TEST_FAIL())
  1201. return NULL;
  1202. if (e == NULL)
  1203. return NULL;
  1204. return (struct crypto_ec_point *) EC_POINT_new(e->group);
  1205. }
  1206. size_t crypto_ec_prime_len(struct crypto_ec *e)
  1207. {
  1208. return BN_num_bytes(e->prime);
  1209. }
  1210. size_t crypto_ec_prime_len_bits(struct crypto_ec *e)
  1211. {
  1212. return BN_num_bits(e->prime);
  1213. }
  1214. const struct crypto_bignum * crypto_ec_get_prime(struct crypto_ec *e)
  1215. {
  1216. return (const struct crypto_bignum *) e->prime;
  1217. }
  1218. const struct crypto_bignum * crypto_ec_get_order(struct crypto_ec *e)
  1219. {
  1220. return (const struct crypto_bignum *) e->order;
  1221. }
  1222. void crypto_ec_point_deinit(struct crypto_ec_point *p, int clear)
  1223. {
  1224. if (clear)
  1225. EC_POINT_clear_free((EC_POINT *) p);
  1226. else
  1227. EC_POINT_free((EC_POINT *) p);
  1228. }
  1229. int crypto_ec_point_to_bin(struct crypto_ec *e,
  1230. const struct crypto_ec_point *point, u8 *x, u8 *y)
  1231. {
  1232. BIGNUM *x_bn, *y_bn;
  1233. int ret = -1;
  1234. int len = BN_num_bytes(e->prime);
  1235. if (TEST_FAIL())
  1236. return -1;
  1237. x_bn = BN_new();
  1238. y_bn = BN_new();
  1239. if (x_bn && y_bn &&
  1240. EC_POINT_get_affine_coordinates_GFp(e->group, (EC_POINT *) point,
  1241. x_bn, y_bn, e->bnctx)) {
  1242. if (x) {
  1243. crypto_bignum_to_bin((struct crypto_bignum *) x_bn,
  1244. x, len, len);
  1245. }
  1246. if (y) {
  1247. crypto_bignum_to_bin((struct crypto_bignum *) y_bn,
  1248. y, len, len);
  1249. }
  1250. ret = 0;
  1251. }
  1252. BN_clear_free(x_bn);
  1253. BN_clear_free(y_bn);
  1254. return ret;
  1255. }
  1256. struct crypto_ec_point * crypto_ec_point_from_bin(struct crypto_ec *e,
  1257. const u8 *val)
  1258. {
  1259. BIGNUM *x, *y;
  1260. EC_POINT *elem;
  1261. int len = BN_num_bytes(e->prime);
  1262. if (TEST_FAIL())
  1263. return NULL;
  1264. x = BN_bin2bn(val, len, NULL);
  1265. y = BN_bin2bn(val + len, len, NULL);
  1266. elem = EC_POINT_new(e->group);
  1267. if (x == NULL || y == NULL || elem == NULL) {
  1268. BN_clear_free(x);
  1269. BN_clear_free(y);
  1270. EC_POINT_clear_free(elem);
  1271. return NULL;
  1272. }
  1273. if (!EC_POINT_set_affine_coordinates_GFp(e->group, elem, x, y,
  1274. e->bnctx)) {
  1275. EC_POINT_clear_free(elem);
  1276. elem = NULL;
  1277. }
  1278. BN_clear_free(x);
  1279. BN_clear_free(y);
  1280. return (struct crypto_ec_point *) elem;
  1281. }
  1282. int crypto_ec_point_add(struct crypto_ec *e, const struct crypto_ec_point *a,
  1283. const struct crypto_ec_point *b,
  1284. struct crypto_ec_point *c)
  1285. {
  1286. if (TEST_FAIL())
  1287. return -1;
  1288. return EC_POINT_add(e->group, (EC_POINT *) c, (const EC_POINT *) a,
  1289. (const EC_POINT *) b, e->bnctx) ? 0 : -1;
  1290. }
  1291. int crypto_ec_point_mul(struct crypto_ec *e, const struct crypto_ec_point *p,
  1292. const struct crypto_bignum *b,
  1293. struct crypto_ec_point *res)
  1294. {
  1295. if (TEST_FAIL())
  1296. return -1;
  1297. return EC_POINT_mul(e->group, (EC_POINT *) res, NULL,
  1298. (const EC_POINT *) p, (const BIGNUM *) b, e->bnctx)
  1299. ? 0 : -1;
  1300. }
  1301. int crypto_ec_point_invert(struct crypto_ec *e, struct crypto_ec_point *p)
  1302. {
  1303. if (TEST_FAIL())
  1304. return -1;
  1305. return EC_POINT_invert(e->group, (EC_POINT *) p, e->bnctx) ? 0 : -1;
  1306. }
  1307. int crypto_ec_point_solve_y_coord(struct crypto_ec *e,
  1308. struct crypto_ec_point *p,
  1309. const struct crypto_bignum *x, int y_bit)
  1310. {
  1311. if (TEST_FAIL())
  1312. return -1;
  1313. if (!EC_POINT_set_compressed_coordinates_GFp(e->group, (EC_POINT *) p,
  1314. (const BIGNUM *) x, y_bit,
  1315. e->bnctx) ||
  1316. !EC_POINT_is_on_curve(e->group, (EC_POINT *) p, e->bnctx))
  1317. return -1;
  1318. return 0;
  1319. }
  1320. struct crypto_bignum *
  1321. crypto_ec_point_compute_y_sqr(struct crypto_ec *e,
  1322. const struct crypto_bignum *x)
  1323. {
  1324. BIGNUM *tmp, *tmp2, *y_sqr = NULL;
  1325. if (TEST_FAIL())
  1326. return NULL;
  1327. tmp = BN_new();
  1328. tmp2 = BN_new();
  1329. /* y^2 = x^3 + ax + b */
  1330. if (tmp && tmp2 &&
  1331. BN_mod_sqr(tmp, (const BIGNUM *) x, e->prime, e->bnctx) &&
  1332. BN_mod_mul(tmp, tmp, (const BIGNUM *) x, e->prime, e->bnctx) &&
  1333. BN_mod_mul(tmp2, e->a, (const BIGNUM *) x, e->prime, e->bnctx) &&
  1334. BN_mod_add_quick(tmp2, tmp2, tmp, e->prime) &&
  1335. BN_mod_add_quick(tmp2, tmp2, e->b, e->prime)) {
  1336. y_sqr = tmp2;
  1337. tmp2 = NULL;
  1338. }
  1339. BN_clear_free(tmp);
  1340. BN_clear_free(tmp2);
  1341. return (struct crypto_bignum *) y_sqr;
  1342. }
  1343. int crypto_ec_point_is_at_infinity(struct crypto_ec *e,
  1344. const struct crypto_ec_point *p)
  1345. {
  1346. return EC_POINT_is_at_infinity(e->group, (const EC_POINT *) p);
  1347. }
  1348. int crypto_ec_point_is_on_curve(struct crypto_ec *e,
  1349. const struct crypto_ec_point *p)
  1350. {
  1351. return EC_POINT_is_on_curve(e->group, (const EC_POINT *) p,
  1352. e->bnctx) == 1;
  1353. }
  1354. int crypto_ec_point_cmp(const struct crypto_ec *e,
  1355. const struct crypto_ec_point *a,
  1356. const struct crypto_ec_point *b)
  1357. {
  1358. return EC_POINT_cmp(e->group, (const EC_POINT *) a,
  1359. (const EC_POINT *) b, e->bnctx);
  1360. }
  1361. struct crypto_ecdh {
  1362. struct crypto_ec *ec;
  1363. EVP_PKEY *pkey;
  1364. };
  1365. struct crypto_ecdh * crypto_ecdh_init(int group)
  1366. {
  1367. struct crypto_ecdh *ecdh;
  1368. EVP_PKEY *params = NULL;
  1369. #ifdef OPENSSL_IS_BORINGSSL
  1370. const EC_GROUP *ec_group;
  1371. EC_KEY *ec_params;
  1372. #else /* OPENSSL_IS_BORINGSSL */
  1373. EVP_PKEY_CTX *pctx = NULL;
  1374. #endif /* OPENSSL_IS_BORINGSSL */
  1375. EVP_PKEY_CTX *kctx = NULL;
  1376. ecdh = os_zalloc(sizeof(*ecdh));
  1377. if (!ecdh)
  1378. goto fail;
  1379. ecdh->ec = crypto_ec_init(group);
  1380. if (!ecdh->ec)
  1381. goto fail;
  1382. #ifdef OPENSSL_IS_BORINGSSL
  1383. ec_group = EC_GROUP_new_by_curve_name(ecdh->ec->nid);
  1384. ec_params = EC_KEY_new();
  1385. if (!ec_params || EC_KEY_set_group(ec_params, ec_group) != 1) {
  1386. wpa_printf(MSG_ERROR,
  1387. "BoringSSL: Failed to generate EC_KEY parameters");
  1388. goto fail;
  1389. }
  1390. EC_KEY_set_asn1_flag(ec_params, OPENSSL_EC_NAMED_CURVE);
  1391. params = EVP_PKEY_new();
  1392. if (!params || EVP_PKEY_set1_EC_KEY(params, ec_params) != 1) {
  1393. wpa_printf(MSG_ERROR,
  1394. "BoringSSL: Failed to generate EVP_PKEY parameters");
  1395. goto fail;
  1396. }
  1397. #else /* OPENSSL_IS_BORINGSSL */
  1398. pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
  1399. if (!pctx)
  1400. goto fail;
  1401. if (EVP_PKEY_paramgen_init(pctx) != 1) {
  1402. wpa_printf(MSG_ERROR,
  1403. "OpenSSL: EVP_PKEY_paramgen_init failed: %s",
  1404. ERR_error_string(ERR_get_error(), NULL));
  1405. goto fail;
  1406. }
  1407. if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, ecdh->ec->nid) != 1) {
  1408. wpa_printf(MSG_ERROR,
  1409. "OpenSSL: EVP_PKEY_CTX_set_ec_paramgen_curve_nid failed: %s",
  1410. ERR_error_string(ERR_get_error(), NULL));
  1411. goto fail;
  1412. }
  1413. if (EVP_PKEY_paramgen(pctx, &params) != 1) {
  1414. wpa_printf(MSG_ERROR, "OpenSSL: EVP_PKEY_paramgen failed: %s",
  1415. ERR_error_string(ERR_get_error(), NULL));
  1416. goto fail;
  1417. }
  1418. #endif /* OPENSSL_IS_BORINGSSL */
  1419. kctx = EVP_PKEY_CTX_new(params, NULL);
  1420. if (!kctx)
  1421. goto fail;
  1422. if (EVP_PKEY_keygen_init(kctx) != 1) {
  1423. wpa_printf(MSG_ERROR,
  1424. "OpenSSL: EVP_PKEY_keygen_init failed: %s",
  1425. ERR_error_string(ERR_get_error(), NULL));
  1426. goto fail;
  1427. }
  1428. if (EVP_PKEY_keygen(kctx, &ecdh->pkey) != 1) {
  1429. wpa_printf(MSG_ERROR, "OpenSSL: EVP_PKEY_keygen failed: %s",
  1430. ERR_error_string(ERR_get_error(), NULL));
  1431. goto fail;
  1432. }
  1433. done:
  1434. EVP_PKEY_free(params);
  1435. #ifndef OPENSSL_IS_BORINGSSL
  1436. EVP_PKEY_CTX_free(pctx);
  1437. #endif /* OPENSSL_IS_BORINGSSL */
  1438. EVP_PKEY_CTX_free(kctx);
  1439. return ecdh;
  1440. fail:
  1441. crypto_ecdh_deinit(ecdh);
  1442. ecdh = NULL;
  1443. goto done;
  1444. }
  1445. struct wpabuf * crypto_ecdh_get_pubkey(struct crypto_ecdh *ecdh, int inc_y)
  1446. {
  1447. struct wpabuf *buf = NULL;
  1448. EC_KEY *eckey;
  1449. const EC_POINT *pubkey;
  1450. BIGNUM *x, *y = NULL;
  1451. int len = BN_num_bytes(ecdh->ec->prime);
  1452. int res;
  1453. eckey = EVP_PKEY_get1_EC_KEY(ecdh->pkey);
  1454. if (!eckey)
  1455. return NULL;
  1456. pubkey = EC_KEY_get0_public_key(eckey);
  1457. if (!pubkey)
  1458. return NULL;
  1459. x = BN_new();
  1460. if (inc_y) {
  1461. y = BN_new();
  1462. if (!y)
  1463. goto fail;
  1464. }
  1465. buf = wpabuf_alloc(inc_y ? 2 * len : len);
  1466. if (!x || !buf)
  1467. goto fail;
  1468. if (EC_POINT_get_affine_coordinates_GFp(ecdh->ec->group, pubkey,
  1469. x, y, ecdh->ec->bnctx) != 1) {
  1470. wpa_printf(MSG_ERROR,
  1471. "OpenSSL: EC_POINT_get_affine_coordinates_GFp failed: %s",
  1472. ERR_error_string(ERR_get_error(), NULL));
  1473. goto fail;
  1474. }
  1475. res = crypto_bignum_to_bin((struct crypto_bignum *) x,
  1476. wpabuf_put(buf, len), len, len);
  1477. if (res < 0)
  1478. goto fail;
  1479. if (inc_y) {
  1480. res = crypto_bignum_to_bin((struct crypto_bignum *) y,
  1481. wpabuf_put(buf, len), len, len);
  1482. if (res < 0)
  1483. goto fail;
  1484. }
  1485. done:
  1486. BN_clear_free(x);
  1487. BN_clear_free(y);
  1488. EC_KEY_free(eckey);
  1489. return buf;
  1490. fail:
  1491. wpabuf_free(buf);
  1492. buf = NULL;
  1493. goto done;
  1494. }
  1495. struct wpabuf * crypto_ecdh_set_peerkey(struct crypto_ecdh *ecdh, int inc_y,
  1496. const u8 *key, size_t len)
  1497. {
  1498. BIGNUM *x, *y = NULL;
  1499. EVP_PKEY_CTX *ctx = NULL;
  1500. EVP_PKEY *peerkey = NULL;
  1501. struct wpabuf *secret = NULL;
  1502. size_t secret_len;
  1503. EC_POINT *pub;
  1504. EC_KEY *eckey = NULL;
  1505. x = BN_bin2bn(key, inc_y ? len / 2 : len, NULL);
  1506. pub = EC_POINT_new(ecdh->ec->group);
  1507. if (!x || !pub)
  1508. goto fail;
  1509. if (inc_y) {
  1510. y = BN_bin2bn(key + len / 2, len / 2, NULL);
  1511. if (!y)
  1512. goto fail;
  1513. if (!EC_POINT_set_affine_coordinates_GFp(ecdh->ec->group, pub,
  1514. x, y,
  1515. ecdh->ec->bnctx)) {
  1516. wpa_printf(MSG_ERROR,
  1517. "OpenSSL: EC_POINT_set_affine_coordinates_GFp failed: %s",
  1518. ERR_error_string(ERR_get_error(), NULL));
  1519. goto fail;
  1520. }
  1521. } else if (!EC_POINT_set_compressed_coordinates_GFp(ecdh->ec->group,
  1522. pub, x, 0,
  1523. ecdh->ec->bnctx)) {
  1524. wpa_printf(MSG_ERROR,
  1525. "OpenSSL: EC_POINT_set_compressed_coordinates_GFp failed: %s",
  1526. ERR_error_string(ERR_get_error(), NULL));
  1527. goto fail;
  1528. }
  1529. if (!EC_POINT_is_on_curve(ecdh->ec->group, pub, ecdh->ec->bnctx)) {
  1530. wpa_printf(MSG_ERROR,
  1531. "OpenSSL: ECDH peer public key is not on curve");
  1532. goto fail;
  1533. }
  1534. eckey = EC_KEY_new_by_curve_name(ecdh->ec->nid);
  1535. if (!eckey || EC_KEY_set_public_key(eckey, pub) != 1) {
  1536. wpa_printf(MSG_ERROR,
  1537. "OpenSSL: EC_KEY_set_public_key failed: %s",
  1538. ERR_error_string(ERR_get_error(), NULL));
  1539. goto fail;
  1540. }
  1541. peerkey = EVP_PKEY_new();
  1542. if (!peerkey || EVP_PKEY_set1_EC_KEY(peerkey, eckey) != 1)
  1543. goto fail;
  1544. ctx = EVP_PKEY_CTX_new(ecdh->pkey, NULL);
  1545. if (!ctx || EVP_PKEY_derive_init(ctx) != 1 ||
  1546. EVP_PKEY_derive_set_peer(ctx, peerkey) != 1 ||
  1547. EVP_PKEY_derive(ctx, NULL, &secret_len) != 1) {
  1548. wpa_printf(MSG_ERROR,
  1549. "OpenSSL: EVP_PKEY_derive(1) failed: %s",
  1550. ERR_error_string(ERR_get_error(), NULL));
  1551. goto fail;
  1552. }
  1553. secret = wpabuf_alloc(secret_len);
  1554. if (!secret)
  1555. goto fail;
  1556. if (EVP_PKEY_derive(ctx, wpabuf_put(secret, secret_len),
  1557. &secret_len) != 1) {
  1558. wpa_printf(MSG_ERROR,
  1559. "OpenSSL: EVP_PKEY_derive(2) failed: %s",
  1560. ERR_error_string(ERR_get_error(), NULL));
  1561. goto fail;
  1562. }
  1563. done:
  1564. BN_free(x);
  1565. BN_free(y);
  1566. EC_KEY_free(eckey);
  1567. EC_POINT_free(pub);
  1568. EVP_PKEY_CTX_free(ctx);
  1569. EVP_PKEY_free(peerkey);
  1570. return secret;
  1571. fail:
  1572. wpabuf_free(secret);
  1573. secret = NULL;
  1574. goto done;
  1575. }
  1576. void crypto_ecdh_deinit(struct crypto_ecdh *ecdh)
  1577. {
  1578. if (ecdh) {
  1579. crypto_ec_deinit(ecdh->ec);
  1580. EVP_PKEY_free(ecdh->pkey);
  1581. os_free(ecdh);
  1582. }
  1583. }
  1584. #endif /* CONFIG_ECC */