You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@milagro.apache.org by km...@apache.org on 2019/08/22 13:23:23 UTC
[incubator-milagro-crypto-c] 01/01: added BLS multiplication
functions
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 <ke...@gmail.com>
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