Esempio n. 1
0
def query(password, w, t, server=defaultServer, previousPubkey=None):
    """
    Queries the a Pythia PRF service and verifies the server's ZKP.
    @returns (z,p) where: @z is the encrypted password and @p is the
        server's pubkey bound to clientId

    Raises an exception if there are any problems interacting with the service
        or if the server's ZKP fails verification.
    """
    # Blind the password
    r, x = vpop.blind(password)
    xSerialized = vpop.wrap(x)

    # Query the service via HTTP(S) GET
    response = fetch(queryUrlTemplate.format(server, w, t, xSerialized))

    # Grab the required fields from the response.
    p, y, c, u = extract(response, ["p", "y", "c", "u"])

    # Check the pubkey
    if previousPubkey and previousPubkey != p:
        print "previous: " + previousPubkey
        print "p: " + p
        raise Exception(
            "Server-provided pubkey doesn't match previous pubkey.")

    # Deserialize the response fields
    p, y, c, u = (vpop.unwrapP(p), vpop.unwrapY(y), vpop.unwrapC(c),
                  vpop.unwrapU(u))

    pi = (p, c, u)

    # Verify the result by checking the proof
    vpop.verify(x, t, y, pi)

    # Deblind the result
    z = vpop.deblind(r, y)

    # Return the important fields in serialied form
    z, p = vpop.wrap(z), vpop.wrap(p)
    return z, p
Esempio n. 2
0
def query(password, w, t, server=defaultServer, previousPubkey=None):
    """
    Queries the a Pythia PRF service and verifies the server's ZKP.
    @returns (z,p) where: @z is the encrypted password and @p is the
        server's pubkey bound to clientId

    Raises an exception if there are any problems interacting with the service
        or if the server's ZKP fails verification.
    """
    # Blind the password
    r,x = vpop.blind(password)
    xSerialized = vpop.wrap(x)

    # Query the service via HTTP(S) GET
    response = fetch(queryUrlTemplate.format(server,w,t,xSerialized))

    # Grab the required fields from the response.
    p,y,c,u = extract(response, ["p","y","c","u"])

    # Check the pubkey
    if previousPubkey and previousPubkey != p:
        print "previous: " + previousPubkey
        print "p: "+ p
        raise Exception("Server-provided pubkey doesn't match previous pubkey.")

    # Deserialize the response fields
    p,y,c,u = (vpop.unwrapP(p), vpop.unwrapY(y), 
            vpop.unwrapC(c), vpop.unwrapU(u))

    pi = (p,c,u)

    # Verify the result by checking the proof
    vpop.verify(x, t, y, pi)

    # Deblind the result
    z = vpop.deblind(r,y)

    # Return the important fields in serialied form
    z,p = vpop.wrap(z), vpop.wrap(p)
    return z,p
Esempio n. 3
0
File: tests.py Progetto: ace0/pythia
    def testProof(self):
        """
        Ensures the proof is valid.
        """
        # Make an eval request
        r,x = vpop.blind(pw)
        xWrap = vpop.wrap(x)
        url = VpopEvalTest.urlTemplate.format(w,t,xWrap)
        r = self.parseResponse(self.client.get(url))

        # Deserialize the items needed to verify the proof.
        y = vpop.unwrapY(r["y"])
        pi = (vpop.unwrapP(r["p"]), vpop.unwrapC(r["c"]), vpop.unwrapU(r["u"]) )

        # Test the proof
        self.assertTrue( vpop.verify(x, t, y, pi) )