File Index
Files and directories
Sign in
FILE

sm4-riscv64-glue.c

File preview with syntax highlighting.

linux-6.19.14/arch/riscv/crypto/sm4-riscv64-glue.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * SM4 using the RISC-V vector crypto extensions
  4 *
  5 * Copyright (C) 2023 VRULL GmbH
  6 * Author: Heiko Stuebner <heiko.stuebner@vrull.eu>
  7 *
  8 * Copyright (C) 2023 SiFive, Inc.
  9 * Author: Jerry Shih <jerry.shih@sifive.com>
 10 */
 11
 12#include <asm/simd.h>
 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>
 19
 20asmlinkage 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]);
 23asmlinkage void sm4_crypt_zvksed_zvkb(const u32 rkey[SM4_RKEY_WORDS],
 24				      const u8 in[SM4_BLOCK_SIZE],
 25				      u8 out[SM4_BLOCK_SIZE]);
 26
 27static int riscv64_sm4_setkey(struct crypto_tfm *tfm, const u8 *key,
 28			      unsigned int keylen)
 29{
 30	struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);
 31
 32	if (crypto_simd_usable()) {
 33		if (keylen != SM4_KEY_SIZE)
 34			return -EINVAL;
 35		kernel_vector_begin();
 36		sm4_expandkey_zvksed_zvkb(key, ctx->rkey_enc, ctx->rkey_dec);
 37		kernel_vector_end();
 38		return 0;
 39	}
 40	return sm4_expandkey(ctx, key, keylen);
 41}
 42
 43static void riscv64_sm4_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
 44{
 45	const struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);
 46
 47	if (crypto_simd_usable()) {
 48		kernel_vector_begin();
 49		sm4_crypt_zvksed_zvkb(ctx->rkey_enc, src, dst);
 50		kernel_vector_end();
 51	} else {
 52		sm4_crypt_block(ctx->rkey_enc, dst, src);
 53	}
 54}
 55
 56static void riscv64_sm4_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
 57{
 58	const struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);
 59
 60	if (crypto_simd_usable()) {
 61		kernel_vector_begin();
 62		sm4_crypt_zvksed_zvkb(ctx->rkey_dec, src, dst);
 63		kernel_vector_end();
 64	} else {
 65		sm4_crypt_block(ctx->rkey_dec, dst, src);
 66	}
 67}
 68
 69static 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),
 73	.cra_priority = 300,
 74	.cra_name = "sm4",
 75	.cra_driver_name = "sm4-riscv64-zvksed-zvkb",
 76	.cra_cipher = {
 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,
 82	},
 83	.cra_module = THIS_MODULE,
 84};
 85
 86static int __init riscv64_sm4_mod_init(void)
 87{
 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);
 92
 93	return -ENODEV;
 94}
 95
 96static void __exit riscv64_sm4_mod_exit(void)
 97{
 98	crypto_unregister_alg(&riscv64_sm4_alg);
 99}
100
101module_init(riscv64_sm4_mod_init);
102module_exit(riscv64_sm4_mod_exit);
103
104MODULE_DESCRIPTION("SM4 (RISC-V accelerated)");
105MODULE_AUTHOR("Heiko Stuebner <heiko.stuebner@vrull.eu>");
106MODULE_LICENSE("GPL");
107MODULE_ALIAS_CRYPTO("sm4");
~/ Read-only file preview.