aboutsummaryrefslogtreecommitdiff
path: root/gost_crypt.c
diff options
context:
space:
mode:
authorMark Fedorov <mark.fedorov@cloudbear.ru>2022-08-11 12:27:11 +0000
committerDmitry Belyavskiy <beldmit@users.noreply.github.com>2022-08-11 17:48:01 +0200
commitbd6c4f8c5c8a087ce0ea65c3dc5ee38b38b8802c (patch)
tree94968c628962a3cbe2e8ab8133ef3817d177981d /gost_crypt.c
parente19c3e04fddc64c30535eb042dbf948fc5687398 (diff)
downloadgost-engine-bd6c4f8c5c8a087ce0ea65c3dc5ee38b38b8802c.zip
gost-engine-bd6c4f8c5c8a087ce0ea65c3dc5ee38b38b8802c.tar.gz
gost-engine-bd6c4f8c5c8a087ce0ea65c3dc5ee38b38b8802c.tar.bz2
Add magma-ecb mode. Fixes #410
Diffstat (limited to 'gost_crypt.c')
-rw-r--r--gost_crypt.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/gost_crypt.c b/gost_crypt.c
index 6d68f62..0aa2ecf 100644
--- a/gost_crypt.c
+++ b/gost_crypt.c
@@ -54,6 +54,8 @@ static int magma_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
static int magma_cipher_init_ctr_acpkm_omac(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_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out,
+ const unsigned char *in, size_t inl);
static int magma_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
const unsigned char *in, size_t inl);
static int magma_cipher_do_ctr(EVP_CIPHER_CTX *ctx, unsigned char *out,
@@ -187,8 +189,7 @@ GOST_cipher Gost28147_89_cnt_12_cipher = {
static GOST_cipher magma_template_cipher = {
.block_size = 8,
.key_len = 32,
- .iv_len = 8,
- .flags = EVP_CIPH_CUSTOM_IV |
+ .flags =
EVP_CIPH_RAND_KEY |
EVP_CIPH_ALWAYS_CALL_INIT,
.cleanup = gost_cipher_cleanup,
@@ -205,6 +206,7 @@ GOST_cipher magma_ctr_cipher = {
.block_size = 1,
.iv_len = 4,
.flags = EVP_CIPH_CTR_MODE |
+ EVP_CIPH_CUSTOM_IV |
EVP_CIPH_NO_PADDING,
.init = magma_cipher_init,
};
@@ -215,6 +217,7 @@ GOST_cipher magma_ctr_acpkm_cipher = {
.block_size = 1,
.iv_len = 4,
.flags = EVP_CIPH_CTR_MODE |
+ EVP_CIPH_CUSTOM_IV |
EVP_CIPH_NO_PADDING,
.init = magma_cipher_init,
};
@@ -225,6 +228,7 @@ GOST_cipher magma_ctr_acpkm_omac_cipher = {
.block_size = 1,
.iv_len = 4,
.flags = EVP_CIPH_CTR_MODE |
+ EVP_CIPH_CUSTOM_IV |
EVP_CIPH_NO_PADDING |
EVP_CIPH_CUSTOM_COPY |
EVP_CIPH_FLAG_CUSTOM_CIPHER |
@@ -234,10 +238,20 @@ GOST_cipher magma_ctr_acpkm_omac_cipher = {
.ctrl = magma_cipher_ctl_acpkm_omac,
};
+GOST_cipher magma_ecb_cipher = {
+ .nid = NID_magma_ecb,
+ .template = &magma_template_cipher,
+ .flags = EVP_CIPH_ECB_MODE,
+ .init = magma_cipher_init,
+ .do_cipher = magma_cipher_do_ecb,
+};
+
GOST_cipher magma_cbc_cipher = {
.nid = NID_magma_cbc,
.template = &gost_template_cipher,
- .flags = EVP_CIPH_CBC_MODE,
+ .iv_len = 8,
+ .flags = EVP_CIPH_CBC_MODE |
+ EVP_CIPH_CUSTOM_IV,
.init = magma_cipher_init,
.do_cipher = magma_cipher_do_cbc,
};
@@ -592,6 +606,29 @@ static int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
return 1;
}
+/* MAGMA encryption in ECB mode */
+static int magma_cipher_do_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out,
+ const unsigned char *in, size_t inl)
+{
+ struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_get_cipher_data(ctx);
+ if (EVP_CIPHER_CTX_encrypting(ctx)) {
+ while (inl > 0) {
+ magmacrypt(&(c->cctx), in, out);
+ out += 8;
+ in += 8;
+ inl -= 8;
+ }
+ } else {
+ while (inl > 0) {
+ magmadecrypt(&(c->cctx), in, out);
+ out += 8;
+ in += 8;
+ inl -= 8;
+ }
+ }
+ return 1;
+}
+
/* MAGMA encryption in CBC mode */
static int magma_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
const unsigned char *in, size_t inl)