/src/libressl/crypto/evp/e_sm4.c
Line | Count | Source |
1 | | /* $OpenBSD: e_sm4.c,v 1.1 2019/03/17 17:42:37 tb Exp $ */ |
2 | | /* |
3 | | * Copyright (c) 2017, 2019 Ribose Inc |
4 | | * |
5 | | * Permission to use, copy, modify, and/or distribute this software for any |
6 | | * purpose with or without fee is hereby granted, provided that the above |
7 | | * copyright notice and this permission notice appear in all copies. |
8 | | * |
9 | | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
10 | | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
11 | | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
12 | | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
13 | | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
14 | | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
15 | | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
16 | | */ |
17 | | |
18 | | #include <openssl/opensslconf.h> |
19 | | |
20 | | #ifndef OPENSSL_NO_SM4 |
21 | | #include <openssl/evp.h> |
22 | | #include <openssl/modes.h> |
23 | | #include <openssl/sm4.h> |
24 | | |
25 | | #include "evp_locl.h" |
26 | | |
27 | | typedef struct { |
28 | | SM4_KEY ks; |
29 | | } EVP_SM4_KEY; |
30 | | |
31 | | static int |
32 | | sm4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
33 | | const unsigned char *iv, int enc) |
34 | 464 | { |
35 | 464 | SM4_set_key(key, ctx->cipher_data); |
36 | 464 | return 1; |
37 | 464 | } |
38 | | |
39 | | static void |
40 | | sm4_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t len, |
41 | | const SM4_KEY *key, unsigned char *ivec, const int enc) |
42 | 1.91k | { |
43 | 1.91k | if (enc) |
44 | 1.85k | CRYPTO_cbc128_encrypt(in, out, len, key, ivec, |
45 | 1.85k | (block128_f)SM4_encrypt); |
46 | 60 | else |
47 | 60 | CRYPTO_cbc128_decrypt(in, out, len, key, ivec, |
48 | 60 | (block128_f)SM4_decrypt); |
49 | 1.91k | } |
50 | | |
51 | | static void |
52 | | sm4_cfb128_encrypt(const unsigned char *in, unsigned char *out, size_t length, |
53 | | const SM4_KEY *key, unsigned char *ivec, int *num, const int enc) |
54 | 495 | { |
55 | 495 | CRYPTO_cfb128_encrypt(in, out, length, key, ivec, num, enc, |
56 | 495 | (block128_f)SM4_encrypt); |
57 | 495 | } |
58 | | |
59 | | static void |
60 | | sm4_ecb_encrypt(const unsigned char *in, unsigned char *out, const SM4_KEY *key, |
61 | | const int enc) |
62 | 1.03k | { |
63 | 1.03k | if (enc) |
64 | 1.02k | SM4_encrypt(in, out, key); |
65 | 9 | else |
66 | 9 | SM4_decrypt(in, out, key); |
67 | 1.03k | } |
68 | | |
69 | | static void |
70 | | sm4_ofb128_encrypt(const unsigned char *in, unsigned char *out, size_t length, |
71 | | const SM4_KEY *key, unsigned char *ivec, int *num) |
72 | 1.24k | { |
73 | 1.24k | CRYPTO_ofb128_encrypt(in, out, length, key, ivec, num, |
74 | 1.24k | (block128_f)SM4_encrypt); |
75 | 1.24k | } |
76 | | |
77 | | IMPLEMENT_BLOCK_CIPHER(sm4, ks, sm4, EVP_SM4_KEY, NID_sm4, 16, 16, 16, 128, |
78 | | EVP_CIPH_FLAG_DEFAULT_ASN1, sm4_init_key, NULL, 0, 0, 0) |
79 | | |
80 | | static int |
81 | | sm4_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, |
82 | | size_t len) |
83 | 42.1k | { |
84 | 42.1k | EVP_SM4_KEY *key = EVP_C_DATA(EVP_SM4_KEY, ctx); |
85 | | |
86 | 42.1k | CRYPTO_ctr128_encrypt(in, out, len, &key->ks, ctx->iv, ctx->buf, |
87 | 42.1k | &ctx->num, (block128_f)SM4_encrypt); |
88 | 42.1k | return 1; |
89 | 42.1k | } |
90 | | |
91 | | static const EVP_CIPHER sm4_ctr_mode = { |
92 | | .nid = NID_sm4_ctr, |
93 | | .block_size = 1, |
94 | | .key_len = 16, |
95 | | .iv_len = 16, |
96 | | .flags = EVP_CIPH_CTR_MODE, |
97 | | .init = sm4_init_key, |
98 | | .do_cipher = sm4_ctr_cipher, |
99 | | .cleanup = NULL, |
100 | | .ctx_size = sizeof(EVP_SM4_KEY), |
101 | | .set_asn1_parameters = NULL, |
102 | | .get_asn1_parameters = NULL, |
103 | | .ctrl = NULL, |
104 | | .app_data = NULL, |
105 | | }; |
106 | | |
107 | | const EVP_CIPHER * |
108 | | EVP_sm4_ctr(void) |
109 | 174 | { |
110 | 174 | return &sm4_ctr_mode; |
111 | 174 | } |
112 | | |
113 | | #endif |