Fixes Issue #12059: Properly handle missing hash functions even when
the expected builtin modules are not present.

This includes a unittest for __get_builtin_constructor() in the face
of such an error.
diff --git a/Lib/hashlib.py b/Lib/hashlib.py
index 0d7e325..0ebeed5 100644
--- a/Lib/hashlib.py
+++ b/Lib/hashlib.py
@@ -64,26 +64,29 @@
 
 
 def __get_builtin_constructor(name):
-    if name in ('SHA1', 'sha1'):
-        import _sha1
-        return _sha1.sha1
-    elif name in ('MD5', 'md5'):
-        import _md5
-        return _md5.md5
-    elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'):
-        import _sha256
-        bs = name[3:]
-        if bs == '256':
-            return _sha256.sha256
-        elif bs == '224':
-            return _sha256.sha224
-    elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'):
-        import _sha512
-        bs = name[3:]
-        if bs == '512':
-            return _sha512.sha512
-        elif bs == '384':
-            return _sha512.sha384
+    try:
+        if name in ('SHA1', 'sha1'):
+            import _sha1
+            return _sha1.sha1
+        elif name in ('MD5', 'md5'):
+            import _md5
+            return _md5.md5
+        elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'):
+            import _sha256
+            bs = name[3:]
+            if bs == '256':
+                return _sha256.sha256
+            elif bs == '224':
+                return _sha256.sha224
+        elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'):
+            import _sha512
+            bs = name[3:]
+            if bs == '512':
+                return _sha512.sha512
+            elif bs == '384':
+                return _sha512.sha384
+    except ImportError:
+         pass  # no extension module, this hash is unsupported.
 
     raise ValueError('unsupported hash type %s' % name)