+/* GOST encryptoon in CBC mode */
+int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
+ const unsigned char *in, size_t inl)
+ {
+ OPENSSL_assert(inl % 8 ==0);
+ unsigned char b[8];
+ 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)
+ {
+ while(inl>0)
+ {
+ for (i=0;i<8;i++)
+ {
+ b[i]=ctx->iv[i]^in_ptr[i];
+ }
+ gostcrypt(&(c->cctx),b,out_ptr);
+ memcpy(ctx->iv,out_ptr,8);
+ out_ptr+=8;
+ in_ptr+=8;
+ inl-=8;
+ }
+ }
+ else
+ {
+ while (inl>0) {
+ gostdecrypt(&(c->cctx),in_ptr,b);
+ for (i=0;i<8;i++)
+ {
+ out_ptr[i]=ctx->iv[i]^b[i];
+ }
+ memcpy(ctx->iv,in_ptr,8);
+ out_ptr+=8;
+ in_ptr+=8;
+ inl-=8;
+ }
+ }
+ return 1;
+ }