1 // SPDX-License-Identifier: GPL-2.0-only
3 * SM4 using the RISC-V vector crypto extensions
5 * Copyright (C) 2023 VRULL GmbH
6 * Author: Heiko Stuebner <heiko.stuebner@vrull.eu>
8 * Copyright (C) 2023 SiFive, Inc.
9 * Author: Jerry Shih <jerry.shih@sifive.com>
13 #include <asm/vector.h>
14 #include <crypto/internal/cipher.h>
15 #include <crypto/internal/simd.h>
16 #include <crypto/sm4.h>
17 #include <linux/linkage.h>
18 #include <linux/module.h>
20 asmlinkage
void sm4_expandkey_zvksed_zvkb(const u8 user_key
[SM4_KEY_SIZE
],
21 u32 rkey_enc
[SM4_RKEY_WORDS
],
22 u32 rkey_dec
[SM4_RKEY_WORDS
]);
23 asmlinkage
void sm4_crypt_zvksed_zvkb(const u32 rkey
[SM4_RKEY_WORDS
],
24 const u8 in
[SM4_BLOCK_SIZE
],
25 u8 out
[SM4_BLOCK_SIZE
]);
27 static int riscv64_sm4_setkey(struct crypto_tfm
*tfm
, const u8
*key
,
30 struct sm4_ctx
*ctx
= crypto_tfm_ctx(tfm
);
32 if (crypto_simd_usable()) {
33 if (keylen
!= SM4_KEY_SIZE
)
35 kernel_vector_begin();
36 sm4_expandkey_zvksed_zvkb(key
, ctx
->rkey_enc
, ctx
->rkey_dec
);
40 return sm4_expandkey(ctx
, key
, keylen
);
43 static void riscv64_sm4_encrypt(struct crypto_tfm
*tfm
, u8
*dst
, const u8
*src
)
45 const struct sm4_ctx
*ctx
= crypto_tfm_ctx(tfm
);
47 if (crypto_simd_usable()) {
48 kernel_vector_begin();
49 sm4_crypt_zvksed_zvkb(ctx
->rkey_enc
, src
, dst
);
52 sm4_crypt_block(ctx
->rkey_enc
, dst
, src
);
56 static void riscv64_sm4_decrypt(struct crypto_tfm
*tfm
, u8
*dst
, const u8
*src
)
58 const struct sm4_ctx
*ctx
= crypto_tfm_ctx(tfm
);
60 if (crypto_simd_usable()) {
61 kernel_vector_begin();
62 sm4_crypt_zvksed_zvkb(ctx
->rkey_dec
, src
, dst
);
65 sm4_crypt_block(ctx
->rkey_dec
, dst
, src
);
69 static struct crypto_alg riscv64_sm4_alg
= {
70 .cra_flags
= CRYPTO_ALG_TYPE_CIPHER
,
71 .cra_blocksize
= SM4_BLOCK_SIZE
,
72 .cra_ctxsize
= sizeof(struct sm4_ctx
),
75 .cra_driver_name
= "sm4-riscv64-zvksed-zvkb",
77 .cia_min_keysize
= SM4_KEY_SIZE
,
78 .cia_max_keysize
= SM4_KEY_SIZE
,
79 .cia_setkey
= riscv64_sm4_setkey
,
80 .cia_encrypt
= riscv64_sm4_encrypt
,
81 .cia_decrypt
= riscv64_sm4_decrypt
,
83 .cra_module
= THIS_MODULE
,
86 static int __init
riscv64_sm4_mod_init(void)
88 if (riscv_isa_extension_available(NULL
, ZVKSED
) &&
89 riscv_isa_extension_available(NULL
, ZVKB
) &&
90 riscv_vector_vlen() >= 128)
91 return crypto_register_alg(&riscv64_sm4_alg
);
96 static void __exit
riscv64_sm4_mod_exit(void)
98 crypto_unregister_alg(&riscv64_sm4_alg
);
101 module_init(riscv64_sm4_mod_init
);
102 module_exit(riscv64_sm4_mod_exit
);
104 MODULE_DESCRIPTION("SM4 (RISC-V accelerated)");
105 MODULE_AUTHOR("Heiko Stuebner <heiko.stuebner@vrull.eu>");
106 MODULE_LICENSE("GPL");
107 MODULE_ALIAS_CRYPTO("sm4");