Skip to content
This repository has been archived by the owner on Mar 25, 2024. It is now read-only.

Commit

Permalink
Merge pull request #47 from apache/bls-sss
Browse files Browse the repository at this point in the history
BLS SSS
  • Loading branch information
spector-in-london committed Aug 27, 2019
2 parents 09f4a37 + b1f7797 commit b625ef6
Show file tree
Hide file tree
Showing 15 changed files with 1,535 additions and 29 deletions.
28 changes: 13 additions & 15 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@ WRAPPYTHON="-DBUILD_PYTHON=on"
# <NAME>:<DOUBLECOMMA-SEPARATED_LIST_OF_CMAKE_OPTIONS>

BUILDS_PF64=LINUX_64BIT_BLS381:-DWORD_SIZE=64,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,${WRAPPYTHON} \
LINUX_64BIT_BN254CX:-DWORD_SIZE=64,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,${WRAPPYTHON} \
LINUX_64BIT_BN254:-DWORD_SIZE=64,,-DAMCL_CURVE=BN254,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
LINUX_64BIT_FP256BN:-DWORD_SIZE=64,,-DAMCL_CURVE=FP256BN,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
LINUX_64BIT_FP512BN:-DWORD_SIZE=64,,-DAMCL_CURVE=FP512BN,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
LINUX_64BIT_BLS461:-DWORD_SIZE=64,,-DAMCL_CURVE=BLS461,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
LINUX_64BIT_BLS383:-DWORD_SIZE=64,,-DAMCL_CURVE=BLS383,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
Expand All @@ -63,13 +60,10 @@ BUILDS_MISC64=LINUX_64BIT_C25519_RSA2048:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=
LINUX_64BIT_GOLDILOCKS:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=GOLDILOCKS,,-DAMCL_RSA=2048 \
LINUX_64BIT_C41417:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C41417,,-DAMCL_RSA=2048 \
LINUX_64BIT_SECP256K1:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=SECP256K1,,-DAMCL_RSA=2048 \
LINUX_64BIT_C25519_BN254CX_RSA2048:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C25519,BN254CX,,-DAMCL_RSA=2048 \
LINUX_64BIT_NIST256_BN254CX_RSA2048:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,BN254CX,,-DAMCL_RSA=2048 \
WINDOWS_64BIT_BLS381:-DWORD_SIZE=64,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DCMAKE_TOOLCHAIN_FILE=../../resources/cmake/mingw64-cross.cmake \
WINDOWS_64BIT_BLS381_STATIC:-DWORD_SIZE=64,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DCMAKE_TOOLCHAIN_FILE=../../resources/cmake/mingw64-cross.cmake,,-DBUILD_SHARED_LIBS=OFF

BUILDS_PF32=LINUX_32BIT_BLS381:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
LINUX_32BIT_BN254CX:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl
BUILDS_PF32=LINUX_32BIT_BLS381:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl

BUILDS_NIST32=LINUX_32BIT_NIST256_RSA2048:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,,-DAMCL_RSA=2048 \
LINUX_32BIT_NIST256_RSA4096:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,,-DAMCL_RSA=4096 \
Expand All @@ -91,15 +85,9 @@ BUILDS_MISC32=LINUX_32BIT_C25519_RSA2048:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-
LINUX_32BIT_GOLDILOCKS:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=GOLDILOCKS,,-DAMCL_RSA=2048 \
LINUX_32BIT_C41417:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C41417,,-DAMCL_RSA=2048 \
LINUX_32BIT_SECP256K1:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=SECP256K1,,-DAMCL_RSA=2048 \
LINUX_32BIT_C25519_BN254CX_RSA2048:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C25519,BN254CX,,-DAMCL_RSA=2048 \
LINUX_32BIT_NIST256_BN254CX_RSA2048:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,BN254CX,,-DAMCL_RSA=2048 \
WINDOWS_32BIT_BLS381:-DCMAKE_C_FLAGS=-m32,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DWORD_SIZE=32,,-DCMAKE_TOOLCHAIN_FILE=../../resources/cmake/mingw32-cross.cmake

BUILDS_PFS16=LINUX_16BIT_BLS381:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048 \
LINUX_16BIT_BN254CX:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048

BUILDS_MISC16=LINUX_16BIT_ED25519:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=ED25519,,-DAMCL_RSA=2048 \
LINUX_16BIT_NUMS256E:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NUMS256E,,-DAMCL_RSA=2048
BUILDS_MISC16=LINUX_16BIT_ED25519:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=ED25519,,-DAMCL_RSA=2048

BUILDS_ASAN=LINUX_64BIT_BLS381_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048 \
LINUX_64BIT_NIST256_RSA2048_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DAMCL_CURVE=NIST256,,-DAMCL_RSA=2048 \
Expand All @@ -109,12 +97,22 @@ BUILDS_ASAN=LINUX_64BIT_BLS381_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DA
LINUX_64BIT_C25519_RSA2048_EDWARDS_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DAMCL_CURVE=C25519,,-DAMCL_RSA=2048 \
LINUX_64BIT_C41417_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DAMCL_CURVE=C41417,,-DAMCL_RSA=2048

