X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_crypt.c;h=e248305f5441a4585778d1f25f4f0ae9a3ec91a6;hb=75796d263c62a57a330f596d4a03d9ed22ec9f74;hp=d094c5ee74edaa80e82f5ed149161c72e56e1830;hpb=5186d798730c1ecec7ed40126beaf493804fcf45;p=openssl-gost%2Fengine.git diff --git a/gost_crypt.c b/gost_crypt.c index d094c5e..e248305 100644 --- a/gost_crypt.c +++ b/gost_crypt.c @@ -693,11 +693,12 @@ static int magma_cipher_do_ctr(EVP_CIPHER_CTX *ctx, unsigned char *out, struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_get_cipher_data(ctx); unsigned char *buf = EVP_CIPHER_CTX_buf_noconst(ctx); unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx); + unsigned char b[8]; /* Process partial blocks */ 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 = buf[j] ^ (*in_ptr); + *out_ptr = buf[7-j] ^ (*in_ptr); } if (j == 8) { EVP_CIPHER_CTX_set_num(ctx, 0); @@ -708,20 +709,26 @@ static int magma_cipher_do_ctr(EVP_CIPHER_CTX *ctx, unsigned char *out, } /* Process full blocks */ - for (; i + 8 < inl; i += 8, in_ptr += 8, out_ptr += 8) { - gostcrypt(&(c->cctx), iv, buf); + for (; i + 8 <= inl; i += 8, in_ptr += 8, out_ptr += 8) { for (j = 0; j < 8; j++) { - out_ptr[j] = buf[j] ^ in_ptr[j]; + b[7-j] = iv[j]; + } + gostcrypt(&(c->cctx), b, buf); + for (j = 0; j < 8; j++) { + out_ptr[j] = buf[7-j] ^ in_ptr[j]; } ctr64_inc(iv); } /* Process the rest of plaintext */ if (i < inl) { + for (j = 0; j < 8; j++) { + b[7-j] = iv[j]; + } gostcrypt(&(c->cctx), iv, buf); ctr64_inc(iv); for (j = 0; i < inl; j++, i++) { - out_ptr[j] = buf[j] ^ in_ptr[j]; + out_ptr[j] = buf[7-j] ^ in_ptr[j]; } EVP_CIPHER_CTX_set_num(ctx, j);