]> www.wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gost_crypt.c
GOST engine fixes to make it compiling with opaque EVP_CIPHER/EVP_CIPHER_CTX structs
[openssl-gost/engine.git] / gost_crypt.c
index a0125eae40ba5bc324c4ee77fc09ef6b8bb716cc..f55a10caa7964ffc61b8c84101309419d08d4632 100644 (file)
@@ -46,73 +46,156 @@ static int gost89_get_asn1_parameters(EVP_CIPHER_CTX *ctx, ASN1_TYPE *params);
 /* Control function */
 static int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr);
 
-EVP_CIPHER cipher_gost = {
-    NID_id_Gost28147_89,
-    1,                          /* block_size */
-    32,                         /* key_size */
-    8,                          /* iv_len */
-    EVP_CIPH_CFB_MODE | EVP_CIPH_NO_PADDING |
-        EVP_CIPH_CUSTOM_IV | EVP_CIPH_RAND_KEY | EVP_CIPH_ALWAYS_CALL_INIT,
-    gost_cipher_init,
-    gost_cipher_do_cfb,
-    gost_cipher_cleanup,
-    sizeof(struct ossl_gost_cipher_ctx), /* ctx_size */
-    gost89_set_asn1_parameters,
-    gost89_get_asn1_parameters,
-    gost_cipher_ctl,
-    NULL,
-};
+static EVP_CIPHER *_hidden_Gost28147_89_cipher = NULL;
+const EVP_CIPHER *cipher_gost(void)
+{
+    if (_hidden_Gost28147_89_cipher == NULL
+        && ((_hidden_Gost28147_89_cipher =
+             EVP_CIPHER_meth_new(NID_id_Gost28147_89,
+                                 1  /* block_size */,
+                                 32 /* key_size */)) == NULL
+            || !EVP_CIPHER_meth_set_iv_length(_hidden_Gost28147_89_cipher, 8)
+            || !EVP_CIPHER_meth_set_flags(_hidden_Gost28147_89_cipher,
+                                          EVP_CIPH_CFB_MODE |
+                                          EVP_CIPH_NO_PADDING |
+                                          EVP_CIPH_CUSTOM_IV |
+                                          EVP_CIPH_RAND_KEY |
+                                          EVP_CIPH_ALWAYS_CALL_INIT)
+            || !EVP_CIPHER_meth_set_init(_hidden_Gost28147_89_cipher,
+                                         gost_cipher_init)
+            || !EVP_CIPHER_meth_set_do_cipher(_hidden_Gost28147_89_cipher,
+                                              gost_cipher_do_cfb)
+            || !EVP_CIPHER_meth_set_cleanup(_hidden_Gost28147_89_cipher,
+                                            gost_cipher_cleanup)
+            || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_Gost28147_89_cipher,
+                                                  sizeof(struct ossl_gost_cipher_ctx))
+            || !EVP_CIPHER_meth_set_set_asn1_params(_hidden_Gost28147_89_cipher,
+                                                    gost89_set_asn1_parameters)
+            || !EVP_CIPHER_meth_set_get_asn1_params(_hidden_Gost28147_89_cipher,
+                                                    gost89_get_asn1_parameters)
+            || !EVP_CIPHER_meth_set_ctrl(_hidden_Gost28147_89_cipher,
+                                         gost_cipher_ctl))) {
+        EVP_CIPHER_meth_free(_hidden_Gost28147_89_cipher);
+        _hidden_Gost28147_89_cipher = NULL;
+    }
+    return _hidden_Gost28147_89_cipher;
+}
+static EVP_CIPHER *_hidden_Gost28147_89_cbc = NULL;
+const EVP_CIPHER *cipher_gost_cbc(void)
+{
+    if (_hidden_Gost28147_89_cbc == NULL
+        && ((_hidden_Gost28147_89_cbc =
+             EVP_CIPHER_meth_new(NID_gost89_cbc,
+                                 8  /* block_size */,
+                                 32 /* key_size */)) == NULL
+            || !EVP_CIPHER_meth_set_iv_length(_hidden_Gost28147_89_cbc, 8)
+            || !EVP_CIPHER_meth_set_flags(_hidden_Gost28147_89_cbc,
+                                       EVP_CIPH_CBC_MODE |
+                                       EVP_CIPH_CUSTOM_IV | 
+                                       EVP_CIPH_RAND_KEY | 
+                                       EVP_CIPH_ALWAYS_CALL_INIT)
+            || !EVP_CIPHER_meth_set_init(_hidden_Gost28147_89_cbc,
+                                         gost_cipher_init_cbc)
+            || !EVP_CIPHER_meth_set_do_cipher(_hidden_Gost28147_89_cbc,
+                                              gost_cipher_do_cbc)
+            || !EVP_CIPHER_meth_set_cleanup(_hidden_Gost28147_89_cbc,
+                                            gost_cipher_cleanup)
+            || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_Gost28147_89_cbc,
+                                                  sizeof(struct ossl_gost_cipher_ctx))
+            || !EVP_CIPHER_meth_set_set_asn1_params(_hidden_Gost28147_89_cbc,
+                                                    gost89_set_asn1_parameters)
+            || !EVP_CIPHER_meth_set_get_asn1_params(_hidden_Gost28147_89_cbc,
+                                                    gost89_get_asn1_parameters)
+            || !EVP_CIPHER_meth_set_ctrl(_hidden_Gost28147_89_cbc,
+                                         gost_cipher_ctl))) {
+        EVP_CIPHER_meth_free(_hidden_Gost28147_89_cbc);
+        _hidden_Gost28147_89_cbc = NULL;
+    }
+    return _hidden_Gost28147_89_cbc;
+}
+static EVP_CIPHER *_hidden_gost89_cnt = NULL;
+const EVP_CIPHER *cipher_gost_cpacnt(void)
+{
+    if (_hidden_gost89_cnt == NULL
+        && ((_hidden_gost89_cnt =
+             EVP_CIPHER_meth_new(NID_gost89_cnt,
+                                 1  /* block_size */,
+                                 32 /* key_size */)) == NULL
+            || !EVP_CIPHER_meth_set_iv_length(_hidden_gost89_cnt, 8)
+            || !EVP_CIPHER_meth_set_flags(_hidden_gost89_cnt,
+                                          EVP_CIPH_OFB_MODE |
+                                          EVP_CIPH_NO_PADDING |
+                                          EVP_CIPH_CUSTOM_IV |
+                                          EVP_CIPH_RAND_KEY |
+                                          EVP_CIPH_ALWAYS_CALL_INIT)
+            || !EVP_CIPHER_meth_set_init(_hidden_gost89_cnt,
+                                         gost_cipher_init_cpa)
+            || !EVP_CIPHER_meth_set_do_cipher(_hidden_gost89_cnt,
+                                              gost_cipher_do_cnt)
+            || !EVP_CIPHER_meth_set_cleanup(_hidden_gost89_cnt,
+                                            gost_cipher_cleanup)
+            || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_gost89_cnt,
+                                                  sizeof(struct ossl_gost_cipher_ctx))
+            || !EVP_CIPHER_meth_set_set_asn1_params(_hidden_gost89_cnt,
+                                                    gost89_set_asn1_parameters)
+            || !EVP_CIPHER_meth_set_get_asn1_params(_hidden_gost89_cnt,
+                                                    gost89_get_asn1_parameters)
+            || !EVP_CIPHER_meth_set_ctrl(_hidden_gost89_cnt,
+                                         gost_cipher_ctl))) {
+        EVP_CIPHER_meth_free(_hidden_gost89_cnt);
+        _hidden_gost89_cnt = NULL;
+    }
+    return _hidden_gost89_cnt;
+}
 
