/src/openssl/crypto/evp/e_aes.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright 2001-2025 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 | | #include "crypto/evp.h" |
11 | | |
12 | | #define BLOCK_CIPHER_generic(nid, keylen, blocksize, ivlen, nmode, mode, MODE, flags) \ |
13 | | static const EVP_CIPHER aes_##keylen##_##mode = { \ |
14 | | nid##_##keylen##_##nmode, \ |
15 | | blocksize, \ |
16 | | keylen / 8, \ |
17 | | ivlen, \ |
18 | | flags | EVP_CIPH_##MODE##_MODE, \ |
19 | | EVP_ORIG_GLOBAL, \ |
20 | | }; \ |
21 | | const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \ |
22 | 63 | { \ |
23 | 63 | return &aes_##keylen##_##mode; \ |
24 | 63 | } Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
Line | Count | Source | 22 | 3 | { \ | 23 | 3 | return &aes_##keylen##_##mode; \ | 24 | 3 | } |
|
25 | | |
26 | | #define BLOCK_CIPHER_custom(nid, keylen, blocksize, ivlen, mode, MODE, flags) \ |
27 | | static const EVP_CIPHER aes_##keylen##_##mode = { \ |
28 | | nid##_##keylen##_##mode, \ |
29 | | blocksize, \ |
30 | | (EVP_CIPH_##MODE##_MODE == EVP_CIPH_XTS_MODE || EVP_CIPH_##MODE##_MODE == EVP_CIPH_SIV_MODE ? 2 : 1) * keylen / 8, \ |
31 | | ivlen, \ |
32 | | flags | EVP_CIPH_##MODE##_MODE, \ |
33 | | EVP_ORIG_GLOBAL, \ |
34 | | }; \ |
35 | | const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \ |
36 | 33 | { \ |
37 | 33 | return &aes_##keylen##_##mode; \ |
38 | 33 | } Line | Count | Source | 36 | 3 | { \ | 37 | 3 | return &aes_##keylen##_##mode; \ | 38 | 3 | } |
Line | Count | Source | 36 | 3 | { \ | 37 | 3 | return &aes_##keylen##_##mode; \ | 38 | 3 | } |
Line | Count | Source | 36 | 3 | { \ | 37 | 3 | return &aes_##keylen##_##mode; \ | 38 | 3 | } |
Line | Count | Source | 36 | 3 | { \ | 37 | 3 | return &aes_##keylen##_##mode; \ | 38 | 3 | } |
Line | Count | Source | 36 | 3 | { \ | 37 | 3 | return &aes_##keylen##_##mode; \ | 38 | 3 | } |
Line | Count | Source | 36 | 3 | { \ | 37 | 3 | return &aes_##keylen##_##mode; \ | 38 | 3 | } |
Line | Count | Source | 36 | 3 | { \ | 37 | 3 | return &aes_##keylen##_##mode; \ | 38 | 3 | } |
Line | Count | Source | 36 | 3 | { \ | 37 | 3 | return &aes_##keylen##_##mode; \ | 38 | 3 | } |
Line | Count | Source | 36 | 3 | { \ | 37 | 3 | return &aes_##keylen##_##mode; \ | 38 | 3 | } |
Line | Count | Source | 36 | 3 | { \ | 37 | 3 | return &aes_##keylen##_##mode; \ | 38 | 3 | } |
Line | Count | Source | 36 | 3 | { \ | 37 | 3 | return &aes_##keylen##_##mode; \ | 38 | 3 | } |
|
39 | | |
40 | | #define BLOCK_CIPHER_generic_pack(nid, keylen, flags) \ |
41 | | BLOCK_CIPHER_generic(nid, keylen, 16, 16, cbc, cbc, CBC, flags | EVP_CIPH_FLAG_DEFAULT_ASN1) \ |
42 | | BLOCK_CIPHER_generic(nid, keylen, 16, 0, ecb, ecb, ECB, flags | EVP_CIPH_FLAG_DEFAULT_ASN1) \ |
43 | | BLOCK_CIPHER_generic(nid, keylen, 1, 16, ofb128, ofb, OFB, flags | EVP_CIPH_FLAG_DEFAULT_ASN1) \ |
44 | | BLOCK_CIPHER_generic(nid, keylen, 1, 16, cfb128, cfb, CFB, flags | EVP_CIPH_FLAG_DEFAULT_ASN1) \ |
45 | | BLOCK_CIPHER_generic(nid, keylen, 1, 16, cfb1, cfb1, CFB, flags) \ |
46 | | BLOCK_CIPHER_generic(nid, keylen, 1, 16, cfb8, cfb8, CFB, flags) \ |
47 | | BLOCK_CIPHER_generic(nid, keylen, 1, 16, ctr, ctr, CTR, flags) |
48 | | |
49 | | BLOCK_CIPHER_generic_pack(NID_aes, 128, 0) |
50 | | BLOCK_CIPHER_generic_pack(NID_aes, 192, 0) |
51 | | BLOCK_CIPHER_generic_pack(NID_aes, 256, 0) |
52 | | |
53 | | #define CUSTOM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \ |
54 | | | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \ |
55 | | | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \ |
56 | | | EVP_CIPH_CUSTOM_COPY | EVP_CIPH_CUSTOM_IV_LENGTH) |
57 | | |
58 | | BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, gcm, GCM, |
59 | | EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS) |
60 | | BLOCK_CIPHER_custom(NID_aes, 192, 1, 12, gcm, GCM, |
61 | | EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS) |
62 | | BLOCK_CIPHER_custom(NID_aes, 256, 1, 12, gcm, GCM, |
63 | | EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS) |
64 | | |
65 | | #define XTS_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV \ |
66 | | | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \ |
67 | | | EVP_CIPH_CUSTOM_COPY) |
68 | | |
69 | | BLOCK_CIPHER_custom(NID_aes, 128, 1, 16, xts, XTS, XTS_FLAGS) |
70 | | BLOCK_CIPHER_custom(NID_aes, 256, 1, 16, xts, XTS, XTS_FLAGS) |
71 | | |
72 | | BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, ccm, CCM, |
73 | | EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS) |
74 | | BLOCK_CIPHER_custom(NID_aes, 192, 1, 12, ccm, CCM, |
75 | | EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS) |
76 | | BLOCK_CIPHER_custom(NID_aes, 256, 1, 12, ccm, CCM, |
77 | | EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS) |
78 | | |
79 | | #define WRAP_FLAGS (EVP_CIPH_WRAP_MODE \ |
80 | | | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \ |
81 | | | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_FLAG_DEFAULT_ASN1) |
82 | | |
83 | | static const EVP_CIPHER aes_128_wrap = { |
84 | | NID_id_aes128_wrap, |
85 | | 8, 16, 8, WRAP_FLAGS, EVP_ORIG_GLOBAL |
86 | | }; |
87 | | |
88 | | const EVP_CIPHER *EVP_aes_128_wrap(void) |
89 | 3 | { |
90 | 3 | return &aes_128_wrap; |
91 | 3 | } |
92 | | |
93 | | static const EVP_CIPHER aes_192_wrap = { |
94 | | NID_id_aes192_wrap, |
95 | | 8, 24, 8, WRAP_FLAGS, EVP_ORIG_GLOBAL |
96 | | }; |
97 | | |
98 | | const EVP_CIPHER *EVP_aes_192_wrap(void) |
99 | 3 | { |
100 | 3 | return &aes_192_wrap; |
101 | 3 | } |
102 | | |
103 | | static const EVP_CIPHER aes_256_wrap = { |
104 | | NID_id_aes256_wrap, |
105 | | 8, 32, 8, WRAP_FLAGS, EVP_ORIG_GLOBAL |
106 | | }; |
107 | | |
108 | | const EVP_CIPHER *EVP_aes_256_wrap(void) |
109 | 3 | { |
110 | 3 | return &aes_256_wrap; |
111 | 3 | } |
112 | | |
113 | | static const EVP_CIPHER aes_128_wrap_pad = { |
114 | | NID_id_aes128_wrap_pad, |
115 | | 8, 16, 4, WRAP_FLAGS, EVP_ORIG_GLOBAL |
116 | | }; |
117 | | |
118 | | const EVP_CIPHER *EVP_aes_128_wrap_pad(void) |
119 | 3 | { |
120 | 3 | return &aes_128_wrap_pad; |
121 | 3 | } |
122 | | |
123 | | static const EVP_CIPHER aes_192_wrap_pad = { |
124 | | NID_id_aes192_wrap_pad, |
125 | | 8, 24, 4, WRAP_FLAGS, EVP_ORIG_GLOBAL |
126 | | }; |
127 | | |
128 | | const EVP_CIPHER *EVP_aes_192_wrap_pad(void) |
129 | 3 | { |
130 | 3 | return &aes_192_wrap_pad; |
131 | 3 | } |
132 | | |
133 | | static const EVP_CIPHER aes_256_wrap_pad = { |
134 | | NID_id_aes256_wrap_pad, |
135 | | 8, 32, 4, WRAP_FLAGS, EVP_ORIG_GLOBAL |
136 | | }; |
137 | | |
138 | | const EVP_CIPHER *EVP_aes_256_wrap_pad(void) |
139 | 3 | { |
140 | 3 | return &aes_256_wrap_pad; |
141 | 3 | } |
142 | | |
143 | | #ifndef OPENSSL_NO_OCB |
144 | | BLOCK_CIPHER_custom(NID_aes, 128, 16, 12, ocb, OCB, |
145 | | EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS) |
146 | | BLOCK_CIPHER_custom(NID_aes, 192, 16, 12, ocb, OCB, |
147 | | EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS) |
148 | | BLOCK_CIPHER_custom(NID_aes, 256, 16, 12, ocb, OCB, |
149 | | EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS) |
150 | | #endif /* OPENSSL_NO_OCB */ |