Blob Blame History Raw
diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py
index 8b63352..1a95c77 100644
--- a/sphinx/builders/html.py
+++ b/sphinx/builders/html.py
@@ -14,7 +14,6 @@ import posixpath
 import re
 import sys
 import warnings
-from hashlib import md5
 from os import path
 
 import docutils
@@ -40,7 +39,7 @@ from sphinx.highlighting import PygmentsBridge
 from sphinx.locale import _, __, l_
 from sphinx.search import js_index
 from sphinx.theming import HTMLThemeFactory
-from sphinx.util import jsonimpl, logging, status_iterator
+from sphinx.util import jsonimpl, logging, status_iterator, md5
 from sphinx.util.console import bold, darkgreen  # type: ignore
 from sphinx.util.docutils import is_html5_writer_available, new_document
 from sphinx.util.fileutil import copy_asset
diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py
index 08707b7..9d53a0e 100644
--- a/sphinx/ext/graphviz.py
+++ b/sphinx/ext/graphviz.py
@@ -13,7 +13,6 @@
 import codecs
 import posixpath
 import re
-from hashlib import sha1
 from os import path
 from subprocess import Popen, PIPE
 
@@ -25,7 +24,7 @@ from six import text_type
 import sphinx
 from sphinx.errors import SphinxError
 from sphinx.locale import _, __
-from sphinx.util import logging
+from sphinx.util import logging, sha1
 from sphinx.util.i18n import search_image_for_language
 from sphinx.util.osutil import ensuredir, ENOENT, EPIPE, EINVAL
 
diff --git a/sphinx/ext/imgmath.py b/sphinx/ext/imgmath.py
index 5f9d7a1..23f89ed 100644
--- a/sphinx/ext/imgmath.py
+++ b/sphinx/ext/imgmath.py
@@ -14,7 +14,6 @@ import posixpath
 import re
 import shutil
 import tempfile
-from hashlib import sha1
 from os import path
 from subprocess import Popen, PIPE
 
@@ -26,7 +25,7 @@ from sphinx.errors import SphinxError, ExtensionError
 from sphinx.ext.mathbase import get_node_equation_number
 from sphinx.ext.mathbase import setup_math as mathbase_setup, wrap_displaymath
 from sphinx.locale import _
-from sphinx.util import logging
+from sphinx.util import logging, sha1
 from sphinx.util.osutil import ensuredir, ENOENT, cd
 from sphinx.util.png import read_png_depth, write_png_depth
 from sphinx.util.pycompat import sys_encoding
diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py
index 14593ac..9576d07 100644
--- a/sphinx/ext/inheritance_diagram.py
+++ b/sphinx/ext/inheritance_diagram.py
@@ -39,7 +39,6 @@ r"""
 import inspect
 import re
 import sys
-from hashlib import md5
 
 from docutils import nodes
 from docutils.parsers.rst import Directive, directives
@@ -50,7 +49,7 @@ import sphinx
 from sphinx.ext.graphviz import render_dot_html, render_dot_latex, \
     render_dot_texinfo, figure_wrapper
 from sphinx.pycode import ModuleAnalyzer
-from sphinx.util import force_decode
+from sphinx.util import force_decode, md5
 
 if False:
     # For type annotation
diff --git a/sphinx/transforms/post_transforms/images.py b/sphinx/transforms/post_transforms/images.py
index 6dd135e..d1c50bd 100644
--- a/sphinx/transforms/post_transforms/images.py
+++ b/sphinx/transforms/post_transforms/images.py
@@ -10,14 +10,13 @@
 """
 
 import os
-from hashlib import sha1
 from math import ceil
 
 from docutils import nodes
 from six import text_type
 
 from sphinx.transforms import SphinxTransform
-from sphinx.util import epoch_to_rfc1123, rfc1123_to_epoch
+from sphinx.util import epoch_to_rfc1123, rfc1123_to_epoch, sha1
 from sphinx.util import logging, requests
 from sphinx.util.images import guess_mimetype, get_image_extension, parse_data_uri
 from sphinx.util.osutil import ensuredir, movefile
diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py
index dda3fb0..9c1c441 100644
--- a/sphinx/util/__init__.py
+++ b/sphinx/util/__init__.py
@@ -11,6 +11,7 @@
 from __future__ import absolute_import
 
 import fnmatch
+import hashlib
 import os
 import posixpath
 import re
@@ -164,6 +165,32 @@ class FilenameUniqDict(dict):
         # type: (Set[unicode]) -> None
         self._existing = state
 
+def md5(data=b'', **kwargs):
+    """Wrapper around hashlib.md5
+    Attempt call with 'usedforsecurity=False' if we get a ValueError, which happens when
+    OpenSSL FIPS mode is enabled:
+    ValueError: error:060800A3:digital envelope routines:EVP_DigestInit_ex:disabled for fips
+    See: https://github.com/sphinx-doc/sphinx/issues/7611
+    """
+
+    try:
+        return hashlib.md5(data, **kwargs)  # type: ignore
+    except ValueError:
+        return hashlib.md5(data, **kwargs, usedforsecurity=False)  # type: ignore
+
+
+def sha1(data=b'', **kwargs):
+    """Wrapper around hashlib.sha1
+    Attempt call with 'usedforsecurity=False' if we get a ValueError
+    See: https://github.com/sphinx-doc/sphinx/issues/7611
+    """
+
+    try:
+        return hashlib.sha1(data, **kwargs)  # type: ignore
+    except ValueError:
+        return hashlib.sha1(data, **kwargs, usedforsecurity=False)  # type: ignore
+
+
 
 def copy_static_entry(source, targetdir, builder, context={},
                       exclude_matchers=(), level=0):