Path: blob/main/crypto/openssl/providers/implementations/ciphers/cipher_aes_ocb_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/*10* This file uses the low level AES functions (which are deprecated for11* non-internal use) in order to implement provider AES ciphers.12*/13#include "internal/deprecated.h"1415#include "cipher_aes_ocb.h"1617#define OCB_SET_KEY_FN(fn_set_enc_key, fn_set_dec_key, \18fn_block_enc, fn_block_dec, \19fn_stream_enc, fn_stream_dec) \20CRYPTO_ocb128_cleanup(&ctx->ocb); \21fn_set_enc_key(key, keylen * 8, &ctx->ksenc.ks); \22fn_set_dec_key(key, keylen * 8, &ctx->ksdec.ks); \23if (!CRYPTO_ocb128_init(&ctx->ocb, &ctx->ksenc.ks, &ctx->ksdec.ks, \24(block128_f)fn_block_enc, (block128_f)fn_block_dec, \25ctx->base.enc ? (ocb128_f)fn_stream_enc : \26(ocb128_f)fn_stream_dec)) \27return 0; \28ctx->key_set = 1293031static int cipher_hw_aes_ocb_generic_initkey(PROV_CIPHER_CTX *vctx,32const unsigned char *key,33size_t keylen)34{35PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;3637/*38* We set both the encrypt and decrypt key here because decrypt39* needs both. (i.e- AAD uses encrypt).40*/41# ifdef HWAES_CAPABLE42if (HWAES_CAPABLE) {43OCB_SET_KEY_FN(HWAES_set_encrypt_key, HWAES_set_decrypt_key,44HWAES_encrypt, HWAES_decrypt,45HWAES_ocb_encrypt, HWAES_ocb_decrypt);46} else47# endif48# ifdef VPAES_CAPABLE49if (VPAES_CAPABLE) {50OCB_SET_KEY_FN(vpaes_set_encrypt_key, vpaes_set_decrypt_key,51vpaes_encrypt, vpaes_decrypt, NULL, NULL);52} else53# endif54{55OCB_SET_KEY_FN(AES_set_encrypt_key, AES_set_decrypt_key,56AES_encrypt, AES_decrypt, NULL, NULL);57}58return 1;59}6061# if defined(AESNI_CAPABLE)6263static int cipher_hw_aes_ocb_aesni_initkey(PROV_CIPHER_CTX *vctx,64const unsigned char *key,65size_t keylen)66{67PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;6869OCB_SET_KEY_FN(aesni_set_encrypt_key, aesni_set_decrypt_key,70aesni_encrypt, aesni_decrypt,71aesni_ocb_encrypt, aesni_ocb_decrypt);72return 1;73}7475# define PROV_CIPHER_HW_declare() \76static const PROV_CIPHER_HW aesni_ocb = { \77cipher_hw_aes_ocb_aesni_initkey, \78NULL \79};80# define PROV_CIPHER_HW_select() \81if (AESNI_CAPABLE) \82return &aesni_ocb;8384#elif defined(SPARC_AES_CAPABLE)8586static int cipher_hw_aes_ocb_t4_initkey(PROV_CIPHER_CTX *vctx,87const unsigned char *key,88size_t keylen)89{90PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;9192OCB_SET_KEY_FN(aes_t4_set_encrypt_key, aes_t4_set_decrypt_key,93aes_t4_encrypt, aes_t4_decrypt, NULL, NULL);94return 1;95}9697# define PROV_CIPHER_HW_declare() \98static const PROV_CIPHER_HW aes_t4_ocb = { \99cipher_hw_aes_ocb_t4_initkey, \100NULL \101};102# define PROV_CIPHER_HW_select() \103if (SPARC_AES_CAPABLE) \104return &aes_t4_ocb;105106#elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 64107108static int cipher_hw_aes_ocb_rv64i_zknd_zkne_initkey(PROV_CIPHER_CTX *vctx,109const unsigned char *key,110size_t keylen)111{112PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;113114OCB_SET_KEY_FN(rv64i_zkne_set_encrypt_key, rv64i_zknd_set_decrypt_key,115rv64i_zkne_encrypt, rv64i_zknd_decrypt, NULL, NULL);116return 1;117}118119static int cipher_hw_aes_ocb_rv64i_zvkned_initkey(PROV_CIPHER_CTX *vctx,120const unsigned char *key,121size_t keylen)122{123PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;124125/* Zvkned only supports 128 and 256 bit keys. */126if (keylen * 8 == 128 || keylen * 8 == 256) {127OCB_SET_KEY_FN(rv64i_zvkned_set_encrypt_key,128rv64i_zvkned_set_decrypt_key,129rv64i_zvkned_encrypt, rv64i_zvkned_decrypt,130NULL, NULL);131} else {132OCB_SET_KEY_FN(AES_set_encrypt_key, AES_set_encrypt_key,133rv64i_zvkned_encrypt, rv64i_zvkned_decrypt,134NULL, NULL);135}136return 1;137}138139# define PROV_CIPHER_HW_declare() \140static const PROV_CIPHER_HW aes_rv64i_zknd_zkne_ocb = { \141cipher_hw_aes_ocb_rv64i_zknd_zkne_initkey, \142NULL \143}; \144static const PROV_CIPHER_HW aes_rv64i_zvkned_ocb = { \145cipher_hw_aes_ocb_rv64i_zvkned_initkey, \146NULL \147};148# define PROV_CIPHER_HW_select() \149if (RISCV_HAS_ZVKNED() && riscv_vlen() >= 128) \150return &aes_rv64i_zvkned_ocb; \151else if (RISCV_HAS_ZKND_AND_ZKNE()) \152return &aes_rv64i_zknd_zkne_ocb;153154#elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 32155156static int cipher_hw_aes_ocb_rv32i_zknd_zkne_initkey(PROV_CIPHER_CTX *vctx,157const unsigned char *key,158size_t keylen)159{160PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;161162OCB_SET_KEY_FN(rv32i_zkne_set_encrypt_key, rv32i_zknd_zkne_set_decrypt_key,163rv32i_zkne_encrypt, rv32i_zknd_decrypt, NULL, NULL);164return 1;165}166167static int cipher_hw_aes_ocb_rv32i_zbkb_zknd_zkne_initkey(PROV_CIPHER_CTX *vctx,168const unsigned char *key,169size_t keylen)170{171PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;172173OCB_SET_KEY_FN(rv32i_zbkb_zkne_set_encrypt_key, rv32i_zbkb_zknd_zkne_set_decrypt_key,174rv32i_zkne_encrypt, rv32i_zknd_decrypt, NULL, NULL);175return 1;176}177178# define PROV_CIPHER_HW_declare() \179static const PROV_CIPHER_HW aes_rv32i_zknd_zkne_ocb = { \180cipher_hw_aes_ocb_rv32i_zknd_zkne_initkey, \181NULL \182}; \183static const PROV_CIPHER_HW aes_rv32i_zbkb_zknd_zkne_ocb = { \184cipher_hw_aes_ocb_rv32i_zbkb_zknd_zkne_initkey, \185NULL \186};187# define PROV_CIPHER_HW_select() \188if (RISCV_HAS_ZBKB_AND_ZKND_AND_ZKNE()) \189return &aes_rv32i_zbkb_zknd_zkne_ocb; \190if (RISCV_HAS_ZKND_AND_ZKNE()) \191return &aes_rv32i_zknd_zkne_ocb;192#else193# define PROV_CIPHER_HW_declare()194# define PROV_CIPHER_HW_select()195# endif196197static const PROV_CIPHER_HW aes_generic_ocb = {198cipher_hw_aes_ocb_generic_initkey,199NULL200};201PROV_CIPHER_HW_declare()202const PROV_CIPHER_HW *ossl_prov_cipher_hw_aes_ocb(size_t keybits)203{204PROV_CIPHER_HW_select()205return &aes_generic_ocb;206}207208209210211