1 // SPDX-License-Identifier: GPL-2.0-only 1 2 /* 3 * SM3 secure hash, as specified by OSCCA GM/T 4 * described at https://tools.ietf.org/html/dr 5 * 6 * Copyright (C) 2017 ARM Limited or its affil 7 * Written by Gilad Ben-Yossef <gilad@benyosse 8 * Copyright (C) 2021 Tianjia Zhang <tianjia.z 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 22 const u8 sm3_zero_message_hash[SM3_DIGEST_SIZE 23 0x1A, 0xB2, 0x1D, 0x83, 0x55, 0xCF, 0x 24 0x8e, 0x61, 0x19, 0x48, 0x31, 0xE8, 0x 25 0x22, 0xBE, 0xC8, 0xC7, 0x28, 0xFE, 0x 26 0x7E, 0xD0, 0x35, 0xEB, 0x50, 0x82, 0x 27 }; 28 EXPORT_SYMBOL_GPL(sm3_zero_message_hash); 29 30 static int crypto_sm3_update(struct shash_desc 31 unsigned int len) 32 { 33 sm3_update(shash_desc_ctx(desc), data, 34 return 0; 35 } 36 37 static int crypto_sm3_final(struct shash_desc 38 { 39 sm3_final(shash_desc_ctx(desc), out); 40 return 0; 41 } 42 43 static int crypto_sm3_finup(struct shash_desc 44 unsigned int len, u8 * 45 { 46 struct sm3_state *sctx = shash_desc_ct 47 48 if (len) 49 sm3_update(sctx, data, len); 50 sm3_final(sctx, hash); 51 return 0; 52 } 53 54 static struct shash_alg sm3_alg = { 55 .digestsize = SM3_DIGEST_SIZ 56 .init = sm3_base_init, 57 .update = crypto_sm3_upd 58 .final = crypto_sm3_fin 59 .finup = crypto_sm3_fin 60 .descsize = sizeof(struct 61 .base = { 62 .cra_name = "sm3", 63 .cra_driver_name = "sm3-g 64 .cra_priority = 100, 65 .cra_blocksize = SM3_BL 66 .cra_module = THIS_M 67 } 68 }; 69 70 static int __init sm3_generic_mod_init(void) 71 { 72 return crypto_register_shash(&sm3_alg) 73 } 74 75 static void __exit sm3_generic_mod_fini(void) 76 { 77 crypto_unregister_shash(&sm3_alg); 78 } 79 80 subsys_initcall(sm3_generic_mod_init); 81 module_exit(sm3_generic_mod_fini); 82 83 MODULE_LICENSE("GPL v2"); 84 MODULE_DESCRIPTION("SM3 Secure Hash Algorithm" 85 86 MODULE_ALIAS_CRYPTO("sm3"); 87 MODULE_ALIAS_CRYPTO("sm3-generic"); 88
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.