diff options
Diffstat (limited to 'src/lib/libcrypto/evp')
-rw-r--r-- | src/lib/libcrypto/evp/c_all.c | 12 | ||||
-rw-r--r-- | src/lib/libcrypto/evp/e_sm4.c | 113 | ||||
-rw-r--r-- | src/lib/libcrypto/evp/evp.h | 11 |
3 files changed, 134 insertions, 2 deletions
diff --git a/src/lib/libcrypto/evp/c_all.c b/src/lib/libcrypto/evp/c_all.c index 5ed55f67f6..cce3640866 100644 --- a/src/lib/libcrypto/evp/c_all.c +++ b/src/lib/libcrypto/evp/c_all.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: c_all.c,v 1.24 2018/12/26 15:11:04 tb Exp $ */ | 1 | /* $OpenBSD: c_all.c,v 1.25 2019/03/17 17:42:37 tb Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -227,6 +227,16 @@ OpenSSL_add_all_ciphers_internal(void) | |||
227 | EVP_add_cipher(EVP_gost2814789_cfb64()); | 227 | EVP_add_cipher(EVP_gost2814789_cfb64()); |
228 | EVP_add_cipher(EVP_gost2814789_cnt()); | 228 | EVP_add_cipher(EVP_gost2814789_cnt()); |
229 | #endif | 229 | #endif |
230 | |||
231 | #ifndef OPENSSL_NO_SM4 | ||
232 | EVP_add_cipher(EVP_sm4_ecb()); | ||
233 | EVP_add_cipher(EVP_sm4_cbc()); | ||
234 | EVP_add_cipher(EVP_sm4_cfb()); | ||
235 | EVP_add_cipher(EVP_sm4_ofb()); | ||
236 | EVP_add_cipher(EVP_sm4_ctr()); | ||
237 | EVP_add_cipher_alias(SN_sm4_cbc, "SM4"); | ||
238 | EVP_add_cipher_alias(SN_sm4_cbc, "sm4"); | ||
239 | #endif | ||
230 | } | 240 | } |
231 | 241 | ||
232 | void | 242 | void |
diff --git a/src/lib/libcrypto/evp/e_sm4.c b/src/lib/libcrypto/evp/e_sm4.c new file mode 100644 index 0000000000..554915b29c --- /dev/null +++ b/src/lib/libcrypto/evp/e_sm4.c | |||
@@ -0,0 +1,113 @@ | |||
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 | { | ||
35 | SM4_set_key(key, ctx->cipher_data); | ||
36 | return 1; | ||
37 | } | ||
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 | { | ||
43 | if (enc) | ||
44 | CRYPTO_cbc128_encrypt(in, out, len, key, ivec, | ||
45 | (block128_f)SM4_encrypt); | ||
46 | else | ||
47 | CRYPTO_cbc128_decrypt(in, out, len, key, ivec, | ||
48 | (block128_f)SM4_decrypt); | ||
49 | } | ||
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 | { | ||
55 | CRYPTO_cfb128_encrypt(in, out, length, key, ivec, num, enc, | ||
56 | (block128_f)SM4_encrypt); | ||
57 | } | ||
58 | |||
59 | static void | ||
60 | sm4_ecb_encrypt(const unsigned char *in, unsigned char *out, const SM4_KEY *key, | ||
61 | const int enc) | ||
62 | { | ||
63 | if (enc) | ||
64 | SM4_encrypt(in, out, key); | ||
65 | else | ||
66 | SM4_decrypt(in, out, key); | ||
67 | } | ||
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 | { | ||
73 | CRYPTO_ofb128_encrypt(in, out, length, key, ivec, num, | ||
74 | (block128_f)SM4_encrypt); | ||
75 | } | ||
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 | { | ||
84 | EVP_SM4_KEY *key = EVP_C_DATA(EVP_SM4_KEY, ctx); | ||
85 | |||
86 | CRYPTO_ctr128_encrypt(in, out, len, &key->ks, ctx->iv, ctx->buf, | ||
87 | &ctx->num, (block128_f)SM4_encrypt); | ||
88 | return 1; | ||
89 | } | ||
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 | { | ||
110 | return &sm4_ctr_mode; | ||
111 | } | ||
112 | |||
113 | #endif | ||
diff --git a/src/lib/libcrypto/evp/evp.h b/src/lib/libcrypto/evp/evp.h index 0645303686..cd9b33c9b8 100644 --- a/src/lib/libcrypto/evp/evp.h +++ b/src/lib/libcrypto/evp/evp.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: evp.h,v 1.72 2019/01/22 00:59:21 dlg Exp $ */ | 1 | /* $OpenBSD: evp.h,v 1.73 2019/03/17 17:42:37 tb Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -837,6 +837,15 @@ const EVP_CIPHER *EVP_gost2814789_cfb64(void); | |||
837 | const EVP_CIPHER *EVP_gost2814789_cnt(void); | 837 | const EVP_CIPHER *EVP_gost2814789_cnt(void); |
838 | #endif | 838 | #endif |
839 | 839 | ||
840 | #ifndef OPENSSL_NO_SM4 | ||
841 | const EVP_CIPHER *EVP_sm4_ecb(void); | ||
842 | const EVP_CIPHER *EVP_sm4_cbc(void); | ||
843 | const EVP_CIPHER *EVP_sm4_cfb128(void); | ||
844 | #define EVP_sm4_cfb EVP_sm4_cfb128 | ||
845 | const EVP_CIPHER *EVP_sm4_ofb(void); | ||
846 | const EVP_CIPHER *EVP_sm4_ctr(void); | ||
847 | #endif | ||
848 | |||
840 | void OPENSSL_add_all_algorithms_noconf(void); | 849 | void OPENSSL_add_all_algorithms_noconf(void); |
841 | void OPENSSL_add_all_algorithms_conf(void); | 850 | void OPENSSL_add_all_algorithms_conf(void); |
842 | 851 | ||