bls|depends: Upgrade to bls-signatures version 1.0.0 (#4027)

* build: Add cmake as depends package (cmake.mk)

The bls-signatures library requires cmake 3.14

* depends: Update chia_bls to version 1.0.0 of dashpay/bls-signatures

* depends: Rename package chia_bls to bls-dash

* depends: Disable blspy/tests/benchmarks build for chia_bls

Note: Building with tests would require the following:

depends: Fix macOS build for versions < 10.12

Seems like older versions of macOS pretend to support c++17 std libs but do not have/have issues with uncaught_exceptions. "Catch", the testing framework used in the bls lib wants those by default but setting `DCATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS` disables them which should be just fine to do in all cases here.
---
 depends/packages/chia_bls.mk | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/depends/packages/chia_bls.mk b/depends/packages/chia_bls.mk
index e79a85844f..25749b74ab 100644
--- a/depends/packages/chia_bls.mk
+++ b/depends/packages/chia_bls.mk
@@ -28,6 +28,8 @@ define $(package)_set_vars
     $(package)_config_opts_darwin+= -DCMAKE_AR="$(host_prefix)/native/bin/$($(package)_ar)"
     $(package)_config_opts_darwin+= -DCMAKE_RANLIB="$(host_prefix)/native/bin/$($(package)_ranlib)"
   endif
+
+  $(package)_cppflags+= -DCATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS
 endef

 define $(package)_config_cmds
--

* depends: Drop obsolete variable

* bls: Integrate the upgraded version into the codebase

* depends: Pre-fetch relic to fix gitian

Can fetch apt packages only when building with lxc

Co-authored-by: UdjinM6 <UdjinM6@users.noreply.github.com>
This commit is contained in:
dustinface 2021-03-26 13:32:31 +01:00 committed by GitHub
parent f492291aca
commit 9c64708269
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 183 additions and 126 deletions

View File

@ -23,7 +23,6 @@ packages:
- "autoconf" - "autoconf"
- "libtool" - "libtool"
- "automake" - "automake"
- "cmake"
- "faketime" - "faketime"
- "bsdmainutils" - "bsdmainutils"
- "ca-certificates" - "ca-certificates"

View File

@ -18,7 +18,6 @@ packages:
- "automake" - "automake"
- "faketime" - "faketime"
- "bsdmainutils" - "bsdmainutils"
- "cmake"
- "imagemagick" - "imagemagick"
- "libcap-dev" - "libcap-dev"
- "libz-dev" - "libz-dev"

View File

@ -13,7 +13,6 @@ packages:
- "autoconf" - "autoconf"
- "libtool" - "libtool"
- "automake" - "automake"
- "cmake"
- "faketime" - "faketime"
- "bsdmainutils" - "bsdmainutils"
- "mingw-w64" - "mingw-w64"

View File

@ -35,7 +35,7 @@ Install the required dependencies: Ubuntu & Debian
For macOS cross compilation: For macOS cross compilation:
sudo apt-get install curl librsvg2-bin libtiff-tools bsdmainutils cmake imagemagick libcap-dev libz-dev libbz2-dev python-setuptools sudo apt-get install curl librsvg2-bin libtiff-tools bsdmainutils imagemagick libcap-dev libz-dev libbz2-dev python-setuptools
For Win32/Win64 cross compilation: For Win32/Win64 cross compilation:

View File

@ -0,0 +1,73 @@
package=bls-dash
$(package)_version=1.0.0
$(package)_download_path=https://github.com/dashpay/bls-signatures/archive
$(package)_download_file=$($(package)_version).tar.gz
$(package)_file_name=$(package)-$($(package)_download_file)
$(package)_build_subdir=build
$(package)_sha256_hash=ecbc51457dd3de153af27333038f149ba585e16fe46351b763938cb6ef0f2d9a
$(package)_dependencies=gmp cmake
$(package)_relic_version=186a15da6d07ef436dd8f00a4345838310a0aad3
$(package)_relic_download_path=https://github.com/relic-toolkit/relic/archive
$(package)_relic_download_file=$($(package)_relic_version).tar.gz
$(package)_relic_file_name=relic-toolkit-$($(package)_relic_download_file)
$(package)_relic_build_subdir=relic
$(package)_relic_sha256_hash=70fb36acfd206f2128f6da38bda9f9ef070062d50adb97b053d98477bf0112fc
$(package)_extra_sources=$($(package)_relic_file_name)
define $(package)_fetch_cmds
$(call fetch_file,$(package),$($(package)_download_path),$($(package)_download_file),$($(package)_file_name),$($(package)_sha256_hash)) && \
$(call fetch_file,$(package),$($(package)_relic_download_path),$($(package)_relic_download_file),$($(package)_relic_file_name),$($(package)_relic_sha256_hash))
endef
define $(package)_extract_cmds
mkdir -p $($(package)_extract_dir) && \
echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \
echo "$($(package)_relic_sha256_hash) $($(package)_source_dir)/$($(package)_relic_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \
$(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \
tar --strip-components=1 -xf $($(package)_source) -C . && \
cp $($(package)_source_dir)/$($(package)_relic_file_name) .
endef
define $(package)_set_vars
$(package)_config_opts=-DCMAKE_INSTALL_PREFIX=$($(package)_staging_dir)/$(host_prefix)
$(package)_config_opts+= -DCMAKE_PREFIX_PATH=$($(package)_staging_dir)/$(host_prefix)
$(package)_config_opts+= -DSTLIB=ON -DSHLIB=OFF -DSTBIN=ON
$(package)_config_opts+= -DBUILD_BLS_PYTHON_BINDINGS=0 -DBUILD_BLS_TESTS=0 -DBUILD_BLS_BENCHMARKS=0
$(package)_config_opts_linux=-DOPSYS=LINUX -DCMAKE_SYSTEM_NAME=Linux
$(package)_config_opts_darwin=-DOPSYS=MACOSX -DCMAKE_SYSTEM_NAME=Darwin
$(package)_config_opts_mingw32=-DOPSYS=WINDOWS -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SHARED_LIBRARY_LINK_C_FLAGS=""
$(package)_config_opts_i686+= -DWSIZE=32
$(package)_config_opts_x86_64+= -DWSIZE=64
$(package)_config_opts_arm+= -DWSIZE=32
$(package)_config_opts_armv7l+= -DWSIZE=32
$(package)_config_opts_debug=-DDEBUG=ON -DCMAKE_BUILD_TYPE=Debug
ifneq ($(darwin_native_toolchain),)
$(package)_config_opts_darwin+= -DCMAKE_AR="$(host_prefix)/native/bin/$($(package)_ar)"
$(package)_config_opts_darwin+= -DCMAKE_RANLIB="$(host_prefix)/native/bin/$($(package)_ranlib)"
endif
endef
define $(package)_preprocess_cmds
sed -i.old "s|GIT_REPOSITORY https://github.com/relic-toolkit/relic.git|URL \"../../relic-toolkit-$($(package)_relic_version).tar.gz\"|" src/CMakeLists.txt && \
sed -i.old "s|GIT_TAG .*RELIC_GIT_TAG.*|URL_HASH SHA256=$($(package)_relic_sha256_hash)|" src/CMakeLists.txt
endef
define $(package)_config_cmds
export CC="$($(package)_cc)" && \
export CXX="$($(package)_cxx)" && \
export CFLAGS="$($(package)_cflags) $($(package)_cppflags)" && \
export CXXFLAGS="$($(package)_cxxflags) $($(package)_cppflags)" && \
export LDFLAGS="$($(package)_ldflags)" && \
$(host_prefix)/bin/cmake ../ $($(package)_config_opts)
endef
define $(package)_build_cmds
$(MAKE) $($(package)_build_opts)
endef
define $(package)_stage_cmds
$(MAKE) install
endef

View File

@ -1,51 +0,0 @@
package=chia_bls
$(package)_version=v20181101
# It's actually from https://github.com/Chia-Network/bls-signatures, but we have so many patches atm that it's forked
$(package)_download_path=https://github.com/dashpay/bls-signatures/archive
$(package)_file_name=$($(package)_version).tar.gz
$(package)_sha256_hash=b3ec74a77a7b6795f84b05e051a0824ef8d9e05b04b2993f01040f35689aa87c
$(package)_dependencies=gmp
#$(package)_patches=...TODO (when we switch back to https://github.com/Chia-Network/bls-signatures)
#define $(package)_preprocess_cmds
# for i in $($(package)_patches); do patch -N -p1 < $($(package)_patch_dir)/$$$$i; done
#endef
define $(package)_set_vars
$(package)_config_opts=-DCMAKE_INSTALL_PREFIX=$($(package)_staging_dir)/$(host_prefix)
$(package)_config_opts+= -DCMAKE_PREFIX_PATH=$($(package)_staging_dir)/$(host_prefix)
$(package)_config_opts+= -DSTLIB=ON -DSHLIB=OFF -DSTBIN=ON
$(package)_config_opts_linux=-DOPSYS=LINUX -DCMAKE_SYSTEM_NAME=Linux
$(package)_config_opts_darwin=-DOPSYS=MACOSX -DCMAKE_SYSTEM_NAME=Darwin
$(package)_config_opts_mingw32=-DOPSYS=WINDOWS -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SHARED_LIBRARY_LINK_C_FLAGS="" -DCMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS=""
$(package)_config_opts_i686+= -DWSIZE=32
$(package)_config_opts_x86_64+= -DWSIZE=64
$(package)_config_opts_arm+= -DWSIZE=32
$(package)_config_opts_armv7l+= -DWSIZE=32
$(package)_config_opts_debug=-DDEBUG=ON -DCMAKE_BUILD_TYPE=Debug
ifneq ($(darwin_native_toolchain),)
$(package)_config_opts_darwin+= -DCMAKE_AR="$(host_prefix)/native/bin/$($(package)_ar)"
$(package)_config_opts_darwin+= -DCMAKE_RANLIB="$(host_prefix)/native/bin/$($(package)_ranlib)"
endif
endef
define $(package)_config_cmds
export CC="$($(package)_cc)" && \
export CXX="$($(package)_cxx)" && \
export CFLAGS="$($(package)_cflags) $($(package)_cppflags)" && \
export CXXFLAGS="$($(package)_cxxflags) $($(package)_cppflags)" && \
export LDFLAGS="$($(package)_ldflags)" && \
mkdir -p build && cd build && \
cmake ../ $($(package)_config_opts)
endef
define $(package)_build_cmds
cd build && \
$(MAKE) $($(package)_build_opts)
endef
define $(package)_stage_cmds
cd build && \
$(MAKE) install
endef

17
depends/packages/cmake.mk Normal file
View File

@ -0,0 +1,17 @@
package=cmake
$(package)_version=3.14.7
$(package)_download_path=https://cmake.org/files/v3.14/
$(package)_file_name=$(package)-$($(package)_version).tar.gz
$(package)_sha256_hash=9221993e0af3e6d10124d840ff24f5b2f3b884416fca04d3312cb0388dec1385
define $(package)_config_cmds
./bootstrap --prefix=$(host_prefix)
endef
define $(package)_build_cmds
$(MAKE)
endef
define $(package)_stage_cmds
$(MAKE) DESTDIR=$($(package)_staging_dir) install
endef

View File

@ -4,13 +4,14 @@ $(package)_download_path=http://distro.ibiblio.org/fatdog/source/600/c
$(package)_file_name=cdrkit-$($(package)_version).tar.bz2 $(package)_file_name=cdrkit-$($(package)_version).tar.bz2
$(package)_sha256_hash=b50d64c214a65b1a79afe3a964c691931a4233e2ba605d793eb85d0ac3652564 $(package)_sha256_hash=b50d64c214a65b1a79afe3a964c691931a4233e2ba605d793eb85d0ac3652564
$(package)_patches=cdrkit-deterministic.patch $(package)_patches=cdrkit-deterministic.patch
$(package)_dependencies=cmake
define $(package)_preprocess_cmds define $(package)_preprocess_cmds
patch -p1 < $($(package)_patch_dir)/cdrkit-deterministic.patch patch -p1 < $($(package)_patch_dir)/cdrkit-deterministic.patch
endef endef
define $(package)_config_cmds define $(package)_config_cmds
cmake -DCMAKE_INSTALL_PREFIX=$(build_prefix) $(host_prefix)/bin/cmake -DCMAKE_INSTALL_PREFIX=$(build_prefix)
endef endef
define $(package)_build_cmds define $(package)_build_cmds

View File

@ -4,13 +4,14 @@ $(package)_download_path=https://github.com/theuni/libdmg-hfsplus/archive
$(package)_file_name=libdmg-hfsplus-v$($(package)_version).tar.gz $(package)_file_name=libdmg-hfsplus-v$($(package)_version).tar.gz
$(package)_sha256_hash=6569a02eb31c2827080d7d59001869ea14484c281efab0ae7f2b86af5c3120b3 $(package)_sha256_hash=6569a02eb31c2827080d7d59001869ea14484c281efab0ae7f2b86af5c3120b3
$(package)_build_subdir=build $(package)_build_subdir=build
$(package)_dependencies=cmake
define $(package)_preprocess_cmds define $(package)_preprocess_cmds
mkdir build mkdir build
endef endef
define $(package)_config_cmds define $(package)_config_cmds
cmake -DCMAKE_INSTALL_PREFIX:PATH=$(build_prefix)/bin .. $(host_prefix)/bin/cmake -DCMAKE_INSTALL_PREFIX:PATH=$(build_prefix)/bin ..
endef endef
define $(package)_build_cmds define $(package)_build_cmds

View File

@ -1,4 +1,4 @@
packages:=boost openssl libevent zeromq gmp chia_bls backtrace packages:=boost openssl libevent zeromq gmp bls-dash backtrace cmake
qt_native_packages = native_protobuf qt_native_packages = native_protobuf
qt_packages = qrencode protobuf zlib qt_packages = qrencode protobuf zlib

View File

@ -45,7 +45,7 @@ First, install the general dependencies:
sudo apt update sudo apt update
sudo apt upgrade sudo apt upgrade
sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git python3 cmake sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git python3
A host toolchain (`build-essential`) is necessary because some dependency A host toolchain (`build-essential`) is necessary because some dependency
packages need to build host utilities that are used in the build process. packages need to build host utilities that are used in the build process.

View File

@ -12,27 +12,27 @@ Run the following commands to install required packages:
##### Debian/Ubuntu: ##### Debian/Ubuntu:
```bash ```bash
$ sudo apt-get install curl build-essential libtool autotools-dev automake pkg-config python3 bsdmainutils cmake $ sudo apt-get install curl build-essential libtool autotools-dev automake pkg-config python3 bsdmainutils
``` ```
##### Fedora: ##### Fedora:
```bash ```bash
$ sudo dnf install gcc-c++ libtool make autoconf automake python3 cmake libstdc++-static patch $ sudo dnf install gcc-c++ libtool make autoconf automake python3 libstdc++-static patch
``` ```
##### Arch Linux: ##### Arch Linux:
```bash ```bash
$ pacman -S base-devel python3 cmake $ pacman -S base-devel python3
``` ```
##### Alpine Linux: ##### Alpine Linux:
```sh ```sh
$ sudo apk --update --no-cache add autoconf automake cmake curl g++ gcc libexecinfo-dev libexecinfo-static libtool make perl pkgconfig python3 patch linux-headers $ sudo apk --update --no-cache add autoconf automake curl g++ gcc libexecinfo-dev libexecinfo-static libtool make perl pkgconfig python3 patch linux-headers
``` ```
##### FreeBSD/OpenBSD: ##### FreeBSD/OpenBSD:
```bash ```bash
pkg_add gmake cmake libtool pkg_add gmake libtool
pkg_add autoconf # (select highest version, e.g. 2.69) pkg_add autoconf # (select highest version, e.g. 2.69)
pkg_add automake # (select highest version, e.g. 1.15) pkg_add automake # (select highest version, e.g. 1.15)
pkg_add python # (select highest version, e.g. 3.5) pkg_add python # (select highest version, e.g. 3.5)

View File

@ -45,7 +45,7 @@ BITCOIN_INCLUDES=-I$(builddir) $(BDB_CPPFLAGS) $(BOOST_CPPFLAGS) $(LEVELDB_CPPFL
BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include
BITCOIN_INCLUDES += $(UNIVALUE_CFLAGS) BITCOIN_INCLUDES += $(UNIVALUE_CFLAGS)
BLS_LIBS=-lchiabls -lgmp BLS_LIBS=-lbls-dash -lgmp
LIBBITCOIN_SERVER=libdash_server.a LIBBITCOIN_SERVER=libdash_server.a
LIBBITCOIN_COMMON=libdash_common.a LIBBITCOIN_COMMON=libdash_common.a

View File

@ -14,6 +14,14 @@
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
static std::unique_ptr<bls::CoreMPL> pSchemeLegacy(new bls::LegacySchemeMPL);
static std::unique_ptr<bls::CoreMPL> pScheme(new bls::BasicSchemeMPL);
static std::unique_ptr<bls::CoreMPL>& Scheme(const bool fLegacy)
{
return fLegacy ? pSchemeLegacy : pScheme;
}
CBLSId::CBLSId(const uint256& nHash) : CBLSWrapper<CBLSIdImplicit, BLS_CURVE_ID_SIZE, CBLSId>() CBLSId::CBLSId(const uint256& nHash) : CBLSWrapper<CBLSIdImplicit, BLS_CURVE_ID_SIZE, CBLSId>()
{ {
impl = nHash; impl = nHash;
@ -24,7 +32,7 @@ CBLSId::CBLSId(const uint256& nHash) : CBLSWrapper<CBLSIdImplicit, BLS_CURVE_ID_
void CBLSSecretKey::AggregateInsecure(const CBLSSecretKey& o) void CBLSSecretKey::AggregateInsecure(const CBLSSecretKey& o)
{ {
assert(IsValid() && o.IsValid()); assert(IsValid() && o.IsValid());
impl = bls::PrivateKey::AggregateInsecure({impl, o.impl}); impl = bls::PrivateKey::Aggregate({impl, o.impl});
cachedHash.SetNull(); cachedHash.SetNull();
} }
@ -41,7 +49,7 @@ CBLSSecretKey CBLSSecretKey::AggregateInsecure(const std::vector<CBLSSecretKey>&
} }
CBLSSecretKey ret; CBLSSecretKey ret;
ret.impl = bls::PrivateKey::AggregateInsecure(v); ret.impl = bls::PrivateKey::Aggregate(v);
ret.fValid = true; ret.fValid = true;
ret.cachedHash.SetNull(); ret.cachedHash.SetNull();
return ret; return ret;
@ -54,7 +62,7 @@ void CBLSSecretKey::MakeNewKey()
while (true) { while (true) {
GetStrongRandBytes(buf, sizeof(buf)); GetStrongRandBytes(buf, sizeof(buf));
try { try {
impl = bls::PrivateKey::FromBytes((const uint8_t*)buf); impl = bls::PrivateKey::FromBytes(bls::Bytes((const uint8_t*)buf, SerSize));
break; break;
} catch (...) { } catch (...) {
} }
@ -83,7 +91,7 @@ bool CBLSSecretKey::SecretKeyShare(const std::vector<CBLSSecretKey>& msk, const
} }
try { try {
impl = bls::BLS::PrivateKeyShare(mskVec, (const uint8_t*)_id.impl.begin()); impl = bls::Threshold::PrivateKeyShare(mskVec, bls::Bytes(_id.impl.begin(), _id.impl.size()));
} catch (...) { } catch (...) {
return false; return false;
} }
@ -100,7 +108,7 @@ CBLSPublicKey CBLSSecretKey::GetPublicKey() const
} }
CBLSPublicKey pubKey; CBLSPublicKey pubKey;
pubKey.impl = impl.GetPublicKey(); pubKey.impl = impl.GetG1Element();
pubKey.fValid = true; pubKey.fValid = true;
pubKey.cachedHash.SetNull(); pubKey.cachedHash.SetNull();
return pubKey; return pubKey;
@ -113,7 +121,7 @@ CBLSSignature CBLSSecretKey::Sign(const uint256& hash) const
} }
CBLSSignature sigRet; CBLSSignature sigRet;
sigRet.impl = impl.SignInsecurePrehashed((const uint8_t*)hash.begin()); sigRet.impl = Scheme(fLegacy)->Sign(impl, bls::Bytes(hash.begin(), hash.size()));
sigRet.fValid = true; sigRet.fValid = true;
sigRet.cachedHash.SetNull(); sigRet.cachedHash.SetNull();
@ -124,24 +132,24 @@ CBLSSignature CBLSSecretKey::Sign(const uint256& hash) const
void CBLSPublicKey::AggregateInsecure(const CBLSPublicKey& o) void CBLSPublicKey::AggregateInsecure(const CBLSPublicKey& o)
{ {
assert(IsValid() && o.IsValid()); assert(IsValid() && o.IsValid());
impl = bls::PublicKey::AggregateInsecure({impl, o.impl}); impl = Scheme(fLegacy)->Aggregate({impl, o.impl});
cachedHash.SetNull(); cachedHash.SetNull();
} }
CBLSPublicKey CBLSPublicKey::AggregateInsecure(const std::vector<CBLSPublicKey>& pks) CBLSPublicKey CBLSPublicKey::AggregateInsecure(const std::vector<CBLSPublicKey>& pks, const bool fLegacy)
{ {
if (pks.empty()) { if (pks.empty()) {
return CBLSPublicKey(); return CBLSPublicKey();
} }
std::vector<bls::PublicKey> v; std::vector<bls::G1Element> vecPublicKeys;
v.reserve(pks.size()); vecPublicKeys.reserve(pks.size());
for (auto& pk : pks) { for (auto& pk : pks) {
v.emplace_back(pk.impl); vecPublicKeys.emplace_back(pk.impl);
} }
CBLSPublicKey ret; CBLSPublicKey ret;
ret.impl = bls::PublicKey::AggregateInsecure(v); ret.impl = Scheme(fLegacy)->Aggregate(vecPublicKeys);
ret.fValid = true; ret.fValid = true;
ret.cachedHash.SetNull(); ret.cachedHash.SetNull();
return ret; return ret;
@ -156,7 +164,7 @@ bool CBLSPublicKey::PublicKeyShare(const std::vector<CBLSPublicKey>& mpk, const
return false; return false;
} }
std::vector<bls::PublicKey> mpkVec; std::vector<bls::G1Element> mpkVec;
mpkVec.reserve(mpk.size()); mpkVec.reserve(mpk.size());
for (const CBLSPublicKey& pk : mpk) { for (const CBLSPublicKey& pk : mpk) {
if (!pk.IsValid()) { if (!pk.IsValid()) {
@ -166,7 +174,7 @@ bool CBLSPublicKey::PublicKeyShare(const std::vector<CBLSPublicKey>& mpk, const
} }
try { try {
impl = bls::BLS::PublicKeyShare(mpkVec, (const uint8_t*)_id.impl.begin()); impl = bls::Threshold::PublicKeyShare(mpkVec, bls::Bytes(_id.impl.begin(), _id.impl.size()));
} catch (...) { } catch (...) {
return false; return false;
} }
@ -184,7 +192,7 @@ bool CBLSPublicKey::DHKeyExchange(const CBLSSecretKey& sk, const CBLSPublicKey&
if (!sk.IsValid() || !pk.IsValid()) { if (!sk.IsValid() || !pk.IsValid()) {
return false; return false;
} }
impl = bls::BLS::DHKeyExchange(sk.impl, pk.impl); impl = sk.impl * pk.impl;
fValid = true; fValid = true;
cachedHash.SetNull(); cachedHash.SetNull();
return true; return true;
@ -193,24 +201,24 @@ bool CBLSPublicKey::DHKeyExchange(const CBLSSecretKey& sk, const CBLSPublicKey&
void CBLSSignature::AggregateInsecure(const CBLSSignature& o) void CBLSSignature::AggregateInsecure(const CBLSSignature& o)
{ {
assert(IsValid() && o.IsValid()); assert(IsValid() && o.IsValid());
impl = bls::InsecureSignature::Aggregate({impl, o.impl}); impl = Scheme(fLegacy)->Aggregate({impl, o.impl});
cachedHash.SetNull(); cachedHash.SetNull();
} }
CBLSSignature CBLSSignature::AggregateInsecure(const std::vector<CBLSSignature>& sigs) CBLSSignature CBLSSignature::AggregateInsecure(const std::vector<CBLSSignature>& sigs, const bool fLegacy)
{ {
if (sigs.empty()) { if (sigs.empty()) {
return CBLSSignature(); return CBLSSignature();
} }
std::vector<bls::InsecureSignature> v; std::vector<bls::G2Element> v;
v.reserve(sigs.size()); v.reserve(sigs.size());
for (auto& pk : sigs) { for (auto& pk : sigs) {
v.emplace_back(pk.impl); v.emplace_back(pk.impl);
} }
CBLSSignature ret; CBLSSignature ret;
ret.impl = bls::InsecureSignature::Aggregate(v); ret.impl = Scheme(fLegacy)->Aggregate(v);
ret.fValid = true; ret.fValid = true;
ret.cachedHash.SetNull(); ret.cachedHash.SetNull();
return ret; return ret;
@ -218,22 +226,27 @@ CBLSSignature CBLSSignature::AggregateInsecure(const std::vector<CBLSSignature>&
CBLSSignature CBLSSignature::AggregateSecure(const std::vector<CBLSSignature>& sigs, CBLSSignature CBLSSignature::AggregateSecure(const std::vector<CBLSSignature>& sigs,
const std::vector<CBLSPublicKey>& pks, const std::vector<CBLSPublicKey>& pks,
const uint256& hash) const uint256& hash,
const bool fLegacy)
{ {
if (sigs.size() != pks.size() || sigs.empty()) { if (sigs.size() != pks.size() || sigs.empty()) {
return CBLSSignature(); return CBLSSignature();
} }
std::vector<bls::Signature> v; std::vector<bls::G1Element> vecPublicKeys;
v.reserve(sigs.size()); vecPublicKeys.reserve(pks.size());
for (auto& pk : pks) {
vecPublicKeys.push_back(pk.impl);
}
for (size_t i = 0; i < sigs.size(); i++) { std::vector<bls::G2Element> vecSignatures;
bls::AggregationInfo aggInfo = bls::AggregationInfo::FromMsgHash(pks[i].impl, hash.begin()); vecSignatures.reserve(pks.size());
v.emplace_back(bls::Signature::FromInsecureSig(sigs[i].impl, aggInfo)); for (auto& sig : sigs) {
vecSignatures.push_back(sig.impl);
} }
CBLSSignature ret; CBLSSignature ret;
ret.impl = bls::Signature::AggregateSigs(v).GetInsecureSig(); ret.impl = Scheme(fLegacy)->AggregateSecure(vecPublicKeys, vecSignatures, bls::Bytes(hash.begin(), hash.size()));
ret.fValid = true; ret.fValid = true;
ret.cachedHash.SetNull(); ret.cachedHash.SetNull();
return ret; return ret;
@ -242,7 +255,7 @@ CBLSSignature CBLSSignature::AggregateSecure(const std::vector<CBLSSignature>& s
void CBLSSignature::SubInsecure(const CBLSSignature& o) void CBLSSignature::SubInsecure(const CBLSSignature& o)
{ {
assert(IsValid() && o.IsValid()); assert(IsValid() && o.IsValid());
impl = impl.DivideBy({o.impl}); impl = impl + o.impl.Negate();
cachedHash.SetNull(); cachedHash.SetNull();
} }
@ -253,7 +266,7 @@ bool CBLSSignature::VerifyInsecure(const CBLSPublicKey& pubKey, const uint256& h
} }
try { try {
return impl.Verify({(const uint8_t*)hash.begin()}, {pubKey.impl}); return Scheme(fLegacy)->Verify(pubKey.impl, bls::Bytes(hash.begin(), hash.size()), impl);
} catch (...) { } catch (...) {
return false; return false;
} }
@ -266,8 +279,8 @@ bool CBLSSignature::VerifyInsecureAggregated(const std::vector<CBLSPublicKey>& p
} }
assert(!pubKeys.empty() && !hashes.empty() && pubKeys.size() == hashes.size()); assert(!pubKeys.empty() && !hashes.empty() && pubKeys.size() == hashes.size());
std::vector<bls::PublicKey> pubKeyVec; std::vector<bls::G1Element> pubKeyVec;
std::vector<const uint8_t*> hashes2; std::vector<bls::Bytes> hashes2;
hashes2.reserve(hashes.size()); hashes2.reserve(hashes.size());
pubKeyVec.reserve(pubKeys.size()); pubKeyVec.reserve(pubKeys.size());
for (size_t i = 0; i < pubKeys.size(); i++) { for (size_t i = 0; i < pubKeys.size(); i++) {
@ -276,11 +289,11 @@ bool CBLSSignature::VerifyInsecureAggregated(const std::vector<CBLSPublicKey>& p
return false; return false;
} }
pubKeyVec.push_back(p.impl); pubKeyVec.push_back(p.impl);
hashes2.push_back((uint8_t*)hashes[i].begin()); hashes2.emplace_back(hashes[i].begin(), hashes[i].size());
} }
try { try {
return impl.Verify(hashes2, pubKeyVec); return Scheme(fLegacy)->AggregateVerify(pubKeyVec, hashes2, impl);
} catch (...) { } catch (...) {
return false; return false;
} }
@ -292,16 +305,13 @@ bool CBLSSignature::VerifySecureAggregated(const std::vector<CBLSPublicKey>& pks
return false; return false;
} }
std::vector<bls::AggregationInfo> v; std::vector<bls::G1Element> vecPublicKeys;
v.reserve(pks.size()); vecPublicKeys.reserve(pks.size());
for (auto& pk : pks) { for (const auto& pk : pks) {
auto aggInfo = bls::AggregationInfo::FromMsgHash(pk.impl, hash.begin()); vecPublicKeys.push_back(pk.impl);
v.emplace_back(aggInfo);
} }
bls::AggregationInfo aggInfo = bls::AggregationInfo::MergeInfos(v); return Scheme(fLegacy)->VerifySecure(vecPublicKeys, impl, bls::Bytes(hash.begin(), hash.size()));
bls::Signature aggSig = bls::Signature::FromInsecureSig(impl, aggInfo);
return aggSig.Verify();
} }
bool CBLSSignature::Recover(const std::vector<CBLSSignature>& sigs, const std::vector<CBLSId>& ids) bool CBLSSignature::Recover(const std::vector<CBLSSignature>& sigs, const std::vector<CBLSId>& ids)
@ -313,8 +323,8 @@ bool CBLSSignature::Recover(const std::vector<CBLSSignature>& sigs, const std::v
return false; return false;
} }
std::vector<bls::InsecureSignature> sigsVec; std::vector<bls::G2Element> sigsVec;
std::vector<const uint8_t*> idsVec; std::vector<bls::Bytes> idsVec;
sigsVec.reserve(sigs.size()); sigsVec.reserve(sigs.size());
idsVec.reserve(sigs.size()); idsVec.reserve(sigs.size());
@ -323,11 +333,11 @@ bool CBLSSignature::Recover(const std::vector<CBLSSignature>& sigs, const std::v
return false; return false;
} }
sigsVec.emplace_back(sigs[i].impl); sigsVec.emplace_back(sigs[i].impl);
idsVec.emplace_back(ids[i].impl.begin()); idsVec.emplace_back(ids[i].impl.begin(), ids[i].impl.size());
} }
try { try {
impl = bls::BLS::RecoverSig(sigsVec, idsVec); impl = bls::Threshold::SignatureRecover(sigsVec, idsVec);
} catch (...) { } catch (...) {
return false; return false;
} }

View File

@ -10,17 +10,22 @@
#include <uint256.h> #include <uint256.h>
#include <utilstrencodings.h> #include <utilstrencodings.h>
#undef ERROR // chia BLS uses relic, which defines ERROR, which in turn causes win32/win64 builds to print many warnings // bls-dash uses relic, which may define DEBUG and ERROR, which leads to many warnings in some build setups
#include <chiabls/bls.hpp> #undef ERROR
#include <chiabls/privatekey.hpp> #undef DEBUG
#include <chiabls/publickey.hpp> #include <bls-dash/bls.hpp>
#include <chiabls/signature.hpp> #include <bls-dash/privatekey.hpp>
#include <bls-dash/elements.hpp>
#include <bls-dash/schemes.hpp>
#include <bls-dash/threshold.hpp>
#undef DOUBLE #undef DOUBLE
#include <array> #include <array>
#include <mutex> #include <mutex>
#include <unistd.h> #include <unistd.h>
static const bool fLegacyDefault{true};
// reversed BLS12-381 // reversed BLS12-381
#define BLS_CURVE_ID_SIZE 32 #define BLS_CURVE_ID_SIZE 32
#define BLS_CURVE_SECKEY_SIZE 32 #define BLS_CURVE_SECKEY_SIZE 32
@ -37,6 +42,8 @@ class CBLSWrapper
friend class CBLSPublicKey; friend class CBLSPublicKey;
friend class CBLSSignature; friend class CBLSSignature;
bool fLegacy;
protected: protected:
ImplType impl; ImplType impl;
bool fValid{false}; bool fValid{false};
@ -47,10 +54,10 @@ protected:
public: public:
static const size_t SerSize = _SerSize; static const size_t SerSize = _SerSize;
CBLSWrapper() CBLSWrapper(const bool fLegacyIn = fLegacyDefault) : fLegacy(fLegacyIn)
{ {
} }
CBLSWrapper(const std::vector<unsigned char>& vecBytes) : CBLSWrapper<ImplType, _SerSize, C>() CBLSWrapper(const std::vector<unsigned char>& vecBytes, const bool fLegacyIn = fLegacyDefault) : CBLSWrapper<ImplType, _SerSize, C>(fLegacyIn)
{ {
SetByteVector(vecBytes); SetByteVector(vecBytes);
} }
@ -62,12 +69,14 @@ public:
std::swap(impl, ref.impl); std::swap(impl, ref.impl);
std::swap(fValid, ref.fValid); std::swap(fValid, ref.fValid);
std::swap(cachedHash, ref.cachedHash); std::swap(cachedHash, ref.cachedHash);
std::swap(fLegacy, ref.fLegacy);
} }
CBLSWrapper& operator=(CBLSWrapper&& ref) CBLSWrapper& operator=(CBLSWrapper&& ref)
{ {
std::swap(impl, ref.impl); std::swap(impl, ref.impl);
std::swap(fValid, ref.fValid); std::swap(fValid, ref.fValid);
std::swap(cachedHash, ref.cachedHash); std::swap(cachedHash, ref.cachedHash);
std::swap(fLegacy, ref.fLegacy);
return *this; return *this;
} }
@ -87,7 +96,7 @@ public:
void Reset() void Reset()
{ {
*((C*)this) = C(); *((C*)this) = C(fLegacy);
} }
void SetByteVector(const std::vector<uint8_t>& vecBytes) void SetByteVector(const std::vector<uint8_t>& vecBytes)
@ -101,7 +110,7 @@ public:
Reset(); Reset();
} else { } else {
try { try {
impl = ImplType::FromBytes(vecBytes.data()); impl = ImplType::FromBytes(bls::Bytes(vecBytes), fLegacy);
fValid = true; fValid = true;
} catch (...) { } catch (...) {
Reset(); Reset();
@ -115,7 +124,7 @@ public:
if (!fValid) { if (!fValid) {
return std::vector<uint8_t>(SerSize, 0); return std::vector<uint8_t>(SerSize, 0);
} }
return impl.Serialize(); return impl.Serialize(fLegacy);
} }
const uint256& GetHash() const const uint256& GetHash() const
@ -189,13 +198,13 @@ struct CBLSIdImplicit : public uint256
{ {
memcpy(begin(), id.begin(), sizeof(uint256)); memcpy(begin(), id.begin(), sizeof(uint256));
} }
static CBLSIdImplicit FromBytes(const uint8_t* buffer) static CBLSIdImplicit FromBytes(const uint8_t* buffer, const bool fLegacy = false)
{ {
CBLSIdImplicit instance; CBLSIdImplicit instance;
memcpy(instance.begin(), buffer, sizeof(CBLSIdImplicit)); memcpy(instance.begin(), buffer, sizeof(CBLSIdImplicit));
return instance; return instance;
} }
std::vector<uint8_t> Serialize() const std::vector<uint8_t> Serialize(const bool fLegacy = false) const
{ {
return {begin(), end()}; return {begin(), end()};
} }
@ -235,7 +244,7 @@ public:
CBLSSignature Sign(const uint256& hash) const; CBLSSignature Sign(const uint256& hash) const;
}; };
class CBLSPublicKey : public CBLSWrapper<bls::PublicKey, BLS_CURVE_PUBKEY_SIZE, CBLSPublicKey> class CBLSPublicKey : public CBLSWrapper<bls::G1Element, BLS_CURVE_PUBKEY_SIZE, CBLSPublicKey>
{ {
friend class CBLSSecretKey; friend class CBLSSecretKey;
friend class CBLSSignature; friend class CBLSSignature;
@ -249,14 +258,14 @@ public:
CBLSPublicKey() {} CBLSPublicKey() {}
void AggregateInsecure(const CBLSPublicKey& o); void AggregateInsecure(const CBLSPublicKey& o);
static CBLSPublicKey AggregateInsecure(const std::vector<CBLSPublicKey>& pks); static CBLSPublicKey AggregateInsecure(const std::vector<CBLSPublicKey>& pks, bool fLegacy = fLegacyDefault);
bool PublicKeyShare(const std::vector<CBLSPublicKey>& mpk, const CBLSId& id); bool PublicKeyShare(const std::vector<CBLSPublicKey>& mpk, const CBLSId& id);
bool DHKeyExchange(const CBLSSecretKey& sk, const CBLSPublicKey& pk); bool DHKeyExchange(const CBLSSecretKey& sk, const CBLSPublicKey& pk);
}; };
class CBLSSignature : public CBLSWrapper<bls::InsecureSignature, BLS_CURVE_SIG_SIZE, CBLSSignature> class CBLSSignature : public CBLSWrapper<bls::G2Element, BLS_CURVE_SIG_SIZE, CBLSSignature>
{ {
friend class CBLSSecretKey; friend class CBLSSecretKey;
@ -270,8 +279,8 @@ public:
CBLSSignature& operator=(const CBLSSignature&) = default; CBLSSignature& operator=(const CBLSSignature&) = default;
void AggregateInsecure(const CBLSSignature& o); void AggregateInsecure(const CBLSSignature& o);
static CBLSSignature AggregateInsecure(const std::vector<CBLSSignature>& sigs); static CBLSSignature AggregateInsecure(const std::vector<CBLSSignature>& sigs, bool fLegacy = fLegacyDefault);
static CBLSSignature AggregateSecure(const std::vector<CBLSSignature>& sigs, const std::vector<CBLSPublicKey>& pks, const uint256& hash); static CBLSSignature AggregateSecure(const std::vector<CBLSSignature>& sigs, const std::vector<CBLSPublicKey>& pks, const uint256& hash, bool fLegacy = fLegacyDefault);
void SubInsecure(const CBLSSignature& o); void SubInsecure(const CBLSSignature& o);