Exemplo n.º 1
0
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])
Exemplo n.º 2
0
Arquivo: md.py Projeto: bdcht/crysp
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])
Exemplo n.º 3
0
Arquivo: md.py Projeto: bdcht/crysp
 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)
Exemplo n.º 4
0
 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)