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

0

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

Я изо всех сил пытаюсь запустить этот образец кода из вики 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)  

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

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

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

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

Изображение 174551

  • 0
    Можете ли вы ввести проверку, если __ptr_ не равен NULL перед вызовом delete я чувствую ~ освобождает память, выделенную для этого __ptr_
  • 0
    где проверить это условие, я написал только этот код, остальная часть кода присутствует в библиотеке crptopp?
Показать ещё 8 комментариев
Теги:
crypto++
ecdsa

1 ответ

0

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

BAD_ACCESS(code=EXC_I386_GPFLT)  

Код выглядит хорошо для меня.


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

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

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

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

Или вы можете сами построить жировую библиотеку. Для этого см. IOS (Командная строка) в вики Crypto++. Предварительно построенная библиотека в 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++, чтобы прекратить их использовать. Вместо этого используйте этот код:

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
    Я использовал библиотеку, на которую вы указали, и теперь она снова дает ошибку неверного доступа и регистрирует, как упоминалось в моем отредактированном вопросе
  • 0
    @SandeepAggarwal - вы внесли изменения, чтобы создать уникальный ECDSA<ECP, CryptoPP::SHA256>::Signer , а не временный? Код все еще показывает временный.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню