diff options
author | jsing <> | 2022-09-03 20:02:17 +0000 |
---|---|---|
committer | jsing <> | 2022-09-03 20:02:17 +0000 |
commit | 5f08472f8305c7336ca9acc5587cebd87a292439 (patch) | |
tree | 47d7a86903b7a03d8823013956c6369288f17066 /src/lib | |
parent | ae7e95885a19d88915cffbfaa9b7f832f0c0c7e9 (diff) | |
download | openbsd-5f08472f8305c7336ca9acc5587cebd87a292439.tar.gz openbsd-5f08472f8305c7336ca9acc5587cebd87a292439.tar.bz2 openbsd-5f08472f8305c7336ca9acc5587cebd87a292439.zip |
Mechanically expand IMPLEMENT_BLOCK_CIPHER macro.
No change in generated assembly.
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/evp/e_sm4.c | 166 |
1 files changed, 162 insertions, 4 deletions
diff --git a/src/lib/libcrypto/evp/e_sm4.c b/src/lib/libcrypto/evp/e_sm4.c index 554915b29c..9003abccc3 100644 --- a/src/lib/libcrypto/evp/e_sm4.c +++ b/src/lib/libcrypto/evp/e_sm4.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: e_sm4.c,v 1.1 2019/03/17 17:42:37 tb Exp $ */ | 1 | /* $OpenBSD: e_sm4.c,v 1.2 2022/09/03 20:02:17 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2017, 2019 Ribose Inc | 3 | * Copyright (c) 2017, 2019 Ribose Inc |
4 | * | 4 | * |
@@ -74,14 +74,172 @@ sm4_ofb128_encrypt(const unsigned char *in, unsigned char *out, size_t length, | |||
74 | (block128_f)SM4_encrypt); | 74 | (block128_f)SM4_encrypt); |
75 | } | 75 | } |
76 | 76 | ||
77 | IMPLEMENT_BLOCK_CIPHER(sm4, ks, sm4, EVP_SM4_KEY, NID_sm4, 16, 16, 16, 128, | 77 | static int |
78 | EVP_CIPH_FLAG_DEFAULT_ASN1, sm4_init_key, NULL, 0, 0, 0) | 78 | sm4_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) |
79 | { | ||
80 | while (inl >= EVP_MAXCHUNK) { | ||
81 | sm4_cbc_encrypt(in, out, (long)EVP_MAXCHUNK, &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt); | ||
82 | inl -= EVP_MAXCHUNK; | ||
83 | in += EVP_MAXCHUNK; | ||
84 | out += EVP_MAXCHUNK; | ||
85 | } | ||
86 | |||
87 | if (inl) | ||
88 | sm4_cbc_encrypt(in, out, (long)inl, &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt); | ||
89 | |||
90 | return 1; | ||
91 | } | ||
92 | |||
93 | static int | ||
94 | sm4_cfb128_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) | ||
95 | { | ||
96 | size_t chunk = EVP_MAXCHUNK; | ||
97 | |||
98 | if (128 == 1) | ||
99 | chunk >>= 3; | ||
100 | |||
101 | if (inl < chunk) | ||
102 | chunk = inl; | ||
103 | |||
104 | while (inl && inl >= chunk) { | ||
105 | sm4_cfb128_encrypt(in, out, (long)((128 == 1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ? inl * 8 : inl), &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt); | ||
106 | inl -= chunk; | ||
107 | in += chunk; | ||
108 | out += chunk; | ||
109 | if (inl < chunk) | ||
110 | chunk = inl; | ||
111 | } | ||
112 | |||
113 | return 1; | ||
114 | } | ||
115 | |||
116 | static int | ||
117 | sm4_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) | ||
118 | { | ||
119 | size_t i, bl; | ||
120 | |||
121 | bl = ctx->cipher->block_size; | ||
122 | |||
123 | if (inl < bl) | ||
124 | return 1; | ||
125 | |||
126 | inl -= bl; | ||
127 | |||
128 | for (i = 0; i <= inl; i += bl) | ||
129 | sm4_ecb_encrypt(in + i, out + i, &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->encrypt); | ||
130 | |||
131 | return 1; | ||
132 | } | ||
133 | |||
134 | static int | ||
135 | sm4_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) | ||
136 | { | ||
137 | while (inl >= EVP_MAXCHUNK) { | ||
138 | sm4_ofb128_encrypt(in, out, (long)EVP_MAXCHUNK, &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num); | ||
139 | inl -= EVP_MAXCHUNK; | ||
140 | in += EVP_MAXCHUNK; | ||
141 | out += EVP_MAXCHUNK; | ||
142 | } | ||
143 | |||
144 | if (inl) | ||
145 | sm4_ofb128_encrypt(in, out, (long)inl, &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num); | ||
146 | |||
147 | return 1; | ||
148 | } | ||
149 | |||
150 | static const EVP_CIPHER sm4_cbc = { | ||
151 | .nid = NID_sm4_cbc, | ||
152 | .block_size = 16, | ||
153 | .key_len = 16, | ||
154 | .iv_len = 16, | ||
155 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CBC_MODE, | ||
156 | .init = sm4_init_key, | ||
157 | .do_cipher = sm4_cbc_cipher, | ||
158 | .cleanup = NULL, | ||
159 | .ctx_size = sizeof(EVP_SM4_KEY), | ||
160 | .set_asn1_parameters = 0, | ||
161 | .get_asn1_parameters = 0, | ||
162 | .ctrl = 0, | ||
163 | .app_data = NULL, | ||
164 | }; | ||
165 | |||
166 | const EVP_CIPHER * | ||
167 | EVP_sm4_cbc(void) | ||
168 | { | ||
169 | return &sm4_cbc; | ||
170 | } | ||
171 | |||
172 | static const EVP_CIPHER sm4_cfb128 = { | ||
173 | .nid = NID_sm4_cfb128, | ||
174 | .block_size = 1, | ||
175 | .key_len = 16, | ||
176 | .iv_len = 16, | ||
177 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE, | ||
178 | .init = sm4_init_key, | ||
179 | .do_cipher = sm4_cfb128_cipher, | ||
180 | .cleanup = NULL, | ||
181 | .ctx_size = sizeof(EVP_SM4_KEY), | ||
182 | .set_asn1_parameters = 0, | ||
183 | .get_asn1_parameters = 0, | ||
184 | .ctrl = 0, | ||
185 | .app_data = NULL, | ||
186 | }; | ||
187 | |||
188 | const EVP_CIPHER * | ||
189 | EVP_sm4_cfb128(void) | ||
190 | { | ||
191 | return &sm4_cfb128; | ||
192 | } | ||
193 | |||
194 | static const EVP_CIPHER sm4_ofb = { | ||
195 | .nid = NID_sm4_ofb128, | ||
196 | .block_size = 1, | ||
197 | .key_len = 16, | ||
198 | .iv_len = 16, | ||
199 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_OFB_MODE, | ||
200 | .init = sm4_init_key, | ||
201 | .do_cipher = sm4_ofb_cipher, | ||
202 | .cleanup = NULL, | ||
203 | .ctx_size = sizeof(EVP_SM4_KEY), | ||
204 | .set_asn1_parameters = 0, | ||
205 | .get_asn1_parameters = 0, | ||
206 | .ctrl = 0, | ||
207 | .app_data = NULL, | ||
208 | }; | ||
209 | |||
210 | const EVP_CIPHER * | ||
211 | EVP_sm4_ofb(void) | ||
212 | { | ||
213 | return &sm4_ofb; | ||
214 | } | ||
215 | |||
216 | static const EVP_CIPHER sm4_ecb = { | ||
217 | .nid = NID_sm4_ecb, | ||
218 | .block_size = 16, | ||
219 | .key_len = 16, | ||
220 | .iv_len = 0, | ||
221 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_ECB_MODE, | ||
222 | .init = sm4_init_key, | ||
223 | .do_cipher = sm4_ecb_cipher, | ||
224 | .cleanup = NULL, | ||
225 | .ctx_size = sizeof(EVP_SM4_KEY), | ||
226 | .set_asn1_parameters = 0, | ||
227 | .get_asn1_parameters = 0, | ||
228 | .ctrl = 0, | ||
229 | .app_data = NULL, | ||
230 | }; | ||
231 | |||
232 | const EVP_CIPHER * | ||
233 | EVP_sm4_ecb(void) | ||
234 | { | ||
235 | return &sm4_ecb; | ||
236 | } | ||
79 | 237 | ||
80 | static int | 238 | static int |
81 | sm4_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, | 239 | sm4_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, |
82 | size_t len) | 240 | size_t len) |
83 | { | 241 | { |
84 | EVP_SM4_KEY *key = EVP_C_DATA(EVP_SM4_KEY, ctx); | 242 | EVP_SM4_KEY *key = ((EVP_SM4_KEY *)(ctx)->cipher_data); |
85 | 243 | ||
86 | CRYPTO_ctr128_encrypt(in, out, len, &key->ks, ctx->iv, ctx->buf, | 244 | CRYPTO_ctr128_encrypt(in, out, len, &key->ks, ctx->iv, ctx->buf, |
87 | &ctx->num, (block128_f)SM4_encrypt); | 245 | &ctx->num, (block128_f)SM4_encrypt); |