-EVP_CIPHER cipher_gost_cbc = {
-    NID_gost89_cbc,
-    8,                          /*block_size */
-    32,                         /*key_size */
-    8,                          /*iv_len */
-    EVP_CIPH_CBC_MODE |
-        EVP_CIPH_CUSTOM_IV | EVP_CIPH_RAND_KEY | EVP_CIPH_ALWAYS_CALL_INIT,
-    gost_cipher_init_cbc,
-    gost_cipher_do_cbc,
-    gost_cipher_cleanup,
-    sizeof(struct ossl_gost_cipher_ctx), /* ctx_size */
-    gost89_set_asn1_parameters,
-    gost89_get_asn1_parameters,
-    gost_cipher_ctl,
-    NULL,
-};
+static EVP_CIPHER *_hidden_gost89_cnt_12 = NULL;
+const EVP_CIPHER *cipher_gost_cpcnt_12(void)
+{
+    if (_hidden_gost89_cnt_12 == NULL
+        && ((_hidden_gost89_cnt_12 =
+             EVP_CIPHER_meth_new(NID_gost89_cnt_12,
+                                 1  /* block_size */,
+                                 32 /* key_size */)) == NULL
+            || !EVP_CIPHER_meth_set_iv_length(_hidden_gost89_cnt_12, 8)
+            || !EVP_CIPHER_meth_set_flags(_hidden_gost89_cnt_12,
+                                          EVP_CIPH_OFB_MODE |
+                                          EVP_CIPH_NO_PADDING |
+                                          EVP_CIPH_CUSTOM_IV |
+                                          EVP_CIPH_RAND_KEY |
+                                          EVP_CIPH_ALWAYS_CALL_INIT)
+            || !EVP_CIPHER_meth_set_init(_hidden_gost89_cnt_12,
+                                         gost_cipher_init_cp_12)
+            || !EVP_CIPHER_meth_set_do_cipher(_hidden_gost89_cnt_12,
+                                              gost_cipher_do_cnt)
+            || !EVP_CIPHER_meth_set_cleanup(_hidden_gost89_cnt_12,
+                                            gost_cipher_cleanup)
+            || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_gost89_cnt_12,
+                                                  sizeof(struct ossl_gost_cipher_ctx))
+            || !EVP_CIPHER_meth_set_set_asn1_params(_hidden_gost89_cnt_12,
+                                                    gost89_set_asn1_parameters)
+            || !EVP_CIPHER_meth_set_get_asn1_params(_hidden_gost89_cnt_12,
+                                                    gost89_get_asn1_parameters)
+            || !EVP_CIPHER_meth_set_ctrl(_hidden_gost89_cnt_12,
+                                         gost_cipher_ctl))) {
+        EVP_CIPHER_meth_free(_hidden_gost89_cnt_12);
+        _hidden_gost89_cnt_12 = NULL;
+    }
+    return _hidden_gost89_cnt_12;
+}
 
