static int gost2814789_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc) { EVP_GOST2814789_CTX *c = ctx->cipher_data; return Gost2814789_set_key(&c->ks, key, ctx->key_len * 8); }
static int gost2814789_md_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2) { GOST2814789IMIT_CTX *gctx = ctx->md_data; switch (cmd) { case EVP_MD_CTRL_SET_KEY: return Gost2814789_set_key(&gctx->cipher, p2, p1); case EVP_MD_CTRL_GOST_SET_SBOX: return Gost2814789_set_sbox(&gctx->cipher, p1); } return -2; }
/* * Calculate H(i+1) = Hash(Hi,Mi) * Where H and M are 32 bytes long */ static int hash_step(GOSTR341194_CTX *c, unsigned char *H, const unsigned char *M) { unsigned char U[32], W[32], V[32], S[32], Key[32]; int i; /* Compute first key */ xor_blocks(W, H, M, 32); swap_bytes(W, Key); /* Encrypt first 8 bytes of H with first key */ Gost2814789_set_key(&c->cipher, Key, 256); Gost2814789_encrypt(H, S, &c->cipher); /* Compute second key */ circle_xor8(H, U); circle_xor8(M, V); circle_xor8(V, V); xor_blocks(W, U, V, 32); swap_bytes(W, Key); /* encrypt second 8 bytes of H with second key */ Gost2814789_set_key(&c->cipher, Key, 256); Gost2814789_encrypt(H+8, S+8, &c->cipher); /* compute third key */ circle_xor8(U, U); U[31] = ~U[31]; U[29] = ~U[29]; U[28] = ~U[28]; U[24] = ~U[24]; U[23] = ~U[23]; U[20] = ~U[20]; U[18] = ~U[18]; U[17] = ~U[17]; U[14] = ~U[14]; U[12] = ~U[12]; U[10] = ~U[10]; U[8] = ~U[8]; U[7] = ~U[7]; U[5] = ~U[5]; U[3] = ~U[3]; U[1] = ~U[1]; circle_xor8(V, V); circle_xor8(V, V); xor_blocks(W, U, V, 32); swap_bytes(W, Key); /* encrypt third 8 bytes of H with third key */ Gost2814789_set_key(&c->cipher, Key, 256); Gost2814789_encrypt(H+16, S+16, &c->cipher); /* Compute fourth key */ circle_xor8(U, U); circle_xor8(V, V); circle_xor8(V, V); xor_blocks(W, U, V, 32); swap_bytes(W, Key); /* Encrypt last 8 bytes with fourth key */ Gost2814789_set_key(&c->cipher, Key, 256); Gost2814789_encrypt(H+24, S+24, &c->cipher); for (i = 0; i < 12; i++) transform_3(S); xor_blocks(S, S, M, 32); transform_3(S); xor_blocks(S, S, H, 32); for (i = 0; i < 61; i++) transform_3(S); memcpy(H, S, 32); return 1; }