You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

461 lines
15 KiB

  1. /* Copyright (c) 2014, Google Inc.
  2. *
  3. * Permission to use, copy, modify, and/or distribute this software for any
  4. * purpose with or without fee is hereby granted, provided that the above
  5. * copyright notice and this permission notice appear in all copies.
  6. *
  7. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  10. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  12. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  13. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
  14. #include <assert.h>
  15. #include <limits.h>
  16. #include <string.h>
  17. #include <openssl/aead.h>
  18. #include <openssl/cipher.h>
  19. #include <openssl/err.h>
  20. #include <openssl/hmac.h>
  21. #include <openssl/md5.h>
  22. #include <openssl/mem.h>
  23. #include <openssl/sha.h>
  24. #include "internal.h"
  25. #include "../internal.h"
  26. #include "../fipsmodule/cipher/internal.h"
  27. typedef struct {
  28. EVP_CIPHER_CTX cipher_ctx;
  29. EVP_MD_CTX md_ctx;
  30. } AEAD_SSL3_CTX;
  31. static int ssl3_mac(AEAD_SSL3_CTX *ssl3_ctx, uint8_t *out, unsigned *out_len,
  32. const uint8_t *ad, size_t ad_len, const uint8_t *in,
  33. size_t in_len) {
  34. size_t md_size = EVP_MD_CTX_size(&ssl3_ctx->md_ctx);
  35. size_t pad_len = (md_size == 20) ? 40 : 48;
  36. // To allow for CBC mode which changes cipher length, |ad| doesn't include the
  37. // length for legacy ciphers.
  38. uint8_t ad_extra[2];
  39. ad_extra[0] = (uint8_t)(in_len >> 8);
  40. ad_extra[1] = (uint8_t)(in_len & 0xff);
  41. EVP_MD_CTX md_ctx;
  42. EVP_MD_CTX_init(&md_ctx);
  43. uint8_t pad[48];
  44. uint8_t tmp[EVP_MAX_MD_SIZE];
  45. OPENSSL_memset(pad, 0x36, pad_len);
  46. if (!EVP_MD_CTX_copy_ex(&md_ctx, &ssl3_ctx->md_ctx) ||
  47. !EVP_DigestUpdate(&md_ctx, pad, pad_len) ||
  48. !EVP_DigestUpdate(&md_ctx, ad, ad_len) ||
  49. !EVP_DigestUpdate(&md_ctx, ad_extra, sizeof(ad_extra)) ||
  50. !EVP_DigestUpdate(&md_ctx, in, in_len) ||
  51. !EVP_DigestFinal_ex(&md_ctx, tmp, NULL)) {
  52. EVP_MD_CTX_cleanup(&md_ctx);
  53. return 0;
  54. }
  55. OPENSSL_memset(pad, 0x5c, pad_len);
  56. if (!EVP_MD_CTX_copy_ex(&md_ctx, &ssl3_ctx->md_ctx) ||
  57. !EVP_DigestUpdate(&md_ctx, pad, pad_len) ||
  58. !EVP_DigestUpdate(&md_ctx, tmp, md_size) ||
  59. !EVP_DigestFinal_ex(&md_ctx, out, out_len)) {
  60. EVP_MD_CTX_cleanup(&md_ctx);
  61. return 0;
  62. }
  63. EVP_MD_CTX_cleanup(&md_ctx);
  64. return 1;
  65. }
  66. static void aead_ssl3_cleanup(EVP_AEAD_CTX *ctx) {
  67. AEAD_SSL3_CTX *ssl3_ctx = (AEAD_SSL3_CTX *)ctx->aead_state;
  68. EVP_CIPHER_CTX_cleanup(&ssl3_ctx->cipher_ctx);
  69. EVP_MD_CTX_cleanup(&ssl3_ctx->md_ctx);
  70. OPENSSL_free(ssl3_ctx);
  71. ctx->aead_state = NULL;
  72. }
  73. static int aead_ssl3_init(EVP_AEAD_CTX *ctx, const uint8_t *key, size_t key_len,
  74. size_t tag_len, enum evp_aead_direction_t dir,
  75. const EVP_CIPHER *cipher, const EVP_MD *md) {
  76. if (tag_len != EVP_AEAD_DEFAULT_TAG_LENGTH &&
  77. tag_len != EVP_MD_size(md)) {
  78. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_UNSUPPORTED_TAG_SIZE);
  79. return 0;
  80. }
  81. if (key_len != EVP_AEAD_key_length(ctx->aead)) {
  82. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_KEY_LENGTH);
  83. return 0;
  84. }
  85. size_t mac_key_len = EVP_MD_size(md);
  86. size_t enc_key_len = EVP_CIPHER_key_length(cipher);
  87. assert(mac_key_len + enc_key_len + EVP_CIPHER_iv_length(cipher) == key_len);
  88. AEAD_SSL3_CTX *ssl3_ctx = OPENSSL_malloc(sizeof(AEAD_SSL3_CTX));
  89. if (ssl3_ctx == NULL) {
  90. OPENSSL_PUT_ERROR(CIPHER, ERR_R_MALLOC_FAILURE);
  91. return 0;
  92. }
  93. EVP_CIPHER_CTX_init(&ssl3_ctx->cipher_ctx);
  94. EVP_MD_CTX_init(&ssl3_ctx->md_ctx);
  95. ctx->aead_state = ssl3_ctx;
  96. if (!EVP_CipherInit_ex(&ssl3_ctx->cipher_ctx, cipher, NULL, &key[mac_key_len],
  97. &key[mac_key_len + enc_key_len],
  98. dir == evp_aead_seal) ||
  99. !EVP_DigestInit_ex(&ssl3_ctx->md_ctx, md, NULL) ||
  100. !EVP_DigestUpdate(&ssl3_ctx->md_ctx, key, mac_key_len)) {
  101. aead_ssl3_cleanup(ctx);
  102. ctx->aead_state = NULL;
  103. return 0;
  104. }
  105. EVP_CIPHER_CTX_set_padding(&ssl3_ctx->cipher_ctx, 0);
  106. return 1;
  107. }
  108. static size_t aead_ssl3_tag_len(const EVP_AEAD_CTX *ctx, const size_t in_len,
  109. const size_t extra_in_len) {
  110. assert(extra_in_len == 0);
  111. const AEAD_SSL3_CTX *ssl3_ctx = (AEAD_SSL3_CTX*)ctx->aead_state;
  112. const size_t digest_len = EVP_MD_CTX_size(&ssl3_ctx->md_ctx);
  113. if (EVP_CIPHER_CTX_mode(&ssl3_ctx->cipher_ctx) != EVP_CIPH_CBC_MODE) {
  114. // The NULL cipher.
  115. return digest_len;
  116. }
  117. const size_t block_size = EVP_CIPHER_CTX_block_size(&ssl3_ctx->cipher_ctx);
  118. // An overflow of |in_len + digest_len| doesn't affect the result mod
  119. // |block_size|, provided that |block_size| is a smaller power of two.
  120. assert(block_size != 0 && (block_size & (block_size - 1)) == 0);
  121. const size_t pad_len = block_size - ((in_len + digest_len) % block_size);
  122. return digest_len + pad_len;
  123. }
  124. static int aead_ssl3_seal_scatter(const EVP_AEAD_CTX *ctx, uint8_t *out,
  125. uint8_t *out_tag, size_t *out_tag_len,
  126. const size_t max_out_tag_len,
  127. const uint8_t *nonce, const size_t nonce_len,
  128. const uint8_t *in, const size_t in_len,
  129. const uint8_t *extra_in,
  130. const size_t extra_in_len, const uint8_t *ad,
  131. const size_t ad_len) {
  132. AEAD_SSL3_CTX *ssl3_ctx = (AEAD_SSL3_CTX *)ctx->aead_state;
  133. if (!ssl3_ctx->cipher_ctx.encrypt) {
  134. // Unlike a normal AEAD, an SSL3 AEAD may only be used in one direction.
  135. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_INVALID_OPERATION);
  136. return 0;
  137. }
  138. if (in_len > INT_MAX) {
  139. // EVP_CIPHER takes int as input.
  140. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TOO_LARGE);
  141. return 0;
  142. }
  143. if (max_out_tag_len < aead_ssl3_tag_len(ctx, in_len, extra_in_len)) {
  144. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BUFFER_TOO_SMALL);
  145. return 0;
  146. }
  147. if (nonce_len != 0) {
  148. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_IV_TOO_LARGE);
  149. return 0;
  150. }
  151. if (ad_len != 11 - 2 /* length bytes */) {
  152. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_INVALID_AD_SIZE);
  153. return 0;
  154. }
  155. // Compute the MAC. This must be first in case the operation is being done
  156. // in-place.
  157. uint8_t mac[EVP_MAX_MD_SIZE];
  158. unsigned mac_len;
  159. if (!ssl3_mac(ssl3_ctx, mac, &mac_len, ad, ad_len, in, in_len)) {
  160. return 0;
  161. }
  162. // Encrypt the input.
  163. int len;
  164. if (!EVP_EncryptUpdate(&ssl3_ctx->cipher_ctx, out, &len, in,
  165. (int)in_len)) {
  166. return 0;
  167. }
  168. const size_t block_size = EVP_CIPHER_CTX_block_size(&ssl3_ctx->cipher_ctx);
  169. // Feed the MAC into the cipher in two steps. First complete the final partial
  170. // block from encrypting the input and split the result between |out| and
  171. // |out_tag|. Then encrypt the remainder.
  172. size_t early_mac_len = (block_size - (in_len % block_size)) % block_size;
  173. if (early_mac_len != 0) {
  174. assert(len + block_size - early_mac_len == in_len);
  175. uint8_t buf[EVP_MAX_BLOCK_LENGTH];
  176. int buf_len;
  177. if (!EVP_EncryptUpdate(&ssl3_ctx->cipher_ctx, buf, &buf_len, mac,
  178. (int)early_mac_len)) {
  179. return 0;
  180. }
  181. assert(buf_len == (int)block_size);
  182. OPENSSL_memcpy(out + len, buf, block_size - early_mac_len);
  183. OPENSSL_memcpy(out_tag, buf + block_size - early_mac_len, early_mac_len);
  184. }
  185. size_t tag_len = early_mac_len;
  186. if (!EVP_EncryptUpdate(&ssl3_ctx->cipher_ctx, out_tag + tag_len, &len,
  187. mac + tag_len, mac_len - tag_len)) {
  188. return 0;
  189. }
  190. tag_len += len;
  191. if (block_size > 1) {
  192. assert(block_size <= 256);
  193. assert(EVP_CIPHER_CTX_mode(&ssl3_ctx->cipher_ctx) == EVP_CIPH_CBC_MODE);
  194. // Compute padding and feed that into the cipher.
  195. uint8_t padding[256];
  196. size_t padding_len = block_size - ((in_len + mac_len) % block_size);
  197. OPENSSL_memset(padding, 0, padding_len - 1);
  198. padding[padding_len - 1] = padding_len - 1;
  199. if (!EVP_EncryptUpdate(&ssl3_ctx->cipher_ctx, out_tag + tag_len, &len, padding,
  200. (int)padding_len)) {
  201. return 0;
  202. }
  203. tag_len += len;
  204. }
  205. if (!EVP_EncryptFinal_ex(&ssl3_ctx->cipher_ctx, out_tag + tag_len, &len)) {
  206. return 0;
  207. }
  208. tag_len += len;
  209. assert(tag_len == aead_ssl3_tag_len(ctx, in_len, extra_in_len));
  210. *out_tag_len = tag_len;
  211. return 1;
  212. }
  213. static int aead_ssl3_open(const EVP_AEAD_CTX *ctx, uint8_t *out,
  214. size_t *out_len, size_t max_out_len,
  215. const uint8_t *nonce, size_t nonce_len,
  216. const uint8_t *in, size_t in_len,
  217. const uint8_t *ad, size_t ad_len) {
  218. AEAD_SSL3_CTX *ssl3_ctx = (AEAD_SSL3_CTX *)ctx->aead_state;
  219. if (ssl3_ctx->cipher_ctx.encrypt) {
  220. // Unlike a normal AEAD, an SSL3 AEAD may only be used in one direction.
  221. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_INVALID_OPERATION);
  222. return 0;
  223. }
  224. size_t mac_len = EVP_MD_CTX_size(&ssl3_ctx->md_ctx);
  225. if (in_len < mac_len) {
  226. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
  227. return 0;
  228. }
  229. if (max_out_len < in_len) {
  230. // This requires that the caller provide space for the MAC, even though it
  231. // will always be removed on return.
  232. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BUFFER_TOO_SMALL);
  233. return 0;
  234. }
  235. if (nonce_len != 0) {
  236. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TOO_LARGE);
  237. return 0;
  238. }
  239. if (ad_len != 11 - 2 /* length bytes */) {
  240. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_INVALID_AD_SIZE);
  241. return 0;
  242. }
  243. if (in_len > INT_MAX) {
  244. // EVP_CIPHER takes int as input.
  245. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TOO_LARGE);
  246. return 0;
  247. }
  248. // Decrypt to get the plaintext + MAC + padding.
  249. size_t total = 0;
  250. int len;
  251. if (!EVP_DecryptUpdate(&ssl3_ctx->cipher_ctx, out, &len, in, (int)in_len)) {
  252. return 0;
  253. }
  254. total += len;
  255. if (!EVP_DecryptFinal_ex(&ssl3_ctx->cipher_ctx, out + total, &len)) {
  256. return 0;
  257. }
  258. total += len;
  259. assert(total == in_len);
  260. // Remove CBC padding and MAC. This would normally be timing-sensitive, but
  261. // SSLv3 CBC ciphers are already broken. Support will be removed eventually.
  262. // https://www.openssl.org/~bodo/ssl-poodle.pdf
  263. size_t data_len;
  264. if (EVP_CIPHER_CTX_mode(&ssl3_ctx->cipher_ctx) == EVP_CIPH_CBC_MODE) {
  265. unsigned padding_length = out[total - 1];
  266. if (total < padding_length + 1 + mac_len) {
  267. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
  268. return 0;
  269. }
  270. // The padding must be minimal.
  271. if (padding_length + 1 > EVP_CIPHER_CTX_block_size(&ssl3_ctx->cipher_ctx)) {
  272. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
  273. return 0;
  274. }
  275. data_len = total - padding_length - 1 - mac_len;
  276. } else {
  277. data_len = total - mac_len;
  278. }
  279. // Compute the MAC and compare against the one in the record.
  280. uint8_t mac[EVP_MAX_MD_SIZE];
  281. if (!ssl3_mac(ssl3_ctx, mac, NULL, ad, ad_len, out, data_len)) {
  282. return 0;
  283. }
  284. if (CRYPTO_memcmp(&out[data_len], mac, mac_len) != 0) {
  285. OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
  286. return 0;
  287. }
  288. *out_len = data_len;
  289. return 1;
  290. }
  291. static int aead_ssl3_get_iv(const EVP_AEAD_CTX *ctx, const uint8_t **out_iv,
  292. size_t *out_iv_len) {
  293. AEAD_SSL3_CTX *ssl3_ctx = (AEAD_SSL3_CTX *)ctx->aead_state;
  294. const size_t iv_len = EVP_CIPHER_CTX_iv_length(&ssl3_ctx->cipher_ctx);
  295. if (iv_len <= 1) {
  296. return 0;
  297. }
  298. *out_iv = ssl3_ctx->cipher_ctx.iv;
  299. *out_iv_len = iv_len;
  300. return 1;
  301. }
  302. static int aead_aes_128_cbc_sha1_ssl3_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
  303. size_t key_len, size_t tag_len,
  304. enum evp_aead_direction_t dir) {
  305. return aead_ssl3_init(ctx, key, key_len, tag_len, dir, EVP_aes_128_cbc(),
  306. EVP_sha1());
  307. }
  308. static int aead_aes_256_cbc_sha1_ssl3_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
  309. size_t key_len, size_t tag_len,
  310. enum evp_aead_direction_t dir) {
  311. return aead_ssl3_init(ctx, key, key_len, tag_len, dir, EVP_aes_256_cbc(),
  312. EVP_sha1());
  313. }
  314. static int aead_des_ede3_cbc_sha1_ssl3_init(EVP_AEAD_CTX *ctx,
  315. const uint8_t *key, size_t key_len,
  316. size_t tag_len,
  317. enum evp_aead_direction_t dir) {
  318. return aead_ssl3_init(ctx, key, key_len, tag_len, dir, EVP_des_ede3_cbc(),
  319. EVP_sha1());
  320. }
  321. static int aead_null_sha1_ssl3_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
  322. size_t key_len, size_t tag_len,
  323. enum evp_aead_direction_t dir) {
  324. return aead_ssl3_init(ctx, key, key_len, tag_len, dir, EVP_enc_null(),
  325. EVP_sha1());
  326. }
  327. static const EVP_AEAD aead_aes_128_cbc_sha1_ssl3 = {
  328. SHA_DIGEST_LENGTH + 16 + 16, // key len (SHA1 + AES128 + IV)
  329. 0, // nonce len
  330. 16 + SHA_DIGEST_LENGTH, // overhead (padding + SHA1)
  331. SHA_DIGEST_LENGTH, // max tag length
  332. 0, // seal_scatter_supports_extra_in
  333. NULL, // init
  334. aead_aes_128_cbc_sha1_ssl3_init,
  335. aead_ssl3_cleanup,
  336. aead_ssl3_open,
  337. aead_ssl3_seal_scatter,
  338. NULL, // open_gather
  339. aead_ssl3_get_iv,
  340. aead_ssl3_tag_len,
  341. };
  342. static const EVP_AEAD aead_aes_256_cbc_sha1_ssl3 = {
  343. SHA_DIGEST_LENGTH + 32 + 16, // key len (SHA1 + AES256 + IV)
  344. 0, // nonce len
  345. 16 + SHA_DIGEST_LENGTH, // overhead (padding + SHA1)
  346. SHA_DIGEST_LENGTH, // max tag length
  347. 0, // seal_scatter_supports_extra_in
  348. NULL, // init
  349. aead_aes_256_cbc_sha1_ssl3_init,
  350. aead_ssl3_cleanup,
  351. aead_ssl3_open,
  352. aead_ssl3_seal_scatter,
  353. NULL, // open_gather
  354. aead_ssl3_get_iv,
  355. aead_ssl3_tag_len,
  356. };
  357. static const EVP_AEAD aead_des_ede3_cbc_sha1_ssl3 = {
  358. SHA_DIGEST_LENGTH + 24 + 8, // key len (SHA1 + 3DES + IV)
  359. 0, // nonce len
  360. 8 + SHA_DIGEST_LENGTH, // overhead (padding + SHA1)
  361. SHA_DIGEST_LENGTH, // max tag length
  362. 0, // seal_scatter_supports_extra_in
  363. NULL, // init
  364. aead_des_ede3_cbc_sha1_ssl3_init,
  365. aead_ssl3_cleanup,
  366. aead_ssl3_open,
  367. aead_ssl3_seal_scatter,
  368. NULL, // open_gather
  369. aead_ssl3_get_iv,
  370. aead_ssl3_tag_len,
  371. };
  372. static const EVP_AEAD aead_null_sha1_ssl3 = {
  373. SHA_DIGEST_LENGTH, // key len
  374. 0, // nonce len
  375. SHA_DIGEST_LENGTH, // overhead (SHA1)
  376. SHA_DIGEST_LENGTH, // max tag length
  377. 0, // seal_scatter_supports_extra_in
  378. NULL, // init
  379. aead_null_sha1_ssl3_init,
  380. aead_ssl3_cleanup,
  381. aead_ssl3_open,
  382. aead_ssl3_seal_scatter,
  383. NULL, // open_gather
  384. NULL, // get_iv
  385. aead_ssl3_tag_len,
  386. };
  387. const EVP_AEAD *EVP_aead_aes_128_cbc_sha1_ssl3(void) {
  388. return &aead_aes_128_cbc_sha1_ssl3;
  389. }
  390. const EVP_AEAD *EVP_aead_aes_256_cbc_sha1_ssl3(void) {
  391. return &aead_aes_256_cbc_sha1_ssl3;
  392. }
  393. const EVP_AEAD *EVP_aead_des_ede3_cbc_sha1_ssl3(void) {
  394. return &aead_des_ede3_cbc_sha1_ssl3;
  395. }
  396. const EVP_AEAD *EVP_aead_null_sha1_ssl3(void) { return &aead_null_sha1_ssl3; }