blob: 242d0a52f781556b38c72afa0083544ffdfd0edd [file] [log] [blame]
Guido van Rossum82268e01994-10-08 19:17:34 +00001import string
Andrew M. Kuchlingf64509e2003-04-24 17:26:56 +00002import md5
3from sys import argv
Guido van Rossum82268e01994-10-08 19:17:34 +00004
5def MDPrint(str):
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +00006 outstr = ''
7 for i in str:
8 o = ord(i)
Tim Peterse6ddc8b2004-07-18 05:56:09 +00009 outstr = (outstr
10 + string.hexdigits[(o >> 4) & 0xF]
Andrew M. Kuchlinge81866e2003-04-24 17:27:53 +000011 + string.hexdigits[o & 0xF])
Collin Winter6f2df4d2007-07-17 20:59:35 +000012 print(outstr, end=' ')
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000013
Guido van Rossum82268e01994-10-08 19:17:34 +000014
15from time import time
16
17def makestr(start, end):
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000018 result = ''
19 for i in range(start, end + 1):
20 result = result + chr(i)
Guido van Rossum82268e01994-10-08 19:17:34 +000021
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000022 return result
23
Guido van Rossum82268e01994-10-08 19:17:34 +000024
Guido van Rossum82268e01994-10-08 19:17:34 +000025def MDTimeTrial():
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000026 TEST_BLOCK_SIZE = 1000
27 TEST_BLOCKS = 10000
Guido van Rossum82268e01994-10-08 19:17:34 +000028
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000029 TEST_BYTES = TEST_BLOCK_SIZE * TEST_BLOCKS
Guido van Rossum82268e01994-10-08 19:17:34 +000030
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000031 # initialize test data, need temporary string filler
Guido van Rossum82268e01994-10-08 19:17:34 +000032
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000033 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
Guido van Rossum82268e01994-10-08 19:17:34 +000039
40
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000041 # start timer
Collin Winter6f2df4d2007-07-17 20:59:35 +000042 print('MD5 time trial. Processing', TEST_BYTES, 'characters...')
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000043 t1 = time()
Guido van Rossum82268e01994-10-08 19:17:34 +000044
Andrew M. Kuchlingf64509e2003-04-24 17:26:56 +000045 mdContext = md5.new()
Guido van Rossum82268e01994-10-08 19:17:34 +000046
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000047 for i in range(TEST_BLOCKS):
48 mdContext.update(data)
Guido van Rossum82268e01994-10-08 19:17:34 +000049
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000050 str = mdContext.digest()
51 t2 = time()
Guido van Rossum82268e01994-10-08 19:17:34 +000052
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000053 MDPrint(str)
Collin Winter6f2df4d2007-07-17 20:59:35 +000054 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))
Guido van Rossum82268e01994-10-08 19:17:34 +000057
58
59def MDString(str):
Andrew M. Kuchlingf64509e2003-04-24 17:26:56 +000060 MDPrint(md5.new(str).digest())
Collin Winter6f2df4d2007-07-17 20:59:35 +000061 print('"' + str + '"')
Guido van Rossum82268e01994-10-08 19:17:34 +000062
63
64def MDFile(filename):
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000065 f = open(filename, 'rb');
Andrew M. Kuchlingf64509e2003-04-24 17:26:56 +000066 mdContext = md5.new()
Guido van Rossum82268e01994-10-08 19:17:34 +000067
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000068 while 1:
69 data = f.read(1024)
70 if not data:
71 break
72 mdContext.update(data)
Guido van Rossum82268e01994-10-08 19:17:34 +000073
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000074 MDPrint(mdContext.digest())
Collin Winter6f2df4d2007-07-17 20:59:35 +000075 print(filename)
Guido van Rossum82268e01994-10-08 19:17:34 +000076
77
78import sys
79
80def MDFilter():
Andrew M. Kuchlingf64509e2003-04-24 17:26:56 +000081 mdContext = md5.new()
Guido van Rossum82268e01994-10-08 19:17:34 +000082
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000083 while 1:
84 data = sys.stdin.read(16)
85 if not data:
86 break
87 mdContext.update(data)
Guido van Rossum82268e01994-10-08 19:17:34 +000088
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000089 MDPrint(mdContext.digest())
Collin Winter6f2df4d2007-07-17 20:59:35 +000090 print()
Guido van Rossum82268e01994-10-08 19:17:34 +000091
92
93def MDTestSuite():
Collin Winter6f2df4d2007-07-17 20:59:35 +000094 print('MD5 test suite results:')
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000095 MDString('')
96 MDString('a')
97 MDString('abc')
98 MDString('message digest')
99 MDString(makestr(ord('a'), ord('z')))
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000100 MDString(makestr(ord('A'), ord('Z'))
101 + makestr(ord('a'), ord('z'))
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +0000102 + makestr(ord('0'), ord('9')))
103 MDString((makestr(ord('1'), ord('9')) + '0') * 8)
Guido van Rossum82268e01994-10-08 19:17:34 +0000104
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +0000105 # Contents of file foo are "abc"
106 MDFile('foo')
Guido van Rossum82268e01994-10-08 19:17:34 +0000107
108
Guido van Rossum82268e01994-10-08 19:17:34 +0000109# I don't wanna use getopt(), since I want to use the same i/f...
110def main():
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +0000111 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)
Guido van Rossum82268e01994-10-08 19:17:34 +0000122
123main()