如何更新类型为EVP_CIPHER_CTX的ctx的IV(open ssl 1.1.0)

时间:2018-10-03 09:40:06

标签: openssl

我正在将我的Openssl软件包升级到1.1.0系列。 但是,由于Openssl使许多结构变得不透明,所以我无法更新特定ctx的iv。

EVP_CIPHER_CTX *ctx; // This was EVP_CIPHER_CTX ctx; for version 1.0.x series

EVP_DecryptInit(ctx, cipher, keydata, iv);

对于特定情况,我需要更新iv。 在早期版本的openssl 1.0.x系列中,我这样做的是

memcpy(nextIv, &ctx.iv, DES3_BLOCK_SIZE);

但是将其更改为

memcpy(nextIv, ctx->iv, DES3_BLOCK_SIZE);

我收到编译器错误

  

错误:将指向不完整类型'EVP_CIPHER_CTX'的指针解引用{aka'struct evp_cipher_ctx_st'}   memcpy(nextIv,ctx-> iv,DES3_BLOCK_SIZE);

我认为这是因为结构已变得不透明。

如何用memcpy语句替换更新ctx的iv以消除错误?

2 个答案:

答案 0 :(得分:0)

好吧,我遍历了Openssl代码并发现了

EVP_DecryptInit_ex()

在内部为ctx执行iv的memcpy()。因此,执行以下操作对我有用。

EVP_DecryptInit_ex(ctx,密码,NULL,密钥,newIv);

答案 1 :(得分:0)

在OpenSSL 1.1.0之后,您可以像这样访问ctx-> iv。

const unsigned char *EVP_CIPHER_CTX_iv(const EVP_CIPHER_CTX *ctx);
unsigned char *EVP_CIPHER_CTX_iv_noconst(EVP_CIPHER_CTX *ctx);