162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci/*
462306a36Sopenharmony_ci * Common values for the SM4 algorithm
562306a36Sopenharmony_ci * Copyright (C) 2018 ARM Limited or its affiliates.
662306a36Sopenharmony_ci * Copyright (c) 2021 Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef _CRYPTO_SM4_H
1062306a36Sopenharmony_ci#define _CRYPTO_SM4_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/types.h>
1362306a36Sopenharmony_ci#include <linux/crypto.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define SM4_KEY_SIZE	16
1662306a36Sopenharmony_ci#define SM4_BLOCK_SIZE	16
1762306a36Sopenharmony_ci#define SM4_RKEY_WORDS	32
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistruct sm4_ctx {
2062306a36Sopenharmony_ci	u32 rkey_enc[SM4_RKEY_WORDS];
2162306a36Sopenharmony_ci	u32 rkey_dec[SM4_RKEY_WORDS];
2262306a36Sopenharmony_ci};
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ciextern const u32 crypto_sm4_fk[];
2562306a36Sopenharmony_ciextern const u32 crypto_sm4_ck[];
2662306a36Sopenharmony_ciextern const u8 crypto_sm4_sbox[];
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/**
2962306a36Sopenharmony_ci * sm4_expandkey - Expands the SM4 key as described in GB/T 32907-2016
3062306a36Sopenharmony_ci * @ctx:	The location where the computed key will be stored.
3162306a36Sopenharmony_ci * @in_key:	The supplied key.
3262306a36Sopenharmony_ci * @key_len:	The length of the supplied key.
3362306a36Sopenharmony_ci *
3462306a36Sopenharmony_ci * Returns 0 on success. The function fails only if an invalid key size (or
3562306a36Sopenharmony_ci * pointer) is supplied.
3662306a36Sopenharmony_ci */
3762306a36Sopenharmony_ciint sm4_expandkey(struct sm4_ctx *ctx, const u8 *in_key,
3862306a36Sopenharmony_ci			  unsigned int key_len);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/**
4162306a36Sopenharmony_ci * sm4_crypt_block - Encrypt or decrypt a single SM4 block
4262306a36Sopenharmony_ci * @rk:		The rkey_enc for encrypt or rkey_dec for decrypt
4362306a36Sopenharmony_ci * @out:	Buffer to store output data
4462306a36Sopenharmony_ci * @in: 	Buffer containing the input data
4562306a36Sopenharmony_ci */
4662306a36Sopenharmony_civoid sm4_crypt_block(const u32 *rk, u8 *out, const u8 *in);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#endif
49