Title: [Bug]: Setting `text.usetex=True` in `pyplot.rcParams` Raises FIPS Compliance Errors · Issue #29603 · matplotlib/matplotlib · GitHub
Open Graph Title: [Bug]: Setting `text.usetex=True` in `pyplot.rcParams` Raises FIPS Compliance Errors · Issue #29603 · matplotlib/matplotlib
X Title: [Bug]: Setting `text.usetex=True` in `pyplot.rcParams` Raises FIPS Compliance Errors · Issue #29603 · matplotlib/matplotlib
Description: Bug summary If you use a FIPS (Federal Information Processing Standards) compliant Python install, then you cannot use pyplot.show to display a plot with plt.rcParams['text.usetex'] = True due to a hashlib.md5 call in texmanager.py. This...
Open Graph Description: Bug summary If you use a FIPS (Federal Information Processing Standards) compliant Python install, then you cannot use pyplot.show to display a plot with plt.rcParams['text.usetex'] = True due to a...
X Description: Bug summary If you use a FIPS (Federal Information Processing Standards) compliant Python install, then you cannot use pyplot.show to display a plot with plt.rcParams['text.usetex'] = True ...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/29603
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[Bug]: Setting `text.usetex=True` in `pyplot.rcParams` Raises FIPS Compliance Errors","articleBody":"### Bug summary\n\nIf you use a FIPS (Federal Information Processing Standards) compliant Python install, then you cannot use `pyplot.show` to display a plot with `plt.rcParams['text.usetex'] = True` due to a `hashlib.md5` call in [texmanager.py](https://github.com/matplotlib/matplotlib/blob/24bb51c834f7e6714e9ad8e24f7edb6c903028fe/lib/matplotlib/texmanager.py#L171).\n\nThis is similar to https://github.com/matplotlib/matplotlib/issues/18192 (and much of this report is modeled off of that)\n\nThere are 3 places in the code that seem to still use `hashlib.md5`:\n\n- https://github.com/matplotlib/matplotlib/blob/24bb51c834f7e6714e9ad8e24f7edb6c903028fe/lib/matplotlib/texmanager.py#L171\n- https://github.com/matplotlib/matplotlib/blob/24bb51c834f7e6714e9ad8e24f7edb6c903028fe/lib/matplotlib/sphinxext/mathmpl.py#L149\n- https://github.com/matplotlib/matplotlib/blob/24bb51c834f7e6714e9ad8e24f7edb6c903028fe/lib/matplotlib/testing/compare.py#L49\n\nThere probably isn't a great reason not to replace md5 with sha256 (or something else) in these locations.\n\n### Code for reproduction\n\nThe big requirement here is a FIPS compliant system or at least a Python install compiled to be FIPS compliant. Then the following code will reproduce the error.\n\nTo reproduce,\n\n1. Run `sudo fips-mode-setup --enable \u0026\u0026 sudo reboot` (there may be other methods)\n1. After the reboot I confirmed FIPS mode had been enabled by running `fips-mode-setup --check` and it returned FIPS mode is enabled.\n1. `python3 -m venv .venv`\n1. `./.venv/bin/python -m pip install matplotlib==3.10.0`\n1. `./.venv/bin/python fips_error.py`. The contents of `fips_error.py` is listed below.\n\n```python\nimport matplotlib.pyplot as plt\n\nplt.rcParams['text.usetex'] = True\nfig, ax = plt.subplots()\nplt.text(0, 0, r'$\\hat{\\mathbf{x}}$')\nplt.show()\n```\n\n### Actual outcome\n\n```\n$ python fips_error.py \nException in Tkinter callback\nTraceback (most recent call last):\n File \"/usr/lib64/python3.11/tkinter/__init__.py\", line 1967, in __call__\n return self.func(*args)\n ^^^^^^^^^^^^^^^^\n File \"/usr/lib64/python3.11/tkinter/__init__.py\", line 861, in callit\n func(*args)\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/backends/_backend_tk.py\", line 274, in idle_draw\n self.draw()\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/backends/backend_tkagg.py\", line 10, in draw\n super().draw()\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/backends/backend_agg.py\", line 382, in draw\n self.figure.draw(self.renderer)\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/artist.py\", line 94, in draw_wrapper\n result = draw(artist, renderer, *args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/artist.py\", line 71, in draw_wrapper\n return draw(artist, renderer)\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/figure.py\", line 3257, in draw\n mimage._draw_list_compositing_images(\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/image.py\", line 134, in _draw_list_compositing_images\n a.draw(renderer)\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/artist.py\", line 71, in draw_wrapper\n return draw(artist, renderer)\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/axes/_base.py\", line 3181, in draw\n mimage._draw_list_compositing_images(\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/image.py\", line 134, in _draw_list_compositing_images\n a.draw(renderer)\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/artist.py\", line 71, in draw_wrapper\n return draw(artist, renderer)\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/axis.py\", line 1416, in draw\n tlb1, tlb2 = self._get_ticklabel_bboxes(ticks_to_draw, renderer)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/axis.py\", line 1343, in _get_ticklabel_bboxes\n return ([tick.label1.get_window_extent(renderer)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/axis.py\", line 1343, in \u003clistcomp\u003e\n return ([tick.label1.get_window_extent(renderer)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/text.py\", line 969, in get_window_extent\n bbox, info, descent = self._get_layout(self._renderer)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/text.py\", line 373, in _get_layout\n _, lp_h, lp_d = _get_text_metrics_with_cache(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/text.py\", line 69, in _get_text_metrics_with_cache\n return _get_text_metrics_with_cache_impl(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/text.py\", line 77, in _get_text_metrics_with_cache_impl\n return renderer_ref().get_text_width_height_descent(text, fontprop, ismath)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/backends/backend_agg.py\", line 211, in get_text_width_height_descent\n return super().get_text_width_height_descent(s, prop, ismath)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/backend_bases.py\", line 566, in get_text_width_height_descent\n return self.get_texmanager().get_text_width_height_descent(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/texmanager.py\", line 360, in get_text_width_height_descent\n dvifile = cls.make_dvi(tex, fontsize)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/texmanager.py\", line 276, in make_dvi\n basefile = cls.get_basefile(tex, fontsize)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/data/users/ktm/matplotlib_test/.venv/lib64/python3.11/site-packages/matplotlib/texmanager.py\", line 171, in get_basefile\n filehash = hashlib.md5(src.encode('utf-8')).hexdigest()\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nValueError: [digital envelope routines: EVP_DigestInit_ex] disabled for FIPS\n```\n\n### Expected outcome\n\nNo exception related to FIPS and the plot is created.\n\n### Additional information\n\n```\n$ .venv/bin/python -m pip list\nPackage Version\n--------------- -----------\ncontourpy 1.3.1\ncycler 0.12.1\nfonttools 4.56.0\nkiwisolver 1.4.8\nmatplotlib 3.10.0\nnumpy 2.2.2\npackaging 24.2\npillow 11.1.0\npip 22.3.1\npyparsing 3.2.1\npython-dateutil 2.9.0.post0\nsetuptools 65.5.1\nsix 1.17.0\n```\n\n### Operating system\n\nRHEL 8.10 (with FIPS enabled)\n\n### Matplotlib Version\n\n3.10.0\n\n### Matplotlib Backend\n\ntkagg\n\n### Python version\n\nPython 3.11.9\n","author":{"url":"https://github.com/martinky24","@type":"Person","name":"martinky24"},"datePublished":"2025-02-11T18:25:35.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3},"url":"https://github.com/29603/matplotlib/issues/29603"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:f5fc4ef0-2b50-dc0b-36e1-b2d54763176d |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | C3AA:1357D4:EC591E:13EF545:6A5174C2 |
| html-safe-nonce | 064dcf2bdec94209600671a536aae19bcefc4aa8a3d6ccbced41e7d82bc2980a |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDM0FBOjEzNTdENDpFQzU5MUU6MTNFRjU0NTo2QTUxNzRDMiIsInZpc2l0b3JfaWQiOiI4Njg4MjcwMDU2MTYzOTk2ODY2IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | b227aca7d53be6325687280ed5381c6219c677783e34dc11c0605d0f36a6792b |
| hovercard-subject-tag | issue:2846166059 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/29603/issue_layout |
| twitter:image | https://opengraph.githubassets.com/8ca0027e442091924d2de8b1ffb3168de983d855f789941513f95e349cbb7ec7/matplotlib/matplotlib/issues/29603 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/8ca0027e442091924d2de8b1ffb3168de983d855f789941513f95e349cbb7ec7/matplotlib/matplotlib/issues/29603 |
| og:image:alt | Bug summary If you use a FIPS (Federal Information Processing Standards) compliant Python install, then you cannot use pyplot.show to display a plot with plt.rcParams['text.usetex'] = True due to a... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | martinky24 |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | b19955a9dd40fd99462443f7911b522d7216776a |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width