python-2.5.2/win32/Lib/hashlib.py
changeset 0 ae805ac0140d
equal deleted inserted replaced
-1:000000000000 0:ae805ac0140d
       
     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')