使用 ECDSA 签名时的 BAD_ACCESS (code=EXC_I386_GPFLT)

Posted

技术标签:

【中文标题】使用 ECDSA 签名时的 BAD_ACCESS (code=EXC_I386_GPFLT)【英文标题】:BAD_ACCESS (code=EXC_I386_GPFLT) when signing with ECDSA 【发布时间】:2015-06-20 06:04:37 【问题描述】:

我正在尝试在 ios 上使用 Crypto++。我从 Marek Kotewicz's GitHub 下载了该库的预构建版本。

我正在努力从 Crypto++ wiki 运行 this sample code。

ECDSA<ECP, CryptoPP::SHA256>::PrivateKey privateKey;
ECDSA<ECP, CryptoPP::SHA256>::PublicKey publicKey;

AutoSeededRandomPool prng, rrng;

privateKey.Initialize(prng, CryptoPP::ASN1::secp256k1());    
privateKey.MakePublicKey(publicKey);

string signature;       
string message = "Do or do not. There is no try.";

StringSource s(message, true,
             new SignerFilter(rrng,
                              ECDSA<ECP, CryptoPP::SHA256>::Signer(privateKey),
                              new StringSink(signature)));

它与以下内容崩溃。它出现在 Xcode 输出窗口中:

BAD_ACCESS (code=EXC_I386_GPFLT)  

这是 c++ 文件的 memory.h 中的代码 sn-p,它指向 BAD_ACCESS

 _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() delete __ptr_;

我收到 BAD_ACCESS(code=1 , address=0x0) 错误 指向库的这行代码

 ->  0x1065dfa8d <+85>:  movq   -0x58(%rbp), %rdi

【问题讨论】:

您能否在调用delete 之前检查__ptr_ 是否不是NULL 我觉得~ 正在释放分配给此__ptr_ 的内存 在哪里检查这个条件,我只写了这么多代码,其余的代码都存在于 crptopp 库中? 我认为问题可能与您正在传递的未初始化的signature 字符串有关。签名是输入参数还是输出参数 签名是一个输出参数 Sandeep,提供更多细节如何让人们确切地知道如何重现您的问题?你从哪里下载的库?示例代码来自哪里?你是如何编译和运行它的?这个“日志”是什么,日志中是否还有其他消息?这些细节应该在原始问题中,但现在编辑它还为时不晚。 【参考方案1】:

它与以下内容崩溃。它出现在 Xcode 输出窗口中:

BAD_ACCESS(code=EXC_I386_GPFLT)  

我觉得代码没问题。


我正在尝试在 iOS 上使用 Crypto++。我从 Marek Kotewicz 的 GitHub 下载了该库的预构建版本。

我只是在黑暗中冒险。它假定您在上面显示的代码是真的您正在做的所有事情,比如说,测试ViewController

预编译库似乎正在使用 GNU 的标准 C++ 库。我会通过使用-stdlib=c++(而不是GNU 的-stdlib=stdc++)构建Crypto++ 来切换到LLVM 的标准C++ 库。 Apple 几年前就改用它了,Xcode 默认使用它。

您可以在noloader/cryptopp-5.6.2-ios 找到使用 LLVM 标准 C++ 的 fat 库的 GitHub。

或者,您可以自己构建 fat 库。为此,请参阅 Crypto++ wiki 上的 iOS (Command Line)。 cryptopp-5.6.2-ios 的预构建库使用这些指令。


AutoSeededRandomPool prng, rrng;

您只需要其中之一。


StringSource s(message, true,
               new SignerFilter(rrng,
                   ECDSA<ECP, CryptoPP::SHA256>::Signer(privateKey),
                       new StringSink(signature)));

多年来,我开始怀疑为管道创建的临时签名者。我已更改 Crypto++ wiki 以停止使用它们。请改用此代码:

ECDSA<ECP, CryptoPP::SHA256>::PrivateKey privateKey;
...
ECDSA<ECP, CryptoPP::SHA256>::Signer signer(privateKey);
...

StringSource s(message, true,
               new SignerFilter(prng, signer,
                   new StringSink(signature)));

【讨论】:

我使用了您指向的库,现在它再次出现错误的访问错误,并记录了我编辑的问题中提到的日志 @SandeepAggarwal - 您是否进行了更改以构建唯一的ECDSA&lt;ECP, CryptoPP::SHA256&gt;::Signer,而不是临时的?代码仍然显示临时代码。

以上是关于使用 ECDSA 签名时的 BAD_ACCESS (code=EXC_I386_GPFLT)的主要内容,如果未能解决你的问题,请参考以下文章

创建由其他 ECDSA 证书签名的 ECDSA 证书

ECDSA证书可以有RSA签名吗?

如何从 Crypto++ ECDSA 中的签名体中获取签名长度

ECDSA 使用 BouncyCastle 签名并使用 Crypto++ 进行验证

如何使用证书中的公钥检查 ECDSA(在 p-256 上)签名

ECDSA数字签名算法