class MD4(object): def __init__(self): self.size = 128 self.blocksize = 512 self.wsize = 32 # set functions and constants: f = lambda x, y, z: z ^ (x & (y ^ z)) g = lambda x, y, z: (x & y) | (x & z) | (y & z) h = lambda x, y, z: x ^ y ^ z self.ft = [f, g, h] self.K = [0, 0x5a827999, 0x6ed9eba1] self.st = [(3, 7, 11, 19), (3, 5, 9, 13), (3, 9, 11, 15)] self.initstate() def initstate(self): H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476] self.H = [Bits(v, self.wsize) for v in H] self.padmethod = MDpadding(self.blocksize, self.wsize) def iterblocks(self, M, bitlen=None, padding=False): for B in self.padmethod.iterblocks(M, bitlen=bitlen, padding=padding): W = Bits(B, bitorder=1) yield W.split(self.wsize) def __call__(self, M, bitlen=None): self.initstate() return self.update(M, bitlen=bitlen, padding=True) def update(self, M, bitlen=None, padding=False): for W in self.iterblocks(M, bitlen=bitlen, padding=padding): a, b, c, d = self.H assert len(W) == 16 W.extend([ W[i] for i in (0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15) ]) W.extend([ W[i] for i in (0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15) ]) for i in range(3 * 16): r = i // 16 T = rol(a + self.ft[r](b, c, d) + W[i] + self.K[r], self.st[r][i % 4]) a = d d = c c = b b = T self.H[0] += a self.H[1] += b self.H[2] += c self.H[3] += d return b''.join([pack(h) for h in self.H])
class MD4(object): def __init__(self): self.size = 128 self.blocksize = 512 self.wsize = 32 # set functions and constants: f = lambda x,y,z: z^(x&(y^z)) g = lambda x,y,z: (x&y)|(x&z)|(y&z) h = lambda x,y,z: x^y^z self.ft = [f,g,h] self.K = [0,0x5a827999,0x6ed9eba1] self.st = [(3,7,11,19),(3,5,9,13),(3,9,11,15)] self.initstate() def initstate(self): H = [0x67452301,0xefcdab89,0x98badcfe,0x10325476] self.H = [Bits(v,self.wsize) for v in H] self.padmethod = MDpadding(self.blocksize,self.wsize) def iterblocks(self,M,bitlen=None,padding=False): for B in self.padmethod.iterblocks(M,bitlen=bitlen,padding=padding): W = Bits(B,bitorder=1) yield W.split(self.wsize) def __call__(self,M,bitlen=None): self.initstate() return self.update(M,bitlen=bitlen,padding=True) def update(self,M,bitlen=None,padding=False): for W in self.iterblocks(M,bitlen=bitlen,padding=padding): a,b,c,d = self.H assert len(W)==16 W.extend([W[i] for i in (0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15)]) W.extend([W[i] for i in (0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15)]) for i in range(3*16): r = i//16 T = rol(a+self.ft[r](b,c,d)+W[i]+self.K[r],self.st[r][i%4]) a = d d = c c = b b = T self.H[0] += a self.H[1] += b self.H[2] += c self.H[3] += d return b''.join([pack(h) for h in self.H])
def initstate(self): H = [0x67452301,0xefcdab89,0x98badcfe,0x10325476] self.H = [Bits(v,self.wsize) for v in H] self.padmethod = MDpadding(self.blocksize,self.wsize)
def initstate(self): H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476] self.H = [Bits(v, self.wsize) for v in H] self.padmethod = MDpadding(self.blocksize, self.wsize)