mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-33604: Remove deprecated HMAC default value marked for removal in 3.8 (GH-7063)
HMAC's digestmod was deprecated marked for removal, this removes it as planned.
This commit is contained in:
		
							parent
							
								
									78deb7f332
								
							
						
					
					
						commit
						51a4743d19
					
				
					 4 changed files with 13 additions and 33 deletions
				
			
		|  | @ -19,8 +19,7 @@ This module implements the HMAC algorithm as described by :rfc:`2104`. | ||||||
|    Return a new hmac object.  *key* is a bytes or bytearray object giving the |    Return a new hmac object.  *key* is a bytes or bytearray object giving the | ||||||
|    secret key.  If *msg* is present, the method call ``update(msg)`` is made. |    secret key.  If *msg* is present, the method call ``update(msg)`` is made. | ||||||
|    *digestmod* is the digest name, digest constructor or module for the HMAC |    *digestmod* is the digest name, digest constructor or module for the HMAC | ||||||
|    object to use. It supports any name suitable to :func:`hashlib.new` and |    object to use. It supports any name suitable to :func:`hashlib.new`. | ||||||
|    defaults to the :data:`hashlib.md5` constructor. |  | ||||||
| 
 | 
 | ||||||
|    .. versionchanged:: 3.4 |    .. versionchanged:: 3.4 | ||||||
|       Parameter *key* can be a bytes or bytearray object. |       Parameter *key* can be a bytes or bytearray object. | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								Lib/hmac.py
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								Lib/hmac.py
									
										
									
									
									
								
							|  | @ -35,12 +35,9 @@ def __init__(self, key, msg = None, digestmod = None): | ||||||
| 
 | 
 | ||||||
|         key:       key for the keyed hash object. |         key:       key for the keyed hash object. | ||||||
|         msg:       Initial input for the hash, if provided. |         msg:       Initial input for the hash, if provided. | ||||||
|         digestmod: A module supporting PEP 247.  *OR* |         digestmod: Required.  A module supporting PEP 247.  *OR* | ||||||
|                    A hashlib constructor returning a new hash object.  *OR* |                    A hashlib constructor returning a new hash object.  *OR* | ||||||
|                    A hash name suitable for hashlib.new(). |                    A hash name suitable for hashlib.new(). | ||||||
|                    Defaults to hashlib.md5. |  | ||||||
|                    Implicit default to hashlib.md5 is deprecated since Python |  | ||||||
|                    3.4 and will be removed in Python 3.8. |  | ||||||
| 
 | 
 | ||||||
|         Note: key and msg must be a bytes or bytearray objects. |         Note: key and msg must be a bytes or bytearray objects. | ||||||
|         """ |         """ | ||||||
|  | @ -49,11 +46,7 @@ def __init__(self, key, msg = None, digestmod = None): | ||||||
|             raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__) |             raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__) | ||||||
| 
 | 
 | ||||||
|         if digestmod is None: |         if digestmod is None: | ||||||
|             _warnings.warn("HMAC() without an explicit digestmod argument " |             raise ValueError('`digestmod` is required.') | ||||||
|                            "is deprecated since Python 3.4, and will be removed " |  | ||||||
|                            "in 3.8", |  | ||||||
|                            DeprecationWarning, 2) |  | ||||||
|             digestmod = _hashlib.md5 |  | ||||||
| 
 | 
 | ||||||
|         if callable(digestmod): |         if callable(digestmod): | ||||||
|             self.digest_cons = digestmod |             self.digest_cons = digestmod | ||||||
|  |  | ||||||
|  | @ -302,45 +302,38 @@ def digest(self): | ||||||
|                 hmac.HMAC(b'a', b'b', digestmod=MockCrazyHash) |                 hmac.HMAC(b'a', b'b', digestmod=MockCrazyHash) | ||||||
|                 self.fail('Expected warning about small block_size') |                 self.fail('Expected warning about small block_size') | ||||||
| 
 | 
 | ||||||
