Go to the documentation of this file.
62 #include "../../internal.h"
63 #include "../aes/internal.h"
64 #include "../modes/internal.h"
65 #include "../delocate.h"
71 #define AES_GCM_NONCE_LENGTH 12
74 static void vpaes_ctr32_encrypt_blocks_with_bsaes(
const uint8_t *
in,
85 size_t bsaes_blocks = blocks;
86 if (bsaes_blocks % 8 < 6) {
90 bsaes_blocks -= bsaes_blocks % 8;
98 in += 16 * bsaes_blocks;
99 out += 16 * bsaes_blocks;
100 blocks -= bsaes_blocks;
106 memcpy(new_ivec.u8, ivec, 16);
149 switch (
ctx->key_len) {
164 dat->stream.cbc = NULL;
180 dat->stream.cbc = NULL;
181 #if defined(VPAES_CBC)
189 dat->stream.cbc = NULL;
197 dat->stream.cbc = NULL;
206 dat->stream.cbc = NULL;
207 #if defined(VPAES_CBC)
215 dat->stream.ctr = vpaes_ctr32_encrypt_blocks_with_bsaes;
216 #elif defined(VPAES_CTR32)
223 dat->stream.cbc = NULL;
241 if (dat->stream.cbc) {
242 (*dat->stream.cbc)(
in,
out,
len, &dat->ks.ks,
ctx->iv,
ctx->encrypt);
243 }
else if (
ctx->encrypt) {
254 size_t bl =
ctx->cipher->block_size;
262 for (
size_t i = 0;
i <=
len;
i += bl) {
263 (*dat->block)(
in +
i,
out +
i, &dat->ks.ks);
273 if (dat->stream.ctr) {
275 &
ctx->num, dat->stream.ctr);
278 &
ctx->num, dat->block);
297 if (gcm_key != NULL) {
311 if (gcm_key != NULL) {
316 return vpaes_ctr32_encrypt_blocks_with_bsaes;
317 #elif defined(VPAES_CTR32)
325 if (gcm_key != NULL) {
334 #if defined(OPENSSL_32_BIT)
335 #define EVP_AES_GCM_CTX_PADDING (4+8)
337 #define EVP_AES_GCM_CTX_PADDING 8
341 #if defined(__GNUC__) || defined(__clang__)
344 "EVP_AES_GCM_CTX needs more alignment than this function provides");
349 assert(
ctx->cipher->ctx_size ==
352 char *
ptr =
ctx->cipher_data;
353 #if defined(OPENSSL_32_BIT)
369 switch (
ctx->key_len) {
384 if (iv == NULL && gctx->
iv_set) {
408 if (gctx->
iv !=
c->iv) {
435 gctx->
ivlen =
c->cipher->iv_len;
448 if (gctx->
iv !=
c->iv) {
526 if (gctx->
iv ==
c->iv) {
527 gctx_out->
iv =
out->iv;
560 }
else if (
ctx->encrypt) {
605 out->block_size = 16;
631 out->block_size = 16;
673 out->block_size = 16;
699 out->block_size = 16;
741 out->block_size = 16;
767 out->block_size = 16;
805 #if defined(HWAES_ECB)
809 size_t bl =
ctx->cipher->block_size;
824 out->block_size = 16;
829 out->cipher = aes_hw_ecb_cipher;
836 out->block_size = 16;
841 out->cipher = aes_hw_ecb_cipher;
848 out->block_size = 16;
853 out->cipher = aes_hw_ecb_cipher;
856 #define EVP_ECB_CIPHER_FUNCTION(keybits) \
857 const EVP_CIPHER *EVP_aes_##keybits##_ecb(void) { \
858 if (hwaes_capable()) { \
859 return aes_hw_##keybits##_ecb(); \
861 return aes_##keybits##_ecb_generic(); \
866 #define EVP_ECB_CIPHER_FUNCTION(keybits) \
867 const EVP_CIPHER *EVP_aes_##keybits##_ecb(void) { \
868 return aes_##keybits##_ecb_generic(); \
873 #define EVP_CIPHER_FUNCTION(keybits, mode) \
874 const EVP_CIPHER *EVP_aes_##keybits##_##mode(void) { \
875 return aes_##keybits##_##mode##_generic(); \
898 #define EVP_AEAD_AES_GCM_TAG_LEN 16
911 size_t key_len,
size_t tag_len) {
912 const size_t key_bits = key_len * 8;
924 if (key_bits != 128 && key_bits != 192 && key_bits != 256) {
940 *out_tag_len = tag_len;
946 "AEAD state is too small");
947 #if defined(__GNUC__) || defined(__clang__)
950 "AEAD state has insufficient alignment");
954 size_t key_len,
size_t requested_tag_len) {
957 size_t actual_tag_len;
959 requested_tag_len)) {
963 ctx->tag_len = actual_tag_len;
972 const uint8_t *nonce,
size_t nonce_len,
974 const uint8_t *extra_in,
size_t extra_in_len,
975 const uint8_t *ad,
size_t ad_len,
977 if (extra_in_len + tag_len < tag_len) {
981 if (max_out_tag_len < extra_in_len + tag_len) {
985 if (nonce_len == 0) {
1015 extra_in_len, gcm_ctx->
ctr)) {
1026 *out_tag_len = tag_len + extra_in_len;
1032 uint8_t *out_tag,
size_t *out_tag_len,
1033 size_t max_out_tag_len,
1034 const uint8_t *nonce,
size_t nonce_len,
1037 size_t extra_in_len,
1038 const uint8_t *ad,
size_t ad_len) {
1042 gcm_ctx,
out, out_tag, out_tag_len, max_out_tag_len, nonce, nonce_len,
in,
1043 in_len, extra_in, extra_in_len, ad, ad_len,
ctx->tag_len);
1048 const uint8_t *nonce,
size_t nonce_len,
1052 const uint8_t *ad,
size_t ad_len,
1056 if (nonce_len == 0) {
1061 if (in_tag_len != tag_len) {
1098 const uint8_t *nonce,
size_t nonce_len,
1100 const uint8_t *in_tag,
size_t in_tag_len,
1101 const uint8_t *ad,
size_t ad_len) {
1104 in_len, in_tag, in_tag_len, ad, ad_len,
1115 out->seal_scatter_supports_extra_in = 1;
1130 out->seal_scatter_supports_extra_in = 1;
1145 out->seal_scatter_supports_extra_in = 1;
1155 size_t requested_tag_len) {
1175 const uint8_t *external_nonce,
size_t external_nonce_len,
1177 const uint8_t *extra_in,
size_t extra_in_len,
1178 const uint8_t *ad,
size_t ad_len) {
1179 if (external_nonce_len != 0) {
1185 if (max_out_tag_len <
sizeof(nonce)) {
1195 nonce,
sizeof(nonce),
in, in_len,
1196 extra_in, extra_in_len, ad, ad_len,
1201 assert(*out_tag_len +
sizeof(nonce) <= max_out_tag_len);
1202 memcpy(out_tag + *out_tag_len, nonce,
sizeof(nonce));
1203 *out_tag_len +=
sizeof(nonce);
1210 const uint8_t *external_nonce,
size_t external_nonce_len,
1212 const uint8_t *in_tag,
size_t in_tag_len,
1213 const uint8_t *ad,
size_t ad_len) {
1214 if (external_nonce_len != 0) {
1240 out->seal_scatter_supports_extra_in = 1;
1255 out->seal_scatter_supports_extra_in = 1;
1270 "AEAD state is too small");
1271 #if defined(__GNUC__) || defined(__clang__)
1274 "AEAD state has insufficient alignment");
1278 size_t key_len,
size_t requested_tag_len) {
1284 size_t actual_tag_len;
1286 requested_tag_len)) {
1290 ctx->tag_len = actual_tag_len;
1296 size_t *out_tag_len,
size_t max_out_tag_len,
const uint8_t *nonce,
1297 size_t nonce_len,
const uint8_t *
in,
size_t in_len,
const uint8_t *extra_in,
1298 size_t extra_in_len,
const uint8_t *ad,
size_t ad_len) {
1309 OPENSSL_memcpy(&given_counter, nonce + nonce_len -
sizeof(given_counter),
1310 sizeof(given_counter));
1318 gcm_ctx->min_next_nonce = given_counter + 1;
1321 max_out_tag_len, nonce, nonce_len,
in,
1322 in_len, extra_in, extra_in_len, ad, ad_len);
1332 out->seal_scatter_supports_extra_in = 1;
1347 out->seal_scatter_supports_extra_in = 1;
1364 "AEAD state is too small");
1365 #if defined(__GNUC__) || defined(__clang__)
1368 "AEAD state has insufficient alignment");
1372 size_t key_len,
size_t requested_tag_len) {
1379 size_t actual_tag_len;
1381 requested_tag_len)) {
1385 ctx->tag_len = actual_tag_len;
1391 size_t *out_tag_len,
size_t max_out_tag_len,
const uint8_t *nonce,
1392 size_t nonce_len,
const uint8_t *
in,
size_t in_len,
const uint8_t *extra_in,
1393 size_t extra_in_len,
const uint8_t *ad,
size_t ad_len) {
1406 OPENSSL_memcpy(&given_counter, nonce + nonce_len -
sizeof(given_counter),
1407 sizeof(given_counter));
1413 gcm_ctx->mask = given_counter;
1416 given_counter ^=
gcm_ctx->mask;
1424 gcm_ctx->min_next_nonce = given_counter + 1;
1427 max_out_tag_len, nonce, nonce_len,
in,
1428 in_len, extra_in, extra_in_len, ad, ad_len);
1438 out->seal_scatter_supports_extra_in = 1;
1453 out->seal_scatter_supports_extra_in = 1;
1462 #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
1464 #elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
1466 #elif defined(OPENSSL_PPC64LE)
1467 return CRYPTO_is_PPC64LE_vcrypto_capable();
#define CRYPTO_gcm128_decrypt_ctr32
#define EVP_CTRL_GCM_SET_IV_INV
OPENSSL_INLINE void boringssl_fips_inc_counter(enum fips_counter_t counter)
void(* cbc128_f)(const uint8_t *in, uint8_t *out, size_t len, const AES_KEY *key, uint8_t ivec[16], int enc)
struct aead_aes_gcm_ctx gcm_ctx
#define aes_nohw_ctr32_encrypt_blocks
#define CRYPTO_gcm128_finish
#define CIPHER_R_AES_KEY_SETUP_FAILED
return memset(p, 0, total)
#define CRYPTO_gcm128_encrypt
OPENSSL_INLINE char vpaes_capable(void)
OPENSSL_INLINE void vpaes_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, const AES_KEY *key, uint8_t *ivec, int enc)
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_128_gcm_randnonce(void)
#define OPENSSL_PUT_ERROR(library, reason)
OPENSSL_STATIC_ASSERT(sizeof(((EVP_AEAD_CTX *) NULL) ->state) >=sizeof(struct aead_aes_gcm_ctx), "AEAD state is too small")
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_128_gcm_tls13(void)
static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, const uint8_t *iv, int enc)
#define CIPHER_R_INVALID_NONCE_SIZE
static uint64_t CRYPTO_bswap8(uint64_t x)
OPENSSL_INLINE void aes_hw_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, size_t len, const AES_KEY *key, const uint8_t ivec[16])
OPENSSL_INLINE int aes_hw_set_encrypt_key(const uint8_t *user_key, int bits, AES_KEY *key)
#define CRYPTO_cbc128_encrypt
static int aead_aes_gcm_tls13_init(EVP_AEAD_CTX *ctx, const uint8_t *key, size_t key_len, size_t requested_tag_len)
#define CRYPTO_gcm128_decrypt
static int aead_aes_gcm_init(EVP_AEAD_CTX *ctx, const uint8_t *key, size_t key_len, size_t requested_tag_len)
DEFINE_LOCAL_DATA(EVP_CIPHER, aes_128_cbc_generic)
OPENSSL_INLINE void bsaes_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, size_t len, const AES_KEY *key, const uint8_t ivec[16])
#define CIPHER_R_BAD_KEY_LENGTH
#define CRYPTO_ctr128_encrypt_ctr32
#define CRYPTO_gcm128_setiv
#define CRYPTO_gcm128_init_key
static int aead_aes_gcm_open_gather_impl(const struct aead_aes_gcm_ctx *gcm_ctx, uint8_t *out, const uint8_t *nonce, size_t nonce_len, const uint8_t *in, size_t in_len, const uint8_t *in_tag, size_t in_tag_len, const uint8_t *ad, size_t ad_len, size_t tag_len)
static void * OPENSSL_memset(void *dst, int c, size_t n)
OPENSSL_INLINE void bsaes_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, const AES_KEY *key, uint8_t ivec[16], int enc)
#define aes_hw_ecb_encrypt
#define EVP_CTRL_AEAD_SET_IVLEN
OPENSSL_INLINE void vpaes_decrypt_key_to_bsaes(AES_KEY *out_bsaes, const AES_KEY *vpaes)
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_256_gcm_tls13(void)
#define EVP_AEAD_DEFAULT_TAG_LENGTH
static int aes_ecb_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in, size_t len)
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_256_gcm(void)
#define EVP_CIPH_CTRL_INIT
#define EVP_CTRL_GCM_IV_GEN
#define CRYPTO_ofb128_encrypt
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
OPENSSL_INLINE int hwaes_capable(void)
@ fips_counter_evp_aes_128_ctr
static uint32_t CRYPTO_bswap4(uint32_t x)
#define crypto_gcm_clmul_enabled
static void * tag(intptr_t t)
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_128_gcm_tls12(void)
void(* ctr128_f)(const uint8_t *in, uint8_t *out, size_t blocks, const AES_KEY *key, const uint8_t ivec[16])
static int aes_ctr_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in, size_t len)
static int aead_aes_gcm_seal_scatter_impl(const struct aead_aes_gcm_ctx *gcm_ctx, uint8_t *out, uint8_t *out_tag, size_t *out_tag_len, size_t max_out_tag_len, const uint8_t *nonce, size_t nonce_len, const uint8_t *in, size_t in_len, const uint8_t *extra_in, size_t extra_in_len, const uint8_t *ad, size_t ad_len, size_t tag_len)
#define AES_GCM_NONCE_LENGTH
#define CIPHER_R_UNSUPPORTED_NONCE_SIZE
#define NID_aes_192_ofb128
static int aead_aes_gcm_open_gather_randnonce(const EVP_AEAD_CTX *ctx, uint8_t *out, const uint8_t *external_nonce, size_t external_nonce_len, const uint8_t *in, size_t in_len, const uint8_t *in_tag, size_t in_tag_len, const uint8_t *ad, size_t ad_len)
static EVP_AES_GCM_CTX * aes_gcm_from_cipher_ctx(EVP_CIPHER_CTX *ctx)
#define CIPHER_R_TAG_TOO_LARGE
int EVP_has_aes_hardware(void)
unsigned __int64 uint64_t
static void * OPENSSL_memcpy(void *dst, const void *src, size_t n)
#define EVP_CIPH_MODE_MASK
#define EVP_CTRL_AEAD_GET_TAG
OPENSSL_INLINE void vpaes_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key)
#define EVP_CIPH_CUSTOM_COPY
OPENSSL_MSVC_PRAGMA(warning(disable:4702))
static int aes_gcm_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in, size_t len)
static int aead_aes_gcm_tls13_seal_scatter(const EVP_AEAD_CTX *ctx, uint8_t *out, uint8_t *out_tag, size_t *out_tag_len, size_t max_out_tag_len, const uint8_t *nonce, size_t nonce_len, const uint8_t *in, size_t in_len, const uint8_t *extra_in, size_t extra_in_len, const uint8_t *ad, size_t ad_len)
_W64 unsigned int uintptr_t
static int aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, const uint8_t *iv, int enc)
#define NID_aes_256_ofb128
#define EVP_CTRL_AEAD_SET_TAG
#define CIPHER_R_BUFFER_TOO_SMALL
#define vpaes_ctr32_encrypt_blocks
static int aead_aes_gcm_seal_scatter_randnonce(const EVP_AEAD_CTX *ctx, uint8_t *out, uint8_t *out_tag, size_t *out_tag_len, size_t max_out_tag_len, const uint8_t *external_nonce, size_t external_nonce_len, const uint8_t *in, size_t in_len, const uint8_t *extra_in, size_t extra_in_len, const uint8_t *ad, size_t ad_len)
#define EVP_CIPH_CBC_MODE
static void ctr64_inc(uint8_t *counter)
ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_KEY *gcm_key, block128_f *out_block, const uint8_t *key, size_t key_bytes)
int push(void *desc, unsigned char *buf, unsigned len)
#define aes_nohw_set_encrypt_key
OPENSSL_INLINE void vpaes_encrypt_key_to_bsaes(AES_KEY *out_bsaes, const AES_KEY *vpaes)
#define EVP_CIPH_FLAG_AEAD_CIPHER
OPENSSL_INLINE int vpaes_set_decrypt_key(const uint8_t *userKey, int bits, AES_KEY *key)
DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_128_gcm)
static int aead_aes_gcm_open_gather(const EVP_AEAD_CTX *ctx, uint8_t *out, const uint8_t *nonce, size_t nonce_len, const uint8_t *in, size_t in_len, const uint8_t *in_tag, size_t in_tag_len, const uint8_t *ad, size_t ad_len)
OPENSSL_INLINE void aes_hw_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key)
OPENSSL_INLINE void vpaes_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key)
#define CRYPTO_ctr128_encrypt
#define EVP_CIPHER_FUNCTION(keybits, mode)
OPENSSL_INLINE int vpaes_set_encrypt_key(const uint8_t *userKey, int bits, AES_KEY *key)
CONSTEXPR_F fields align(second_tag, fields f) noexcept
#define NID_aes_128_ofb128
#define EVP_CIPH_FLAG_CUSTOM_CIPHER
@ fips_counter_evp_aes_256_ctr
static int aes_cbc_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in, size_t len)
#define EVP_CIPH_CTR_MODE
#define EVP_ECB_CIPHER_FUNCTION(keybits)
UniquePtr< SSL_SESSION > ret
static void aes_gcm_cleanup(EVP_CIPHER_CTX *c)
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_256_gcm_tls12(void)
#define aes_nohw_cbc_encrypt
#define CIPHER_R_INVALID_NONCE
#define EVP_AEAD_AES_GCM_TAG_LEN
#define EVP_MAX_IV_LENGTH
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_192_gcm(void)
#define CIPHER_R_TOO_LARGE
#define EVP_CIPH_OFB_MODE
static int aead_aes_gcm_tls12_seal_scatter(const EVP_AEAD_CTX *ctx, uint8_t *out, uint8_t *out_tag, size_t *out_tag_len, size_t max_out_tag_len, const uint8_t *nonce, size_t nonce_len, const uint8_t *in, size_t in_len, const uint8_t *extra_in, size_t extra_in_len, const uint8_t *ad, size_t ad_len)
#define CRYPTO_cbc128_decrypt
#define CRYPTO_gcm128_aad
#define EVP_CTRL_AEAD_SET_IV_FIXED
static int aead_aes_gcm_seal_scatter(const EVP_AEAD_CTX *ctx, uint8_t *out, uint8_t *out_tag, size_t *out_tag_len, size_t max_out_tag_len, const uint8_t *nonce, size_t nonce_len, const uint8_t *in, size_t in_len, const uint8_t *extra_in, size_t extra_in_len, const uint8_t *ad, size_t ad_len)
@ fips_counter_evp_aes_128_gcm
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_256_gcm_randnonce(void)
OPENSSL_INLINE void aes_hw_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, const AES_KEY *key, uint8_t *ivec, int enc)
static int aead_aes_gcm_init_impl(struct aead_aes_gcm_ctx *gcm_ctx, size_t *out_tag_len, const uint8_t *key, size_t key_len, size_t tag_len)
static int aead_aes_gcm_init_randnonce(EVP_AEAD_CTX *ctx, const uint8_t *key, size_t key_len, size_t requested_tag_len)
#define aes_nohw_set_decrypt_key
#define EVP_CIPH_ALWAYS_CALL_INIT
static int aead_aes_gcm_tls12_init(EVP_AEAD_CTX *ctx, const uint8_t *key, size_t key_len, size_t requested_tag_len)
static void aead_aes_gcm_cleanup(EVP_AEAD_CTX *ctx)
OPENSSL_INLINE int aes_hw_set_decrypt_key(const uint8_t *user_key, int bits, AES_KEY *key)
#define CRYPTO_gcm128_encrypt_ctr32
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_128_gcm(void)
static int aes_ofb_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in, size_t len)
static int aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
struct aead_aes_gcm_ctx gcm_ctx
@ fips_counter_evp_aes_256_gcm
#define EVP_AES_GCM_CTX_PADDING
if(p->owned &&p->wrapped !=NULL)
OPENSSL_INLINE void aes_hw_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key)
void(* block128_f)(const uint8_t in[16], uint8_t out[16], const AES_KEY *key)
#define EVP_CIPH_CUSTOM_IV
OPENSSL_INLINE char bsaes_capable(void)
#define CIPHER_R_BAD_DECRYPT
#define CRYPTO_gcm128_tag
#define EVP_CIPH_GCM_MODE
#define EVP_CIPH_ECB_MODE
grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:18