xref: /linux/crypto/sm3.c (revision 6fa6b5cb60490db2591bb93872b95f72315e5f53)
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  * Copyright 2026 Google LLC
10  */
11 
12 #include <crypto/internal/hash.h>
13 #include <crypto/sm3.h>
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 
17 #define SM3_CTX(desc) ((struct sm3_ctx *)shash_desc_ctx(desc))
18 
19 static int crypto_sm3_init(struct shash_desc *desc)
20 {
21 	sm3_init(SM3_CTX(desc));
22 	return 0;
23 }
24 
25 static int crypto_sm3_update(struct shash_desc *desc,
26 			     const u8 *data, unsigned int len)
27 {
28 	sm3_update(SM3_CTX(desc), data, len);
29 	return 0;
30 }
31 
32 static int crypto_sm3_final(struct shash_desc *desc, u8 *out)
33 {
34 	sm3_final(SM3_CTX(desc), out);
35 	return 0;
36 }
37 
38 static int crypto_sm3_digest(struct shash_desc *desc,
39 			     const u8 *data, unsigned int len, u8 *out)
40 {
41 	sm3(data, len, out);
42 	return 0;
43 }
44 
45 static int crypto_sm3_export_core(struct shash_desc *desc, void *out)
46 {
47 	memcpy(out, SM3_CTX(desc), sizeof(struct sm3_ctx));
48 	return 0;
49 }
50 
51 static int crypto_sm3_import_core(struct shash_desc *desc, const void *in)
52 {
53 	memcpy(SM3_CTX(desc), in, sizeof(struct sm3_ctx));
54 	return 0;
55 }
56 
57 static struct shash_alg sm3_alg = {
58 	.base.cra_name		= "sm3",
59 	.base.cra_driver_name	= "sm3-lib",
60 	.base.cra_priority	= 300,
61 	.base.cra_blocksize	= SM3_BLOCK_SIZE,
62 	.base.cra_module	= THIS_MODULE,
63 	.digestsize		= SM3_DIGEST_SIZE,
64 	.init			= crypto_sm3_init,
65 	.update			= crypto_sm3_update,
66 	.final			= crypto_sm3_final,
67 	.digest			= crypto_sm3_digest,
68 	.export_core		= crypto_sm3_export_core,
69 	.import_core		= crypto_sm3_import_core,
70 	.descsize		= sizeof(struct sm3_ctx),
71 };
72 
73 static int __init crypto_sm3_mod_init(void)
74 {
75 	return crypto_register_shash(&sm3_alg);
76 }
77 module_init(crypto_sm3_mod_init);
78 
79 static void __exit crypto_sm3_mod_exit(void)
80 {
81 	crypto_unregister_shash(&sm3_alg);
82 }
83 module_exit(crypto_sm3_mod_exit);
84 
85 MODULE_LICENSE("GPL v2");
86 MODULE_DESCRIPTION("Crypto API support for SM3");
87 
88 MODULE_ALIAS_CRYPTO("sm3");
89 MODULE_ALIAS_CRYPTO("sm3-lib");
90