mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 02:15:10 +00:00 
			
		
		
		
	 805365ee39
			
		
	
	
		805365ee39
		
	
	
	
	
		
			
			svn+ssh://pythondev@svn.python.org/python/branches/p3yk ........ r55077 | guido.van.rossum | 2007-05-02 11:54:37 -0700 (Wed, 02 May 2007) | 2 lines Use the new print syntax, at least. ........ r55142 | fred.drake | 2007-05-04 21:27:30 -0700 (Fri, 04 May 2007) | 1 line remove old cruftiness ........ r55143 | fred.drake | 2007-05-04 21:52:16 -0700 (Fri, 04 May 2007) | 1 line make this work with the new Python ........ r55162 | neal.norwitz | 2007-05-06 22:29:18 -0700 (Sun, 06 May 2007) | 1 line Get asdl code gen working with Python 2.3. Should continue to work with 3.0 ........ r55164 | neal.norwitz | 2007-05-07 00:00:38 -0700 (Mon, 07 May 2007) | 1 line Verify checkins to p3yk (sic) branch go to 3000 list. ........ r55166 | neal.norwitz | 2007-05-07 00:12:35 -0700 (Mon, 07 May 2007) | 1 line Fix this test so it runs again by importing warnings_test properly. ........ r55167 | neal.norwitz | 2007-05-07 01:03:22 -0700 (Mon, 07 May 2007) | 8 lines So long xrange. range() now supports values that are outside -sys.maxint to sys.maxint. floats raise a TypeError. This has been sitting for a long time. It probably has some problems and needs cleanup. Objects/rangeobject.c now uses 4-space indents since it is almost completely new. ........ r55171 | guido.van.rossum | 2007-05-07 10:21:26 -0700 (Mon, 07 May 2007) | 4 lines Fix two tests that were previously depending on significant spaces at the end of a line (and before that on Python 2.x print behavior that has no exact equivalent in 3.0). ........
		
			
				
	
	
		
			117 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """HMAC (Keyed-Hashing for Message Authentication) Python module.
 | |
| 
 | |
| Implements the HMAC algorithm as described by RFC 2104.
 | |
| """
 | |
| 
 | |
| trans_5C = "".join ([chr (x ^ 0x5C) for x in range(256)])
 | |
| trans_36 = "".join ([chr (x ^ 0x36) for x in range(256)])
 | |
| 
 | |
| # The size of the digests returned by HMAC depends on the underlying
 | |
| # hashing module used.  Use digest_size from the instance of HMAC instead.
 | |
| digest_size = None
 | |
| 
 | |
| # A unique object passed by HMAC.copy() to the HMAC constructor, in order
 | |
| # that the latter return very quickly.  HMAC("") in contrast is quite
 | |
| # expensive.
 | |
| _secret_backdoor_key = []
 | |
| 
 | |
| class HMAC:
 | |
|     """RFC2104 HMAC class.
 | |
| 
 | |
|     This supports the API for Cryptographic Hash Functions (PEP 247).
 | |
|     """
 | |
|     blocksize = 64  # 512-bit HMAC; can be changed in subclasses.
 | |
| 
 | |
|     def __init__(self, key, msg = None, digestmod = None):
 | |
|         """Create a new HMAC object.
 | |
| 
 | |
|         key:       key for the keyed hash object.
 | |
|         msg:       Initial input for the hash, if provided.
 | |
|         digestmod: A module supporting PEP 247.  *OR*
 | |
|                    A hashlib constructor returning a new hash object.
 | |
|                    Defaults to hashlib.md5.
 | |
|         """
 | |
| 
 | |
|         if key is _secret_backdoor_key: # cheap
 | |
|             return
 | |
| 
 | |
|         if digestmod is None:
 | |
|             import hashlib
 | |
|             digestmod = hashlib.md5
 | |
| 
 | |
|         if callable(digestmod):
 | |
|             self.digest_cons = digestmod
 | |
|         else:
 | |
|             self.digest_cons = lambda d='': digestmod.new(d)
 | |
| 
 | |
|         self.outer = self.digest_cons()
 | |
|         self.inner = self.digest_cons()
 | |
|         self.digest_size = self.inner.digest_size
 | |
| 
 | |
|         blocksize = self.blocksize
 | |
|         if len(key) > blocksize:
 | |
|             key = self.digest_cons(key).digest()
 | |
| 
 | |
|         key = key + chr(0) * (blocksize - len(key))
 | |
|         self.outer.update(key.translate(trans_5C))
 | |
|         self.inner.update(key.translate(trans_36))
 | |
|         if msg is not None:
 | |
|             self.update(msg)
 | |
| 
 | |
| ##    def clear(self):
 | |
| ##        raise NotImplementedError, "clear() method not available in HMAC."
 | |
| 
 | |
|     def update(self, msg):
 | |
|         """Update this hashing object with the string msg.
 | |
|         """
 | |
|         self.inner.update(msg)
 | |
| 
 | |
|     def copy(self):
 | |
|         """Return a separate copy of this hashing object.
 | |
| 
 | |
|         An update to this copy won't affect the original object.
 | |
|         """
 | |
|         other = self.__class__(_secret_backdoor_key)
 | |
|         other.digest_cons = self.digest_cons
 | |
|         other.digest_size = self.digest_size
 | |
|         other.inner = self.inner.copy()
 | |
|         other.outer = self.outer.copy()
 | |
|         return other
 | |
| 
 | |
|     def _current(self):
 | |
|         """Return a hash object for the current state.
 | |
| 
 | |
|         To be used only internally with digest() and hexdigest().
 | |
|         """
 | |
|         h = self.outer.copy()
 | |
|         h.update(self.inner.digest())
 | |
|         return h
 | |
| 
 | |
|     def digest(self):
 | |
|         """Return the hash value of this hashing object.
 | |
| 
 | |
|         This returns a string containing 8-bit data.  The object is
 | |
|         not altered in any way by this function; you can continue
 | |
|         updating the object after calling this function.
 | |
|         """
 | |
|         h = self._current()
 | |
|         return h.digest()
 | |
| 
 | |
|     def hexdigest(self):
 | |
|         """Like digest(), but returns a string of hexadecimal digits instead.
 | |
|         """
 | |
|         h = self._current()
 | |
|         return h.hexdigest()
 | |
| 
 | |
| def new(key, msg = None, digestmod = None):
 | |
|     """Create a new hashing object and return it.
 | |
| 
 | |
|     key: The starting key for the hash.
 | |
|     msg: if available, will immediately be hashed into the object's starting
 | |
|     state.
 | |
| 
 | |
|     You can now feed arbitrary strings into the object using its update()
 | |
|     method, and can ask for the hash value at any time by calling its digest()
 | |
|     method.
 | |
|     """
 | |
|     return HMAC(key, msg, digestmod)
 |