xcode - 在 Xcode 下使用 Crypto++ ECDSA 签署消息时应用程序崩溃?
问题描述
我正在使用 Crypto++ 在 Mac OS 上执行 ECDSA 签名。命令行没问题,但在 Xcode 下EXC_BAD_ACCESS
签名消息时出现错误。
cryptest.exe
从命令行输入的测试通过。cryptest.exe
是图书馆的验证程序。
我尝试使用 clang++ 和 libc++ 构建库,并使用 XCode 构建它,都有这个问题。
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -DCRYPTOPP_DISABLE_MIXED_ASM -fPIC -pthread -pipe -c
这是代码。
AutoSeededRandomPool prng;
ECDSA<ECP, SHA256>::PrivateKey k1;
k1.Initialize( prng, ASN1::secp256r1() );
ECDSA<ECP, SHA256>::PublicKey pKey;
k1.MakePublicKey( pKey );
const ECP::Point& q = pKey.GetPublicElement();
const Integer& qx = q.x;
const Integer& qy = q.y;
std::cout << "x: " << std::hex << qx << std::endl;
std::cout << "y: " << std::hex << qy << std::endl;
const Integer& x = k1.GetPrivateExponent();
std::cout << "K1: " << std::hex << x << std::endl;
ByteQueue queue;
k1.Save(queue);
ECDSA<ECP, SHA256>::Signer signer(k1);
std::string message = "Do or do not. There is no try.";
size_t siglen = signer.MaxSignatureLength();
std::string signature(siglen, 0x00);
siglen = signer.SignMessage( prng, (const byte*)&message[0], message.size(), (byte*)&signature[0] );
signature.resize(siglen);
我在下面附加堆栈跟踪:
* thread #1: tid = 0x15fc20, 0x00007fff910a9d26 libsystem_platform.dylib`_platform_bzero$VARIANT$Merom + 22, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x00007fff910a9d26 libsystem_platform.dylib`_platform_bzero$VARIANT$Merom + 22
* frame #1: 0x00000001000ccc23 testCrypto`CryptoPP::DL_SignatureMessageEncodingMethod_DSA::ComputeMessageRepresentative(this=<unavailable>, rng=<unavailable>, recoverableMessage=<unavailable>,
recoverableMessageLength=<unavailable>, hash=0x0000000104e7df30, hashIdentifier=<unavailable>, messageEmpty=false, representative=0x0000000000000000, representativeBitLength=<unavailable>) const + 83 at gfpcrypt.cpp:96
frame #2: 0x0000000100019ae8 testCrypto`CryptoPP::DL_VerifierBase<CryptoPP::EC2NPoint>::VerifyAndRestart(this=0x00007fff5fbfdab8, messageAccumulator=0x0000000104e7de40) const + 568 at pubkey.h:1693
frame #3: 0x0000000100034c1e testCrypto`CryptoPP::PK_Verifier::VerifyMessage(this=0x00007fff5fbfdab8, message=<unavailable>, messageLen=<unavailable>, signature=<unavailable>, signatureLen=<unavailable>) const + 94 at cryptlib.cpp:942
frame #4: 0x000000010000464a testCrypto`ValidateECDSA() + 2762 at main.cpp:257
frame #5: 0x0000000100004a35 testCrypto`main(argc=1, argv=0x00007fff5fbff9e0) + 53 at main.cpp:272
frame #6: 0x00007fff8fec95c9 libdyld.dylib`start + 1
解决方案
我使用Xcode构建项目创建一个库,然后可以调用该库而不会出错。
推荐阅读
- ios - 在 SFSafariViewController 上跟踪触摸事件
- php - 如何循环遍历 laravel 分页器中的每个页面
- flutter - 带流的多提供者
- coq - 如何在 Coq 中打印证明对象或 Gallina 术语的全部内容?
- twig - Laravel:如果表中的两列为真,则返回一个按钮,如果不是,则不返回任何内容
- javascript - 我可以有一个事件每月重复一次到一个未确定的结束机智反应大日历吗?
- python - 使用 sqlalchemy one() 函数可以从数据库引擎返回多行吗?
- reactjs - 如何在 React Img Mapper 中预加载突出显示的区域?
- django - Django将PK从帖子传递到下一页
- openapi - 如何使用 openapi3 yml 检查电子邮件或密码是否存在