VirtualBox

source: vbox/trunk/src/libs/openssl-3.3.2/include/crypto/aes_platform.h

最後變更 在這個檔案是 108206,由 vboxsync 提交於 5 週 前

openssl-3.3.2: Exported all files to OSE and removed .scm-settings ​bugref:10757

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 30.1 KB
 
1/*
2 * Copyright 2019-2024 The OpenSSL Project Authors. All Rights Reserved.
3 *
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
8 */
9
10#ifndef OSSL_AES_PLATFORM_H
11# define OSSL_AES_PLATFORM_H
12# ifndef RT_WITHOUT_PRAGMA_ONCE /* VBOX */
13# pragma once
14# endif /* VBOX */
15
16# include <openssl/aes.h>
17
18# ifdef VPAES_ASM
19int vpaes_set_encrypt_key(const unsigned char *userKey, int bits,
20 AES_KEY *key);
21int vpaes_set_decrypt_key(const unsigned char *userKey, int bits,
22 AES_KEY *key);
23void vpaes_encrypt(const unsigned char *in, unsigned char *out,
24 const AES_KEY *key);
25void vpaes_decrypt(const unsigned char *in, unsigned char *out,
26 const AES_KEY *key);
27void vpaes_cbc_encrypt(const unsigned char *in,
28 unsigned char *out,
29 size_t length,
30 const AES_KEY *key, unsigned char *ivec, int enc);
31# endif /* VPAES_ASM */
32
33# ifdef BSAES_ASM
34void ossl_bsaes_cbc_encrypt(const unsigned char *in, unsigned char *out,
35 size_t length, const AES_KEY *key,
36 unsigned char ivec[16], int enc);
37void ossl_bsaes_ctr32_encrypt_blocks(const unsigned char *in,
38 unsigned char *out, size_t len,
39 const AES_KEY *key,
40 const unsigned char ivec[16]);
41void ossl_bsaes_xts_encrypt(const unsigned char *inp, unsigned char *out,
42 size_t len, const AES_KEY *key1,
43 const AES_KEY *key2, const unsigned char iv[16]);
44void ossl_bsaes_xts_decrypt(const unsigned char *inp, unsigned char *out,
45 size_t len, const AES_KEY *key1,
46 const AES_KEY *key2, const unsigned char iv[16]);
47# endif /* BSAES_ASM */
48
49# ifdef AES_CTR_ASM
50void AES_ctr32_encrypt(const unsigned char *in, unsigned char *out,
51 size_t blocks, const AES_KEY *key,
52 const unsigned char ivec[AES_BLOCK_SIZE]);
53# endif /* AES_CTR_ASM */
54
55# ifdef AES_XTS_ASM
56void AES_xts_encrypt(const unsigned char *inp, unsigned char *out, size_t len,
57 const AES_KEY *key1, const AES_KEY *key2,
58 const unsigned char iv[16]);
59void AES_xts_decrypt(const unsigned char *inp, unsigned char *out, size_t len,
60 const AES_KEY *key1, const AES_KEY *key2,
61 const unsigned char iv[16]);
62# endif /* AES_XTS_ASM */
63
64# if defined(OPENSSL_CPUID_OBJ)
65# if (defined(__powerpc__) || defined(__POWERPC__) || defined(_ARCH_PPC))
66# include "crypto/ppc_arch.h"
67# ifdef VPAES_ASM
68# define VPAES_CAPABLE (OPENSSL_ppccap_P & PPC_ALTIVEC)
69# endif
70# if !defined(OPENSSL_SYS_MACOSX)
71# define HWAES_CAPABLE (OPENSSL_ppccap_P & PPC_CRYPTO207)
72# define HWAES_set_encrypt_key aes_p8_set_encrypt_key
73# define HWAES_set_decrypt_key aes_p8_set_decrypt_key
74# define HWAES_encrypt aes_p8_encrypt
75# define HWAES_decrypt aes_p8_decrypt
76# define HWAES_cbc_encrypt aes_p8_cbc_encrypt
77# define HWAES_ctr32_encrypt_blocks aes_p8_ctr32_encrypt_blocks
78# define HWAES_xts_encrypt aes_p8_xts_encrypt
79# define HWAES_xts_decrypt aes_p8_xts_decrypt
80# endif /* OPENSSL_SYS_MACOSX */
81# if !defined(OPENSSL_SYS_AIX) && !defined(OPENSSL_SYS_MACOSX)
82# define PPC_AES_GCM_CAPABLE (OPENSSL_ppccap_P & PPC_MADD300)
83# define AES_GCM_ENC_BYTES 128
84# define AES_GCM_DEC_BYTES 128
85size_t ppc_aes_gcm_encrypt(const unsigned char *in, unsigned char *out,
86 size_t len, const void *key, unsigned char ivec[16],
87 u64 *Xi);
88size_t ppc_aes_gcm_decrypt(const unsigned char *in, unsigned char *out,
89 size_t len, const void *key, unsigned char ivec[16],
90 u64 *Xi);
91# define AES_GCM_ASM_PPC(gctx) ((gctx)->ctr==aes_p8_ctr32_encrypt_blocks && \
92 (gctx)->gcm.funcs.ghash==gcm_ghash_p8)
93void gcm_ghash_p8(u64 Xi[2],const u128 Htable[16],const u8 *inp, size_t len);
94# endif /* OPENSSL_SYS_AIX || OPENSSL_SYS_MACOSX */
95# endif /* PPC */
96
97# if (defined(__arm__) || defined(__arm) || defined(__aarch64__) || defined(_M_ARM64))
98# include "arm_arch.h"
99# if __ARM_MAX_ARCH__>=7
100# if defined(BSAES_ASM)
101# define BSAES_CAPABLE (OPENSSL_armcap_P & ARMV7_NEON)
102# endif
103# if defined(VPAES_ASM)
104# define VPAES_CAPABLE (OPENSSL_armcap_P & ARMV7_NEON)
105# endif
106# define HWAES_CAPABLE (OPENSSL_armcap_P & ARMV8_AES)
107# define HWAES_set_encrypt_key aes_v8_set_encrypt_key
108# define HWAES_set_decrypt_key aes_v8_set_decrypt_key
109# define HWAES_encrypt aes_v8_encrypt
110# define HWAES_decrypt aes_v8_decrypt
111# define HWAES_cbc_encrypt aes_v8_cbc_encrypt
112# define HWAES_ecb_encrypt aes_v8_ecb_encrypt
113# if __ARM_MAX_ARCH__>=8 && (defined(__aarch64__) || defined(_M_ARM64))
114# define ARMv8_HWAES_CAPABLE (OPENSSL_armcap_P & ARMV8_AES)
115# define HWAES_xts_encrypt aes_v8_xts_encrypt
116# define HWAES_xts_decrypt aes_v8_xts_decrypt
117# endif
118# define HWAES_ctr32_encrypt_blocks aes_v8_ctr32_encrypt_blocks
119# define HWAES_ctr32_encrypt_blocks_unroll12_eor3 aes_v8_ctr32_encrypt_blocks_unroll12_eor3
120# define AES_PMULL_CAPABLE ((OPENSSL_armcap_P & ARMV8_PMULL) && (OPENSSL_armcap_P & ARMV8_AES))
121# define AES_UNROLL12_EOR3_CAPABLE (OPENSSL_armcap_P & ARMV8_UNROLL12_EOR3)
122# define AES_GCM_ENC_BYTES 512
123# define AES_GCM_DEC_BYTES 512
124# if __ARM_MAX_ARCH__>=8 && (defined(__aarch64__) || defined(_M_ARM64))
125# define AES_gcm_encrypt armv8_aes_gcm_encrypt
126# define AES_gcm_decrypt armv8_aes_gcm_decrypt
127# define AES_GCM_ASM(gctx) (((gctx)->ctr==aes_v8_ctr32_encrypt_blocks_unroll12_eor3 || \
128 (gctx)->ctr==aes_v8_ctr32_encrypt_blocks) && \
129 (gctx)->gcm.funcs.ghash==gcm_ghash_v8)
130/* The [unroll8_eor3_]aes_gcm_(enc|dec)_(128|192|256)_kernel() functions
131 * take input length in BITS and return number of BYTES processed */
132size_t aes_gcm_enc_128_kernel(const uint8_t *plaintext, uint64_t plaintext_length, uint8_t *ciphertext,
133 uint64_t *Xi, unsigned char ivec[16], const void *key);
134size_t aes_gcm_enc_192_kernel(const uint8_t *plaintext, uint64_t plaintext_length, uint8_t *ciphertext,
135 uint64_t *Xi, unsigned char ivec[16], const void *key);
136size_t aes_gcm_enc_256_kernel(const uint8_t *plaintext, uint64_t plaintext_length, uint8_t *ciphertext,
137 uint64_t *Xi, unsigned char ivec[16], const void *key);
138size_t aes_gcm_dec_128_kernel(const uint8_t *ciphertext, uint64_t plaintext_length, uint8_t *plaintext,
139 uint64_t *Xi, unsigned char ivec[16], const void *key);
140size_t aes_gcm_dec_192_kernel(const uint8_t *ciphertext, uint64_t plaintext_length, uint8_t *plaintext,
141 uint64_t *Xi, unsigned char ivec[16], const void *key);
142size_t aes_gcm_dec_256_kernel(const uint8_t *ciphertext, uint64_t plaintext_length, uint8_t *plaintext,
143 uint64_t *Xi, unsigned char ivec[16], const void *key);
144size_t unroll8_eor3_aes_gcm_enc_128_kernel(const uint8_t *plaintext, uint64_t plaintext_length, uint8_t *ciphertext,
145 uint64_t *Xi, unsigned char ivec[16], const void *key);
146size_t unroll8_eor3_aes_gcm_enc_192_kernel(const uint8_t *plaintext, uint64_t plaintext_length, uint8_t *ciphertext,
147 uint64_t *Xi, unsigned char ivec[16], const void *key);
148size_t unroll8_eor3_aes_gcm_enc_256_kernel(const uint8_t *plaintext, uint64_t plaintext_length, uint8_t *ciphertext,
149 uint64_t *Xi, unsigned char ivec[16], const void *key);
150size_t unroll8_eor3_aes_gcm_dec_128_kernel(const uint8_t *ciphertext, uint64_t plaintext_length, uint8_t *plaintext,
151 uint64_t *Xi, unsigned char ivec[16], const void *key);
152size_t unroll8_eor3_aes_gcm_dec_192_kernel(const uint8_t *ciphertext, uint64_t plaintext_length, uint8_t *plaintext,
153 uint64_t *Xi, unsigned char ivec[16], const void *key);
154size_t unroll8_eor3_aes_gcm_dec_256_kernel(const uint8_t *ciphertext, uint64_t plaintext_length, uint8_t *plaintext,
155 uint64_t *Xi, unsigned char ivec[16], const void *key);
156size_t armv8_aes_gcm_encrypt(const unsigned char *in, unsigned char *out, size_t len, const void *key,
157 unsigned char ivec[16], u64 *Xi);
158size_t armv8_aes_gcm_decrypt(const unsigned char *in, unsigned char *out, size_t len, const void *key,
159 unsigned char ivec[16], u64 *Xi);
160void gcm_ghash_v8(u64 Xi[2],const u128 Htable[16],const u8 *inp, size_t len);
161# endif
162# endif
163# endif
164# endif /* OPENSSL_CPUID_OBJ */
165
166# if defined(AES_ASM) && ( \
167 defined(__x86_64) || defined(__x86_64__) || \
168 defined(_M_AMD64) || defined(_M_X64) )
169# define AES_CBC_HMAC_SHA_CAPABLE 1
170# define AESNI_CBC_HMAC_SHA_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(57-32)))
171# endif
172
173# if defined(__loongarch__) || defined(__loongarch64)
174# include "loongarch_arch.h"
175# if defined(VPAES_ASM)
176# define VPAES_CAPABLE (OPENSSL_loongarch_hwcap_P & LOONGARCH_HWCAP_LSX)
177# endif
178# endif
179
180# if defined(AES_ASM) && !defined(I386_ONLY) && ( \
181 ((defined(__i386) || defined(__i386__) || \
182 defined(_M_IX86)) && defined(OPENSSL_IA32_SSE2))|| \
183 defined(__x86_64) || defined(__x86_64__) || \
184 defined(_M_AMD64) || defined(_M_X64) )
185
186/* AES-NI section */
187
188# define AESNI_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(57-32)))
189# ifdef VPAES_ASM
190# define VPAES_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(41-32)))
191# endif
192# ifdef BSAES_ASM
193# define BSAES_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(41-32)))
194# endif
195
196# define AES_GCM_ENC_BYTES 32
197# define AES_GCM_DEC_BYTES 16
198
199int aesni_set_encrypt_key(const unsigned char *userKey, int bits,
200 AES_KEY *key);
201int aesni_set_decrypt_key(const unsigned char *userKey, int bits,
202 AES_KEY *key);
203
204void aesni_encrypt(const unsigned char *in, unsigned char *out,
205 const AES_KEY *key);
206void aesni_decrypt(const unsigned char *in, unsigned char *out,
207 const AES_KEY *key);
208
209void aesni_ecb_encrypt(const unsigned char *in,
210 unsigned char *out,
211 size_t length, const AES_KEY *key, int enc);
212void aesni_cbc_encrypt(const unsigned char *in,
213 unsigned char *out,
214 size_t length,
215 const AES_KEY *key, unsigned char *ivec, int enc);
216# ifndef OPENSSL_NO_OCB
217void aesni_ocb_encrypt(const unsigned char *in, unsigned char *out,
218 size_t blocks, const void *key,
219 size_t start_block_num,
220 unsigned char offset_i[16],
221 const unsigned char L_[][16],
222 unsigned char checksum[16]);
223void aesni_ocb_decrypt(const unsigned char *in, unsigned char *out,
224 size_t blocks, const void *key,
225 size_t start_block_num,
226 unsigned char offset_i[16],
227 const unsigned char L_[][16],
228 unsigned char checksum[16]);
229# endif /* OPENSSL_NO_OCB */
230
231void aesni_ctr32_encrypt_blocks(const unsigned char *in,
232 unsigned char *out,
233 size_t blocks,
234 const void *key, const unsigned char *ivec);
235
236void aesni_xts_encrypt(const unsigned char *in,
237 unsigned char *out,
238 size_t length,
239 const AES_KEY *key1, const AES_KEY *key2,
240 const unsigned char iv[16]);
241
242void aesni_xts_decrypt(const unsigned char *in,
243 unsigned char *out,
244 size_t length,
245 const AES_KEY *key1, const AES_KEY *key2,
246 const unsigned char iv[16]);
247
248void aesni_ccm64_encrypt_blocks(const unsigned char *in,
249 unsigned char *out,
250 size_t blocks,
251 const void *key,
252 const unsigned char ivec[16],
253 unsigned char cmac[16]);
254
255void aesni_ccm64_decrypt_blocks(const unsigned char *in,
256 unsigned char *out,
257 size_t blocks,
258 const void *key,
259 const unsigned char ivec[16],
260 unsigned char cmac[16]);
261
262# if defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64)
263size_t aesni_gcm_encrypt(const unsigned char *in, unsigned char *out, size_t len,
264 const void *key, unsigned char ivec[16], u64 *Xi);
265size_t aesni_gcm_decrypt(const unsigned char *in, unsigned char *out, size_t len,
266 const void *key, unsigned char ivec[16], u64 *Xi);
267void gcm_ghash_avx(u64 Xi[2], const u128 Htable[16], const u8 *in, size_t len);
268
269# define AES_gcm_encrypt aesni_gcm_encrypt
270# define AES_gcm_decrypt aesni_gcm_decrypt
271# define AES_GCM_ASM(ctx) (ctx->ctr == aesni_ctr32_encrypt_blocks && \
272 ctx->gcm.funcs.ghash == gcm_ghash_avx)
273# endif
274
275
276# elif defined(AES_ASM) && (defined(__sparc) || defined(__sparc__))
277
278/* Fujitsu SPARC64 X support */
279# include "crypto/sparc_arch.h"
280
281# define SPARC_AES_CAPABLE (OPENSSL_sparcv9cap_P[1] & CFR_AES)
282# define HWAES_CAPABLE (OPENSSL_sparcv9cap_P[0] & SPARCV9_FJAESX)
283# define HWAES_set_encrypt_key aes_fx_set_encrypt_key
284# define HWAES_set_decrypt_key aes_fx_set_decrypt_key
285# define HWAES_encrypt aes_fx_encrypt
286# define HWAES_decrypt aes_fx_decrypt
287# define HWAES_cbc_encrypt aes_fx_cbc_encrypt
288# define HWAES_ctr32_encrypt_blocks aes_fx_ctr32_encrypt_blocks
289
290void aes_t4_set_encrypt_key(const unsigned char *key, int bits, AES_KEY *ks);
291void aes_t4_set_decrypt_key(const unsigned char *key, int bits, AES_KEY *ks);
292void aes_t4_encrypt(const unsigned char *in, unsigned char *out,
293 const AES_KEY *key);
294void aes_t4_decrypt(const unsigned char *in, unsigned char *out,
295 const AES_KEY *key);
296/*
297 * Key-length specific subroutines were chosen for following reason.
298 * Each SPARC T4 core can execute up to 8 threads which share core's
299 * resources. Loading as much key material to registers allows to
300 * minimize references to shared memory interface, as well as amount
301 * of instructions in inner loops [much needed on T4]. But then having
302 * non-key-length specific routines would require conditional branches
303 * either in inner loops or on subroutines' entries. Former is hardly
304 * acceptable, while latter means code size increase to size occupied
305 * by multiple key-length specific subroutines, so why fight?
306 */
307void aes128_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
308 size_t len, const AES_KEY *key,
309 unsigned char *ivec, int /*unused*/);
310void aes128_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
311 size_t len, const AES_KEY *key,
312 unsigned char *ivec, int /*unused*/);
313void aes192_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
314 size_t len, const AES_KEY *key,
315 unsigned char *ivec, int /*unused*/);
316void aes192_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
317 size_t len, const AES_KEY *key,
318 unsigned char *ivec, int /*unused*/);
319void aes256_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
320 size_t len, const AES_KEY *key,
321 unsigned char *ivec, int /*unused*/);
322void aes256_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
323 size_t len, const AES_KEY *key,
324 unsigned char *ivec, int /*unused*/);
325void aes128_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
326 size_t blocks, const AES_KEY *key,
327 unsigned char *ivec);
328void aes192_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
329 size_t blocks, const AES_KEY *key,
330 unsigned char *ivec);
331void aes256_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
332 size_t blocks, const AES_KEY *key,
333 unsigned char *ivec);
334void aes128_t4_xts_encrypt(const unsigned char *in, unsigned char *out,
335 size_t blocks, const AES_KEY *key1,
336 const AES_KEY *key2, const unsigned char *ivec);
337void aes128_t4_xts_decrypt(const unsigned char *in, unsigned char *out,
338 size_t blocks, const AES_KEY *key1,
339 const AES_KEY *key2, const unsigned char *ivec);
340void aes256_t4_xts_encrypt(const unsigned char *in, unsigned char *out,
341 size_t blocks, const AES_KEY *key1,
342 const AES_KEY *key2, const unsigned char *ivec);
343void aes256_t4_xts_decrypt(const unsigned char *in, unsigned char *out,
344 size_t blocks, const AES_KEY *key1,
345 const AES_KEY *key2, const unsigned char *ivec);
346
347# elif defined(OPENSSL_CPUID_OBJ) && defined(__s390__)
348/* IBM S390X support */
349# include "s390x_arch.h"
350
351
352/* Convert key size to function code: [16,24,32] -> [18,19,20]. */
353# define S390X_AES_FC(keylen) (S390X_AES_128 + ((((keylen) << 3) - 128) >> 6))
354
355/* Most modes of operation need km for partial block processing. */
356# define S390X_aes_128_CAPABLE (OPENSSL_s390xcap_P.km[0] & \
357 S390X_CAPBIT(S390X_AES_128))
358# define S390X_aes_192_CAPABLE (OPENSSL_s390xcap_P.km[0] & \
359 S390X_CAPBIT(S390X_AES_192))
360# define S390X_aes_256_CAPABLE (OPENSSL_s390xcap_P.km[0] & \
361 S390X_CAPBIT(S390X_AES_256))
362
363# define S390X_aes_128_cbc_CAPABLE 1 /* checked by callee */
364# define S390X_aes_192_cbc_CAPABLE 1
365# define S390X_aes_256_cbc_CAPABLE 1
366
367# define S390X_aes_128_ecb_CAPABLE S390X_aes_128_CAPABLE
368# define S390X_aes_192_ecb_CAPABLE S390X_aes_192_CAPABLE
369# define S390X_aes_256_ecb_CAPABLE S390X_aes_256_CAPABLE
370
371# define S390X_aes_128_ofb_CAPABLE (S390X_aes_128_CAPABLE && \
372 (OPENSSL_s390xcap_P.kmo[0] & \
373 S390X_CAPBIT(S390X_AES_128)))
374# define S390X_aes_192_ofb_CAPABLE (S390X_aes_192_CAPABLE && \
375 (OPENSSL_s390xcap_P.kmo[0] & \
376 S390X_CAPBIT(S390X_AES_192)))
377# define S390X_aes_256_ofb_CAPABLE (S390X_aes_256_CAPABLE && \
378 (OPENSSL_s390xcap_P.kmo[0] & \
379 S390X_CAPBIT(S390X_AES_256)))
380
381# define S390X_aes_128_cfb_CAPABLE (S390X_aes_128_CAPABLE && \
382 (OPENSSL_s390xcap_P.kmf[0] & \
383 S390X_CAPBIT(S390X_AES_128)))
384# define S390X_aes_192_cfb_CAPABLE (S390X_aes_192_CAPABLE && \
385 (OPENSSL_s390xcap_P.kmf[0] & \
386 S390X_CAPBIT(S390X_AES_192)))
387# define S390X_aes_256_cfb_CAPABLE (S390X_aes_256_CAPABLE && \
388 (OPENSSL_s390xcap_P.kmf[0] & \
389 S390X_CAPBIT(S390X_AES_256)))
390# define S390X_aes_128_cfb8_CAPABLE (OPENSSL_s390xcap_P.kmf[0] & \
391 S390X_CAPBIT(S390X_AES_128))
392# define S390X_aes_192_cfb8_CAPABLE (OPENSSL_s390xcap_P.kmf[0] & \
393 S390X_CAPBIT(S390X_AES_192))
394# define S390X_aes_256_cfb8_CAPABLE (OPENSSL_s390xcap_P.kmf[0] & \
395 S390X_CAPBIT(S390X_AES_256))
396# define S390X_aes_128_cfb1_CAPABLE 0
397# define S390X_aes_192_cfb1_CAPABLE 0
398# define S390X_aes_256_cfb1_CAPABLE 0
399
400# define S390X_aes_128_ctr_CAPABLE 1 /* checked by callee */
401# define S390X_aes_192_ctr_CAPABLE 1
402# define S390X_aes_256_ctr_CAPABLE 1
403
404# define S390X_aes_128_xts_CAPABLE 1 /* checked by callee */
405# define S390X_aes_256_xts_CAPABLE 1
406
407# define S390X_aes_128_gcm_CAPABLE (S390X_aes_128_CAPABLE && \
408 (OPENSSL_s390xcap_P.kma[0] & \
409 S390X_CAPBIT(S390X_AES_128)))
410# define S390X_aes_192_gcm_CAPABLE (S390X_aes_192_CAPABLE && \
411 (OPENSSL_s390xcap_P.kma[0] & \
412 S390X_CAPBIT(S390X_AES_192)))
413# define S390X_aes_256_gcm_CAPABLE (S390X_aes_256_CAPABLE && \
414 (OPENSSL_s390xcap_P.kma[0] & \
415 S390X_CAPBIT(S390X_AES_256)))
416
417# define S390X_aes_128_ccm_CAPABLE (S390X_aes_128_CAPABLE && \
418 (OPENSSL_s390xcap_P.kmac[0] & \
419 S390X_CAPBIT(S390X_AES_128)))
420# define S390X_aes_192_ccm_CAPABLE (S390X_aes_192_CAPABLE && \
421 (OPENSSL_s390xcap_P.kmac[0] & \
422 S390X_CAPBIT(S390X_AES_192)))
423# define S390X_aes_256_ccm_CAPABLE (S390X_aes_256_CAPABLE && \
424 (OPENSSL_s390xcap_P.kmac[0] & \
425 S390X_CAPBIT(S390X_AES_256)))
426# define S390X_CCM_AAD_FLAG 0x40
427
428# ifndef OPENSSL_NO_OCB
429# define S390X_aes_128_ocb_CAPABLE 0
430# define S390X_aes_192_ocb_CAPABLE 0
431# define S390X_aes_256_ocb_CAPABLE 0
432# endif /* OPENSSL_NO_OCB */
433
434# ifndef OPENSSL_NO_SIV
435# define S390X_aes_128_siv_CAPABLE 0
436# define S390X_aes_192_siv_CAPABLE 0
437# define S390X_aes_256_siv_CAPABLE 0
438# endif /* OPENSSL_NO_SIV */
439
440/* Convert key size to function code: [16,24,32] -> [18,19,20]. */
441# define S390X_AES_FC(keylen) (S390X_AES_128 + ((((keylen) << 3) - 128) >> 6))
442# elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 64
443/* RISC-V 64 support */
444# include "riscv_arch.h"
445
446/* Zkne and Zknd extensions (scalar crypto AES). */
447int rv64i_zkne_set_encrypt_key(const unsigned char *userKey, const int bits,
448 AES_KEY *key);
449int rv64i_zknd_set_decrypt_key(const unsigned char *userKey, const int bits,
450 AES_KEY *key);
451void rv64i_zkne_encrypt(const unsigned char *in, unsigned char *out,
452 const AES_KEY *key);
453void rv64i_zknd_decrypt(const unsigned char *in, unsigned char *out,
454 const AES_KEY *key);
455/* Zvkned extension (vector crypto AES). */
456int rv64i_zvkned_set_encrypt_key(const unsigned char *userKey, const int bits,
457 AES_KEY *key);
458int rv64i_zvkned_set_decrypt_key(const unsigned char *userKey, const int bits,
459 AES_KEY *key);
460void rv64i_zvkned_encrypt(const unsigned char *in, unsigned char *out,
461 const AES_KEY *key);
462void rv64i_zvkned_decrypt(const unsigned char *in, unsigned char *out,
463 const AES_KEY *key);
464
465void rv64i_zvkned_cbc_encrypt(const unsigned char *in, unsigned char *out,
466 size_t length, const AES_KEY *key,
467 unsigned char *ivec, const int enc);
468
469void rv64i_zvkned_cbc_decrypt(const unsigned char *in, unsigned char *out,
470 size_t length, const AES_KEY *key,
471 unsigned char *ivec, const int enc);
472
473void rv64i_zvkned_ecb_encrypt(const unsigned char *in, unsigned char *out,
474 size_t length, const AES_KEY *key,
475 const int enc);
476
477void rv64i_zvkned_ecb_decrypt(const unsigned char *in, unsigned char *out,
478 size_t length, const AES_KEY *key,
479 const int enc);
480
481void rv64i_zvkb_zvkned_ctr32_encrypt_blocks(const unsigned char *in,
482 unsigned char *out, size_t blocks,
483 const void *key,
484 const unsigned char ivec[16]);
485
486size_t rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt(const unsigned char *in,
487 unsigned char *out, size_t len,
488 const void *key,
489 unsigned char ivec[16], u64 *Xi);
490
491size_t rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt(const unsigned char *in,
492 unsigned char *out, size_t len,
493 const void *key,
494 unsigned char ivec[16], u64 *Xi);
495
496void rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt(const unsigned char *in,
497 unsigned char *out, size_t length,
498 const AES_KEY *key1,
499 const AES_KEY *key2,
500 const unsigned char iv[16]);
501
502void rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt(const unsigned char *in,
503 unsigned char *out, size_t length,
504 const AES_KEY *key1,
505 const AES_KEY *key2,
506 const unsigned char iv[16]);
507
508void gcm_ghash_rv64i_zvkg(u64 Xi[2], const u128 Htable[16], const u8 *inp,
509 size_t len);
510
511#define AES_GCM_ENC_BYTES 64
512#define AES_GCM_DEC_BYTES 64
513#define AES_gcm_encrypt rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt
514#define AES_gcm_decrypt rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt
515#define AES_GCM_ASM(ctx) \
516 (ctx->ctr == rv64i_zvkb_zvkned_ctr32_encrypt_blocks && \
517 ctx->gcm.funcs.ghash == gcm_ghash_rv64i_zvkg)
518
519# elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 32
520/* RISC-V 32 support */
521# include "riscv_arch.h"
522
523int rv32i_zkne_set_encrypt_key(const unsigned char *userKey, const int bits,
524 AES_KEY *key);
525/* set_decrypt_key needs both zknd and zkne */
526int rv32i_zknd_zkne_set_decrypt_key(const unsigned char *userKey, const int bits,
527 AES_KEY *key);
528int rv32i_zbkb_zkne_set_encrypt_key(const unsigned char *userKey, const int bits,
529 AES_KEY *key);
530int rv32i_zbkb_zknd_zkne_set_decrypt_key(const unsigned char *userKey, const int bits,
531 AES_KEY *key);
532void rv32i_zkne_encrypt(const unsigned char *in, unsigned char *out,
533 const AES_KEY *key);
534void rv32i_zknd_decrypt(const unsigned char *in, unsigned char *out,
535 const AES_KEY *key);
536# endif
537
538# if defined(HWAES_CAPABLE)
539int HWAES_set_encrypt_key(const unsigned char *userKey, const int bits,
540 AES_KEY *key);
541int HWAES_set_decrypt_key(const unsigned char *userKey, const int bits,
542 AES_KEY *key);
543void HWAES_encrypt(const unsigned char *in, unsigned char *out,
544 const AES_KEY *key);
545void HWAES_decrypt(const unsigned char *in, unsigned char *out,
546 const AES_KEY *key);
547void HWAES_cbc_encrypt(const unsigned char *in, unsigned char *out,
548 size_t length, const AES_KEY *key,
549 unsigned char *ivec, const int enc);
550void HWAES_ecb_encrypt(const unsigned char *in, unsigned char *out,
551 size_t length, const AES_KEY *key,
552 const int enc);
553void HWAES_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out,
554 size_t len, const void *key,
555 const unsigned char ivec[16]);
556# if defined(AES_UNROLL12_EOR3_CAPABLE)
557void HWAES_ctr32_encrypt_blocks_unroll12_eor3(const unsigned char *in, unsigned char *out,
558 size_t len, const void *key,
559 const unsigned char ivec[16]);
560# endif
561void HWAES_xts_encrypt(const unsigned char *inp, unsigned char *out,
562 size_t len, const AES_KEY *key1,
563 const AES_KEY *key2, const unsigned char iv[16]);
564void HWAES_xts_decrypt(const unsigned char *inp, unsigned char *out,
565 size_t len, const AES_KEY *key1,
566 const AES_KEY *key2, const unsigned char iv[16]);
567# ifndef OPENSSL_NO_OCB
568# ifdef HWAES_ocb_encrypt
569void HWAES_ocb_encrypt(const unsigned char *in, unsigned char *out,
570 size_t blocks, const void *key,
571 size_t start_block_num,
572 unsigned char offset_i[16],
573 const unsigned char L_[][16],
574 unsigned char checksum[16]);
575# else
576# define HWAES_ocb_encrypt ((ocb128_f)NULL)
577# endif
578# ifdef HWAES_ocb_decrypt
579void HWAES_ocb_decrypt(const unsigned char *in, unsigned char *out,
580 size_t blocks, const void *key,
581 size_t start_block_num,
582 unsigned char offset_i[16],
583 const unsigned char L_[][16],
584 unsigned char checksum[16]);
585# else
586# define HWAES_ocb_decrypt ((ocb128_f)NULL)
587# endif
588# endif /* OPENSSL_NO_OCB */
589
590# endif /* HWAES_CAPABLE */
591
592#endif /* OSSL_AES_PLATFORM_H */
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette