Exemplo n.º 1
0
def createTestCases(n):
	n=int(n)
	g1 = [[0] * n for i in range(n)]
	for i in range(0,rand.choice(range(n))*rand.choice(range(n))):
    		j=rand.choice(range(n))
    		k=rand.choice(range(n))
		g1[j][k]=g1[k][j]=1
	pi_orig = get_random_isomorphism (len(g1))
	gP = get_isomorphic_graph(g1, pi_orig)
	
	g2 = get_isomorphic_graph(g1, pi_orig)
	si={};
	si["VD"]=[];
	
	for i in range(0,rand.choice(range(n))):
    		j=rand.choice(range(n))
		si["VD"].append(j)
	si["VD"] = list(set(si["VD"]))
	si["VD"].sort(reverse=False);
	for i in si["VD"]:
		g2.insert(i,[0]*len(g2))
		for elements in g2:
			elements.insert(i,0)
			
	si["ER"]=[];
	
	for i in range(0,rand.choice(range(len(g2)))*rand.choice(range(len(g2)))):
    		j=rand.choice(range(len(g2)))
    		k=rand.choice(range(len(g2)))
		if (g2[j][k]==0):
			g2[j][k]=g2[k][j]=1
			si["ER"].append([j,k])
	
        
	fname = "../data/commonInput_%d.txt"%(n)
	fp = open(fname, 'w')
	gname = "../data/proverInput_%d.txt"%(n)
	gp = open(gname, 'w')
 	fp.write("%d\n"%len(g1))
	fp.write(commit.prettyPrintMatrixSpc(g1)+"\n")
 	fp.write("%d\n"%len(g2))
	fp.write(commit.prettyPrintMatrixSpc(g2)+"\n")

	gp.write("ER ")
	for elements in si["ER"]:
		gp.write(str(elements[0])+","+str(elements[1])+" ")
	gp.write("\n")
	gp.write("VD " + " ".join(map(str,si["VD"])) + "\n")
	gp.write(" ".join(map(str,pi_orig.values()))+"\n")

	gp1=get_subgraph(si, g2);
	gp2=get_isomorphic_graph(g1, pi_orig);

	print commit.prettyPrintMatrix(gp1)+"\n"
	print commit.prettyPrintMatrix(gp2)+"\n"
	print commit.prettyPrintMatrix(gP)+"\n"

	return g1,g2,pi_orig,si,gP
Exemplo n.º 2
0
def prover():
        if len(sys.argv) < 3:
                printUsage()
                return 1
        transcriptLocation = "."
        if len(sys.argv) == 4:
                transcriptLocation = sys.argv[3]

        if not os.path.exists(transcriptLocation):
                print "%s doesn't exist."%transcriptLocation
                print "Transcripts cannot be written. Exiting."
                return 1

        # Get Named Pipes
        pipeRd, pipeWr = getNamedPipes()

        # Parse Input Files
        commonInputFile = sys.argv[1]
        proverInputFile = sys.argv[2]
        g1, g2 = process.parse_input_file(commonInputFile)
        subgraphInducer, pi_original = process.parse_prover_input_file(proverInputFile)

        # Exchange Iteration Count and Identifier
        iterCount = int(process.readPipe(pipeRd))
        print "Number of Iterations: %d\n"%iterCount
        uid = process.readPipe(pipeRd).rstrip()

        for iteration in range(0,iterCount):
                # Protocol/Iteration Transcript
                fname = "%s/transcript_prover_iter_%d_%s.txt"%(transcriptLocation, iteration, uid)
                fp = open(fname, 'w')
                print "\n\nIteration number " + str(iteration)
                print "Transcript is being written to file %s"%(fname)

                # Generate random Isomorphism alpha and matrix Q=Alpha(G2)
                alpha = process.get_random_isomorphism(len(g2))
                q = process.get_isomorphic_graph(g2, alpha)
                print "Generated Random Isomorphism Alpha"

                # Send Commitment
                commitQ = Commit(q)
                (commitmentQ, randomAQ) = commitQ.getCommitment()
                fp.write("Commitment of matrix Q:\n" + commit.prettyPrintMatrix(commitmentQ) + "\n\n")
                fp.write("Matrix randomA:\n" + commit.prettyPrintMatrix(randomAQ) + "\n\n")
                process.writePipe(pipeWr, json.dumps(commitmentQ)+"\n")
                process.writePipe(pipeWr, json.dumps(randomAQ)+"\n")
                print "Commited to Q"

                # Get Coin Toss
                coin_toss = process.readPipe(pipeRd).rstrip();
                fp.write("Coint toss Result: " + coin_toss + "\n")
                print "Coin Toss Received '%s'"%coin_toss

                if coin_toss == 'h':
                        # Heads
                        # Reveal Isomorphism Alpha and secret random commitment matrix randomBQ 
                        randomBQ = commitQ.revealCommitment()
                        process.writePipe(pipeWr, json.dumps(alpha)+"\n")                        
                        process.writePipe(pipeWr, json.dumps(randomBQ)+"\n")
                        fp.write("Revealed Isomorphism alpha \n" + str(alpha) + "\n")
                        fp.write("Revealed matrix randomBQ \n" + commit.prettyPrintMatrix(randomBQ) + "\n\n")
                        print "Revealed Isomorphism Alpha and secret commitment matrix RandomB"
     
                else:   
                        # Tails otherwise
                        # Calculate Isomorphism Pi
                        pi, qP = process.get_iso_and_iso_subgraph(g1, g2, subgraphInducer, pi_original, alpha, q)
                        # Calculate partial secret random commitment matrix randomBQ_partial
                        subgraph_bool_matrix = process.get_boolean_matrix(q, process.apply_iso_on_subgph_indc(subgraphInducer, alpha))
                        randomBQ_partial = commitQ.revealCommitment(subgraph_bool_matrix)
                        # Send Isomorphism Pi, partial secret random commitment matrix randomBQ_partial and partial subgraph operator
                        process.writePipe(pipeWr, json.dumps(pi)+"\n")                        
                        process.writePipe(pipeWr, json.dumps(randomBQ_partial)+"\n")                        
                        process.writePipe(pipeWr, json.dumps(process.apply_iso_on_subgph_indc(subgraphInducer, alpha)["VD"])+"\n")                        
                        fp.write("Revealed Isomorphism Pi \n" + str(pi) + "\n")
                        fp.write("Revealed Partial matrix randomBQ_partial \n" + commit.prettyPrintMatrix(randomBQ_partial) + "\n")
                        fp.write("Revealed Vertex Deletion Info \n" + str(process.apply_iso_on_subgph_indc(subgraphInducer, alpha)["VD"]) + "\n")
                        print "Revealed Subgraph Isomorphism Pi, Partial Random Commitment matrix RandomB and Vertex Deletion Information"
