BAD_ACCESS (код = EXC_I386_GPFLT) при подписании с ECDSA

Я пытаюсь использовать Crypto ++ на iOS. Я скачал готовую версию библиотеки с GareHub Марека Котевича.

Я изо всех сил пытаюсь бежать этот пример кода из Crypto ++ вики.

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)

Это фрагмент кода из memory.h файла C ++, куда он указывает BAD_ACCESS

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

Я получаю сообщение об ошибке BAD_ACCESS (код = 1, адрес = 0x0)
указывая на эту строку кода библиотеки

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

Это вывод отладчика

0

Решение

Его сбой со следующим. Это отображается в окне вывода Xcode:

BAD_ACCESS(code=EXC_I386_GPFLT)

Код выглядит нормально для меня.


Я пытаюсь использовать Crypto ++ на iOS. Я скачал предварительно собранную версию библиотеки из GitHub Марека Котевича.

Я просто беру удар в темноте. Предполагается, что код, который вы показали выше, действительно скажем, все, что вы делаете в тесте ViewController,

Предварительно скомпилированная библиотека, похоже, использует стандартную библиотеку GNU C ++. Я бы переключился на стандартную библиотеку C ++ от LLVM, создав Crypto ++ с -stdlib=c++ (а не GNU -stdlib=stdc++). Apple перешла на него много лет назад, и Xcode использует его по умолчанию.

Вы можете найти GitHub с толстой библиотекой, используя LLVM Standard C ++ по адресу noloader / cryptopp-5.6.2-ИСН.

Или вы можете создать библиотеку сала самостоятельно. Для этого смотрите iOS (командная строка) на Crypto ++ вики. Готовая библиотека в cryptopp-5.6.2-ИСН использует эти инструкции.


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)));
0

Другие решения


По вопросам рекламы [email protected]