X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_grasshopper_cipher.c;h=aee1c64f2e08cd79f8d04701e30f47d17749c0e7;hb=9465f47596fb0ca5db8ea89c69ba07990e682ced;hp=9cef0c5f02fa1a596177385d32531c230e98e46a;hpb=a6df1e0ca7c7b34c468d2d1c0fc50029f6ec711b;p=openssl-gost%2Fengine.git diff --git a/gost_grasshopper_cipher.c b/gost_grasshopper_cipher.c index 9cef0c5..aee1c64 100644 --- a/gost_grasshopper_cipher.c +++ b/gost_grasshopper_cipher.c @@ -462,19 +462,19 @@ int gost_grasshopper_cipher_do_ctr(EVP_CIPHER_CTX *ctx, unsigned char *out, grasshopper_w128_t *currentInputBlock; grasshopper_w128_t *currentOutputBlock; unsigned int n = EVP_CIPHER_CTX_num(ctx); - size_t lasted; + size_t lasted = inl; size_t i; size_t blocks; grasshopper_w128_t *iv_buffer; grasshopper_w128_t tmp; - while (n && inl) { + while (n && lasted) { *(current_out++) = *(current_in++) ^ c->partial_buffer.b[n]; - --inl; + --lasted; n = (n + 1) % GRASSHOPPER_BLOCK_SIZE; } EVP_CIPHER_CTX_set_num(ctx, n); - blocks = inl / GRASSHOPPER_BLOCK_SIZE; + blocks = lasted / GRASSHOPPER_BLOCK_SIZE; iv_buffer = (grasshopper_w128_t *) iv; @@ -489,10 +489,9 @@ int gost_grasshopper_cipher_do_ctr(EVP_CIPHER_CTX *ctx, unsigned char *out, ctr128_inc(iv_buffer->b); current_in += GRASSHOPPER_BLOCK_SIZE; current_out += GRASSHOPPER_BLOCK_SIZE; + lasted -= GRASSHOPPER_BLOCK_SIZE; } - // last part - lasted = inl - blocks * GRASSHOPPER_BLOCK_SIZE; if (lasted > 0) { currentInputBlock = (grasshopper_w128_t *) current_in; currentOutputBlock = (grasshopper_w128_t *) current_out; @@ -506,7 +505,7 @@ int gost_grasshopper_cipher_do_ctr(EVP_CIPHER_CTX *ctx, unsigned char *out, ctr128_inc(iv_buffer->b); } - return 1; + return inl; } #define GRASSHOPPER_BLOCK_MASK (GRASSHOPPER_BLOCK_SIZE - 1) @@ -528,15 +527,15 @@ int gost_grasshopper_cipher_do_ctracpkm(EVP_CIPHER_CTX *ctx, gost_grasshopper_cipher_ctx_ctr *c = EVP_CIPHER_CTX_get_cipher_data(ctx); unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx); unsigned int num = EVP_CIPHER_CTX_num(ctx); - size_t blocks, i, lasted; + size_t blocks, i, lasted = inl; grasshopper_w128_t tmp; - while ((num & GRASSHOPPER_BLOCK_MASK) && inl) { + while ((num & GRASSHOPPER_BLOCK_MASK) && lasted) { *out++ = *in++ ^ c->partial_buffer.b[num & GRASSHOPPER_BLOCK_MASK]; - --inl; + --lasted; num++; } - blocks = inl / GRASSHOPPER_BLOCK_SIZE; + blocks = lasted / GRASSHOPPER_BLOCK_SIZE; // full parts for (i = 0; i < blocks; i++) { @@ -552,10 +551,10 @@ int gost_grasshopper_cipher_do_ctracpkm(EVP_CIPHER_CTX *ctx, in += GRASSHOPPER_BLOCK_SIZE; out += GRASSHOPPER_BLOCK_SIZE; num += GRASSHOPPER_BLOCK_SIZE; + lasted -= GRASSHOPPER_BLOCK_SIZE; } // last part - lasted = inl - blocks * GRASSHOPPER_BLOCK_SIZE; if (lasted > 0) { apply_acpkm_grasshopper(c, &num); grasshopper_encrypt_block(&c->c.encrypt_round_keys, @@ -585,6 +584,10 @@ int gost_grasshopper_cipher_do_ctracpkm_omac(EVP_CIPHER_CTX *ctx, return gost2015_final_call(ctx, c->omac_ctx, KUZNYECHIK_MAC_MAX_SIZE, c->tag, gost_grasshopper_cipher_do_ctracpkm); } + if (in == NULL) { + GOSTerr(GOST_F_GOST_GRASSHOPPER_CIPHER_DO_CTRACPKM_OMAC, ERR_R_EVP_LIB); + return -1; + } result = gost_grasshopper_cipher_do_ctracpkm(ctx, out, in, inl); /* As in and out can be the same pointer, process decrypted here */ @@ -816,8 +819,7 @@ GRASSHOPPER_INLINE int gost_grasshopper_get_asn1_parameters(EVP_CIPHER_CTX return 0; } -int gost_grasshopper_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, - void *ptr) +int gost_grasshopper_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) { switch (type) { case EVP_CTRL_RAND_KEY:{ @@ -919,34 +921,16 @@ int gost_grasshopper_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, } #endif case EVP_CTRL_PROCESS_UNPROTECTED: - { - gost_grasshopper_cipher_ctx_ctr *c = EVP_CIPHER_CTX_get_cipher_data(ctx); - ASN1_OBJECT *cmsmacobj = NULL; - if (c->c.type != GRASSHOPPER_CIPHER_CTRACPKMOMAC) - return -1; - cmsmacobj = OBJ_txt2obj(OID_GOST_CMS_MAC, 1); - if (cmsmacobj == NULL) { - GOSTerr(GOST_F_GOST_GRASSHOPPER_CIPHER_CTL, ERR_R_MALLOC_FAILURE); - return -1; - } - if (arg == 0) /*Decrypting*/ { - STACK_OF(X509_ATTRIBUTE) *x = ptr; - ASN1_OCTET_STRING *osExpectedMac = X509at_get0_data_by_OBJ(x, - cmsmacobj, -3, V_ASN1_OCTET_STRING); - ASN1_OBJECT_free(cmsmacobj); - - if (ptr == NULL || osExpectedMac ==NULL || osExpectedMac->length != KUZNYECHIK_MAC_MAX_SIZE) - return -1; - - memcpy(c->tag, osExpectedMac->data, osExpectedMac->length); - return 1; - } else { - STACK_OF(X509_ATTRIBUTE) *x = ptr; - return (X509at_add1_attr_by_OBJ(&x, cmsmacobj, - V_ASN1_OCTET_STRING, c->tag, KUZNYECHIK_MAC_MAX_SIZE) == NULL) ? -1 : 1; - } - } - return 1; + { + STACK_OF(X509_ATTRIBUTE) *x = ptr; + gost_grasshopper_cipher_ctx_ctr *c = EVP_CIPHER_CTX_get_cipher_data(ctx); + + if (c->c.type != GRASSHOPPER_CIPHER_CTRACPKMOMAC) + return -1; + + return gost2015_process_unprotected_attributes(x, arg, KUZNYECHIK_MAC_MAX_SIZE, c->tag); + } + return 1; case EVP_CTRL_COPY: { EVP_CIPHER_CTX *out = ptr;