1 | # $Id: hashlib.py 66093 2008-08-31 16:34:18Z gregory.p.smith $
|
---|
2 | #
|
---|
3 | # Copyright (C) 2005 Gregory P. Smith (greg@krypto.org)
|
---|
4 | # Licensed to PSF under a Contributor Agreement.
|
---|
5 | #
|
---|
6 |
|
---|
7 | __doc__ = """hashlib module - A common interface to many hash functions.
|
---|
8 |
|
---|
9 | new(name, string='') - returns a new hash object implementing the
|
---|
10 | given hash function; initializing the hash
|
---|
11 | using the given string data.
|
---|
12 |
|
---|
13 | Named constructor functions are also available, these are much faster
|
---|
14 | than using new():
|
---|
15 |
|
---|
16 | md5(), sha1(), sha224(), sha256(), sha384(), and sha512()
|
---|
17 |
|
---|
18 | More algorithms may be available on your platform but the above are
|
---|
19 | guaranteed to exist.
|
---|
20 |
|
---|
21 | NOTE: If you want the adler32 or crc32 hash functions they are available in
|
---|
22 | the zlib module.
|
---|
23 |
|
---|
24 | Choose your hash function wisely. Some have known collision weaknesses.
|
---|
25 | sha384 and sha512 will be slow on 32 bit platforms.
|
---|
26 |
|
---|
27 | Hash objects have these methods:
|
---|
28 | - update(arg): Update the hash object with the string arg. Repeated calls
|
---|
29 | are equivalent to a single call with the concatenation of all
|
---|
30 | the arguments.
|
---|
31 | - digest(): Return the digest of the strings passed to the update() method
|
---|
32 | so far. This may contain non-ASCII characters, including
|
---|
33 | NUL bytes.
|
---|
34 | - hexdigest(): Like digest() except the digest is returned as a string of
|
---|
35 | double length, containing only hexadecimal digits.
|
---|
36 | - copy(): Return a copy (clone) of the hash object. This can be used to
|
---|
37 | efficiently compute the digests of strings that share a common
|
---|
38 | initial substring.
|
---|
39 |
|
---|
40 | For example, to obtain the digest of the string 'Nobody inspects the
|
---|
41 | spammish repetition':
|
---|
42 |
|
---|
43 | >>> import hashlib
|
---|
44 | >>> m = hashlib.md5()
|
---|
45 | >>> m.update("Nobody inspects")
|
---|
46 | >>> m.update(" the spammish repetition")
|
---|
47 | >>> m.digest()
|
---|
48 | '\\xbbd\\x9c\\x83\\xdd\\x1e\\xa5\\xc9\\xd9\\xde\\xc9\\xa1\\x8d\\xf0\\xff\\xe9'
|
---|
49 |
|
---|
50 | More condensed:
|
---|
51 |
|
---|
52 | >>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest()
|
---|
53 | 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
|
---|
54 |
|
---|
55 | """
|
---|
56 |
|
---|
57 |
|
---|
58 | def __get_builtin_constructor(name):
|
---|
59 | if name in ('SHA1', 'sha1'):
|
---|
60 | import _sha
|
---|
61 | return _sha.new
|
---|
62 | elif name in ('MD5', 'md5'):
|
---|
63 | import _md5
|
---|
64 | return _md5.new
|
---|
65 | elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'):
|
---|
66 | import _sha256
|
---|
67 | bs = name[3:]
|
---|
68 | if bs == '256':
|
---|
69 | return _sha256.sha256
|
---|
70 | elif bs == '224':
|
---|
71 | return _sha256.sha224
|
---|
72 | elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'):
|
---|
73 | import _sha512
|
---|
74 | bs = name[3:]
|
---|
75 | if bs == '512':
|
---|
76 | return _sha512.sha512
|
---|
77 | elif bs == '384':
|
---|
78 | return _sha512.sha384
|
---|
79 |
|
---|
80 | raise ValueError, "unsupported hash type"
|
---|
81 |
|
---|
82 |
|
---|
83 | def __py_new(name, string=''):
|
---|
84 | """new(name, string='') - Return a new hashing object using the named algorithm;
|
---|
85 | optionally initialized with a string.
|
---|
86 | """
|
---|
87 | return __get_builtin_constructor(name)(string)
|
---|
88 |
|
---|
89 |
|
---|
90 | def __hash_new(name, string=''):
|
---|
91 | """new(name, string='') - Return a new hashing object using the named algorithm;
|
---|
92 | optionally initialized with a string.
|
---|
93 | """
|
---|
94 | try:
|
---|
95 | return _hashlib.new(name, string)
|
---|
96 | except ValueError:
|
---|
97 | # If the _hashlib module (OpenSSL) doesn't support the named
|
---|
98 | # hash, try using our builtin implementations.
|
---|
99 | # This allows for SHA224/256 and SHA384/512 support even though
|
---|
100 | # the OpenSSL library prior to 0.9.8 doesn't provide them.
|
---|
101 | return __get_builtin_constructor(name)(string)
|
---|
102 |
|
---|
103 |
|
---|
104 | try:
|
---|
105 | import _hashlib
|
---|
106 | # use the wrapper of the C implementation
|
---|
107 | new = __hash_new
|
---|
108 |
|
---|
109 | for opensslFuncName in filter(lambda n: n.startswith('openssl_'), dir(_hashlib)):
|
---|
110 | funcName = opensslFuncName[len('openssl_'):]
|
---|
111 | try:
|
---|
112 | # try them all, some may not work due to the OpenSSL
|
---|
113 | # version not supporting that algorithm.
|
---|
114 | f = getattr(_hashlib, opensslFuncName)
|
---|
115 | f()
|
---|
116 | # Use the C function directly (very fast)
|
---|
117 | exec funcName + ' = f'
|
---|
118 | except ValueError:
|
---|
119 | try:
|
---|
120 | # Use the builtin implementation directly (fast)
|
---|
121 | exec funcName + ' = __get_builtin_constructor(funcName)'
|
---|
122 | except ValueError:
|
---|
123 | # this one has no builtin implementation, don't define it
|
---|
124 | pass
|
---|
125 | # clean up our locals
|
---|
126 | del f
|
---|
127 | del opensslFuncName
|
---|
128 | del funcName
|
---|
129 |
|
---|
130 | except ImportError:
|
---|
131 | # We don't have the _hashlib OpenSSL module?
|
---|
132 | # use the built in legacy interfaces via a wrapper function
|
---|
133 | new = __py_new
|
---|
134 |
|
---|
135 | # lookup the C function to use directly for the named constructors
|
---|
136 | md5 = __get_builtin_constructor('md5')
|
---|
137 | sha1 = __get_builtin_constructor('sha1')
|
---|
138 | sha224 = __get_builtin_constructor('sha224')
|
---|
139 | sha256 = __get_builtin_constructor('sha256')
|
---|
140 | sha384 = __get_builtin_constructor('sha384')
|
---|
141 | sha512 = __get_builtin_constructor('sha512')
|
---|