2 * Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #ifndef OSSL_AES_PLATFORM_H
11 # define OSSL_AES_PLATFORM_H
14 # include <openssl/aes.h>
17 int vpaes_set_encrypt_key(const unsigned char *userKey, int bits,
19 int vpaes_set_decrypt_key(const unsigned char *userKey, int bits,
21 void vpaes_encrypt(const unsigned char *in, unsigned char *out,
23 void vpaes_decrypt(const unsigned char *in, unsigned char *out,
25 void vpaes_cbc_encrypt(const unsigned char *in,
28 const AES_KEY *key, unsigned char *ivec, int enc);
29 # endif /* VPAES_ASM */
32 void ossl_bsaes_cbc_encrypt(const unsigned char *in, unsigned char *out,
33 size_t length, const AES_KEY *key,
34 unsigned char ivec[16], int enc);
35 void ossl_bsaes_ctr32_encrypt_blocks(const unsigned char *in,
36 unsigned char *out, size_t len,
38 const unsigned char ivec[16]);
39 void ossl_bsaes_xts_encrypt(const unsigned char *inp, unsigned char *out,
40 size_t len, const AES_KEY *key1,
41 const AES_KEY *key2, const unsigned char iv[16]);
42 void ossl_bsaes_xts_decrypt(const unsigned char *inp, unsigned char *out,
43 size_t len, const AES_KEY *key1,
44 const AES_KEY *key2, const unsigned char iv[16]);
45 # endif /* BSAES_ASM */
48 void AES_ctr32_encrypt(const unsigned char *in, unsigned char *out,
49 size_t blocks, const AES_KEY *key,
50 const unsigned char ivec[AES_BLOCK_SIZE]);
51 # endif /* AES_CTR_ASM */
54 void AES_xts_encrypt(const unsigned char *inp, unsigned char *out, size_t len,
55 const AES_KEY *key1, const AES_KEY *key2,
56 const unsigned char iv[16]);
57 void AES_xts_decrypt(const unsigned char *inp, unsigned char *out, size_t len,
58 const AES_KEY *key1, const AES_KEY *key2,
59 const unsigned char iv[16]);
60 # endif /* AES_XTS_ASM */
62 # if defined(OPENSSL_CPUID_OBJ)
63 # if (defined(__powerpc__) || defined(__ppc__) || defined(_ARCH_PPC))
64 # include "crypto/ppc_arch.h"
66 # define VPAES_CAPABLE (OPENSSL_ppccap_P & PPC_ALTIVEC)
68 # define HWAES_CAPABLE (OPENSSL_ppccap_P & PPC_CRYPTO207)
69 # define HWAES_set_encrypt_key aes_p8_set_encrypt_key
70 # define HWAES_set_decrypt_key aes_p8_set_decrypt_key
71 # define HWAES_encrypt aes_p8_encrypt
72 # define HWAES_decrypt aes_p8_decrypt
73 # define HWAES_cbc_encrypt aes_p8_cbc_encrypt
74 # define HWAES_ctr32_encrypt_blocks aes_p8_ctr32_encrypt_blocks
75 # define HWAES_xts_encrypt aes_p8_xts_encrypt
76 # define HWAES_xts_decrypt aes_p8_xts_decrypt
77 # define PPC_AES_GCM_CAPABLE (OPENSSL_ppccap_P & PPC_MADD300)
78 # define AES_GCM_ENC_BYTES 128
79 # define AES_GCM_DEC_BYTES 128
80 size_t ppc_aes_gcm_encrypt(const unsigned char *in, unsigned char *out,
81 size_t len, const void *key, unsigned char ivec[16],
83 size_t ppc_aes_gcm_decrypt(const unsigned char *in, unsigned char *out,
84 size_t len, const void *key, unsigned char ivec[16],
86 size_t ppc_aes_gcm_encrypt_wrap(const unsigned char *in, unsigned char *out,
87 size_t len, const void *key,
88 unsigned char ivec[16], u64 *Xi);
89 size_t ppc_aes_gcm_decrypt_wrap(const unsigned char *in, unsigned char *out,
90 size_t len, const void *key,
91 unsigned char ivec[16], u64 *Xi);
92 # define AES_gcm_encrypt ppc_aes_gcm_encrypt_wrap
93 # define AES_gcm_decrypt ppc_aes_gcm_decrypt_wrap
94 # define AES_GCM_ASM(gctx) ((gctx)->ctr==aes_p8_ctr32_encrypt_blocks && \
95 (gctx)->gcm.ghash==gcm_ghash_p8)
96 void gcm_ghash_p8(u64 Xi[2],const u128 Htable[16],const u8 *inp, size_t len);
99 # if (defined(__arm__) || defined(__arm) || defined(__aarch64__))
100 # include "arm_arch.h"
101 # if __ARM_MAX_ARCH__>=7
102 # if defined(BSAES_ASM)
103 # define BSAES_CAPABLE (OPENSSL_armcap_P & ARMV7_NEON)
105 # if defined(VPAES_ASM)
106 # define VPAES_CAPABLE (OPENSSL_armcap_P & ARMV7_NEON)
108 # define HWAES_CAPABLE (OPENSSL_armcap_P & ARMV8_AES)
109 # define HWAES_set_encrypt_key aes_v8_set_encrypt_key
110 # define HWAES_set_decrypt_key aes_v8_set_decrypt_key
111 # define HWAES_encrypt aes_v8_encrypt
112 # define HWAES_decrypt aes_v8_decrypt
113 # define HWAES_cbc_encrypt aes_v8_cbc_encrypt
114 # define HWAES_ecb_encrypt aes_v8_ecb_encrypt
115 # if __ARM_MAX_ARCH__>=8 && defined(__aarch64__)
116 # define HWAES_xts_encrypt aes_v8_xts_encrypt
117 # define HWAES_xts_decrypt aes_v8_xts_decrypt
119 # define HWAES_ctr32_encrypt_blocks aes_v8_ctr32_encrypt_blocks
120 # define AES_PMULL_CAPABLE ((OPENSSL_armcap_P & ARMV8_PMULL) && (OPENSSL_armcap_P & ARMV8_AES))
121 # define AES_GCM_ENC_BYTES 512
122 # define AES_GCM_DEC_BYTES 512
123 # if __ARM_MAX_ARCH__>=8 && defined(__aarch64__)
124 # define AES_gcm_encrypt armv8_aes_gcm_encrypt
125 # define AES_gcm_decrypt armv8_aes_gcm_decrypt
126 # define AES_GCM_ASM(gctx) ((gctx)->ctr==aes_v8_ctr32_encrypt_blocks && \
127 (gctx)->gcm.ghash==gcm_ghash_v8)
128 size_t aes_gcm_enc_128_kernel(const uint8_t * plaintext, uint64_t plaintext_length, uint8_t * ciphertext,
129 uint64_t *Xi, unsigned char ivec[16], const void *key);
130 size_t aes_gcm_enc_192_kernel(const uint8_t * plaintext, uint64_t plaintext_length, uint8_t * ciphertext,
131 uint64_t *Xi, unsigned char ivec[16], const void *key);
132 size_t aes_gcm_enc_256_kernel(const uint8_t * plaintext, uint64_t plaintext_length, uint8_t * ciphertext,
133 uint64_t *Xi, unsigned char ivec[16], const void *key);
134 size_t aes_gcm_dec_128_kernel(const uint8_t * ciphertext, uint64_t plaintext_length, uint8_t * plaintext,
135 uint64_t *Xi, unsigned char ivec[16], const void *key);
136 size_t aes_gcm_dec_192_kernel(const uint8_t * ciphertext, uint64_t plaintext_length, uint8_t * plaintext,
137 uint64_t *Xi, unsigned char ivec[16], const void *key);
138 size_t aes_gcm_dec_256_kernel(const uint8_t * ciphertext, uint64_t plaintext_length, uint8_t * plaintext,
139 uint64_t *Xi, unsigned char ivec[16], const void *key);
140 size_t unroll8_eor3_aes_gcm_enc_128_kernel(const uint8_t * plaintext, uint64_t plaintext_length, uint8_t * ciphertext,
141 uint64_t *Xi, unsigned char ivec[16], const void *key);
142 size_t unroll8_eor3_aes_gcm_enc_192_kernel(const uint8_t * plaintext, uint64_t plaintext_length, uint8_t * ciphertext,
143 uint64_t *Xi, unsigned char ivec[16], const void *key);
144 size_t unroll8_eor3_aes_gcm_enc_256_kernel(const uint8_t * plaintext, uint64_t plaintext_length, uint8_t * ciphertext,
145 uint64_t *Xi, unsigned char ivec[16], const void *key);
146 size_t unroll8_eor3_aes_gcm_dec_128_kernel(const uint8_t * ciphertext, uint64_t plaintext_length, uint8_t * plaintext,
147 uint64_t *Xi, unsigned char ivec[16], const void *key);
148 size_t unroll8_eor3_aes_gcm_dec_192_kernel(const uint8_t * ciphertext, uint64_t plaintext_length, uint8_t * plaintext,
149 uint64_t *Xi, unsigned char ivec[16], const void *key);
150 size_t unroll8_eor3_aes_gcm_dec_256_kernel(const uint8_t * ciphertext, uint64_t plaintext_length, uint8_t * plaintext,
151 uint64_t *Xi, unsigned char ivec[16], const void *key);
152 size_t armv8_aes_gcm_encrypt(const unsigned char *in, unsigned char *out, size_t len, const void *key,
153 unsigned char ivec[16], u64 *Xi);
154 size_t armv8_aes_gcm_decrypt(const unsigned char *in, unsigned char *out, size_t len, const void *key,
155 unsigned char ivec[16], u64 *Xi);
156 void gcm_ghash_v8(u64 Xi[2],const u128 Htable[16],const u8 *inp, size_t len);
160 # endif /* OPENSSL_CPUID_OBJ */
162 # if defined(AES_ASM) && ( \
163 defined(__x86_64) || defined(__x86_64__) || \
164 defined(_M_AMD64) || defined(_M_X64) )
165 # define AES_CBC_HMAC_SHA_CAPABLE 1
166 # define AESNI_CBC_HMAC_SHA_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(57-32)))
169 # if defined(AES_ASM) && !defined(I386_ONLY) && ( \
170 ((defined(__i386) || defined(__i386__) || \
171 defined(_M_IX86)) && defined(OPENSSL_IA32_SSE2))|| \
172 defined(__x86_64) || defined(__x86_64__) || \
173 defined(_M_AMD64) || defined(_M_X64) )
177 # define AESNI_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(57-32)))
179 # define VPAES_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(41-32)))
182 # define BSAES_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(41-32)))
185 # define AES_GCM_ENC_BYTES 32
186 # define AES_GCM_DEC_BYTES 16
188 int aesni_set_encrypt_key(const unsigned char *userKey, int bits,
190 int aesni_set_decrypt_key(const unsigned char *userKey, int bits,
193 void aesni_encrypt(const unsigned char *in, unsigned char *out,
195 void aesni_decrypt(const unsigned char *in, unsigned char *out,
198 void aesni_ecb_encrypt(const unsigned char *in,
200 size_t length, const AES_KEY *key, int enc);
201 void aesni_cbc_encrypt(const unsigned char *in,
204 const AES_KEY *key, unsigned char *ivec, int enc);
205 # ifndef OPENSSL_NO_OCB
206 void aesni_ocb_encrypt(const unsigned char *in, unsigned char *out,
207 size_t blocks, const void *key,
208 size_t start_block_num,
209 unsigned char offset_i[16],
210 const unsigned char L_[][16],
211 unsigned char checksum[16]);
212 void aesni_ocb_decrypt(const unsigned char *in, unsigned char *out,
213 size_t blocks, const void *key,
214 size_t start_block_num,
215 unsigned char offset_i[16],
216 const unsigned char L_[][16],
217 unsigned char checksum[16]);
218 # endif /* OPENSSL_NO_OCB */
220 void aesni_ctr32_encrypt_blocks(const unsigned char *in,
223 const void *key, const unsigned char *ivec);
225 void aesni_xts_encrypt(const unsigned char *in,
228 const AES_KEY *key1, const AES_KEY *key2,
229 const unsigned char iv[16]);
231 void aesni_xts_decrypt(const unsigned char *in,
234 const AES_KEY *key1, const AES_KEY *key2,
235 const unsigned char iv[16]);
237 void aesni_ccm64_encrypt_blocks(const unsigned char *in,
241 const unsigned char ivec[16],
242 unsigned char cmac[16]);
244 void aesni_ccm64_decrypt_blocks(const unsigned char *in,
248 const unsigned char ivec[16],
249 unsigned char cmac[16]);
251 # if defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64)
252 size_t aesni_gcm_encrypt(const unsigned char *in, unsigned char *out, size_t len,
253 const void *key, unsigned char ivec[16], u64 *Xi);
254 size_t aesni_gcm_decrypt(const unsigned char *in, unsigned char *out, size_t len,
255 const void *key, unsigned char ivec[16], u64 *Xi);
256 void gcm_ghash_avx(u64 Xi[2], const u128 Htable[16], const u8 *in, size_t len);
258 # define AES_gcm_encrypt aesni_gcm_encrypt
259 # define AES_gcm_decrypt aesni_gcm_decrypt
260 # define AES_GCM_ASM(ctx) (ctx->ctr == aesni_ctr32_encrypt_blocks && \
261 ctx->gcm.ghash == gcm_ghash_avx)
265 # elif defined(AES_ASM) && (defined(__sparc) || defined(__sparc__))
267 /* Fujitsu SPARC64 X support */
268 # include "crypto/sparc_arch.h"
270 # define SPARC_AES_CAPABLE (OPENSSL_sparcv9cap_P[1] & CFR_AES)
271 # define HWAES_CAPABLE (OPENSSL_sparcv9cap_P[0] & SPARCV9_FJAESX)
272 # define HWAES_set_encrypt_key aes_fx_set_encrypt_key
273 # define HWAES_set_decrypt_key aes_fx_set_decrypt_key
274 # define HWAES_encrypt aes_fx_encrypt
275 # define HWAES_decrypt aes_fx_decrypt
276 # define HWAES_cbc_encrypt aes_fx_cbc_encrypt
277 # define HWAES_ctr32_encrypt_blocks aes_fx_ctr32_encrypt_blocks
279 void aes_t4_set_encrypt_key(const unsigned char *key, int bits, AES_KEY *ks);
280 void aes_t4_set_decrypt_key(const unsigned char *key, int bits, AES_KEY *ks);
281 void aes_t4_encrypt(const unsigned char *in, unsigned char *out,
283 void aes_t4_decrypt(const unsigned char *in, unsigned char *out,
286 * Key-length specific subroutines were chosen for following reason.
287 * Each SPARC T4 core can execute up to 8 threads which share core's
288 * resources. Loading as much key material to registers allows to
289 * minimize references to shared memory interface, as well as amount
290 * of instructions in inner loops [much needed on T4]. But then having
291 * non-key-length specific routines would require conditional branches
292 * either in inner loops or on subroutines' entries. Former is hardly
293 * acceptable, while latter means code size increase to size occupied
294 * by multiple key-length specific subroutines, so why fight?
296 void aes128_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
297 size_t len, const AES_KEY *key,
298 unsigned char *ivec, int /*unused*/);
299 void aes128_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
300 size_t len, const AES_KEY *key,
301 unsigned char *ivec, int /*unused*/);
302 void aes192_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
303 size_t len, const AES_KEY *key,
304 unsigned char *ivec, int /*unused*/);
305 void aes192_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
306 size_t len, const AES_KEY *key,
307 unsigned char *ivec, int /*unused*/);
308 void aes256_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
309 size_t len, const AES_KEY *key,
310 unsigned char *ivec, int /*unused*/);
311 void aes256_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
312 size_t len, const AES_KEY *key,
313 unsigned char *ivec, int /*unused*/);
314 void aes128_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
315 size_t blocks, const AES_KEY *key,
316 unsigned char *ivec);
317 void aes192_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
318 size_t blocks, const AES_KEY *key,
319 unsigned char *ivec);
320 void aes256_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
321 size_t blocks, const AES_KEY *key,
322 unsigned char *ivec);
323 void aes128_t4_xts_encrypt(const unsigned char *in, unsigned char *out,
324 size_t blocks, const AES_KEY *key1,
325 const AES_KEY *key2, const unsigned char *ivec);
326 void aes128_t4_xts_decrypt(const unsigned char *in, unsigned char *out,
327 size_t blocks, const AES_KEY *key1,
328 const AES_KEY *key2, const unsigned char *ivec);
329 void aes256_t4_xts_encrypt(const unsigned char *in, unsigned char *out,
330 size_t blocks, const AES_KEY *key1,
331 const AES_KEY *key2, const unsigned char *ivec);
332 void aes256_t4_xts_decrypt(const unsigned char *in, unsigned char *out,
333 size_t blocks, const AES_KEY *key1,
334 const AES_KEY *key2, const unsigned char *ivec);
336 # elif defined(OPENSSL_CPUID_OBJ) && defined(__s390__)
337 /* IBM S390X support */
338 # include "s390x_arch.h"
341 /* Convert key size to function code: [16,24,32] -> [18,19,20]. */
342 # define S390X_AES_FC(keylen) (S390X_AES_128 + ((((keylen) << 3) - 128) >> 6))
344 /* Most modes of operation need km for partial block processing. */
345 # define S390X_aes_128_CAPABLE (OPENSSL_s390xcap_P.km[0] & \
346 S390X_CAPBIT(S390X_AES_128))
347 # define S390X_aes_192_CAPABLE (OPENSSL_s390xcap_P.km[0] & \
348 S390X_CAPBIT(S390X_AES_192))
349 # define S390X_aes_256_CAPABLE (OPENSSL_s390xcap_P.km[0] & \
350 S390X_CAPBIT(S390X_AES_256))
352 # define S390X_aes_128_cbc_CAPABLE 1 /* checked by callee */
353 # define S390X_aes_192_cbc_CAPABLE 1
354 # define S390X_aes_256_cbc_CAPABLE 1
356 # define S390X_aes_128_ecb_CAPABLE S390X_aes_128_CAPABLE
357 # define S390X_aes_192_ecb_CAPABLE S390X_aes_192_CAPABLE
358 # define S390X_aes_256_ecb_CAPABLE S390X_aes_256_CAPABLE
360 # define S390X_aes_128_ofb_CAPABLE (S390X_aes_128_CAPABLE && \
361 (OPENSSL_s390xcap_P.kmo[0] & \
362 S390X_CAPBIT(S390X_AES_128)))
363 # define S390X_aes_192_ofb_CAPABLE (S390X_aes_192_CAPABLE && \
364 (OPENSSL_s390xcap_P.kmo[0] & \
365 S390X_CAPBIT(S390X_AES_192)))
366 # define S390X_aes_256_ofb_CAPABLE (S390X_aes_256_CAPABLE && \
367 (OPENSSL_s390xcap_P.kmo[0] & \
368 S390X_CAPBIT(S390X_AES_256)))
370 # define S390X_aes_128_cfb_CAPABLE (S390X_aes_128_CAPABLE && \
371 (OPENSSL_s390xcap_P.kmf[0] & \
372 S390X_CAPBIT(S390X_AES_128)))
373 # define S390X_aes_192_cfb_CAPABLE (S390X_aes_192_CAPABLE && \
374 (OPENSSL_s390xcap_P.kmf[0] & \
375 S390X_CAPBIT(S390X_AES_192)))
376 # define S390X_aes_256_cfb_CAPABLE (S390X_aes_256_CAPABLE && \
377 (OPENSSL_s390xcap_P.kmf[0] & \
378 S390X_CAPBIT(S390X_AES_256)))
379 # define S390X_aes_128_cfb8_CAPABLE (OPENSSL_s390xcap_P.kmf[0] & \
380 S390X_CAPBIT(S390X_AES_128))
381 # define S390X_aes_192_cfb8_CAPABLE (OPENSSL_s390xcap_P.kmf[0] & \
382 S390X_CAPBIT(S390X_AES_192))
383 # define S390X_aes_256_cfb8_CAPABLE (OPENSSL_s390xcap_P.kmf[0] & \
384 S390X_CAPBIT(S390X_AES_256))
385 # define S390X_aes_128_cfb1_CAPABLE 0
386 # define S390X_aes_192_cfb1_CAPABLE 0
387 # define S390X_aes_256_cfb1_CAPABLE 0
389 # define S390X_aes_128_ctr_CAPABLE 1 /* checked by callee */
390 # define S390X_aes_192_ctr_CAPABLE 1
391 # define S390X_aes_256_ctr_CAPABLE 1
393 # define S390X_aes_128_xts_CAPABLE 1 /* checked by callee */
394 # define S390X_aes_256_xts_CAPABLE 1
396 # define S390X_aes_128_gcm_CAPABLE (S390X_aes_128_CAPABLE && \
397 (OPENSSL_s390xcap_P.kma[0] & \
398 S390X_CAPBIT(S390X_AES_128)))
399 # define S390X_aes_192_gcm_CAPABLE (S390X_aes_192_CAPABLE && \
400 (OPENSSL_s390xcap_P.kma[0] & \
401 S390X_CAPBIT(S390X_AES_192)))
402 # define S390X_aes_256_gcm_CAPABLE (S390X_aes_256_CAPABLE && \
403 (OPENSSL_s390xcap_P.kma[0] & \
404 S390X_CAPBIT(S390X_AES_256)))
406 # define S390X_aes_128_ccm_CAPABLE (S390X_aes_128_CAPABLE && \
407 (OPENSSL_s390xcap_P.kmac[0] & \
408 S390X_CAPBIT(S390X_AES_128)))
409 # define S390X_aes_192_ccm_CAPABLE (S390X_aes_192_CAPABLE && \
410 (OPENSSL_s390xcap_P.kmac[0] & \
411 S390X_CAPBIT(S390X_AES_192)))
412 # define S390X_aes_256_ccm_CAPABLE (S390X_aes_256_CAPABLE && \
413 (OPENSSL_s390xcap_P.kmac[0] & \
414 S390X_CAPBIT(S390X_AES_256)))
415 # define S390X_CCM_AAD_FLAG 0x40
417 # ifndef OPENSSL_NO_OCB
418 # define S390X_aes_128_ocb_CAPABLE 0
419 # define S390X_aes_192_ocb_CAPABLE 0
420 # define S390X_aes_256_ocb_CAPABLE 0
421 # endif /* OPENSSL_NO_OCB */
423 # ifndef OPENSSL_NO_SIV
424 # define S390X_aes_128_siv_CAPABLE 0
425 # define S390X_aes_192_siv_CAPABLE 0
426 # define S390X_aes_256_siv_CAPABLE 0
427 # endif /* OPENSSL_NO_SIV */
429 /* Convert key size to function code: [16,24,32] -> [18,19,20]. */
430 # define S390X_AES_FC(keylen) (S390X_AES_128 + ((((keylen) << 3) - 128) >> 6))
433 # if defined(HWAES_CAPABLE)
434 int HWAES_set_encrypt_key(const unsigned char *userKey, const int bits,
436 int HWAES_set_decrypt_key(const unsigned char *userKey, const int bits,
438 void HWAES_encrypt(const unsigned char *in, unsigned char *out,
440 void HWAES_decrypt(const unsigned char *in, unsigned char *out,
442 void HWAES_cbc_encrypt(const unsigned char *in, unsigned char *out,
443 size_t length, const AES_KEY *key,
444 unsigned char *ivec, const int enc);
445 void HWAES_ecb_encrypt(const unsigned char *in, unsigned char *out,
446 size_t length, const AES_KEY *key,
448 void HWAES_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out,
449 size_t len, const void *key,
450 const unsigned char ivec[16]);
451 void HWAES_xts_encrypt(const unsigned char *inp, unsigned char *out,
452 size_t len, const AES_KEY *key1,
453 const AES_KEY *key2, const unsigned char iv[16]);
454 void HWAES_xts_decrypt(const unsigned char *inp, unsigned char *out,
455 size_t len, const AES_KEY *key1,
456 const AES_KEY *key2, const unsigned char iv[16]);
457 # ifndef OPENSSL_NO_OCB
458 # ifdef HWAES_ocb_encrypt
459 void HWAES_ocb_encrypt(const unsigned char *in, unsigned char *out,
460 size_t blocks, const void *key,
461 size_t start_block_num,
462 unsigned char offset_i[16],
463 const unsigned char L_[][16],
464 unsigned char checksum[16]);
466 # define HWAES_ocb_encrypt ((ocb128_f)NULL)
468 # ifdef HWAES_ocb_decrypt
469 void HWAES_ocb_decrypt(const unsigned char *in, unsigned char *out,
470 size_t blocks, const void *key,
471 size_t start_block_num,
472 unsigned char offset_i[16],
473 const unsigned char L_[][16],
474 unsigned char checksum[16]);
476 # define HWAES_ocb_decrypt ((ocb128_f)NULL)
478 # endif /* OPENSSL_NO_OCB */
480 # endif /* HWAES_CAPABLE */
482 #endif /* OSSL_AES_PLATFORM_H */