e_aes.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235
  1. /* ====================================================================
  2. * Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. *
  11. * 2. Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in
  13. * the documentation and/or other materials provided with the
  14. * distribution.
  15. *
  16. * 3. All advertising materials mentioning features or use of this
  17. * software must display the following acknowledgment:
  18. * "This product includes software developed by the OpenSSL Project
  19. * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
  20. *
  21. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  22. * endorse or promote products derived from this software without
  23. * prior written permission. For written permission, please contact
  24. * openssl-core@openssl.org.
  25. *
  26. * 5. Products derived from this software may not be called "OpenSSL"
  27. * nor may "OpenSSL" appear in their names without prior written
  28. * permission of the OpenSSL Project.
  29. *
  30. * 6. Redistributions of any form whatsoever must retain the following
  31. * acknowledgment:
  32. * "This product includes software developed by the OpenSSL Project
  33. * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
  34. *
  35. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  36. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  37. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  38. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  39. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  41. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  42. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  43. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  44. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  45. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  46. * OF THE POSSIBILITY OF SUCH DAMAGE.
  47. * ====================================================================
  48. *
  49. */
  50. #define OPENSSL_FIPSAPI
  51. #include <openssl/opensslconf.h>
  52. #ifndef OPENSSL_NO_AES
  53. #include <openssl/evp.h>
  54. #include <openssl/err.h>
  55. #include <string.h>
  56. #include <assert.h>
  57. #include <openssl/aes.h>
  58. #include "evp_locl.h"
  59. #include "modes_lcl.h"
  60. #include <openssl/rand.h>
  61. typedef struct
  62. {
  63. AES_KEY ks;
  64. } EVP_AES_KEY;
  65. typedef struct
  66. {
  67. AES_KEY ks; /* AES key schedule to use */
  68. int key_set; /* Set if key initialised */
  69. int iv_set; /* Set if an iv is set */
  70. GCM128_CONTEXT gcm;
  71. unsigned char *iv; /* Temporary IV store */
  72. int ivlen; /* IV length */
  73. int taglen;
  74. int iv_gen; /* It is OK to generate IVs */
  75. int tls_aad_len; /* TLS AAD length */
  76. } EVP_AES_GCM_CTX;
  77. typedef struct
  78. {
  79. AES_KEY ks1, ks2; /* AES key schedules to use */
  80. XTS128_CONTEXT xts;
  81. } EVP_AES_XTS_CTX;
  82. typedef struct
  83. {
  84. AES_KEY ks; /* AES key schedule to use */
  85. int key_set; /* Set if key initialised */
  86. int iv_set; /* Set if an iv is set */
  87. int tag_set; /* Set if tag is valid */
  88. int len_set; /* Set if message length set */
  89. int L, M; /* L and M parameters from RFC3610 */
  90. CCM128_CONTEXT ccm;
  91. } EVP_AES_CCM_CTX;
  92. #define MAXBITCHUNK ((size_t)1<<(sizeof(size_t)*8-4))
  93. #if defined(AES_ASM) && !defined(I386_ONLY) && ( \
  94. ((defined(__i386) || defined(__i386__) || \
  95. defined(_M_IX86)) && defined(OPENSSL_IA32_SSE2))|| \
  96. defined(__x86_64) || defined(__x86_64__) || \
  97. defined(_M_AMD64) || defined(_M_X64) || \
  98. defined(__INTEL__) )
  99. /*
  100. * AES-NI section
  101. */
  102. extern unsigned int OPENSSL_ia32cap_P[2];
  103. #define AESNI_CAPABLE (1<<(57-32))
  104. int aesni_set_encrypt_key(const unsigned char *userKey, int bits,
  105. AES_KEY *key);
  106. int aesni_set_decrypt_key(const unsigned char *userKey, int bits,
  107. AES_KEY *key);
  108. void aesni_encrypt(const unsigned char *in, unsigned char *out,
  109. const AES_KEY *key);
  110. void aesni_decrypt(const unsigned char *in, unsigned char *out,
  111. const AES_KEY *key);
  112. void aesni_ecb_encrypt(const unsigned char *in,
  113. unsigned char *out,
  114. size_t length,
  115. const AES_KEY *key,
  116. int enc);
  117. void aesni_cbc_encrypt(const unsigned char *in,
  118. unsigned char *out,
  119. size_t length,
  120. const AES_KEY *key,
  121. unsigned char *ivec, int enc);
  122. void aesni_ctr32_encrypt_blocks(const unsigned char *in,
  123. unsigned char *out,
  124. size_t blocks,
  125. const void *key,
  126. const unsigned char *ivec);
  127. void aesni_xts_encrypt(const unsigned char *in,
  128. unsigned char *out,
  129. size_t length,
  130. const AES_KEY *key1, const AES_KEY *key2,
  131. const unsigned char iv[16]);
  132. void aesni_xts_decrypt(const unsigned char *in,
  133. unsigned char *out,
  134. size_t length,
  135. const AES_KEY *key1, const AES_KEY *key2,
  136. const unsigned char iv[16]);
  137. void aesni_ccm64_encrypt_blocks (const unsigned char *in,
  138. unsigned char *out,
  139. size_t blocks,
  140. const void *key,
  141. const unsigned char ivec[16],
  142. unsigned char cmac[16]);
  143. void aesni_ccm64_decrypt_blocks (const unsigned char *in,
  144. unsigned char *out,
  145. size_t blocks,
  146. const void *key,
  147. const unsigned char ivec[16],
  148. unsigned char cmac[16]);
  149. static int aesni_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
  150. const unsigned char *iv, int enc)
  151. {
  152. int ret;
  153. if (((ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_ECB_MODE
  154. || (ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_CBC_MODE)
  155. && !enc)
  156. ret = aesni_set_decrypt_key(key, ctx->key_len*8, ctx->cipher_data);
  157. else
  158. ret = aesni_set_encrypt_key(key, ctx->key_len*8, ctx->cipher_data);
  159. if(ret < 0)
  160. {
  161. EVPerr(EVP_F_AES_INIT_KEY,EVP_R_AES_KEY_SETUP_FAILED);
  162. return 0;
  163. }
  164. return 1;
  165. }
  166. static int aesni_cbc_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  167. const unsigned char *in, size_t len)
  168. {
  169. aesni_cbc_encrypt(in,out,len,ctx->cipher_data,ctx->iv,ctx->encrypt);
  170. return 1;
  171. }
  172. static int aesni_ecb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  173. const unsigned char *in, size_t len)
  174. {
  175. size_t bl = ctx->cipher->block_size;
  176. if (len<bl) return 1;
  177. aesni_ecb_encrypt(in,out,len,ctx->cipher_data,ctx->encrypt);
  178. return 1;
  179. }
  180. static int aesni_ofb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  181. const unsigned char *in,size_t len)
  182. {
  183. CRYPTO_ofb128_encrypt(in,out,len,ctx->cipher_data,
  184. ctx->iv,&ctx->num,
  185. (block128_f)aesni_encrypt);
  186. return 1;
  187. }
  188. static int aesni_cfb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  189. const unsigned char *in,size_t len)
  190. {
  191. CRYPTO_cfb128_encrypt(in,out,len,ctx->cipher_data,
  192. ctx->iv,&ctx->num,ctx->encrypt,
  193. (block128_f)aesni_encrypt);
  194. return 1;
  195. }
  196. static int aesni_cfb8_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  197. const unsigned char *in,size_t len)
  198. {
  199. CRYPTO_cfb128_8_encrypt(in,out,len,ctx->cipher_data,
  200. ctx->iv,&ctx->num,ctx->encrypt,
  201. (block128_f)aesni_encrypt);
  202. return 1;
  203. }
  204. static int aesni_cfb1_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  205. const unsigned char *in,size_t len)
  206. {
  207. if (ctx->flags&EVP_CIPH_FLAG_LENGTH_BITS) {
  208. CRYPTO_cfb128_1_encrypt(in,out,len,ctx->cipher_data,
  209. ctx->iv,&ctx->num,ctx->encrypt,
  210. (block128_f)aesni_encrypt);
  211. return 1;
  212. }
  213. while (len>=MAXBITCHUNK) {
  214. CRYPTO_cfb128_1_encrypt(in,out,MAXBITCHUNK*8,ctx->cipher_data,
  215. ctx->iv,&ctx->num,ctx->encrypt,
  216. (block128_f)aesni_encrypt);
  217. len-=MAXBITCHUNK;
  218. }
  219. if (len)
  220. CRYPTO_cfb128_1_encrypt(in,out,len*8,ctx->cipher_data,
  221. ctx->iv,&ctx->num,ctx->encrypt,
  222. (block128_f)aesni_encrypt);
  223. return 1;
  224. }
  225. static int aesni_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
  226. const unsigned char *in, size_t len)
  227. {
  228. unsigned int num;
  229. num = ctx->num;
  230. CRYPTO_ctr128_encrypt_ctr32(in,out,len,
  231. ctx->cipher_data,ctx->iv,ctx->buf,&num,
  232. (ctr128_f)aesni_ctr32_encrypt_blocks);
  233. ctx->num = (size_t)num;
  234. return 1;
  235. }
  236. static int aesni_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
  237. const unsigned char *iv, int enc)
  238. {
  239. EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
  240. if (!iv && !key)
  241. return 1;
  242. if (key)
  243. {
  244. aesni_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks);
  245. CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
  246. (block128_f)aesni_encrypt);
  247. /* If we have an iv can set it directly, otherwise use
  248. * saved IV.
  249. */
  250. if (iv == NULL && gctx->iv_set)
  251. iv = gctx->iv;
  252. if (iv)
  253. {
  254. CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
  255. gctx->iv_set = 1;
  256. }
  257. gctx->key_set = 1;
  258. }
  259. else
  260. {
  261. /* If key set use IV, otherwise copy */
  262. if (gctx->key_set)
  263. CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
  264. else
  265. memcpy(gctx->iv, iv, gctx->ivlen);
  266. gctx->iv_set = 1;
  267. gctx->iv_gen = 0;
  268. }
  269. return 1;
  270. }
  271. static int aesni_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
  272. const unsigned char *in, size_t len)
  273. {
  274. EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
  275. /* If not set up, return error */
  276. if (!gctx->iv_set && !gctx->key_set)
  277. return -1;
  278. if (!ctx->encrypt && gctx->taglen < 0)
  279. return -1;
  280. if (in)
  281. {
  282. if (out == NULL)
  283. {
  284. if (CRYPTO_gcm128_aad(&gctx->gcm, in, len))
  285. return -1;
  286. }
  287. else if (ctx->encrypt)
  288. {
  289. if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm,
  290. in, out, len,
  291. aesni_ctr32_encrypt_blocks))
  292. return -1;
  293. }
  294. else
  295. {
  296. if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm,
  297. in, out, len,
  298. aesni_ctr32_encrypt_blocks))
  299. return -1;
  300. }
  301. return len;
  302. }
  303. else
  304. {
  305. if (!ctx->encrypt)
  306. {
  307. if (CRYPTO_gcm128_finish(&gctx->gcm,
  308. ctx->buf, gctx->taglen) != 0)
  309. return -1;
  310. gctx->iv_set = 0;
  311. return 0;
  312. }
  313. CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16);
  314. gctx->taglen = 16;
  315. /* Don't reuse the IV */
  316. gctx->iv_set = 0;
  317. return 0;
  318. }
  319. }
  320. static int aesni_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
  321. const unsigned char *iv, int enc)
  322. {
  323. EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
  324. if (!iv && !key)
  325. return 1;
  326. if (key)
  327. {
  328. /* key_len is two AES keys */
  329. if (enc)
  330. {
  331. aesni_set_encrypt_key(key, ctx->key_len * 4, &xctx->ks1);
  332. xctx->xts.block1 = (block128_f)aesni_encrypt;
  333. }
  334. else
  335. {
  336. aesni_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1);
  337. xctx->xts.block1 = (block128_f)aesni_decrypt;
  338. }
  339. aesni_set_encrypt_key(key + ctx->key_len/2,
  340. ctx->key_len * 4, &xctx->ks2);
  341. xctx->xts.block2 = (block128_f)aesni_encrypt;
  342. xctx->xts.key1 = &xctx->ks1;
  343. }
  344. if (iv)
  345. {
  346. xctx->xts.key2 = &xctx->ks2;
  347. memcpy(ctx->iv, iv, 16);
  348. }
  349. return 1;
  350. }
  351. static int aesni_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
  352. const unsigned char *in, size_t len)
  353. {
  354. EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
  355. if (!xctx->xts.key1 || !xctx->xts.key2)
  356. return -1;
  357. if (!out || !in)
  358. return -1;
  359. #ifdef OPENSSL_FIPS
  360. /* Requirement of SP800-38E */
  361. if (FIPS_module_mode() && !(ctx->flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW) &&
  362. (len > (1L<<20)*16))
  363. {
  364. EVPerr(EVP_F_AES_XTS, EVP_R_TOO_LARGE);
  365. return -1;
  366. }
  367. #endif
  368. if (ctx->encrypt)
  369. aesni_xts_encrypt(in, out, len,
  370. xctx->xts.key1, xctx->xts.key2, ctx->iv);
  371. else
  372. aesni_xts_decrypt(in, out, len,
  373. xctx->xts.key1, xctx->xts.key2, ctx->iv);
  374. return len;
  375. }
  376. static int aesni_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
  377. const unsigned char *iv, int enc)
  378. {
  379. EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
  380. if (!iv && !key)
  381. return 1;
  382. if (key)
  383. {
  384. aesni_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks);
  385. CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
  386. &cctx->ks, (block128_f)aesni_encrypt);
  387. cctx->key_set = 1;
  388. }
  389. if (iv)
  390. {
  391. memcpy(ctx->iv, iv, 15 - cctx->L);
  392. cctx->iv_set = 1;
  393. }
  394. return 1;
  395. }
  396. static int aesni_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
  397. const unsigned char *in, size_t len)
  398. {
  399. EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
  400. CCM128_CONTEXT *ccm = &cctx->ccm;
  401. /* If not set up, return error */
  402. if (!cctx->iv_set && !cctx->key_set)
  403. return -1;
  404. if (!ctx->encrypt && !cctx->tag_set)
  405. return -1;
  406. if (!out)
  407. {
  408. if (!in)
  409. {
  410. if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L,len))
  411. return -1;
  412. cctx->len_set = 1;
  413. return len;
  414. }
  415. /* If have AAD need message length */
  416. if (!cctx->len_set && len)
  417. return -1;
  418. CRYPTO_ccm128_aad(ccm, in, len);
  419. return len;
  420. }
  421. /* EVP_*Final() doesn't return any data */
  422. if (!in)
  423. return 0;
  424. /* If not set length yet do it */
  425. if (!cctx->len_set)
  426. {
  427. if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L, len))
  428. return -1;
  429. cctx->len_set = 1;
  430. }
  431. if (ctx->encrypt)
  432. {
  433. if (CRYPTO_ccm128_encrypt_ccm64(ccm, in, out, len,
  434. aesni_ccm64_encrypt_blocks))
  435. return -1;
  436. cctx->tag_set = 1;
  437. return len;
  438. }
  439. else
  440. {
  441. int rv = -1;
  442. if (!CRYPTO_ccm128_decrypt_ccm64(ccm, in, out, len,
  443. aesni_ccm64_decrypt_blocks))
  444. {
  445. unsigned char tag[16];
  446. if (CRYPTO_ccm128_tag(ccm, tag, cctx->M))
  447. {
  448. if (!memcmp(tag, ctx->buf, cctx->M))
  449. rv = len;
  450. }
  451. }
  452. if (rv == -1)
  453. OPENSSL_cleanse(out, len);
  454. cctx->iv_set = 0;
  455. cctx->tag_set = 0;
  456. cctx->len_set = 0;
  457. return rv;
  458. }
  459. }
  460. #define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
  461. static const EVP_CIPHER aesni_##keylen##_##mode = { \
  462. nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
  463. flags|EVP_CIPH_##MODE##_MODE, \
  464. aesni_init_key, \
  465. aesni_##mode##_cipher, \
  466. NULL, \
  467. sizeof(EVP_AES_KEY), \
  468. NULL,NULL,NULL,NULL }; \
  469. static const EVP_CIPHER aes_##keylen##_##mode = { \
  470. nid##_##keylen##_##nmode,blocksize, \
  471. keylen/8,ivlen, \
  472. flags|EVP_CIPH_##MODE##_MODE, \
  473. aes_init_key, \
  474. aes_##mode##_cipher, \
  475. NULL, \
  476. sizeof(EVP_AES_KEY), \
  477. NULL,NULL,NULL,NULL }; \
  478. const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
  479. { return (OPENSSL_ia32cap_P[1]&AESNI_CAPABLE)? \
  480. &aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
  481. #define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
  482. static const EVP_CIPHER aesni_##keylen##_##mode = { \
  483. nid##_##keylen##_##mode,blocksize, \
  484. (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
  485. flags|EVP_CIPH_##MODE##_MODE, \
  486. aesni_##mode##_init_key, \
  487. aesni_##mode##_cipher, \
  488. aes_##mode##_cleanup, \
  489. sizeof(EVP_AES_##MODE##_CTX), \
  490. NULL,NULL,aes_##mode##_ctrl,NULL }; \
  491. static const EVP_CIPHER aes_##keylen##_##mode = { \
  492. nid##_##keylen##_##mode,blocksize, \
  493. (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
  494. flags|EVP_CIPH_##MODE##_MODE, \
  495. aes_##mode##_init_key, \
  496. aes_##mode##_cipher, \
  497. aes_##mode##_cleanup, \
  498. sizeof(EVP_AES_##MODE##_CTX), \
  499. NULL,NULL,aes_##mode##_ctrl,NULL }; \
  500. const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
  501. { return (OPENSSL_ia32cap_P[1]&AESNI_CAPABLE)? \
  502. &aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
  503. #else
  504. #define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
  505. static const EVP_CIPHER aes_##keylen##_##mode = { \
  506. nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
  507. flags|EVP_CIPH_##MODE##_MODE, \
  508. aes_init_key, \
  509. aes_##mode##_cipher, \
  510. NULL, \
  511. sizeof(EVP_AES_KEY), \
  512. NULL,NULL,NULL,NULL }; \
  513. const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
  514. { return &aes_##keylen##_##mode; }
  515. #define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
  516. static const EVP_CIPHER aes_##keylen##_##mode = { \
  517. nid##_##keylen##_##mode,blocksize, \
  518. (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
  519. flags|EVP_CIPH_##MODE##_MODE, \
  520. aes_##mode##_init_key, \
  521. aes_##mode##_cipher, \
  522. aes_##mode##_cleanup, \
  523. sizeof(EVP_AES_##MODE##_CTX), \
  524. NULL,NULL,aes_##mode##_ctrl,NULL }; \
  525. const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
  526. { return &aes_##keylen##_##mode; }
  527. #endif
  528. #define BLOCK_CIPHER_generic_pack(nid,keylen,flags) \
  529. BLOCK_CIPHER_generic(nid,keylen,16,16,cbc,cbc,CBC,flags|EVP_CIPH_FLAG_DEFAULT_ASN1) \
  530. BLOCK_CIPHER_generic(nid,keylen,16,0,ecb,ecb,ECB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1) \
  531. BLOCK_CIPHER_generic(nid,keylen,1,16,ofb128,ofb,OFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1) \
  532. BLOCK_CIPHER_generic(nid,keylen,1,16,cfb128,cfb,CFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1) \
  533. BLOCK_CIPHER_generic(nid,keylen,1,16,cfb1,cfb1,CFB,flags) \
  534. BLOCK_CIPHER_generic(nid,keylen,1,16,cfb8,cfb8,CFB,flags) \
  535. BLOCK_CIPHER_generic(nid,keylen,1,16,ctr,ctr,CTR,flags)
  536. static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
  537. const unsigned char *iv, int enc)
  538. {
  539. int ret;
  540. if (((ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_ECB_MODE
  541. || (ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_CBC_MODE)
  542. && !enc)
  543. ret = AES_set_decrypt_key(key, ctx->key_len * 8, ctx->cipher_data);
  544. else
  545. ret = AES_set_encrypt_key(key, ctx->key_len * 8, ctx->cipher_data);
  546. if(ret < 0)
  547. {
  548. EVPerr(EVP_F_AES_INIT_KEY,EVP_R_AES_KEY_SETUP_FAILED);
  549. return 0;
  550. }
  551. return 1;
  552. }
  553. static int aes_cbc_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  554. const unsigned char *in, size_t len)
  555. {
  556. AES_cbc_encrypt(in,out,len,ctx->cipher_data,ctx->iv,ctx->encrypt);
  557. return 1;
  558. }
  559. static int aes_ecb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  560. const unsigned char *in, size_t len)
  561. {
  562. size_t bl = ctx->cipher->block_size;
  563. size_t i;
  564. if (len<bl) return 1;
  565. if (ctx->encrypt) {
  566. for (i=0,len-=bl;i<=len;i+=bl)
  567. AES_encrypt(in+i,out+i,ctx->cipher_data);
  568. } else {
  569. for (i=0,len-=bl;i<=len;i+=bl)
  570. AES_decrypt(in+i,out+i,ctx->cipher_data);
  571. }
  572. return 1;
  573. }
  574. static int aes_ofb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  575. const unsigned char *in,size_t len)
  576. {
  577. CRYPTO_ofb128_encrypt(in,out,len,ctx->cipher_data,
  578. ctx->iv,&ctx->num,
  579. (block128_f)AES_encrypt);
  580. return 1;
  581. }
  582. static int aes_cfb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  583. const unsigned char *in,size_t len)
  584. {
  585. CRYPTO_cfb128_encrypt(in,out,len,ctx->cipher_data,
  586. ctx->iv,&ctx->num,ctx->encrypt,
  587. (block128_f)AES_encrypt);
  588. return 1;
  589. }
  590. static int aes_cfb8_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  591. const unsigned char *in,size_t len)
  592. {
  593. CRYPTO_cfb128_8_encrypt(in,out,len,ctx->cipher_data,
  594. ctx->iv,&ctx->num,ctx->encrypt,
  595. (block128_f)AES_encrypt);
  596. return 1;
  597. }
  598. static int aes_cfb1_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
  599. const unsigned char *in,size_t len)
  600. {
  601. if (ctx->flags&EVP_CIPH_FLAG_LENGTH_BITS) {
  602. CRYPTO_cfb128_1_encrypt(in,out,len,ctx->cipher_data,
  603. ctx->iv,&ctx->num,ctx->encrypt,
  604. (block128_f)AES_encrypt);
  605. return 1;
  606. }
  607. while (len>=MAXBITCHUNK) {
  608. CRYPTO_cfb128_1_encrypt(in,out,MAXBITCHUNK*8,ctx->cipher_data,
  609. ctx->iv,&ctx->num,ctx->encrypt,
  610. (block128_f)AES_encrypt);
  611. len-=MAXBITCHUNK;
  612. }
  613. if (len)
  614. CRYPTO_cfb128_1_encrypt(in,out,len*8,ctx->cipher_data,
  615. ctx->iv,&ctx->num,ctx->encrypt,
  616. (block128_f)AES_encrypt);
  617. return 1;
  618. }
  619. static int aes_ctr_cipher (EVP_CIPHER_CTX *ctx, unsigned char *out,
  620. const unsigned char *in, size_t len)
  621. {
  622. unsigned int num;
  623. num = ctx->num;
  624. #ifdef AES_CTR_ASM
  625. void AES_ctr32_encrypt(const unsigned char *in, unsigned char *out,
  626. size_t blocks, const AES_KEY *key,
  627. const unsigned char ivec[AES_BLOCK_SIZE]);
  628. CRYPTO_ctr128_encrypt_ctr32(in,out,len,
  629. &((EVP_AES_KEY *)ctx->cipher_data)->ks,
  630. ctx->iv,ctx->buf,&num,(ctr128_f)AES_ctr32_encrypt);
  631. #else
  632. CRYPTO_ctr128_encrypt(in,out,len,
  633. &((EVP_AES_KEY *)ctx->cipher_data)->ks,
  634. ctx->iv,ctx->buf,&num,(block128_f)AES_encrypt);
  635. #endif
  636. ctx->num = (size_t)num;
  637. return 1;
  638. }
  639. BLOCK_CIPHER_generic_pack(NID_aes,128,EVP_CIPH_FLAG_FIPS)
  640. BLOCK_CIPHER_generic_pack(NID_aes,192,EVP_CIPH_FLAG_FIPS)
  641. BLOCK_CIPHER_generic_pack(NID_aes,256,EVP_CIPH_FLAG_FIPS)
  642. static int aes_gcm_cleanup(EVP_CIPHER_CTX *c)
  643. {
  644. EVP_AES_GCM_CTX *gctx = c->cipher_data;
  645. OPENSSL_cleanse(&gctx->gcm, sizeof(gctx->gcm));
  646. if (gctx->iv != c->iv)
  647. OPENSSL_free(gctx->iv);
  648. return 1;
  649. }
  650. /* increment counter (64-bit int) by 1 */
  651. static void ctr64_inc(unsigned char *counter) {
  652. int n=8;
  653. unsigned char c;
  654. do {
  655. --n;
  656. c = counter[n];
  657. ++c;
  658. counter[n] = c;
  659. if (c) return;
  660. } while (n);
  661. }
  662. static int aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
  663. {
  664. EVP_AES_GCM_CTX *gctx = c->cipher_data;
  665. switch (type)
  666. {
  667. case EVP_CTRL_INIT:
  668. gctx->key_set = 0;
  669. gctx->iv_set = 0;
  670. gctx->ivlen = c->cipher->iv_len;
  671. gctx->iv = c->iv;
  672. gctx->taglen = -1;
  673. gctx->iv_gen = 0;
  674. gctx->tls_aad_len = -1;
  675. return 1;
  676. case EVP_CTRL_GCM_SET_IVLEN:
  677. if (arg <= 0)
  678. return 0;
  679. #ifdef OPENSSL_FIPS
  680. if (FIPS_module_mode() && !(c->flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW)
  681. && arg < 12)
  682. return 0;
  683. #endif
  684. /* Allocate memory for IV if needed */
  685. if ((arg > EVP_MAX_IV_LENGTH) && (arg > gctx->ivlen))
  686. {
  687. if (gctx->iv != c->iv)
  688. OPENSSL_free(gctx->iv);
  689. gctx->iv = OPENSSL_malloc(arg);
  690. if (!gctx->iv)
  691. return 0;
  692. }
  693. gctx->ivlen = arg;
  694. return 1;
  695. case EVP_CTRL_GCM_SET_TAG:
  696. if (arg <= 0 || arg > 16 || c->encrypt)
  697. return 0;
  698. memcpy(c->buf, ptr, arg);
  699. gctx->taglen = arg;
  700. return 1;
  701. case EVP_CTRL_GCM_GET_TAG:
  702. if (arg <= 0 || arg > 16 || !c->encrypt || gctx->taglen < 0)
  703. return 0;
  704. memcpy(ptr, c->buf, arg);
  705. return 1;
  706. case EVP_CTRL_GCM_SET_IV_FIXED:
  707. /* Special case: -1 length restores whole IV */
  708. if (arg == -1)
  709. {
  710. memcpy(gctx->iv, ptr, gctx->ivlen);
  711. gctx->iv_gen = 1;
  712. return 1;
  713. }
  714. /* Fixed field must be at least 4 bytes and invocation field
  715. * at least 8.
  716. */
  717. if ((arg < 4) || (gctx->ivlen - arg) < 8)
  718. return 0;
  719. if (arg)
  720. memcpy(gctx->iv, ptr, arg);
  721. if (c->encrypt &&
  722. RAND_bytes(gctx->iv + arg, gctx->ivlen - arg) <= 0)
  723. return 0;
  724. gctx->iv_gen = 1;
  725. return 1;
  726. case EVP_CTRL_GCM_IV_GEN:
  727. if (gctx->iv_gen == 0 || gctx->key_set == 0)
  728. return 0;
  729. CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
  730. if (arg <= 0 || arg > gctx->ivlen)
  731. arg = gctx->ivlen;
  732. memcpy(ptr, gctx->iv + gctx->ivlen - arg, arg);
  733. /* Invocation field will be at least 8 bytes in size and
  734. * so no need to check wrap around or increment more than
  735. * last 8 bytes.
  736. */
  737. ctr64_inc(gctx->iv + gctx->ivlen - 8);
  738. gctx->iv_set = 1;
  739. return 1;
  740. case EVP_CTRL_GCM_SET_IV_INV:
  741. if (gctx->iv_gen == 0 || gctx->key_set == 0 || c->encrypt)
  742. return 0;
  743. memcpy(gctx->iv + gctx->ivlen - arg, ptr, arg);
  744. CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
  745. gctx->iv_set = 1;
  746. return 1;
  747. case EVP_CTRL_AEAD_TLS1_AAD:
  748. /* Save the AAD for later use */
  749. if (arg != 13)
  750. return 0;
  751. memcpy(c->buf, ptr, arg);
  752. gctx->tls_aad_len = arg;
  753. {
  754. unsigned int len=c->buf[arg-2]<<8|c->buf[arg-1];
  755. /* Correct length for explicit IV */
  756. len -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
  757. /* If decrypting correct for tag too */
  758. if (!c->encrypt)
  759. len -= EVP_GCM_TLS_TAG_LEN;
  760. c->buf[arg-2] = len>>8;
  761. c->buf[arg-1] = len & 0xff;
  762. }
  763. /* Extra padding: tag appended to record */
  764. return EVP_GCM_TLS_TAG_LEN;
  765. default:
  766. return -1;
  767. }
  768. }
  769. static int aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
  770. const unsigned char *iv, int enc)
  771. {
  772. EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
  773. if (!iv && !key)
  774. return 1;
  775. if (key)
  776. {
  777. AES_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks);
  778. CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks, (block128_f)AES_encrypt);
  779. /* If we have an iv can set it directly, otherwise use
  780. * saved IV.
  781. */
  782. if (iv == NULL && gctx->iv_set)
  783. iv = gctx->iv;
  784. if (iv)
  785. {
  786. CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
  787. gctx->iv_set = 1;
  788. }
  789. gctx->key_set = 1;
  790. }
  791. else
  792. {
  793. /* If key set use IV, otherwise copy */
  794. if (gctx->key_set)
  795. CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
  796. else
  797. memcpy(gctx->iv, iv, gctx->ivlen);
  798. gctx->iv_set = 1;
  799. gctx->iv_gen = 0;
  800. }
  801. return 1;
  802. }
  803. /* Handle TLS GCM packet format. This consists of the last portion of the IV
  804. * followed by the payload and finally the tag. On encrypt generate IV,
  805. * encrypt payload and write the tag. On verify retrieve IV, decrypt payload
  806. * and verify tag.
  807. */
  808. static int aes_gcm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
  809. const unsigned char *in, size_t len)
  810. {
  811. EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
  812. int rv = -1;
  813. /* Encrypt/decrypt must be performed in place */
  814. if (out != in)
  815. return -1;
  816. /* Set IV from start of buffer or generate IV and write to start
  817. * of buffer.
  818. */
  819. if (EVP_CIPHER_CTX_ctrl(ctx, ctx->encrypt ?
  820. EVP_CTRL_GCM_IV_GEN : EVP_CTRL_GCM_SET_IV_INV,
  821. EVP_GCM_TLS_EXPLICIT_IV_LEN, out) <= 0)
  822. goto err;
  823. /* Use saved AAD */
  824. if (CRYPTO_gcm128_aad(&gctx->gcm, ctx->buf, gctx->tls_aad_len))
  825. goto err;
  826. /* Fix buffer and length to point to payload */
  827. in += EVP_GCM_TLS_EXPLICIT_IV_LEN;
  828. out += EVP_GCM_TLS_EXPLICIT_IV_LEN;
  829. len -= EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
  830. if (ctx->encrypt)
  831. {
  832. /* Encrypt payload */
  833. if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, len))
  834. goto err;
  835. out += len;
  836. /* Finally write tag */
  837. CRYPTO_gcm128_tag(&gctx->gcm, out, EVP_GCM_TLS_TAG_LEN);
  838. rv = len + EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
  839. }
  840. else
  841. {
  842. /* Decrypt */
  843. if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, len))
  844. goto err;
  845. /* Retrieve tag */
  846. CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf,
  847. EVP_GCM_TLS_TAG_LEN);
  848. /* If tag mismatch wipe buffer */
  849. if (memcmp(ctx->buf, in + len, EVP_GCM_TLS_TAG_LEN))
  850. {
  851. OPENSSL_cleanse(out, len);
  852. goto err;
  853. }
  854. rv = len;
  855. }
  856. err:
  857. gctx->iv_set = 0;
  858. gctx->tls_aad_len = -1;
  859. return rv;
  860. }
  861. static int aes_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
  862. const unsigned char *in, size_t len)
  863. {
  864. EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
  865. /* If not set up, return error */
  866. if (!gctx->key_set)
  867. return -1;
  868. if (gctx->tls_aad_len >= 0)
  869. return aes_gcm_tls_cipher(ctx, out, in, len);
  870. if (!gctx->iv_set)
  871. return -1;
  872. if (!ctx->encrypt && gctx->taglen < 0)
  873. return -1;
  874. if (in)
  875. {
  876. if (out == NULL)
  877. {
  878. if (CRYPTO_gcm128_aad(&gctx->gcm, in, len))
  879. return -1;
  880. }
  881. else if (ctx->encrypt)
  882. {
  883. if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, len))
  884. return -1;
  885. }
  886. else
  887. {
  888. if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, len))
  889. return -1;
  890. }
  891. return len;
  892. }
  893. else
  894. {
  895. if (!ctx->encrypt)
  896. {
  897. if (CRYPTO_gcm128_finish(&gctx->gcm,
  898. ctx->buf, gctx->taglen) != 0)
  899. return -1;
  900. gctx->iv_set = 0;
  901. return 0;
  902. }
  903. CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16);
  904. gctx->taglen = 16;
  905. /* Don't reuse the IV */
  906. gctx->iv_set = 0;
  907. return 0;
  908. }
  909. }
  910. #define CUSTOM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \
  911. | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
  912. | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT)
  913. BLOCK_CIPHER_custom(NID_aes,128,1,12,gcm,GCM,
  914. EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS)
  915. BLOCK_CIPHER_custom(NID_aes,192,1,12,gcm,GCM,
  916. EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS)
  917. BLOCK_CIPHER_custom(NID_aes,256,1,12,gcm,GCM,
  918. EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS)
  919. static int aes_xts_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
  920. {
  921. EVP_AES_XTS_CTX *xctx = c->cipher_data;
  922. if (type != EVP_CTRL_INIT)
  923. return -1;
  924. /* key1 and key2 are used as an indicator both key and IV are set */
  925. xctx->xts.key1 = NULL;
  926. xctx->xts.key2 = NULL;
  927. return 1;
  928. }
  929. static int aes_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
  930. const unsigned char *iv, int enc)
  931. {
  932. EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
  933. if (!iv && !key)
  934. return 1;
  935. if (key)
  936. {
  937. /* key_len is two AES keys */
  938. if (enc)
  939. {
  940. AES_set_encrypt_key(key, ctx->key_len * 4, &xctx->ks1);
  941. xctx->xts.block1 = (block128_f)AES_encrypt;
  942. }
  943. else
  944. {
  945. AES_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1);
  946. xctx->xts.block1 = (block128_f)AES_decrypt;
  947. }
  948. AES_set_encrypt_key(key + ctx->key_len/2,
  949. ctx->key_len * 4, &xctx->ks2);
  950. xctx->xts.block2 = (block128_f)AES_encrypt;
  951. xctx->xts.key1 = &xctx->ks1;
  952. }
  953. if (iv)
  954. {
  955. xctx->xts.key2 = &xctx->ks2;
  956. memcpy(ctx->iv, iv, 16);
  957. }
  958. return 1;
  959. }
  960. static int aes_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
  961. const unsigned char *in, size_t len)
  962. {
  963. EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
  964. if (!xctx->xts.key1 || !xctx->xts.key2)
  965. return -1;
  966. if (!out || !in)
  967. return -1;
  968. #ifdef OPENSSL_FIPS
  969. /* Requirement of SP800-38E */
  970. if (FIPS_module_mode() && !(ctx->flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW) &&
  971. (len > (1L<<20)*16))
  972. {
  973. EVPerr(EVP_F_AES_XTS, EVP_R_TOO_LARGE);
  974. return -1;
  975. }
  976. #endif
  977. if (CRYPTO_xts128_encrypt(&xctx->xts, ctx->iv, in, out, len,
  978. ctx->encrypt))
  979. return -1;
  980. return len;
  981. }
  982. #define aes_xts_cleanup NULL
  983. BLOCK_CIPHER_custom(NID_aes,128,1,16,xts,XTS,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
  984. BLOCK_CIPHER_custom(NID_aes,256,1,16,xts,XTS,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
  985. static int aes_ccm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
  986. {
  987. EVP_AES_CCM_CTX *cctx = c->cipher_data;
  988. switch (type)
  989. {
  990. case EVP_CTRL_INIT:
  991. cctx->key_set = 0;
  992. cctx->iv_set = 0;
  993. cctx->L = 8;
  994. cctx->M = 12;
  995. cctx->tag_set = 0;
  996. cctx->len_set = 0;
  997. return 1;
  998. case EVP_CTRL_CCM_SET_IVLEN:
  999. arg = 15 - arg;
  1000. case EVP_CTRL_CCM_SET_L:
  1001. if (arg < 2 || arg > 8)
  1002. return 0;
  1003. cctx->L = arg;
  1004. return 1;
  1005. case EVP_CTRL_CCM_SET_TAG:
  1006. if ((arg & 1) || arg < 4 || arg > 16)
  1007. return 0;
  1008. if ((c->encrypt && ptr) || (!c->encrypt && !ptr))
  1009. return 0;
  1010. if (ptr)
  1011. {
  1012. cctx->tag_set = 1;
  1013. memcpy(c->buf, ptr, arg);
  1014. }
  1015. cctx->M = arg;
  1016. return 1;
  1017. case EVP_CTRL_CCM_GET_TAG:
  1018. if (!c->encrypt || !cctx->tag_set)
  1019. return 0;
  1020. if(!CRYPTO_ccm128_tag(&cctx->ccm, ptr, (size_t)arg))
  1021. return 0;
  1022. cctx->tag_set = 0;
  1023. cctx->iv_set = 0;
  1024. cctx->len_set = 0;
  1025. return 1;
  1026. default:
  1027. return -1;
  1028. }
  1029. }
  1030. static int aes_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
  1031. const unsigned char *iv, int enc)
  1032. {
  1033. EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
  1034. if (!iv && !key)
  1035. return 1;
  1036. if (key)
  1037. {
  1038. AES_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks);
  1039. CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
  1040. &cctx->ks, (block128_f)AES_encrypt);
  1041. cctx->key_set = 1;
  1042. }
  1043. if (iv)
  1044. {
  1045. memcpy(ctx->iv, iv, 15 - cctx->L);
  1046. cctx->iv_set = 1;
  1047. }
  1048. return 1;
  1049. }
  1050. static int aes_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
  1051. const unsigned char *in, size_t len)
  1052. {
  1053. EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
  1054. CCM128_CONTEXT *ccm = &cctx->ccm;
  1055. /* If not set up, return error */
  1056. if (!cctx->iv_set && !cctx->key_set)
  1057. return -1;
  1058. if (!ctx->encrypt && !cctx->tag_set)
  1059. return -1;
  1060. if (!out)
  1061. {
  1062. if (!in)
  1063. {
  1064. if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L,len))
  1065. return -1;
  1066. cctx->len_set = 1;
  1067. return len;
  1068. }
  1069. /* If have AAD need message length */
  1070. if (!cctx->len_set && len)
  1071. return -1;
  1072. CRYPTO_ccm128_aad(ccm, in, len);
  1073. return len;
  1074. }
  1075. /* EVP_*Final() doesn't return any data */
  1076. if (!in)
  1077. return 0;
  1078. /* If not set length yet do it */
  1079. if (!cctx->len_set)
  1080. {
  1081. if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L, len))
  1082. return -1;
  1083. cctx->len_set = 1;
  1084. }
  1085. if (ctx->encrypt)
  1086. {
  1087. if (CRYPTO_ccm128_encrypt(ccm, in, out, len))
  1088. return -1;
  1089. cctx->tag_set = 1;
  1090. return len;
  1091. }
  1092. else
  1093. {
  1094. int rv = -1;
  1095. if (!CRYPTO_ccm128_decrypt(ccm, in, out, len))
  1096. {
  1097. unsigned char tag[16];
  1098. if (CRYPTO_ccm128_tag(ccm, tag, cctx->M))
  1099. {
  1100. if (!memcmp(tag, ctx->buf, cctx->M))
  1101. rv = len;
  1102. }
  1103. }
  1104. if (rv == -1)
  1105. OPENSSL_cleanse(out, len);
  1106. cctx->iv_set = 0;
  1107. cctx->tag_set = 0;
  1108. cctx->len_set = 0;
  1109. return rv;
  1110. }
  1111. }
  1112. #define aes_ccm_cleanup NULL
  1113. BLOCK_CIPHER_custom(NID_aes,128,1,12,ccm,CCM,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
  1114. BLOCK_CIPHER_custom(NID_aes,192,1,12,ccm,CCM,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
  1115. BLOCK_CIPHER_custom(NID_aes,256,1,12,ccm,CCM,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
  1116. #endif