home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __license__ = 'GPL v3'
- __copyright__ = '2008, Marshall T. Vandegrift <llasram@gmail.com>'
- import struct
- import copy
-
- def _long2bytesBigEndian(n, blocksize = 0):
- s = ''
- pack = struct.pack
- while n > 0:
- s = pack('>I', n & 0xFFFFFFFFL) + s
- n = n >> 32
- for i in range(len(s)):
- if s[i] != '\x00':
- break
- continue
- else:
- s = '\x00'
- i = 0
- s = s[i:]
- if blocksize > 0 and len(s) % blocksize:
- s = (blocksize - len(s) % blocksize) * '\x00' + s
-
- return s
-
-
- def _bytelist2longBigEndian(list):
- imax = len(list) / 4
- hl = [
- 0x0L] * imax
- j = 0
- i = 0
- while i < imax:
- b0 = long(ord(list[j])) << 24
- b1 = long(ord(list[j + 1])) << 16
- b2 = long(ord(list[j + 2])) << 8
- b3 = long(ord(list[j + 3]))
- hl[i] = b0 | b1 | b2 | b3
- i = i + 1
- j = j + 4
- return hl
-
-
- def _rotateLeft(x, n):
- return x << n | x >> 32 - n
-
-
- def f0_19(B, C, D):
- return B & (C ^ D) ^ D
-
-
- def f20_39(B, C, D):
- return B ^ C ^ D
-
-
- def f40_59(B, C, D):
- return (B | C) & D | B & C
-
-
- def f60_79(B, C, D):
- return B ^ C ^ D
-
-
- def f6_42(B, C, D):
- return B + C ^ C
-
- f = [
- f0_19] * 20 + [
- f20_39] * 20 + [
- f40_59] * 20 + [
- f60_79] * 20
- f[3] = f20_39
- f[6] = f6_42
- f[10] = f20_39
- f[15] = f20_39
- f[26] = f0_19
- f[31] = f40_59
- f[42] = f6_42
- f[51] = f20_39
- f[68] = f0_19
- K = [
- 0x5A827999L,
- 0x6ED9EBA1L,
- 0x8F1BBCDCL,
- 0xCA62C1D6L]
-
- class mssha1(object):
-
- def __init__(self):
- self.length = 0x0L
- self.count = [
- 0,
- 0]
- self.input = []
- self.init()
-
-
- def init(self):
- self.length = 0x0L
- self.input = []
- self.H0 = 0x32107654L
- self.H1 = 0x23016745L
- self.H2 = 0xC4E680A2L
- self.H3 = 0xDC679823L
- self.H4 = 0xD0857A34L
-
-
- def _transform(self, W):
- for t in range(16, 80):
- W.append(_rotateLeft(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1) & 0xFFFFFFFFL)
-
- A = self.H0
- B = self.H1
- C = self.H2
- D = self.H3
- E = self.H4
- for t in xrange(0, 80):
- TEMP = _rotateLeft(A, 5) + f[t](B, C, D) + E + W[t] + K[t / 20]
- E = D
- D = C
- C = _rotateLeft(B, 30) & 0xFFFFFFFFL
- B = A
- A = TEMP & 0xFFFFFFFFL
-
- self.H0 = self.H0 + A & 0xFFFFFFFFL
- self.H1 = self.H1 + B & 0xFFFFFFFFL
- self.H2 = self.H2 + C & 0xFFFFFFFFL
- self.H3 = self.H3 + D & 0xFFFFFFFFL
- self.H4 = self.H4 + E & 0xFFFFFFFFL
-
-
- def update(self, inBuf):
- leninBuf = long(len(inBuf))
- index = self.count[1] >> 3 & 0x3FL
- self.count[1] = self.count[1] + (leninBuf << 3)
- if self.count[1] < leninBuf << 3:
- self.count[0] = self.count[0] + 1
-
- self.count[0] = self.count[0] + (leninBuf >> 29)
- partLen = 64 - index
- if leninBuf >= partLen:
- self.input[index:] = list(inBuf[:partLen])
- self._transform(_bytelist2longBigEndian(self.input))
- i = partLen
- while i + 63 < leninBuf:
- self._transform(_bytelist2longBigEndian(list(inBuf[i:i + 64])))
- i = i + 64
- self.input = list(inBuf[i:leninBuf])
- else:
- i = 0
- self.input = self.input + list(inBuf)
-
-
- def digest(self):
- H0 = self.H0
- H1 = self.H1
- H2 = self.H2
- H3 = self.H3
- H4 = self.H4
- input = [] + self.input
- count = [] + self.count
- index = self.count[1] >> 3 & 0x3FL
- if index < 56:
- padLen = 56 - index
- else:
- padLen = 120 - index
- padding = [
- '\x80'] + [
- '\x00'] * 63
- self.update(padding[:padLen])
- bits = _bytelist2longBigEndian(self.input[:56]) + count
- self._transform(bits)
- digest = _long2bytesBigEndian(self.H0, 4) + _long2bytesBigEndian(self.H1, 4) + _long2bytesBigEndian(self.H2, 4) + _long2bytesBigEndian(self.H3, 4) + _long2bytesBigEndian(self.H4, 4)
- self.H0 = H0
- self.H1 = H1
- self.H2 = H2
- self.H3 = H3
- self.H4 = H4
- self.input = input
- self.count = count
- return digest
-
-
- def hexdigest(self):
- return []([ '%02x' % ord(c) for c in self.digest() ])
-
-
- def copy(self):
- return copy.deepcopy(self)
-
-
- digest_size = digestsize = 20
- blocksize = 1
-
- def new(arg = None):
- crypto = mssha1()
- if arg:
- crypto.update(arg)
-
- return crypto
-
- if __name__ == '__main__':
-
- def main():
- import sys
- file = None
- if len(sys.argv) > 2:
- print 'usage: %s [FILE]' % sys.argv[0]
- return None
- if len(sys.argv) < 2:
- file = sys.stdin
- else:
- file = open(sys.argv[1], 'rb')
- context = new()
- data = file.read(16384)
- while data:
- context.update(data)
- data = file.read(16384)
- file.close()
- digest = context.hexdigest().upper()
- for i in xrange(0, 40, 8):
- print digest[i:i + 8],
-
- print
-
- main()
-
-