]>
Commit | Line | Data |
---|---|---|
5ccee69b | 1 | /* |
da1c088f | 2 | * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved. |
5ccee69b HZZ |
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) \ | |
86c69fe8 | 99 | if (RISCV_HAS_ZBKB_AND_ZKND_AND_ZKNE()) \ |
5ccee69b | 100 | return &rv32i_zbkb_zknd_zkne_##mode; \ |
86c69fe8 | 101 | if (RISCV_HAS_ZKND_AND_ZKNE()) \ |
5ccee69b | 102 | return &rv32i_zknd_zkne_##mode; |