https://github.com/henrycg/earand
Raw File
Tip revision: 362625f3847ddd2e2d5a90cf5f93b4b3ea76e059 authored by Henry Corrigan-Gibbs on 21 May 2018, 19:54:59 UTC
Merge branch 'master' of github.com:henrycg/earand
Tip revision: 362625f
test_product_proof.c
#include <stdbool.h>
#include <stdio.h>
#include <string.h>

#include <openssl/bn.h>

#include "product_proof.h"
#include "test_common.h"

void mu_test_ProductStatement_New()
{
  const int bits = 180;
  IntegerGroup g = IntegerGroup_Generate(bits);
  BIGNUM *commit_a = IntegerGroup_RandomElement(g);
  BIGNUM *commit_b = IntegerGroup_RandomElement(g);
  BIGNUM *commit_c = IntegerGroup_RandomElement(g);

  mu_ensure(commit_a);
  mu_ensure(commit_b);
  mu_ensure(commit_c);

  ProductStatement proof = ProductStatement_New(g, commit_a, commit_b, commit_c);

  BN_free(commit_a);
  BN_free(commit_b);
  BN_free(commit_c);

  ProductStatement_Free(proof);
  IntegerGroup_Free(g);
}

void mu_test_ProductProof_Correct()
{
  for(int i=0; i<50; i++) {
    const int bits = 180;
    IntegerGroup g = IntegerGroup_Generate(bits);
    BIGNUM* a = IntegerGroup_RandomExponent(g);
    BIGNUM* b = IntegerGroup_RandomExponent(g);
    BIGNUM* c = BN_new();

    mu_ensure(a);
    mu_ensure(b);
    mu_ensure(c);

    // c = a*b mod q
    mu_ensure(BN_mod_mul(c, a, b, IntegerGroup_GetQ(g), IntegerGroup_GetCtx(g)));

    BIGNUM* r_a = IntegerGroup_RandomExponent(g);
    BIGNUM* r_b = IntegerGroup_RandomExponent(g);
    BIGNUM* r_c = IntegerGroup_RandomExponent(g);

    mu_ensure(r_a);
    mu_ensure(r_b);
    mu_ensure(r_c);

    BIGNUM* commit_a = IntegerGroup_Commit(g, a, r_a);
    BIGNUM* commit_b = IntegerGroup_Commit(g, b, r_b);
    BIGNUM* commit_c = IntegerGroup_Commit(g, c, r_c);

    mu_ensure(commit_a);
    mu_ensure(commit_b);
    mu_ensure(commit_c);

    ProductStatement proof = ProductStatement_New(g, commit_a, commit_b, commit_c);

    ProductEvidence ev = ProductEvidence_New(proof, a, r_a, r_b, r_c);
    mu_ensure(ProductEvidence_Verify(ev, proof));

    // Write params to temp file
    FILE *file = tmpfile();
    mu_ensure(file);

    mu_ensure(ProductEvidence_Serialize(ev, file));
    rewind(file);

    ProductEvidence ev2 = ProductEvidence_Unserialize(file);
    mu_ensure(ev2);
    mu_ensure(ProductEvidence_Verify(ev2, proof));

    fclose(file);

    BN_free(a);
    BN_free(b);
    BN_free(c);

    BN_free(commit_a);
    BN_free(commit_b);
    BN_free(commit_c);

    BN_free(r_a);
    BN_free(r_b);
    BN_free(r_c);

    ProductEvidence_Free(ev);
    ProductEvidence_Free(ev2);
    ProductStatement_Free(proof);
    IntegerGroup_Free(g);
  }
}

back to top