/src/openssl/providers/implementations/ciphers/cipher_aes_hw.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2001-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 | | /* |
11 | | * This file uses the low level AES functions (which are deprecated for |
12 | | * non-internal use) in order to implement provider AES ciphers. |
13 | | */ |
14 | | #include "internal/deprecated.h" |
15 | | |
16 | | #include <openssl/proverr.h> |
17 | | #include "cipher_aes.h" |
18 | | |
19 | | static int cipher_hw_aes_initkey(PROV_CIPHER_CTX *dat, |
20 | | const unsigned char *key, size_t keylen) |
21 | 0 | { |
22 | 0 | int ret; |
23 | 0 | PROV_AES_CTX *adat = (PROV_AES_CTX *)dat; |
24 | 0 | AES_KEY *ks = &adat->ks.ks; |
25 | |
|
26 | 0 | dat->ks = ks; |
27 | |
|
28 | 0 | if ((dat->mode == EVP_CIPH_ECB_MODE || dat->mode == EVP_CIPH_CBC_MODE) |
29 | 0 | && !dat->enc) { |
30 | | #ifdef HWAES_CAPABLE |
31 | | if (HWAES_CAPABLE) { |
32 | | ret = HWAES_set_decrypt_key(key, keylen * 8, ks); |
33 | | dat->block = (block128_f)HWAES_decrypt; |
34 | | dat->stream.cbc = NULL; |
35 | | # ifdef HWAES_cbc_encrypt |
36 | | if (dat->mode == EVP_CIPH_CBC_MODE) |
37 | | dat->stream.cbc = (cbc128_f)HWAES_cbc_encrypt; |
38 | | # endif |
39 | | # ifdef HWAES_ecb_encrypt |
40 | | if (dat->mode == EVP_CIPH_ECB_MODE) |
41 | | dat->stream.ecb = (ecb128_f)HWAES_ecb_encrypt; |
42 | | # endif |
43 | | } else |
44 | | #endif |
45 | 0 | #ifdef BSAES_CAPABLE |
46 | 0 | if (BSAES_CAPABLE && dat->mode == EVP_CIPH_CBC_MODE) { |
47 | 0 | ret = AES_set_decrypt_key(key, keylen * 8, ks); |
48 | 0 | dat->block = (block128_f)AES_decrypt; |
49 | 0 | dat->stream.cbc = (cbc128_f)ossl_bsaes_cbc_encrypt; |
50 | 0 | } else |
51 | 0 | #endif |
52 | 0 | #ifdef VPAES_CAPABLE |
53 | 0 | if (VPAES_CAPABLE) { |
54 | 0 | ret = vpaes_set_decrypt_key(key, keylen * 8, ks); |
55 | 0 | dat->block = (block128_f)vpaes_decrypt; |
56 | 0 | dat->stream.cbc = (dat->mode == EVP_CIPH_CBC_MODE) |
57 | 0 | ?(cbc128_f)vpaes_cbc_encrypt : NULL; |
58 | 0 | } else |
59 | 0 | #endif |
60 | 0 | { |
61 | 0 | ret = AES_set_decrypt_key(key, keylen * 8, ks); |
62 | 0 | dat->block = (block128_f)AES_decrypt; |
63 | 0 | dat->stream.cbc = (dat->mode == EVP_CIPH_CBC_MODE) |
64 | 0 | ? (cbc128_f)AES_cbc_encrypt : NULL; |
65 | 0 | } |
66 | 0 | } else |
67 | | #ifdef HWAES_CAPABLE |
68 | | if (HWAES_CAPABLE) { |
69 | | ret = HWAES_set_encrypt_key(key, keylen * 8, ks); |
70 | | dat->block = (block128_f)HWAES_encrypt; |
71 | | dat->stream.cbc = NULL; |
72 | | # ifdef HWAES_cbc_encrypt |
73 | | if (dat->mode == EVP_CIPH_CBC_MODE) |
74 | | dat->stream.cbc = (cbc128_f)HWAES_cbc_encrypt; |
75 | | else |
76 | | # endif |
77 | | # ifdef HWAES_ecb_encrypt |
78 | | if (dat->mode == EVP_CIPH_ECB_MODE) |
79 | | dat->stream.ecb = (ecb128_f)HWAES_ecb_encrypt; |
80 | | else |
81 | | # endif |
82 | | # ifdef HWAES_ctr32_encrypt_blocks |
83 | | if (dat->mode == EVP_CIPH_CTR_MODE) |
84 | | dat->stream.ctr = (ctr128_f)HWAES_ctr32_encrypt_blocks; |
85 | | else |
86 | | # endif |
87 | | (void)0; /* terminate potentially open 'else' */ |
88 | | } else |
89 | | #endif |
90 | 0 | #ifdef BSAES_CAPABLE |
91 | 0 | if (BSAES_CAPABLE && dat->mode == EVP_CIPH_CTR_MODE) { |
92 | 0 | ret = AES_set_encrypt_key(key, keylen * 8, ks); |
93 | 0 | dat->block = (block128_f)AES_encrypt; |
94 | 0 | dat->stream.ctr = (ctr128_f)ossl_bsaes_ctr32_encrypt_blocks; |
95 | 0 | } else |
96 | 0 | #endif |
97 | 0 | #ifdef VPAES_CAPABLE |
98 | 0 | if (VPAES_CAPABLE) { |
99 | 0 | ret = vpaes_set_encrypt_key(key, keylen * 8, ks); |
100 | 0 | dat->block = (block128_f)vpaes_encrypt; |
101 | 0 | dat->stream.cbc = (dat->mode == EVP_CIPH_CBC_MODE) |
102 | 0 | ? (cbc128_f)vpaes_cbc_encrypt : NULL; |
103 | 0 | } else |
104 | 0 | #endif |
105 | 0 | { |
106 | 0 | ret = AES_set_encrypt_key(key, keylen * 8, ks); |
107 | 0 | dat->block = (block128_f)AES_encrypt; |
108 | 0 | dat->stream.cbc = (dat->mode == EVP_CIPH_CBC_MODE) |
109 | 0 | ? (cbc128_f)AES_cbc_encrypt : NULL; |
110 | | #ifdef AES_CTR_ASM |
111 | | if (dat->mode == EVP_CIPH_CTR_MODE) |
112 | | dat->stream.ctr = (ctr128_f)AES_ctr32_encrypt; |
113 | | #endif |
114 | 0 | } |
115 | |
|
116 | 0 | if (ret < 0) { |
117 | 0 | ERR_raise(ERR_LIB_PROV, PROV_R_KEY_SETUP_FAILED); |
118 | 0 | return 0; |
119 | 0 | } |
120 | | |
121 | 0 | return 1; |
122 | 0 | } |
123 | | |
124 | | IMPLEMENT_CIPHER_HW_COPYCTX(cipher_hw_aes_copyctx, PROV_AES_CTX) |
125 | | |
126 | | #define PROV_CIPHER_HW_aes_mode(mode) \ |
127 | | static const PROV_CIPHER_HW aes_##mode = { \ |
128 | | cipher_hw_aes_initkey, \ |
129 | | ossl_cipher_hw_generic_##mode, \ |
130 | | cipher_hw_aes_copyctx \ |
131 | | }; \ |
132 | | PROV_CIPHER_HW_declare(mode) \ |
133 | 91.2k | const PROV_CIPHER_HW *ossl_prov_cipher_hw_aes_##mode(size_t keybits) \ |
134 | 91.2k | { \ |
135 | 91.2k | PROV_CIPHER_HW_select(mode) \ |
136 | 91.2k | return &aes_##mode; \ |
137 | 91.2k | } ossl_prov_cipher_hw_aes_cbc Line | Count | Source | 133 | 2.20k | const PROV_CIPHER_HW *ossl_prov_cipher_hw_aes_##mode(size_t keybits) \ | 134 | 2.20k | { \ | 135 | 2.20k | PROV_CIPHER_HW_select(mode) \ | 136 | 2.20k | return &aes_##mode; \ | 137 | 2.20k | } |
ossl_prov_cipher_hw_aes_ecb Line | Count | Source | 133 | 89.0k | const PROV_CIPHER_HW *ossl_prov_cipher_hw_aes_##mode(size_t keybits) \ | 134 | 89.0k | { \ | 135 | 89.0k | PROV_CIPHER_HW_select(mode) \ | 136 | 89.0k | return &aes_##mode; \ | 137 | 89.0k | } |
Unexecuted instantiation: ossl_prov_cipher_hw_aes_ofb128 Unexecuted instantiation: ossl_prov_cipher_hw_aes_cfb128 Unexecuted instantiation: ossl_prov_cipher_hw_aes_cfb1 Unexecuted instantiation: ossl_prov_cipher_hw_aes_cfb8 ossl_prov_cipher_hw_aes_ctr Line | Count | Source | 133 | 17 | const PROV_CIPHER_HW *ossl_prov_cipher_hw_aes_##mode(size_t keybits) \ | 134 | 17 | { \ | 135 | 17 | PROV_CIPHER_HW_select(mode) \ | 136 | 17 | return &aes_##mode; \ | 137 | 17 | } |
|
138 | | |
139 | | #if defined(AESNI_CAPABLE) |
140 | | # include "cipher_aes_hw_aesni.inc" |
141 | | #elif defined(SPARC_AES_CAPABLE) |
142 | | # include "cipher_aes_hw_t4.inc" |
143 | | #elif defined(S390X_aes_128_CAPABLE) |
144 | | # include "cipher_aes_hw_s390x.inc" |
145 | | #elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 64 |
146 | | # include "cipher_aes_hw_rv64i.inc" |
147 | | #elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 32 |
148 | | # include "cipher_aes_hw_rv32i.inc" |
149 | | #elif defined (ARMv8_HWAES_CAPABLE) |
150 | | # include "cipher_aes_hw_armv8.inc" |
151 | | #else |
152 | | /* The generic case */ |
153 | | # define PROV_CIPHER_HW_declare(mode) |
154 | | # define PROV_CIPHER_HW_select(mode) |
155 | | #endif |
156 | | |
157 | | PROV_CIPHER_HW_aes_mode(cbc) |
158 | | PROV_CIPHER_HW_aes_mode(ecb) |
159 | | PROV_CIPHER_HW_aes_mode(ofb128) |
160 | | PROV_CIPHER_HW_aes_mode(cfb128) |
161 | | PROV_CIPHER_HW_aes_mode(cfb1) |
162 | | PROV_CIPHER_HW_aes_mode(cfb8) |
163 | | PROV_CIPHER_HW_aes_mode(ctr) |