cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sm3_generic.c (2200B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * SM3 secure hash, as specified by OSCCA GM/T 0004-2012 SM3 and
      4 * described at https://tools.ietf.org/html/draft-shen-sm3-hash-01
      5 *
      6 * Copyright (C) 2017 ARM Limited or its affiliates.
      7 * Written by Gilad Ben-Yossef <gilad@benyossef.com>
      8 * Copyright (C) 2021 Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
      9 */
     10
     11#include <crypto/internal/hash.h>
     12#include <linux/init.h>
     13#include <linux/module.h>
     14#include <linux/mm.h>
     15#include <linux/types.h>
     16#include <crypto/sm3.h>
     17#include <crypto/sm3_base.h>
     18#include <linux/bitops.h>
     19#include <asm/byteorder.h>
     20#include <asm/unaligned.h>
     21
     22const u8 sm3_zero_message_hash[SM3_DIGEST_SIZE] = {
     23	0x1A, 0xB2, 0x1D, 0x83, 0x55, 0xCF, 0xA1, 0x7F,
     24	0x8e, 0x61, 0x19, 0x48, 0x31, 0xE8, 0x1A, 0x8F,
     25	0x22, 0xBE, 0xC8, 0xC7, 0x28, 0xFE, 0xFB, 0x74,
     26	0x7E, 0xD0, 0x35, 0xEB, 0x50, 0x82, 0xAA, 0x2B
     27};
     28EXPORT_SYMBOL_GPL(sm3_zero_message_hash);
     29
     30static int crypto_sm3_update(struct shash_desc *desc, const u8 *data,
     31			  unsigned int len)
     32{
     33	sm3_update(shash_desc_ctx(desc), data, len);
     34	return 0;
     35}
     36
     37static int crypto_sm3_final(struct shash_desc *desc, u8 *out)
     38{
     39	sm3_final(shash_desc_ctx(desc), out);
     40	return 0;
     41}
     42
     43static int crypto_sm3_finup(struct shash_desc *desc, const u8 *data,
     44			unsigned int len, u8 *hash)
     45{
     46	struct sm3_state *sctx = shash_desc_ctx(desc);
     47
     48	if (len)
     49		sm3_update(sctx, data, len);
     50	sm3_final(sctx, hash);
     51	return 0;
     52}
     53
     54static struct shash_alg sm3_alg = {
     55	.digestsize	=	SM3_DIGEST_SIZE,
     56	.init		=	sm3_base_init,
     57	.update		=	crypto_sm3_update,
     58	.final		=	crypto_sm3_final,
     59	.finup		=	crypto_sm3_finup,
     60	.descsize	=	sizeof(struct sm3_state),
     61	.base		=	{
     62		.cra_name	 =	"sm3",
     63		.cra_driver_name =	"sm3-generic",
     64		.cra_priority	=	100,
     65		.cra_blocksize	 =	SM3_BLOCK_SIZE,
     66		.cra_module	 =	THIS_MODULE,
     67	}
     68};
     69
     70static int __init sm3_generic_mod_init(void)
     71{
     72	return crypto_register_shash(&sm3_alg);
     73}
     74
     75static void __exit sm3_generic_mod_fini(void)
     76{
     77	crypto_unregister_shash(&sm3_alg);
     78}
     79
     80subsys_initcall(sm3_generic_mod_init);
     81module_exit(sm3_generic_mod_fini);
     82
     83MODULE_LICENSE("GPL v2");
     84MODULE_DESCRIPTION("SM3 Secure Hash Algorithm");
     85
     86MODULE_ALIAS_CRYPTO("sm3");
     87MODULE_ALIAS_CRYPTO("sm3-generic");