brintos

brintos / linux-shallow public Read only

0
0
Text · 2.1 KiB · 7df8636 Raw
93 lines · c
1// SPDX-License-Identifier: GPL-2.02 3/*4 * SM4 Cipher Algorithm.5 *6 * Copyright (C) 2018 ARM Limited or its affiliates.7 * All rights reserved.8 */9 10#include <crypto/algapi.h>11#include <crypto/sm4.h>12#include <linux/module.h>13#include <linux/init.h>14#include <linux/types.h>15#include <linux/errno.h>16#include <asm/byteorder.h>17#include <linux/unaligned.h>18 19/**20 * sm4_setkey - Set the SM4 key.21 * @tfm:	The %crypto_tfm that is used in the context.22 * @in_key:	The input key.23 * @key_len:	The size of the key.24 *25 * This function uses sm4_expandkey() to expand the key.26 * &sm4_ctx _must_ be the private data embedded in @tfm which is27 * retrieved with crypto_tfm_ctx().28 *29 * Return: 0 on success; -EINVAL on failure (only happens for bad key lengths)30 */31static int sm4_setkey(struct crypto_tfm *tfm, const u8 *in_key,32		       unsigned int key_len)33{34	struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);35 36	return sm4_expandkey(ctx, in_key, key_len);37}38 39/* encrypt a block of text */40 41static void sm4_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)42{43	const struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);44 45	sm4_crypt_block(ctx->rkey_enc, out, in);46}47 48/* decrypt a block of text */49 50static void sm4_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)51{52	const struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);53 54	sm4_crypt_block(ctx->rkey_dec, out, in);55}56 57static struct crypto_alg sm4_alg = {58	.cra_name		=	"sm4",59	.cra_driver_name	=	"sm4-generic",60	.cra_priority		=	100,61	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,62	.cra_blocksize		=	SM4_BLOCK_SIZE,63	.cra_ctxsize		=	sizeof(struct sm4_ctx),64	.cra_module		=	THIS_MODULE,65	.cra_u			=	{66		.cipher = {67			.cia_min_keysize	=	SM4_KEY_SIZE,68			.cia_max_keysize	=	SM4_KEY_SIZE,69			.cia_setkey		=	sm4_setkey,70			.cia_encrypt		=	sm4_encrypt,71			.cia_decrypt		=	sm4_decrypt72		}73	}74};75 76static int __init sm4_init(void)77{78	return crypto_register_alg(&sm4_alg);79}80 81static void __exit sm4_fini(void)82{83	crypto_unregister_alg(&sm4_alg);84}85 86subsys_initcall(sm4_init);87module_exit(sm4_fini);88 89MODULE_DESCRIPTION("SM4 Cipher Algorithm");90MODULE_LICENSE("GPL v2");91MODULE_ALIAS_CRYPTO("sm4");92MODULE_ALIAS_CRYPTO("sm4-generic");93