使用ECDSA签名时BAD_ACCESS(代码= EXC_I386_GPFLT)

时间:2015-06-20 06:04:38

标签: c++ ios crypto++ ecdsa

我正在尝试在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的代码片段,它指向BAD_ACCESS

 _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;}

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

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

This is the debugger output

1 个答案:

答案 0 :(得分:0)

  

它崩溃了以下。它出现在Xcode输出窗口中:

BAD_ACCESS(code=EXC_I386_GPFLT)  

代码看起来不错。

  

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

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

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

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

或者,您可以自己构建胖库。为此,请参阅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)));