Я рискну угадать, но salt
не завершено NULL. Программа, вероятно, обращается за пределами 16-го элемента массива salt
:
std::cout << "Salt: " << Common::podToHex(salt) << std::endl;
Следующее выполняется несколько раз без проблем. Это ваша программа без обращений в Общую библиотеку.
Вызов std::memcpy
занимает только самые левые 16 байтов строки. Это не делает преобразование. (Я только хотел убрать звонок на Common).
$ cat test.cxx
#include "cryptlib.h"
#include "filters.h"
#include "sha.h"
#include "hex.h"
#include "files.h"
#include "pwdbased.h"
#include <string>
#include <iostream>
#include <cstring>
int main()
{
using namespace CryptoPP;
PKCS5_PBKDF2_HMAC<SHA256> pbkdf2;
byte salt[16], key[32];
/* Hard coded for testing purposes */
// Common::podFromHex("00f8807a289655b2a8e38cda00182a32", salt);
std::memcpy(salt, "00f8807a289655b2a8e38cda00182a32", 16);
/* Hard coded for testing purposes */
std::string password = "a";
// std::cout << "Salt: " << Common::podToHex(salt) << std::endl;
std::cout << "Salt: ";
StringSource(salt, sizeof(salt), true, new HexEncoder(new FileSink(std::cout)));
std::cout << std::endl;
std::cout << "Salt size: " << sizeof(salt) << std::endl;
std::cout << "Password: " << password.data() << std::endl;
std::cout << "Password size: " << password.size() << std::endl;
/* Rare segfault on this line */
pbkdf2.DeriveKey(
key, sizeof(key), 0, (byte *)password.data(),
password.size(), salt, sizeof(salt), 10000 /*Constants::PBKDF2_ITERATIONS*/
);
std::cout << "Key: ";
StringSource(key, sizeof(key), true, new HexEncoder(new FileSink(std::cout)));
std::cout << std::endl;
return 0;
}
Скомпилировано и выполнено с:
$ g++ -DNDEBUG -g2 -O3 test.cxx -o test.exe ./libcryptopp.a
$ ./test.exe
Salt: 30306638383037613238393635356232
Salt size: 16
Password: a
Password size: 1
Key: F88BA6947B802C66F7E7A2BC0099AFD92C81DC293E3CC48C2DA3FA75E27ECE6B