def test_random(self):
        """ test using PRNG """

        e, y = factoring_zk.prove(self.rng,
                                  self.p,
                                  self.q,
                                  self.id,
                                  ad=self.ad)

        self.assertEqual(e, self.e)
        self.assertEqual(y, self.y)
    def test_tv(self):
        """ test using test vectors """

        for vector in self.tv:
            if not vector['AD']:
                vector['AD'] = None

            e, y = factoring_zk.prove(None,
                                      vector['P'],
                                      vector['Q'],
                                      vector['ID'],
                                      ad=vector['AD'],
                                      r=vector['R'])

            self.assertEqual(e, vector['E'])
            self.assertEqual(y, vector['Y'])
Ejemplo n.º 3
0
def generate_key_material_zkp(rng, key_material, ID, AD=None):
    """ Generate ZK Proofs for key material

    Generate a commitment to the ECDSA PK, a Schnorr's
    Proof for the ECDSA PK and a factoring Proof for the
    Paillier PK
    The key material dictionary must have keys:
     * paillier_sk
     * paillier_pk
     * ecdsa_sk
     * ecdsa_pk

    Args::

        rng: pointer to CSPRNG
        key_material: dictionary with the key material

    Returns::

        r:  secret value for the ECDSA PK commitment
        c:  commitment for the ECDSA PK
        sc: commitment for the Schnorr's Proof
        sp: Schnorr's Proof
        fe: Factoring Proof. First component
        fy: Factoring Proof. Second component

    """
    # Commit to ECDSA PK
    r, c = commitments.nm_commit(rng, key_material['ecdsa_pk'])

    # Generate Schnorr's proof for ECDSA PK
    sr, sc = schnorr.commit(rng)
    e = schnorr.challenge(key_material['ecdsa_pk'], sc, ID, AD=AD)
    sp = schnorr.prove(sr, e, key_material['ecdsa_sk'])

    # Generate ZKP of knowledge of factorization for
    # Paillier key pair
    psk_p, psk_q = mpc.mpc_dump_paillier_sk(key_material['paillier_sk'])

    fe, fy = factoring_zk.prove(rng, psk_p, psk_q, ID, ad=AD)

    return r, c, sc, sp, fe, fy
    p = bytes.fromhex(p_hex)
    q = bytes.fromhex(q_hex)
    n = bytes.fromhex(n_hex)

    ad = core_utils.generate_random(rng, 32)

    print("Example ZK Proof of Knowledge of factoring")
    print("Parameters")
    print(f"\tP  = {p.hex()}")
    print(f"\tQ  = {q.hex()}")
    print(f"\tN  = {n.hex()}")
    print(f"\tID = {uid.decode('utf-8')}")
    print(f"\tAD = {ad.hex()}")

    # Prove
    e, y = factoring_zk.prove(rng, p, q, uid, ad=ad)

    print("\nGenerate proof")
    print(f"\tE = {e.hex()}")
    print(f"\tY = {y.hex()}")

    # Verify
    ec = factoring_zk.verify(n, e, y, uid, ad=ad)

    print("\nVerify proof")
    if ec == factoring_zk.OK:
        print("\tSuccess")
    else:
        print("\tFailure")
Ejemplo n.º 5
0
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

from amcl import factoring_zk

p_hex = "e008507e09c24d756280f3d94912fb9ac16c0a8a1757ee01a350736acfc7f65880f87eca55d6680253383fc546d03fd9ebab7d8fa746455180888cb7c17edf58d3327296468e5ab736374bc9a0fa02606ed5d3a4a5fb1677891f87fbf3c655c3e0549a86b17b7ddce07c8f73e253105e59f5d3ed2c7ba5bdf8495df40ae71a7f"
q_hex = "dbffe278edd44c2655714e5a4cc82e66e46063f9ab69df9d0ed20eb3d7f2d8c7d985df71c28707f32b961d160ca938e9cf909cd77c4f8c630aec34b67714cbfd4942d7147c509db131bc2d6a667eb30df146f64b710f8f5247848b0a75738a38772e31014fd63f0b769209928d586499616dcc90700b393156e12eea7e15a835"
n_hex = "c0870b552afb6c8c09f79e39ad6ca17ca93085c2cd7a726ade69574961ff9ce8ad33c7dda2e0703a3b0010c2e5bb7552c74164ce8dd011d85e5969090df53fe10e39cbe530704da32ff07228a6b6da34a5929e8a231c3080d812dc6e93affd81682339a6aee192927c582da8941bebf46e13c4ea3918a1477951fa66d367e70d8551b1869316d48317e0702d7bce242a326000f3dc763c44eba2044a1df713a94c1339edd464b145dcadf94e6e61be73dc270c878e1a28be720df2209202d00e101c3b255b757eaf547acd863d51eb676b851511b3dadeda926714719dceddd3af7908893ae65f2b95ee5c4d36cc6862cbe6886a62d7c1e2d0db48c399a6d44b"
r_hex = "c05f6c79e81fab2f1aa6af48dc5afa89a21c0aee03e93944cacfefef1be90f41ec8c2055760beafa9ed87dd67dbd56b33a2568dfec62a03f06c4f8449a93eee858507f4b602bf305e1c9968d9f5b6dc3120c27e053a1d7e51590e0bacb8d36c27bccce1a57c1e3aeb0832905d4e2bb8eaee883b4df042d8660cf3e0c9777b6be34c18bef02347f92cb71f372f61c018860211932dd46de8f925212d7afe6dd2f3cda05f8d5a6bd1b138b66c5efd7fca31f926c721f6d4207b97fc01cdf325da21233f6df37adbcd67472b332f7490a4a96e0fef31beef55b9446067b8e8d807384e3d31051c7a1f27296a6ae111b30c3d1f3f81666fd9ad99df531bb68428029"

uid = b"unique_user_identifier"
ad_hex = "d7d3155616778fb436a1eb2070892205" 

if __name__ == "__main__":
    p =  bytes.fromhex(p_hex)
    q =  bytes.fromhex(q_hex)
    n =  bytes.fromhex(n_hex)
    r =  bytes.fromhex(r_hex)
    ad = bytes.fromhex(ad_hex)

    # Generate quantities for benchmark
    e, y = factoring_zk.prove(None, p, q, uid, ad=ad, r=r)
    assert factoring_zk.verify(n, e, y, uid, ad=ad) == factoring_zk.OK

    # Run benchmark
    fncall = lambda: factoring_zk.prove(None, p, q, uid, ad=ad, r=r)
    time_func("prove ", fncall)

    fncall = lambda: factoring_zk.verify(n, e, y, uid, ad=ad)
    time_func("verify", fncall)