Exemplo n.º 3
0
def verifier():
	# Get Named Pipes
	pipeRd, pipeWr = getNamedPipes()

	if len(sys.argv) != 2:
		printUsage()
		return 1

	# Parse Input Files
	commonInputFile = sys.argv[1]
	g1, g2 = process.parse_input_file(commonInputFile)
	
	# Exchange Iteration Count and Identifier
	iterCount=int(raw_input('Enter Number of Iterations: '))
	process.writePipe(pipeWr, "%d\n"%iterCount)
	uid = uuid4().hex
	process.writePipe(pipeWr, "%s\n"%uid)

	for iteration in range(0,iterCount):
		# Protocol/Iteration Transcript
		fname = "../transcripts/transcript_verifier_iter_%d_%s.txt"%(iteration,uid)
                fp = open(fname, 'w')
                print "\n\nIteration number " + str(iteration+1)
                print "Transcript is being written to file %s"%(fname)

		# Receive Commitment
		commitmentQ = json.loads(process.readPipe(pipeRd).rstrip())		
		randomAQ = json.loads(process.readPipe(pipeRd).rstrip())		
                fp.write("Commitment of matrix Q:\n" + commit.prettyPrintMatrix(commitmentQ) + "\n\n")
                fp.write("Matrix randomA:\n" + commit.prettyPrintMatrix(randomAQ) + "\n\n")
                print "Received Commitment for Q"
		
		# Toss a Coin
		coin_toss = raw_input("Say H(ead)/T(tail):  ").strip()[0].lower()
		process.writePipe(pipeWr, "%s\n"%coin_toss)
                fp.write("Coint toss Result: " + coin_toss + "\n")
                print "Coin Toss Sent '%s'"%coin_toss

		if coin_toss == 'h':
			# Heads
			# Receive Isomorphism Alpha and secret random commitment matrix randomBQ
			alpha = cleanDict(json.loads(process.readPipe(pipeRd).rstrip()))		
			randomBQ = json.loads(process.readPipe(pipeRd).rstrip())
			# Check: Commitment(Q) matches Q=Alpha(G2)
			check = commit.verifyCommitment(randomAQ, randomBQ, commitmentQ, process.get_isomorphic_graph(g2, alpha))		
			fp.write("Received Isomorphism alpha \n" + str(alpha) + "\n")
                        fp.write("Received matrix randomBQ \n" + commit.prettyPrintMatrix(randomBQ) + "\n\n")
                        print "Received Isomorphism Alpha and secret commitment matrix RandomB"

		else:	
			# Tails otherwise
			# Receive Isomorphism Pi, partial secret random commitment matrix randomBQ_partial and partial subgraph operator
			pi = cleanDict(json.loads(process.readPipe(pipeRd).rstrip()))		
			randomBQ_partial = json.loads(process.readPipe(pipeRd).rstrip())		
			# Only Vertex Deletion Information is sent in the subgraph operator, the edge removal information is hidden to ensure zero-knowledge
			si={"ER":[]}
			si["VD"] = json.loads(process.readPipe(pipeRd).rstrip())
			# Check: Commitment(Subgraph(Q)) matches Q'=Pi(G1)
			check = commit.verifyCommitment(process.get_subgraph(si, randomAQ), process.get_subgraph(si, randomBQ_partial), process.get_subgraph(si, commitmentQ), process.get_isomorphic_graph(g1, pi))
			fp.write("Received Isomorphism Pi \n" + str(pi) + "\n")
                        fp.write("Received Partial matrix randomBQ_partial \n" + commit.prettyPrintMatrix(randomBQ_partial) + "\n")
                        fp.write("Received Vertex Deletion Info \n" + str(si["VD"]) + "\n")
                        print "Received Subgraph Isomorphism Pi, Partial Random Commitment matrix RandomB and Vertex Deletion Information"


		if (not check):
			fp.write("Check Failed\n")
			print("Check Failed\n")
			break
		else:	
			fp.write("Check Succeded\n")
			print("--------Check Successful---------")
			print("---------------------------------")
			print "Probability that Prover knows the Subgraph: %0.4f\n\n"%(100*(1.0-(1.0/2**(iteration+1))))