diff options
Diffstat (limited to '')
| -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 |
