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