26 const std::unique_ptr<prng_state, void(*)(prng_state*)> prng{
new prng_state, [](prng_state* p) { yarrow_done(p);
delete p; }};
27 yarrow_start(prng.get());
29 std::array<unsigned char, SHA256_ENTROPY_SIZE> entropy{};
30 std::random_device rd;
31 std::uniform_int_distribution<> dist{0, std::numeric_limits<unsigned char>::max()};
32 for (
auto& i : entropy) {
33 i =
static_cast<unsigned char>(dist(rd));
35 yarrow_add_entropy(entropy.data(), entropy.size(), prng.get());
37 yarrow_ready(prng.get());
39 const std::unique_ptr<rsa_key, void(*)(rsa_key*)> key{
new rsa_key, [](rsa_key* k) { rsa_free(k);
delete k; }};
40 if (rsa_make_key(prng.get(),
YARROW_INDEX, size, 65537, key.get()) != CRYPT_OK) {
44 std::vector<unsigned char> privateKeyData(size * 16);
45 unsigned long privateKeyLen = privateKeyData.size();
46 if (rsa_export(privateKeyData.data(), &privateKeyLen, PK_PRIVATE, key.get()) != CRYPT_OK) {
49 privateKeyData.resize(privateKeyLen);
51 std::vector<unsigned char> publicKeyData(size * 16);
52 unsigned long publicKeyLen = publicKeyData.size();
53 if (rsa_export(publicKeyData.data(), &publicKeyLen, PK_PUBLIC, key.get()) != CRYPT_OK) {
56 publicKeyData.resize(publicKeyLen);
59 string::encodeHex({
reinterpret_cast<const std::byte*
>(privateKeyData.data()), privateKeyData.size()}),
60 string::encodeHex({
reinterpret_cast<const std::byte*
>(publicKeyData.data()), publicKeyData.size()}),
69 const std::unique_ptr<rsa_key, void(*)(rsa_key*)> key{
new rsa_key, [](rsa_key* k) { rsa_free(k);
delete k; }};
70 if (rsa_import(
reinterpret_cast<const unsigned char*
>(publicKey.data()), publicKey.size(), key.get()) != CRYPT_OK) {
75 ltc_rsa_op_parameters params{ .params = { .hash_idx =
SHA256_INDEX }, .padding = LTC_PKCS_1_V1_5 };
77 return rsa_verify_hash_v2(
reinterpret_cast<const unsigned char*
>(signature.data()), signature.size(),
reinterpret_cast<const unsigned char*
>(sha256.data()), sha256.size(), ¶ms, &stat, key.get()) == CRYPT_OK && stat;
85 const std::unique_ptr<rsa_key, void(*)(rsa_key*)> key{
new rsa_key, [](rsa_key* k) { rsa_free(k);
delete k; }};
86 if (rsa_import(
reinterpret_cast<const unsigned char*
>(privateKey.data()), privateKey.size(), key.get()) != CRYPT_OK) {
91 unsigned long signatureLen = rsa_get_size(key.get());
92 std::vector<std::byte> signature(signatureLen);
93 ltc_rsa_op_parameters params{ .params = { .hash_idx =
SHA256_INDEX }, .padding = LTC_PKCS_1_V1_5 };
94 return rsa_sign_hash_v2(
reinterpret_cast<const unsigned char*
>(sha256.data()), sha256.size(),
reinterpret_cast<unsigned char*
>(signature.data()), &signatureLen, ¶ms, key.get()) == CRYPT_OK ? signature : std::vector<std::byte>{};