示例#1
0
void
test_key_encrypt (rabin_priv &sk, schnorr_clnt_priv *scp,
		  schnorr_srv_priv *ssp)
{
  for (int i = 0; i < 10; i++) {
    size_t len = 512;
    wmstr wmsg (len);
    rnd.getbytes (wmsg, len);
    str msg = wmsg;

    startt ();
    ref<ephem_key_pair> ekp = scp->make_ephem_key_pair ();
    eg += stopt ();

    startt ();
    bigint rab = sk.sign (msg);
    rs += stopt ();

    startt();
    if (!sk.verify (msg, rab)) {
      panic << "verify failed.\n";
    }
    rv += stopt ();

    int bitno = rnd.getword () % mpz_sizeinbase2 (&rab);
    rab.setbit (bitno, !rab.getbit (bitno));
    if (sk.verify (msg, rab)) {
      panic << "verify should have failed\n";
    }

    bigint r_srv, s_srv, r, s;
    startt ();
    if (!ssp->endorse_signature (&r_srv, &s_srv, msg, ekp->public_half ())) {
      panic << "cannot endorse\n";
    }
    se += stopt ();
    startt ();
    if (!scp->complete_signature (&r, &s, msg, ekp->public_half (),
				  ekp->private_half (), r_srv, s_srv)) {
      panic << "cannot complete sig\n";
    }
    sc += stopt ();
    
    startt ();
    if (!scp->verify (msg, r, s)) {
      panic << "verify failed\n";
    }
    sv += stopt ();
    bitno = rnd.getword () % mpz_sizeinbase2 (&s);
    s.setbit (bitno, !s.getbit (bitno));
    if (scp->verify (msg, r, s))
      panic << "verify should have failed.\n";

    /*
    warn << "Success: " << i << "\n";
    */
    n++;
  }
}
void
test_key_sign (dsa_priv *sk)
{
  u_int64_t tmp1, tmp2, tmp3;

  for (int i = 0; i < 50; i++) {
    bigint r, s;

    size_t len = 512;
    wmstr wmsg (len);
    rnd.getbytes (wmsg, len);
    str msg = wmsg;

    tmp1 = get_time ();
    sk->sign (&r, &s, msg);
    tmp2 = get_time ();

    if (!sk->verify (msg, r, s))
      panic << "Verify failed\n"
	    << "  p = " << sk->p << "\n"
	    << "  q = " << sk->q << "\n"
	    << "  g = " << sk->g << "\n"
	    << "  x = " << sk->x << "\n"
	    << "  y = " << sk->y << "\n"
	    << "msg = " << hexdump (msg.cstr (), msg.len ()) << "\n"
	    << "sig.r = " << r << "\n"
	    << "sig.s = " << s << "\n";
    tmp3 = get_time ();

    tst_vtime += (tmp3 - tmp2);
    tst_stime += (tmp2 - tmp1);

    int bitno = rnd.getword () % mpz_sizeinbase2 (&r);
    r.setbit (bitno, !r.getbit (bitno));
    if (sk->verify (msg, r, s))
      panic << "Verify should have failed\n";

    bitno = rnd.getword () % mpz_sizeinbase2 (&s);
    s.setbit (bitno, !s.getbit (bitno));
    if (sk->verify (msg, s, s))
      panic << "Verify should have failed\n";
  }
}
示例#3
0
文件: esign_test.cpp 项目: sga001/vex
void test_key_sign (esign_priv &sk)
{

  uint8_t zz = 2;
  strbuf y;
  y << str((char*) &zz, 1) << "hello";
  uint8_t yy = (uint8_t) str(y)[0];

  warn << yy << "\n";

  esign_pub pk = get_public_key();

  bool ret;
  for (int i = 0; i < 25000; i++) {
    size_t len = rnd.getword () % 256;
    wmstr wmsg (len);
    rnd.getbytes (wmsg, len);
    str msg1 = wmsg;

    bigint m = sk.sign (msg1);

    // test converting back and forth
    std::vector<uint8_t> raw_m;
    
    get_raw_bigint(m, &raw_m);
    m = get_bigint_raw(raw_m); 

    ret = pk.verify (msg1, m);

    if (!ret)
      panic << "Verify failed\n"
	    << "  p = " << sk.p << "\n"
	    << "  q = " << sk.q << "\n"
	    << "msg = " << hexdump (msg1.cstr (), msg1.len ()) << "\n"
	    << "sig = " << m << "\n";
    
    int bitno = rnd.getword () % mpz_sizeinbase2 (&m);
    m.setbit (bitno, !m.getbit (bitno));
    
    if (pk.verify (msg1, m)) {
      panic << "Verify should have failed\n"
	    << "  p = " << sk.p << "\n"
	    << "  q = " << sk.q << "\n"
	    << "msg = " << hexdump (msg1.cstr (), msg1.len ()) << "\n"
	    << "sig = " << m << "\n";
    } 
  }
}
static int
rw_precompute (rw_priv *sk)
{
  mpz_t k, p1, q1;

  sk->key.vptr = &rabin_1;
  sk->key.type = PRIVATE;

  if (mpz_cmp (sk->p, sk->q) > 0) {
    /* Make sk->p < sk->q to make sk->u as small as possible */
    *k = *sk->p;
    *sk->p = *sk->q;
    *sk->q = *k;
  }

  /* Calculate modulus N = pq */
  mpz_mul (sk->n, sk->p, sk->q);
  sk->nbits = mpz_sizeinbase2 (sk->n);
  if (sk->nbits <= rw_resvbits)
    return -1;
  sk->nbits -= rw_resvbits;

  mpz_init (k);
  mpz_init (p1);
  mpz_init (q1);

  /* Calculate k = ((p-1)(q-1)/4 + 1)/2 = ((p-1)(q-1) + 4)/8 */
  mpz_sub_ui (p1, sk->p, 1);
  mpz_sub_ui (q1, sk->q, 1);
  mpz_mul (k, p1, q1);
  mpz_add_ui (k, k, 4);
  mpz_fdiv_q_2exp (k, k, 3);

  /* Calculate kp = k % (p-1), and kq = k % (q-1) */
  mpz_mod (sk->kp, k, p1);
  mpz_mod (sk->kq, k, q1);

  /* Calculate u such that (uq) % p = 1 */
  mpz_invert (sk->u, sk->q, sk->p);

  mpz_clear (k);
  mpz_clear (p1);
  mpz_clear (q1);

  return 0;
}
static dckey *
rw_import_pub (const char *asc)
{
  rw_pub *pk;

  if (skip_str (&asc, rabin_1.name)
      || skip_str (&asc, ":Pub,n="))
    return NULL;

  pk = malloc (sizeof (*pk));
  mpz_init (pk->n);
  if (read_mpz (&asc, pk->n)) {
    rw_free_pub (&pk->key);
    return NULL;
  }

  pk->key.vptr = &rabin_1;
  pk->key.type = PUBLIC;
  pk->nbits = mpz_sizeinbase2 (pk->n) - rw_resvbits;
  return &pk->key;
}
示例#6
0
void
test_key_sign (esign_priv &sk)
{
  u_int64_t tmp, tmp2, tmp3;
  bool ret;
  for (int i = 0; i < 50; i++) {
    size_t len = rnd.getword () % 256;
    wmstr wmsg (len);
    rnd.getbytes (wmsg, len);
    str msg1 = wmsg;

    tmp = get_time ();
    bigint m = sk.sign (msg1);
    tmp2 = get_time ();
    ret = sk.verify (msg1, m);
    tmp3 = get_time ();

    vtime += (tmp3 - tmp2);
    signtime += (tmp2 - tmp);

    if (!ret)
      panic << "Verify failed\n"
	    << "  p = " << sk.p << "\n"
	    << "  q = " << sk.q << "\n"
	    << "msg = " << hexdump (msg1.cstr (), msg1.len ()) << "\n"
	    << "sig = " << m << "\n";
    int bitno = rnd.getword () % mpz_sizeinbase2 (&m);
    m.setbit (bitno, !m.getbit (bitno));
    if (sk.verify (msg1, m))
      panic << "Verify should have failed\n"
	    << "  p = " << sk.p << "\n"
	    << "  q = " << sk.q << "\n"
	    << "msg = " << hexdump (msg1.cstr (), msg1.len ()) << "\n"
	    << "sig = " << m << "\n";
  }
}