aboutsummaryrefslogtreecommitdiff
path: root/gost_crypt.c
diff options
context:
space:
mode:
authorDmitry Belyavskiy <beldmit@gmail.com>2018-06-09 14:54:30 +0300
committerDmitry Belyavskiy <beldmit@gmail.com>2018-06-09 14:54:30 +0300
commit954aae2c257b164aea3660c8baf98dfc2d03012d (patch)
tree89e7cbd857d7891e2ca9acf415c3cbd9e0fb2ef3 /gost_crypt.c
parentc5958ad35eb481ec342fef73bb4544fd8846eeb5 (diff)
downloadgost-engine-954aae2c257b164aea3660c8baf98dfc2d03012d.zip
gost-engine-954aae2c257b164aea3660c8baf98dfc2d03012d.tar.gz
gost-engine-954aae2c257b164aea3660c8baf98dfc2d03012d.tar.bz2
Finalized magma-cbc
Diffstat (limited to 'gost_crypt.c')
-rw-r--r--gost_crypt.c54
1 files changed, 51 insertions, 3 deletions
diff --git a/gost_crypt.c b/gost_crypt.c
index 69a8f0d..27321f4 100644
--- a/gost_crypt.c
+++ b/gost_crypt.c
@@ -48,6 +48,9 @@ static int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr);
static int magma_cipher_init_cbc(EVP_CIPHER_CTX *ctx, const unsigned char *key,
const unsigned char *iv, int enc);
+/* Handles block of data in CBC mode */
+static int magma_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
+ const unsigned char *in, size_t inl);
static EVP_CIPHER *_hidden_Gost28147_89_cipher = NULL;
const EVP_CIPHER *cipher_gost(void)
{
@@ -205,7 +208,7 @@ const EVP_CIPHER *cipher_magma_cbc(void)
|| !EVP_CIPHER_meth_set_init(_hidden_magma_cbc,
magma_cipher_init_cbc)
|| !EVP_CIPHER_meth_set_do_cipher(_hidden_magma_cbc,
- gost_cipher_do_cbc)
+ magma_cipher_do_cbc)
|| !EVP_CIPHER_meth_set_cleanup(_hidden_magma_cbc,
gost_cipher_cleanup)
|| !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_magma_cbc,
@@ -428,7 +431,7 @@ static int magma_cipher_init_param(EVP_CIPHER_CTX *ctx,
{
struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_get_cipher_data(ctx);
if (EVP_CIPHER_CTX_get_app_data(ctx) == NULL) {
- if (!gost_cipher_set_param(c, paramNID))
+ if (!gost_cipher_set_param(c, NID_id_tc26_gost_28147_param_Z))
return 0;
EVP_CIPHER_CTX_set_app_data(ctx, EVP_CIPHER_CTX_get_cipher_data(ctx));
}
@@ -549,7 +552,7 @@ static void gost_cnt_next(void *ctx, unsigned char *iv, unsigned char *buf)
c->count = c->count % 1024 + 8;
}
-/* GOST encryptoon in CBC mode */
+/* GOST encryption in CBC mode */
int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
const unsigned char *in, size_t inl)
{
@@ -586,6 +589,51 @@ int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
return 1;
}
+/* GOST encryption in CBC mode */
+int magma_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
+ const unsigned char *in, size_t inl)
+{
+ unsigned char b[8];
+ unsigned char d[8];
+ const unsigned char *in_ptr = in;
+ unsigned char *out_ptr = out;
+ int i;
+ struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_get_cipher_data(ctx);
+ unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx);
+ if (EVP_CIPHER_CTX_encrypting(ctx)) {
+ while (inl > 0) {
+
+ for (i = 0; i < 8; i++) {
+ b[7-i] = iv[i] ^ in_ptr[i];
+ }
+ gostcrypt(&(c->cctx), b, d);
+
+ for (i = 0; i < 8; i++) {
+ out_ptr[7-i] = d[i];
+ }
+ memcpy(iv, out_ptr, 8);
+ out_ptr += 8;
+ in_ptr += 8;
+ inl -= 8;
+ }
+ } else {
+ while (inl > 0) {
+ for (i = 0; i < 8; i++) {
+ d[7-i] = in_ptr[i];
+ }
+ gostdecrypt(&(c->cctx), d, b);
+ for (i = 0; i < 8; i++) {
+ out_ptr[i] = iv[i] ^ b[7-i];
+ }
+ memcpy(iv, in_ptr, 8);
+ out_ptr += 8;
+ in_ptr += 8;
+ inl -= 8;
+ }
+ }
+ return 1;
+}
+
/* GOST encryption in CFB mode */
int gost_cipher_do_cfb(EVP_CIPHER_CTX *ctx, unsigned char *out,
const unsigned char *in, size_t inl)