Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

md5 OpenSSL FIPS mode fix #7611 #7614

Merged
merged 4 commits into from May 5, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions AUTHORS
Expand Up @@ -85,6 +85,7 @@ Other contributors, listed alphabetically, are:
* Daniel Pizetta -- inheritance diagram improvements
* KINEBUCHI Tomohiko -- typing Sphinx as well as docutils
* Adrián Chaves (Gallaecio) -- coverage builder improvements
* Lars Hupfeldt Nielsen - OpenSSL FIPS mode md5 bug fix

Many thanks for all contributions!

Expand Down
1 change: 1 addition & 0 deletions CHANGES
Expand Up @@ -17,6 +17,7 @@ Bugs fixed
----------

* #7567: autodoc: parametrized types are shown twice for generic types
* #7611: md5 fails when OpenSSL FIPS is enabled

Testing
--------
Expand Down
3 changes: 1 addition & 2 deletions sphinx/builders/html/__init__.py
Expand Up @@ -13,7 +13,6 @@
import re
import sys
import warnings
from hashlib import md5
from os import path
from typing import Any, Dict, IO, Iterable, Iterator, List, Set, Tuple

Expand All @@ -38,7 +37,7 @@
from sphinx.locale import _, __
from sphinx.search import js_index
from sphinx.theming import HTMLThemeFactory
from sphinx.util import logging, progress_message, status_iterator
from sphinx.util import logging, progress_message, status_iterator, md5
from sphinx.util.docutils import is_html5_writer_available, new_document
from sphinx.util.fileutil import copy_asset
from sphinx.util.i18n import format_date
Expand Down
3 changes: 1 addition & 2 deletions sphinx/ext/graphviz.py
Expand Up @@ -12,7 +12,6 @@
import posixpath
import re
import subprocess
from hashlib import sha1
from os import path
from subprocess import CalledProcessError, PIPE
from typing import Any, Dict, List, Tuple
Expand All @@ -25,7 +24,7 @@
from sphinx.application 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.docutils import SphinxDirective, SphinxTranslator
from sphinx.util.fileutil import copy_asset
from sphinx.util.i18n import search_image_for_language
Expand Down
3 changes: 1 addition & 2 deletions sphinx/ext/imgmath.py
Expand Up @@ -14,7 +14,6 @@
import subprocess
import sys
import tempfile
from hashlib import sha1
from os import path
from subprocess import CalledProcessError, PIPE
from typing import Any, Dict, List, Tuple
Expand All @@ -30,7 +29,7 @@
from sphinx.deprecation import RemovedInSphinx40Warning, deprecated_alias
from sphinx.errors import SphinxError
from sphinx.locale import _, __
from sphinx.util import logging
from sphinx.util import logging, sha1
from sphinx.util.math import get_node_equation_number, wrap_displaymath
from sphinx.util.osutil import ensuredir
from sphinx.util.png import read_png_depth, write_png_depth
Expand Down
2 changes: 1 addition & 1 deletion sphinx/ext/inheritance_diagram.py
Expand Up @@ -38,7 +38,6 @@ class E(B): pass
import builtins
import inspect
import re
from hashlib import md5
from importlib import import_module
from typing import Any, Dict, Iterable, List, Tuple
from typing import cast
Expand All @@ -55,6 +54,7 @@ class E(B): pass
graphviz, figure_wrapper,
render_dot_html, render_dot_latex, render_dot_texinfo
)
from sphinx.util import md5
from sphinx.util.docutils import SphinxDirective
from sphinx.writers.html import HTMLTranslator
from sphinx.writers.latex import LaTeXTranslator
Expand Down
3 changes: 1 addition & 2 deletions sphinx/transforms/post_transforms/images.py
Expand Up @@ -10,7 +10,6 @@

import os
import re
from hashlib import sha1
from math import ceil
from typing import Any, Dict, List, Tuple

Expand All @@ -19,7 +18,7 @@
from sphinx.application import Sphinx
from sphinx.locale import __
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
Expand Down
32 changes: 31 additions & 1 deletion sphinx/util/__init__.py
Expand Up @@ -10,6 +10,7 @@

import fnmatch
import functools
import hashlib
import os
import posixpath
import re
Expand All @@ -21,7 +22,6 @@
from codecs import BOM_UTF8
from collections import deque
from datetime import datetime
from hashlib import md5
from importlib import import_module
from os import path
from time import mktime, strptime
Expand Down Expand Up @@ -170,6 +170,36 @@ def __setstate__(self, state: Set[str]) -> 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


class DownloadFiles(dict):
"""A special dictionary for download files.

Expand Down
3 changes: 1 addition & 2 deletions tests/test_build_html.py
Expand Up @@ -10,7 +10,6 @@

import os
import re
from hashlib import md5
from itertools import cycle, chain

import pytest
Expand All @@ -19,7 +18,7 @@
from sphinx.builders.html import validate_html_extra_path, validate_html_static_path
from sphinx.errors import ConfigError
from sphinx.testing.util import strip_escseq
from sphinx.util import docutils
from sphinx.util import docutils, md5
from sphinx.util.inventory import InventoryFile


Expand Down