我正在将我的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以消除错误?
答案 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);