def test_verified_insert(self): """ Test that verified insert actually allows the client to compute the new root label. """ lower_bound = -1000 upper_bound = 1000 num_elems = 10 num_new_elems = 150 for i in range(0, self.num_iters): elems = gen_elems(lower_bound, upper_bound, num_elems) elems = set(elems) sl = AuthSkipList.new(elems, IntElem(lower_bound-1), IntElem(upper_bound+1)) old_label = sl.root.label new_elems = gen_elems(lower_bound, upper_bound, num_new_elems) new_elems = [elem for elem in new_elems if elem not in elems] for elem in new_elems: print 'inserting elem %d' %elem.key print 'into list %s' %str(sl.to_list_of_lists()) ret_elems, proof, proof_diff = sl.insert_with_diff(elem) print 'result list: %s' %str(sl.to_list_of_lists()) self.assertEqual( AuthSkipList.verify( [AuthNode._hash(e.serialize()) for e in reversed(ret_elems)] + proof), old_label) new_proof = AuthSkipList.update_query( ret_elems, proof, proof_diff, elem) x, qproof = sl.contains(elem) self.assertTrue(x, 'Claims just-inserted element is not in list') self.assertEqual(AuthSkipList.verify(qproof), sl.root.label) np = AuthSkipList.verify(new_proof) print 'Root label: %s' %str(sl.root.label) print 'Recv label: %s' %str(np) self.assertEqual(np, sl.root.label) old_label = sl.root.label
def test_non_membership_comp(self): """ Ensure that non-elements of the skip list are not in it, comparing the results to the authenticated skip list. """ for i in xrange(0, 10 * self.num_iters): elems = map(IntElem, self.generate_elems(0, 25, 5)) esl = EmbeddedSkipList.new(elems, IntElem(-201), IntElem(201), coin=HashCoin(), conn_info=None) asl = AuthSkipList.new(elems, IntElem(-201), IntElem(201), coin=HashCoin()) bad_elem = IntElem(random.randint(-100, 100)) while bad_elem in elems: bad_elem = IntElem(random.randint(-100, 100)) bad_elems = [IntElem(-150), IntElem(150), bad_elem] for elem in bad_elems: evisited, eclosest = esl.root.search(elem) avisited, aclosest = asl.root.search(elem) new = [] for n, f in evisited: new.append((n, f)) evisited = new eelems, eproof = esl.do_query(evisited, eclosest, elem) aelems, aproof = asl.do_query(avisited, aclosest, elem) efound = eelems[0] == elem afound = aelems[0] == elem eproof = [ AuthNode._hash(x.serialize()) for x in reversed(eelems) ] + eproof aproof = [ AuthNode._hash(x.serialize()) for x in reversed(aelems) ] + aproof self.assertEqual(efound, afound) self.assertTrue(not efound) self.assertEqual(AuthSkipList.verify(aproof), asl.root.label) self.assertEqual(EmbeddedSkipList.verify(eproof), esl.root.label) # Make sure the embedded one isn't cheating somehow self.assertEqual(esl.root.label, asl.root.label)
def test_verify_in(self): """ Ensure that proofs of membership validate. """ for i in range(0, self.num_iters): elems = gen_elems(-100, 100, 50) sl = AuthSkipList.new(elems, IntElem(-101), IntElem(101)) for elem in elems: found, proof = sl.contains(elem) self.assertEqual(AuthSkipList.verify(proof), sl.root.label)
def test_non_membership(self): """ Ensure that non-elements of the skip list are not in it """ for i in range(0, 10 * self.num_iters): elems = gen_elems(0, 25, 5) sl = AuthSkipList.new(elems, IntElem(-201), IntElem(201)) found, proof = sl.contains(IntElem(-150)) verification = AuthSkipList.verify(proof) self.assertEqual(verification, sl.root.label) found, proof = sl.contains(IntElem(150)) self.assertEqual(AuthSkipList.verify(proof), sl.root.label) bad_elem = IntElem(random.randint(-100, 100)) while bad_elem in elems: bad_elem = IntElem(random.randint(-100, 100)) found, proof = sl.contains(bad_elem) self.assertEqual(AuthSkipList.verify(proof), sl.root.label, 'proof of absence of %d fails to verify' %bad_elem.key)
def test_comparison_to_auth(self): """ Test embedded list and authenticated list side-by-side to see where the former goes wrong. Mostly here for debugging. """ for i in xrange(0, self.num_iters): elems = map(IntElem, self.generate_elems(0, 50, 10)) esl = EmbeddedSkipList.new(elems, IntElem(-1), IntElem(101), coin=HashCoin(), conn_info=None) asl = AuthSkipList.new(elems, IntElem(-1), IntElem(101), coin=HashCoin()) for elem in elems: evisited, eclosest = esl.root.search(elem) avisited, aclosest = asl.root.search(elem) new = [] for n, f in evisited: new.append((n, f)) evisited = new eelems, eproof = esl.do_query(evisited, eclosest, elem) aelems, aproof = asl.do_query(avisited, aclosest, elem) efound = eelems[0] == elem afound = aelems[0] == elem eproof = [ AuthNode._hash(x.serialize()) for x in reversed(eelems) ] + eproof aproof = [ AuthNode._hash(x.serialize()) for x in reversed(aelems) ] + aproof # Make sure the embedded one isn't cheating somehow self.assertEqual(esl.root.label, asl.root.label) self.assertEqual(AuthSkipList.verify(aproof), asl.root.label) self.assertEqual(EmbeddedSkipList.verify(eproof), esl.root.label) # Make sure the embedded one isn't cheating somehow self.assertEqual(esl.root.label, asl.root.label)
def test_remote_batch_insert_hash_coin(self): for i in range(0, self.num_iters): elems = map(IntElem, self.generate_elems()) elems.sort() sl = AuthSkipList.new(elems, IntElem(elems[0].key - 1), IntElem(elems[-1].key + 1), HashCoin()) old_root = sl.root.label self.assertEqual(len(sl.to_list_of_lists()[-1]) - 2, self.size) ## Generate a small number (in this case, n/10) of random elements ## between the minimum and maximum elements (not including the ## boundary elements) to insert. new_elems = [ IntElem(random.randint(elems[1].key, elems[-2].key)) for i in range(0, self.size / 10) ] new_elems = map( IntElem, self.generate_elems(elems[1].key, elems[-2].key, self.size / 10)) min_ne = min(new_elems) max_ne = max(new_elems) vo = SkipListVO.range_query(sl, min_ne, max_ne, HashCoin()) try: ret_elems = vo.verify(min_ne, max_ne, sl.root.label) except VerificationObjectException as e: self.assertTrue(False, 'Error: %s' % e.msg) self.assertEqual(ret_elems, [x for x in elems if min_ne <= x <= max_ne]) self.assertEqual(vo.root.label, sl.root.label) with HashSocketSLClient.new(elems, IntElem(elems[0].key - 1), IntElem(elems[-1].key + 1), IntElem, self.host, self.port) as client: lower = random.choice(elems[1:self.size / 3]) upper = random.choice(elems[2 * self.size / 3:-1]) self.assertEqual(SkipListVO.range_query(sl, lower, upper), client.range_query(lower, upper)) self.assertEqual(SkipListVO.range_query(sl, min_ne, max_ne), client.range_query(min_ne, max_ne)) for elem in new_elems: vo.insert(elem) for elem in new_elems: sl.insert(elem) self.assertEqual(sl.root.label, vo.root.label) try: new_root = client.batch_insert(old_root, new_elems, min_ne, max_ne) except VerificationObjectException as e: self.assertTrue(False, 'Error: %s' % e.msg) self.assertEqual(new_root, vo.root.label) self.assertEqual(sl.root.label, new_root) self.assertEqual( len(sl.to_list_of_lists()[-1]) - 2, self.size + (self.size / 10)) for elem in new_elems: proof = client.query(elem) self.assertEqual(proof, sl.contains(elem)) self.assertEqual(AuthSkipList.verify(proof[1]), sl.root.label)
def test_remote_batch_insert_helper(self): for i in range(0, self.num_iters): orig_seed = random.randint(0, 10000000) elems = map(IntElem, self.generate_elems()) elems.sort() sl = AuthSkipList.new(elems, IntElem(elems[0].key - 1), IntElem(elems[-1].key + 1), SeededCoin(orig_seed)) new_elems = [ IntElem(random.randint(elems[1].key, elems[-2].key)) for i in range(0, 2) ] min_ne = min(new_elems) max_ne = max(new_elems) while min_ne == max_ne: new_elems = [ IntElem(random.randint(elems[1].key, elems[-2].key)) for i in range(0, 2) ] min_ne = min(new_elems) max_ne = max(new_elems) vo = SkipListVO.range_query(sl, min_ne, max_ne) try: ret_elems = vo.verify(min_ne, max_ne, sl.root.label) except VerificationObjectException as e: self.assertTrue(False, 'Error: %s' % e.msg) seed = random.randint(0, 1000000) vo.coin = SeededCoin(seed) sl.coin = SeededCoin(seed) self.assertEqual(vo.root.label, sl.root.label) orig_label = sl.root.label for elem in new_elems: vo.insert(elem) sl.insert(elem) self.assertEqual(sl.root.label, vo.root.label, 'failed on index %d' % new_elems.index(elem)) self.assertEqual(sl.root.label, vo.root.label) with SeededSocketSLClient.new(elems, IntElem(elems[0].key - 1), IntElem(elems[-1].key + 1), orig_seed, IntElem, self.host, self.port) as client: try: new_root = client.batch_insert(orig_label, new_elems, min_ne, max_ne, seed) except VerificationObjectException as e: self.assertTrue(False, 'Error: %s' % e.msg) self.assertEqual(new_root, vo.root.label) self.assertEqual(sl.root.label, new_root) self.assertEqual( len(sl.to_list_of_lists()[-1]) - 2, len(elems) + len(new_elems)) for elem in new_elems: proof = client.query(elem) self.assertEqual(proof, sl.contains(elem)) self.assertEqual(AuthSkipList.verify(proof[1]), sl.root.label)