#include <grpc/support/port_platform.h>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/hmac.h>
#include <grpc/support/alloc.h>
#include "src/core/tsi/alts/crypt/gsec.h"
constexpr size_t kKdfKeyLen = …;
constexpr size_t kKdfCounterLen = …;
constexpr size_t kKdfCounterOffset = …;
constexpr size_t kRekeyAeadKeyLen = …;
struct gsec_aes_gcm_aead_rekey_data { … };
struct gsec_aes_gcm_aead_crypter { … };
static char* aes_gcm_get_openssl_errors() { … }
static void aes_gcm_format_errors(const char* error_msg, char** error_details) { … }
static grpc_status_code gsec_aes_gcm_aead_crypter_max_ciphertext_and_tag_length(
const gsec_aead_crypter* crypter, size_t plaintext_length,
size_t* max_ciphertext_and_tag_length, char** error_details) { … }
static grpc_status_code gsec_aes_gcm_aead_crypter_max_plaintext_length(
const gsec_aead_crypter* crypter, size_t ciphertext_and_tag_length,
size_t* max_plaintext_length, char** error_details) { … }
static grpc_status_code gsec_aes_gcm_aead_crypter_nonce_length(
const gsec_aead_crypter* crypter, size_t* nonce_length,
char** error_details) { … }
static grpc_status_code gsec_aes_gcm_aead_crypter_key_length(
const gsec_aead_crypter* crypter, size_t* key_length,
char** error_details) { … }
static grpc_status_code gsec_aes_gcm_aead_crypter_tag_length(
const gsec_aead_crypter* crypter, size_t* tag_length,
char** error_details) { … }
static void aes_gcm_mask_nonce(uint8_t* dst, const uint8_t* nonce,
const uint8_t* mask) { … }
static grpc_status_code aes_gcm_derive_aead_key(uint8_t* dst,
const uint8_t* kdf_key,
const uint8_t* kdf_counter) { … }
static grpc_status_code aes_gcm_rekey_if_required(
gsec_aes_gcm_aead_crypter* aes_gcm_crypter, const uint8_t* nonce,
char** error_details) { … }
static grpc_status_code gsec_aes_gcm_aead_crypter_encrypt_iovec(
gsec_aead_crypter* crypter, const uint8_t* nonce, size_t nonce_length,
const struct iovec* aad_vec, size_t aad_vec_length,
const struct iovec* plaintext_vec, size_t plaintext_vec_length,
struct iovec ciphertext_vec, size_t* ciphertext_bytes_written,
char** error_details) { … }
static grpc_status_code gsec_aes_gcm_aead_crypter_decrypt_iovec(
gsec_aead_crypter* crypter, const uint8_t* nonce, size_t nonce_length,
const struct iovec* aad_vec, size_t aad_vec_length,
const struct iovec* ciphertext_vec, size_t ciphertext_vec_length,
struct iovec plaintext_vec, size_t* plaintext_bytes_written,
char** error_details) { … }
static void gsec_aes_gcm_aead_crypter_destroy(gsec_aead_crypter* crypter) { … }
static const gsec_aead_crypter_vtable vtable = …;
static grpc_status_code aes_gcm_new_evp_cipher_ctx(
gsec_aes_gcm_aead_crypter* aes_gcm_crypter, char** error_details) { … }
grpc_status_code gsec_aes_gcm_aead_crypter_create(const uint8_t* key,
size_t key_length,
size_t nonce_length,
size_t tag_length, bool rekey,
gsec_aead_crypter** crypter,
char** error_details) { … }