30 cuda::std::array<EVP_CIPHER_CTX *, mul> ctxs_;
40 Aes128Mmo(cuda::std::span<EVP_CIPHER_CTX *, mul> ctxs) {
41 for (
int i = 0; i < mul; ++i) ctxs_[i] = ctxs[i];
49 static cuda::std::array<EVP_CIPHER_CTX *, mul>
CreateCtxs(
const unsigned char *keys[mul]) {
51 cuda::std::array<EVP_CIPHER_CTX *, mul> ctxs;
53 for (
int i = 0; i < mul; ++i) {
54 ctxs[i] = EVP_CIPHER_CTX_new();
55 assert(ctxs[i] != NULL);
57 ret = EVP_EncryptInit_ex2(ctxs[i], EVP_aes_128_ecb(), keys[i], NULL, NULL);
60 ret = EVP_CIPHER_CTX_set_padding(ctxs[i], 0);
66 static void FreeCtxs(cuda::std::span<EVP_CIPHER_CTX *, mul> ctxs) {
67 for (
auto ctx : ctxs) {
68 EVP_CIPHER_CTX_free(ctx);
72 __host__ __device__ cuda::std::array<int4, mul> Gen(int4 seed) {
73 cuda::std::array<int4, mul> out{};
76 assert(
false &&
"Aes128Mmo is not supported on device side");
79 for (
int i = 0; i < mul; ++i) {
80 auto out_ptr =
reinterpret_cast<unsigned char *
>(&out[i]);
81 auto seed_ptr =
reinterpret_cast<const unsigned char *
>(&seed);
84 int ret = EVP_EncryptUpdate(ctxs_[i], out_ptr, &cipher_len, seed_ptr, AES_BLOCK_SIZE);
86 assert(cipher_len == AES_BLOCK_SIZE);
88 out[i] = fss::util::Xor(out[i], seed);