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));
+ 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;
}
static int gost_cipher_init_cpa(EVP_CIPHER_CTX *ctx, const unsigned char *key,
const unsigned char *iv, int enc)
{
- 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), &Gost28147_CryptoProParamSetA);
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));
+ 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;
}
{
const unsigned char *in_ptr = in;
unsigned char *out_ptr = out;
+ unsigned char *buf = EVP_CIPHER_CTX_buf_noconst(ctx);
size_t i = 0;
size_t j = 0;
/* 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(EVP_CIPHER_CTX_iv_noconst(ctx), buf + 8, 8);
+ EVP_CIPHER_CTX_set_num(ctx, 0);
} else {
- ctx->num = j;
+ EVP_CIPHER_CTX_set_num(ctx, j);
return 1;
}
}
/*
* block cipher current iv
*/
- gost_crypt_mesh(ctx->cipher_data, ctx->iv, ctx->buf);
+ gost_crypt_mesh(EVP_CIPHER_CTX_cipher_data(ctx),
+ EVP_CIPHER_CTX_iv_noconst(ctx), 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(EVP_CIPHER_CTX_iv_noconst(ctx), 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(EVP_CIPHER_CTX_iv_noconst(ctx), 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),
+ EVP_CIPHER_CTX_iv_noconst(ctx), 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;
}
{
const unsigned char *in_ptr = in;
unsigned char *out_ptr = out;
+ unsigned char *buf = EVP_CIPHER_CTX_buf_noconst(ctx);
size_t i = 0;
size_t j;
/* 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;
}
}
* block cipher current iv
*/
/* Encrypt */
- gost_cnt_next(ctx->cipher_data, ctx->iv, ctx->buf);
+ gost_cnt_next(EVP_CIPHER_CTX_cipher_data(ctx),
+ EVP_CIPHER_CTX_iv_noconst(ctx), buf);
/*
* xor next block of input text with it and output it
*/
* 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),
+ EVP_CIPHER_CTX_iv_noconst(ctx), 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;
}
/* 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;
}
switch (type) {
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_RANDOM_GENERATOR_ERROR);
return -1;
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;
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);
if (ASN1_TYPE_get(params) != V_ASN1_SEQUENCE) {
return ret;
}
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;
GOST_CIPHER_PARAMS_free(gcp);
return -1;
}
- memcpy(ctx->oiv, gcp->iv->data, len);
+ memcpy((unsigned char *)EVP_CIPHER_CTX_original_iv(ctx), gcp->iv->data,
+ EVP_CIPHER_CTX_iv_length(ctx));
GOST_CIPHER_PARAMS_free(gcp);