首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从OpenSSL-1.0.1r中删除OPENSSL_cleanse

从OpenSSL-1.0.1r中删除OPENSSL_cleanse
EN

Stack Overflow用户
提问于 2016-02-28 16:11:32
回答 2查看 959关注 0票数 0

我发现OPENSSL_cleanse在我的项目上浪费了很多时间。例如,如果它运行了25秒,OPENSSL_cleanse就浪费了3秒。我检查了这个函数的代码,发现它对我没有任何帮助。出于安全考虑,我知道它是用垃圾数据填充内存,但我并不真正关心它。因此,我决定将return;放在此函数的任何操作开始之前。

代码语言:javascript
复制
void OPENSSL_cleanse(void *ptr, size_t len)
{
    return;
    // original OpenSSL code goes here
}

我在使用Mac和Xcode。我已经编译了这个库,并通过/Users/ForceBru/Desktop/openssl脚本的--openssldir选项在Configure中安装了它。我在Build Settings->Link Binary With Libraries中将它添加到我的项目中,并在Build Settings->Search Paths->Header Search PathsBuild Settings->Search Paths->Library Search Paths中添加了include。

这个项目编译得很好,但是时间分析器仍然显示对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中删除。还是没有效果。

EN

回答 2

Stack Overflow用户

发布于 2016-02-28 17:43:06

事实证明,OpenSSL有许多由位于crypto目录(*cpuid.pl)中的Perl脚本生成的程序集代码。这些脚本为以下体系结构生成组装代码:alphaarmv4ia64ppcs390xsparcx86x86_64

make运行时,适当的脚本触发生成一个*cpuid.S (其中*是前面提到的体系结构之一)。这些文件被编译到库中,似乎覆盖了在crypto/mem_clr.c中实现的crypto/mem_clr.c

我所要做的就是简单地将OPENSSL_cleanse的主体更改为ret in x86_64cpuid.pl

代码语言:javascript
复制
.globl OPENSSL_cleanse
.type OPENSSL_cleanse,\@abi-omnipotent
.align 16
OPENSSL_cleanse:
    ret
    # loads of OPENSSL assembly
.size OPENSSL_cleanse,.-OPENSSL_cleanse
票数 0
EN

Stack Overflow用户

发布于 2016-02-28 19:04:37

这并不是你想要的答案,但它可能会帮助你.

从OpenSSL-1.0.1r中删除OPENSSL_cleanse . 我检查了这个函数的代码,发现它对我没有任何帮助。

这可能是个坏主意,但我们需要更多地了解你的威胁模型。零化允许您决定性地从内存中删除敏感材料。

它也是认证和认证(C&A)项目。例如,即使在第1级,FIPS 140-2也需要零化。

另外,您不能删除OPENSSL_cleanse本身,因为OPENSSL_clear_reallocOPENSSL_clear_free和朋友们称之为它。还请参阅OPENSSL_cleanse手册页。

例如,如果它运行25秒,则OPENSSL_cleanse浪费了3秒。

好吧,这是另外一个问题。洗净有点复杂,为了在优化过程中生存下来,它确实浪费了一些循环。

如果您检查提交380 f18ed5f140e0a,那么您将看到它在OpenSSL 1.1.0中已经更改为以下内容。也许你可以用它代替?

代码语言:javascript
复制
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);
 }

还请参阅OpenSSL的清洗()上的GitHub。

如何删除对OPENSSL_cleanse的调用?

好吧,这是另外一个问题。你必须找到所有来电者,并对每个人做些什么。看起来大约有185个地方你需要修改东西:

代码语言:javascript
复制
$ cd openssl
$ grep -IR _cleanse * | wc -l
     185

而不是这样:

代码语言:javascript
复制
void OPENSSL_cleanse(void *ptr, size_t len)
{
    return;
    // original OpenSSL code goes here
}

也许您可以删除该函数,然后:

代码语言:javascript
复制
#define OPENSSL_cleanse(x, y)

然后函数调用变成一个宏,在优化过程中就会消失。确保在从函数更改为宏后执行make clean

但我不建议这样做。

这个项目编译得很好,但是时间分析器仍然显示对OPENSSL_cleanse的调用非常昂贵。

我在这里的猜测是:(1)在对make clean库进行更改之后,您没有执行OpenSSL,或者(2)编译并链接到错误版本的OpenSSL库。但我可能在这两方面都错了。

您可以看到您的可执行文件的运行时依赖于otool -L。确保这是你所期待的。还请记住,OpenSSL不使用-install_name

在运行可执行文件之前,可以设置路径以确保加载正在修改的dylib。还请参阅dyld(1)手册页。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35684899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档