summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/aes/aes_i386.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/aes/aes_i386.c201
1 files changed, 201 insertions, 0 deletions
diff --git a/src/lib/libcrypto/aes/aes_i386.c b/src/lib/libcrypto/aes/aes_i386.c
new file mode 100644
index 0000000000..85a14454da
--- /dev/null
+++ b/src/lib/libcrypto/aes/aes_i386.c
@@ -0,0 +1,201 @@
1/* $OpenBSD: aes_i386.c,v 1.5 2025/07/22 09:13:49 jsing Exp $ */
2/*
3 * Copyright (c) 2025 Joel Sing <jsing@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <openssl/aes.h>
19
20#include "crypto_arch.h"
21#include "modes_local.h"
22
23int aes_set_encrypt_key_generic(const unsigned char *userKey, const int bits,
24 AES_KEY *key);
25int aes_set_decrypt_key_generic(const unsigned char *userKey, const int bits,
26 AES_KEY *key);
27
28void aes_encrypt_generic(const unsigned char *in, unsigned char *out,
29 const AES_KEY *key);
30void aes_decrypt_generic(const unsigned char *in, unsigned char *out,
31 const AES_KEY *key);
32
33void 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);
35
36void 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
40void aes_ctr32_encrypt_generic(const unsigned char *in, unsigned char *out,
41 size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE]);
42
43void aes_xts_encrypt_generic(const unsigned char *in, unsigned char *out,
44 size_t len, const AES_KEY *key1, const AES_KEY *key2,
45 const unsigned char iv[16], int encrypt);
46
47int aesni_set_encrypt_key(const unsigned char *userKey, int bits,
48 AES_KEY *key);
49int aesni_set_decrypt_key(const unsigned char *userKey, int bits,
50 AES_KEY *key);
51
52void aesni_encrypt(const unsigned char *in, unsigned char *out,
53 const AES_KEY *key);
54void aesni_decrypt(const unsigned char *in, unsigned char *out,
55 const AES_KEY *key);
56
57void aesni_cbc_encrypt(const unsigned char *in, unsigned char *out,
58 size_t len, const AES_KEY *key, unsigned char *ivec, const int enc);
59
60void 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
64void 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
68void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out,
69 size_t blocks, const void *key, const unsigned char *ivec);
70
71void aesni_ecb_encrypt(const unsigned char *in, unsigned char *out,
72 size_t length, const AES_KEY *key, int enc);
73
74void aesni_xts_encrypt(const unsigned char *in, unsigned char *out,
75 size_t length, const AES_KEY *key1, const AES_KEY *key2,
76 const unsigned char iv[16]);
77
78void aesni_xts_decrypt(const unsigned char *in, unsigned char *out,
79 size_t length, const AES_KEY *key1, const AES_KEY *key2,
80 const unsigned char iv[16]);
81
82int
83aes_set_encrypt_key_internal(const unsigned char *userKey, const int bits,
84 AES_KEY *key)
85{
86 if ((crypto_cpu_caps_i386 & CRYPTO_CPU_CAPS_I386_AES) != 0)
87 return aesni_set_encrypt_key(userKey, bits, key);
88
89 return aes_set_encrypt_key_generic(userKey, bits, key);
90}
91
92int
93aes_set_decrypt_key_internal(const unsigned char *userKey, const int bits,
94 AES_KEY *key)
95{
96 if ((crypto_cpu_caps_i386 & CRYPTO_CPU_CAPS_I386_AES) != 0)
97 return aesni_set_decrypt_key(userKey, bits, key);
98
99 return aes_set_decrypt_key_generic(userKey, bits, key);
100}
101
102void
103aes_encrypt_internal(const unsigned char *in, unsigned char *out,
104 const AES_KEY *key)
105{
106 if ((crypto_cpu_caps_i386 & CRYPTO_CPU_CAPS_I386_AES) != 0) {
107 aesni_encrypt(in, out, key);
108 return;
109 }
110
111 aes_encrypt_generic(in, out, key);
112}
113
114void
115aes_decrypt_internal(const unsigned char *in, unsigned char *out,
116 const AES_KEY *key)
117{
118 if ((crypto_cpu_caps_i386 & CRYPTO_CPU_CAPS_I386_AES) != 0) {
119 aesni_decrypt(in, out, key);
120 return;
121 }
122
123 aes_decrypt_generic(in, out, key);
124}
125
126void
127aes_cbc_encrypt_internal(const unsigned char *in, unsigned char *out,
128 size_t len, const AES_KEY *key, unsigned char *ivec, const int enc)
129{
130 if ((crypto_cpu_caps_i386 & CRYPTO_CPU_CAPS_I386_AES) != 0) {
131 aesni_cbc_encrypt(in, out, len, key, ivec, enc);
132 return;
133 }
134
135 aes_cbc_encrypt_generic(in, out, len, key, ivec, enc);
136}
137
138void
139aes_ccm64_encrypt_internal(const unsigned char *in, unsigned char *out,
140 size_t blocks, const void *key, const unsigned char ivec[16],
141 unsigned char cmac[16], int encrypt)
142{
143 if ((crypto_cpu_caps_i386 & CRYPTO_CPU_CAPS_I386_AES) != 0) {
144 if (encrypt)
145 aesni_ccm64_encrypt_blocks(in, out, blocks, key, ivec, cmac);
146 else
147 aesni_ccm64_decrypt_blocks(in, out, blocks, key, ivec, cmac);
148 return;
149 }
150
151 aes_ccm64_encrypt_generic(in, out, blocks, key, ivec, cmac, encrypt);
152}
153
154void
155aes_ctr32_encrypt_internal(const unsigned char *in, unsigned char *out,
156 size_t blocks, const AES_KEY *key, const unsigned char ivec[AES_BLOCK_SIZE])
157{
158 if ((crypto_cpu_caps_i386 & CRYPTO_CPU_CAPS_I386_AES) != 0) {
159 aesni_ctr32_encrypt_blocks(in, out, blocks, key, ivec);
160 return;
161 }
162
163 aes_ctr32_encrypt_generic(in, out, blocks, key, ivec);
164}
165
166void
167aes_ecb_encrypt_internal(const unsigned char *in, unsigned char *out,
168 size_t len, const AES_KEY *key, int encrypt)
169{
170 if ((crypto_cpu_caps_i386 & CRYPTO_CPU_CAPS_I386_AES) != 0) {
171 aesni_ecb_encrypt(in, out, len, key, encrypt);
172 return;
173 }
174
175 while (len >= AES_BLOCK_SIZE) {
176 if (encrypt)
177 aes_encrypt_generic(in, out, key);
178 else
179 aes_decrypt_generic(in, out, key);
180
181 in += AES_BLOCK_SIZE;
182 out += AES_BLOCK_SIZE;
183 len -= AES_BLOCK_SIZE;
184 }
185}
186
187void
188aes_xts_encrypt_internal(const unsigned char *in, unsigned char *out,
189 size_t len, const AES_KEY *key1, const AES_KEY *key2,
190 const unsigned char iv[16], int encrypt)
191{
192 if ((crypto_cpu_caps_i386 & CRYPTO_CPU_CAPS_I386_AES) != 0) {
193 if (encrypt)
194 aesni_xts_encrypt(in, out, len, key1, key2, iv);
195 else
196 aesni_xts_decrypt(in, out, len, key1, key2, iv);
197 return;
198 }
199
200 aes_xts_encrypt_generic(in, out, len, key1, key2, iv, encrypt);
201}