Commit | Line | Data |
---|---|---|
747c8ce4 GBY |
1 | // SPDX-License-Identifier: GPL-2.0 |
2 | ||
3 | /* | |
4 | * SM4 Cipher Algorithm. | |
5 | * | |
6 | * Copyright (C) 2018 ARM Limited or its affiliates. | |
7 | * All rights reserved. | |
8 | */ | |
9 | ||
10 | #include <crypto/sm4.h> | |
11 | #include <linux/module.h> | |
12 | #include <linux/init.h> | |
13 | #include <linux/types.h> | |
14 | #include <linux/errno.h> | |
15 | #include <linux/crypto.h> | |
16 | #include <asm/byteorder.h> | |
17 | #include <asm/unaligned.h> | |
18 | ||
747c8ce4 | 19 | /** |
c59de48e | 20 | * sm4_setkey - Set the SM4 key. |
747c8ce4 GBY |
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 | * | |
2b31277a | 25 | * This function uses sm4_expandkey() to expand the key. |
c59de48e | 26 | * &sm4_ctx _must_ be the private data embedded in @tfm which is |
747c8ce4 | 27 | * retrieved with crypto_tfm_ctx(). |
674f368a EB |
28 | * |
29 | * Return: 0 on success; -EINVAL on failure (only happens for bad key lengths) | |
747c8ce4 | 30 | */ |
c59de48e | 31 | static int sm4_setkey(struct crypto_tfm *tfm, const u8 *in_key, |
747c8ce4 GBY |
32 | unsigned int key_len) |
33 | { | |
c59de48e | 34 | struct sm4_ctx *ctx = crypto_tfm_ctx(tfm); |
747c8ce4 | 35 | |
2b31277a | 36 | return sm4_expandkey(ctx, in_key, key_len); |
747c8ce4 | 37 | } |
747c8ce4 | 38 | |
747c8ce4 GBY |
39 | /* encrypt a block of text */ |
40 | ||
c59de48e | 41 | static void sm4_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
747c8ce4 | 42 | { |
c59de48e | 43 | const struct sm4_ctx *ctx = crypto_tfm_ctx(tfm); |
747c8ce4 | 44 | |
2b31277a | 45 | sm4_crypt_block(ctx->rkey_enc, out, in); |
747c8ce4 GBY |
46 | } |
47 | ||
48 | /* decrypt a block of text */ | |
49 | ||
c59de48e | 50 | static void sm4_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
747c8ce4 | 51 | { |
c59de48e | 52 | const struct sm4_ctx *ctx = crypto_tfm_ctx(tfm); |
747c8ce4 | 53 | |
2b31277a | 54 | sm4_crypt_block(ctx->rkey_dec, out, in); |
747c8ce4 GBY |
55 | } |
56 | ||
57 | static 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, | |
c59de48e | 63 | .cra_ctxsize = sizeof(struct sm4_ctx), |
747c8ce4 GBY |
64 | .cra_module = THIS_MODULE, |
65 | .cra_u = { | |
66 | .cipher = { | |
67 | .cia_min_keysize = SM4_KEY_SIZE, | |
68 | .cia_max_keysize = SM4_KEY_SIZE, | |
c59de48e TZ |
69 | .cia_setkey = sm4_setkey, |
70 | .cia_encrypt = sm4_encrypt, | |
71 | .cia_decrypt = sm4_decrypt | |
747c8ce4 GBY |
72 | } |
73 | } | |
74 | }; | |
75 | ||
76 | static int __init sm4_init(void) | |
77 | { | |
78 | return crypto_register_alg(&sm4_alg); | |
79 | } | |
80 | ||
81 | static void __exit sm4_fini(void) | |
82 | { | |
83 | crypto_unregister_alg(&sm4_alg); | |
84 | } | |
85 | ||
c4741b23 | 86 | subsys_initcall(sm4_init); |
747c8ce4 GBY |
87 | module_exit(sm4_fini); |
88 | ||
89 | MODULE_DESCRIPTION("SM4 Cipher Algorithm"); | |
90 | MODULE_LICENSE("GPL v2"); | |
91 | MODULE_ALIAS_CRYPTO("sm4"); | |
92 | MODULE_ALIAS_CRYPTO("sm4-generic"); |