xref: /openbmc/linux/include/crypto/sm4.h (revision 73c919d3)
1747c8ce4SGilad Ben-Yossef /* SPDX-License-Identifier: GPL-2.0 */
2747c8ce4SGilad Ben-Yossef 
3747c8ce4SGilad Ben-Yossef /*
4747c8ce4SGilad Ben-Yossef  * Common values for the SM4 algorithm
5747c8ce4SGilad Ben-Yossef  * Copyright (C) 2018 ARM Limited or its affiliates.
62b31277aSTianjia Zhang  * Copyright (c) 2021 Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
7747c8ce4SGilad Ben-Yossef  */
8747c8ce4SGilad Ben-Yossef 
9747c8ce4SGilad Ben-Yossef #ifndef _CRYPTO_SM4_H
10747c8ce4SGilad Ben-Yossef #define _CRYPTO_SM4_H
11747c8ce4SGilad Ben-Yossef 
12747c8ce4SGilad Ben-Yossef #include <linux/types.h>
13747c8ce4SGilad Ben-Yossef #include <linux/crypto.h>
14747c8ce4SGilad Ben-Yossef 
15747c8ce4SGilad Ben-Yossef #define SM4_KEY_SIZE	16
16747c8ce4SGilad Ben-Yossef #define SM4_BLOCK_SIZE	16
17747c8ce4SGilad Ben-Yossef #define SM4_RKEY_WORDS	32
18747c8ce4SGilad Ben-Yossef 
19c59de48eSTianjia Zhang struct sm4_ctx {
20747c8ce4SGilad Ben-Yossef 	u32 rkey_enc[SM4_RKEY_WORDS];
21747c8ce4SGilad Ben-Yossef 	u32 rkey_dec[SM4_RKEY_WORDS];
22747c8ce4SGilad Ben-Yossef };
23747c8ce4SGilad Ben-Yossef 
24*73c919d3STianjia Zhang extern const u32 crypto_sm4_fk[];
25*73c919d3STianjia Zhang extern const u32 crypto_sm4_ck[];
26*73c919d3STianjia Zhang extern const u8 crypto_sm4_sbox[];
27*73c919d3STianjia Zhang 
282b31277aSTianjia Zhang /**
292b31277aSTianjia Zhang  * sm4_expandkey - Expands the SM4 key as described in GB/T 32907-2016
302b31277aSTianjia Zhang  * @ctx:	The location where the computed key will be stored.
312b31277aSTianjia Zhang  * @in_key:	The supplied key.
322b31277aSTianjia Zhang  * @key_len:	The length of the supplied key.
332b31277aSTianjia Zhang  *
342b31277aSTianjia Zhang  * Returns 0 on success. The function fails only if an invalid key size (or
352b31277aSTianjia Zhang  * pointer) is supplied.
362b31277aSTianjia Zhang  */
37c59de48eSTianjia Zhang int sm4_expandkey(struct sm4_ctx *ctx, const u8 *in_key,
38747c8ce4SGilad Ben-Yossef 			  unsigned int key_len);
39747c8ce4SGilad Ben-Yossef 
402b31277aSTianjia Zhang /**
412b31277aSTianjia Zhang  * sm4_crypt_block - Encrypt or decrypt a single SM4 block
422b31277aSTianjia Zhang  * @rk:		The rkey_enc for encrypt or rkey_dec for decrypt
432b31277aSTianjia Zhang  * @out:	Buffer to store output data
442b31277aSTianjia Zhang  * @in: 	Buffer containing the input data
452b31277aSTianjia Zhang  */
462b31277aSTianjia Zhang void sm4_crypt_block(const u32 *rk, u8 *out, const u8 *in);
472b31277aSTianjia Zhang 
48747c8ce4SGilad Ben-Yossef #endif
49