-EVP_CIPHER cipher_gost_cpacnt = {
-    NID_gost89_cnt,
-    1,                          /* block_size */
-    32,                         /* key_size */
-    8,                          /* iv_len */
-    EVP_CIPH_OFB_MODE | EVP_CIPH_NO_PADDING |
-        EVP_CIPH_CUSTOM_IV | EVP_CIPH_RAND_KEY | EVP_CIPH_ALWAYS_CALL_INIT,
-    gost_cipher_init_cpa,
-    gost_cipher_do_cnt,
-    gost_cipher_cleanup,
-    sizeof(struct ossl_gost_cipher_ctx), /* ctx_size */
-    gost89_set_asn1_parameters,
-    gost89_get_asn1_parameters,
-    gost_cipher_ctl,
-    NULL,
-};
+void cipher_gost_destroy(void)
+{
+    EVP_CIPHER_meth_free(_hidden_Gost28147_89_cipher);
+    _hidden_Gost28147_89_cipher = NULL;
+    EVP_CIPHER_meth_free(_hidden_gost89_cnt);
+    _hidden_gost89_cnt = NULL;
+    EVP_CIPHER_meth_free(_hidden_Gost28147_89_cbc);
+    _hidden_Gost28147_89_cbc = NULL;
+    EVP_CIPHER_meth_free(_hidden_gost89_cnt_12);
+    _hidden_gost89_cnt_12 = NULL;
+}
 
