def SEQ(self, M, bitlen=None): pad = Nullpadding(3072) B = [ struct.unpack('>48Q', X) for X in pad.iterblocks(M, bitlen=bitlen) ] j = len(B) z = 0 d, keylen, L, r = self.size, self.keylen, self.L, self.rounds V = Bits(d, 12) // Bits(keylen, 8) // Bits(0, 16) // Bits( z, 4) // Bits(L, 8) // Bits(r, 12) // Bits(0, 4) C = Poly(0, 64, dim=16) W = Poly(Q, 64, dim=89) // Poly(self.K, 64) W.dim = 89 W[24] = V U = (self.L + 1) << 56 for i in range(j): if i == (j - 1): V[20:36] = pad.padcnt V[36:40] = Bits(1, 4) W[24] = V W[23] = U + i W[25:41] = C W[41:89] = B[i] C = self.f(W) h = concat(list(C)[::-1]) h.size = self.size return pack(h, '>L')
def initstate(self, salt=b'', pers=b'', keylen=0, **kargs): super(Blake2, self).initstate(0) self.padmethod = Nullpadding(self.blocksize) self.outlen = kargs.get('outlen', self.outlen) self.rounds = 12 if self.size > 256 else 10 l = self.wsize // 4 if salt is b'': salt = b'\0' * l if pers is b'': pers = b'\0' * l self.keylen = keylen assert 0 < self.outlen <= self.wsize assert self.keylen <= self.wsize self.treeinit(**kargs) self.paramblock(salt, pers)
def PAR(self, l, M, bitlen=None): pad = Nullpadding(4096) B = [ struct.unpack('>64Q', X) for X in pad.iterblocks(M, bitlen=bitlen) ] j = len(B) z = 1 if j == 1 else 0 d, keylen, L, r = self.size, self.keylen, self.L, self.rounds V = Bits(d, 12) // Bits(keylen, 8) // Bits(0, 16) // Bits( z, 4) // Bits(L, 8) // Bits(r, 12) // Bits(0, 4) C = [] W = Poly(Q, 64) // Poly(self.K, 64) W.dim = 89 W[24] = V for i in range(j): if i == (j - 1): V[20:36] = pad.padcnt W[24] = V U = (l << 56) + i W[23] = U W[25:89] = B[i] C.append(self.f(W)) Ml = concat(C) return b''.join((pack(c, '>L') for c in Ml))