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
Ejemplo n.º 2
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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)