1import string
2import md5
3from sys import argv
4
5def MDPrint(str):
6    outstr = ''
7    for i in str:
8        o = ord(i)
9        outstr = (outstr
10                  + string.hexdigits[(o >> 4) & 0xF]
11                  + string.hexdigits[o & 0xF])
12    print outstr,
13
14
15from time import time
16
17def makestr(start, end):
18    result = ''
19    for i in range(start, end + 1):
20        result = result + chr(i)
21
22    return result
23
24
25def MDTimeTrial():
26    TEST_BLOCK_SIZE = 1000
27    TEST_BLOCKS = 10000
28
29    TEST_BYTES = TEST_BLOCK_SIZE * TEST_BLOCKS
30
31    # initialize test data, need temporary string filler
32
33    filsiz = 1 << 8
34    filler = makestr(0, filsiz-1)
35    data = filler * (TEST_BLOCK_SIZE // filsiz)
36    data = data + filler[:(TEST_BLOCK_SIZE % filsiz)]
37
38    del filsiz, filler
39
40
41    # start timer
42    print 'MD5 time trial. Processing', TEST_BYTES, 'characters...'
43    t1 = time()
44
45    mdContext = md5.new()
46
47    for i in range(TEST_BLOCKS):
48        mdContext.update(data)
49
50    str = mdContext.digest()
51    t2 = time()
52
53    MDPrint(str)
54    print 'is digest of test input.'
55    print 'Seconds to process test input:', t2 - t1
56    print 'Characters processed per second:', TEST_BYTES / (t2 - t1)
57
58
59def MDString(str):
60    MDPrint(md5.new(str).digest())
61    print '"' + str + '"'
62
63
64def MDFile(filename):
65    f = open(filename, 'rb')
66    mdContext = md5.new()
67
68    while 1:
69        data = f.read(1024)
70        if not data:
71            break
72        mdContext.update(data)
73
74    MDPrint(mdContext.digest())
75    print filename
76
77
78import sys
79
80def MDFilter():
81    mdContext = md5.new()
82
83    while 1:
84        data = sys.stdin.read(16)
85        if not data:
86            break
87        mdContext.update(data)
88
89    MDPrint(mdContext.digest())
90    print
91
92
93def MDTestSuite():
94    print 'MD5 test suite results:'
95    MDString('')
96    MDString('a')
97    MDString('abc')
98    MDString('message digest')
99    MDString(makestr(ord('a'), ord('z')))
100    MDString(makestr(ord('A'), ord('Z'))
101              + makestr(ord('a'), ord('z'))
102              + makestr(ord('0'), ord('9')))
103    MDString((makestr(ord('1'), ord('9')) + '0') * 8)
104
105    # Contents of file foo are "abc"
106    MDFile('foo')
107
108
109# I don't wanna use getopt(), since I want to use the same i/f...
110def main():
111    if len(argv) == 1:
112        MDFilter()
113    for arg in argv[1:]:
114        if arg[:2] == '-s':
115            MDString(arg[2:])
116        elif arg == '-t':
117            MDTimeTrial()
118        elif arg == '-x':
119            MDTestSuite()
120        else:
121            MDFile(arg)
122
123main()
124