BUILDS_BN256=LINUX_64BIT_BN254CX:-DWORD_SIZE=64,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,${WRAPPYTHON} \
LINUX_64BIT_BN254:-DWORD_SIZE=64,,-DAMCL_CURVE=BN254,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
LINUX_64BIT_FP256BN:-DWORD_SIZE=64,,-DAMCL_CURVE=FP256BN,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
LINUX_64BIT_C25519_BN254CX_RSA2048:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C25519,BN254CX,,-DAMCL_RSA=2048 \
LINUX_64BIT_NIST256_BN254CX_RSA2048:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,BN254CX,,-DAMCL_RSA=2048 \
LINUX_32BIT_BN254CX:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
LINUX_32BIT_C25519_BN254CX_RSA2048:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C25519,BN254CX,,-DAMCL_RSA=2048 \
LINUX_32BIT_NIST256_BN254CX_RSA2048:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,BN254CX,,-DAMCL_RSA=2048 \
LINUX_16BIT_BN254CX:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048 \

BUILDS_COVERAGE=LINUX_64BIT_COVERAGE:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=Coverage,,-DAMCL_CURVE=NIST256,BLS381,,-DAMCL_RSA=2048

# Merge all build types in a single list
BUILDS_64=$(BUILDS_PF64) $(BUILDS_NIST64) $(BUILDS_MISC64)
BUILDS_32=$(BUILDS_PF32) $(BUILDS_NIST32) $(BUILDS_MISC32)
BUILDS_16=$(BUILDS_BN16) $(BUILDS_MISC16)
BUILDS_16=$(BUILDS_MISC16)

BUILDS=$(BUILDS_64) $(BUILDS_32) $(BUILDS_16) $(BUILDS_ASAN) $(BUILDS_COVERAGE)

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.0.1
1.1.0
4 changes: 4 additions & 0 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ foreach(curve ${AMCL_CURVE})
amcl_configure_file_curve(example_bls_ZZZ.c.in example_bls_${TC}.c "${curve}" example_bls_${TC}_GEN_SRCS)
add_executable(example_bls_${TC} ${example_bls_${TC}_GEN_SRCS})
target_link_libraries(example_bls_${TC} PRIVATE amcl_bls_${TC})

amcl_configure_file_curve(example_bls_sss_ZZZ.c.in example_bls_sss_${TC}.c "${curve}" example_bls_sss_${TC}_GEN_SRCS)
add_executable(example_bls_sss_${TC} ${example_bls_sss_${TC}_GEN_SRCS})
target_link_libraries(example_bls_sss_${TC} PRIVATE amcl_bls_${TC})
endif()

endforeach()
Expand Down
16 changes: 12 additions & 4 deletions examples/example_bls_ZZZ.c.in
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,18 @@ specific language governing permissions and limitations
under the License.
*/

/* Build executable after installation:
/*
BLS example code.

Build executable after installation:

gcc -O0 -g ./testbls_ZZZ.c $(pkg-config --libs --cflags amcl) -o testbls_ZZZ
1. Change headers;

#include "bls_ZZZ.h" -> #include <amcl/bls_ZZZ.h>

2. Build code

gcc -O0 -g ./example_bls_ZZZ.c $(pkg-config --libs --cflags amcl) -o example_bls_ZZZ

*/

Expand Down Expand Up @@ -269,12 +278,11 @@ int main()
OCT_fromHex(&SEED,seedHex);
printf("SEED: ");
OCT_output(&SEED);
printf("\n");

// initialise strong RNG
CREATE_CSPRNG(&RNG,&SEED);

printf("\nTesting BLS signature for curve ZZZ\n");
printf("\nBLS example for curve ZZZ\n");
bls(&RNG);

KILL_CSPRNG(&RNG);
Expand Down
242 changes: 242 additions & 0 deletions examples/example_bls_sss_ZZZ.c.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,242 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/

