从 OpenSSL-1.0.1r 中删除OPENSSL_cleanse
Removing OPENSSL_cleanse from OpenSSL-1.0.1r
我发现OPENSSL_cleanse
在我的项目中浪费了很多时间。例如,如果它运行 25 秒,则 3 秒将浪费 OPENSSL_cleanse
.我检查了这个函数的代码,并决定它对我没有做任何非常有用的事情。我知道出于安全原因,它会用垃圾数据填充内存,但我并不真正关心它。所以我决定在此函数中的任何操作开始之前放置return;
。
void OPENSSL_cleanse(void *ptr, size_t len)
{
return;
// original OpenSSL code goes here
}
我正在使用Mac OS和Xcode。我已经编译了库并通过Configure
脚本的--openssldir
选项将其安装在/Users/ForceBru/Desktop/openssl
中。我已将其添加到我的项目中 Build Settings->Link Binary With Libraries
并在 Build Settings->Search Paths->Header Search Paths
和 Build Settings->Search Paths->Library Search Paths
中添加了包含目录。
该项目编译良好,但时间探查器仍然显示对OPENSSL_cleanse
的非常昂贵的调用。
编辑:C
标签是因为OpenSSL是用C编写的,C++
标签是因为我的代码是C++的。也许这些信息会有所帮助。
问题是,我做错了什么?如何删除对OPENSSL_cleanse
的调用?我认为这与链接有关,因为命令行包含-lcrypto
,这意味着这个库实际上可以从任何地方获取(对/Users/ForceBru/Desktop/openssl
吗?
#2:我已经编辑了链接器选项以使用/Users/ForceBru/Desktop/openssl
中的.a
文件并将其从Build Settings->Link Binary With Libraries
中删除。还是没有效果。
事实证明,OpenSSL有很多由一些Perl脚本生成的汇编代码,这些脚本位于crypto
目录(*cpuid.pl
)。这些脚本为以下体系结构生成汇编代码:alpha
、armv4
、ia64
、ppc
、s390x
、sparc
、x86
和x86_64
。
当make
运行时,相应的脚本会触发生成*cpuid.S
(其中*
是前面提到的体系结构之一)。这些文件被编译到库中,似乎覆盖了crypto/mem_clr.c
中实现的OPENSSL_cleanse
。
我所要做的就是简单地将OPENSSL_cleanse
的主体更改为x86_64cpuid.pl
中的ret
:
.globl OPENSSL_cleanse
.type OPENSSL_cleanse,@abi-omnipotent
.align 16
OPENSSL_cleanse:
ret
# loads of OPENSSL assembly
.size OPENSSL_cleanse,.-OPENSSL_cleanse
这不是你要找的答案,但它可能会帮助你......
从 OpenSSL-1.0.1r 中删除OPENSSL_cleanse...
我检查了这个函数的代码,并决定它对我没有做任何非常有用的事情......
这可能是一个坏主意,但我们需要更多地了解您的威胁模型。归零允许您确定性地从内存中删除敏感材料。
它也是一个认证和认可(C&A)项目。例如,FIPS 140-2 即使在级别 1 也需要归零。
此外,您不能删除OPENSSL_cleanse
本身,因为OPENSSL_clear_realloc
,OPENSSL_clear_free
和朋友都称它为。 另请参见OPENSSL_cleanse
手册页。
例如,如果它运行 25 秒,则浪费 3 秒OPENSSL_cleanse
好的,所以这是一个不同的问题。OPENSSL_cleanse有点复杂,它确实浪费了一些周期来努力在优化过程中幸存下来。
如果您选中提交 380f18ed5f140e0a,那么您会看到它在 OpenSSL 1.1.0 中已更改为以下内容。也许你可以用它来代替?
diff --git a/crypto/mem_clr.c b/crypto/mem_clr.c
index e6450a1..3389919 100644 (file)
--- a/crypto/mem_clr.c
+++ b/crypto/mem_clr.c
@@ -59,23 +59,16 @@
#include <string.h>
#include <openssl/crypto.h>
-extern unsigned char cleanse_ctr;
-unsigned char cleanse_ctr = 0;
+/*
+ * Pointer to memset is volatile so that compiler must de-reference
+ * the pointer and can't assume that it points to any function in
+ * particular (such as memset, which it then might further "optimize")
+ */
+typedef void *(*memset_t)(void *,int,size_t);
+
+static volatile memset_t memset_func = memset;
void OPENSSL_cleanse(void *ptr, size_t len)
{
- unsigned char *p = ptr;
- size_t loop = len, ctr = cleanse_ctr;
-
- if (ptr == NULL)
- return;
-
- while (loop--) {
- *(p++) = (unsigned char)ctr;
- ctr += (17 + ((size_t)p & 0xF));
- }
- p = memchr(ptr, (unsigned char)ctr, len);
- if (p)
- ctr += (63 + (size_t)p);
- cleanse_ctr = (unsigned char)ctr;
+ memset_func(ptr, 0, len);
}
另请参阅问题 455:在 OpenSSL 的 GitHub 上重新实现非 asm OPENSSL_cleanse()。
如何删除对OPENSSL_cleanse的调用?
好的,所以这是一个不同的问题。您必须找到所有呼叫者并为每个呼叫者执行某些操作。看起来大约有 185 个地方需要修改内容:
$ cd openssl
$ grep -IR _cleanse * | wc -l
185
取而代之的是:
void OPENSSL_cleanse(void *ptr, size_t len)
{
return;
// original OpenSSL code goes here
}
也许您可以删除该函数,然后:
#define OPENSSL_cleanse(x, y)
然后,函数调用变成一个宏,在优化过程中消失。请务必在从函数更改为宏后执行make clean
。
但我不建议这样做。
该项目编译良好,但时间探查器仍然显示对OPENSSL_cleanse的相当昂贵的调用。
我的猜测是(1)您在更改OpenSSL库后没有执行make clean
,或者(2)您编译并链接到错误版本的OpenSSL库。但我可能在这两方面都错了。
您可以查看可执行文件的运行时依赖项与 otool -L
。确保它是预期的。还要记住,OpenSSL不使用-install_name
。
在运行可执行文件之前,您可以设置DYLD_LIBRARY_PATH以确保加载您正在修改的 dylib。另请参见 dyld(1) 手册页。
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 如何在openssl-ecc中获取十六进制格式的私钥
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- OpenSSL TLS服务器-使用客户端证书白名单
- 通过 Openssl 命令行加密,通过 c++ 解密
- 使用已使用 java 编码的 openssl 解码数据
- OpenSSL没有共享密码
- OpenSSL 解密功能无法正常工作
- OpenSSL BIO and SSL_read
- 如何在OpenSSL库的名称中添加后缀'd'?
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- 使用 OpenSSL 从内存中读取原始 SSL/TLS 证书
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- OpenSSL: EC_POINT_set_compressed_coordinates_GFp segfault
- 在 C/C++ 中加载 OpenSSL 自定义引擎
- 我的应用程序无法在安卓上使用OpenSSL进行链接
- OpenSSL fips in C++ wrapper Library 如何?错误:指纹不匹配
- 比较两个公钥与OpenSSL API