diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/evp/e_gost2814789.c | 123 |
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 | ||
189 | BLOCK_CIPHER_func_ecb(gost2814789, Gost2814789, EVP_GOST2814789_CTX, ks) | 189 | static int |
190 | BLOCK_CIPHER_func_cfb(gost2814789, Gost2814789, 64, EVP_GOST2814789_CTX, ks) | 190 | gost2814789_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 | |||
207 | static int | ||
208 | gost2814789_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 | ||
192 | static int | 231 | static int |
193 | gost2814789_cnt_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 232 | gost2814789_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 | ||
215 | BLOCK_CIPHER_def_ecb(gost2814789, EVP_GOST2814789_CTX, NID_gost89, 8, 32, | 254 | static 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, |
219 | BLOCK_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, |
223 | BLOCK_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 | |||
270 | const EVP_CIPHER * | ||
271 | EVP_gost2814789_ecb(void) | ||
272 | { | ||
273 | return &gost2814789_ecb; | ||
274 | } | ||
275 | |||
276 | static 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 | |||
292 | const EVP_CIPHER * | ||
293 | EVP_gost2814789_cfb64(void) | ||
294 | { | ||
295 | return &gost2814789_cfb64; | ||
296 | } | ||
297 | |||
298 | static 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 | |||
314 | const EVP_CIPHER * | ||
315 | EVP_gost2814789_cnt(void) | ||
316 | { | ||
317 | return &gost2814789_cnt; | ||
318 | } | ||
319 | |||
227 | #endif | 320 | #endif |