使用 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<ECP, CryptoPP::SHA256>::Signer
,而不是临时的?代码仍然显示临时代码。以上是关于使用 ECDSA 签名时的 BAD_ACCESS (code=EXC_I386_GPFLT)的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Crypto++ ECDSA 中的签名体中获取签名长度
ECDSA 使用 BouncyCastle 签名并使用 Crypto++ 进行验证