xref: /aosp_15_r20/external/boringssl/include/openssl/aead.h (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1*8fb009dcSAndroid Build Coastguard Worker /* Copyright (c) 2014, Google Inc.
2*8fb009dcSAndroid Build Coastguard Worker  *
3*8fb009dcSAndroid Build Coastguard Worker  * Permission to use, copy, modify, and/or distribute this software for any
4*8fb009dcSAndroid Build Coastguard Worker  * purpose with or without fee is hereby granted, provided that the above
5*8fb009dcSAndroid Build Coastguard Worker  * copyright notice and this permission notice appear in all copies.
6*8fb009dcSAndroid Build Coastguard Worker  *
7*8fb009dcSAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8*8fb009dcSAndroid Build Coastguard Worker  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9*8fb009dcSAndroid Build Coastguard Worker  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10*8fb009dcSAndroid Build Coastguard Worker  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11*8fb009dcSAndroid Build Coastguard Worker  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12*8fb009dcSAndroid Build Coastguard Worker  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13*8fb009dcSAndroid Build Coastguard Worker  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14*8fb009dcSAndroid Build Coastguard Worker 
15*8fb009dcSAndroid Build Coastguard Worker #ifndef OPENSSL_HEADER_AEAD_H
16*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HEADER_AEAD_H
17*8fb009dcSAndroid Build Coastguard Worker 
18*8fb009dcSAndroid Build Coastguard Worker #include <openssl/base.h>
19*8fb009dcSAndroid Build Coastguard Worker 
20*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus)
21*8fb009dcSAndroid Build Coastguard Worker extern "C" {
22*8fb009dcSAndroid Build Coastguard Worker #endif
23*8fb009dcSAndroid Build Coastguard Worker 
24*8fb009dcSAndroid Build Coastguard Worker 
25*8fb009dcSAndroid Build Coastguard Worker // Authenticated Encryption with Additional Data.
26*8fb009dcSAndroid Build Coastguard Worker //
27*8fb009dcSAndroid Build Coastguard Worker // AEAD couples confidentiality and integrity in a single primitive. AEAD
28*8fb009dcSAndroid Build Coastguard Worker // algorithms take a key and then can seal and open individual messages. Each
29*8fb009dcSAndroid Build Coastguard Worker // message has a unique, per-message nonce and, optionally, additional data
30*8fb009dcSAndroid Build Coastguard Worker // which is authenticated but not included in the ciphertext.
31*8fb009dcSAndroid Build Coastguard Worker //
32*8fb009dcSAndroid Build Coastguard Worker // The |EVP_AEAD_CTX_init| function initialises an |EVP_AEAD_CTX| structure and
33*8fb009dcSAndroid Build Coastguard Worker // performs any precomputation needed to use |aead| with |key|. The length of
34*8fb009dcSAndroid Build Coastguard Worker // the key, |key_len|, is given in bytes.
35*8fb009dcSAndroid Build Coastguard Worker //
36*8fb009dcSAndroid Build Coastguard Worker // The |tag_len| argument contains the length of the tags, in bytes, and allows
37*8fb009dcSAndroid Build Coastguard Worker // for the processing of truncated authenticators. A zero value indicates that
38*8fb009dcSAndroid Build Coastguard Worker // the default tag length should be used and this is defined as
39*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_DEFAULT_TAG_LENGTH| in order to make the code clear. Using
40*8fb009dcSAndroid Build Coastguard Worker // truncated tags increases an attacker's chance of creating a valid forgery.
41*8fb009dcSAndroid Build Coastguard Worker // Be aware that the attacker's chance may increase more than exponentially as
42*8fb009dcSAndroid Build Coastguard Worker // would naively be expected.
43*8fb009dcSAndroid Build Coastguard Worker //
44*8fb009dcSAndroid Build Coastguard Worker // When no longer needed, the initialised |EVP_AEAD_CTX| structure must be
45*8fb009dcSAndroid Build Coastguard Worker // passed to |EVP_AEAD_CTX_cleanup|, which will deallocate any memory used.
46*8fb009dcSAndroid Build Coastguard Worker //
47*8fb009dcSAndroid Build Coastguard Worker // With an |EVP_AEAD_CTX| in hand, one can seal and open messages. These
48*8fb009dcSAndroid Build Coastguard Worker // operations are intended to meet the standard notions of privacy and
49*8fb009dcSAndroid Build Coastguard Worker // authenticity for authenticated encryption. For formal definitions see
50*8fb009dcSAndroid Build Coastguard Worker // Bellare and Namprempre, "Authenticated encryption: relations among notions
51*8fb009dcSAndroid Build Coastguard Worker // and analysis of the generic composition paradigm," Lecture Notes in Computer
52*8fb009dcSAndroid Build Coastguard Worker // Science B<1976> (2000), 531–545,
53*8fb009dcSAndroid Build Coastguard Worker // http://www-cse.ucsd.edu/~mihir/papers/oem.html.
54*8fb009dcSAndroid Build Coastguard Worker //
55*8fb009dcSAndroid Build Coastguard Worker // When sealing messages, a nonce must be given. The length of the nonce is
56*8fb009dcSAndroid Build Coastguard Worker // fixed by the AEAD in use and is returned by |EVP_AEAD_nonce_length|. *The
57*8fb009dcSAndroid Build Coastguard Worker // nonce must be unique for all messages with the same key*. This is critically
58*8fb009dcSAndroid Build Coastguard Worker // important - nonce reuse may completely undermine the security of the AEAD.
59*8fb009dcSAndroid Build Coastguard Worker // Nonces may be predictable and public, so long as they are unique. Uniqueness
60*8fb009dcSAndroid Build Coastguard Worker // may be achieved with a simple counter or, if large enough, may be generated
61*8fb009dcSAndroid Build Coastguard Worker // randomly. The nonce must be passed into the "open" operation by the receiver
62*8fb009dcSAndroid Build Coastguard Worker // so must either be implicit (e.g. a counter), or must be transmitted along
63*8fb009dcSAndroid Build Coastguard Worker // with the sealed message.
64*8fb009dcSAndroid Build Coastguard Worker //
65*8fb009dcSAndroid Build Coastguard Worker // The "seal" and "open" operations are atomic - an entire message must be
66*8fb009dcSAndroid Build Coastguard Worker // encrypted or decrypted in a single call. Large messages may have to be split
67*8fb009dcSAndroid Build Coastguard Worker // up in order to accommodate this. When doing so, be mindful of the need not to
68*8fb009dcSAndroid Build Coastguard Worker // repeat nonces and the possibility that an attacker could duplicate, reorder
69*8fb009dcSAndroid Build Coastguard Worker // or drop message chunks. For example, using a single key for a given (large)
70*8fb009dcSAndroid Build Coastguard Worker // message and sealing chunks with nonces counting from zero would be secure as
71*8fb009dcSAndroid Build Coastguard Worker // long as the number of chunks was securely transmitted. (Otherwise an
72*8fb009dcSAndroid Build Coastguard Worker // attacker could truncate the message by dropping chunks from the end.)
73*8fb009dcSAndroid Build Coastguard Worker //
74*8fb009dcSAndroid Build Coastguard Worker // The number of chunks could be transmitted by prefixing it to the plaintext,
75*8fb009dcSAndroid Build Coastguard Worker // for example. This also assumes that no other message would ever use the same
76*8fb009dcSAndroid Build Coastguard Worker // key otherwise the rule that nonces must be unique for a given key would be
77*8fb009dcSAndroid Build Coastguard Worker // violated.
78*8fb009dcSAndroid Build Coastguard Worker //
79*8fb009dcSAndroid Build Coastguard Worker // The "seal" and "open" operations also permit additional data to be
80*8fb009dcSAndroid Build Coastguard Worker // authenticated via the |ad| parameter. This data is not included in the
81*8fb009dcSAndroid Build Coastguard Worker // ciphertext and must be identical for both the "seal" and "open" call. This
82*8fb009dcSAndroid Build Coastguard Worker // permits implicit context to be authenticated but may be empty if not needed.
83*8fb009dcSAndroid Build Coastguard Worker //
84*8fb009dcSAndroid Build Coastguard Worker // The "seal" and "open" operations may work in-place if the |out| and |in|
85*8fb009dcSAndroid Build Coastguard Worker // arguments are equal. Otherwise, if |out| and |in| alias, input data may be
86*8fb009dcSAndroid Build Coastguard Worker // overwritten before it is read. This situation will cause an error.
87*8fb009dcSAndroid Build Coastguard Worker //
88*8fb009dcSAndroid Build Coastguard Worker // The "seal" and "open" operations return one on success and zero on error.
89*8fb009dcSAndroid Build Coastguard Worker 
90*8fb009dcSAndroid Build Coastguard Worker 
91*8fb009dcSAndroid Build Coastguard Worker // AEAD algorithms.
92*8fb009dcSAndroid Build Coastguard Worker 
93*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_128_gcm is AES-128 in Galois Counter Mode.
94*8fb009dcSAndroid Build Coastguard Worker //
95*8fb009dcSAndroid Build Coastguard Worker // Note: AES-GCM should only be used with 12-byte (96-bit) nonces. Although it
96*8fb009dcSAndroid Build Coastguard Worker // is specified to take a variable-length nonce, nonces with other lengths are
97*8fb009dcSAndroid Build Coastguard Worker // effectively randomized, which means one must consider collisions. Unless
98*8fb009dcSAndroid Build Coastguard Worker // implementing an existing protocol which has already specified incorrect
99*8fb009dcSAndroid Build Coastguard Worker // parameters, only use 12-byte nonces.
100*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_gcm(void);
101*8fb009dcSAndroid Build Coastguard Worker 
102*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_192_gcm is AES-192 in Galois Counter Mode.
103*8fb009dcSAndroid Build Coastguard Worker //
104*8fb009dcSAndroid Build Coastguard Worker // WARNING: AES-192 is superfluous and shouldn't exist. NIST should never have
105*8fb009dcSAndroid Build Coastguard Worker // defined it. Use only when interop with another system requires it, never
106*8fb009dcSAndroid Build Coastguard Worker // de novo.
107*8fb009dcSAndroid Build Coastguard Worker //
108*8fb009dcSAndroid Build Coastguard Worker // Note: AES-GCM should only be used with 12-byte (96-bit) nonces. Although it
109*8fb009dcSAndroid Build Coastguard Worker // is specified to take a variable-length nonce, nonces with other lengths are
110*8fb009dcSAndroid Build Coastguard Worker // effectively randomized, which means one must consider collisions. Unless
111*8fb009dcSAndroid Build Coastguard Worker // implementing an existing protocol which has already specified incorrect
112*8fb009dcSAndroid Build Coastguard Worker // parameters, only use 12-byte nonces.
113*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_192_gcm(void);
114*8fb009dcSAndroid Build Coastguard Worker 
115*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_256_gcm is AES-256 in Galois Counter Mode.
116*8fb009dcSAndroid Build Coastguard Worker //
117*8fb009dcSAndroid Build Coastguard Worker // Note: AES-GCM should only be used with 12-byte (96-bit) nonces. Although it
118*8fb009dcSAndroid Build Coastguard Worker // is specified to take a variable-length nonce, nonces with other lengths are
119*8fb009dcSAndroid Build Coastguard Worker // effectively randomized, which means one must consider collisions. Unless
120*8fb009dcSAndroid Build Coastguard Worker // implementing an existing protocol which has already specified incorrect
121*8fb009dcSAndroid Build Coastguard Worker // parameters, only use 12-byte nonces.
122*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_256_gcm(void);
123*8fb009dcSAndroid Build Coastguard Worker 
124*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_chacha20_poly1305 is the AEAD built from ChaCha20 and
125*8fb009dcSAndroid Build Coastguard Worker // Poly1305 as described in RFC 8439.
126*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_chacha20_poly1305(void);
127*8fb009dcSAndroid Build Coastguard Worker 
128*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_xchacha20_poly1305 is ChaCha20-Poly1305 with an extended nonce that
129*8fb009dcSAndroid Build Coastguard Worker // makes random generation of nonces safe.
130*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_xchacha20_poly1305(void);
131*8fb009dcSAndroid Build Coastguard Worker 
132*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_128_ctr_hmac_sha256 is AES-128 in CTR mode with HMAC-SHA256 for
133*8fb009dcSAndroid Build Coastguard Worker // authentication. The nonce is 12 bytes; the bottom 32-bits are used as the
134*8fb009dcSAndroid Build Coastguard Worker // block counter, thus the maximum plaintext size is 64GB.
135*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_ctr_hmac_sha256(void);
136*8fb009dcSAndroid Build Coastguard Worker 
137*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_256_ctr_hmac_sha256 is AES-256 in CTR mode with HMAC-SHA256 for
138*8fb009dcSAndroid Build Coastguard Worker // authentication. See |EVP_aead_aes_128_ctr_hmac_sha256| for details.
139*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_256_ctr_hmac_sha256(void);
140*8fb009dcSAndroid Build Coastguard Worker 
141*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_128_gcm_siv is AES-128 in GCM-SIV mode. See RFC 8452.
142*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_gcm_siv(void);
143*8fb009dcSAndroid Build Coastguard Worker 
144*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_256_gcm_siv is AES-256 in GCM-SIV mode. See RFC 8452.
145*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_256_gcm_siv(void);
146*8fb009dcSAndroid Build Coastguard Worker 
147*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_128_gcm_randnonce is AES-128 in Galois Counter Mode with
148*8fb009dcSAndroid Build Coastguard Worker // internal nonce generation. The 12-byte nonce is appended to the tag
149*8fb009dcSAndroid Build Coastguard Worker // and is generated internally. The "tag", for the purpurses of the API, is thus
150*8fb009dcSAndroid Build Coastguard Worker // 12 bytes larger. The nonce parameter when using this AEAD must be
151*8fb009dcSAndroid Build Coastguard Worker // zero-length. Since the nonce is random, a single key should not be used for
152*8fb009dcSAndroid Build Coastguard Worker // more than 2^32 seal operations.
153*8fb009dcSAndroid Build Coastguard Worker //
154*8fb009dcSAndroid Build Coastguard Worker // Warning: this is for use for FIPS compliance only. It is probably not
155*8fb009dcSAndroid Build Coastguard Worker // suitable for other uses. Using standard AES-GCM AEADs allows one to achieve
156*8fb009dcSAndroid Build Coastguard Worker // the same effect, but gives more control over nonce storage.
157*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_gcm_randnonce(void);
158*8fb009dcSAndroid Build Coastguard Worker 
159*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_256_gcm_randnonce is AES-256 in Galois Counter Mode with
160*8fb009dcSAndroid Build Coastguard Worker // internal nonce generation. The 12-byte nonce is appended to the tag
161*8fb009dcSAndroid Build Coastguard Worker // and is generated internally. The "tag", for the purpurses of the API, is thus
162*8fb009dcSAndroid Build Coastguard Worker // 12 bytes larger. The nonce parameter when using this AEAD must be
163*8fb009dcSAndroid Build Coastguard Worker // zero-length. Since the nonce is random, a single key should not be used for
164*8fb009dcSAndroid Build Coastguard Worker // more than 2^32 seal operations.
165*8fb009dcSAndroid Build Coastguard Worker //
166*8fb009dcSAndroid Build Coastguard Worker // Warning: this is for use for FIPS compliance only. It is probably not
167*8fb009dcSAndroid Build Coastguard Worker // suitable for other uses. Using standard AES-GCM AEADs allows one to achieve
168*8fb009dcSAndroid Build Coastguard Worker // the same effect, but gives more control over nonce storage.
169*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_256_gcm_randnonce(void);
170*8fb009dcSAndroid Build Coastguard Worker 
171*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_128_ccm_bluetooth is AES-128-CCM with M=4 and L=2 (4-byte tags
172*8fb009dcSAndroid Build Coastguard Worker // and 13-byte nonces), as decribed in the Bluetooth Core Specification v5.0,
173*8fb009dcSAndroid Build Coastguard Worker // Volume 6, Part E, Section 1.
174*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_ccm_bluetooth(void);
175*8fb009dcSAndroid Build Coastguard Worker 
176*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_128_ccm_bluetooth_8 is AES-128-CCM with M=8 and L=2 (8-byte tags
177*8fb009dcSAndroid Build Coastguard Worker // and 13-byte nonces), as used in the Bluetooth Mesh Networking Specification
178*8fb009dcSAndroid Build Coastguard Worker // v1.0.
179*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_ccm_bluetooth_8(void);
180*8fb009dcSAndroid Build Coastguard Worker 
181*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_128_ccm_matter is AES-128-CCM with M=16 and L=2 (16-byte tags
182*8fb009dcSAndroid Build Coastguard Worker // and 13-byte nonces), as used in the Matter specification.
183*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_ccm_matter(void);
184*8fb009dcSAndroid Build Coastguard Worker 
185*8fb009dcSAndroid Build Coastguard Worker // EVP_has_aes_hardware returns one if we enable hardware support for fast and
186*8fb009dcSAndroid Build Coastguard Worker // constant-time AES-GCM.
187*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_has_aes_hardware(void);
188*8fb009dcSAndroid Build Coastguard Worker 
189*8fb009dcSAndroid Build Coastguard Worker 
190*8fb009dcSAndroid Build Coastguard Worker // Utility functions.
191*8fb009dcSAndroid Build Coastguard Worker 
192*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_key_length returns the length, in bytes, of the keys used by
193*8fb009dcSAndroid Build Coastguard Worker // |aead|.
194*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT size_t EVP_AEAD_key_length(const EVP_AEAD *aead);
195*8fb009dcSAndroid Build Coastguard Worker 
196*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_nonce_length returns the length, in bytes, of the per-message nonce
197*8fb009dcSAndroid Build Coastguard Worker // for |aead|.
198*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT size_t EVP_AEAD_nonce_length(const EVP_AEAD *aead);
199*8fb009dcSAndroid Build Coastguard Worker 
200*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_max_overhead returns the maximum number of additional bytes added
201*8fb009dcSAndroid Build Coastguard Worker // by the act of sealing data with |aead|.
202*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT size_t EVP_AEAD_max_overhead(const EVP_AEAD *aead);
203*8fb009dcSAndroid Build Coastguard Worker 
204*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_max_tag_len returns the maximum tag length when using |aead|. This
205*8fb009dcSAndroid Build Coastguard Worker // is the largest value that can be passed as |tag_len| to
206*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_CTX_init|.
207*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT size_t EVP_AEAD_max_tag_len(const EVP_AEAD *aead);
208*8fb009dcSAndroid Build Coastguard Worker 
209*8fb009dcSAndroid Build Coastguard Worker 
210*8fb009dcSAndroid Build Coastguard Worker // AEAD operations.
211*8fb009dcSAndroid Build Coastguard Worker 
212*8fb009dcSAndroid Build Coastguard Worker union evp_aead_ctx_st_state {
213*8fb009dcSAndroid Build Coastguard Worker   uint8_t opaque[564];
214*8fb009dcSAndroid Build Coastguard Worker   uint64_t alignment;
215*8fb009dcSAndroid Build Coastguard Worker };
216*8fb009dcSAndroid Build Coastguard Worker 
217*8fb009dcSAndroid Build Coastguard Worker // An evp_aead_ctx_st (typedefed as |EVP_AEAD_CTX| in base.h) represents an AEAD
218*8fb009dcSAndroid Build Coastguard Worker // algorithm configured with a specific key and message-independent IV.
219*8fb009dcSAndroid Build Coastguard Worker struct evp_aead_ctx_st {
220*8fb009dcSAndroid Build Coastguard Worker   const EVP_AEAD *aead;
221*8fb009dcSAndroid Build Coastguard Worker   union evp_aead_ctx_st_state state;
222*8fb009dcSAndroid Build Coastguard Worker   // tag_len may contain the actual length of the authentication tag if it is
223*8fb009dcSAndroid Build Coastguard Worker   // known at initialization time.
224*8fb009dcSAndroid Build Coastguard Worker   uint8_t tag_len;
225*8fb009dcSAndroid Build Coastguard Worker };
226*8fb009dcSAndroid Build Coastguard Worker 
227*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_MAX_KEY_LENGTH contains the maximum key length used by
228*8fb009dcSAndroid Build Coastguard Worker // any AEAD defined in this header.
229*8fb009dcSAndroid Build Coastguard Worker #define EVP_AEAD_MAX_KEY_LENGTH 80
230*8fb009dcSAndroid Build Coastguard Worker 
231*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_MAX_NONCE_LENGTH contains the maximum nonce length used by
232*8fb009dcSAndroid Build Coastguard Worker // any AEAD defined in this header.
233*8fb009dcSAndroid Build Coastguard Worker #define EVP_AEAD_MAX_NONCE_LENGTH 24
234*8fb009dcSAndroid Build Coastguard Worker 
235*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_MAX_OVERHEAD contains the maximum overhead used by any AEAD
236*8fb009dcSAndroid Build Coastguard Worker // defined in this header.
237*8fb009dcSAndroid Build Coastguard Worker #define EVP_AEAD_MAX_OVERHEAD 64
238*8fb009dcSAndroid Build Coastguard Worker 
239*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_DEFAULT_TAG_LENGTH is a magic value that can be passed to
240*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_init to indicate that the default tag length for an AEAD should
241*8fb009dcSAndroid Build Coastguard Worker // be used.
242*8fb009dcSAndroid Build Coastguard Worker #define EVP_AEAD_DEFAULT_TAG_LENGTH 0
243*8fb009dcSAndroid Build Coastguard Worker 
244*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_zero sets an uninitialized |ctx| to the zero state. It must be
245*8fb009dcSAndroid Build Coastguard Worker // initialized with |EVP_AEAD_CTX_init| before use. It is safe, but not
246*8fb009dcSAndroid Build Coastguard Worker // necessary, to call |EVP_AEAD_CTX_cleanup| in this state. This may be used for
247*8fb009dcSAndroid Build Coastguard Worker // more uniform cleanup of |EVP_AEAD_CTX|.
248*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void EVP_AEAD_CTX_zero(EVP_AEAD_CTX *ctx);
249*8fb009dcSAndroid Build Coastguard Worker 
250*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_new allocates an |EVP_AEAD_CTX|, calls |EVP_AEAD_CTX_init| and
251*8fb009dcSAndroid Build Coastguard Worker // returns the |EVP_AEAD_CTX|, or NULL on error.
252*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT EVP_AEAD_CTX *EVP_AEAD_CTX_new(const EVP_AEAD *aead,
253*8fb009dcSAndroid Build Coastguard Worker                                               const uint8_t *key,
254*8fb009dcSAndroid Build Coastguard Worker                                               size_t key_len, size_t tag_len);
255*8fb009dcSAndroid Build Coastguard Worker 
256*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_free calls |EVP_AEAD_CTX_cleanup| and |OPENSSL_free| on
257*8fb009dcSAndroid Build Coastguard Worker // |ctx|.
258*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void EVP_AEAD_CTX_free(EVP_AEAD_CTX *ctx);
259*8fb009dcSAndroid Build Coastguard Worker 
260*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_init initializes |ctx| for the given AEAD algorithm. The |impl|
261*8fb009dcSAndroid Build Coastguard Worker // argument is ignored and should be NULL. Authentication tags may be truncated
262*8fb009dcSAndroid Build Coastguard Worker // by passing a size as |tag_len|. A |tag_len| of zero indicates the default
263*8fb009dcSAndroid Build Coastguard Worker // tag length and this is defined as EVP_AEAD_DEFAULT_TAG_LENGTH for
264*8fb009dcSAndroid Build Coastguard Worker // readability.
265*8fb009dcSAndroid Build Coastguard Worker //
266*8fb009dcSAndroid Build Coastguard Worker // Returns 1 on success. Otherwise returns 0 and pushes to the error stack. In
267*8fb009dcSAndroid Build Coastguard Worker // the error case, you do not need to call |EVP_AEAD_CTX_cleanup|, but it's
268*8fb009dcSAndroid Build Coastguard Worker // harmless to do so.
269*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_AEAD_CTX_init(EVP_AEAD_CTX *ctx, const EVP_AEAD *aead,
270*8fb009dcSAndroid Build Coastguard Worker                                      const uint8_t *key, size_t key_len,
271*8fb009dcSAndroid Build Coastguard Worker                                      size_t tag_len, ENGINE *impl);
272*8fb009dcSAndroid Build Coastguard Worker 
273*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_cleanup frees any data allocated by |ctx|. It is a no-op to
274*8fb009dcSAndroid Build Coastguard Worker // call |EVP_AEAD_CTX_cleanup| on a |EVP_AEAD_CTX| that has been |memset| to
275*8fb009dcSAndroid Build Coastguard Worker // all zeros.
276*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void EVP_AEAD_CTX_cleanup(EVP_AEAD_CTX *ctx);
277*8fb009dcSAndroid Build Coastguard Worker 
278*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_seal encrypts and authenticates |in_len| bytes from |in| and
279*8fb009dcSAndroid Build Coastguard Worker // authenticates |ad_len| bytes from |ad| and writes the result to |out|. It
280*8fb009dcSAndroid Build Coastguard Worker // returns one on success and zero otherwise.
281*8fb009dcSAndroid Build Coastguard Worker //
282*8fb009dcSAndroid Build Coastguard Worker // This function may be called concurrently with itself or any other seal/open
283*8fb009dcSAndroid Build Coastguard Worker // function on the same |EVP_AEAD_CTX|.
284*8fb009dcSAndroid Build Coastguard Worker //
285*8fb009dcSAndroid Build Coastguard Worker // At most |max_out_len| bytes are written to |out| and, in order to ensure
286*8fb009dcSAndroid Build Coastguard Worker // success, |max_out_len| should be |in_len| plus the result of
287*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_max_overhead|. On successful return, |*out_len| is set to the
288*8fb009dcSAndroid Build Coastguard Worker // actual number of bytes written.
289*8fb009dcSAndroid Build Coastguard Worker //
290*8fb009dcSAndroid Build Coastguard Worker // The length of |nonce|, |nonce_len|, must be equal to the result of
291*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_nonce_length| for this AEAD.
292*8fb009dcSAndroid Build Coastguard Worker //
293*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_CTX_seal| never results in a partial output. If |max_out_len| is
294*8fb009dcSAndroid Build Coastguard Worker // insufficient, zero will be returned. If any error occurs, |out| will be
295*8fb009dcSAndroid Build Coastguard Worker // filled with zero bytes and |*out_len| set to zero.
296*8fb009dcSAndroid Build Coastguard Worker //
297*8fb009dcSAndroid Build Coastguard Worker // If |in| and |out| alias then |out| must be == |in|.
298*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_AEAD_CTX_seal(const EVP_AEAD_CTX *ctx, uint8_t *out,
299*8fb009dcSAndroid Build Coastguard Worker                                      size_t *out_len, size_t max_out_len,
300*8fb009dcSAndroid Build Coastguard Worker                                      const uint8_t *nonce, size_t nonce_len,
301*8fb009dcSAndroid Build Coastguard Worker                                      const uint8_t *in, size_t in_len,
302*8fb009dcSAndroid Build Coastguard Worker                                      const uint8_t *ad, size_t ad_len);
303*8fb009dcSAndroid Build Coastguard Worker 
304*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_open authenticates |in_len| bytes from |in| and |ad_len| bytes
305*8fb009dcSAndroid Build Coastguard Worker // from |ad| and decrypts at most |in_len| bytes into |out|. It returns one on
306*8fb009dcSAndroid Build Coastguard Worker // success and zero otherwise.
307*8fb009dcSAndroid Build Coastguard Worker //
308*8fb009dcSAndroid Build Coastguard Worker // This function may be called concurrently with itself or any other seal/open
309*8fb009dcSAndroid Build Coastguard Worker // function on the same |EVP_AEAD_CTX|.
310*8fb009dcSAndroid Build Coastguard Worker //
311*8fb009dcSAndroid Build Coastguard Worker // At most |in_len| bytes are written to |out|. In order to ensure success,
312*8fb009dcSAndroid Build Coastguard Worker // |max_out_len| should be at least |in_len|. On successful return, |*out_len|
313*8fb009dcSAndroid Build Coastguard Worker // is set to the the actual number of bytes written.
314*8fb009dcSAndroid Build Coastguard Worker //
315*8fb009dcSAndroid Build Coastguard Worker // The length of |nonce|, |nonce_len|, must be equal to the result of
316*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_nonce_length| for this AEAD.
317*8fb009dcSAndroid Build Coastguard Worker //
318*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_CTX_open| never results in a partial output. If |max_out_len| is
319*8fb009dcSAndroid Build Coastguard Worker // insufficient, zero will be returned. If any error occurs, |out| will be
320*8fb009dcSAndroid Build Coastguard Worker // filled with zero bytes and |*out_len| set to zero.
321*8fb009dcSAndroid Build Coastguard Worker //
322*8fb009dcSAndroid Build Coastguard Worker // If |in| and |out| alias then |out| must be == |in|.
323*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_AEAD_CTX_open(const EVP_AEAD_CTX *ctx, uint8_t *out,
324*8fb009dcSAndroid Build Coastguard Worker                                      size_t *out_len, size_t max_out_len,
325*8fb009dcSAndroid Build Coastguard Worker                                      const uint8_t *nonce, size_t nonce_len,
326*8fb009dcSAndroid Build Coastguard Worker                                      const uint8_t *in, size_t in_len,
327*8fb009dcSAndroid Build Coastguard Worker                                      const uint8_t *ad, size_t ad_len);
328*8fb009dcSAndroid Build Coastguard Worker 
329*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_seal_scatter encrypts and authenticates |in_len| bytes from |in|
330*8fb009dcSAndroid Build Coastguard Worker // and authenticates |ad_len| bytes from |ad|. It writes |in_len| bytes of
331*8fb009dcSAndroid Build Coastguard Worker // ciphertext to |out| and the authentication tag to |out_tag|. It returns one
332*8fb009dcSAndroid Build Coastguard Worker // on success and zero otherwise.
333*8fb009dcSAndroid Build Coastguard Worker //
334*8fb009dcSAndroid Build Coastguard Worker // This function may be called concurrently with itself or any other seal/open
335*8fb009dcSAndroid Build Coastguard Worker // function on the same |EVP_AEAD_CTX|.
336*8fb009dcSAndroid Build Coastguard Worker //
337*8fb009dcSAndroid Build Coastguard Worker // Exactly |in_len| bytes are written to |out|, and up to
338*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_max_overhead+extra_in_len| bytes to |out_tag|. On successful
339*8fb009dcSAndroid Build Coastguard Worker // return, |*out_tag_len| is set to the actual number of bytes written to
340*8fb009dcSAndroid Build Coastguard Worker // |out_tag|.
341*8fb009dcSAndroid Build Coastguard Worker //
342*8fb009dcSAndroid Build Coastguard Worker // |extra_in| may point to an additional plaintext input buffer if the cipher
343*8fb009dcSAndroid Build Coastguard Worker // supports it. If present, |extra_in_len| additional bytes of plaintext are
344*8fb009dcSAndroid Build Coastguard Worker // encrypted and authenticated, and the ciphertext is written (before the tag)
345*8fb009dcSAndroid Build Coastguard Worker // to |out_tag|. |max_out_tag_len| must be sized to allow for the additional
346*8fb009dcSAndroid Build Coastguard Worker // |extra_in_len| bytes.
347*8fb009dcSAndroid Build Coastguard Worker //
348*8fb009dcSAndroid Build Coastguard Worker // The length of |nonce|, |nonce_len|, must be equal to the result of
349*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_nonce_length| for this AEAD.
350*8fb009dcSAndroid Build Coastguard Worker //
351*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_CTX_seal_scatter| never results in a partial output. If
352*8fb009dcSAndroid Build Coastguard Worker // |max_out_tag_len| is insufficient, zero will be returned. If any error
353*8fb009dcSAndroid Build Coastguard Worker // occurs, |out| and |out_tag| will be filled with zero bytes and |*out_tag_len|
354*8fb009dcSAndroid Build Coastguard Worker // set to zero.
355*8fb009dcSAndroid Build Coastguard Worker //
356*8fb009dcSAndroid Build Coastguard Worker // If |in| and |out| alias then |out| must be == |in|. |out_tag| may not alias
357*8fb009dcSAndroid Build Coastguard Worker // any other argument.
358*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_AEAD_CTX_seal_scatter(
359*8fb009dcSAndroid Build Coastguard Worker     const EVP_AEAD_CTX *ctx, uint8_t *out,
360*8fb009dcSAndroid Build Coastguard Worker     uint8_t *out_tag, size_t *out_tag_len, size_t max_out_tag_len,
361*8fb009dcSAndroid Build Coastguard Worker     const uint8_t *nonce, size_t nonce_len,
362*8fb009dcSAndroid Build Coastguard Worker     const uint8_t *in, size_t in_len,
363*8fb009dcSAndroid Build Coastguard Worker     const uint8_t *extra_in, size_t extra_in_len,
364*8fb009dcSAndroid Build Coastguard Worker     const uint8_t *ad, size_t ad_len);
365*8fb009dcSAndroid Build Coastguard Worker 
366*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_open_gather decrypts and authenticates |in_len| bytes from |in|
367*8fb009dcSAndroid Build Coastguard Worker // and authenticates |ad_len| bytes from |ad| using |in_tag_len| bytes of
368*8fb009dcSAndroid Build Coastguard Worker // authentication tag from |in_tag|. If successful, it writes |in_len| bytes of
369*8fb009dcSAndroid Build Coastguard Worker // plaintext to |out|. It returns one on success and zero otherwise.
370*8fb009dcSAndroid Build Coastguard Worker //
371*8fb009dcSAndroid Build Coastguard Worker // This function may be called concurrently with itself or any other seal/open
372*8fb009dcSAndroid Build Coastguard Worker // function on the same |EVP_AEAD_CTX|.
373*8fb009dcSAndroid Build Coastguard Worker //
374*8fb009dcSAndroid Build Coastguard Worker // The length of |nonce|, |nonce_len|, must be equal to the result of
375*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_nonce_length| for this AEAD.
376*8fb009dcSAndroid Build Coastguard Worker //
377*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_CTX_open_gather| never results in a partial output. If any error
378*8fb009dcSAndroid Build Coastguard Worker // occurs, |out| will be filled with zero bytes.
379*8fb009dcSAndroid Build Coastguard Worker //
380*8fb009dcSAndroid Build Coastguard Worker // If |in| and |out| alias then |out| must be == |in|.
381*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_AEAD_CTX_open_gather(
382*8fb009dcSAndroid Build Coastguard Worker     const EVP_AEAD_CTX *ctx, uint8_t *out, const uint8_t *nonce,
383*8fb009dcSAndroid Build Coastguard Worker     size_t nonce_len, const uint8_t *in, size_t in_len, const uint8_t *in_tag,
384*8fb009dcSAndroid Build Coastguard Worker     size_t in_tag_len, const uint8_t *ad, size_t ad_len);
385*8fb009dcSAndroid Build Coastguard Worker 
386*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_aead returns the underlying AEAD for |ctx|, or NULL if one has
387*8fb009dcSAndroid Build Coastguard Worker // not been set.
388*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_AEAD_CTX_aead(const EVP_AEAD_CTX *ctx);
389*8fb009dcSAndroid Build Coastguard Worker 
390*8fb009dcSAndroid Build Coastguard Worker 
391*8fb009dcSAndroid Build Coastguard Worker // TLS-specific AEAD algorithms.
392*8fb009dcSAndroid Build Coastguard Worker //
393*8fb009dcSAndroid Build Coastguard Worker // These AEAD primitives do not meet the definition of generic AEADs. They are
394*8fb009dcSAndroid Build Coastguard Worker // all specific to TLS and should not be used outside of that context. They must
395*8fb009dcSAndroid Build Coastguard Worker // be initialized with |EVP_AEAD_CTX_init_with_direction|, are stateful, and may
396*8fb009dcSAndroid Build Coastguard Worker // not be used concurrently. Any nonces are used as IVs, so they must be
397*8fb009dcSAndroid Build Coastguard Worker // unpredictable. They only accept an |ad| parameter of length 11 (the standard
398*8fb009dcSAndroid Build Coastguard Worker // TLS one with length omitted).
399*8fb009dcSAndroid Build Coastguard Worker 
400*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_cbc_sha1_tls(void);
401*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_cbc_sha1_tls_implicit_iv(void);
402*8fb009dcSAndroid Build Coastguard Worker 
403*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_cbc_sha256_tls(void);
404*8fb009dcSAndroid Build Coastguard Worker 
405*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_256_cbc_sha1_tls(void);
406*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_256_cbc_sha1_tls_implicit_iv(void);
407*8fb009dcSAndroid Build Coastguard Worker 
408*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_des_ede3_cbc_sha1_tls(void);
409*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv(void);
410*8fb009dcSAndroid Build Coastguard Worker 
411*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_128_gcm_tls12 is AES-128 in Galois Counter Mode using the TLS
412*8fb009dcSAndroid Build Coastguard Worker // 1.2 nonce construction.
413*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_gcm_tls12(void);
414*8fb009dcSAndroid Build Coastguard Worker 
415*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_256_gcm_tls12 is AES-256 in Galois Counter Mode using the TLS
416*8fb009dcSAndroid Build Coastguard Worker // 1.2 nonce construction.
417*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_256_gcm_tls12(void);
418*8fb009dcSAndroid Build Coastguard Worker 
419*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_128_gcm_tls13 is AES-128 in Galois Counter Mode using the TLS
420*8fb009dcSAndroid Build Coastguard Worker // 1.3 nonce construction.
421*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_gcm_tls13(void);
422*8fb009dcSAndroid Build Coastguard Worker 
423*8fb009dcSAndroid Build Coastguard Worker // EVP_aead_aes_256_gcm_tls13 is AES-256 in Galois Counter Mode using the TLS
424*8fb009dcSAndroid Build Coastguard Worker // 1.3 nonce construction.
425*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_256_gcm_tls13(void);
426*8fb009dcSAndroid Build Coastguard Worker 
427*8fb009dcSAndroid Build Coastguard Worker 
428*8fb009dcSAndroid Build Coastguard Worker // Obscure functions.
429*8fb009dcSAndroid Build Coastguard Worker 
430*8fb009dcSAndroid Build Coastguard Worker // evp_aead_direction_t denotes the direction of an AEAD operation.
431*8fb009dcSAndroid Build Coastguard Worker enum evp_aead_direction_t {
432*8fb009dcSAndroid Build Coastguard Worker   evp_aead_open,
433*8fb009dcSAndroid Build Coastguard Worker   evp_aead_seal,
434*8fb009dcSAndroid Build Coastguard Worker };
435*8fb009dcSAndroid Build Coastguard Worker 
436*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_init_with_direction calls |EVP_AEAD_CTX_init| for normal
437*8fb009dcSAndroid Build Coastguard Worker // AEADs. For TLS-specific and SSL3-specific AEADs, it initializes |ctx| for a
438*8fb009dcSAndroid Build Coastguard Worker // given direction.
439*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_AEAD_CTX_init_with_direction(
440*8fb009dcSAndroid Build Coastguard Worker     EVP_AEAD_CTX *ctx, const EVP_AEAD *aead, const uint8_t *key, size_t key_len,
441*8fb009dcSAndroid Build Coastguard Worker     size_t tag_len, enum evp_aead_direction_t dir);
442*8fb009dcSAndroid Build Coastguard Worker 
443*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_get_iv sets |*out_len| to the length of the IV for |ctx| and
444*8fb009dcSAndroid Build Coastguard Worker // sets |*out_iv| to point to that many bytes of the current IV. This is only
445*8fb009dcSAndroid Build Coastguard Worker // meaningful for AEADs with implicit IVs (i.e. CBC mode in TLS 1.0).
446*8fb009dcSAndroid Build Coastguard Worker //
447*8fb009dcSAndroid Build Coastguard Worker // It returns one on success or zero on error.
448*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_AEAD_CTX_get_iv(const EVP_AEAD_CTX *ctx,
449*8fb009dcSAndroid Build Coastguard Worker                                        const uint8_t **out_iv, size_t *out_len);
450*8fb009dcSAndroid Build Coastguard Worker 
451*8fb009dcSAndroid Build Coastguard Worker // EVP_AEAD_CTX_tag_len computes the exact byte length of the tag written by
452*8fb009dcSAndroid Build Coastguard Worker // |EVP_AEAD_CTX_seal_scatter| and writes it to |*out_tag_len|. It returns one
453*8fb009dcSAndroid Build Coastguard Worker // on success or zero on error. |in_len| and |extra_in_len| must equal the
454*8fb009dcSAndroid Build Coastguard Worker // arguments of the same names passed to |EVP_AEAD_CTX_seal_scatter|.
455*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_AEAD_CTX_tag_len(const EVP_AEAD_CTX *ctx,
456*8fb009dcSAndroid Build Coastguard Worker                                         size_t *out_tag_len,
457*8fb009dcSAndroid Build Coastguard Worker                                         const size_t in_len,
458*8fb009dcSAndroid Build Coastguard Worker                                         const size_t extra_in_len);
459*8fb009dcSAndroid Build Coastguard Worker 
460*8fb009dcSAndroid Build Coastguard Worker 
461*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus)
462*8fb009dcSAndroid Build Coastguard Worker }  // extern C
463*8fb009dcSAndroid Build Coastguard Worker 
464*8fb009dcSAndroid Build Coastguard Worker #if !defined(BORINGSSL_NO_CXX)
465*8fb009dcSAndroid Build Coastguard Worker extern "C++" {
466*8fb009dcSAndroid Build Coastguard Worker 
467*8fb009dcSAndroid Build Coastguard Worker BSSL_NAMESPACE_BEGIN
468*8fb009dcSAndroid Build Coastguard Worker 
469*8fb009dcSAndroid Build Coastguard Worker using ScopedEVP_AEAD_CTX =
470*8fb009dcSAndroid Build Coastguard Worker     internal::StackAllocated<EVP_AEAD_CTX, void, EVP_AEAD_CTX_zero,
471*8fb009dcSAndroid Build Coastguard Worker                              EVP_AEAD_CTX_cleanup>;
472*8fb009dcSAndroid Build Coastguard Worker 
473*8fb009dcSAndroid Build Coastguard Worker BORINGSSL_MAKE_DELETER(EVP_AEAD_CTX, EVP_AEAD_CTX_free)
474*8fb009dcSAndroid Build Coastguard Worker 
475*8fb009dcSAndroid Build Coastguard Worker BSSL_NAMESPACE_END
476*8fb009dcSAndroid Build Coastguard Worker 
477*8fb009dcSAndroid Build Coastguard Worker }  // extern C++
478*8fb009dcSAndroid Build Coastguard Worker #endif
479*8fb009dcSAndroid Build Coastguard Worker 
480*8fb009dcSAndroid Build Coastguard Worker #endif
481*8fb009dcSAndroid Build Coastguard Worker 
482*8fb009dcSAndroid Build Coastguard Worker #endif  // OPENSSL_HEADER_AEAD_H
483