xref: /freebsd/crypto/openssl/providers/implementations/ciphers/cipher_aes_hw_rv32i.inc (revision e7be843b4a162e68651d3911f0357ed464915629)
1*e7be843bSPierre Pronchery/*
2*e7be843bSPierre Pronchery * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.
3*e7be843bSPierre Pronchery *
4*e7be843bSPierre Pronchery * Licensed under the Apache License 2.0 (the "License").  You may not use
5*e7be843bSPierre Pronchery * this file except in compliance with the License.  You can obtain a copy
6*e7be843bSPierre Pronchery * in the file LICENSE in the source distribution or at
7*e7be843bSPierre Pronchery * https://www.openssl.org/source/license.html
8*e7be843bSPierre Pronchery */
9*e7be843bSPierre Pronchery
10*e7be843bSPierre Pronchery/*-
11*e7be843bSPierre Pronchery * RISC-V 32 ZKND ZKNE support for AES modes ecb, cbc, ofb, cfb, ctr.
12*e7be843bSPierre Pronchery * This file is included by cipher_aes_hw.c
13*e7be843bSPierre Pronchery */
14*e7be843bSPierre Pronchery
15*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zknd_zkne_cbc    ossl_cipher_hw_generic_cbc
16*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zknd_zkne_ecb    ossl_cipher_hw_generic_ecb
17*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zknd_zkne_ofb128 ossl_cipher_hw_generic_ofb128
18*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zknd_zkne_cfb128 ossl_cipher_hw_generic_cfb128
19*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zknd_zkne_cfb8   ossl_cipher_hw_generic_cfb8
20*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zknd_zkne_cfb1   ossl_cipher_hw_generic_cfb1
21*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zknd_zkne_ctr    ossl_cipher_hw_generic_ctr
22*e7be843bSPierre Pronchery
23*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zbkb_zknd_zkne_cbc    ossl_cipher_hw_generic_cbc
24*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zbkb_zknd_zkne_ecb    ossl_cipher_hw_generic_ecb
25*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zbkb_zknd_zkne_ofb128 ossl_cipher_hw_generic_ofb128
26*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zbkb_zknd_zkne_cfb128 ossl_cipher_hw_generic_cfb128
27*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zbkb_zknd_zkne_cfb8   ossl_cipher_hw_generic_cfb8
28*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zbkb_zknd_zkne_cfb1   ossl_cipher_hw_generic_cfb1
29*e7be843bSPierre Pronchery#define cipher_hw_rv32i_zbkb_zknd_zkne_ctr    ossl_cipher_hw_generic_ctr
30*e7be843bSPierre Pronchery
31*e7be843bSPierre Proncherystatic int cipher_hw_rv32i_zknd_zkne_initkey(PROV_CIPHER_CTX *dat,
32*e7be843bSPierre Pronchery                                             const unsigned char *key, size_t keylen)
33*e7be843bSPierre Pronchery{
34*e7be843bSPierre Pronchery    int ret;
35*e7be843bSPierre Pronchery    PROV_AES_CTX *adat = (PROV_AES_CTX *)dat;
36*e7be843bSPierre Pronchery    AES_KEY *ks = &adat->ks.ks;
37*e7be843bSPierre Pronchery
38*e7be843bSPierre Pronchery    dat->ks = ks;
39*e7be843bSPierre Pronchery
40*e7be843bSPierre Pronchery    if ((dat->mode == EVP_CIPH_ECB_MODE || dat->mode == EVP_CIPH_CBC_MODE)
41*e7be843bSPierre Pronchery        && !dat->enc) {
42*e7be843bSPierre Pronchery        ret = rv32i_zknd_zkne_set_decrypt_key(key, keylen * 8, ks);
43*e7be843bSPierre Pronchery        dat->block = (block128_f) rv32i_zknd_decrypt;
44*e7be843bSPierre Pronchery        dat->stream.cbc = NULL;
45*e7be843bSPierre Pronchery    } else {
46*e7be843bSPierre Pronchery        ret = rv32i_zkne_set_encrypt_key(key, keylen * 8, ks);
47*e7be843bSPierre Pronchery        dat->block = (block128_f) rv32i_zkne_encrypt;
48*e7be843bSPierre Pronchery        dat->stream.cbc = NULL;
49*e7be843bSPierre Pronchery    }
50*e7be843bSPierre Pronchery
51*e7be843bSPierre Pronchery    if (ret < 0) {
52*e7be843bSPierre Pronchery        ERR_raise(ERR_LIB_PROV, PROV_R_KEY_SETUP_FAILED);
53*e7be843bSPierre Pronchery        return 0;
54*e7be843bSPierre Pronchery    }
55*e7be843bSPierre Pronchery
56*e7be843bSPierre Pronchery    return 1;
57*e7be843bSPierre Pronchery}
58*e7be843bSPierre Pronchery
59*e7be843bSPierre Proncherystatic int cipher_hw_rv32i_zbkb_zknd_zkne_initkey(PROV_CIPHER_CTX *dat,
60*e7be843bSPierre Pronchery                                                  const unsigned char *key, size_t keylen)
61*e7be843bSPierre Pronchery{
62*e7be843bSPierre Pronchery    int ret;
63*e7be843bSPierre Pronchery    PROV_AES_CTX *adat = (PROV_AES_CTX *)dat;
64*e7be843bSPierre Pronchery    AES_KEY *ks = &adat->ks.ks;
65*e7be843bSPierre Pronchery
66*e7be843bSPierre Pronchery    dat->ks = ks;
67*e7be843bSPierre Pronchery
68*e7be843bSPierre Pronchery    if ((dat->mode == EVP_CIPH_ECB_MODE || dat->mode == EVP_CIPH_CBC_MODE)
69*e7be843bSPierre Pronchery        && !dat->enc) {
70*e7be843bSPierre Pronchery        ret = rv32i_zbkb_zknd_zkne_set_decrypt_key(key, keylen * 8, ks);
71*e7be843bSPierre Pronchery        dat->block = (block128_f) rv32i_zknd_decrypt;
72*e7be843bSPierre Pronchery        dat->stream.cbc = NULL;
73*e7be843bSPierre Pronchery    } else {
74*e7be843bSPierre Pronchery        ret = rv32i_zbkb_zkne_set_encrypt_key(key, keylen * 8, ks);
75*e7be843bSPierre Pronchery        dat->block = (block128_f) rv32i_zkne_encrypt;
76*e7be843bSPierre Pronchery        dat->stream.cbc = NULL;
77*e7be843bSPierre Pronchery    }
78*e7be843bSPierre Pronchery
79*e7be843bSPierre Pronchery    if (ret < 0) {
80*e7be843bSPierre Pronchery        ERR_raise(ERR_LIB_PROV, PROV_R_KEY_SETUP_FAILED);
81*e7be843bSPierre Pronchery        return 0;
82*e7be843bSPierre Pronchery    }
83*e7be843bSPierre Pronchery
84*e7be843bSPierre Pronchery    return 1;
85*e7be843bSPierre Pronchery}
86*e7be843bSPierre Pronchery
87*e7be843bSPierre Pronchery#define PROV_CIPHER_HW_declare(mode)                                           \
88*e7be843bSPierre Proncherystatic const PROV_CIPHER_HW rv32i_zknd_zkne_##mode = {                         \
89*e7be843bSPierre Pronchery    cipher_hw_rv32i_zknd_zkne_initkey,                                         \
90*e7be843bSPierre Pronchery    cipher_hw_rv32i_zknd_zkne_##mode,                                          \
91*e7be843bSPierre Pronchery    cipher_hw_aes_copyctx                                                      \
92*e7be843bSPierre Pronchery};                                                                             \
93*e7be843bSPierre Proncherystatic const PROV_CIPHER_HW rv32i_zbkb_zknd_zkne_##mode = {                    \
94*e7be843bSPierre Pronchery    cipher_hw_rv32i_zbkb_zknd_zkne_initkey,                                    \
95*e7be843bSPierre Pronchery    cipher_hw_rv32i_zbkb_zknd_zkne_##mode,                                     \
96*e7be843bSPierre Pronchery    cipher_hw_aes_copyctx                                                      \
97*e7be843bSPierre Pronchery};
98*e7be843bSPierre Pronchery#define PROV_CIPHER_HW_select(mode)                                            \
99*e7be843bSPierre Proncheryif (RISCV_HAS_ZBKB_AND_ZKND_AND_ZKNE())                                        \
100*e7be843bSPierre Pronchery    return &rv32i_zbkb_zknd_zkne_##mode;                                       \
101*e7be843bSPierre Proncheryif (RISCV_HAS_ZKND_AND_ZKNE())                                                 \
102*e7be843bSPierre Pronchery    return &rv32i_zknd_zkne_##mode;
103