-EVP_CIPHER cipher_gost_cpcnt_12 = {
-    NID_gost89_cnt_12,
-    1,                          /* block_size */
-    32,                         /* key_size */
-    8,                          /* iv_len */
-    EVP_CIPH_OFB_MODE | EVP_CIPH_NO_PADDING |
-        EVP_CIPH_CUSTOM_IV | EVP_CIPH_RAND_KEY | EVP_CIPH_ALWAYS_CALL_INIT,
-    gost_cipher_init_cp_12,
-    gost_cipher_do_cnt,
-    gost_cipher_cleanup,
-    sizeof(struct ossl_gost_cipher_ctx), /* ctx_size */
-    gost89_set_asn1_parameters,
-    gost89_get_asn1_parameters,
-    gost_cipher_ctl,
-    NULL,
-};
 
 /* Implementation of GOST 28147-89 in MAC (imitovstavka) mode */
 /* Init functions which set specific parameters */
@@ -281,17 +364,21 @@ static int gost_cipher_init_param(EVP_CIPHER_CTX *ctx,
                                   const unsigned char *iv, int enc,
                                   int paramNID, int mode)
 {
-    struct ossl_gost_cipher_ctx *c = ctx->cipher_data;
-    if (ctx->app_data == NULL) {
+    struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx);
+    if (EVP_CIPHER_CTX_get_app_data(ctx) == NULL) {
         if (!gost_cipher_set_param(c, paramNID))
             return 0;
-        ctx->app_data = ctx->cipher_data;
+        EVP_CIPHER_CTX_set_app_data(ctx, EVP_CIPHER_CTX_cipher_data(ctx));
     }
     if (key)
         gost_key(&(c->cctx), key);
-    if (iv)
-        memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
-    memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
+    if (iv) {
+        memcpy((unsigned char *)EVP_CIPHER_CTX_original_iv(ctx), iv,
+               EVP_CIPHER_CTX_iv_length(ctx));
+    }
+    memcpy(EVP_CIPHER_CTX_iv_noconst(ctx),
+           EVP_CIPHER_CTX_original_iv(ctx),
+           EVP_CIPHER_CTX_iv_length(ctx));
     return 1;
 }
 
@@ -300,15 +387,19 @@ static int gost_cipher_init_cnt(EVP_CIPHER_CTX *ctx,
                                 const unsigned char *iv,
                                 gost_subst_block * block)
 {
-    struct ossl_gost_cipher_ctx *c = ctx->cipher_data;
+    struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx);
     gost_init(&(c->cctx), block);
     c->key_meshing = 1;
     c->count = 0;
     if (key)
         gost_key(&(c->cctx), key);
-    if (iv)
-        memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
-    memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
+    if (iv) {
+        memcpy((unsigned char *)EVP_CIPHER_CTX_original_iv(ctx), iv,
+               EVP_CIPHER_CTX_iv_length(ctx));
+    }
+    memcpy(EVP_CIPHER_CTX_iv_noconst(ctx),
+           EVP_CIPHER_CTX_original_iv(ctx),
+           EVP_CIPHER_CTX_iv_length(ctx));
     return 1;
 }
 
@@ -399,14 +490,16 @@ int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
     const unsigned char *in_ptr = in;
     unsigned char *out_ptr = out;
     int i;
-    struct ossl_gost_cipher_ctx *c = ctx->cipher_data;
-    if (ctx->encrypt) {
+    struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_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[i] = ctx->iv[i] ^ in_ptr[i];
+                b[i] = iv[i] ^ in_ptr[i];
             }
             gostcrypt(&(c->cctx), b, out_ptr);
-            memcpy(ctx->iv, out_ptr, 8);
+            memcpy(iv, out_ptr, 8);
             out_ptr += 8;
             in_ptr += 8;
             inl -= 8;
