Пример #1
0
def PolyVerify(ck, pk, m, n1, n2, x, v, pi, commitfunction=Commitment.commit):
    G, key = ck
    g = G.generator()
    p = G.order()
    H, BP, BPP = pk
    Hscale, Zh, Zb = pi
    try:
        xi = x.mod_inverse(p)
        #print 'Bn path succeeded'
    except AttributeError:
        #print 'Generic path'
        xi = _invert(x, p)

    Cleft = reduce(operator.add, [pow(x, i, p) * H[i] for i in xrange(len(H))])
    #print 'x=',x
    #print Hscale
    #print v
    #print [xss%p for xss in Hscale]
    Cright = commitfunction(ck, Hscale, Zh)
    if not Cleft == Cright:
        print 'Verification Failed (1)'
        return 0
    Cleft2 = x * BP - xi * BPP
    ppoly = LPoly(Hscale[:n1], mod=p)
    npoly = LPoly(Hscale[-n2:], mod=p)
    assert len(ppoly) == n1
    assert len(npoly) == n2
    rv1 = ppoly.eval(pow(x, m, p)) * x

    #print 'rv1sc',x
    #print 'rv1e ',ppoly.eval(pow(x,m,p))
    rv2 = npoly.eval(pow(x, m, p)) * pow(xi, m * n2 + 1, p)
    #print 'rv2sc',pow(xi,m*n2+1,p)
    #print 'rv2e ',npoly.eval(pow(xi,m,p))

    rval2 = (rv1 + rv2 - v) % p
    #print 'diff==',(rv1+rv2-v)%p
    #print 'rval2=',rval2,ppoly,'=',rv1,npoly,'=',rv2
    Cright2 = commitfunction(ck, [rval2], Zb)
    if not Cleft2 == Cright2:
        print 'Verification Failed (2)'
        return 0
    print 'Verification successful'
    return 1
Пример #2
0
def test_aio():
    nn2 = Bn(50000).random() + 10
    nn1 = Bn(50000).random() + 10
    m = int(math.sqrt(int(max(nn1, nn2))))
    n1 = int(math.ceil(int(nn1 / m))) + 1
    n2 = int(math.ceil(int(nn2 / m))) + 1

    assert m * n1 >= nn1
    assert m * n2 >= nn2

    ck = commitment_key_gen(n1 + n2)
    G, key = ck
    g = G.generator()
    p = G.order()

    np = [Bn(2**20).random() for c in xrange(nn2)]
    h = LPoly(np, deg=-len(np), mod=p)
    h.append(0)
    np = [Bn(2**20).random() for c in xrange(nn1)]
    h = h + LPoly(np, deg=1, mod=p)

    #h=LPoly([-3,-2,-1,0,1,2,3,4,5,6,7,8],deg=-3,mod=p)
    #h=LPoly([3,0,5],deg=-1,mod=23)
    #h=LPoly([100,-10,4,5],deg=8,mod=p)
    #h=LPoly([100],deg=1,mod=p)

    x0 = p.random()
    #print h.pp()
    pk, sk = PolyCommit(ck, m, n1, n2, h)
    print 'Commit Ok'

    v, pi = PolyEval(ck, sk, x0)
    #print  v,h.eval(x0)
    assert v == h.eval(x0)
    print 'Eval Ok'

    ver = PolyVerify(ck, pk, m, n1, n2, x0, v, pi)
    assert ver == 1
    #print 'h(x)=',h.pp()
    print 'x0=', x0
    print 'p=', p
Пример #3
0
def test_eval():
    from numpy import fft
    x = LPoly([1], 1)
    y = LPoly([0, 1])
    assert (y * y).eval(1) == 1
    assert x.eval(0) == 0
    x = Bn.from_binary(b"10000adadadadada000001").random()
    print x
    #x=Bn(1)
    m = Bn.from_binary(b"10000adadadadadad000001").random()
    p = LPoly([1, 1], mod=m)
    q = LPoly([1, 1])
    q5 = q * q * q * q * q
    p5 = p * p * p * p * p
    rh = p * p
    assert rh == p.fft_mul(p)
    assert p5 == q5  #only for small coeffs
    assert q5.eval(x) % m == pow(x + 1, 5, m)
    assert (p * p * p * p * p).eval(x) % m == pow(
        x + 1, 5,
        m)  #this should not be needed but it might help pin down bugs
    assert (p * p * p * p * p).eval(x) == pow(x + 1, 5, m)
    assert LPoly([1], -1, 13).eval(5) == 8
    assert LPoly([1], -1, 13).eval(Bn(5)) == 8