/*
BLS Shamir Secret Sharing example code.

Build executable after installation:

1. Change headers;

#include "bls_ZZZ.h" -> #include <amcl/bls_ZZZ.h>

2. Build code

gcc -O0 -g ./example_bls_sss_ZZZ.c $(pkg-config --libs --cflags amcl) -o example_bls_sss_ZZZ

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "config_curve_ZZZ.h"
#include "randapi.h"

#if CURVE_SECURITY_ZZZ == 128
#include "bls_ZZZ.h"
#elif CURVE_SECURITY_ZZZ == 192
#include "bls192_ZZZ.h"
#elif CURVE_SECURITY_ZZZ == 256
#include "bls256_ZZZ.h"
#endif

// Support multiple security levels
#if CURVE_SECURITY_ZZZ == 128
#define G2LEN 4*BFS_ZZZ
#elif CURVE_SECURITY_ZZZ == 192
#define G2LEN 8*BFS_ZZZ
#elif CURVE_SECURITY_ZZZ == 256
#define G2LEN 16*BFS_ZZZ
#endif

static char message[]="test message";

int bls_sss(csprng *RNG)
{
int rc;
int n=4;
int k=3;

char ski[BGS_ZZZ];
octet SKI = {0,sizeof(ski),ski};
char pki[G2LEN];
octet PKI = {0,sizeof(pki),pki};

char sko[BGS_ZZZ];
octet SKO = {sizeof(sko),sizeof(sko),sko};
char skr[BGS_ZZZ];
octet SKR = {sizeof(skr),sizeof(skr),skr};

char sigi[BFS_ZZZ+1];
octet SIGI = {0,sizeof(sigi),sigi};
char sigr[BFS_ZZZ+1];
octet SIGR = {0,sizeof(sigr),sigr};

// Secret shares
char x[n][BGS_ZZZ];
octet X[n];
char y[n][BGS_ZZZ];
octet Y[n];

for(int i=0; i<n; i++)
{
memset(&y[i], 0, sizeof(y[i]));
Y[i].max = BGS_ZZZ;
Y[i].len = BGS_ZZZ;
Y[i].val = y[i];
memset(&x[i], 0, sizeof(x[i]));
X[i].max = BGS_ZZZ;
X[i].len = BGS_ZZZ;
X[i].val = x[i];
}

// Generate key pair
BLS_ZZZ_KEY_PAIR_GENERATE(RNG,&SKI,&PKI);

printf("Private key SKI: ");
OCT_output(&SKI);
printf("Public key PKI: ");
OCT_output(&PKI);
printf("\n");

// Sign the message
BLS_ZZZ_SIGN(&SIGI,message,&SKI);

printf("SIGI: ");
OCT_output(&SIGI);

// Verify signature
rc=BLS_ZZZ_VERIFY(&SIGI,message,&PKI);
if (rc!=BLS_OK)
{
printf("Error: Invalid Signature\n");
return 1;
}
printf("Success: Signature is valid\n");

// Make shares of BLS secret key
rc = BLS_ZZZ_MAKE_SHARES(k, n, RNG, X, Y, &SKI, &SKO);
if (rc!=BLS_OK)
{
printf("Error: BLS_ZZZ_MAKE_SHARES\n");
return 1;
}

for(int i=0; i<n; i++)
{
printf("X[%d] ", i);
OCT_output(&X[i]);
printf("Y[%d] ", i);
OCT_output(&Y[i]);
}

printf("SKO: ");
OCT_output(&SKO);

if (!OCT_comp(&SKI,&SKO))
{
printf("FAILURE SKI != SKO");
return 1;
}

// Recover BLS secret key
rc = BLS_ZZZ_RECOVER_SECRET(k, X, Y, &SKR);
if (rc!=BLS_OK)
{
printf("Error: BLS_ZZZ_RECOVER_SECRET\n");
return 1;
}
printf("SKR: ");
OCT_output(&SKR);

if (!OCT_comp(&SKR,&SKO))
{
printf("FAILURE SKR != SKO");
return 1;
}

// Generate public keys and signatures using shares
char pks[n][G2LEN];
octet PKS[n];
char sigs[n][BFS_ZZZ+1];
octet SIGS[n];
for(int i=0; i<n; i++)
{
memset(&sigs[i], 0, sizeof(sigs[i]));
SIGS[i].max = BFS_ZZZ+1;
SIGS[i].len = BFS_ZZZ+1;
SIGS[i].val = sigs[i];
memset(&PKS[i], 0, sizeof(PKS[i]));
PKS[i].max = G2LEN;
PKS[i].len = G2LEN;
PKS[i].val = pks[i];
BLS_ZZZ_KEY_PAIR_GENERATE(NULL,&Y[i],&PKS[i]);
BLS_ZZZ_SIGN(&SIGS[i],message,&Y[i]);
}

for(int i=0; i<n; i++)
{
printf("PKS[%d] ", i);
OCT_output(&PKS[i]);
}

for(int i=0; i<n; i++)
{
printf("SIGS[%d] ", i);
OCT_output(&SIGS[i]);
}
printf("\n\n");

// Recover BLS signature
rc = BLS_ZZZ_RECOVER_SIGNATURE(k, X, SIGS, &SIGR);
if (rc!=BLS_OK)
{
printf("Error: BLS_ZZZ_RECOVER_SIGNATURE\n");
return 1;
}
printf("SIGR: ");
OCT_output(&SIGR);

if (!OCT_comp(&SIGR,&SIGI))
{
printf("FAILURE SIGR != SIGI");
return 1;
}

return 0;
}


int main()
{
#ifdef DEBUG
printf("%d bit build\n",CHUNK);
#endif

char* seedHex = "78d0fb6705ce77dee47d03eb5b9c5d30";
char seed[16] = {0};
octet SEED = {sizeof(seed),sizeof(seed),seed};

// CSPRNG
csprng RNG;

// fake random source
OCT_fromHex(&SEED,seedHex);
printf("SEED: ");
OCT_output(&SEED);

// initialise strong RNG
CREATE_CSPRNG(&RNG,&SEED);

printf("\nBLS SSS example for curve ZZZ\n");
bls_sss(&RNG);

KILL_CSPRNG(&RNG);
}


0 comments on commit b625ef6

Please sign in to comment.