25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

242 lines
7.3 KiB

  1. /* ====================================================================
  2. * Copyright (c) 2010 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. * licensing@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. #include <openssl/cmac.h>
  49. #include <assert.h>
  50. #include <string.h>
  51. #include <openssl/aes.h>
  52. #include <openssl/cipher.h>
  53. #include <openssl/mem.h>
  54. #include "../internal.h"
  55. struct cmac_ctx_st {
  56. EVP_CIPHER_CTX cipher_ctx;
  57. // k1 and k2 are the CMAC subkeys. See
  58. // https://tools.ietf.org/html/rfc4493#section-2.3
  59. uint8_t k1[AES_BLOCK_SIZE];
  60. uint8_t k2[AES_BLOCK_SIZE];
  61. // Last (possibly partial) scratch
  62. uint8_t block[AES_BLOCK_SIZE];
  63. // block_used contains the number of valid bytes in |block|.
  64. unsigned block_used;
  65. };
  66. static void CMAC_CTX_init(CMAC_CTX *ctx) {
  67. EVP_CIPHER_CTX_init(&ctx->cipher_ctx);
  68. }
  69. static void CMAC_CTX_cleanup(CMAC_CTX *ctx) {
  70. EVP_CIPHER_CTX_cleanup(&ctx->cipher_ctx);
  71. OPENSSL_cleanse(ctx->k1, sizeof(ctx->k1));
  72. OPENSSL_cleanse(ctx->k2, sizeof(ctx->k2));
  73. OPENSSL_cleanse(ctx->block, sizeof(ctx->block));
  74. }
  75. int AES_CMAC(uint8_t out[16], const uint8_t *key, size_t key_len,
  76. const uint8_t *in, size_t in_len) {
  77. const EVP_CIPHER *cipher;
  78. switch (key_len) {
  79. case 16:
  80. cipher = EVP_aes_128_cbc();
  81. break;
  82. case 32:
  83. cipher = EVP_aes_256_cbc();
  84. break;
  85. default:
  86. return 0;
  87. }
  88. size_t scratch_out_len;
  89. CMAC_CTX ctx;
  90. CMAC_CTX_init(&ctx);
  91. const int ok = CMAC_Init(&ctx, key, key_len, cipher, NULL /* engine */) &&
  92. CMAC_Update(&ctx, in, in_len) &&
  93. CMAC_Final(&ctx, out, &scratch_out_len);
  94. CMAC_CTX_cleanup(&ctx);
  95. return ok;
  96. }
  97. CMAC_CTX *CMAC_CTX_new(void) {
  98. CMAC_CTX *ctx = OPENSSL_malloc(sizeof(*ctx));
  99. if (ctx != NULL) {
  100. CMAC_CTX_init(ctx);
  101. }
  102. return ctx;
  103. }
  104. void CMAC_CTX_free(CMAC_CTX *ctx) {
  105. if (ctx == NULL) {
  106. return;
  107. }
  108. CMAC_CTX_cleanup(ctx);
  109. OPENSSL_free(ctx);
  110. }
  111. // binary_field_mul_x treats the 128 bits at |in| as an element of GF(2¹²⁸)
  112. // with a hard-coded reduction polynomial and sets |out| as x times the
  113. // input.
  114. //
  115. // See https://tools.ietf.org/html/rfc4493#section-2.3
  116. static void binary_field_mul_x(uint8_t out[16], const uint8_t in[16]) {
  117. unsigned i;
  118. // Shift |in| to left, including carry.
  119. for (i = 0; i < 15; i++) {
  120. out[i] = (in[i] << 1) | (in[i+1] >> 7);
  121. }
  122. // If MSB set fixup with R.
  123. const uint8_t carry = in[0] >> 7;
  124. out[i] = (in[i] << 1) ^ ((0 - carry) & 0x87);
  125. }
  126. static const uint8_t kZeroIV[AES_BLOCK_SIZE] = {0};
  127. int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t key_len,
  128. const EVP_CIPHER *cipher, ENGINE *engine) {
  129. uint8_t scratch[AES_BLOCK_SIZE];
  130. if (EVP_CIPHER_block_size(cipher) != AES_BLOCK_SIZE ||
  131. EVP_CIPHER_key_length(cipher) != key_len ||
  132. !EVP_EncryptInit_ex(&ctx->cipher_ctx, cipher, NULL, key, kZeroIV) ||
  133. !EVP_Cipher(&ctx->cipher_ctx, scratch, kZeroIV, AES_BLOCK_SIZE) ||
  134. // Reset context again ready for first data.
  135. !EVP_EncryptInit_ex(&ctx->cipher_ctx, NULL, NULL, NULL, kZeroIV)) {
  136. return 0;
  137. }
  138. binary_field_mul_x(ctx->k1, scratch);
  139. binary_field_mul_x(ctx->k2, ctx->k1);
  140. ctx->block_used = 0;
  141. return 1;
  142. }
  143. int CMAC_Reset(CMAC_CTX *ctx) {
  144. ctx->block_used = 0;
  145. return EVP_EncryptInit_ex(&ctx->cipher_ctx, NULL, NULL, NULL, kZeroIV);
  146. }
  147. int CMAC_Update(CMAC_CTX *ctx, const uint8_t *in, size_t in_len) {
  148. uint8_t scratch[AES_BLOCK_SIZE];
  149. if (ctx->block_used > 0) {
  150. size_t todo = AES_BLOCK_SIZE - ctx->block_used;
  151. if (in_len < todo) {
  152. todo = in_len;
  153. }
  154. OPENSSL_memcpy(ctx->block + ctx->block_used, in, todo);
  155. in += todo;
  156. in_len -= todo;
  157. ctx->block_used += todo;
  158. // If |in_len| is zero then either |ctx->block_used| is less than
  159. // |AES_BLOCK_SIZE|, in which case we can stop here, or |ctx->block_used|
  160. // is exactly |AES_BLOCK_SIZE| but there's no more data to process. In the
  161. // latter case we don't want to process this block now because it might be
  162. // the last block and that block is treated specially.
  163. if (in_len == 0) {
  164. return 1;
  165. }
  166. assert(ctx->block_used == AES_BLOCK_SIZE);
  167. if (!EVP_Cipher(&ctx->cipher_ctx, scratch, ctx->block, AES_BLOCK_SIZE)) {
  168. return 0;
  169. }
  170. }
  171. // Encrypt all but one of the remaining blocks.
  172. while (in_len > AES_BLOCK_SIZE) {
  173. if (!EVP_Cipher(&ctx->cipher_ctx, scratch, in, AES_BLOCK_SIZE)) {
  174. return 0;
  175. }
  176. in += AES_BLOCK_SIZE;
  177. in_len -= AES_BLOCK_SIZE;
  178. }
  179. OPENSSL_memcpy(ctx->block, in, in_len);
  180. ctx->block_used = in_len;
  181. return 1;
  182. }
  183. int CMAC_Final(CMAC_CTX *ctx, uint8_t *out, size_t *out_len) {
  184. *out_len = AES_BLOCK_SIZE;
  185. if (out == NULL) {
  186. return 1;
  187. }
  188. const uint8_t *mask = ctx->k1;
  189. if (ctx->block_used != AES_BLOCK_SIZE) {
  190. // If the last block is incomplete, terminate it with a single 'one' bit
  191. // followed by zeros.
  192. ctx->block[ctx->block_used] = 0x80;
  193. OPENSSL_memset(ctx->block + ctx->block_used + 1, 0,
  194. AES_BLOCK_SIZE - (ctx->block_used + 1));
  195. mask = ctx->k2;
  196. }
  197. unsigned i;
  198. for (i = 0; i < AES_BLOCK_SIZE; i++) {
  199. out[i] = ctx->block[i] ^ mask[i];
  200. }
  201. return EVP_Cipher(&ctx->cipher_ctx, out, out, AES_BLOCK_SIZE);
  202. }