1.\" $OpenBSD: EVP_AEAD_CTX_init.3,v 1.11 2023/05/09 07:19:24 tb Exp $ 2.\" 3.\" Copyright (c) 2014, Google Inc. 4.\" Parts of the text were written by Adam Langley and David Benjamin. 5.\" Copyright (c) 2015 Reyk Floeter <reyk@openbsd.org> 6.\" 7.\" Permission to use, copy, modify, and/or distribute this software for any 8.\" purpose with or without fee is hereby granted, provided that the above 9.\" copyright notice and this permission notice appear in all copies. 10.\" 11.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18.\" 19.Dd $Mdocdate: May 9 2023 $ 20.Dt EVP_AEAD_CTX_INIT 3 21.Os 22.Sh NAME 23.Nm EVP_AEAD_CTX_new , 24.Nm EVP_AEAD_CTX_free , 25.Nm EVP_AEAD_CTX_init , 26.Nm EVP_AEAD_CTX_cleanup , 27.Nm EVP_AEAD_CTX_open , 28.Nm EVP_AEAD_CTX_seal , 29.Nm EVP_AEAD_key_length , 30.Nm EVP_AEAD_max_overhead , 31.Nm EVP_AEAD_max_tag_len , 32.Nm EVP_AEAD_nonce_length , 33.Nm EVP_aead_aes_128_gcm , 34.Nm EVP_aead_aes_256_gcm , 35.Nm EVP_aead_chacha20_poly1305 , 36.Nm EVP_aead_xchacha20_poly1305 37.Nd authenticated encryption with additional data 38.Sh SYNOPSIS 39.In openssl/evp.h 40.Ft EVP_AEAD_CTX * 41.Fn EVP_AEAD_CTX_new void 42.Ft void 43.Fo EVP_AEAD_CTX_free 44.Fa "EVP_AEAD_CTX *ctx" 45.Fc 46.Ft int 47.Fo EVP_AEAD_CTX_init 48.Fa "EVP_AEAD_CTX *ctx" 49.Fa "const EVP_AEAD *aead" 50.Fa "const unsigned char *key" 51.Fa "size_t key_len" 52.Fa "size_t tag_len" 53.Fa "ENGINE *impl" 54.Fc 55.Ft void 56.Fo EVP_AEAD_CTX_cleanup 57.Fa "EVP_AEAD_CTX *ctx" 58.Fc 59.Ft int 60.Fo EVP_AEAD_CTX_open 61.Fa "const EVP_AEAD_CTX *ctx" 62.Fa "unsigned char *out" 63.Fa "size_t *out_len" 64.Fa "size_t max_out_len" 65.Fa "const unsigned char *nonce" 66.Fa "size_t nonce_len" 67.Fa "const unsigned char *in" 68.Fa "size_t in_len" 69.Fa "const unsigned char *ad" 70.Fa "size_t ad_len" 71.Fc 72.Ft int 73.Fo EVP_AEAD_CTX_seal 74.Fa "const EVP_AEAD_CTX *ctx" 75.Fa "unsigned char *out" 76.Fa "size_t *out_len" 77.Fa "size_t max_out_len" 78.Fa "const unsigned char *nonce" 79.Fa "size_t nonce_len" 80.Fa "const unsigned char *in" 81.Fa "size_t in_len" 82.Fa "const unsigned char *ad" 83.Fa "size_t ad_len" 84.Fc 85.Ft size_t 86.Fo EVP_AEAD_key_length 87.Fa "const EVP_AEAD *aead" 88.Fc 89.Ft size_t 90.Fo EVP_AEAD_max_overhead 91.Fa "const EVP_AEAD *aead" 92.Fc 93.Ft size_t 94.Fo EVP_AEAD_max_tag_len 95.Fa "const EVP_AEAD *aead" 96.Fc 97.Ft size_t 98.Fo EVP_AEAD_nonce_length 99.Fa "const EVP_AEAD *aead" 100.Fc 101.Ft const EVP_AEAD * 102.Fo EVP_aead_aes_128_gcm 103.Fa void 104.Fc 105.Ft const EVP_AEAD * 106.Fo EVP_aead_aes_256_gcm 107.Fa void 108.Fc 109.Ft const EVP_AEAD * 110.Fo EVP_aead_chacha20_poly1305 111.Fa void 112.Fc 113.Ft const EVP_AEAD * 114.Fo EVP_aead_xchacha20_poly1305 115.Fa void 116.Fc 117.Sh DESCRIPTION 118AEAD (Authenticated Encryption with Additional Data) couples 119confidentiality and integrity in a single primitive. 120AEAD algorithms take a key and can then seal and open individual 121messages. 122Each message has a unique, per-message nonce and, optionally, additional 123data which is authenticated but not included in the output. 124.Pp 125.Fn EVP_AEAD_CTX_new 126allocates a new context for use with 127.Fn EVP_AEAD_CTX_init . 128It can be cleaned up for reuse with 129.Fn EVP_AEAD_CTX_cleanup 130and must be freed with 131.Fn EVP_AEAD_CTX_free . 132.Pp 133.Fn EVP_AEAD_CTX_free 134cleans up 135.Fa ctx 136and frees the space allocated to it. 137.Pp 138.Fn EVP_AEAD_CTX_init 139initializes the context 140.Fa ctx 141for the given AEAD algorithm 142.Fa aead . 143The 144.Fa impl 145argument must be 146.Dv NULL 147for the default implementation; 148other values are currently not supported. 149Authentication tags may be truncated by passing a tag length. 150A tag length of zero indicates the default tag length should be used. 151.Pp 152.Fn EVP_AEAD_CTX_cleanup 153frees any data allocated for the context 154.Fa ctx . 155After 156.Fn EVP_AEAD_CTX_cleanup , 157.Fa ctx 158is in the same state as after 159.Fn EVP_AEAD_CTX_new . 160.Pp 161.Fn EVP_AEAD_CTX_open 162authenticates the input 163.Fa in 164and optional additional data 165.Fa ad , 166decrypting the input and writing it as output 167.Fa out . 168This function may be called (with the same 169.Vt EVP_AEAD_CTX ) 170concurrently with itself or with 171.Fn EVP_AEAD_CTX_seal . 172At most the number of input bytes are written as output. 173In order to ensure success, 174.Fa max_out_len 175should be at least the same as the input length 176.Fa in_len . 177On successful return 178.Fa out_len 179is set to the actual number of bytes written. 180The length of the 181.Fa nonce 182specified with 183.Fa nonce_len 184must be equal to the result of EVP_AEAD_nonce_length for this AEAD. 185.Fn EVP_AEAD_CTX_open 186never results in partial output. 187If 188.Fa max_out_len 189is insufficient, zero will be returned and 190.Fa out_len 191will be set to zero. 192If the input and output are aliased then 193.Fa out 194must be <= 195.Fa in . 196.Pp 197.Fn EVP_AEAD_CTX_seal 198encrypts and authenticates the input and authenticates any additional 199data provided in 200.Fa ad , 201the encrypted input and authentication tag being written as output 202.Fa out . 203This function may be called (with the same 204.Vt EVP_AEAD_CTX ) 205concurrently with itself or with 206.Fn EVP_AEAD_CTX_open . 207At most 208.Fa max_out_len 209bytes are written as output and, in order to ensure success, this value 210should be the 211.Fa in_len 212plus the result of 213.Fn EVP_AEAD_max_overhead . 214On successful return, 215.Fa out_len 216is set to the actual number of bytes written. 217The length of the 218.Fa nonce 219specified with 220.Fa nonce_len 221must be equal to the result of 222.Fn EVP_AEAD_nonce_length 223for this AEAD. 224.Fn EVP_AEAD_CTX_seal 225never results in a partial output. 226If 227.Fa max_out_len 228is insufficient, zero will be returned and 229.Fa out_len 230will be set to zero. 231If the input and output are aliased then 232.Fa out 233must be <= 234.Fa in . 235.Pp 236.Fn EVP_AEAD_key_length , 237.Fn EVP_AEAD_max_overhead , 238.Fn EVP_AEAD_max_tag_len , 239and 240.Fn EVP_AEAD_nonce_length 241provide information about the AEAD algorithm 242.Fa aead . 243.Pp 244All cipher algorithms have a fixed key length unless otherwise stated. 245The following ciphers are available: 246.Bl -tag -width Ds -offset indent 247.It Fn EVP_aead_aes_128_gcm 248AES-128 in Galois Counter Mode. 249.It Fn EVP_aead_aes_256_gcm 250AES-256 in Galois Counter Mode. 251.It Fn EVP_aead_chacha20_poly1305 252ChaCha20 with a Poly1305 authenticator. 253.It Fn EVP_aead_xchacha20_poly1305 254XChaCha20 with a Poly1305 authenticator. 255.El 256.Pp 257Where possible the 258.Sy EVP_AEAD 259interface to AEAD ciphers should be used in preference to the older 260.Sy EVP 261variants or to the low level interfaces. 262This is because the code then becomes transparent to the AEAD cipher 263used and much more flexible. 264It is also safer to use as it prevents common mistakes with the native APIs. 265.Sh RETURN VALUES 266.Fn EVP_AEAD_CTX_new 267returns the new 268.Vt EVP_AEAD_CTX 269object on success; 270otherwise 271.Dv NULL 272is returned and 273.Va errno 274is set to 275.Er ENOMEM . 276.Pp 277.Fn EVP_AEAD_CTX_init , 278.Fn EVP_AEAD_CTX_open , 279and 280.Fn EVP_AEAD_CTX_seal 281return 1 for success or zero for failure. 282.Pp 283.Fn EVP_AEAD_key_length 284returns the length of the key used for this AEAD. 285.Pp 286.Fn EVP_AEAD_max_overhead 287returns the maximum number of additional bytes added by the act of 288sealing data with the AEAD. 289.Pp 290.Fn EVP_AEAD_max_tag_len 291returns the maximum tag length when using this AEAD. 292This is the largest value that can be passed as a tag length to 293.Fn EVP_AEAD_CTX_init . 294.Pp 295.Fn EVP_AEAD_nonce_length 296returns the length of the per-message nonce. 297.Sh EXAMPLES 298Encrypt a string using ChaCha20-Poly1305: 299.Bd -literal -offset indent 300const EVP_AEAD *aead = EVP_aead_chacha20_poly1305(); 301static const unsigned char nonce[32] = {0}; 302size_t buf_len, nonce_len; 303EVP_AEAD_CTX *ctx; 304 305ctx = EVP_AEAD_CTX_new(); 306EVP_AEAD_CTX_init(ctx, aead, key32, EVP_AEAD_key_length(aead), 307 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL); 308nonce_len = EVP_AEAD_nonce_length(aead); 309 310EVP_AEAD_CTX_seal(ctx, out, &out_len, BUFSIZE, nonce, 311 nonce_len, in, in_len, NULL, 0); 312 313EVP_AEAD_CTX_free(ctx); 314.Ed 315.Sh SEE ALSO 316.Xr evp 3 , 317.Xr EVP_EncryptInit 3 318.Sh STANDARDS 319.Rs 320.%A A. Langley 321.%A W. Chang 322.%D November 2013 323.%R draft-agl-tls-chacha20poly1305-04 324.%T ChaCha20 and Poly1305 based Cipher Suites for TLS 325.Re 326.Pp 327.Rs 328.%A Y. Nir 329.%A A. Langley 330.%D May 2015 331.%R RFC 7539 332.%T ChaCha20 and Poly1305 for IETF Protocols 333.Re 334.Pp 335.Rs 336.%A S. Arciszewski 337.%D October 2018 338.%R draft-arciszewski-xchacha-02 339.%T XChaCha: eXtended-nonce ChaCha and AEAD_XChaCha20_Poly1305 340.Re 341.Sh HISTORY 342AEAD is based on the implementation by 343.An Adam Langley 344for Chromium/BoringSSL and first appeared in 345.Ox 5.6 . 346.Pp 347.Fn EVP_AEAD_CTX_new 348and 349.Fn EVP_AEAD_CTX_free 350first appeared in 351.Ox 7.1 . 352