def split(self, secret, deterministic=True): if secret >= self.P: raise ValueError("secret must be smaller than P") prng = Prng(deterministic=deterministic) prng.addEntropy(secret.to_bytes(512, byteorder="big")) a = [0] * self.k a[0] = secret for i in range(1, self.k): a[i] = prng.getRandomLong(512) % self.P x = [] for i in range(self.n): while True: r = int(prng.getRandomLong(16)) if r != 0 and r not in x: x += [r] break y = [0] * self.n for i in range(self.n): y[i] = Shamir.fPoly(x[i], a, self.P) shares = [] for i in range(self.n): shares += [(x[i], y[i])] return shares
def test_deterministic_Prng_2_2(self): prng = Prng(deterministic=True) prng.addEntropy(b"entropy") value = prng.getRandomLong(32) expected = 1783747816 self.assertEqual( value, expected, "Prng not deterministic (expected: %d, got: %d)" % (expected, value))
def encode(self, share): prng = Prng(deterministic=self.deterministic) prng.addEntropy(share[0].to_bytes(512, byteorder="big") + share[1].to_bytes(512, byteorder="big")) result = b"" result += bytes([prng.getRandomLong(8) & 0xF0 | self.version]) result += bytes([prng.getRandomLong(8) & 0xF0 | self.k]) result += rawFromLong(share[0], 16) result += rawFromLong(share[1], self.width) return result
def genKey(label, seed=None): prng = Prng(deterministic=True, seed=seed) prng.addEntropy(label.encode("utf-8")) prng.skip(64 * 100000) return prng.getRandomBytes(32)