This is an automated email from the ASF dual-hosted git repository. kmccusker pushed a commit to branch bls-sss in repository https://gitbox.apache.org/repos/asf/incubator-milagro-crypto-c.git
commit a1b9897c4a6af09aa0ac5c234c9a21591670e928 Author: Kealan McCusker <[email protected]> AuthorDate: Thu Aug 22 14:23:07 2019 +0100 added BLS multiplication functions --- include/bls.h.in | 18 +++++++++ include/bls192.h.in | 19 ++++++++++ include/bls256.h.in | 19 ++++++++++ src/bls.c.in | 40 ++++++++++++++++++++ src/bls192.c.in | 40 ++++++++++++++++++++ src/bls256.c.in | 40 ++++++++++++++++++++ wrappers/python/bls_ZZZ.py.in | 87 +++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 263 insertions(+) diff --git a/include/bls.h.in b/include/bls.h.in index cf5ceca..b500802 100644 --- a/include/bls.h.in +++ b/include/bls.h.in @@ -91,5 +91,23 @@ int BLS_ZZZ_ADD_G1(octet *R1,octet *R2,octet *R); */ int BLS_ZZZ_ADD_G2(octet *W1,octet *W2,octet *W); +/** @brief Multiply a member group G1 by an integer + * + @param P integer + @param R member of G1 + @param T member of G1. T=P*R + @return Zero for success or else an error code + */ +int BLS_ZZZ_MUL_G1(octet *P,octet *R,octet *T); + +/** @brief Multiply a member group G2 by an integer + * + @param P integer + @param R member of G2 + @param T member of G2. T=P*R + @return Zero for success or else an error code + */ +int BLS_ZZZ_MUL_G2(octet *P,octet *R,octet *T); + #endif diff --git a/include/bls192.h.in b/include/bls192.h.in index 4e4a489..b7d22cc 100644 --- a/include/bls192.h.in +++ b/include/bls192.h.in @@ -91,5 +91,24 @@ int BLS_ZZZ_ADD_G1(octet *R1,octet *R2,octet *R); */ int BLS_ZZZ_ADD_G2(octet *W1,octet *W2,octet *W); +/** @brief Multiply a member group G1 by an integer + * + @param P integer + @param R member of G1 + @param T member of G1. T=P*R + @return Zero for success or else an error code + */ +int BLS_ZZZ_MUL_G1(octet *P,octet *R,octet *T); + +/** @brief Multiply a member group G2 by an integer + * + @param P integer + @param R member of G2 + @param T member of G2. T=P*R + @return Zero for success or else an error code + */ +int BLS_ZZZ_MUL_G2(octet *P,octet *R,octet *T); + + #endif diff --git a/include/bls256.h.in b/include/bls256.h.in index 5af8f61..cc2d94e 100644 --- a/include/bls256.h.in +++ b/include/bls256.h.in @@ -91,5 +91,24 @@ int BLS_ZZZ_ADD_G1(octet *R1,octet *R2,octet *R); */ int BLS_ZZZ_ADD_G2(octet *W1,octet *W2,octet *W); +/** @brief Multiply a member group G1 by an integer + * + @param P integer + @param R member of G1 + @param T member of G1. T=P*R + @return Zero for success or else an error code + */ +int BLS_ZZZ_MUL_G1(octet *P,octet *R,octet *T); + +/** @brief Multiply a member group G2 by an integer + * + @param P integer + @param R member of G2 + @param T member of G2. T=P*R + @return Zero for success or else an error code + */ +int BLS_ZZZ_MUL_G2(octet *P,octet *R,octet *T); + + #endif diff --git a/src/bls.c.in b/src/bls.c.in index 6cfe38c..6868ba8 100644 --- a/src/bls.c.in +++ b/src/bls.c.in @@ -151,3 +151,43 @@ int BLS_ZZZ_ADD_G2(octet *W1,octet *W2,octet *W) return BLS_OK; } + +/* T=P*R in group G1 */ +int BLS_ZZZ_MUL_G1(octet *P,octet *R,octet *T) +{ + BIG_XXX p; + ECP_ZZZ R1; + + P->len=MODBYTES_XXX; + BIG_XXX_fromBytes(p,P->val); + + if (!ECP_ZZZ_fromOctet(&R1,R)) + { + return BLS_INVALID_G1; + } + + PAIR_ZZZ_G1mul(&R1,p); + ECP_ZZZ_toOctet(T,&R1,true); + + return BLS_OK; +} + +/* T=P*R in group G2 */ +int BLS_ZZZ_MUL_G2(octet *P,octet *R,octet *T) +{ + BIG_XXX p; + ECP2_ZZZ R1; + + P->len=MODBYTES_XXX; + BIG_XXX_fromBytes(p,P->val); + + if (!ECP2_ZZZ_fromOctet(&R1,R)) + { + return BLS_INVALID_G2; + } + + PAIR_ZZZ_G2mul(&R1,p); + ECP2_ZZZ_toOctet(T,&R1); + + return BLS_OK; +} diff --git a/src/bls192.c.in b/src/bls192.c.in index 3857f10..617a94e 100644 --- a/src/bls192.c.in +++ b/src/bls192.c.in @@ -151,3 +151,43 @@ int BLS_ZZZ_ADD_G2(octet *W1,octet *W2,octet *W) return BLS_OK; } + +/* T=P*R in group G1 */ +int BLS_ZZZ_MUL_G1(octet *P,octet *R,octet *T) +{ + BIG_XXX p; + ECP_ZZZ R1; + + P->len=MODBYTES_XXX; + BIG_XXX_fromBytes(p,P->val); + + if (!ECP_ZZZ_fromOctet(&R1,R)) + { + return BLS_INVALID_G1; + } + + PAIR_ZZZ_G1mul(&R1,p); + ECP_ZZZ_toOctet(T,&R1,true); + + return BLS_OK; +} + +/* T=P*R in group G2 */ +int BLS_ZZZ_MUL_G2(octet *P,octet *R,octet *T) +{ + BIG_XXX p; + ECP4_ZZZ R1; + + P->len=MODBYTES_XXX; + BIG_XXX_fromBytes(p,P->val); + + if (!ECP4_ZZZ_fromOctet(&R1,R)) + { + return BLS_INVALID_G2; + } + + PAIR_ZZZ_G2mul(&R1,p); + ECP4_ZZZ_toOctet(T,&R1); + + return BLS_OK; +} diff --git a/src/bls256.c.in b/src/bls256.c.in index 135d450..18a8ab2 100644 --- a/src/bls256.c.in +++ b/src/bls256.c.in @@ -151,3 +151,43 @@ int BLS_ZZZ_ADD_G2(octet *W1,octet *W2,octet *W) return BLS_OK; } + +/* T=P*R in group G1 */ +int BLS_ZZZ_MUL_G1(octet *P,octet *R,octet *T) +{ + BIG_XXX p; + ECP_ZZZ R1; + + P->len=MODBYTES_XXX; + BIG_XXX_fromBytes(p,P->val); + + if (!ECP_ZZZ_fromOctet(&R1,R)) + { + return BLS_INVALID_G1; + } + + PAIR_ZZZ_G1mul(&R1,p); + ECP_ZZZ_toOctet(T,&R1,true); + + return BLS_OK; +} + +/* T=P*R in group G2 */ +int BLS_ZZZ_MUL_G2(octet *P,octet *R,octet *T) +{ + BIG_XXX p; + ECP8_ZZZ R1; + + P->len=MODBYTES_XXX; + BIG_XXX_fromBytes(p,P->val); + + if (!ECP8_ZZZ_fromOctet(&R1,R)) + { + return BLS_INVALID_G2; + } + + PAIR_ZZZ_G2mul(&R1,p); + ECP8_ZZZ_toOctet(T,&R1); + + return BLS_OK; +} diff --git a/wrappers/python/bls_ZZZ.py.in b/wrappers/python/bls_ZZZ.py.in index fe0734d..62903dc 100755 --- a/wrappers/python/bls_ZZZ.py.in +++ b/wrappers/python/bls_ZZZ.py.in @@ -58,6 +58,8 @@ extern int BLS_ZZZ_SIGN(octet *SIG,char *m,octet *S); extern int BLS_ZZZ_VERIFY(octet *SIG,char *m,octet *W); extern int BLS_ZZZ_ADD_G1(octet *R1,octet *R2,octet *R); extern int BLS_ZZZ_ADD_G2(octet *W1,octet *W2,octet *W); +extern int BLS_ZZZ_MUL_G1(octet *P,octet *R,octet *T); +extern int BLS_ZZZ_MUL_G2(octet *P,octet *R,octet *T); """) @@ -367,6 +369,74 @@ def add_G2(R1, R2): return error_code, R +def mult_G1(P, R): + """Multiple a member from the group G1 by an integer + + Multiple a member from the group G1 by an integer + + Args:: + + P: integer value + R: member of G1 + + Returns:: + + T: member of G1. T=P*R + error_code: Zero for success or else an error code + + Raises: + + """ + P1, P1_val = make_octet(None, P) + R1, R1_val = make_octet(None, R) + T1, T1_val = make_octet(G1LEN) + error_code = libamcl_bls_ZZZ.BLS_ZZZ_MUL_G1(P1, R1, T1) + + T_hex = to_hex(T1) + + # clear memory + libamcl_core.OCT_clear(P1) + libamcl_core.OCT_clear(R1) + libamcl_core.OCT_clear(T1) + + T = bytes.fromhex(T_hex) + return error_code, T + + +def mult_G2(P, R): + """Multiple a member from the group G2 by an integer + + Multiple a member from the group G2 by an integer + + Args:: + + P: integer value + R: member of G1 + + Returns:: + + T: member of G1. T=P*R + error_code: Zero for success or else an error code + + Raises: + + """ + P1, P1_val = make_octet(None, P) + R1, R1_val = make_octet(None, R) + T1, T1_val = make_octet(G2LEN) + error_code = libamcl_bls_ZZZ.BLS_ZZZ_MUL_G2(P1, R1, T1) + + T_hex = to_hex(T1) + + # clear memory + libamcl_core.OCT_clear(P1) + libamcl_core.OCT_clear(R1) + libamcl_core.OCT_clear(T1) + + T = bytes.fromhex(T_hex) + return error_code, T + + if __name__ == "__main__": # Print hex values DEBUG = False @@ -480,6 +550,23 @@ if __name__ == "__main__": raise SystemExit(0) print("Success: Aggregated signature is valid") + # Multiply signature and public key + rtn, sigmult = mult_G1(sk1, sig123) + if rtn != 0: + print("Error: mult_G1 {}".format(rtn)) + raise SystemExit(0) + + rtn, pkmult = mult_G2(sk1, pk123) + if rtn != 0: + print("Error: mult_G2 {}".format(rtn)) + raise SystemExit(0) + + rtn = verify(sigmult, message, pkmult) + if rtn != 0: + print("Error: Invalid multiplied signature {}".format(rtn)) + raise SystemExit(0) + print("Success: Multiplied signature is valid") + # Clear memory kill_csprng(rng) del sk1
