summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2022-09-04 09:48:23 +0000
committerjsing <>2022-09-04 09:48:23 +0000
commitbba9682300dd54b4f8f23760047d994ef1aa347b (patch)
tree86a30b79d29561d310012ade48a9966ba5e381e1
parent447fdb8f50d1e89aef198c1cdd1375c872894726 (diff)
downloadopenbsd-bba9682300dd54b4f8f23760047d994ef1aa347b.tar.gz
openbsd-bba9682300dd54b4f8f23760047d994ef1aa347b.tar.bz2
openbsd-bba9682300dd54b4f8f23760047d994ef1aa347b.zip
Expand BLOCK_CIPHER_* macros.
No change in generated assembly.
-rw-r--r--src/lib/libcrypto/evp/e_gost2814789.c123
1 files changed, 108 insertions, 15 deletions
diff --git a/src/lib/libcrypto/evp/e_gost2814789.c b/src/lib/libcrypto/evp/e_gost2814789.c
index 7803d9507b..11379be547 100644
--- a/src/lib/libcrypto/evp/e_gost2814789.c
+++ b/src/lib/libcrypto/evp/e_gost2814789.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: e_gost2814789.c,v 1.5 2021/12/12 21:30:13 tb Exp $ */ 1/* $OpenBSD: e_gost2814789.c,v 1.6 2022/09/04 09:48:23 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> 3 * Copyright (c) 2014 Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
4 * Copyright (c) 2005-2006 Cryptocom LTD 4 * Copyright (c) 2005-2006 Cryptocom LTD
@@ -186,8 +186,47 @@ gost2814789_get_asn1_params(EVP_CIPHER_CTX *ctx, ASN1_TYPE *params)
186 return 1; 186 return 1;
187} 187}
188 188
189BLOCK_CIPHER_func_ecb(gost2814789, Gost2814789, EVP_GOST2814789_CTX, ks) 189static int
190BLOCK_CIPHER_func_cfb(gost2814789, Gost2814789, 64, EVP_GOST2814789_CTX, ks) 190gost2814789_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
191{
192 size_t i, bl;
193
194 bl = ctx->cipher->block_size;
195
196 if (inl < bl)
197 return 1;
198
199 inl -= bl;
200
201 for (i = 0; i <= inl; i += bl)
202 Gost2814789_ecb_encrypt(in + i, out + i, &((EVP_GOST2814789_CTX *)ctx->cipher_data)->ks, ctx->encrypt);
203
204 return 1;
205}
206
207static int
208gost2814789_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
209{
210 size_t chunk = EVP_MAXCHUNK;
211
212 if (64 == 1)
213 chunk >>= 3;
214
215 if (inl < chunk)
216 chunk = inl;
217
218 while (inl && inl >= chunk) {
219 Gost2814789_cfb64_encrypt(in, out, (long)((64 == 1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ? inl * 8 : inl), &((EVP_GOST2814789_CTX *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
220 inl -= chunk;
221 in += chunk;
222 out += chunk;
223 if (inl < chunk)
224 chunk = inl;
225 }
226
227 return 1;
228}
229
191 230
192static int 231static int
193gost2814789_cnt_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 232gost2814789_cnt_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
@@ -212,16 +251,70 @@ gost2814789_cnt_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
212/* gost89 is CFB-64 */ 251/* gost89 is CFB-64 */
213#define NID_gost89_cfb64 NID_id_Gost28147_89 252#define NID_gost89_cfb64 NID_id_Gost28147_89
214 253
215BLOCK_CIPHER_def_ecb(gost2814789, EVP_GOST2814789_CTX, NID_gost89, 8, 32, 254static const EVP_CIPHER gost2814789_ecb = {
216 EVP_CIPH_NO_PADDING | EVP_CIPH_CTRL_INIT, 255 .nid = NID_gost89_ecb,
217 gost2814789_init_key, NULL, gost2814789_set_asn1_params, 256 .block_size = 8,
218 gost2814789_get_asn1_params, gost2814789_ctl) 257 .key_len = 32,
219BLOCK_CIPHER_def_cfb(gost2814789, EVP_GOST2814789_CTX, NID_gost89, 32, 8, 64, 258 .iv_len = 0,
220 EVP_CIPH_NO_PADDING | EVP_CIPH_CTRL_INIT, 259 .flags = EVP_CIPH_NO_PADDING | EVP_CIPH_CTRL_INIT | EVP_CIPH_ECB_MODE,
221 gost2814789_init_key, NULL, gost2814789_set_asn1_params, 260 .init = gost2814789_init_key,
222 gost2814789_get_asn1_params, gost2814789_ctl) 261 .do_cipher = gost2814789_ecb_cipher,
223BLOCK_CIPHER_def1(gost2814789, cnt, cnt, OFB, EVP_GOST2814789_CTX, NID_gost89, 262 .cleanup = NULL,
224 1, 32, 8, EVP_CIPH_NO_PADDING | EVP_CIPH_CTRL_INIT, 263 .ctx_size = sizeof(EVP_GOST2814789_CTX),
225 gost2814789_init_key, NULL, gost2814789_set_asn1_params, 264 .set_asn1_parameters = gost2814789_set_asn1_params,
226 gost2814789_get_asn1_params, gost2814789_ctl) 265 .get_asn1_parameters = gost2814789_get_asn1_params,
266 .ctrl = gost2814789_ctl,
267 .app_data = NULL,
268};
269
270const EVP_CIPHER *
271EVP_gost2814789_ecb(void)
272{
273 return &gost2814789_ecb;
274}
275
276static const EVP_CIPHER gost2814789_cfb64 = {
277 .nid = NID_gost89_cfb64,
278 .block_size = 1,
279 .key_len = 32,
280 .iv_len = 8,
281 .flags = EVP_CIPH_NO_PADDING | EVP_CIPH_CTRL_INIT | EVP_CIPH_CFB_MODE,
282 .init = gost2814789_init_key,
283 .do_cipher = gost2814789_cfb64_cipher,
284 .cleanup = NULL,
285 .ctx_size = sizeof(EVP_GOST2814789_CTX),
286 .set_asn1_parameters = gost2814789_set_asn1_params,
287 .get_asn1_parameters = gost2814789_get_asn1_params,
288 .ctrl = gost2814789_ctl,
289 .app_data = NULL,
290};
291
292const EVP_CIPHER *
293EVP_gost2814789_cfb64(void)
294{
295 return &gost2814789_cfb64;
296}
297
298static const EVP_CIPHER gost2814789_cnt = {
299 .nid = NID_gost89_cnt,
300 .block_size = 1,
301 .key_len = 32,
302 .iv_len = 8,
303 .flags = EVP_CIPH_NO_PADDING | EVP_CIPH_CTRL_INIT | EVP_CIPH_OFB_MODE,
304 .init = gost2814789_init_key,
305 .do_cipher = gost2814789_cnt_cipher,
306 .cleanup = NULL,
307 .ctx_size = sizeof(EVP_GOST2814789_CTX),
308 .set_asn1_parameters = gost2814789_set_asn1_params,
309 .get_asn1_parameters = gost2814789_get_asn1_params,
310 .ctrl = gost2814789_ctl,
311 .app_data = NULL,
312};
313
314const EVP_CIPHER *
315EVP_gost2814789_cnt(void)
316{
317 return &gost2814789_cnt;
318}
319
227#endif 320#endif