git / moonbite-core / src/libmw/test/tests/crypto/Test_AggSig.cpp · raw

// Copyright (c) 2021 The Litecoin Core developers// Distributed under the MIT software license, see the accompanying// file COPYING or http://www.opensource.org/licenses/mit-license.php.#include <mw/crypto/MuSig.h>#include <mw/crypto/PublicKeys.h>#include <mw/crypto/Schnorr.h>#include <test_framework/TestMWEB.h>BOOST_FIXTURE_TEST_SUITE(TestAggSig, MWEBTestingSetup)BOOST_AUTO_TEST_CASE(AggSigInteraction){    mw::Hash message = SecretKey::Random().GetBigInt();    // Generate sender keypairs    SecretKey secretKeySender = SecretKey::Random();    PublicKey publicKeySender = PublicKey::From(secretKeySender);    SecretKey secretNonceSender = MuSig::GenerateSecureNonce();    PublicKey publicNonceSender = PublicKey::From(secretNonceSender);    // Generate receiver keypairs    SecretKey secretKeyReceiver = SecretKey::Random();    PublicKey publicKeyReceiver = PublicKey::From(secretKeyReceiver);    SecretKey secretNonceReceiver = MuSig::GenerateSecureNonce();    PublicKey publicNonceReceiver = PublicKey::From(secretNonceReceiver);    // Add pubKeys and pubNonces    PublicKey sumPubKeys = PublicKeys::Add(        std::vector<PublicKey>({ publicKeySender, publicKeyReceiver })    );    PublicKey sumPubNonces = PublicKeys::Add(        std::vector<PublicKey>({ publicNonceSender, publicNonceReceiver })    );    // Generate partial signatures    CompactSignature senderPartialSignature = MuSig::CalculatePartial(        secretKeySender,        secretNonceSender,        sumPubKeys,        sumPubNonces,        message    );    CompactSignature receiverPartialSignature = MuSig::CalculatePartial(        secretKeyReceiver,        secretNonceReceiver,        sumPubKeys,        sumPubNonces,        message    );    // Validate partial signatures    const bool senderSigValid = MuSig::VerifyPartial(        senderPartialSignature,        publicKeySender,        sumPubKeys,        sumPubNonces,        message    );    BOOST_REQUIRE(senderSigValid == true);    const bool receiverSigValid = MuSig::VerifyPartial(        receiverPartialSignature,        publicKeyReceiver,        sumPubKeys,        sumPubNonces,        message    );    BOOST_REQUIRE(receiverSigValid == true);    // Aggregate signature and validate    Signature aggregateSignature = MuSig::Aggregate(        std::vector<CompactSignature>({ senderPartialSignature, receiverPartialSignature }),        sumPubNonces    );    const bool aggSigValid = Schnorr::Verify(        aggregateSignature,        sumPubKeys,        message    );    BOOST_REQUIRE(aggSigValid == true);}BOOST_AUTO_TEST_CASE(SingleSchnorrSig){    mw::Hash message = SecretKey::Random().GetBigInt();    SecretKey secret_key = SecretKey::Random();    PublicKey public_key = PublicKey::From(secret_key);    Signature signature = Schnorr::Sign(secret_key.data(), message);    const bool valid = Schnorr::Verify(signature, public_key, message);    BOOST_REQUIRE(valid == true);}BOOST_AUTO_TEST_SUITE_END()