@@ -415,9 +508,9 @@ int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
         while (inl > 0) {
             gostdecrypt(&(c->cctx), in_ptr, b);
             for (i = 0; i < 8; i++) {
-                out_ptr[i] = ctx->iv[i] ^ b[i];
+                out_ptr[i] = iv[i] ^ b[i];
             }
-            memcpy(ctx->iv, in_ptr, 8);
+            memcpy(iv, in_ptr, 8);
             out_ptr += 8;
             in_ptr += 8;
             inl -= 8;
@@ -434,21 +527,23 @@ int gost_cipher_do_cfb(EVP_CIPHER_CTX *ctx, unsigned char *out,
     unsigned char *out_ptr = out;
     size_t i = 0;
     size_t j = 0;
+    unsigned char *buf = EVP_CIPHER_CTX_buf_noconst(ctx);
+    unsigned char *iv  = EVP_CIPHER_CTX_iv_noconst(ctx);
 /* process partial block if any */
-    if (ctx->num) {
-        for (j = ctx->num, i = 0; j < 8 && i < inl;
+    if (EVP_CIPHER_CTX_num(ctx)) {
+        for (j = EVP_CIPHER_CTX_num(ctx), i = 0; j < 8 && i < inl;
              j++, i++, in_ptr++, out_ptr++) {
-            if (!ctx->encrypt)
-                ctx->buf[j + 8] = *in_ptr;
-            *out_ptr = ctx->buf[j] ^ (*in_ptr);
-            if (ctx->encrypt)
-                ctx->buf[j + 8] = *out_ptr;
+            if (!EVP_CIPHER_CTX_encrypting(ctx))
+                buf[j + 8] = *in_ptr;
+            *out_ptr = buf[j] ^ (*in_ptr);
+            if (EVP_CIPHER_CTX_encrypting(ctx))
+                buf[j + 8] = *out_ptr;
         }
         if (j == 8) {
-            memcpy(ctx->iv, ctx->buf + 8, 8);
-            ctx->num = 0;
+            memcpy(iv, buf + 8, 8);
+            EVP_CIPHER_CTX_set_num(ctx, 0);
         } else {
-            ctx->num = j;
+            EVP_CIPHER_CTX_set_num(ctx, j);
             return 1;
         }
     }
@@ -457,36 +552,36 @@ int gost_cipher_do_cfb(EVP_CIPHER_CTX *ctx, unsigned char *out,
         /*
          * block cipher current iv
          */
-        gost_crypt_mesh(ctx->cipher_data, ctx->iv, ctx->buf);
+        gost_crypt_mesh(EVP_CIPHER_CTX_cipher_data(ctx), iv, buf);
         /*
          * xor next block of input text with it and output it
          */
         /*
          * output this block
          */
-        if (!ctx->encrypt)
-            memcpy(ctx->iv, in_ptr, 8);
+        if (!EVP_CIPHER_CTX_encrypting(ctx))
+            memcpy(iv, in_ptr, 8);
         for (j = 0; j < 8; j++) {
-            out_ptr[j] = ctx->buf[j] ^ in_ptr[j];
+            out_ptr[j] = buf[j] ^ in_ptr[j];
         }
         /* Encrypt */
         /* Next iv is next block of cipher text */
-        if (ctx->encrypt)
-            memcpy(ctx->iv, out_ptr, 8);
+        if (EVP_CIPHER_CTX_encrypting(ctx))
+            memcpy(iv, out_ptr, 8);
     }
 /* Process rest of buffer */
     if (i < inl) {
-        gost_crypt_mesh(ctx->cipher_data, ctx->iv, ctx->buf);
-        if (!ctx->encrypt)
-            memcpy(ctx->buf + 8, in_ptr, inl - i);
+        gost_crypt_mesh(EVP_CIPHER_CTX_cipher_data(ctx), iv, buf);
+        if (!EVP_CIPHER_CTX_encrypting(ctx))
+            memcpy(buf + 8, in_ptr, inl - i);
         for (j = 0; i < inl; j++, i++) {
-            out_ptr[j] = ctx->buf[j] ^ in_ptr[j];
+            out_ptr[j] = buf[j] ^ in_ptr[j];
         }
-        ctx->num = j;
-        if (ctx->encrypt)
-            memcpy(ctx->buf + 8, out_ptr, j);
+        EVP_CIPHER_CTX_set_num(ctx, j);
+        if (EVP_CIPHER_CTX_encrypting(ctx))
+            memcpy(buf + 8, out_ptr, j);
     } else {
-        ctx->num = 0;
+        EVP_CIPHER_CTX_set_num(ctx, 0);
     }
     return 1;
 }
@@ -498,16 +593,18 @@ static int gost_cipher_do_cnt(EVP_CIPHER_CTX *ctx, unsigned char *out,
     unsigned char *out_ptr = out;
     size_t i = 0;
     size_t j;
+    unsigned char *buf = EVP_CIPHER_CTX_buf_noconst(ctx);
+    unsigned char *iv  = EVP_CIPHER_CTX_iv_noconst(ctx);
 /* process partial block if any */
-    if (ctx->num) {
-        for (j = ctx->num, i = 0; j < 8 && i < inl;
+    if (EVP_CIPHER_CTX_num(ctx)) {
+        for (j = EVP_CIPHER_CTX_num(ctx), i = 0; j < 8 && i < inl;
              j++, i++, in_ptr++, out_ptr++) {
-            *out_ptr = ctx->buf[j] ^ (*in_ptr);
+            *out_ptr = buf[j] ^ (*in_ptr);
         }
         if (j == 8) {
-            ctx->num = 0;
+            EVP_CIPHER_CTX_set_num(ctx, 0);
         } else {
-            ctx->num = j;
+            EVP_CIPHER_CTX_set_num(ctx, j);
             return 1;
         }
     }
@@ -517,7 +614,7 @@ static int gost_cipher_do_cnt(EVP_CIPHER_CTX *ctx, unsigned char *out,
          * block cipher current iv
          */
         /* Encrypt */
-        gost_cnt_next(ctx->cipher_data, ctx->iv, ctx->buf);
+        gost_cnt_next(EVP_CIPHER_CTX_cipher_data(ctx), iv, buf);
         /*
          * xor next block of input text with it and output it
          */
@@ -525,18 +622,18 @@ static int gost_cipher_do_cnt(EVP_CIPHER_CTX *ctx, unsigned char *out,
          * output this block
          */
         for (j = 0; j < 8; j++) {
-            out_ptr[j] = ctx->buf[j] ^ in_ptr[j];
+            out_ptr[j] = buf[j] ^ in_ptr[j];
         }
     }
 /* Process rest of buffer */
     if (i < inl) {
-        gost_cnt_next(ctx->cipher_data, ctx->iv, ctx->buf);
+        gost_cnt_next(EVP_CIPHER_CTX_cipher_data(ctx), iv, buf);
         for (j = 0; i < inl; j++, i++) {
-            out_ptr[j] = ctx->buf[j] ^ in_ptr[j];
+            out_ptr[j] = buf[j] ^ in_ptr[j];
         }
-        ctx->num = j;
+        EVP_CIPHER_CTX_set_num(ctx, j);
     } else {
-        ctx->num = 0;
+        EVP_CIPHER_CTX_set_num(ctx, 0);
     }
     return 1;
 }
@@ -544,8 +641,8 @@ static int gost_cipher_do_cnt(EVP_CIPHER_CTX *ctx, unsigned char *out,
 /* Cleaning up of EVP_CIPHER_CTX */
 int gost_cipher_cleanup(EVP_CIPHER_CTX *ctx)
 {
-    gost_destroy(&((struct ossl_gost_cipher_ctx *)ctx->cipher_data)->cctx);
-    ctx->app_data = NULL;
+    gost_destroy(&((struct ossl_gost_cipher_ctx *)EVP_CIPHER_CTX_cipher_data(ctx))->cctx);
+    EVP_CIPHER_CTX_set_app_data(ctx, NULL);
     return 1;
 }
 
@@ -556,7 +653,7 @@ int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
 #if 0
     case EVP_CTRL_INIT:
         {
-            struct ossl_gost_cipher_ctx *c = ctx->cipher_data;
+            struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx);
             if (c == NULL) {
                 return -1;
             }
@@ -565,7 +662,7 @@ int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
 #endif
     case EVP_CTRL_RAND_KEY:
         {
-            if (RAND_bytes((unsigned char *)ptr, ctx->key_len) <= 0) {
+            if (RAND_bytes((unsigned char *)ptr, EVP_CIPHER_CTX_key_length(ctx)) <= 0) {
                 GOSTerr(GOST_F_GOST_CIPHER_CTL, GOST_R_RNG_ERROR);
                 return -1;
             }
@@ -592,7 +689,7 @@ int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
 
     case EVP_CTRL_SET_SBOX:
         if (ptr) {
-            struct ossl_gost_cipher_ctx *c = ctx->cipher_data;
+            struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx);
             int nid;
             int cur_meshing;
             int ret;
@@ -619,7 +716,7 @@ int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
         }
     case EVP_CTRL_KEY_MESH:
         {
-            struct ossl_gost_cipher_ctx *c = ctx->cipher_data;
+            struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx);
 
             if (c == NULL) {
                 return -1;
@@ -646,14 +743,14 @@ int gost89_set_asn1_parameters(EVP_CIPHER_CTX *ctx, ASN1_TYPE *params)
     int len = 0;
     unsigned char *buf = NULL;
     unsigned char *p = NULL;
-    struct ossl_gost_cipher_ctx *c = ctx->cipher_data;
+    struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx);
     GOST_CIPHER_PARAMS *gcp = GOST_CIPHER_PARAMS_new();
     ASN1_OCTET_STRING *os = NULL;
     if (!gcp) {
         GOSTerr(GOST_F_GOST89_SET_ASN1_PARAMETERS, ERR_R_MALLOC_FAILURE);
         return 0;
     }
-    if (!ASN1_OCTET_STRING_set(gcp->iv, ctx->iv, ctx->cipher->iv_len)) {
+    if (!ASN1_OCTET_STRING_set(gcp->iv, EVP_CIPHER_CTX_iv(ctx), EVP_CIPHER_CTX_iv_length(ctx))) {
         GOST_CIPHER_PARAMS_free(gcp);
         GOSTerr(GOST_F_GOST89_SET_ASN1_PARAMETERS, ERR_R_MALLOC_FAILURE);
         return 0;
@@ -691,7 +788,7 @@ int gost89_get_asn1_parameters(EVP_CIPHER_CTX *ctx, ASN1_TYPE *params)
     int len;
     GOST_CIPHER_PARAMS *gcp = NULL;
     unsigned char *p;
-    struct ossl_gost_cipher_ctx *c = ctx->cipher_data;
+    struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx);
     int nid;
 
     if (ASN1_TYPE_get(params) != V_ASN1_SEQUENCE) {
@@ -704,7 +801,7 @@ int gost89_get_asn1_parameters(EVP_CIPHER_CTX *ctx, ASN1_TYPE *params)
                                  params->value.sequence->length);
 
     len = gcp->iv->length;
-    if (len != ctx->cipher->iv_len) {
+    if (len != EVP_CIPHER_CTX_iv_length(ctx)) {
         GOST_CIPHER_PARAMS_free(gcp);
         GOSTerr(GOST_F_GOST89_GET_ASN1_PARAMETERS, GOST_R_INVALID_IV_LENGTH);
         return -1;
@@ -722,7 +819,9 @@ int gost89_get_asn1_parameters(EVP_CIPHER_CTX *ctx, ASN1_TYPE *params)
         GOST_CIPHER_PARAMS_free(gcp);
         return -1;
     }
-    memcpy(ctx->oiv, gcp->iv->data, len);
+    /*XXX missing non-const accessor*/
+    memcpy((unsigned char *)EVP_CIPHER_CTX_original_iv(ctx), gcp->iv->data,
+        EVP_CIPHER_CTX_iv_length(ctx));
 
     GOST_CIPHER_PARAMS_free(gcp);