|     def test_with_digestmod_warning(self): |     def test_with_digestmod_no_default(self): | ||||||
|         with self.assertWarns(DeprecationWarning): |         with self.assertRaises(ValueError): | ||||||
|             key = b"\x0b" * 16 |             key = b"\x0b" * 16 | ||||||
|             data = b"Hi There" |             data = b"Hi There" | ||||||
|             digest = "9294727A3638BB1C13F48EF8158BFC9D" |             hmac.HMAC(key, data, digestmod=None) | ||||||
|             h = hmac.HMAC(key, data) |  | ||||||
|             self.assertEqual(h.hexdigest().upper(), digest) |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| class ConstructorTestCase(unittest.TestCase): | class ConstructorTestCase(unittest.TestCase): | ||||||
| 
 | 
 | ||||||
|     @ignore_warning |  | ||||||
|     def test_normal(self): |     def test_normal(self): | ||||||
|         # Standard constructor call. |         # Standard constructor call. | ||||||
|         failed = 0 |         failed = 0 | ||||||
|         try: |         try: | ||||||
|             h = hmac.HMAC(b"key") |             h = hmac.HMAC(b"key", digestmod='md5') | ||||||
|         except Exception: |         except Exception: | ||||||
|             self.fail("Standard constructor call raised exception.") |             self.fail("Standard constructor call raised exception.") | ||||||
| 
 | 
 | ||||||
|     @ignore_warning |  | ||||||
|     def test_with_str_key(self): |     def test_with_str_key(self): | ||||||
|         # Pass a key of type str, which is an error, because it expects a key |         # Pass a key of type str, which is an error, because it expects a key | ||||||
|         # of type bytes |         # of type bytes | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             h = hmac.HMAC("key") |             h = hmac.HMAC("key", digestmod='md5') | ||||||
| 
 | 
 | ||||||
|     @ignore_warning |  | ||||||
|     def test_dot_new_with_str_key(self): |     def test_dot_new_with_str_key(self): | ||||||
|         # Pass a key of type str, which is an error, because it expects a key |         # Pass a key of type str, which is an error, because it expects a key | ||||||
|         # of type bytes |         # of type bytes | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             h = hmac.new("key") |             h = hmac.new("key", digestmod='md5') | ||||||
| 
 | 
 | ||||||
|     @ignore_warning |  | ||||||
|     def test_withtext(self): |     def test_withtext(self): | ||||||
|         # Constructor call with text. |         # Constructor call with text. | ||||||
|         try: |         try: | ||||||
|             h = hmac.HMAC(b"key", b"hash this!") |             h = hmac.HMAC(b"key", b"hash this!", digestmod='md5') | ||||||
|         except Exception: |         except Exception: | ||||||
|             self.fail("Constructor call with text argument raised exception.") |             self.fail("Constructor call with text argument raised exception.") | ||||||
|         self.assertEqual(h.hexdigest(), '34325b639da4cfd95735b381e28cb864') |         self.assertEqual(h.hexdigest(), '34325b639da4cfd95735b381e28cb864') | ||||||
|  | @ -369,13 +362,6 @@ def test_withmodule(self): | ||||||
| 
 | 
 | ||||||
| class SanityTestCase(unittest.TestCase): | class SanityTestCase(unittest.TestCase): | ||||||
| 
 | 
 | ||||||
|     @ignore_warning |  | ||||||
|     def test_default_is_md5(self): |  | ||||||
|         # Testing if HMAC defaults to MD5 algorithm. |  | ||||||
|         # NOTE: this whitebox test depends on the hmac class internals |  | ||||||
|         h = hmac.HMAC(b"key") |  | ||||||
|         self.assertEqual(h.digest_cons, hashlib.md5) |  | ||||||
| 
 |  | ||||||
|     def test_exercise_all_methods(self): |     def test_exercise_all_methods(self): | ||||||
|         # Exercising all methods once. |         # Exercising all methods once. | ||||||
|         # This must not raise any exceptions |         # This must not raise any exceptions | ||||||
|  |  | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | Remove HMAC default to md5 marked for removal in 3.8 (removal originally | ||||||
|  | planned in 3.6, bump to 3.8 in gh-7062). | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Matthias Bussonnier
						Matthias Bussonnier