Openssl 调用EVP_DecryptUpdate后是否可以设置AES-GCM标记?

Openssl 调用EVP_DecryptUpdate后是否可以设置AES-GCM标记?,openssl,aes-gcm,Openssl,Aes Gcm,在我看到的所有涉及使用AES-GCM()的OpenSSL EVP接口的代码片段中,代码大致如下所示: EVP_DecryptInit(...); EVP_CIPHER_CTX_ctrl(..., EVP_CTRL_GCM_SET_TAG, ...); while (...) { EVP_DecryptUpdate(...); } success = EVP_DecryptFinal(...); 调用EVP\u DecryptUpdate后,使用EVP\u CTRL\u GCM\u set

在我看到的所有涉及使用AES-GCM()的OpenSSL EVP接口的代码片段中,代码大致如下所示:

EVP_DecryptInit(...);
EVP_CIPHER_CTX_ctrl(..., EVP_CTRL_GCM_SET_TAG, ...);
while (...) {
  EVP_DecryptUpdate(...);
}

success = EVP_DecryptFinal(...);
调用
EVP\u DecryptUpdate
后,使用
EVP\u CTRL\u GCM\u set\u tag
设置标签是否合法?例如,如果传入的密文正在流式传输,并且标记位于流的末尾,这将非常方便

相关问题:
EVP\u CTRL\u GCM\u SET\u TAG
是否有正式的文档记录

在调用EVP_DecryptUpdate后,使用EVP_CTRL_GCM_set_标记设置标记是否合法?例如,如果传入的密文正在流式传输,并且标记位于流的末尾,这将非常方便

目前很难说,但我猜不会。从OpenSSL的wiki页面:

在调用最终EVP_DecryptUpdate时执行标记验证,并通过返回值反映出来:没有调用
EVP_DecryptFinal

GCM是一种在线模式,这意味着您可以对其进行流式传输。但是,EVP接口是通用的,它们支持其他经过身份验证的加密模式,如CCM。CCM模式要求预先确定标记的大小,因为它用于格式化标头。CCM是一种离线模式,因为纯文本标签的大小需要事先知道。我正在做一个飞跃,CCM限制所有其他类似模式

此外,OpenSSL是一个SSL/TLS库,而不是一个通用加密库。TLS协商密码套件和标签长度,作为握手协议的一部分。TLS没有您描述的用例,因此不需要OpenSSL来支持它

与此相关,“OpenSSL是一个SSL/TLS库”是库中有时缺少一些好东西的原因。这是一个治理问题


相关问题:EVP\u CTRL\u GCM\u SET\u标签是否在某处正式记录

这个问题的答案是否定的:

$ cd openssl-src
$ grep -IR EVP_CTRL_GCM_SET_TAG *
include/openssl/evp.h:# define     EVP_CTRL_GCM_SET_TAG      EVP_CTRL_AEAD_SET_TAG
$
如果记录了EVP\U CTRL\U GCM\U SET\U标记,则您将看到文件扩展名为
*.pod
。pod文件是手册页的来源


但是上面有一些wiki文档。Matt Caswell写的,他是OpenSSL开发者之一。尽管手册页是官方文档,但wiki在这种情况下也同样出色。

我不知道答案,但我想分享我对这方面的调查

openssl wiki页面上的示例显示了以下顺序:

EVP_DecryptUpdate(...);
EVP_CIPHER_CTX_ctrl(..., EVP_CTRL_GCM_SET_TAG, ...);
EVP_DecryptFinal(...);
因此,您可能认为这是合法的,但在我的测试中只有一半有效:当我设置了ALTERTED tag时,调用EVP_DecryptFinal_ex表示错误(返回非1),但随后调用ERR_print_errors_cb不会显示任何错误。奇怪