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