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