Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

migrate to AntelopeIO's bls12-381 repo; minor additional bls12-381 usage tweaks #1472

Merged
merged 4 commits into from
Aug 11, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
url = https://github.com/AntelopeIO/CLI11.git
[submodule "libraries/libfc/libraries/bls12-381"]
path = libraries/libfc/libraries/bls12-381
url = https://github.com/mschoenebeck/bls12-381.git
url = https://github.com/AntelopeIO/bls12-381
[submodule "libraries/boost"]
path = libraries/boost
url = https://github.com/boostorg/boost.git
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ configure_file(libraries/libfc/include/fc/crypto/webauthn_json/license.txt licen
configure_file(libraries/eos-vm/LICENSE licenses/leap/LICENSE.eos-vm COPYONLY)
configure_file(libraries/prometheus/prometheus-cpp/LICENSE licenses/leap/LICENSE.prom COPYONLY)
configure_file(programs/cleos/LICENSE.CLI11 licenses/leap/LICENSE.CLI11 COPYONLY)
configure_file(libraries/libfc/libraries/bls12-381/LICENSE licenses/leap/LICENSE.bls12-381 COPYONLY)

install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/licenses/leap" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/licenses/" COMPONENT base)

Expand Down
2 changes: 1 addition & 1 deletion CMakeModules/EosioTesterBuild.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ find_library(libchain eosio_chain @CMAKE_BINARY_DIR@/libraries/chain NO_DEFAULT_
find_library(libfc fc @CMAKE_BINARY_DIR@/libraries/libfc NO_DEFAULT_PATH)
find_library(libsecp256k1 secp256k1 @CMAKE_BINARY_DIR@/libraries/libfc/secp256k1 NO_DEFAULT_PATH)
find_library(libbn256 bn256 @CMAKE_BINARY_DIR@/libraries/libfc/libraries/bn256/src NO_DEFAULT_PATH)
find_library(libbls12-381 bls12-381 @CMAKE_BINARY_DIR@/libraries/libfc/libraries/bls12-381/src NO_DEFAULT_PATH)
find_library(libbls12-381 bls12-381 @CMAKE_BINARY_DIR@/libraries/libfc/libraries/bls12-381 NO_DEFAULT_PATH)

find_library(libwasm WASM @CMAKE_BINARY_DIR@/libraries/wasm-jit/Source/WASM NO_DEFAULT_PATH)
find_library(libwast WAST @CMAKE_BINARY_DIR@/libraries/wasm-jit/Source/WAST NO_DEFAULT_PATH)
Expand Down
3 changes: 1 addition & 2 deletions libraries/chain/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
#include <fc/log/logger_config.hpp>
#include <fc/scoped_exit.hpp>
#include <fc/variant_object.hpp>
#include <bls12-381.hpp>
#include <bls12-381/bls12-381.hpp>

#include <new>
#include <shared_mutex>
Expand Down Expand Up @@ -340,7 +340,6 @@ struct controller_impl {
set_activation_handler<builtin_protocol_feature_t::get_block_num>();
set_activation_handler<builtin_protocol_feature_t::crypto_primitives>();
set_activation_handler<builtin_protocol_feature_t::bls_primitives>();
bls12_381::init();

self.irreversible_block.connect([this](const block_state_ptr& bsp) {
wasm_if_collect.current_lib(bsp->block_num);
Expand Down
56 changes: 28 additions & 28 deletions libraries/chain/webassembly/crypto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include <fc/crypto/sha3.hpp>
#include <fc/crypto/k1_recover.hpp>
#include <bn256/bn256.h>
#include <bls12-381.hpp>
#include <bls12-381/bls12-381.hpp>

namespace {
uint32_t ceil_log2(uint32_t n)
Expand Down Expand Up @@ -255,51 +255,51 @@ namespace eosio { namespace chain { namespace webassembly {
{
if(op1.size() != 144 || op2.size() != 144 || result.size() != 144)
return return_code::failure;
std::optional<bls12_381::g1> a = bls12_381::g1::fromJacobianBytesLE({reinterpret_cast<const uint8_t*>(op1.data()), 144}, false, true);
std::optional<bls12_381::g1> b = bls12_381::g1::fromJacobianBytesLE({reinterpret_cast<const uint8_t*>(op2.data()), 144}, false, true);
std::optional<bls12_381::g1> a = bls12_381::g1::fromJacobianBytesLE(std::span<uint8_t, 144>((uint8_t*)op1.data(), 144), false, true);
std::optional<bls12_381::g1> b = bls12_381::g1::fromJacobianBytesLE(std::span<uint8_t, 144>((uint8_t*)op2.data(), 144), false, true);
if(!a.has_value() || !b.has_value())
return return_code::failure;
bls12_381::g1 c = a.value().add(b.value());
c.toJacobianBytesLE({reinterpret_cast<uint8_t*>(result.data()), 144}, true);
c.toJacobianBytesLE(std::span<uint8_t, 144>((uint8_t*)result.data(), 144), true);
return return_code::success;
}

int32_t interface::bls_g2_add(span<const char> op1, span<const char> op2, span<char> result) const
{
if(op1.size() != 288 || op2.size() != 288 || result.size() != 288)
return return_code::failure;
std::optional<bls12_381::g2> a = bls12_381::g2::fromJacobianBytesLE({reinterpret_cast<const uint8_t*>(op1.data()), 288}, false, true);
std::optional<bls12_381::g2> b = bls12_381::g2::fromJacobianBytesLE({reinterpret_cast<const uint8_t*>(op2.data()), 288}, false, true);
std::optional<bls12_381::g2> a = bls12_381::g2::fromJacobianBytesLE(std::span<uint8_t, 288>((uint8_t*)op1.data(), 288), false, true);
std::optional<bls12_381::g2> b = bls12_381::g2::fromJacobianBytesLE(std::span<uint8_t, 288>((uint8_t*)op2.data(), 288), false, true);
if(!a.has_value() || !b.has_value())
return return_code::failure;
bls12_381::g2 c = a.value().add(b.value());
c.toJacobianBytesLE({reinterpret_cast<uint8_t*>(result.data()), 288}, true);
c.toJacobianBytesLE(std::span<uint8_t, 288>((uint8_t*)result.data(), 288), true);
return return_code::success;
}

int32_t interface::bls_g1_mul(span<const char> point, span<const char> scalar, span<char> result) const
{
if(point.size() != 144 || scalar.size() != 32 || result.size() != 144)
return return_code::failure;
std::optional<bls12_381::g1> a = bls12_381::g1::fromJacobianBytesLE({reinterpret_cast<const uint8_t*>(point.data()), 144}, false, true);
std::optional<bls12_381::g1> a = bls12_381::g1::fromJacobianBytesLE(std::span<uint8_t, 144>((uint8_t*)point.data(), 144), false, true);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe not lose the const and pass std::span<const uint8_t, 144>. Same in other locations.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep good call

if(!a.has_value())
return return_code::failure;
std::array<uint64_t, 4> b = bls12_381::scalar::fromBytesLE<4>({reinterpret_cast<const uint8_t*>(scalar.data()), 32});
std::array<uint64_t, 4> b = bls12_381::scalar::fromBytesLE<4>(std::span<uint8_t, 32>((uint8_t*)scalar.data(), 32));
bls12_381::g1 c = a.value().mulScalar(b);
c.toJacobianBytesLE({reinterpret_cast<uint8_t*>(result.data()), 144}, true);
c.toJacobianBytesLE(std::span<uint8_t, 144>((uint8_t*)result.data(), 144), true);
return return_code::success;
}

int32_t interface::bls_g2_mul(span<const char> point, span<const char> scalar, span<char> result) const
{
if(point.size() != 288 || scalar.size() != 32 || result.size() != 288)
return return_code::failure;
std::optional<bls12_381::g2> a = bls12_381::g2::fromJacobianBytesLE({reinterpret_cast<const uint8_t*>(point.data()), 288}, false, true);
std::optional<bls12_381::g2> a = bls12_381::g2::fromJacobianBytesLE(std::span<uint8_t, 288>((uint8_t*)point.data(), 288), false, true);
if(!a.has_value())
return return_code::failure;
std::array<uint64_t, 4> b = bls12_381::scalar::fromBytesLE<4>({reinterpret_cast<const uint8_t*>(scalar.data()), 32});
std::array<uint64_t, 4> b = bls12_381::scalar::fromBytesLE<4>(std::span<uint8_t, 32>((uint8_t*)scalar.data(), 32));
bls12_381::g2 c = a.value().mulScalar(b);
c.toJacobianBytesLE({reinterpret_cast<uint8_t*>(result.data()), 288}, true);
c.toJacobianBytesLE(std::span<uint8_t, 288>((uint8_t*)result.data(), 288), true);
return return_code::success;
}

Expand All @@ -313,17 +313,17 @@ namespace eosio { namespace chain { namespace webassembly {
sv.reserve(n);
for(uint32_t i = 0; i < n; i++)
{
std::optional<bls12_381::g1> p = bls12_381::g1::fromJacobianBytesLE({reinterpret_cast<const uint8_t*>(points.data() + i*144), 144}, false, true);
std::optional<bls12_381::g1> p = bls12_381::g1::fromJacobianBytesLE(std::span<uint8_t, 144>((uint8_t*)points.data() + i*144, 144), false, true);
if(!p.has_value())
return return_code::failure;
std::array<uint64_t, 4> s = bls12_381::scalar::fromBytesLE<4>({reinterpret_cast<const uint8_t*>(scalars.data() + i*32), 32});
std::array<uint64_t, 4> s = bls12_381::scalar::fromBytesLE<4>(std::span<uint8_t, 32>((uint8_t*)scalars.data() + i*32, 32));
pv.push_back(p.value());
sv.push_back(s);
if(i%10 == 0)
context.trx_context.checktime();
}
bls12_381::g1 r = bls12_381::g1::multiExp(pv, sv, [this](){ context.trx_context.checktime(); }).value(); // accessing value is safe
r.toJacobianBytesLE({reinterpret_cast<uint8_t*>(result.data()), 144}, true);
r.toJacobianBytesLE(std::span<uint8_t, 144>((uint8_t*)result.data(), 144), true);
return return_code::success;
}

Expand All @@ -337,17 +337,17 @@ namespace eosio { namespace chain { namespace webassembly {
sv.reserve(n);
for(uint32_t i = 0; i < n; i++)
{
std::optional<bls12_381::g2> p = bls12_381::g2::fromJacobianBytesLE({reinterpret_cast<const uint8_t*>(points.data() + i*288), 288}, false, true);
std::optional<bls12_381::g2> p = bls12_381::g2::fromJacobianBytesLE(std::span<uint8_t, 288>((uint8_t*)points.data() + i*288, 288), false, true);
if(!p.has_value())
return return_code::failure;
std::array<uint64_t, 4> s = bls12_381::scalar::fromBytesLE<4>({reinterpret_cast<const uint8_t*>(scalars.data() + i*32), 32});
std::array<uint64_t, 4> s = bls12_381::scalar::fromBytesLE<4>(std::span<uint8_t, 32>((uint8_t*)scalars.data() + i*32, 32));
pv.push_back(p.value());
sv.push_back(s);
if(i%6 == 0)
context.trx_context.checktime();
}
bls12_381::g2 r = bls12_381::g2::multiExp(pv, sv, [this](){ context.trx_context.checktime(); }).value(); // accessing value is safe
r.toJacobianBytesLE({reinterpret_cast<uint8_t*>(result.data()), 288}, true);
r.toJacobianBytesLE(std::span<uint8_t, 288>((uint8_t*)result.data(), 288), true);
return return_code::success;
}

Expand All @@ -359,50 +359,50 @@ namespace eosio { namespace chain { namespace webassembly {
v.reserve(n);
for(uint32_t i = 0; i < n; i++)
{
std::optional<bls12_381::g1> p_g1 = bls12_381::g1::fromJacobianBytesLE({reinterpret_cast<const uint8_t*>(g1_points.data() + i*144), 144}, true, true);
std::optional<bls12_381::g2> p_g2 = bls12_381::g2::fromJacobianBytesLE({reinterpret_cast<const uint8_t*>(g2_points.data() + i*288), 288}, true, true);
std::optional<bls12_381::g1> p_g1 = bls12_381::g1::fromJacobianBytesLE(std::span<uint8_t, 144>((uint8_t*)g1_points.data() + i*144, 144), true, true);
std::optional<bls12_381::g2> p_g2 = bls12_381::g2::fromJacobianBytesLE(std::span<uint8_t, 288>((uint8_t*)g2_points.data() + i*288, 288), true, true);
if(!p_g1.has_value() || !p_g2.has_value())
return return_code::failure;
bls12_381::pairing::add_pair(v, p_g1.value(), p_g2.value());
if(i%4 == 0)
context.trx_context.checktime();
}
bls12_381::fp12 r = bls12_381::pairing::calculate(v, [this](){ context.trx_context.checktime(); });
r.toBytesLE({reinterpret_cast<uint8_t*>(result.data()), 576}, true);
r.toBytesLE(std::span<uint8_t, 576>((uint8_t*)result.data(), 576), true);
return return_code::success;
}

int32_t interface::bls_g1_map(span<const char> e, span<char> result) const
{
if(e.size() != 48 || result.size() != 144)
return return_code::failure;
std::optional<bls12_381::fp> a = bls12_381::fp::fromBytesLE({reinterpret_cast<const uint8_t*>(e.data()), 48}, true, true);
std::optional<bls12_381::fp> a = bls12_381::fp::fromBytesLE(std::span<uint8_t, 48>((uint8_t*)e.data(), 48), true, true);
if(!a.has_value())
return return_code::failure;
bls12_381::g1 c = bls12_381::g1::mapToCurve(a.value());
c.toJacobianBytesLE({reinterpret_cast<uint8_t*>(result.data()), 144}, true);
c.toJacobianBytesLE(std::span<uint8_t, 144>((uint8_t*)result.data(), 144), true);
return return_code::success;
}

int32_t interface::bls_g2_map(span<const char> e, span<char> result) const
{
if(e.size() != 96 || result.size() != 288)
return return_code::failure;
std::optional<bls12_381::fp2> a = bls12_381::fp2::fromBytesLE({reinterpret_cast<const uint8_t*>(e.data()), 96}, true, true);
std::optional<bls12_381::fp2> a = bls12_381::fp2::fromBytesLE(std::span<uint8_t, 96>((uint8_t*)e.data(), 96), true, true);
if(!a.has_value())
return return_code::failure;
bls12_381::g2 c = bls12_381::g2::mapToCurve(a.value());
c.toJacobianBytesLE({reinterpret_cast<uint8_t*>(result.data()), 288}, true);
c.toJacobianBytesLE(std::span<uint8_t, 288>((uint8_t*)result.data(), 288), true);
return return_code::success;
}

int32_t interface::bls_fp_mod(span<const char> s, span<char> result) const
{
if(s.size() != 64 || result.size() != 48)
return return_code::failure;
std::array<uint64_t, 8> k = bls12_381::scalar::fromBytesLE<8>({reinterpret_cast<const uint8_t*>(s.data()), 64});
std::array<uint64_t, 8> k = bls12_381::scalar::fromBytesLE<8>(std::span<uint8_t, 64>((uint8_t*)s.data(), 64));
bls12_381::fp e = bls12_381::fp::modPrime<8>(k);
e.toBytesLE({reinterpret_cast<uint8_t*>(result.data()), 48}, true);
e.toBytesLE(std::span<uint8_t, 48>((uint8_t*)result.data(), 48), true);
return return_code::success;
}

Expand Down
3 changes: 3 additions & 0 deletions libraries/libfc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,6 @@ install(TARGETS fc
LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} COMPONENT dev EXCLUDE_FROM_ALL
ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} COMPONENT dev EXCLUDE_FROM_ALL)
install(DIRECTORY include/fc DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR} COMPONENT dev EXCLUDE_FROM_ALL)

install(TARGETS bls12-381 ARCHIVE DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}" COMPONENT dev EXCLUDE_FROM_ALL
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_FULL_INCLUDEDIR}/bls12-381" COMPONENT dev EXCLUDE_FROM_ALL)
14 changes: 7 additions & 7 deletions libraries/libfc/test/crypto/test_bls.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <boost/test/unit_test.hpp>

#include <bls12-381.hpp>
#include <bls12-381/bls12-381.hpp>
#include <fc/exception/exception.hpp>

using namespace std;
Expand Down Expand Up @@ -33,13 +33,13 @@ BOOST_AUTO_TEST_CASE(bls_serialization_test) try {
g1 pk = public_key(sk);
g2 signature = sign(sk, message_1);

string pk_string = bytesToHex<144>(pk.toJacobianBytesBE());
string signature_string = bytesToHex<288>(signature.toJacobianBytesBE());
cout << pk_string << std::endl;
cout << signature_string << std::endl;
const array<uint8_t, 144> pk_string = pk.toJacobianBytesBE();
const array<uint8_t, 288> signature_string = signature.toJacobianBytesBE();
cout << bytesToHex<144>(pk_string) << std::endl;
cout << bytesToHex<288>(signature_string) << std::endl;

g1 pk2 = g1::fromJacobianBytesBE(hexToBytes(pk_string)).value();
g2 signature2 = g2::fromJacobianBytesBE(hexToBytes(signature_string)).value();
g1 pk2 = g1::fromJacobianBytesBE(pk_string).value();
g2 signature2 = g2::fromJacobianBytesBE(signature_string).value();
bool ok = verify(pk2, message_1, signature2);
BOOST_CHECK_EQUAL(ok, true);
} FC_LOG_AND_RETHROW();
Expand Down