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