Path: blob/main/crypto/openssl/providers/implementations/ciphers/cipher_aes_gcm_hw.c
48383 views
/*1* Copyright 2019-2024 The OpenSSL Project Authors. All Rights Reserved.2*3* Licensed under the Apache License 2.0 (the "License"). You may not use4* this file except in compliance with the License. You can obtain a copy5* in the file LICENSE in the source distribution or at6* https://www.openssl.org/source/license.html7*/89/* Dispatch functions for AES GCM mode */1011/*12* This file uses the low level AES functions (which are deprecated for13* non-internal use) in order to implement provider AES ciphers.14*/15#include "internal/deprecated.h"1617#include "cipher_aes_gcm.h"1819static int aes_gcm_initkey(PROV_GCM_CTX *ctx, const unsigned char *key,20size_t keylen)21{22PROV_AES_GCM_CTX *actx = (PROV_AES_GCM_CTX *)ctx;23AES_KEY *ks = &actx->ks.ks;2425# ifdef HWAES_CAPABLE26if (HWAES_CAPABLE) {27# ifdef HWAES_ctr32_encrypt_blocks28GCM_HW_SET_KEY_CTR_FN(ks, HWAES_set_encrypt_key, HWAES_encrypt,29HWAES_ctr32_encrypt_blocks);30# else31GCM_HW_SET_KEY_CTR_FN(ks, HWAES_set_encrypt_key, HWAES_encrypt, NULL);32# endif /* HWAES_ctr32_encrypt_blocks */33} else34# endif /* HWAES_CAPABLE */3536# ifdef BSAES_CAPABLE37if (BSAES_CAPABLE) {38GCM_HW_SET_KEY_CTR_FN(ks, AES_set_encrypt_key, AES_encrypt,39ossl_bsaes_ctr32_encrypt_blocks);40} else41# endif /* BSAES_CAPABLE */4243# ifdef VPAES_CAPABLE44if (VPAES_CAPABLE) {45GCM_HW_SET_KEY_CTR_FN(ks, vpaes_set_encrypt_key, vpaes_encrypt, NULL);46} else47# endif /* VPAES_CAPABLE */4849{50# ifdef AES_CTR_ASM51GCM_HW_SET_KEY_CTR_FN(ks, AES_set_encrypt_key, AES_encrypt,52AES_ctr32_encrypt);53# else54GCM_HW_SET_KEY_CTR_FN(ks, AES_set_encrypt_key, AES_encrypt, NULL);55# endif /* AES_CTR_ASM */56}57return 1;58}5960static int generic_aes_gcm_cipher_update(PROV_GCM_CTX *ctx, const unsigned char *in,61size_t len, unsigned char *out)62{63if (ctx->enc) {64if (ctx->ctr != NULL) {65#if defined(AES_GCM_ASM)66size_t bulk = 0;6768if (len >= AES_GCM_ENC_BYTES && AES_GCM_ASM(ctx)) {69size_t res = (16 - ctx->gcm.mres) % 16;7071if (CRYPTO_gcm128_encrypt(&ctx->gcm, in, out, res))72return 0;7374bulk = AES_gcm_encrypt(in + res, out + res, len - res,75ctx->gcm.key,76ctx->gcm.Yi.c, ctx->gcm.Xi.u);7778ctx->gcm.len.u[1] += bulk;79bulk += res;80}81if (CRYPTO_gcm128_encrypt_ctr32(&ctx->gcm, in + bulk, out + bulk,82len - bulk, ctx->ctr))83return 0;84#else85if (CRYPTO_gcm128_encrypt_ctr32(&ctx->gcm, in, out, len, ctx->ctr))86return 0;87#endif /* AES_GCM_ASM */88} else {89if (CRYPTO_gcm128_encrypt(&ctx->gcm, in, out, len))90return 0;91}92} else {93if (ctx->ctr != NULL) {94#if defined(AES_GCM_ASM)95size_t bulk = 0;9697if (len >= AES_GCM_DEC_BYTES && AES_GCM_ASM(ctx)) {98size_t res = (16 - ctx->gcm.mres) % 16;99100if (CRYPTO_gcm128_decrypt(&ctx->gcm, in, out, res))101return 0;102103bulk = AES_gcm_decrypt(in + res, out + res, len - res,104ctx->gcm.key,105ctx->gcm.Yi.c, ctx->gcm.Xi.u);106107ctx->gcm.len.u[1] += bulk;108bulk += res;109}110if (CRYPTO_gcm128_decrypt_ctr32(&ctx->gcm, in + bulk, out + bulk,111len - bulk, ctx->ctr))112return 0;113#else114if (CRYPTO_gcm128_decrypt_ctr32(&ctx->gcm, in, out, len, ctx->ctr))115return 0;116#endif /* AES_GCM_ASM */117} else {118if (CRYPTO_gcm128_decrypt(&ctx->gcm, in, out, len))119return 0;120}121}122return 1;123}124125static const PROV_GCM_HW aes_gcm = {126aes_gcm_initkey,127ossl_gcm_setiv,128ossl_gcm_aad_update,129generic_aes_gcm_cipher_update,130ossl_gcm_cipher_final,131ossl_gcm_one_shot132};133134#if defined(S390X_aes_128_CAPABLE)135# include "cipher_aes_gcm_hw_s390x.inc"136#elif defined(AESNI_CAPABLE)137# include "cipher_aes_gcm_hw_aesni.inc"138#elif defined(SPARC_AES_CAPABLE)139# include "cipher_aes_gcm_hw_t4.inc"140#elif defined(AES_PMULL_CAPABLE) && defined(AES_GCM_ASM)141# include "cipher_aes_gcm_hw_armv8.inc"142#elif defined(PPC_AES_GCM_CAPABLE) && defined(_ARCH_PPC64)143# include "cipher_aes_gcm_hw_ppc.inc"144#elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 64145# include "cipher_aes_gcm_hw_rv64i.inc"146#elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 32147# include "cipher_aes_gcm_hw_rv32i.inc"148#else149const PROV_GCM_HW *ossl_prov_aes_hw_gcm(size_t keybits)150{151return &aes_gcm;152}153#endif154155156157