]> git.proxmox.com Git - ceph.git/blob - ceph/src/crypto/isa-l/isa-l_crypto/aes/ossl_helper.h
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / crypto / isa-l / isa-l_crypto / aes / ossl_helper.h
1 /**********************************************************************
2 Copyright(c) 2011-2016 Intel Corporation All rights reserved.
3
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
6 are met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in
11 the documentation and/or other materials provided with the
12 distribution.
13 * Neither the name of Intel Corporation nor the names of its
14 contributors may be used to endorse or promote products derived
15 from this software without specific prior written permission.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 **********************************************************************/
29
30 #ifndef AES_OSSL_HELPER_H_
31 #define AES_OSSL_HELPER_H_
32
33 #ifdef _MSC_VER
34 # define inline __inline
35 #endif
36
37 #include <openssl/evp.h>
38
39 static inline
40 int openssl_aes_128_cbc_dec(uint8_t * key, uint8_t * iv,
41 int len, uint8_t * cyphertext, uint8_t * plaintext)
42 {
43 int outlen = 0, tmplen = 0;
44 EVP_CIPHER_CTX ctx;
45
46 EVP_CIPHER_CTX_init(&ctx);
47 if (!EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv))
48 printf("\n ERROR!! EVP_DecryptInit_ex - EVP_aes_128_cbc\n");
49 if (!EVP_CIPHER_CTX_set_padding(&ctx, 0))
50 printf("\n ERROR!! EVP_CIPHER_CTX_set_padding - no padding\n");
51 if (!EVP_DecryptUpdate(&ctx, plaintext, &outlen, (uint8_t const *)cyphertext, len))
52 printf("\n ERROR!! EVP_DecryptUpdate - EVP_aes_128_cbc\n");
53 if (!EVP_DecryptFinal_ex(&ctx, &plaintext[outlen], &tmplen))
54 printf("\n ERROR!! EVP_DecryptFinal_ex - EVP_aes_128_cbc %x, %x, %x\n", len,
55 outlen, tmplen);
56
57 return tmplen;
58 }
59
60 static inline
61 int openssl_aes_128_cbc_enc(uint8_t * key, uint8_t * iv,
62 int len, uint8_t * plaintext, uint8_t * cyphertext)
63 {
64 int outlen, tmplen;
65 EVP_CIPHER_CTX ctx;
66
67 EVP_CIPHER_CTX_init(&ctx);
68 if (!EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv))
69 printf("\n ERROR!! EVP_EncryptInit_ex - EVP_aes_128_cbc\n");
70 if (!EVP_CIPHER_CTX_set_padding(&ctx, 0))
71 printf("\n ERROR!! EVP_CIPHER_CTX_set_padding - no padding\n");
72 if (!EVP_EncryptUpdate
73 (&ctx, cyphertext, &outlen, (const unsigned char *)plaintext, len))
74 printf("\n ERROR!! EVP_EncryptUpdate - EVP_aes_128_cbc\n");
75 if (!EVP_EncryptFinal_ex(&ctx, cyphertext + outlen, &tmplen))
76 printf("\n ERROR!! EVP_EncryptFinal_ex - EVP_aes_128_cbc\n");
77
78 return tmplen;
79 }
80
81 static inline
82 int openssl_aes_192_cbc_dec(uint8_t * key, uint8_t * iv,
83 int len, uint8_t * cyphertext, uint8_t * plaintext)
84 {
85 int outlen = 0, tmplen = 0;
86 EVP_CIPHER_CTX CTX;
87 EVP_CIPHER_CTX *ctx = &CTX;
88
89 EVP_CIPHER_CTX_init(ctx);
90 if (!EVP_DecryptInit_ex(ctx, EVP_aes_192_cbc(), NULL, key, iv))
91 printf("\n ERROR!! EVP_DecryptInit_ex - EVP_aes_192_cbc\n");
92 if (!EVP_CIPHER_CTX_set_padding(ctx, 0))
93 printf("\n ERROR!! EVP_CIPHER_CTX_set_padding - no padding\n");
94 if (!EVP_DecryptUpdate
95 (ctx, plaintext, &outlen, (const unsigned char *)cyphertext, len))
96 printf("\n ERROR!! EVP_DecryptUpdate - EVP_aes_192_cbc\n");
97 if (!EVP_DecryptFinal_ex(ctx, plaintext + outlen, &tmplen))
98 printf("\n ERROR!! EVP_DecryptFinal_ex - EVP_aes_192_cbc \n");
99
100 return 0;
101 }
102
103 static inline
104 int openssl_aes_192_cbc_enc(uint8_t * key, uint8_t * iv,
105 int len, uint8_t * plaintext, uint8_t * cyphertext)
106 {
107 int outlen, tmplen;
108 EVP_CIPHER_CTX CTX;
109 EVP_CIPHER_CTX *ctx = &CTX;
110
111 EVP_CIPHER_CTX_init(ctx);
112 if (!EVP_EncryptInit_ex(ctx, EVP_aes_192_cbc(), NULL, key, iv))
113 printf("\n ERROR!! EVP_EncryptInit_ex - EVP_aes_192_cbc\n");
114 if (!EVP_CIPHER_CTX_set_padding(ctx, 0))
115 printf("\n ERROR!! EVP_CIPHER_CTX_set_padding - no padding\n");
116 if (!EVP_EncryptUpdate
117 (ctx, cyphertext, &outlen, (const unsigned char *)plaintext, len))
118 printf("\n ERROR!! EVP_EncryptUpdate - EVP_aes_192_cbc\n");
119 if (!EVP_EncryptFinal_ex(ctx, cyphertext + outlen, &tmplen))
120 printf("\n ERROR!! EVP_EncryptFinal_ex - EVP_aes_192_cbc\n");
121
122 return 0;
123 }
124
125 static inline
126 int openssl_aes_256_cbc_dec(uint8_t * key, uint8_t * iv,
127 int len, uint8_t * cyphertext, uint8_t * plaintext)
128 {
129 int outlen = 0, tmplen = 0;
130 EVP_CIPHER_CTX CTX;
131 EVP_CIPHER_CTX *ctx = &CTX;
132
133 EVP_CIPHER_CTX_init(ctx);
134 if (!EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
135 printf("\n ERROR!! EVP_DecryptInit_ex - EVP_aes_256_cbc\n");
136 if (!EVP_CIPHER_CTX_set_padding(ctx, 0))
137 printf("\n ERROR!! EVP_CIPHER_CTX_set_padding - no padding\n");
138 if (!EVP_DecryptUpdate
139 (ctx, plaintext, &outlen, (const unsigned char *)cyphertext, len))
140 printf("\n ERROR!! EVP_DecryptUpdate - EVP_aes_256_cbc\n");
141 if (!EVP_DecryptFinal_ex(ctx, plaintext + outlen, &tmplen))
142 printf("\n ERROR!! EVP_DecryptFinal_ex - EVP_aes_256_cbc %x,%x\n", outlen,
143 tmplen);
144
145 return 0;
146 }
147
148 static inline
149 int openssl_aes_256_cbc_enc(uint8_t * key, uint8_t * iv,
150 int len, uint8_t * plaintext, uint8_t * cyphertext)
151 {
152 int outlen, tmplen;
153 EVP_CIPHER_CTX CTX;
154 EVP_CIPHER_CTX *ctx = &CTX;
155
156 EVP_CIPHER_CTX_init(ctx);
157 if (!EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
158 printf("\n ERROR!! EVP_EncryptInit_ex - EVP_aes_256_cbc\n");
159 if (!EVP_CIPHER_CTX_set_padding(ctx, 0))
160 printf("\n ERROR!! EVP_CIPHER_CTX_set_padding - no padding\n");
161 if (!EVP_EncryptUpdate
162 (ctx, cyphertext, &outlen, (const unsigned char *)plaintext, len))
163 printf("\n ERROR!! EVP_EncryptUpdate - EVP_aes_256_cbc\n");
164 if (!EVP_EncryptFinal_ex(ctx, cyphertext + outlen, &tmplen))
165 printf("\n ERROR!! EVP_EncryptFinal_ex - EVP_aes_256_cbc\n");
166
167 return 0;
168 }
169
170 static inline
171 int openssl_aes_gcm_dec(uint8_t * key, uint8_t * iv, int iv_len, uint8_t * aad,
172 int aad_len, uint8_t * tag, int tag_len, uint8_t * cyphertext,
173 int len, uint8_t * plaintext)
174 {
175 int outlen = 0, tmplen = len, ret;
176 EVP_CIPHER_CTX CTX;
177 EVP_CIPHER_CTX *const ctx = &CTX;
178
179 EVP_CIPHER_CTX_init(ctx);
180 if (!EVP_DecryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL))
181 printf("\n ERROR!! EVP_DecryptInit_ex - EVP_aes_128_gcm\n");
182 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, tag_len, tag))
183 printf("\n ERROR!! EVP_CIPHER_CTX_ctrl - set tag\n");
184 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, iv_len, NULL))
185 printf("\n ERROR!! EVP_CIPHER_CTX_ctrl - IV length init\n");
186 if (!EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv))
187 printf("\n ERROR!! EVP_DecryptInit_ex - key init\n");
188 if (!EVP_DecryptUpdate(ctx, NULL, &outlen, aad, aad_len))
189 printf("\n ERROR!! EVP_DecryptUpdate - aad data setup\n");
190 if (!EVP_DecryptUpdate
191 (ctx, plaintext, &outlen, (const unsigned char *)cyphertext, len))
192 printf("\n ERROR!! EVP_DecryptUpdate - PT->CT\n");
193 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, tag_len, tag))
194 printf("\n ERROR!! EVP_CIPHER_CTX_ctrl - set tag\n");
195
196 ret = EVP_DecryptFinal_ex(ctx, plaintext + outlen, &tmplen);
197 if (0 < ret) {
198 tmplen += outlen;
199 } else {
200 //Authentication failed mismatched key, ADD or tag
201 tmplen = -1;
202 }
203
204 return tmplen;
205 }
206
207 static inline
208 int openssl_aes_gcm_enc(uint8_t * key, uint8_t * iv, int iv_len, uint8_t * aad,
209 int aad_len, uint8_t * tag, int tag_len, uint8_t * plaintext,
210 int len, uint8_t * cyphertext)
211 {
212 int outlen, tmplen;
213 EVP_CIPHER_CTX CTX;
214 EVP_CIPHER_CTX *const ctx = &CTX;
215
216 //printf("ivl:%x addl:%x tagl:%x ptl:%x\n", iv_len, aad_len, tag_len, len);
217 EVP_CIPHER_CTX_init(ctx);
218 if (!EVP_EncryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL))
219 printf("\n ERROR!! EVP_EncryptInit_ex - EVP_aes_128_cbc\n");
220 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, iv_len, NULL))
221 printf("\n ERROR!! EVP_CIPHER_CTX_ctrl - IV length init\n");
222 if (!EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv))
223 printf("\n ERROR!! EVP_EncryptInit_ex - init\n");
224 if (!EVP_EncryptUpdate(ctx, NULL, &outlen, aad, aad_len))
225 printf("\n ERROR!! EVP_EncryptUpdate - aad insert\n");
226 if (!EVP_EncryptUpdate(ctx, cyphertext, &outlen, (const uint8_t *)plaintext, len))
227 printf("\n ERROR!! EVP_EncryptUpdate - EVP_aes_128_cbc\n");
228 if (!EVP_EncryptFinal_ex(ctx, cyphertext + outlen, &tmplen))
229 printf("\n ERROR!! EVP_EncryptFinal_ex - EVP_aes_128_cbc\n");
230 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, tag_len, tag))
231 printf("\n ERROR!! EVP_CIPHER_CTX_ctrl - tag \n");
232
233 return tmplen;
234 }
235
236 static inline
237 int openssl_aes_256_gcm_dec(uint8_t * key, uint8_t * iv, int iv_len, uint8_t * aad,
238 int aad_len, uint8_t * tag, int tag_len, uint8_t * cyphertext,
239 int len, uint8_t * plaintext)
240 {
241 int outlen = 0, tmplen = len, ret;
242 EVP_CIPHER_CTX CTX;
243 EVP_CIPHER_CTX *const ctx = &CTX;
244
245 EVP_CIPHER_CTX_init(ctx);
246 if (!EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL))
247 printf("\n ERROR!! EVP_DecryptInit_ex - EVP_aes_128_gcm\n");
248 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, tag_len, tag))
249 printf("\n ERROR!! EVP_CIPHER_CTX_ctrl - set tag\n");
250 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, iv_len, NULL))
251 printf("\n ERROR!! EVP_CIPHER_CTX_ctrl - IV length init\n");
252 if (!EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv))
253 printf("\n ERROR!! EVP_DecryptInit_ex - key init\n");
254 if (!EVP_DecryptUpdate(ctx, NULL, &outlen, aad, aad_len))
255 printf("\n ERROR!! EVP_DecryptUpdate - aad data setup\n");
256 if (!EVP_DecryptUpdate
257 (ctx, plaintext, &outlen, (const unsigned char *)cyphertext, len))
258 printf("\n ERROR!! EVP_DecryptUpdate - PT->CT\n");
259 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, tag_len, tag))
260 printf("\n ERROR!! EVP_CIPHER_CTX_ctrl - set tag\n");
261 ret = EVP_DecryptFinal_ex(ctx, plaintext + outlen, &tmplen);
262 if (0 < ret) {
263 tmplen += outlen;
264 } else {
265 //Authentication failed mismatched key, ADD or tag
266 tmplen = -1;
267 }
268
269 return tmplen;
270 }
271
272 static inline
273 int openssl_aes_256_gcm_enc(uint8_t * key, uint8_t * iv, int iv_len, uint8_t * aad,
274 int aad_len, uint8_t * tag, int tag_len, uint8_t * plaintext,
275 int len, uint8_t * cyphertext)
276 {
277 int outlen, tmplen;
278 EVP_CIPHER_CTX CTX;
279 EVP_CIPHER_CTX *const ctx = &CTX;
280
281 EVP_CIPHER_CTX_init(ctx);
282 if (!EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL))
283 printf("\n ERROR!! EVP_EncryptInit_ex - EVP_aes_128_cbc\n");
284 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, iv_len, NULL))
285 printf("\n ERROR!! EVP_CIPHER_CTX_ctrl - IV length init\n");
286 if (!EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv))
287 printf("\n ERROR!! EVP_EncryptInit_ex - init\n");
288 if (!EVP_EncryptUpdate(ctx, NULL, &outlen, aad, aad_len))
289 printf("\n ERROR!! EVP_EncryptUpdate - aad insert\n");
290 if (!EVP_EncryptUpdate(ctx, cyphertext, &outlen, (const uint8_t *)plaintext, len))
291 printf("\n ERROR!! EVP_EncryptUpdate - EVP_aes_128_cbc\n");
292 if (!EVP_EncryptFinal_ex(ctx, cyphertext + outlen, &tmplen))
293 printf("\n ERROR!! EVP_EncryptFinal_ex - EVP_aes_128_cbc\n");
294 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, tag_len, tag))
295 printf("\n ERROR!! EVP_CIPHER_CTX_ctrl - tag \n");
296
297 return tmplen;
298 }
299
300 #endif /* AES_OSSL_HELPER_H_ */