xref: /freebsd/crypto/openssl/providers/implementations/ciphers/cipher_sm4_hw_rv64i.inc (revision e7be843b4a162e68651d3911f0357ed464915629)
1*e7be843bSPierre Pronchery/*
2*e7be843bSPierre Pronchery * Copyright 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 * RV64 ZVKSED support for AES modes ecb, cbc, ofb, cfb, ctr.
12*e7be843bSPierre Pronchery * This file is included by cipher_sm4_hw.c
13*e7be843bSPierre Pronchery */
14*e7be843bSPierre Pronchery
15*e7be843bSPierre Pronchery#define cipher_hw_rv64i_zvksed_sm4_cbc    ossl_cipher_hw_generic_cbc
16*e7be843bSPierre Pronchery#define cipher_hw_rv64i_zvksed_sm4_ecb    ossl_cipher_hw_generic_ecb
17*e7be843bSPierre Pronchery#define cipher_hw_rv64i_zvksed_sm4_ofb128 ossl_cipher_hw_generic_ofb128
18*e7be843bSPierre Pronchery#define cipher_hw_rv64i_zvksed_sm4_cfb128 ossl_cipher_hw_generic_cfb128
19*e7be843bSPierre Pronchery#define cipher_hw_rv64i_zvksed_sm4_ctr    ossl_cipher_hw_generic_ctr
20*e7be843bSPierre Pronchery
21*e7be843bSPierre Proncherystatic int cipher_hw_rv64i_zvksed_sm4_initkey(PROV_CIPHER_CTX *ctx,
22*e7be843bSPierre Pronchery                                              const unsigned char *key,
23*e7be843bSPierre Pronchery                                              size_t keylen)
24*e7be843bSPierre Pronchery{
25*e7be843bSPierre Pronchery    PROV_SM4_CTX *sctx =  (PROV_SM4_CTX *)ctx;
26*e7be843bSPierre Pronchery    SM4_KEY *ks = &sctx->ks.ks;
27*e7be843bSPierre Pronchery
28*e7be843bSPierre Pronchery    ctx->ks = ks;
29*e7be843bSPierre Pronchery    if (ctx->enc
30*e7be843bSPierre Pronchery            || (ctx->mode != EVP_CIPH_ECB_MODE
31*e7be843bSPierre Pronchery                && ctx->mode != EVP_CIPH_CBC_MODE)) {
32*e7be843bSPierre Pronchery        rv64i_zvksed_sm4_set_encrypt_key(key, ks);
33*e7be843bSPierre Pronchery        ctx->block = (block128_f) rv64i_zvksed_sm4_encrypt;
34*e7be843bSPierre Pronchery        ctx->stream.cbc = NULL;
35*e7be843bSPierre Pronchery    } else {
36*e7be843bSPierre Pronchery        rv64i_zvksed_sm4_set_decrypt_key(key, ks);
37*e7be843bSPierre Pronchery        ctx->block = (block128_f) rv64i_zvksed_sm4_decrypt;
38*e7be843bSPierre Pronchery        ctx->stream.cbc = NULL;
39*e7be843bSPierre Pronchery    }
40*e7be843bSPierre Pronchery
41*e7be843bSPierre Pronchery    return 1;
42*e7be843bSPierre Pronchery}
43*e7be843bSPierre Pronchery
44*e7be843bSPierre Pronchery#define PROV_CIPHER_HW_declare(mode)                                   \
45*e7be843bSPierre Proncherystatic const PROV_CIPHER_HW rv64i_zvksed_sm4_##mode = {                \
46*e7be843bSPierre Pronchery    cipher_hw_rv64i_zvksed_sm4_initkey,                                \
47*e7be843bSPierre Pronchery    cipher_hw_rv64i_zvksed_sm4_##mode,                                 \
48*e7be843bSPierre Pronchery    cipher_hw_sm4_copyctx                                              \
49*e7be843bSPierre Pronchery};
50*e7be843bSPierre Pronchery#define PROV_CIPHER_HW_select(mode)                                    \
51*e7be843bSPierre Proncheryif (RISCV_HAS_ZVKB_AND_ZVKSED() && riscv_vlen() >= 128)                \
52*e7be843bSPierre Pronchery    return &rv64i_zvksed_sm4_##mode;
53