diff options
author | jsing <> | 2025-07-21 10:24:23 +0000 |
---|---|---|
committer | jsing <> | 2025-07-21 10:24:23 +0000 |
commit | a480cc6bd46609c720ef107acb4380c9f5d05fb0 (patch) | |
tree | ff569faf5125c023700a2783ef5d648c47c81313 /src | |
parent | a000fa8e43ffc48c5e770f5759e0cc957e5dda2f (diff) | |
download | openbsd-a480cc6bd46609c720ef107acb4380c9f5d05fb0.tar.gz openbsd-a480cc6bd46609c720ef107acb4380c9f5d05fb0.tar.bz2 openbsd-a480cc6bd46609c720ef107acb4380c9f5d05fb0.zip |
Move AES-NI from EVP to AES for CCM mode.
The mode implementation for CCM has two variants - one takes the block
function, while the other takes a "ccm64" function. The latter is expected
to handle the lower 64 bits of the IV/counter but only for 16 byte blocks.
The AES-NI implementation for CCM currently uses the second variant.
Provide aes_ccm64_encrypt_internal() as a function that can be replaced on
a machine dependent basis, along with an aes_ccm64_encrypt_generic()
function that provides the default implementation and can be used as a
fallback. Wire up the AES-NI version for amd64 and i386, change EVP's
aes_ccm_cipher() to use CRYPTO_ctr128_{en,de}crypt_ccm64() with
aes_ccm64_encrypt_internal()) and remove the various AES-NI specific
EVP_CIPHER methods for CCM.
ok tb@
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/aes/aes.c | 70 | ||||
-rw-r--r-- | src/lib/libcrypto/aes/aes_amd64.c | 30 | ||||
-rw-r--r-- | src/lib/libcrypto/aes/aes_i386.c | 30 | ||||
-rw-r--r-- | src/lib/libcrypto/aes/aes_local.h | 10 | ||||
-rw-r--r-- | src/lib/libcrypto/arch/amd64/crypto_arch.h | 3 | ||||
-rw-r--r-- | src/lib/libcrypto/arch/i386/crypto_arch.h | 3 | ||||
-rw-r--r-- | src/lib/libcrypto/evp/e_aes.c | 111 |
7 files changed, 145 insertions, 112 deletions
diff --git a/src/lib/libcrypto/aes/aes.c b/src/lib/libcrypto/aes/aes.c index cbfb548b3b..33e6273268 100644 --- a/src/lib/libcrypto/aes/aes.c +++ b/src/lib/libcrypto/aes/aes.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: aes.c,v 1.12 2025/07/20 08:55:49 jsing Exp $ */ | 1 | /* $OpenBSD: aes.c,v 1.13 2025/07/21 10:24:23 jsing Exp $ */ |
2 | /* ==================================================================== | 2 | /* ==================================================================== |
3 | * Copyright (c) 2002-2006 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 2002-2006 The OpenSSL Project. All rights reserved. |
4 | * | 4 | * |
@@ -173,6 +173,74 @@ AES_cfb8_encrypt(const unsigned char *in, unsigned char *out, size_t length, | |||
173 | LCRYPTO_ALIAS(AES_cfb8_encrypt); | 173 | LCRYPTO_ALIAS(AES_cfb8_encrypt); |
174 | 174 | ||
175 | void | 175 | void |
176 | aes_ccm64_encrypt_generic(const unsigned char *in, unsigned char *out, | ||
177 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
178 | unsigned char cmac[16], int encrypt) | ||
179 | { | ||
180 | uint8_t iv[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE]; | ||
181 | uint8_t in_mask; | ||
182 | uint64_t ctr; | ||
183 | int i; | ||
184 | |||
185 | in_mask = 0 - (encrypt != 0); | ||
186 | |||
187 | memcpy(iv, ivec, sizeof(iv)); | ||
188 | |||
189 | ctr = crypto_load_be64toh(&iv[8]); | ||
190 | |||
191 | while (blocks > 0) { | ||
192 | crypto_store_htobe64(&iv[8], ctr); | ||
193 | aes_encrypt_internal(iv, buf, key); | ||
194 | ctr++; | ||
195 | |||
196 | for (i = 0; i < 16; i++) { | ||
197 | out[i] = in[i] ^ buf[i]; | ||
198 | cmac[i] ^= (in[i] & in_mask) | (out[i] & ~in_mask); | ||
199 | } | ||
200 | |||
201 | aes_encrypt_internal(cmac, cmac, key); | ||
202 | |||
203 | in += 16; | ||
204 | out += 16; | ||
205 | blocks--; | ||
206 | } | ||
207 | |||
208 | explicit_bzero(buf, sizeof(buf)); | ||
209 | explicit_bzero(iv, sizeof(iv)); | ||
210 | } | ||
211 | |||
212 | #ifdef HAVE_AES_CCM64_ENCRYPT_INTERNAL | ||
213 | void aes_ccm64_encrypt_internal(const unsigned char *in, unsigned char *out, | ||
214 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
215 | unsigned char cmac[16], int encrypt); | ||
216 | |||
217 | #else | ||
218 | static inline void | ||
219 | aes_ccm64_encrypt_internal(const unsigned char *in, unsigned char *out, | ||
220 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
221 | unsigned char cmac[16], int encrypt) | ||
222 | { | ||
223 | aes_ccm64_encrypt_generic(in, out, blocks, key, ivec, cmac, encrypt); | ||
224 | } | ||
225 | #endif | ||
226 | |||
227 | void | ||
228 | aes_ccm64_encrypt_ccm128f(const unsigned char *in, unsigned char *out, | ||
229 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
230 | unsigned char cmac[16]) | ||
231 | { | ||
232 | aes_ccm64_encrypt_internal(in, out, blocks, key, ivec, cmac, 1); | ||
233 | } | ||
234 | |||
235 | void | ||
236 | aes_ccm64_decrypt_ccm128f(const unsigned char *in, unsigned char *out, | ||
237 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
238 | unsigned char cmac[16]) | ||
239 | { | ||
240 | aes_ccm64_encrypt_internal(in, out, blocks, key, ivec, cmac, 0); | ||
241 | } | ||
242 | |||
243 | void | ||
176 | aes_ctr32_encrypt_generic(const unsigned char *in, unsigned char *out, | 244 | aes_ctr32_encrypt_generic(const unsigned char *in, unsigned char *out, |
177 | size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE]) | 245 | size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE]) |
178 | { | 246 | { |
diff --git a/src/lib/libcrypto/aes/aes_amd64.c b/src/lib/libcrypto/aes/aes_amd64.c index 5a40274675..436983d872 100644 --- a/src/lib/libcrypto/aes/aes_amd64.c +++ b/src/lib/libcrypto/aes/aes_amd64.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: aes_amd64.c,v 1.3 2025/07/13 06:01:33 jsing Exp $ */ | 1 | /* $OpenBSD: aes_amd64.c,v 1.4 2025/07/21 10:24:23 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2025 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2025 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -33,6 +33,10 @@ void aes_decrypt_generic(const unsigned char *in, unsigned char *out, | |||
33 | void aes_cbc_encrypt_generic(const unsigned char *in, unsigned char *out, | 33 | void aes_cbc_encrypt_generic(const unsigned char *in, unsigned char *out, |
34 | size_t len, const AES_KEY *key, unsigned char *ivec, const int enc); | 34 | size_t len, const AES_KEY *key, unsigned char *ivec, const int enc); |
35 | 35 | ||
36 | void aes_ccm64_encrypt_generic(const unsigned char *in, unsigned char *out, | ||
37 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
38 | unsigned char cmac[16], int encrypt); | ||
39 | |||
36 | void aes_ctr32_encrypt_generic(const unsigned char *in, unsigned char *out, | 40 | void aes_ctr32_encrypt_generic(const unsigned char *in, unsigned char *out, |
37 | size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE]); | 41 | size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE]); |
38 | 42 | ||
@@ -53,6 +57,14 @@ void aesni_decrypt(const unsigned char *in, unsigned char *out, | |||
53 | void aesni_cbc_encrypt(const unsigned char *in, unsigned char *out, | 57 | void aesni_cbc_encrypt(const unsigned char *in, unsigned char *out, |
54 | size_t len, const AES_KEY *key, unsigned char *ivec, const int enc); | 58 | size_t len, const AES_KEY *key, unsigned char *ivec, const int enc); |
55 | 59 | ||
60 | void aesni_ccm64_encrypt_blocks(const unsigned char *in, unsigned char *out, | ||
61 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
62 | unsigned char cmac[16]); | ||
63 | |||
64 | void aesni_ccm64_decrypt_blocks(const unsigned char *in, unsigned char *out, | ||
65 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
66 | unsigned char cmac[16]); | ||
67 | |||
56 | void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, | 68 | void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, |
57 | size_t blocks, const void *key, const unsigned char *ivec); | 69 | size_t blocks, const void *key, const unsigned char *ivec); |
58 | 70 | ||
@@ -121,6 +133,22 @@ aes_cbc_encrypt_internal(const unsigned char *in, unsigned char *out, | |||
121 | } | 133 | } |
122 | 134 | ||
123 | void | 135 | void |
136 | aes_ccm64_encrypt_internal(const unsigned char *in, unsigned char *out, | ||
137 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
138 | unsigned char cmac[16], int encrypt) | ||
139 | { | ||
140 | if ((crypto_cpu_caps_amd64 & CRYPTO_CPU_CAPS_AMD64_AES) != 0) { | ||
141 | if (encrypt) | ||
142 | aesni_ccm64_encrypt_blocks(in, out, blocks, key, ivec, cmac); | ||
143 | else | ||
144 | aesni_ccm64_decrypt_blocks(in, out, blocks, key, ivec, cmac); | ||
145 | return; | ||
146 | } | ||
147 | |||
148 | aes_ccm64_encrypt_generic(in, out, blocks, key, ivec, cmac, encrypt); | ||
149 | } | ||
150 | |||
151 | void | ||
124 | aes_ctr32_encrypt_internal(const unsigned char *in, unsigned char *out, | 152 | aes_ctr32_encrypt_internal(const unsigned char *in, unsigned char *out, |
125 | size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE]) | 153 | size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE]) |
126 | { | 154 | { |
diff --git a/src/lib/libcrypto/aes/aes_i386.c b/src/lib/libcrypto/aes/aes_i386.c index 73b75d28f5..7f2241eaf5 100644 --- a/src/lib/libcrypto/aes/aes_i386.c +++ b/src/lib/libcrypto/aes/aes_i386.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: aes_i386.c,v 1.3 2025/07/13 06:01:33 jsing Exp $ */ | 1 | /* $OpenBSD: aes_i386.c,v 1.4 2025/07/21 10:24:23 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2025 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2025 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -33,6 +33,10 @@ void aes_decrypt_generic(const unsigned char *in, unsigned char *out, | |||
33 | void aes_cbc_encrypt_generic(const unsigned char *in, unsigned char *out, | 33 | void aes_cbc_encrypt_generic(const unsigned char *in, unsigned char *out, |
34 | size_t len, const AES_KEY *key, unsigned char *ivec, const int enc); | 34 | size_t len, const AES_KEY *key, unsigned char *ivec, const int enc); |
35 | 35 | ||
36 | void aes_ccm64_encrypt_generic(const unsigned char *in, unsigned char *out, | ||
37 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
38 | unsigned char cmac[16], int encrypt); | ||
39 | |||
36 | void aes_ctr32_encrypt_generic(const unsigned char *in, unsigned char *out, | 40 | void aes_ctr32_encrypt_generic(const unsigned char *in, unsigned char *out, |
37 | size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE]); | 41 | size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE]); |
38 | 42 | ||
@@ -53,6 +57,14 @@ void aesni_decrypt(const unsigned char *in, unsigned char *out, | |||
53 | void aesni_cbc_encrypt(const unsigned char *in, unsigned char *out, | 57 | void aesni_cbc_encrypt(const unsigned char *in, unsigned char *out, |
54 | size_t len, const AES_KEY *key, unsigned char *ivec, const int enc); | 58 | size_t len, const AES_KEY *key, unsigned char *ivec, const int enc); |
55 | 59 | ||
60 | void aesni_ccm64_encrypt_blocks(const unsigned char *in, unsigned char *out, | ||
61 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
62 | unsigned char cmac[16]); | ||
63 | |||
64 | void aesni_ccm64_decrypt_blocks(const unsigned char *in, unsigned char *out, | ||
65 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
66 | unsigned char cmac[16]); | ||
67 | |||
56 | void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, | 68 | void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, |
57 | size_t blocks, const void *key, const unsigned char *ivec); | 69 | size_t blocks, const void *key, const unsigned char *ivec); |
58 | 70 | ||
@@ -121,6 +133,22 @@ aes_cbc_encrypt_internal(const unsigned char *in, unsigned char *out, | |||
121 | } | 133 | } |
122 | 134 | ||
123 | void | 135 | void |
136 | aes_ccm64_encrypt_internal(const unsigned char *in, unsigned char *out, | ||
137 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
138 | unsigned char cmac[16], int encrypt) | ||
139 | { | ||
140 | if ((crypto_cpu_caps_i386 & CRYPTO_CPU_CAPS_I386_AES) != 0) { | ||
141 | if (encrypt) | ||
142 | aesni_ccm64_encrypt_blocks(in, out, blocks, key, ivec, cmac); | ||
143 | else | ||
144 | aesni_ccm64_decrypt_blocks(in, out, blocks, key, ivec, cmac); | ||
145 | return; | ||
146 | } | ||
147 | |||
148 | aes_ccm64_encrypt_generic(in, out, blocks, key, ivec, cmac, encrypt); | ||
149 | } | ||
150 | |||
151 | void | ||
124 | aes_ctr32_encrypt_internal(const unsigned char *in, unsigned char *out, | 152 | aes_ctr32_encrypt_internal(const unsigned char *in, unsigned char *out, |
125 | size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE]) | 153 | size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE]) |
126 | { | 154 | { |
diff --git a/src/lib/libcrypto/aes/aes_local.h b/src/lib/libcrypto/aes/aes_local.h index f68d4624e7..539373ea06 100644 --- a/src/lib/libcrypto/aes/aes_local.h +++ b/src/lib/libcrypto/aes/aes_local.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: aes_local.h,v 1.9 2025/07/13 06:01:33 jsing Exp $ */ | 1 | /* $OpenBSD: aes_local.h,v 1.10 2025/07/21 10:24:23 jsing Exp $ */ |
2 | /* ==================================================================== | 2 | /* ==================================================================== |
3 | * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. |
4 | * | 4 | * |
@@ -66,6 +66,14 @@ __BEGIN_HIDDEN_DECLS | |||
66 | void aes_ctr32_encrypt_ctr128f(const unsigned char *in, unsigned char *out, | 66 | void aes_ctr32_encrypt_ctr128f(const unsigned char *in, unsigned char *out, |
67 | size_t blocks, const void *key, const unsigned char ivec[AES_BLOCK_SIZE]); | 67 | size_t blocks, const void *key, const unsigned char ivec[AES_BLOCK_SIZE]); |
68 | 68 | ||
69 | void aes_ccm64_encrypt_ccm128f(const unsigned char *in, unsigned char *out, | ||
70 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
71 | unsigned char cmac[16]); | ||
72 | |||
73 | void aes_ccm64_decrypt_ccm128f(const unsigned char *in, unsigned char *out, | ||
74 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
75 | unsigned char cmac[16]); | ||
76 | |||
69 | void aes_ecb_encrypt_internal(const unsigned char *in, unsigned char *out, | 77 | void aes_ecb_encrypt_internal(const unsigned char *in, unsigned char *out, |
70 | size_t len, const AES_KEY *key, int encrypt); | 78 | size_t len, const AES_KEY *key, int encrypt); |
71 | 79 | ||
diff --git a/src/lib/libcrypto/arch/amd64/crypto_arch.h b/src/lib/libcrypto/arch/amd64/crypto_arch.h index 7c3c89a088..a51021a307 100644 --- a/src/lib/libcrypto/arch/amd64/crypto_arch.h +++ b/src/lib/libcrypto/arch/amd64/crypto_arch.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: crypto_arch.h,v 1.10 2025/07/13 06:01:33 jsing Exp $ */ | 1 | /* $OpenBSD: crypto_arch.h,v 1.11 2025/07/21 10:24:23 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2024 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2024 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -38,6 +38,7 @@ extern uint64_t crypto_cpu_caps_amd64; | |||
38 | #define HAVE_AES_ENCRYPT_INTERNAL | 38 | #define HAVE_AES_ENCRYPT_INTERNAL |
39 | #define HAVE_AES_DECRYPT_INTERNAL | 39 | #define HAVE_AES_DECRYPT_INTERNAL |
40 | #define HAVE_AES_CBC_ENCRYPT_INTERNAL | 40 | #define HAVE_AES_CBC_ENCRYPT_INTERNAL |
41 | #define HAVE_AES_CCM64_ENCRYPT_INTERNAL | ||
41 | #define HAVE_AES_CTR32_ENCRYPT_INTERNAL | 42 | #define HAVE_AES_CTR32_ENCRYPT_INTERNAL |
42 | #define HAVE_AES_XTS_ENCRYPT_INTERNAL | 43 | #define HAVE_AES_XTS_ENCRYPT_INTERNAL |
43 | 44 | ||
diff --git a/src/lib/libcrypto/arch/i386/crypto_arch.h b/src/lib/libcrypto/arch/i386/crypto_arch.h index 8b292165fb..34d041b382 100644 --- a/src/lib/libcrypto/arch/i386/crypto_arch.h +++ b/src/lib/libcrypto/arch/i386/crypto_arch.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: crypto_arch.h,v 1.9 2025/07/13 06:01:33 jsing Exp $ */ | 1 | /* $OpenBSD: crypto_arch.h,v 1.10 2025/07/21 10:24:23 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2024 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2024 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -38,6 +38,7 @@ extern uint64_t crypto_cpu_caps_i386; | |||
38 | #define HAVE_AES_ENCRYPT_INTERNAL | 38 | #define HAVE_AES_ENCRYPT_INTERNAL |
39 | #define HAVE_AES_DECRYPT_INTERNAL | 39 | #define HAVE_AES_DECRYPT_INTERNAL |
40 | #define HAVE_AES_CBC_ENCRYPT_INTERNAL | 40 | #define HAVE_AES_CBC_ENCRYPT_INTERNAL |
41 | #define HAVE_AES_CCM64_ENCRYPT_INTERNAL | ||
41 | #define HAVE_AES_CTR32_ENCRYPT_INTERNAL | 42 | #define HAVE_AES_CTR32_ENCRYPT_INTERNAL |
42 | #define HAVE_AES_XTS_ENCRYPT_INTERNAL | 43 | #define HAVE_AES_XTS_ENCRYPT_INTERNAL |
43 | 44 | ||
diff --git a/src/lib/libcrypto/evp/e_aes.c b/src/lib/libcrypto/evp/e_aes.c index 851da9ded6..0949c8bdb4 100644 --- a/src/lib/libcrypto/evp/e_aes.c +++ b/src/lib/libcrypto/evp/e_aes.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: e_aes.c,v 1.79 2025/07/13 06:01:33 jsing Exp $ */ | 1 | /* $OpenBSD: e_aes.c,v 1.80 2025/07/21 10:24:23 jsing Exp $ */ |
2 | /* ==================================================================== | 2 | /* ==================================================================== |
3 | * Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved. |
4 | * | 4 | * |
@@ -95,7 +95,6 @@ typedef struct { | |||
95 | int len_set; /* Set if message length set */ | 95 | int len_set; /* Set if message length set */ |
96 | int L, M; /* L and M parameters from RFC3610 */ | 96 | int L, M; /* L and M parameters from RFC3610 */ |
97 | CCM128_CONTEXT ccm; | 97 | CCM128_CONTEXT ccm; |
98 | ccm128_f str; | ||
99 | } EVP_AES_CCM_CTX; | 98 | } EVP_AES_CCM_CTX; |
100 | 99 | ||
101 | #define MAXBITCHUNK ((size_t)1<<(sizeof(size_t)*8-4)) | 100 | #define MAXBITCHUNK ((size_t)1<<(sizeof(size_t)*8-4)) |
@@ -114,27 +113,9 @@ typedef struct { | |||
114 | */ | 113 | */ |
115 | #define AESNI_CAPABLE (crypto_cpu_caps_ia32() & CPUCAP_MASK_AESNI) | 114 | #define AESNI_CAPABLE (crypto_cpu_caps_ia32() & CPUCAP_MASK_AESNI) |
116 | 115 | ||
117 | int aesni_set_encrypt_key(const unsigned char *userKey, int bits, | ||
118 | AES_KEY *key); | ||
119 | int aesni_set_decrypt_key(const unsigned char *userKey, int bits, | ||
120 | AES_KEY *key); | ||
121 | |||
122 | void aesni_encrypt(const unsigned char *in, unsigned char *out, | ||
123 | const AES_KEY *key); | ||
124 | void aesni_decrypt(const unsigned char *in, unsigned char *out, | ||
125 | const AES_KEY *key); | ||
126 | |||
127 | void aesni_ecb_encrypt(const unsigned char *in, unsigned char *out, | 116 | void aesni_ecb_encrypt(const unsigned char *in, unsigned char *out, |
128 | size_t length, const AES_KEY *key, int enc); | 117 | size_t length, const AES_KEY *key, int enc); |
129 | 118 | ||
130 | void aesni_ccm64_encrypt_blocks (const unsigned char *in, unsigned char *out, | ||
131 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
132 | unsigned char cmac[16]); | ||
133 | |||
134 | void aesni_ccm64_decrypt_blocks (const unsigned char *in, unsigned char *out, | ||
135 | size_t blocks, const void *key, const unsigned char ivec[16], | ||
136 | unsigned char cmac[16]); | ||
137 | |||
138 | static int | 119 | static int |
139 | aesni_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 120 | aesni_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
140 | const unsigned char *in, size_t len) | 121 | const unsigned char *in, size_t len) |
@@ -146,29 +127,6 @@ aesni_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
146 | 127 | ||
147 | return 1; | 128 | return 1; |
148 | } | 129 | } |
149 | |||
150 | static int | ||
151 | aesni_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | ||
152 | const unsigned char *iv, int enc) | ||
153 | { | ||
154 | EVP_AES_CCM_CTX *cctx = ctx->cipher_data; | ||
155 | |||
156 | if (!iv && !key) | ||
157 | return 1; | ||
158 | if (key) { | ||
159 | aesni_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks); | ||
160 | CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L, | ||
161 | &cctx->ks, (block128_f)aesni_encrypt); | ||
162 | cctx->str = enc ? (ccm128_f)aesni_ccm64_encrypt_blocks : | ||
163 | (ccm128_f)aesni_ccm64_decrypt_blocks; | ||
164 | cctx->key_set = 1; | ||
165 | } | ||
166 | if (iv) { | ||
167 | memcpy(ctx->iv, iv, 15 - cctx->L); | ||
168 | cctx->iv_set = 1; | ||
169 | } | ||
170 | return 1; | ||
171 | } | ||
172 | #endif | 130 | #endif |
173 | 131 | ||
174 | static int | 132 | static int |
@@ -1353,7 +1311,6 @@ aes_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | |||
1353 | AES_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks); | 1311 | AES_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks); |
1354 | CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L, | 1312 | CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L, |
1355 | &cctx->ks, (block128_f)AES_encrypt); | 1313 | &cctx->ks, (block128_f)AES_encrypt); |
1356 | cctx->str = NULL; | ||
1357 | cctx->key_set = 1; | 1314 | cctx->key_set = 1; |
1358 | } | 1315 | } |
1359 | if (iv) { | 1316 | if (iv) { |
@@ -1405,15 +1362,15 @@ aes_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
1405 | cctx->len_set = 1; | 1362 | cctx->len_set = 1; |
1406 | } | 1363 | } |
1407 | if (ctx->encrypt) { | 1364 | if (ctx->encrypt) { |
1408 | if (cctx->str ? CRYPTO_ccm128_encrypt_ccm64(ccm, in, out, len, | 1365 | if (CRYPTO_ccm128_encrypt_ccm64(ccm, in, out, len, |
1409 | cctx->str) : CRYPTO_ccm128_encrypt(ccm, in, out, len)) | 1366 | aes_ccm64_encrypt_ccm128f) != 0) |
1410 | return -1; | 1367 | return -1; |
1411 | cctx->tag_set = 1; | 1368 | cctx->tag_set = 1; |
1412 | return len; | 1369 | return len; |
1413 | } else { | 1370 | } else { |
1414 | int rv = -1; | 1371 | int rv = -1; |
1415 | if (cctx->str ? !CRYPTO_ccm128_decrypt_ccm64(ccm, in, out, len, | 1372 | if (CRYPTO_ccm128_decrypt_ccm64(ccm, in, out, len, |
1416 | cctx->str) : !CRYPTO_ccm128_decrypt(ccm, in, out, len)) { | 1373 | aes_ccm64_decrypt_ccm128f) == 0) { |
1417 | unsigned char tag[16]; | 1374 | unsigned char tag[16]; |
1418 | if (CRYPTO_ccm128_tag(ccm, tag, cctx->M)) { | 1375 | if (CRYPTO_ccm128_tag(ccm, tag, cctx->M)) { |
1419 | if (timingsafe_memcmp(tag, ctx->buf, cctx->M) == 0) | 1376 | if (timingsafe_memcmp(tag, ctx->buf, cctx->M) == 0) |
@@ -1427,24 +1384,8 @@ aes_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
1427 | cctx->len_set = 0; | 1384 | cctx->len_set = 0; |
1428 | return rv; | 1385 | return rv; |
1429 | } | 1386 | } |
1430 | |||
1431 | } | 1387 | } |
1432 | 1388 | ||
1433 | #ifdef AESNI_CAPABLE | ||
1434 | static const EVP_CIPHER aesni_128_ccm = { | ||
1435 | .nid = NID_aes_128_ccm, | ||
1436 | .block_size = 1, | ||
1437 | .key_len = 16, | ||
1438 | .iv_len = 12, | ||
1439 | .flags = CUSTOM_FLAGS | EVP_CIPH_CCM_MODE, | ||
1440 | .init = aesni_ccm_init_key, | ||
1441 | .do_cipher = aes_ccm_cipher, | ||
1442 | .cleanup = NULL, | ||
1443 | .ctx_size = sizeof(EVP_AES_CCM_CTX), | ||
1444 | .ctrl = aes_ccm_ctrl, | ||
1445 | }; | ||
1446 | #endif | ||
1447 | |||
1448 | static const EVP_CIPHER aes_128_ccm = { | 1389 | static const EVP_CIPHER aes_128_ccm = { |
1449 | .nid = NID_aes_128_ccm, | 1390 | .nid = NID_aes_128_ccm, |
1450 | .block_size = 1, | 1391 | .block_size = 1, |
@@ -1461,29 +1402,10 @@ static const EVP_CIPHER aes_128_ccm = { | |||
1461 | const EVP_CIPHER * | 1402 | const EVP_CIPHER * |
1462 | EVP_aes_128_ccm(void) | 1403 | EVP_aes_128_ccm(void) |
1463 | { | 1404 | { |
1464 | #ifdef AESNI_CAPABLE | ||
1465 | return AESNI_CAPABLE ? &aesni_128_ccm : &aes_128_ccm; | ||
1466 | #else | ||
1467 | return &aes_128_ccm; | 1405 | return &aes_128_ccm; |
1468 | #endif | ||
1469 | } | 1406 | } |
1470 | LCRYPTO_ALIAS(EVP_aes_128_ccm); | 1407 | LCRYPTO_ALIAS(EVP_aes_128_ccm); |
1471 | 1408 | ||
1472 | #ifdef AESNI_CAPABLE | ||
1473 | static const EVP_CIPHER aesni_192_ccm = { | ||
1474 | .nid = NID_aes_192_ccm, | ||
1475 | .block_size = 1, | ||
1476 | .key_len = 24, | ||
1477 | .iv_len = 12, | ||
1478 | .flags = CUSTOM_FLAGS | EVP_CIPH_CCM_MODE, | ||
1479 | .init = aesni_ccm_init_key, | ||
1480 | .do_cipher = aes_ccm_cipher, | ||
1481 | .cleanup = NULL, | ||
1482 | .ctx_size = sizeof(EVP_AES_CCM_CTX), | ||
1483 | .ctrl = aes_ccm_ctrl, | ||
1484 | }; | ||
1485 | #endif | ||
1486 | |||
1487 | static const EVP_CIPHER aes_192_ccm = { | 1409 | static const EVP_CIPHER aes_192_ccm = { |
1488 | .nid = NID_aes_192_ccm, | 1410 | .nid = NID_aes_192_ccm, |
1489 | .block_size = 1, | 1411 | .block_size = 1, |
@@ -1500,29 +1422,10 @@ static const EVP_CIPHER aes_192_ccm = { | |||
1500 | const EVP_CIPHER * | 1422 | const EVP_CIPHER * |
1501 | EVP_aes_192_ccm(void) | 1423 | EVP_aes_192_ccm(void) |
1502 | { | 1424 | { |
1503 | #ifdef AESNI_CAPABLE | ||
1504 | return AESNI_CAPABLE ? &aesni_192_ccm : &aes_192_ccm; | ||
1505 | #else | ||
1506 | return &aes_192_ccm; | 1425 | return &aes_192_ccm; |
1507 | #endif | ||
1508 | } | 1426 | } |
1509 | LCRYPTO_ALIAS(EVP_aes_192_ccm); | 1427 | LCRYPTO_ALIAS(EVP_aes_192_ccm); |
1510 | 1428 | ||
1511 | #ifdef AESNI_CAPABLE | ||
1512 | static const EVP_CIPHER aesni_256_ccm = { | ||
1513 | .nid = NID_aes_256_ccm, | ||
1514 | .block_size = 1, | ||
1515 | .key_len = 32, | ||
1516 | .iv_len = 12, | ||
1517 | .flags = CUSTOM_FLAGS | EVP_CIPH_CCM_MODE, | ||
1518 | .init = aesni_ccm_init_key, | ||
1519 | .do_cipher = aes_ccm_cipher, | ||
1520 | .cleanup = NULL, | ||
1521 | .ctx_size = sizeof(EVP_AES_CCM_CTX), | ||
1522 | .ctrl = aes_ccm_ctrl, | ||
1523 | }; | ||
1524 | #endif | ||
1525 | |||
1526 | static const EVP_CIPHER aes_256_ccm = { | 1429 | static const EVP_CIPHER aes_256_ccm = { |
1527 | .nid = NID_aes_256_ccm, | 1430 | .nid = NID_aes_256_ccm, |
1528 | .block_size = 1, | 1431 | .block_size = 1, |
@@ -1539,11 +1442,7 @@ static const EVP_CIPHER aes_256_ccm = { | |||
1539 | const EVP_CIPHER * | 1442 | const EVP_CIPHER * |
1540 | EVP_aes_256_ccm(void) | 1443 | EVP_aes_256_ccm(void) |
1541 | { | 1444 | { |
1542 | #ifdef AESNI_CAPABLE | ||
1543 | return AESNI_CAPABLE ? &aesni_256_ccm : &aes_256_ccm; | ||
1544 | #else | ||
1545 | return &aes_256_ccm; | 1445 | return &aes_256_ccm; |
1546 | #endif | ||
1547 | } | 1446 | } |
1548 | LCRYPTO_ALIAS(EVP_aes_256_ccm); | 1447 | LCRYPTO_ALIAS(EVP_aes_256_ccm); |
1549 | 1448 | ||