lokinet/test/crypto/test_llarp_crypto.cpp

95 lines
2.3 KiB
C++
Raw Normal View History

2023-01-09 18:47:41 +01:00
#include <llarp/crypto/crypto_libsodium.hpp>
2019-01-13 15:00:50 +01:00
#include <iostream>
2021-03-01 22:07:32 +01:00
#include <catch2/catch.hpp>
2019-01-13 15:00:50 +01:00
2021-03-01 22:07:32 +01:00
using namespace llarp;
2021-03-01 22:07:32 +01:00
TEST_CASE("Identity key")
{
llarp::sodium::CryptoLibSodium crypto;
SecretKey secret;
crypto.identity_keygen(secret);
2021-03-01 22:07:32 +01:00
SECTION("Keygen")
2019-10-23 14:43:37 +02:00
{
2021-03-01 22:07:32 +01:00
REQUIRE_FALSE(secret.IsZero());
2019-10-23 14:43:37 +02:00
}
2021-03-01 22:07:32 +01:00
SECTION("Sign-verify")
{
2021-03-01 22:07:32 +01:00
AlignedBuffer<128> random;
random.Randomize();
Signature sig;
2019-10-30 17:45:51 +01:00
const PubKey pk = secret.toPublic();
2019-02-03 00:12:42 +01:00
const llarp_buffer_t buf(random.data(), random.size());
2021-03-01 22:07:32 +01:00
REQUIRE(crypto.sign(sig, secret, buf));
REQUIRE(crypto.verify(pk, buf, sig));
2019-03-28 20:15:20 +01:00
random.Randomize();
// mangle body
2021-03-01 22:07:32 +01:00
REQUIRE_FALSE(crypto.verify(pk, buf, sig));
}
2021-03-01 22:07:32 +01:00
}
2021-03-01 22:07:32 +01:00
TEST_CASE("PQ crypto")
{
llarp::sodium::CryptoLibSodium crypto;
PQKeyPair keys;
crypto.pqe_keygen(keys);
PQCipherBlock block;
SharedSecret shared, otherShared;
auto c = &crypto;
REQUIRE(keys.size() == PQ_KEYPAIRSIZE);
REQUIRE(c->pqe_encrypt(block, shared, PQPubKey(pq_keypair_to_public(keys))));
REQUIRE(c->pqe_decrypt(block, otherShared, pq_keypair_to_secret(keys)));
REQUIRE(otherShared == shared);
}
2022-04-01 20:31:20 +02:00
#ifdef HAVE_CRYPT
2022-04-01 19:18:18 +02:00
TEST_CASE("passwd hash valid")
{
llarp::sodium::CryptoLibSodium crypto;
// poggers password hashes
std::set<std::string> valid_hashes;
// UNIX DES
valid_hashes.emplace("CVu85Ms694POo");
// sha256 salted
valid_hashes.emplace(
"$5$cIghotiBGjfPC7Fu$"
"TXXxPhpUcEiF9tMnjhEVJFi9AlNDSkNRQFTrXPQTKS9");
// sha512 salted
valid_hashes.emplace(
"$6$qB77ms3wCIo.xVKP$Hl0RLuDgWNmIW4s."
"5KUbFmnauoTfrWSPJzDCD8ZTSSfwRbMgqgG6F9y3K.YEYVij8g/"
"Js0DRT2RhgXoX0sHGb.");
for (const auto& hash : valid_hashes)
{
// make sure it is poggers ...
REQUIRE(crypto.check_passwd_hash(hash, "poggers"));
// ... and not inscrutible
REQUIRE(not crypto.check_passwd_hash(hash, "inscrutible"));
}
}
TEST_CASE("passwd hash malformed")
{
llarp::sodium::CryptoLibSodium crypto;
std::set<std::string> invalid_hashes = {
"stevejobs",
"$JKEDbzgzym1N6", // crypt() for "stevejobs" with a $ at the begining
"$0$zero$AAAAAAAAAAA",
"$$$AAAAAAAAAAAA",
"$LIGMA$BALLS$LMAOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO."};
for (const auto& hash : invalid_hashes)
REQUIRE(not crypto.check_passwd_hash(hash, "stevejobs"));
}
2022-04-01 19:18:18 +02:00
#endif