Пример #1
0
    def test_genseed(self):
        "test genseed()"
        import random
        from passlib.utils import genseed
        rng = random.Random(genseed())
        a = rng.randint(0, 100000)

        rng = random.Random(genseed())
        b = rng.randint(0, 100000)

        self.assertNotEqual(a, b)

        rng.seed(genseed(rng))
Пример #2
0
    def test_genseed(self):
        "test genseed()"
        import random
        from passlib.utils import genseed
        rng = random.Random(genseed())
        a = rng.randint(0, 100000)

        rng = random.Random(genseed())
        b = rng.randint(0, 100000)

        self.assertNotEqual(a,b)

        rng.seed(genseed(rng))
Пример #3
0
 def test_repair_unused(self):
     "test repair_unused()"
     # NOTE: this test relies on encode_bytes() always returning clear
     # padding bits - which should be ensured by test vectors.
     from passlib.utils import rng, getrandstr
     engine = self.engine
     check_repair_unused = self.engine.check_repair_unused
     i = 0
     while i < 300:
         size = rng.randint(0, 23)
         cdata = getrandstr(rng, engine.charmap, size).encode("ascii")
         if size & 3 == 1:
             # should throw error
             self.assertRaises(ValueError, check_repair_unused, cdata)
             continue
         rdata = engine.encode_bytes(engine.decode_bytes(cdata))
         if rng.random() < .5:
             cdata = cdata.decode("ascii")
             rdata = rdata.decode("ascii")
         if cdata == rdata:
             # should leave unchanged
             ok, result = check_repair_unused(cdata)
             self.assertFalse(ok)
             self.assertEqual(result, rdata)
         else:
             # should repair bits
             self.assertNotEqual(size % 4, 0)
             ok, result = check_repair_unused(cdata)
             self.assertTrue(ok)
             self.assertEqual(result, rdata)
         i += 1
Пример #4
0
 def test_repair_unused(self):
     "test repair_unused()"
     # NOTE: this test relies on encode_bytes() always returning clear
     # padding bits - which should be ensured by test vectors.
     from passlib.utils import rng, getrandstr
     engine = self.engine
     check_repair_unused = self.engine.check_repair_unused
     i = 0
     while i < 300:
         size = rng.randint(0,23)
         cdata = getrandstr(rng, engine.charmap, size).encode("ascii")
         if size & 3 == 1:
             # should throw error
             self.assertRaises(ValueError, check_repair_unused, cdata)
             continue
         rdata = engine.encode_bytes(engine.decode_bytes(cdata))
         if rng.random() < .5:
             cdata = cdata.decode("ascii")
             rdata = rdata.decode("ascii")
         if cdata == rdata:
             # should leave unchanged
             ok, result = check_repair_unused(cdata)
             self.assertFalse(ok)
             self.assertEqual(result, rdata)
         else:
             # should repair bits
             self.assertNotEqual(size % 4, 0)
             ok, result = check_repair_unused(cdata)
             self.assertTrue(ok)
             self.assertEqual(result, rdata)
         i += 1
Пример #5
0
 def _prepare_rounds(self, handler, opts, settings):
     "helper for prepare_default_settings"
     mn = opts.get("min_rounds")
     mx = opts.get("max_rounds")
     rounds = settings.get("rounds")
     if rounds is None:
         df = opts.get("default_rounds") or mx or mn
         if df is not None:
             vr = opts.get("vary_rounds")
             if vr:
                 if isinstance(vr, str):
                     rc = getattr(handler, "rounds_cost", "linear")
                     vr = int(vr.rstrip("%"))
                         #NOTE: deliberately strip >1 %,
                         #in case an interpolation-escaped %%
                         #makes it through to here.
                     assert 0 <= vr < 100
                     if rc == "log2":
                         #let % variance scale the number of actual rounds, not the logarithmic value
                         df = 2**df
                         vr = int(df*vr/100)
                         lower = int(logb(df-vr,2)+.5) #err on the side of strength - round up
                         upper = int(logb(df+vr,2))
                     else:
                         assert rc == "linear"
                         vr = int(df*vr/100)
                         lower = df-vr
                         upper = df+vr
                 else:
                     lower = df-vr
                     upper = df+vr
                 if lower < 1:
                     lower = 1
                 if mn and lower < mn:
                     lower = mn
                 if mx and upper > mx:
                     upper = mx
                 if lower > upper:
                     #NOTE: this mainly happens when default_rounds>max_rounds, which shouldn't usually happen
                     rounds = upper
                     warn("vary default rounds: lower bound > upper bound, using upper bound (%d > %d)" % (lower, upper))
                 else:
                     rounds = rng.randint(lower, upper)
             else:
                 rounds = df
     if rounds is not None:
         if mx and rounds > mx:
             rounds = mx
         if mn and rounds < mn: #give mn predence if mn > mx
             rounds = mn
         settings['rounds'] = rounds
Пример #6
0
    def _random_parity(self, key):
        "randomize parity bits"
        from passlib.utils.des import _KDATA_MASK, _KPARITY_MASK, INT_64_MASK
        from passlib.utils import rng

        return (key & _KDATA_MASK) | (rng.randint(0, INT_64_MASK) & _KPARITY_MASK)
Пример #7
0
 def _random_parity(self, key):
     "randomize parity bits"
     from passlib.utils.des import _KDATA_MASK, _KPARITY_MASK, INT_64_MASK
     from passlib.utils import rng
     return (key & _KDATA_MASK) | (rng.randint(0, INT_64_MASK)
                                   & _KPARITY_MASK)