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

Reply via email to