在调用 EVP_DecryptUpdate 之后使用 EVP_CTRL_GCM_SET_TAG 设置标签是否合法?例如,如果传入的密文正在流式传输,并且标签位于流的末尾,这将很方便。
目前很难说,但我猜不是。从 OpenSSL 的 wiki 页面EVP Authenticated Encryption and Decryption:
标签验证在您调用最终 EVP_DecryptUpdate 时执行,并由返回值反映:没有调用EVP_DecryptFinal
.
GCM 是一种在线模式,这意味着您可以流式传输它。但是,EVP 接口是通用的,它们支持其他经过身份验证的加密模式,例如 CCM。CCM 模式需要预先确定标签的大小,因为它用于格式化标头。CCM 是一种离线模式,因为需要事先知道纯文本的标记大小。我正在实现 CCM 限制所有其他类似模式的飞跃。
此外,OpenSSL 是一个 SSL/TLS 库,而不是通用加密库。作为握手协议的一部分,TLS 协商密码套件和标签长度。TLS 没有您描述的用例,因此 OpenSSL 没有支持它的操作要求。
相关的,“OpenSSL 是一个 SSL/TLS 库”是库中有时缺少一些好东西的原因。这是一个治理问题。
相关问题: EVP_CTRL_GCM_SET_TAG 是否正式记录在某处?
这个问题的答案是否定的:
$ 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_CTRL_GCM_SET_TAG
记录在案,那么您会看到文件扩展名为*.pod
. pod 文件是手册页的来源。
但是上面有一些 wiki 文档。Matt Caswell 编写了它,他是 OpenSSL 开发人员之一。尽管手册页是官方文档,但在这种情况下 wiki 也同样出色。