Architecture specific change in rpms/golang-github-smartystreets-assertions.git
by githook-noreply@fedoraproject.org
The package rpms/golang-github-smartystreets-assertions.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/golang-github-smartystreets-asser....
Change:
-ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
Thanks.
Full change:
============
commit fcb597cac22683992a3c51176c451b73f54aff7d
Author: Robert-Andr Mauchin <zebob.m(a)gmail.com>
Date: Sat Oct 6 23:46:22 2018 +0200
Bump to commit b2de0cb4f26d0705483a2f495d89896d0b808573
Update with new Go packaging
diff --git a/.gitignore b/.gitignore
index 6a04ec6..d4533f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
/assertions-287b434.tar.gz
+/assertions-1.8.3.tar.gz
+/assertions-b2de0cb4f26d0705483a2f495d89896d0b808573.tar.gz
diff --git a/golang-github-smartystreets-assertions.spec b/golang-github-smartystreets-assertions.spec
index 7f0680d..dcafebd 100644
--- a/golang-github-smartystreets-assertions.spec
+++ b/golang-github-smartystreets-assertions.spec
@@ -1,171 +1,63 @@
-# If any of the following macros should be set otherwise,
-# you can wrap any of them with the following conditions:
-# - %%if 0%%{centos} == 7
-# - %%if 0%%{?rhel} == 7
-# - %%if 0%%{?fedora} == 23
-# Or just test for particular distribution:
-# - %%if 0%%{centos}
-# - %%if 0%%{?rhel}
-# - %%if 0%%{?fedora}
-#
-# Be aware, on centos, both %%rhel and %%centos are set. If you want to test
-# rhel specific macros, you can use %%if 0%%{?rhel} && 0%%{?centos} == 0 condition.
-# (Don't forget to replace double percentage symbol with single one in order to apply a condition)
-
-# Generate devel rpm
-%global with_devel 1
-# Build project from bundled dependencies
-%global with_bundled 0
-# Build with debug info rpm
-%global with_debug 0
-# Run tests in check section
-# Failing test
-%global with_check 0
-# Generate unit-test rpm
-%global with_unit_test 1
-
-%if 0%{?with_debug}
-%global _dwz_low_mem_die_limit 0
-%else
-%global debug_package %{nil}
-%endif
-
-%global provider github
-%global provider_tld com
-%global project smartystreets
-%global repo assertions
# https://github.com/smartystreets/assertions
-%global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo}
-%global import_path %{provider_prefix}
-%global commit 287b4346dc4e71a038c346375a9d572453bc469b
-%global shortcommit %(c=%{commit}; echo ${c:0:7})
-
-Name: golang-%{provider}-%{project}-%{repo}
-Version: 1.6.0
-Release: 0.8.git%{shortcommit}%{?dist}
+%global goipath github.com/smartystreets/assertions
+%global commit b2de0cb4f26d0705483a2f495d89896d0b808573
+
+%global common_description %{expand:
+Package assertions contains the implementations for all assertions which are
+referenced in goconvey's convey package
+(github.com/smartystreets/goconvey/convey) and gunit
+(github.com/smartystreets/gunit) for use with the So(...) method. They can
+also be used in traditional Go test functions and even in applications.}
+
+%gometa
+
+Name: %{goname}
+Version: 1.8.3
+Release: 1%{?dist}
Summary: Fluent assertion-style functions
License: MIT
-URL: https://%{provider_prefix}
-Source0: https://%{provider_prefix}/archive/%{commit}/%{repo}-%{shortcommit}.tar.gz
+URL: %{gourl}
+Source0: %{gosource}
-# e.g. el6 has ppc64 arch without gcc-go, so EA tag is required
-ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
-# If go_compiler is not set to 1, there is no virtual provide. Use golang instead.
-BuildRequires: %{?go_compiler:compiler(go-compiler)}%{!?go_compiler:golang}
%description
-%{summary}
+%{common_description}
+
-%if 0%{?with_devel}
%package devel
Summary: %{summary}
BuildArch: noarch
-%if 0%{?with_check}
-BuildRequires: golang(golang.org/x/net/context)
-%endif
-
-Requires: golang(golang.org/x/net/context)
-
-Provides: golang(%{import_path}) = %{version}-%{release}
-Provides: golang(%{import_path}/should) = %{version}-%{release}
-
%description devel
-%{summary}
+%{common_description}
This package contains library source intended for
building other packages which use import path with
-%{import_path} prefix.
-%endif
-
-%if 0%{?with_unit_test}
-%package unit-test
-Summary: Unit tests for %{name} package
+%{goipath} prefix.
-%if 0%{?with_check}
-#Here comes all BuildRequires: PACKAGE the unit tests
-#in %%check section need for running
-%endif
-
-# test subpackage tests code from devel subpackage
-Requires: %{name}-devel = %{version}-%{release}
-
-%description unit-test
-%{summary}
-
-This package contains unit tests for project
-providing packages with %{import_path} prefix.
-%endif
%prep
-%setup -q -n %{repo}-%{commit}
+%forgeautosetup
-%build
%install
-# source codes for building projects
-%if 0%{?with_devel}
-install -d -p %{buildroot}/%{gopath}/src/%{import_path}/
-echo "%%dir %%{gopath}/src/%%{import_path}/." >> devel.file-list
-# find all *.go but no *_test.go files and generate devel.file-list
-for file in $(find . -iname "*.go" \! -iname "*_test.go") ; do
- echo "%%dir %%{gopath}/src/%%{import_path}/$(dirname $file)" >> devel.file-list
- install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file)
- cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file
- echo "%%{gopath}/src/%%{import_path}/$file" >> devel.file-list
-done
-%endif
-
-# testing files for this project
-%if 0%{?with_unit_test}
-install -d -p %{buildroot}/%{gopath}/src/%{import_path}/
-# find all *_test.go files and generate unit-test.file-list
-for file in $(find . -iname "*_test.go"); do
- echo "%%dir %%{gopath}/src/%%{import_path}/$(dirname $file)" >> devel.file-list
- install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file)
- cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file
- echo "%%{gopath}/src/%%{import_path}/$file" >> unit-test.file-list
-done
-%endif
-
-%if 0%{?with_devel}
-sort -u -o devel.file-list devel.file-list
-%endif
+%goinstall
+
%check
-%if 0%{?with_check} && 0%{?with_unit_test} && 0%{?with_devel}
-%if ! 0%{?with_bundled}
-export GOPATH=%{buildroot}/%{gopath}:%{gopath}
-%else
-export GOPATH=%{buildroot}/%{gopath}:$(pwd)/Godeps/_workspace:%{gopath}
-%endif
-
-%if ! 0%{?gotest:1}
-%global gotest go test
-%endif
-
-%gotest %{import_path}
-# unitptr overflow on i386
-#%%gotest %{import_path}/internal/oglematchers
-%endif
-
-#define license tag if not already defined
-%{!?_licensedir:%global license %doc}
-
-%if 0%{?with_devel}
+%gochecks
+
+
%files devel -f devel.file-list
%license LICENSE.md
-%doc README.md
-%dir %{gopath}/src/%{provider}.%{provider_tld}/%{project}
-%endif
+%doc README.md CONTRIBUTING.md
-%if 0%{?with_unit_test}
-%files unit-test -f unit-test.file-list
-%license LICENSE.md
-%doc README.md
-%endif
%changelog
+* Sat Oct 06 2018 Robert-Andr Mauchin <zebob.m(a)gmail.com> - 1.8.3-1.20181006gitb2de0cb
+- Bump to commit b2de0cb4f26d0705483a2f495d89896d0b808573
+- Update with new Go packaging
+
* Fri Jul 13 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 1.6.0-0.8.git287b434
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
diff --git a/sources b/sources
index 634af61..5375d17 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-1979d8de146dda01b2b8994e345671cf assertions-287b434.tar.gz
+SHA512 (assertions-b2de0cb4f26d0705483a2f495d89896d0b808573.tar.gz) = 4e942f5f4f1708dd17ed48f046b34366e912337823a6df062e80ce30272d83c6935ede281bb984b51f905de764821d03d61972ec7cfcdac38ddc2d4e90e29b3a
5 years, 6 months
Architecture specific change in rpms/python2-matplotlib.git
by githook-noreply@fedoraproject.org
The package rpms/python2-matplotlib.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/python2-matplotlib.git/commit/?id....
Change:
+%ifarch i686 armv7hl
Thanks.
Full change:
============
commit 85a99d89be4f3081591d05d1c3d06dc3cf445182
Author: Mattias Ellert <mattias.ellert(a)physics.uu.se>
Date: Fri Oct 26 07:54:17 2018 +0200
Rebuild after unretirement
diff --git a/python2-matplotlib.spec b/python2-matplotlib.spec
index 3aa8ebe..07b8f54 100644
--- a/python2-matplotlib.spec
+++ b/python2-matplotlib.spec
@@ -41,7 +41,7 @@
Name: python2-matplotlib
Version: 2.2.3
-Release: 2%{?rctag:.%{rctag}}%{?dist}
+Release: 3%{?rctag:.%{rctag}}%{?dist}
Summary: Python 2D plotting library
# qt4_editor backend is MIT
License: Python and MIT
@@ -434,6 +434,9 @@ PYTHONDONTWRITEBYTECODE=1 \
%changelog
+* Fri Oct 26 2018 Mattias Ellert <mattias.ellert(a)physics.uu.se> - 2.2.3-3
+- Rebuild after unretirement
+
* Wed Sep 19 2018 Miro Hronok <mhroncok(a)redhat.com> - 2.2.3-2
- Split python2-matplotlib from python-matplotlib
commit 62d04f9f83e0b90017569008999f44038ea6ee1e
Author: Mattias Ellert <mattias.ellert(a)physics.uu.se>
Date: Fri Oct 26 06:49:30 2018 +0200
Unretire package
Revert "Undo the mess that was checked in."
This reverts commit 61325fb06712da5fca46a1577bd39b083312c09c.
diff --git a/0001-Force-using-system-qhull.patch b/0001-Force-using-system-qhull.patch
new file mode 100644
index 0000000..d8079bc
--- /dev/null
+++ b/0001-Force-using-system-qhull.patch
@@ -0,0 +1,43 @@
+From 46361ca058295e3f08d3c54196d990c497834306 Mon Sep 17 00:00:00 2001
+From: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
+Date: Fri, 30 Mar 2018 03:15:51 -0400
+Subject: [PATCH] Force using system qhull.
+
+Signed-off-by: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
+---
+ setupext.py | 17 ++---------------
+ 1 file changed, 2 insertions(+), 15 deletions(-)
+
+diff --git a/setupext.py b/setupext.py
+index d2ff239ad..30e0c9085 100644
+--- a/setupext.py
++++ b/setupext.py
+@@ -1318,23 +1318,10 @@ class Qhull(SetupPackage):
+
+ def check(self):
+ self.__class__.found_external = True
+- try:
+- return self._check_for_pkg_config(
+- 'libqhull', 'libqhull/qhull_a.h', min_version='2015.2')
+- except CheckFailed as e:
+- self.__class__.found_pkgconfig = False
+- self.__class__.found_external = False
+- return str(e) + ' Using local copy.'
++ return ' Using system copy.'
+
+ def add_flags(self, ext):
+- if self.found_external:
+- pkg_config.setup_extension(ext, 'qhull',
+- default_libraries=['qhull'])
+- else:
+- ext.include_dirs.insert(0, 'extern')
+- ext.sources.extend(sorted(glob.glob('extern/libqhull/*.c')))
+- if sysconfig.get_config_var('LIBM') == '-lm':
+- ext.libraries.extend('m')
++ ext.libraries.append('qhull')
+
+
+ class TTConv(SetupPackage):
+--
+2.14.3
+
diff --git a/0001-matplotlibrc-path-search-fix.patch b/0001-matplotlibrc-path-search-fix.patch
new file mode 100644
index 0000000..7c85c5d
--- /dev/null
+++ b/0001-matplotlibrc-path-search-fix.patch
@@ -0,0 +1,97 @@
+From e318adb6b70cdb27eb8cd5235909b8e8430080d7 Mon Sep 17 00:00:00 2001
+From: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
+Date: Wed, 27 Sep 2017 19:35:59 -0400
+Subject: [PATCH 1/3] matplotlibrc path search fix
+
+Signed-off-by: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
+---
+ lib/matplotlib/__init__.py | 8 +++++---
+ lib/matplotlib/tests/test_rcparams.py | 22 ++++++++++++++++------
+ 2 files changed, 21 insertions(+), 9 deletions(-)
+
+diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py
+index c5accc3c3..bc38f316c 100644
+--- a/lib/matplotlib/__init__.py
++++ b/lib/matplotlib/__init__.py
+@@ -738,9 +738,12 @@ def _get_data_path():
+
+ _file = _decode_filesystem_path(__file__)
+ path = os.sep.join([os.path.dirname(_file), 'mpl-data'])
++ path = '/usr/share/python2-matplotlib/mpl-data'
+ if os.path.isdir(path):
+ return path
+
++ raise RuntimeError('Could not find the matplotlib data files')
++
+ # setuptools' namespace_packages may highjack this init file
+ # so need to try something known to be in matplotlib, not basemap
+ import matplotlib.afm
+@@ -821,8 +824,7 @@ def matplotlib_fname():
+
+ - `$HOME/.matplotlib/matplotlibrc` if `$HOME` is defined.
+
+- - Lastly, it looks in `$MATPLOTLIBDATA/matplotlibrc` for a
+- system-defined copy.
++ - Lastly, it looks in `/etc/python2-matplotlibrc` for a system-defined copy.
+ """
+
+ def gen_candidates():
+@@ -835,7 +837,7 @@ def matplotlib_fname():
+ yield matplotlibrc
+ yield os.path.join(matplotlibrc, 'matplotlibrc')
+ yield os.path.join(_get_configdir(), 'matplotlibrc')
+- yield os.path.join(get_data_path(), 'matplotlibrc')
++ yield '/etc/python2-matplotlibrc'
+
+ for fname in gen_candidates():
+ if os.path.exists(fname):
+diff --git a/lib/matplotlib/tests/test_rcparams.py b/lib/matplotlib/tests/test_rcparams.py
+index c0378e1bf..7f14bcc46 100644
+--- a/lib/matplotlib/tests/test_rcparams.py
++++ b/lib/matplotlib/tests/test_rcparams.py
+@@ -424,14 +424,25 @@ def test_rcparams_reset_after_fail():
+ assert mpl.rcParams['text.usetex'] is False
+
+
+-def test_if_rctemplate_is_up_to_date():
++(a)pytest.fixture
++def mplrc():
++ # This is the Fedora-specific location ...
++ if 'MATPLOTLIBDATA' in os.environ:
++ # ... in buildroot.
++ return os.path.join(os.environ['MATPLOTLIBDATA'],
++ '../../../../etc/python2-matplotlibrc')
++ else:
++ # ... on installed systems.
++ return '/etc/python2-matplotlibrc'
++
++
++def test_if_rctemplate_is_up_to_date(mplrc):
+ # This tests if the matplotlibrc.template file
+ # contains all valid rcParams.
+ dep1 = mpl._all_deprecated
+ dep2 = mpl._deprecated_set
+ deprecated = list(dep1.union(dep2))
+- path_to_rc = os.path.join(mpl.get_data_path(), 'matplotlibrc')
+- with open(path_to_rc, "r") as f:
++ with open(mplrc, "r") as f:
+ rclines = f.readlines()
+ missing = {}
+ for k, v in mpl.defaultParams.items():
+@@ -453,11 +464,10 @@ def test_if_rctemplate_is_up_to_date():
+ .format(missing.items()))
+
+
+-def test_if_rctemplate_would_be_valid(tmpdir):
++def test_if_rctemplate_would_be_valid(tmpdir, mplrc):
+ # This tests if the matplotlibrc.template file would result in a valid
+ # rc file if all lines are uncommented.
+- path_to_rc = os.path.join(mpl.get_data_path(), 'matplotlibrc')
+- with open(path_to_rc, "r") as f:
++ with open(mplrc, "r") as f:
+ rclines = f.readlines()
+ newlines = []
+ for line in rclines:
+--
+2.17.1
+
diff --git a/0002-Increase-tolerances-for-non-x86_64-arches.patch b/0002-Increase-tolerances-for-non-x86_64-arches.patch
new file mode 100644
index 0000000..17d7262
--- /dev/null
+++ b/0002-Increase-tolerances-for-non-x86_64-arches.patch
@@ -0,0 +1,27 @@
+From ece1f936ba4c130cf82d3954a5e677d96ca3a854 Mon Sep 17 00:00:00 2001
+From: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
+Date: Tue, 23 Jan 2018 20:27:17 -0500
+Subject: [PATCH 2/3] Increase tolerances for non-x86_64 arches.
+
+Signed-off-by: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
+---
+ lib/matplotlib/tests/test_streamplot.py | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/lib/matplotlib/tests/test_streamplot.py b/lib/matplotlib/tests/test_streamplot.py
+index 81a51e711..4f70ce861 100644
+--- a/lib/matplotlib/tests/test_streamplot.py
++++ b/lib/matplotlib/tests/test_streamplot.py
+@@ -58,8 +58,7 @@ def test_linewidth():
+ linewidth=lw)
+
+
+-@image_comparison(baseline_images=['streamplot_masks_and_nans'],
+- tol=0.04 if on_win else 0)
++@image_comparison(baseline_images=['streamplot_masks_and_nans'], tol=0.01)
+ def test_masks_and_nans():
+ X, Y, U, V = velocity_field()
+ mask = np.zeros(U.shape, dtype=bool)
+--
+2.17.1
+
diff --git a/0003-Increase-some-tolerances-for-32-bit-systems.patch b/0003-Increase-some-tolerances-for-32-bit-systems.patch
new file mode 100644
index 0000000..5b767d7
--- /dev/null
+++ b/0003-Increase-some-tolerances-for-32-bit-systems.patch
@@ -0,0 +1,567 @@
+From b8a97810843ff739cb98cb5159843f2836dbd8b3 Mon Sep 17 00:00:00 2001
+From: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
+Date: Sat, 31 Mar 2018 00:15:14 -0400
+Subject: [PATCH 3/3] Increase some tolerances for 32-bit systems.
+
+Signed-off-by: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
+---
+ lib/matplotlib/testing/decorators.py | 2 +-
+ lib/matplotlib/tests/test_artist.py | 3 +-
+ lib/matplotlib/tests/test_axes.py | 47 +++++++++----------
+ lib/matplotlib/tests/test_collections.py | 2 +-
+ lib/matplotlib/tests/test_colorbar.py | 11 +++--
+ .../tests/test_constrainedlayout.py | 2 +-
+ lib/matplotlib/tests/test_contour.py | 6 +--
+ lib/matplotlib/tests/test_image.py | 2 +-
+ lib/matplotlib/tests/test_mathtext.py | 4 +-
+ lib/matplotlib/tests/test_patches.py | 3 +-
+ lib/matplotlib/tests/test_patheffects.py | 2 +-
+ lib/matplotlib/tests/test_pickle.py | 2 +-
+ lib/matplotlib/tests/test_quiver.py | 2 +-
+ lib/matplotlib/tests/test_streamplot.py | 3 +-
+ lib/matplotlib/tests/test_transforms.py | 2 +-
+ .../tests/test_axisartist_floating_axes.py | 4 +-
+ ...test_axisartist_grid_helper_curvelinear.py | 6 +--
+ lib/mpl_toolkits/tests/test_mplot3d.py | 4 +-
+ 18 files changed, 53 insertions(+), 54 deletions(-)
+
+diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py
+index 0ce6e6252..9a80eec1a 100644
+--- a/lib/matplotlib/testing/decorators.py
++++ b/lib/matplotlib/testing/decorators.py
+@@ -408,7 +408,7 @@ def _pytest_image_comparison(baseline_images, extensions, tol,
+ return decorator
+
+
+-def image_comparison(baseline_images, extensions=None, tol=0,
++def image_comparison(baseline_images, extensions=None, tol=0.1,
+ freetype_version=None, remove_text=False,
+ savefig_kwarg=None,
+ # Default of mpl_test_settings fixture and cleanup too.
+diff --git a/lib/matplotlib/tests/test_artist.py b/lib/matplotlib/tests/test_artist.py
+index e6aff72bf..b60305bcf 100644
+--- a/lib/matplotlib/tests/test_artist.py
++++ b/lib/matplotlib/tests/test_artist.py
+@@ -96,7 +96,8 @@ def test_collection_transform_of_none():
+ assert isinstance(c._transOffset, mtransforms.IdentityTransform)
+
+
+-@image_comparison(baseline_images=["clip_path_clipping"], remove_text=True)
++@image_comparison(baseline_images=["clip_path_clipping"], remove_text=True,
++ tol=0.28)
+ def test_clipping():
+ exterior = mpath.Path.unit_rectangle().deepcopy()
+ exterior.vertices *= 4
+diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py
+index 2fa6c2c94..8c589f514 100644
+--- a/lib/matplotlib/tests/test_axes.py
++++ b/lib/matplotlib/tests/test_axes.py
+@@ -555,7 +555,7 @@ def test_single_point():
+ plt.plot('b', 'b', 'o', data=data)
+
+
+-@image_comparison(baseline_images=['single_date'])
++@image_comparison(baseline_images=['single_date'], tol=1.97)
+ def test_single_date():
+ time1 = [721964.0]
+ data1 = [-65.54]
+@@ -739,8 +739,7 @@ def test_polar_rlabel_position():
+ ax.tick_params(rotation='auto')
+
+
+-@image_comparison(baseline_images=['polar_theta_wedge'], style='default',
+- tol=0.01 if six.PY2 else 0)
++@image_comparison(baseline_images=['polar_theta_wedge'], style='default')
+ def test_polar_theta_limits():
+ r = np.arange(0, 3.0, 0.01)
+ theta = 2*np.pi*r
+@@ -1023,7 +1022,7 @@ def test_fill_between_interpolate():
+
+
+ @image_comparison(baseline_images=['fill_between_interpolate_decreasing'],
+- style='mpl20', remove_text=True)
++ style='mpl20', remove_text=True, tol=0.78)
+ def test_fill_between_interpolate_decreasing():
+ p = np.array([724.3, 700, 655])
+ t = np.array([9.4, 7, 2.2])
+@@ -1105,7 +1104,7 @@ def test_pcolormesh():
+
+
+ @image_comparison(baseline_images=['pcolormesh_datetime_axis'],
+- extensions=['png'], remove_text=False)
++ extensions=['png'], remove_text=False, tol=0.19)
+ def test_pcolormesh_datetime_axis():
+ fig = plt.figure()
+ fig.subplots_adjust(hspace=0.4, top=0.98, bottom=.15)
+@@ -1131,7 +1130,7 @@ def test_pcolormesh_datetime_axis():
+
+
+ @image_comparison(baseline_images=['pcolor_datetime_axis'],
+- extensions=['png'], remove_text=False)
++ extensions=['png'], remove_text=False, tol=0.19)
+ def test_pcolor_datetime_axis():
+ fig = plt.figure()
+ fig.subplots_adjust(hspace=0.4, top=0.98, bottom=.15)
+@@ -1188,7 +1187,7 @@ def test_canonical():
+
+
+ @image_comparison(baseline_images=['arc_angles'], remove_text=True,
+- style='default', extensions=['png'])
++ style='default', extensions=['png'], tol=0.17)
+ def test_arc_angles():
+ from matplotlib import patches
+ # Ellipse parameters
+@@ -2450,7 +2449,7 @@ def test_boxplot_mod_artist_after_plotting():
+
+ @image_comparison(baseline_images=['violinplot_vert_baseline',
+ 'violinplot_vert_baseline'],
+- extensions=['png'])
++ extensions=['png'], tol=0.24)
+ def test_vert_violinplot_baseline():
+ # First 9 digits of frac(sqrt(2))
+ np.random.seed(414213562)
+@@ -2468,7 +2467,7 @@ def test_vert_violinplot_baseline():
+
+
+ @image_comparison(baseline_images=['violinplot_vert_showmeans'],
+- extensions=['png'])
++ extensions=['png'], tol=0.23)
+ def test_vert_violinplot_showmeans():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(3))
+@@ -2479,7 +2478,7 @@ def test_vert_violinplot_showmeans():
+
+
+ @image_comparison(baseline_images=['violinplot_vert_showextrema'],
+- extensions=['png'])
++ extensions=['png'], tol=0.23)
+ def test_vert_violinplot_showextrema():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(5))
+@@ -2490,7 +2489,7 @@ def test_vert_violinplot_showextrema():
+
+
+ @image_comparison(baseline_images=['violinplot_vert_showmedians'],
+- extensions=['png'])
++ extensions=['png'], tol=0.23)
+ def test_vert_violinplot_showmedians():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(7))
+@@ -2501,7 +2500,7 @@ def test_vert_violinplot_showmedians():
+
+
+ @image_comparison(baseline_images=['violinplot_vert_showall'],
+- extensions=['png'])
++ extensions=['png'], tol=0.2)
+ def test_vert_violinplot_showall():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(11))
+@@ -2512,7 +2511,7 @@ def test_vert_violinplot_showall():
+
+
+ @image_comparison(baseline_images=['violinplot_vert_custompoints_10'],
+- extensions=['png'])
++ extensions=['png'], tol=0.22)
+ def test_vert_violinplot_custompoints_10():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(13))
+@@ -2523,7 +2522,7 @@ def test_vert_violinplot_custompoints_10():
+
+
+ @image_comparison(baseline_images=['violinplot_vert_custompoints_200'],
+- extensions=['png'])
++ extensions=['png'], tol=0.22)
+ def test_vert_violinplot_custompoints_200():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(17))
+@@ -2534,7 +2533,7 @@ def test_vert_violinplot_custompoints_200():
+
+
+ @image_comparison(baseline_images=['violinplot_horiz_baseline'],
+- extensions=['png'])
++ extensions=['png'], tol=0.2)
+ def test_horiz_violinplot_baseline():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(19))
+@@ -2545,7 +2544,7 @@ def test_horiz_violinplot_baseline():
+
+
+ @image_comparison(baseline_images=['violinplot_horiz_showmedians'],
+- extensions=['png'])
++ extensions=['png'], tol=0.23)
+ def test_horiz_violinplot_showmedians():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(23))
+@@ -2556,7 +2555,7 @@ def test_horiz_violinplot_showmedians():
+
+
+ @image_comparison(baseline_images=['violinplot_horiz_showmeans'],
+- extensions=['png'])
++ extensions=['png'], tol=0.25)
+ def test_horiz_violinplot_showmeans():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(29))
+@@ -2567,7 +2566,7 @@ def test_horiz_violinplot_showmeans():
+
+
+ @image_comparison(baseline_images=['violinplot_horiz_showextrema'],
+- extensions=['png'])
++ extensions=['png'], tol=0.2)
+ def test_horiz_violinplot_showextrema():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(31))
+@@ -2578,7 +2577,7 @@ def test_horiz_violinplot_showextrema():
+
+
+ @image_comparison(baseline_images=['violinplot_horiz_showall'],
+- extensions=['png'])
++ extensions=['png'], tol=0.19)
+ def test_horiz_violinplot_showall():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(37))
+@@ -2589,7 +2588,7 @@ def test_horiz_violinplot_showall():
+
+
+ @image_comparison(baseline_images=['violinplot_horiz_custompoints_10'],
+- extensions=['png'])
++ extensions=['png'], tol=0.22)
+ def test_horiz_violinplot_custompoints_10():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(41))
+@@ -2600,7 +2599,7 @@ def test_horiz_violinplot_custompoints_10():
+
+
+ @image_comparison(baseline_images=['violinplot_horiz_custompoints_200'],
+- extensions=['png'])
++ extensions=['png'], tol=0.22)
+ def test_horiz_violinplot_custompoints_200():
+ ax = plt.axes()
+ # First 9 digits of frac(sqrt(43))
+@@ -3947,7 +3946,7 @@ def test_psd_noise():
+
+
+ @image_comparison(baseline_images=['csd_freqs'], remove_text=True,
+- extensions=['png'], tol=0.002)
++ extensions=['png'], tol=0.21)
+ def test_csd_freqs():
+ '''test axes.csd with sinusoidal stimuli'''
+ n = 10000
+@@ -4806,7 +4805,7 @@ def test_rc_spines():
+
+
+ @image_comparison(baseline_images=['rc_grid'], extensions=['png'],
+- savefig_kwarg={'dpi': 40})
++ savefig_kwarg={'dpi': 40}, tol=0.2)
+ def test_rc_grid():
+ fig = plt.figure()
+ rc_dict0 = {
+@@ -5301,7 +5300,7 @@ def test_date_timezone_y():
+
+
+ @image_comparison(baseline_images=['date_timezone_x_and_y'],
+- extensions=['png'])
++ extensions=['png'], tol=3.05)
+ def test_date_timezone_x_and_y():
+ # Tests issue 5575
+ time_index = [pytz.timezone('UTC').localize(datetime.datetime(
+diff --git a/lib/matplotlib/tests/test_collections.py b/lib/matplotlib/tests/test_collections.py
+index 291647d17..265f23fed 100644
+--- a/lib/matplotlib/tests/test_collections.py
++++ b/lib/matplotlib/tests/test_collections.py
+@@ -467,7 +467,7 @@ def test_EllipseCollection():
+
+
+ @image_comparison(baseline_images=['polycollection_close'],
+- extensions=['png'], remove_text=True)
++ extensions=['png'], remove_text=True, tol=0.45)
+ def test_polycollection_close():
+ from mpl_toolkits.mplot3d import Axes3D
+
+diff --git a/lib/matplotlib/tests/test_colorbar.py b/lib/matplotlib/tests/test_colorbar.py
+index 12a9bed3b..86d2358fb 100644
+--- a/lib/matplotlib/tests/test_colorbar.py
++++ b/lib/matplotlib/tests/test_colorbar.py
+@@ -95,7 +95,7 @@ def _colorbar_extension_length(spacing):
+ @image_comparison(
+ baseline_images=['colorbar_extensions_shape_uniform',
+ 'colorbar_extensions_shape_proportional'],
+- extensions=['png'])
++ extensions=['png'], tol=0.16)
+ def test_colorbar_extension_shape():
+ '''Test rectangular colorbar extensions.'''
+ # Create figures for uniform and proportionally spaced colorbars.
+@@ -105,7 +105,7 @@ def test_colorbar_extension_shape():
+
+ @image_comparison(baseline_images=['colorbar_extensions_uniform',
+ 'colorbar_extensions_proportional'],
+- extensions=['png'])
++ extensions=['png'], tol=0.25)
+ def test_colorbar_extension_length():
+ '''Test variable length colorbar extensions.'''
+ # Create figures for uniform and proportionally spaced colorbars.
+@@ -119,7 +119,7 @@ def test_colorbar_extension_length():
+ 'cbar_sharing',
+ ],
+ extensions=['png'], remove_text=True,
+- savefig_kwarg={'dpi': 40})
++ savefig_kwarg={'dpi': 40}, tol=0.17)
+ def test_colorbar_positioning():
+ data = np.arange(1200).reshape(30, 40)
+ levels = [0, 200, 400, 600, 800, 1000, 1200]
+@@ -173,7 +173,7 @@ def test_colorbar_positioning():
+
+ @image_comparison(baseline_images=['cbar_with_subplots_adjust'],
+ extensions=['png'], remove_text=True,
+- savefig_kwarg={'dpi': 40})
++ savefig_kwarg={'dpi': 40}, tol=0.17)
+ def test_gridspec_make_colorbar():
+ plt.figure()
+ data = np.arange(1200).reshape(30, 40)
+@@ -232,7 +232,8 @@ def test_colorbarbase():
+
+ @image_comparison(
+ baseline_images=['colorbar_closed_patch'],
+- remove_text=True)
++ remove_text=True,
++ tol=0.22)
+ def test_colorbar_closed_patch():
+ fig = plt.figure(figsize=(8, 6))
+ ax1 = fig.add_axes([0.05, 0.85, 0.9, 0.1])
+diff --git a/lib/matplotlib/tests/test_constrainedlayout.py b/lib/matplotlib/tests/test_constrainedlayout.py
+index fcf633a08..cad431771 100644
+--- a/lib/matplotlib/tests/test_constrainedlayout.py
++++ b/lib/matplotlib/tests/test_constrainedlayout.py
+@@ -295,7 +295,7 @@ def test_constrained_layout12():
+ ax.set_xlabel('x-label')
+
+
+-@image_comparison(baseline_images=['constrained_layout13'], tol=2.e-2,
++@image_comparison(baseline_images=['constrained_layout13'], tol=3.e-2,
+ extensions=['png'])
+ def test_constrained_layout13():
+ 'Test that padding works.'
+diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py
+index 42903ac68..f03a5d0af 100644
+--- a/lib/matplotlib/tests/test_contour.py
++++ b/lib/matplotlib/tests/test_contour.py
+@@ -217,7 +217,7 @@ def test_given_colors_levels_and_extends():
+
+
+ @image_comparison(baseline_images=['contour_datetime_axis'],
+- extensions=['png'], remove_text=False)
++ extensions=['png'], remove_text=False, tol=0.18)
+ def test_contour_datetime_axis():
+ fig = plt.figure()
+ fig.subplots_adjust(hspace=0.4, top=0.98, bottom=.15)
+@@ -243,7 +243,7 @@ def test_contour_datetime_axis():
+
+
+ @image_comparison(baseline_images=['contour_test_label_transforms'],
+- extensions=['png'], remove_text=True)
++ extensions=['png'], remove_text=True, tol=1.38)
+ def test_labels():
+ # Adapted from pylab_examples example code: contour_demo.py
+ # see issues #2475, #2843, and #2818 for explanation
+@@ -274,7 +274,7 @@ def test_labels():
+
+ @image_comparison(baseline_images=['contour_corner_mask_False',
+ 'contour_corner_mask_True'],
+- extensions=['png'], remove_text=True)
++ extensions=['png'], remove_text=True, tol=0.19)
+ def test_corner_mask():
+ n = 60
+ mask_level = 0.95
+diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py
+index e6da25789..ed3ab63c9 100644
+--- a/lib/matplotlib/tests/test_image.py
++++ b/lib/matplotlib/tests/test_image.py
+@@ -768,7 +768,7 @@ def test_imshow_endianess():
+
+
+ @image_comparison(baseline_images=['imshow_masked_interpolation'],
+- remove_text=True, style='mpl20')
++ remove_text=True, style='mpl20', tol=0.25)
+ def test_imshow_masked_interpolation():
+
+ cm = copy(plt.get_cmap('viridis'))
+diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py
+index cdc1093e1..ac0d8bf05 100644
+--- a/lib/matplotlib/tests/test_mathtext.py
++++ b/lib/matplotlib/tests/test_mathtext.py
+@@ -173,7 +173,7 @@ def baseline_images(request, fontset, index):
+ ['cm', 'stix', 'stixsans', 'dejavusans',
+ 'dejavuserif'])
+ @pytest.mark.parametrize('baseline_images', ['mathtext'], indirect=True)
+-@image_comparison(baseline_images=None)
++@image_comparison(baseline_images=None, tol=0.31)
+ def test_mathtext_rendering(baseline_images, fontset, index, test):
+ matplotlib.rcParams['mathtext.fontset'] = fontset
+ fig = plt.figure(figsize=(5.25, 0.75))
+@@ -187,7 +187,7 @@ def test_mathtext_rendering(baseline_images, fontset, index, test):
+ ['cm', 'stix', 'stixsans', 'dejavusans',
+ 'dejavuserif'])
+ @pytest.mark.parametrize('baseline_images', ['mathfont'], indirect=True)
+-@image_comparison(baseline_images=None, extensions=['png'])
++@image_comparison(baseline_images=None, extensions=['png'], tol=0.3)
+ def test_mathfont_rendering(baseline_images, fontset, index, test):
+ matplotlib.rcParams['mathtext.fontset'] = fontset
+ fig = plt.figure(figsize=(5.25, 0.75))
+diff --git a/lib/matplotlib/tests/test_patches.py b/lib/matplotlib/tests/test_patches.py
+index ff1abb9c6..cc90e6bb0 100644
+--- a/lib/matplotlib/tests/test_patches.py
++++ b/lib/matplotlib/tests/test_patches.py
+@@ -266,9 +266,8 @@ def test_wedge_movement():
+ assert getattr(w, attr) == new_v
+
+
+-# png needs tol>=0.06, pdf tol>=1.617
+ @image_comparison(baseline_images=['wedge_range'],
+- remove_text=True, tol=1.65 if on_win else 0)
++ remove_text=True)
+ def test_wedge_range():
+ ax = plt.axes()
+
+diff --git a/lib/matplotlib/tests/test_patheffects.py b/lib/matplotlib/tests/test_patheffects.py
+index fe7265957..2addc35ed 100644
+--- a/lib/matplotlib/tests/test_patheffects.py
++++ b/lib/matplotlib/tests/test_patheffects.py
+@@ -121,7 +121,7 @@ def test_SimplePatchShadow_offset():
+ assert pe._offset == (4, 5)
+
+
+-@image_comparison(baseline_images=['collection'], tol=0.02)
++@image_comparison(baseline_images=['collection'], tol=0.084)
+ def test_collection():
+ x, y = np.meshgrid(np.linspace(0, 10, 150), np.linspace(-5, 5, 100))
+ data = np.sin(x) + np.cos(y)
+diff --git a/lib/matplotlib/tests/test_pickle.py b/lib/matplotlib/tests/test_pickle.py
+index 89a5a512e..a25961284 100644
+--- a/lib/matplotlib/tests/test_pickle.py
++++ b/lib/matplotlib/tests/test_pickle.py
+@@ -42,7 +42,7 @@ def test_simple():
+
+ @image_comparison(baseline_images=['multi_pickle'],
+ extensions=['png'], remove_text=True,
+- style='mpl20')
++ style='mpl20', tol=0.11)
+ def test_complete():
+ fig = plt.figure('Figure with a label?', figsize=(10, 6))
+
+diff --git a/lib/matplotlib/tests/test_quiver.py b/lib/matplotlib/tests/test_quiver.py
+index a0e1e674f..ede6bfc64 100644
+--- a/lib/matplotlib/tests/test_quiver.py
++++ b/lib/matplotlib/tests/test_quiver.py
+@@ -131,7 +131,7 @@ def test_quiver_key_pivot():
+
+
+ @image_comparison(baseline_images=['barbs_test_image'],
+- extensions=['png'], remove_text=True)
++ extensions=['png'], remove_text=True, tol=0.11)
+ def test_barbs():
+ x = np.linspace(-5, 5, 5)
+ X, Y = np.meshgrid(x, x)
+diff --git a/lib/matplotlib/tests/test_streamplot.py b/lib/matplotlib/tests/test_streamplot.py
+index 4f70ce861..5bc8184f7 100644
+--- a/lib/matplotlib/tests/test_streamplot.py
++++ b/lib/matplotlib/tests/test_streamplot.py
+@@ -39,8 +39,7 @@ def test_startpoints():
+ plt.plot(start_x, start_y, 'ok')
+
+
+-@image_comparison(baseline_images=['streamplot_colormap'],
+- tol=.02)
++@image_comparison(baseline_images=['streamplot_colormap'])
+ def test_colormap():
+ X, Y, U, V = velocity_field()
+ plt.streamplot(X, Y, U, V, color=U, density=0.6, linewidth=2,
+diff --git a/lib/matplotlib/tests/test_transforms.py b/lib/matplotlib/tests/test_transforms.py
+index 06985db84..8efaef898 100644
+--- a/lib/matplotlib/tests/test_transforms.py
++++ b/lib/matplotlib/tests/test_transforms.py
+@@ -74,7 +74,7 @@ def test_external_transform_api():
+
+
+ @image_comparison(baseline_images=['pre_transform_data'],
+- tol=0.08)
++ tol=0.155)
+ def test_pre_transform_plotting():
+ # a catch-all for as many as possible plot layouts which handle
+ # pre-transforming the data NOTE: The axis range is important in this
+diff --git a/lib/mpl_toolkits/tests/test_axisartist_floating_axes.py b/lib/mpl_toolkits/tests/test_axisartist_floating_axes.py
+index de7226609..2676fc842 100644
+--- a/lib/mpl_toolkits/tests/test_axisartist_floating_axes.py
++++ b/lib/mpl_toolkits/tests/test_axisartist_floating_axes.py
+@@ -24,7 +24,7 @@ def test_subplot():
+
+
+ @image_comparison(baseline_images=['curvelinear3'],
+- extensions=['png'], style='default', tol=0.01)
++ extensions=['png'], style='default', tol=0.02)
+ def test_curvelinear3():
+ fig = plt.figure(figsize=(5, 5))
+ fig.clf()
+@@ -80,7 +80,7 @@ def test_curvelinear3():
+
+
+ @image_comparison(baseline_images=['curvelinear4'],
+- extensions=['png'], style='default', tol=0.01)
++ extensions=['png'], style='default', tol=0.055)
+ def test_curvelinear4():
+ fig = plt.figure(figsize=(5, 5))
+ fig.clf()
+diff --git a/lib/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py b/lib/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py
+index a7c637428..e22f4ac3e 100644
+--- a/lib/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py
++++ b/lib/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py
+@@ -19,7 +19,7 @@ from mpl_toolkits.axisartist.grid_helper_curvelinear import \
+
+
+ @image_comparison(baseline_images=['custom_transform'],
+- extensions=['png'], style='default', tol=0.03)
++ extensions=['png'], style='default', tol=0.035)
+ def test_custom_transform():
+ class MyTransform(Transform):
+ input_dims = 2
+@@ -91,7 +91,7 @@ def test_custom_transform():
+
+
+ @image_comparison(baseline_images=['polar_box'],
+- extensions=['png'], style='default', tol=0.03)
++ extensions=['png'], style='default', tol=0.08)
+ def test_polar_box():
+ fig = plt.figure(figsize=(5, 5))
+
+@@ -152,7 +152,7 @@ def test_polar_box():
+
+
+ @image_comparison(baseline_images=['axis_direction'],
+- extensions=['png'], style='default', tol=0.03)
++ extensions=['png'], style='default', tol=0.05)
+ def test_axis_direction():
+ fig = plt.figure(figsize=(5, 5))
+
+diff --git a/lib/mpl_toolkits/tests/test_mplot3d.py b/lib/mpl_toolkits/tests/test_mplot3d.py
+index 0a506db92..44e1681fc 100644
+--- a/lib/mpl_toolkits/tests/test_mplot3d.py
++++ b/lib/mpl_toolkits/tests/test_mplot3d.py
+@@ -225,7 +225,7 @@ def test_text3d():
+ ax.set_zlabel('Z axis')
+
+
+-@image_comparison(baseline_images=['trisurf3d'], remove_text=True, tol=0.03)
++@image_comparison(baseline_images=['trisurf3d'], remove_text=True, tol=0.05)
+ def test_trisurf3d():
+ n_angles = 36
+ n_radii = 8
+@@ -704,7 +704,7 @@ class TestVoxels(object):
+ @image_comparison(
+ baseline_images=['voxels-xyz'],
+ extensions=['png'],
+- tol=0.01
++ tol=0.02
+ )
+ def test_xyz(self):
+ fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
+--
+2.17.1
+
diff --git a/0003-Increase-some-tolerances-for-non-x86-arches.patch b/0003-Increase-some-tolerances-for-non-x86-arches.patch
new file mode 100644
index 0000000..e30ab11
--- /dev/null
+++ b/0003-Increase-some-tolerances-for-non-x86-arches.patch
@@ -0,0 +1,278 @@
+From 3e2bfee4e8ce28fffa7e9cd0a054429af2e2ebe3 Mon Sep 17 00:00:00 2001
+From: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
+Date: Sat, 31 Mar 2018 00:33:37 -0400
+Subject: [PATCH 3/3] Increase some tolerances for non-x86 arches.
+
+Signed-off-by: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
+---
+ lib/matplotlib/tests/test_arrow_patches.py | 4 ++--
+ lib/matplotlib/tests/test_axes.py | 7 ++++---
+ lib/matplotlib/tests/test_backends_interactive.py | 2 +-
+ lib/matplotlib/tests/test_collections.py | 2 +-
+ lib/matplotlib/tests/test_constrainedlayout.py | 2 +-
+ lib/matplotlib/tests/test_cycles.py | 6 +++---
+ lib/matplotlib/tests/test_figure.py | 2 +-
+ lib/matplotlib/tests/test_image.py | 2 +-
+ lib/matplotlib/tests/test_legend.py | 6 +++---
+ lib/matplotlib/tests/test_pickle.py | 2 +-
+ lib/matplotlib/tests/test_scale.py | 2 +-
+ lib/matplotlib/tests/test_streamplot.py | 2 +-
+ lib/matplotlib/tests/test_units.py | 4 ++--
+ .../tests/test_axisartist_grid_helper_curvelinear.py | 2 +-
+ 14 files changed, 23 insertions(+), 22 deletions(-)
+
+diff --git a/lib/matplotlib/tests/test_arrow_patches.py b/lib/matplotlib/tests/test_arrow_patches.py
+index 44f87c5fe..fb50ae710 100644
+--- a/lib/matplotlib/tests/test_arrow_patches.py
++++ b/lib/matplotlib/tests/test_arrow_patches.py
+@@ -68,7 +68,7 @@ def __prepare_fancyarrow_dpi_cor_test():
+
+
+ @image_comparison(baseline_images=['fancyarrow_dpi_cor_100dpi'],
+- remove_text=True, extensions=['png'],
++ remove_text=True, extensions=['png'], tol=0.016,
+ savefig_kwarg=dict(dpi=100))
+ def test_fancyarrow_dpi_cor_100dpi():
+ """
+@@ -83,7 +83,7 @@ def test_fancyarrow_dpi_cor_100dpi():
+
+
+ @image_comparison(baseline_images=['fancyarrow_dpi_cor_200dpi'],
+- remove_text=True, extensions=['png'],
++ remove_text=True, extensions=['png'], tol=0.019,
+ savefig_kwarg=dict(dpi=200))
+ def test_fancyarrow_dpi_cor_200dpi():
+ """
+diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py
+index 2fa6c2c94..f785e3e89 100644
+--- a/lib/matplotlib/tests/test_axes.py
++++ b/lib/matplotlib/tests/test_axes.py
+@@ -389,7 +389,7 @@ def test_annotate_default_arrow():
+ assert ann.arrow_patch is not None
+
+
+-@image_comparison(baseline_images=['polar_axes'], style='default')
++@image_comparison(baseline_images=['polar_axes'], style='default', tol=0.01)
+ def test_polar_annotations():
+ # you can specify the xypoint and the xytext in different
+ # positions and coordinate systems, and optionally turn on a
+@@ -3267,7 +3267,8 @@ def test_vertex_markers():
+
+
+ @image_comparison(baseline_images=['vline_hline_zorder',
+- 'errorbar_zorder'])
++ 'errorbar_zorder'],
++ tol=0.02)
+ def test_eb_line_zorder():
+ x = list(xrange(10))
+
+@@ -5000,7 +5001,7 @@ def test_title_location_roundtrip():
+
+
+ @image_comparison(baseline_images=["loglog"], remove_text=True,
+- extensions=['png'])
++ extensions=['png'], tol=0.009)
+ def test_loglog():
+ fig, ax = plt.subplots()
+ x = np.arange(1, 11)
+diff --git a/lib/matplotlib/tests/test_backends_interactive.py b/lib/matplotlib/tests/test_backends_interactive.py
+index df7a5d08a..3567d7f3d 100644
+--- a/lib/matplotlib/tests/test_backends_interactive.py
++++ b/lib/matplotlib/tests/test_backends_interactive.py
+@@ -55,4 +55,4 @@ def test_backend(backend):
+ environ["MPLBACKEND"] = backend
+ proc = Popen([sys.executable, "-c", _test_script], env=environ)
+ # Empirically, 1s is not enough on Travis.
+- assert proc.wait(timeout=10) == 0
++ assert proc.wait(timeout=30) == 0
+diff --git a/lib/matplotlib/tests/test_collections.py b/lib/matplotlib/tests/test_collections.py
+index 291647d17..6b623ef52 100644
+--- a/lib/matplotlib/tests/test_collections.py
++++ b/lib/matplotlib/tests/test_collections.py
+@@ -443,7 +443,7 @@ def test_barb_limits():
+
+
+ @image_comparison(baseline_images=['EllipseCollection_test_image'],
+- extensions=['png'],
++ extensions=['png'], tol=0.012,
+ remove_text=True)
+ def test_EllipseCollection():
+ # Test basic functionality
+diff --git a/lib/matplotlib/tests/test_constrainedlayout.py b/lib/matplotlib/tests/test_constrainedlayout.py
+index fcf633a08..725365d2e 100644
+--- a/lib/matplotlib/tests/test_constrainedlayout.py
++++ b/lib/matplotlib/tests/test_constrainedlayout.py
+@@ -222,7 +222,7 @@ def test_constrained_layout9():
+
+
+ @image_comparison(baseline_images=['constrained_layout10'],
+- extensions=['png'])
++ extensions=['png'], tol=0.01)
+ def test_constrained_layout10():
+ 'Test for handling legend outside axis'
+ fig, axs = plt.subplots(2, 2, constrained_layout=True)
+diff --git a/lib/matplotlib/tests/test_cycles.py b/lib/matplotlib/tests/test_cycles.py
+index dfa0f7c79..ac605c8ab 100644
+--- a/lib/matplotlib/tests/test_cycles.py
++++ b/lib/matplotlib/tests/test_cycles.py
+@@ -10,7 +10,7 @@ from cycler import cycler
+
+
+ @image_comparison(baseline_images=['color_cycle_basic'], remove_text=True,
+- extensions=['png'])
++ extensions=['png'], tol=0.008)
+ def test_colorcycle_basic():
+ fig, ax = plt.subplots()
+ ax.set_prop_cycle(cycler('color', ['r', 'g', 'y']))
+@@ -27,7 +27,7 @@ def test_colorcycle_basic():
+
+
+ @image_comparison(baseline_images=['marker_cycle', 'marker_cycle'],
+- remove_text=True, extensions=['png'])
++ remove_text=True, extensions=['png'], tol=0.008)
+ def test_marker_cycle():
+ fig, ax = plt.subplots()
+ ax.set_prop_cycle(cycler('c', ['r', 'g', 'y']) +
+@@ -60,7 +60,7 @@ def test_marker_cycle():
+
+
+ @image_comparison(baseline_images=['lineprop_cycle_basic'], remove_text=True,
+- extensions=['png'])
++ extensions=['png'], tol=0.009)
+ def test_linestylecycle_basic():
+ fig, ax = plt.subplots()
+ ax.set_prop_cycle(cycler('ls', ['-', '--', ':']))
+diff --git a/lib/matplotlib/tests/test_figure.py b/lib/matplotlib/tests/test_figure.py
+index 69752e17d..e7c57d470 100644
+--- a/lib/matplotlib/tests/test_figure.py
++++ b/lib/matplotlib/tests/test_figure.py
+@@ -14,7 +14,7 @@ import numpy as np
+ import pytest
+
+
+-@image_comparison(baseline_images=['figure_align_labels'])
++@image_comparison(baseline_images=['figure_align_labels'], tol=0.01)
+ def test_align_labels():
+ # Check the figure.align_labels() command
+ fig = plt.figure(tight_layout=True)
+diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py
+index e6da25789..626e9eb94 100644
+--- a/lib/matplotlib/tests/test_image.py
++++ b/lib/matplotlib/tests/test_image.py
+@@ -768,7 +768,7 @@ def test_imshow_endianess():
+
+
+ @image_comparison(baseline_images=['imshow_masked_interpolation'],
+- remove_text=True, style='mpl20')
++ remove_text=True, style='mpl20', tol=0.006)
+ def test_imshow_masked_interpolation():
+
+ cm = copy(plt.get_cmap('viridis'))
+diff --git a/lib/matplotlib/tests/test_legend.py b/lib/matplotlib/tests/test_legend.py
+index 55b8adc77..1784ff966 100644
+--- a/lib/matplotlib/tests/test_legend.py
++++ b/lib/matplotlib/tests/test_legend.py
+@@ -145,7 +145,7 @@ def test_multiple_keys():
+
+
+ @image_comparison(baseline_images=['rgba_alpha'],
+- extensions=['png'], remove_text=True)
++ extensions=['png'], remove_text=True, tol=0.007)
+ def test_alpha_rgba():
+ import matplotlib.pyplot as plt
+
+@@ -156,7 +156,7 @@ def test_alpha_rgba():
+
+
+ @image_comparison(baseline_images=['rcparam_alpha'],
+- extensions=['png'], remove_text=True)
++ extensions=['png'], remove_text=True, tol=0.007)
+ def test_alpha_rcparam():
+ import matplotlib.pyplot as plt
+
+@@ -183,7 +183,7 @@ def test_fancy():
+ ncol=2, shadow=True, title="My legend", numpoints=1)
+
+
+-@image_comparison(baseline_images=['framealpha'], remove_text=True)
++@image_comparison(baseline_images=['framealpha'], remove_text=True, tol=0.018)
+ def test_framealpha():
+ x = np.linspace(1, 100, 100)
+ y = x
+diff --git a/lib/matplotlib/tests/test_pickle.py b/lib/matplotlib/tests/test_pickle.py
+index 89a5a512e..99051dee7 100644
+--- a/lib/matplotlib/tests/test_pickle.py
++++ b/lib/matplotlib/tests/test_pickle.py
+@@ -42,7 +42,7 @@ def test_simple():
+
+ @image_comparison(baseline_images=['multi_pickle'],
+ extensions=['png'], remove_text=True,
+- style='mpl20')
++ style='mpl20', tol=0.004)
+ def test_complete():
+ fig = plt.figure('Figure with a label?', figsize=(10, 6))
+
+diff --git a/lib/matplotlib/tests/test_scale.py b/lib/matplotlib/tests/test_scale.py
+index dd5b18182..ebebb0525 100644
+--- a/lib/matplotlib/tests/test_scale.py
++++ b/lib/matplotlib/tests/test_scale.py
+@@ -96,7 +96,7 @@ def test_logscale_transform_repr():
+
+
+ @image_comparison(baseline_images=['logscale_nonpos_values'], remove_text=True,
+- extensions=['png'], style='mpl20')
++ extensions=['png'], style='mpl20', tol=0.008)
+ def test_logscale_nonpos_values():
+ np.random.seed(19680801)
+ xs = np.random.normal(size=int(1e3))
+diff --git a/lib/matplotlib/tests/test_streamplot.py b/lib/matplotlib/tests/test_streamplot.py
+index 4f70ce861..4e52ed0c4 100644
+--- a/lib/matplotlib/tests/test_streamplot.py
++++ b/lib/matplotlib/tests/test_streamplot.py
+@@ -48,7 +48,7 @@ def test_colormap():
+ plt.colorbar()
+
+
+-@image_comparison(baseline_images=['streamplot_linewidth'])
++@image_comparison(baseline_images=['streamplot_linewidth'], tol=0.002)
+ def test_linewidth():
+ X, Y, U, V = velocity_field()
+ speed = np.sqrt(U*U + V*V)
+diff --git a/lib/matplotlib/tests/test_units.py b/lib/matplotlib/tests/test_units.py
+index 65c8da7ea..c69d1d531 100644
+--- a/lib/matplotlib/tests/test_units.py
++++ b/lib/matplotlib/tests/test_units.py
+@@ -43,7 +43,7 @@ class Quantity(object):
+
+ # Tests that the conversion machinery works properly for classes that
+ # work as a facade over numpy arrays (like pint)
+-@image_comparison(baseline_images=['plot_pint'],
++@image_comparison(baseline_images=['plot_pint'], tol=0.003,
+ extensions=['png'], remove_text=False, style='mpl20')
+ def test_numpy_facade():
+ # Create an instance of the conversion interface and
+@@ -87,7 +87,7 @@ def test_numpy_facade():
+
+
+ # Tests gh-8908
+-@image_comparison(baseline_images=['plot_masked_units'],
++@image_comparison(baseline_images=['plot_masked_units'], tol=0.007,
+ extensions=['png'], remove_text=True, style='mpl20')
+ def test_plot_masked_units():
+ data = np.linspace(-5, 5)
+diff --git a/lib/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py b/lib/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py
+index a7c637428..8fc5b25b1 100644
+--- a/lib/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py
++++ b/lib/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py
+@@ -91,7 +91,7 @@ def test_custom_transform():
+
+
+ @image_comparison(baseline_images=['polar_box'],
+- extensions=['png'], style='default', tol=0.03)
++ extensions=['png'], style='default', tol=0.04)
+ def test_polar_box():
+ fig = plt.figure(figsize=(5, 5))
+
+--
+2.17.1
+
diff --git a/dead.package b/dead.package
deleted file mode 100644
index 4f04ecb..0000000
--- a/dead.package
+++ /dev/null
@@ -1 +0,0 @@
-This is an EPEL-only package.
diff --git a/python2-matplotlib.spec b/python2-matplotlib.spec
new file mode 100644
index 0000000..3aa8ebe
--- /dev/null
+++ b/python2-matplotlib.spec
@@ -0,0 +1,987 @@
+%global with_html 0
+
+# It seems like there's some kind of weird occasional error where a
+# build (often aarch64 or ppc64) will fail in one of the Stix font
+# tests with a huge RMS difference, but if you run the same build again,
+# you won't get the same error. Unless someone can figure out what's
+# going on, we just have to keep re-running the build until it doesn't
+# happen.
+%global run_tests 1
+
+# the default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo
+# CocoaAgg MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG
+%global backend TkAgg
+
+%if "%{backend}" == "TkAgg"
+%global backend_subpackage tk
+%else
+% if "%{backend}" == "Qt4Agg"
+%global backend_subpackage qt4
+% else
+% if "%{backend}" == "Qt5Agg"
+%global backend_subpackage qt5
+% endif
+% endif
+%endif
+
+# https://fedorahosted.org/fpc/ticket/381
+%global with_bundled_fonts 1
+
+# Use the same directory of the main package for subpackage licence and docs
+%global _docdir_fmt %{name}
+
+#global rctag rc1
+
+# The version of FreeType in this Fedora branch.
+%if %{fedora} >= 29
+%global ftver 2.9.1
+%else
+%global ftver 2.8
+%endif
+
+Name: python2-matplotlib
+Version: 2.2.3
+Release: 2%{?rctag:.%{rctag}}%{?dist}
+Summary: Python 2D plotting library
+# qt4_editor backend is MIT
+License: Python and MIT
+URL: http://matplotlib.org
+Source0: https://github.com/matplotlib/matplotlib/archive/v%{version}%{?rctag}/mat...
+Source1: setup.cfg
+
+# Because the qhull package stopped shipping pkgconfig files.
+# https://src.fedoraproject.org/rpms/qhull/pull-request/1
+Patch0001: 0001-Force-using-system-qhull.patch
+
+# Fedora-specific patches; see:
+# https://github.com/QuLogic/matplotlib/tree/fedora-patches
+# https://github.com/QuLogic/matplotlib/tree/fedora-patches-non-x86
+# Updated test images for new FreeType.
+Source1000: https://github.com/QuLogic/mpl-images/archive/v%{version}-with-freetype-%...
+# Search in /etc/python2-matplotlibrc:
+Patch1001: 0001-matplotlibrc-path-search-fix.patch
+# Image tolerances for anything but x86_64:
+Patch1002: 0002-Increase-tolerances-for-non-x86_64-arches.patch
+# Image tolerances for 32-bit systems: i686 armv7hl
+Patch1003: 0003-Increase-some-tolerances-for-32-bit-systems.patch
+# Image tolerances for 64-bit (but not x86_64) systems: aarch64 ppc64(le) s390x
+Patch1004: 0003-Increase-some-tolerances-for-non-x86-arches.patch
+
+BuildRequires: freetype-devel
+BuildRequires: libpng-devel
+BuildRequires: qhull-devel
+BuildRequires: texlive-cm
+BuildRequires: xorg-x11-server-Xvfb
+BuildRequires: zlib-devel
+
+BuildRequires: python2-numpy
+BuildRequires: python2-pyparsing
+BuildRequires: python2-dateutil
+BuildRequires: python2-kiwisolver
+BuildRequires: python2-pyside
+BuildRequires: python2-setuptools
+BuildRequires: python2-six
+BuildRequires: python2-sphinx
+BuildRequires: python2-subprocess32
+BuildRequires: python2-devel
+BuildRequires: python2-backports-functools_lru_cache
+BuildRequires: python2-pillow
+BuildRequires: python2-pytz
+%if %{with_html}
+BuildRequires: %{_bindir}/pdftops
+# circular dependency: python2-basemap requires matplotlib
+BuildRequires: python2-basemap
+BuildRequires: python2-ipython-sphinx
+BuildRequires: python2-numpydoc
+BuildRequires: python2-scikit-image
+BuildRequires: python2-colorspacious
+BuildRequires: python2-cycler >= 0.10.0
+%endif
+%if %{run_tests}
+BuildRequires: python2-pytest
+BuildRequires: python2-pytest-xdist
+BuildRequires: python2-cycler >= 0.10.0
+BuildRequires: python2-mock
+%endif
+Requires: dejavu-sans-fonts
+Requires: dvipng
+Requires: python2-numpy
+Requires: python2-pyparsing
+Requires: python2-cycler >= 0.10.0
+Requires: python2-dateutil
+Requires: python2-kiwisolver
+Requires: python2-backports-functools_lru_cache
+Requires: python2-matplotlib-data = %{version}-%{release}
+%{?backend_subpackage:Requires: python2-matplotlib-%{backend_subpackage}%{?_isa} = %{version}-%{release}}
+Recommends: python2-pillow
+Requires: python2-six
+Requires: python2-subprocess32
+Requires: python2-pytz
+%if !%{with_bundled_fonts}
+Requires: stix-math-fonts
+%else
+Provides: bundled(stix-math-fonts)
+%endif
+%{?python_provide:%python_provide python2-matplotlib}
+Provides: bundled(agg) = 2.4
+Provides: bundled(ttconv)
+Provides: bundled(js-jquery1) = 1.11.3
+Provides: bundled(js-jquery1-ui) = 1.11.4
+Provides: bundled(texlive-helvetic)
+
+%description
+Matplotlib is a python 2D plotting library which produces publication
+quality figures in a variety of hardcopy formats and interactive
+environments across platforms. matplotlib can be used in python
+scripts, the python and ipython shell, web application servers, and
+six graphical user interface toolkits.
+
+Matplotlib tries to make easy things easy and hard things possible.
+You can generate plots, histograms, power spectra, bar charts,
+errorcharts, scatterplots, etc, with just a few lines of code.
+
+
+%package -n python2-matplotlib-qt4
+Summary: Qt4 backend for python2-matplotlib
+BuildRequires: PyQt4-devel
+Requires: python2-PyQt4
+Requires: python2-matplotlib%{?_isa} = %{version}-%{release}
+Requires: python2-matplotlib-qt5
+%{?python_provide:%python_provide python2-matplotlib-qt4}
+
+%description -n python2-matplotlib-qt4
+%{summary}
+
+%package -n python2-matplotlib-qt5
+Summary: Qt5 backend for python2-matplotlib
+BuildRequires: python2-qt5
+Requires: python2-qt5
+Requires: python2-matplotlib%{?_isa} = %{version}-%{release}
+%{?python_provide:%python_provide python2-matplotlib-qt5}
+
+%description -n python2-matplotlib-qt5
+%{summary}
+
+%package -n python2-matplotlib-gtk
+Summary: GTK backend for python2-matplotlib
+BuildRequires: gtk2-devel
+BuildRequires: pycairo-devel
+BuildRequires: pygtk2-devel
+Requires: pycairo
+Requires: pygtk2
+Requires: python2-matplotlib%{?_isa} = %{version}-%{release}
+%{?python_provide:%python_provide python2-matplotlib-gtk}
+
+%description -n python2-matplotlib-gtk
+%{summary}
+
+%package -n python2-matplotlib-gtk3
+Summary: GTK3 backend for python2-matplotlib
+# This should be converted to typelib(Gtk) when supported
+BuildRequires: gtk3
+BuildRequires: pygobject3-base
+Requires: gtk3%{?_isa}
+Requires: pygobject3-base%{?_isa}
+Requires: python2-matplotlib%{?_isa} = %{version}-%{release}
+%{?python_provide:%python_provide python2-matplotlib-gtk3}
+
+%description -n python2-matplotlib-gtk3
+%{summary}
+
+%package -n python2-matplotlib-tk
+Summary: Tk backend for python2-matplotlib
+BuildRequires: tcl-devel
+BuildRequires: tkinter
+BuildRequires: tk-devel
+Requires: python2-matplotlib%{?_isa} = %{version}-%{release}
+Requires: tkinter
+%{?python_provide:%python_provide python2-matplotlib-tk}
+
+%description -n python2-matplotlib-tk
+%{summary}
+
+%package -n python2-matplotlib-wx
+Summary: wxPython backend for python2-matplotlib
+BuildRequires: wxPython-devel
+Requires: python2-matplotlib%{?_isa} = %{version}-%{release}
+Requires: python2-wxpython
+%{?python_provide:%python_provide python2-matplotlib-wx}
+
+%description -n python2-matplotlib-wx
+%{summary}
+
+%package -n python2-matplotlib-test-data
+Summary: Test data for python2-matplotlib
+Requires: python2-matplotlib%{?_isa} = %{version}-%{release}
+%{?python_provide:%python_provide python2-matplotlib-test-data}
+
+%description -n python2-matplotlib-test-data
+%{summary}
+
+%package -n python2-matplotlib-doc
+Summary: Documentation files for python2-matplotlib
+%if %{with_html}
+BuildRequires: dvipng
+BuildRequires: graphviz
+BuildRequires: python2-sphinx
+BuildRequires: tex(latex)
+BuildRequires: tex-preview
+%endif
+Requires: python2-matplotlib%{?_isa} = %{version}-%{release}
+%{?python_provide:%python_provide python2-matplotlib-doc}
+
+%description -n python2-matplotlib-doc
+%{summary}
+
+%package -n python2-matplotlib-data
+Summary: Data used by python2-matplotlib
+BuildArch: noarch
+%if %{with_bundled_fonts}
+Requires: python2-matplotlib-data-fonts = %{version}-%{release}
+%endif
+%{?python_provide:%python_provide python2-matplotlib-data}
+
+%description -n python2-matplotlib-data
+%{summary}
+
+%if %{with_bundled_fonts}
+%package -n python2-matplotlib-data-fonts
+Summary: Fonts used by python2-matplotlib
+# STIX and Computer Modern is OFL
+# DejaVu is Bitstream Vera and Public Domain
+License: OFL and Bitstream Vera and Public Domain
+BuildArch: noarch
+Requires: python2-matplotlib-data = %{version}-%{release}
+%{?python_provide:%python_provide python2-matplotlib-data-fonts}
+
+%description -n python2-matplotlib-data-fonts
+%{summary}
+%endif
+
+%prep
+%autosetup -n matplotlib-%{version}%{?rctag} -N
+%patch0001 -p1
+
+# Fedora-specific patches follow:
+%patch1001 -p1
+# Updated test images for new FreeType.
+gzip -dc %SOURCE1000 | tar xvf - --transform='s~^mpl-images-%{version}-with-freetype-%{ftver}/\([^/]\+\)/~lib/\1/tests/baseline_images/~'
+%ifnarch x86_64
+%patch1002 -p1
+%endif
+%ifarch aarch64 ppc64 ppc64le s390x
+%patch1004 -p1
+%endif
+%ifarch i686 armv7hl
+%patch1003 -p1
+%endif
+rm -r extern/libqhull
+
+# Copy setup.cfg to the builddir
+sed 's/\(backend = \).*/\1%{backend}/' >setup.cfg <%{SOURCE1}
+
+# Keep this until next version, and increment if changing from
+# USE_FONTCONFIG to False or True so that cache is regenerated
+# if updated from a version enabling fontconfig to one not
+# enabling it, or vice versa
+if [ %{version} = 1.4.3 ]; then
+ sed -i 's/\(__version__ = 200\)/\1.1/' lib/matplotlib/font_manager.py
+fi
+
+%if !%{with_bundled_fonts}
+# Use fontconfig by default
+sed -i 's/\(USE_FONTCONFIG = \)False/\1True/' lib/matplotlib/font_manager.py
+%endif
+
+
+%build
+export http_proxy=http://127.0.0.1/
+MPLCONFIGDIR=$PWD \
+MATPLOTLIBDATA=$PWD/lib/matplotlib/mpl-data \
+ xvfb-run -a %{__python2} setup.py build
+%if %{with_html}
+# Need to make built matplotlib libs available for the sphinx extensions:
+pushd doc
+ MPLCONFIGDIR=$PWD/.. \
+ MATPLOTLIBDATA=$PWD/../lib/matplotlib/mpl-data \
+ PYTHONPATH=`realpath ../build/lib.linux*` \
+ %{__python2} make.py html
+popd
+%endif
+# Ensure all example files are non-executable so that the -doc
+# package doesn't drag in dependencies
+find examples -name '*.py' -exec chmod a-x '{}' \;
+
+%install
+export http_proxy=http://127.0.0.1/
+MPLCONFIGDIR=$PWD \
+MATPLOTLIBDATA=$PWD/lib/matplotlib/mpl-data/ \
+ %{__python2} setup.py install -O1 --skip-build --root=%{buildroot}
+chmod +x %{buildroot}%{python2_sitearch}/matplotlib/dates.py
+mkdir -p %{buildroot}%{_sysconfdir} %{buildroot}%{_datadir}/python2-matplotlib
+mv %{buildroot}%{python2_sitearch}/matplotlib/mpl-data/matplotlibrc \
+ %{buildroot}%{_sysconfdir}/python2-matplotlibrc
+mv %{buildroot}%{python2_sitearch}/matplotlib/mpl-data \
+ %{buildroot}%{_datadir}/python2-matplotlib
+%if !%{with_bundled_fonts}
+rm -rf %{buildroot}%{_datadir}/python2-matplotlib/mpl-data/fonts
+%endif
+
+%if %{run_tests}
+%check
+# These files confuse pytest, and we want to test the installed copy.
+rm -rf build*/
+
+export http_proxy=http://127.0.0.1/
+# This should match the default backend
+echo "backend : %{backend}" > matplotlibrc
+# Full tests are not run because pytest doesn't seem to understand namespace
+# packages in PYTHONPATH.
+# Skips:
+# * test_parasite: imports mpl_toolkits which is broken as noted above.
+# * test_polycollection_close: imports mpl_toolkits which is broken as noted
+# above.
+# * test_invisible_Line_rendering: Checks for "slowness" that often fails on a
+# heavily-loaded builder.
+MPLCONFIGDIR=$PWD \
+MATPLOTLIBDATA=%{buildroot}%{_datadir}/python2-matplotlib/mpl-data \
+PYTHONPATH=%{buildroot}%{python2_sitearch} \
+PYTHONDONTWRITEBYTECODE=1 \
+ xvfb-run -a -s "-screen 0 640x480x24" \
+ %{__python2} -m pytest --pyargs matplotlib -ra -n $(getconf _NPROCESSORS_ONLN) \
+ -m 'not network' \
+ -k 'not test_invisible_Line_rendering and not test_parasite and not test_polycollection_close and not test_nose_image_comparison'
+
+# We run these separately because they have issues when run in parallel.
+MPLCONFIGDIR=$PWD \
+MATPLOTLIBDATA=%{buildroot}%{_datadir}/python2-matplotlib/mpl-data \
+PYTHONPATH=%{buildroot}%{python2_sitearch} \
+PYTHONDONTWRITEBYTECODE=1 \
+ xvfb-run -a -s "-screen 0 640x480x24" \
+ %{__python2} -m pytest --pyargs matplotlib -ra \
+ -k 'test_nose_image_comparison'
+%endif # run_tests
+
+%files -n python2-matplotlib-data
+%{_sysconfdir}/python2-matplotlibrc
+%{_datadir}/python2-matplotlib/mpl-data/
+%if %{with_bundled_fonts}
+%exclude %{_datadir}/python2-matplotlib/mpl-data/fonts/
+%endif
+
+%if %{with_bundled_fonts}
+%files -n python2-matplotlib-data-fonts
+%{_datadir}/python2-matplotlib/mpl-data/fonts/
+%endif
+
+%files -n python2-matplotlib
+%license LICENSE/
+%doc README.rst
+%{python2_sitearch}/*egg-info
+%{python2_sitearch}/matplotlib-*-nspkg.pth
+%{python2_sitearch}/matplotlib/
+%exclude %{python2_sitearch}/matplotlib/tests/baseline_images/*
+%{python2_sitearch}/mpl_toolkits/
+%exclude %{python2_sitearch}/mpl_toolkits/tests/baseline_images/*
+%{python2_sitearch}/pylab.py*
+%exclude %{python2_sitearch}/matplotlib/backends/backend_qt4*
+%exclude %{python2_sitearch}/matplotlib/backends/backend_qt5*
+%exclude %{python2_sitearch}/matplotlib/backends/backend_gtk*
+%exclude %{python2_sitearch}/matplotlib/backends/_gtkagg.*
+%exclude %{python2_sitearch}/matplotlib/backends/backend_tkagg.*
+%exclude %{python2_sitearch}/matplotlib/backends/tkagg.*
+%exclude %{python2_sitearch}/matplotlib/backends/_tkagg.so
+%exclude %{python2_sitearch}/matplotlib/backends/backend_wx.*
+%exclude %{python2_sitearch}/matplotlib/backends/backend_wxagg.*
+%exclude %{_pkgdocdir}/*
+%exclude %{_pkgdocdir}/*/*
+
+%files -n python2-matplotlib-test-data
+%{python2_sitearch}/matplotlib/tests/baseline_images/
+%{python2_sitearch}/mpl_toolkits/tests/baseline_images/
+
+%files -n python2-matplotlib-qt4
+%{python2_sitearch}/matplotlib/backends/backend_qt4.*
+%{python2_sitearch}/matplotlib/backends/backend_qt4agg.*
+
+%files -n python2-matplotlib-qt5
+%{python2_sitearch}/matplotlib/backends/backend_qt5.*
+%{python2_sitearch}/matplotlib/backends/backend_qt5agg.*
+
+%files -n python2-matplotlib-gtk
+%{python2_sitearch}/matplotlib/backends/backend_gtk.py*
+%{python2_sitearch}/matplotlib/backends/backend_gtkagg.py*
+%{python2_sitearch}/matplotlib/backends/backend_gtkcairo.py*
+%{python2_sitearch}/matplotlib/backends/_gtkagg.so
+
+%files -n python2-matplotlib-gtk3
+%{python2_sitearch}/matplotlib/backends/backend_gtk3*.py*
+
+%files -n python2-matplotlib-tk
+%{python2_sitearch}/matplotlib/backends/backend_tkagg.py*
+%{python2_sitearch}/matplotlib/backends/tkagg.py*
+%{python2_sitearch}/matplotlib/backends/_tkagg.so
+
+%files -n python2-matplotlib-wx
+%{python2_sitearch}/matplotlib/backends/backend_wx.*
+%{python2_sitearch}/matplotlib/backends/backend_wxagg.*
+
+%files -n python2-matplotlib-doc
+%doc examples
+%if %{with_html}
+%doc doc/build/html/*
+%endif
+
+
+%changelog
+* Wed Sep 19 2018 Miro Hronok <mhroncok(a)redhat.com> - 2.2.3-2
+- Split python2-matplotlib from python-matplotlib
+
+* Mon Aug 13 2018 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 2.2.3-1
+- Update to latest version
+
+* Fri Jul 20 2018 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 2.2.2-4
+- Don't use unversioned Python in build (#1605766)
+- Add missing texlive-cm BR
+
+* Sat Jul 14 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 2.2.2-3.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Tue Jun 19 2018 Miro Hronok <mhroncok(a)redhat.com> - 2.2.2-3
+- Rebuilt for Python 3.7
+
+* Tue Apr 17 2018 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 2.2.2-2
+- Remove bytecode produced by pytest
+- Add python?-matplotlib-test-data subpackages
+
+* Sat Mar 31 2018 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 2.2.2-1
+- Update to latest release
+- Run tests in parallel
+
+* Tue Mar 13 2018 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 2.1.2-3
+- Cleanup spec file of old conditionals
+- Use more python2- dependencies
+
+* Mon Feb 05 2018 Karsten Hopp <karsten(a)redhat.com> - 2.1.2-2
+- update and fix spec file conditionals
+
+* Sun Jan 21 2018 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 2.1.2-1
+- Update to latest release
+
+* Sun Dec 10 2017 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 2.1.1-1
+- Update to latest release
+
+* Mon Oct 16 2017 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 2.1.0-1
+- Update to latest release
+
+* Thu Sep 28 2017 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 2.0.2-1
+- Update to latest release
+
+* Thu Sep 28 2017 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 2.0.1-1
+- Update to latest release
+
+* Thu Aug 03 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 2.0.0-3.2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
+
+* Thu Jul 27 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 2.0.0-3.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Sun Mar 12 2017 Peter Robinson <pbrobinson(a)fedoraproject.org> 2.0.0-3
+- Fix NVR
+
+* Mon Mar 06 2017 Thomas Spura <tomspur(a)fedoraproject.org> - 2.0.0-2.2
+- Remove copyrighted file from tarball (gh-8034)
+
+* Sat Feb 11 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 2.0.0-2.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Wed Jan 25 2017 Dan Hork <dan[at]danny.cz> - 2.0.0-2
+- Apply the 'aarch64' test tolerance patch on s390(x) also
+
+* Fri Jan 20 2017 Orion Poplawski <orion(a)cora.nwra.com> - 2.0.0-1
+- Update to 2.0.0 final
+
+* Tue Jan 10 2017 Adam Williamson <awilliam(a)redhat.com> - 2.0.0-0.7.rc2
+- Update to 2.0.0rc2
+- Fix more big-endian integer issues
+- Apply the 'aarch64' test tolerance patch on ppc64 also (it's affected by same issues)
+- Tweak the 'i686' test tolerance patch a bit (some errors are gone, some new ones)
+- Re-enable test suite for all arches
+- Note a remaining quasi-random test issue that causes build to fail sometimes
+
+* Mon Jan 09 2017 Adam Williamson <awilliam(a)redhat.com> - 2.0.0-0.6.b4
+- Fix another integer type issue which caused more issues on ppc64
+
+* Sun Jan 08 2017 Adam Williamson <awilliam(a)redhat.com> - 2.0.0-0.5.b4
+- Fix int type conversion error that broke text rendering on ppc64 (#1411070)
+
+* Tue Dec 13 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 2.0.0-0.4.b4
+- Rebuild for Python 3.6
+
+* Mon Oct 24 2016 Dan Hork <dan[at]danny.cz> - 2.0.0-0.3.b4
+- disable tests on some alt-arches to unblock depending builds
+
+* Mon Sep 26 2016 Dominik Mierzejewski <rpm(a)greysector.net> - 2.0.0-0.2.b4
+- add missing runtime dependencies for python2 package
+
+* Sat Sep 10 2016 Dominik Mierzejewski <rpm(a)greysector.net> - 2.0.0-0.1.b4
+- Update to 2.0.0b4
+- Drop upstreamed or obsolete patches
+- python-cycler >= 0.10.0 is required
+- move around Requires and BRs and sort more or less alphabetically
+- don't ship baseline images for tests (like Debian)
+- Require stix fonts only when they're not bundled
+- disable HTML doc building for bootstrapping 2.0.x series
+- relax image rendering tests tolerance due to freetype version differences
+- disable some failing tests on aarch64 for now
+
+* Tue Jul 19 2016 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1.5.2-0.2.rc2
+- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_...
+
+* Fri Jun 03 2016 Dominik Mierzejewski <rpm(a)greysector.net> - 1.5.1-7
+- Update to 1.5.2rc2.
+- Drop wrong hunk from use-system-six patch.
+- Patch new qhull paths on F25+ instead of using sed.
+- Rebase failing tests patch.
+
+* Mon May 23 2016 Dominik Mierzejewski <rpm(a)greysector.net> - 1.5.1-6
+- Upstream no longer ships non-free images, use pristine source.
+
+* Wed May 18 2016 Dominik Mierzejewski <rpm(a)greysector.net> - 1.5.1-5
+- Unbundle python-six (#1336740).
+- Run tests (and temporarily disable failing ones).
+- Use upstream-recommended way of running tests in parallel.
+- python2-cycler and -mock are required for running tests.
+
+* Sat Apr 30 2016 Ralf Corspius <corsepiu(a)fedoraproject.org> - 1.5.1-4
+- Rebuild for qhull-2015.2-1.
+- Reflect qhull_a.h's location having changed.
+
+* Wed Apr 6 2016 Orion Poplawski <orion(a)cora.nwra.com> - 1.5.1-3
+- Add requires python-cycler
+
+* Tue Apr 05 2016 Jon Ciesla <limburgher(a)gmail.com> - 1.5.1-2
+- Drop agg-devel BR, fix sphinx build with python*cycler BR
+
+* Mon Apr 04 2016 Thomas Spura <tomspur(a)fedoraproject.org> - 1.5.1-1
+- update to 1.5.1 (#1276806)
+- Add missing requires of dvipng to python3-matplotlib (#1270202)
+- use bundled agg (#1276806)
+- Drop cxx patch (was dropped upstream)
+- Regenerate search path patch2
+
+* Mon Apr 04 2016 Thomas Spura <tomspur(a)fedoraproject.org> - 1.4.3-13
+- Require the qt5 subpackage from the qt4 subpackage (#1219556)
+
+* Thu Feb 04 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 1.4.3-12
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Tue Jan 12 2016 Thomas Spura <tomspur(a)fedoraproject.org> - 1.4.3-11
+- Fix another requires of the main package
+
+* Thu Jan 07 2016 Thomas Spura <tomspur(a)fedoraproject.org> - 1.4.3-10
+- Fix requiring the correct backend from the main package
+
+* Thu Jan 07 2016 Thomas Spura <tomspur(a)fedoraproject.org> - 1.4.3-9
+- regenerate tarball to exclude lena image (#1295174)
+
+* Sun Nov 15 2015 Thomas Spura <tomspur(a)fedoraproject.org> - 1.4.3-8
+- Pick upstream patch for fixing the gdk backend #1231748
+- Add python2 subpackages and use python_provide
+
+* Tue Nov 10 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1.4.3-7
+- Rebuilt for https://fedoraproject.org/wiki/Changes/python3.5
+
+* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1.4.3-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Sat May 02 2015 Kalev Lember <kalevlember(a)gmail.com> - 1.4.3-5
+- Rebuilt for GCC 5 C++11 ABI change
+
+* Wed Feb 25 2015 Zbigniew Jdrzejewski-Szmek <zbyszek(a)in.waw.pl> - 1.4.3-4
+- Split out python-matplotlib-gtk, python-matplotlib-gtk3,
+ python3-matplotlib-gtk3 subpackages (#1067373)
+- Add missing requirements on gtk
+
+* Tue Feb 24 2015 Zbigniew Jdrzejewski-Szmek <zbyszek(a)in.waw.pl> - 1.4.3-3
+- Use %%license, add skimage to build requirements
+
+* Tue Feb 17 2015 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 1.4.3-2
+- Disable Qt5 backend on Fedora <21 and RHEL
+
+* Tue Feb 17 2015 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 1.4.3-1
+- New upstream release (#1134007)
+- Add Qt5 backend
+
+* Tue Jan 13 2015 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 1.4.2-1
+- Bump to new upstream release
+- Add qhull-devel to BR
+- Add six to Requires
+
+* Sun Aug 17 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1.3.1-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Sat Jun 07 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1.3.1-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Wed May 21 2014 Jaroslav karvada <jskarvad(a)redhat.com> - 1.3.1-5
+- Rebuilt for https://fedoraproject.org/wiki/Changes/f21tcl86
+
+* Wed May 14 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 1.3.1-4
+- Rebuilt for https://fedoraproject.org/wiki/Changes/Python_3.4
+
+* Tue Feb 11 2014 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.3.1-3
+- Make TkAgg the default backend
+- Remove python2 dependency from -data subpackage
+
+* Mon Jan 27 2014 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.3.1-2
+- Correct environment for and enable %%check
+- Install system wide matplotlibrc under /etc
+- Do not duplicate mpl-data for python2 and python3 packages
+- Conditionally bundle data fonts (https://fedorahosted.org/fpc/ticket/381)
+
+* Sat Jan 25 2014 Thomas Spura <tomspur(a)fedoraproject.org> - 1.3.1-1
+- update to 1.3.1
+- use GTKAgg as backend (#1030396, #982793, #1049624)
+- use fontconfig
+- add %%check for local testing (testing requires a display)
+
+* Wed Aug 7 2013 Thomas Spura <tomspur(a)fedoraproject.org> - 1.3.0-1
+- update to new version
+- use xz to compress sources
+- drop fontconfig patch (upstream)
+- drop tk patch (upstream solved build issue differently)
+- redo use system agg patch
+- delete bundled python-pycxx headers
+- fix requires of python3-matplotlib-qt (fixes #988412)
+
+* Sun Aug 04 2013 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1.2.0-15
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
+
+* Mon Jun 10 2013 Jon Ciesla <limburgher(a)gmail.com> - 1.2.0-14
+- agg rebuild.
+
+* Wed Apr 10 2013 Thomas Spura <tomspur(a)fedoraproject.org> - 1.2.0-13
+- use python3 version in python3-matplotlib-qt4 (#915727)
+- include __pycache__ files in correct subpackages on python3
+
+* Wed Apr 3 2013 Thomas Spura <tomspur(a)fedoraproject.org> - 1.2.0-12
+- Decode output of subprocess to utf-8 or regex will fail (#928326)
+
+* Tue Apr 2 2013 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.2.0-11
+- Make stix-fonts a requires of matplotlib (#928326)
+
+* Thu Mar 28 2013 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.2.0-10
+- Use stix fonts avoid problems with missing cm fonts (#908717)
+- Correct type mismatch in python3 font_manager (#912843, #928326)
+
+* Thu Feb 14 2013 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1.2.0-9
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
+
+* Wed Jan 16 2013 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.2.0-8
+- Update fontconfig patch to apply issue found by upstream
+- Update fontconfig patch to apply issue with missing afm fonts (#896182)
+
+* Wed Jan 16 2013 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.2.0-7
+- Use fontconfig by default (#885307)
+
+* Thu Jan 3 2013 David Malcolm <dmalcolm(a)redhat.com> - 1.2.0-6
+- remove wx support for rhel >= 7
+
+* Tue Dec 04 2012 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.2.0-5
+- Reinstantiate wx backend for python2.x.
+- Run setup.py under xvfb-run to detect and default to gtk backend (#883502)
+- Split qt4 backend subpackage and add proper requires for it.
+- Correct wrong regex in tcl libdir patch.
+
+* Tue Nov 27 2012 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.2.0-4
+- Obsolete python-matplotlib-wx for clean updates.
+
+* Tue Nov 27 2012 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.2.0-3
+- Enable python 3 in fc18 as build requires are now available (#879731)
+
+* Thu Nov 22 2012 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.2.0-2
+- Build python3 only on f19 or newer (#837156)
+- Build requires python3-six if building python3 support (#837156)
+
+* Thu Nov 22 2012 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.2.0-1
+- Update to version 1.2.0
+- Revert to regenerate tarball with generate-tarball.sh (#837156)
+- Assume update to 1.2.0 is for recent releases
+- Remove %%defattr
+- Remove %%clean
+- Use simpler approach to build html documentation
+- Do not use custom/outdated setup.cfg
+- Put one BuildRequires per line
+- Enable python3 support
+- Cleanup spec as wx backend is no longer supported
+- Use default agg backend
+- Fix bogus dates in changelog by assuming only week day was wrong
+
+* Fri Aug 17 2012 Jerry James <loganjerry(a)gmail.com> - 1.1.1-1
+- Update to version 1.1.1.
+- Remove obsolete spec file elements
+- Fix sourceforge URLs
+- Allow sample data to have a different version number than the sources
+- Don't bother removing problematic file since we remove entire agg24 directory
+- Fix building with pygtk in the absence of an X server
+- Don't install license text for bundled software that we don't bundle
+
+* Sat Jul 21 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1.0.1-21
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Tue Jul 3 2012 pcpa <paulo.cesar.pereira.de.andrade(a)gmail.com> - 1.1.0-1
+- Update to version 1.1.0.
+- Do not regenerate upstream tarball but remove problematic file in %%prep.
+- Remove non longer applicable/required patch0.
+- Rediff/rename -noagg patch.
+- Remove propagate-timezone-info-in-plot_date-xaxis_da patch already applied.
+- Remove tkinter patch now with critical code in a try block.
+- Remove png 1.5 patch as upstream is now png 1.5 aware.
+- Update file list.
+
+* Wed Apr 18 2012 David Malcolm <dmalcolm(a)redhat.com> - 1.0.1-20
+- remove wx support for rhel >= 7
+
+* Tue Feb 28 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1.0.1-19
+- Rebuilt for c++ ABI breakage
+
+* Sat Jan 14 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1.0.1-18
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Tue Dec 6 2011 David Malcolm <dmalcolm(a)redhat.com> - 1.0.1-17
+- fix the build against libpng 1.5
+
+* Tue Dec 6 2011 David Malcolm <dmalcolm(a)redhat.com> - 1.0.1-16
+- fix egg-info conditional for RHEL
+
+* Tue Dec 06 2011 Adam Jackson <ajax(a)redhat.com> - 1.0.1-15
+- Rebuild for new libpng
+
+* Mon Oct 31 2011 Dan Hork <dan[at]danny.cz> - 1.0.1-14
+- fix build with new Tkinter which doesn't return an expected value in __version__
+
+* Thu Sep 15 2011 Jef Spaleta <jspaleta(a)fedoraproject.org> - 1.0.1-13
+- apply upstream bugfix for timezone formatting (Bug 735677)
+
+* Fri May 20 2011 Orion Poplawski <orion(a)cora.nwra.com> - 1.0.1-12
+- Add Requires dvipng (Bug 684836)
+- Build against system agg (Bug 612807)
+- Use system pyparsing (Bug 702160)
+
+* Sat Feb 26 2011 Jonathan G. Underwood <jonathan.underwood(a)gmail.com> - 1.0.1-11
+- Set PYTHONPATH during html doc building using find to prevent broken builds
+
+* Sat Feb 26 2011 Jonathan G. Underwood <jonathan.underwood(a)gmail.com> - 1.0.1-10
+- Spec file cleanups for readability
+
+* Sat Feb 26 2011 Jonathan G. Underwood <jonathan.underwood(a)gmail.com> - 1.0.1-9
+- Bump and rebuild
+
+* Sat Feb 26 2011 Jonathan G. Underwood <jonathan.underwood(a)gmail.com> - 1.0.1-8
+- Fix spec file typos so package builds
+
+* Fri Feb 25 2011 Jonathan G. Underwood <jonathan.underwood(a)gmail.com> - 1.0.1-7
+- Remove a debugging echo statement from the spec file
+- Fix some line endings and permissions in -doc sub-package
+
+* Fri Feb 25 2011 Jonathan G. Underwood <jonathan.underwood(a)gmail.com> - 1.0.1-6
+- Spec file cleanups to silence some rpmlint warnings
+
+* Mon Feb 21 2011 Jonathan G. Underwood <jonathan.underwood(a)gmail.com> - 1.0.1-5
+- Add default attr to doc sub-package file list
+- No longer designate -doc subpackage as noarch
+- Add arch specific Requires for tk, wx and doc sub-packages
+
+* Mon Feb 21 2011 Jonathan G. Underwood <jonathan.underwood(a)gmail.com> - 1.0.1-4
+- Enable wxPython backend
+- Make -doc sub-package noarch
+
+* Mon Feb 21 2011 Jonathan G. Underwood <jonathan.underwood(a)gmail.com> - 1.0.1-3
+- Add conditional for optionally building doc sub-package
+- Add flag to build low res images for documentation
+- Add matplotlib-1.0.1-plot_directive.patch to fix build of low res images
+- Remove unused patches
+
+* Sat Feb 19 2011 Jonathan G. Underwood <jonathan.underwood(a)gmail.com> - 1.0.1-2
+- Build and package HTML documentation in -doc sub-package
+- Move examples to -doc sub-package
+- Make examples non-executable
+
+* Fri Feb 18 2011 Thomas Spura <tomspur(a)fedoraproject.org> - 1.0.1-1
+- update to new bugfix version (#678489)
+- set file attributes in tk subpackage
+- filter private *.so
+
+* Tue Feb 08 2011 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1.0.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Thu Jul 22 2010 David Malcolm <dmalcolm(a)redhat.com> - 1.0.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild
+
+* Thu Jul 8 2010 Jef Spaleta <jspaleta AT fedoraproject DOT org> - 1.0.0-1
+- New upstream release
+- Remove undistributable file from bundled agg library
+
+* Thu Jul 1 2010 Jef Spaleta <jspaleta AT fedoraproject DOT org> - 0.99.3-1
+- New upstream release
+
+* Thu May 27 2010 Jef Spaleta <jspaleta AT fedoraproject DOT org> - 0.99.1.2-4
+- Upstream patch to fix deprecated gtk tooltip warning.
+
+* Mon Apr 12 2010 Jef Spaleta <jspaleta AT fedoraproject DOT org> - 0.99.1.2-2
+- Bump to rebuild against numpy 1.3
+
+* Thu Apr 1 2010 Jef Spaleta <jspaleta AT fedoraproject DOT org> - 0.99.1.2-1
+- Bump to rebuild against numpy 1.4.0
+
+* Fri Dec 11 2009 Jon Ciesla <limb(a)jcomserv.net> - 0.99.1.2
+- Update to 0.99.1.2
+
+* Sun Jul 26 2009 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 0.98.5.2-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Fri Mar 06 2009 Jef Spaleta <jspaleta AT fedoraproject DOT org> - 0.98.5-4
+- Fixed font dep after font guideline change
+
+* Thu Feb 26 2009 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 0.98.5.2-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Tue Dec 23 2008 Jef Spaleta <jspaleta AT fedoraproject DOT org> - 0.98.5-2
+- Add dep on DejaVu Sans font for default font support
+
+* Mon Dec 22 2008 Jef Spaleta <jspaleta AT fedoraproject DOT org> - 0.98.5-1
+- Latest upstream release
+- Strip out included fonts
+
+* Sat Nov 29 2008 Ignacio Vazquez-Abrams <ivazqueznet+rpm(a)gmail.com> - 0.98.3-2
+- Rebuild for Python 2.6
+
+* Wed Aug 6 2008 Jef Spaleta <jspaleta AT fedoraproject DOT org> - 0.98.3-1
+- Latest upstream release
+
+* Tue Jul 1 2008 Jef Spaleta <jspaleta AT fedoraproject DOT org> - 0.98.1-1
+- Latest upstream release
+
+* Fri Mar 21 2008 Jef Spaleta <jspaleta[AT]fedoraproject org> - 0.91.2-2
+- gcc43 cleanups
+
+* Fri Mar 21 2008 Jef Spaleta <jspaleta[AT]fedoraproject org> - 0.91.2-1
+- New upstream version
+- Adding Fedora specific setup.cfg from included template
+- removed numarry and numerics build requirements
+
+* Tue Feb 19 2008 Fedora Release Engineering <rel-eng(a)fedoraproject.org> - 0.90.1-6
+- Autorebuild for GCC 4.3
+
+* Fri Jan 4 2008 Alex Lancaster <alexlan[AT]fedoraproject org> - 0.90.1-5
+- Fixed typo in spec.
+
+* Fri Jan 4 2008 Alex Lancaster <alexlan[AT]fedoraproject org> - 0.90.1-4
+- Support for Python Eggs for F9+
+
+* Thu Jan 3 2008 Alex Lancaster <alexlan[AT]fedoraproject org> - 0.90.1-3
+- Rebuild for new Tcl 8.5
+
+* Thu Aug 23 2007 Orion Poplawski <orion(a)cora.nwra.com> 0.90.1-2
+- Update license tag to Python
+- Rebuild for BuildID
+
+* Mon Jun 04 2007 Orion Poplawski <orion(a)cora.nwra.com> 0.90.1-1
+- Update to 0.90.1
+
+* Wed Feb 14 2007 Orion Poplawski <orion(a)cora.nwra.com> 0.90.0-2
+- Rebuild for Tcl/Tk downgrade
+
+* Sat Feb 10 2007 Jef Spaleta <jspaleta(a)gmail.com> 0.90.0-2
+- Release bump for rebuild against new tk
+
+* Fri Feb 09 2007 Orion Poplawski <orion(a)cora.nwra.com> 0.90.0-1
+- Update to 0.90.0
+
+* Fri Jan 5 2007 Orion Poplawski <orion(a)cora.nwra.com> 0.87.7-4
+- Add examples to %%docs
+
+* Mon Dec 11 2006 Jef Spaleta <jspaleta(a)gmail.com> 0.87.7-3
+- Release bump for rebuild against python 2.5 in devel tree
+
+* Tue Dec 5 2006 Orion Poplawski <orion(a)cora.nwra.com> 0.87.7-2
+- Force build of gtk/gtkagg backends in mock (bug #218153)
+- Change Requires from python-numeric to numpy (bug #218154)
+
+* Tue Nov 21 2006 Orion Poplawski <orion(a)cora.nwra.com> 0.87.7-1
+- Update to 0.87.7 and fix up the defaults to use numpy
+- Force build of tkagg backend without X server
+- Use src.rpm from Jef Spaleta, closes bug 216578
+
+* Fri Oct 6 2006 Orion Poplawski <orion(a)cora.nwra.com> 0.87.6-1
+- Update to 0.87.6
+
+* Thu Sep 7 2006 Orion Poplawski <orion(a)cora.nwra.com> 0.87.5-1
+- Update to 0.87.5
+
+* Thu Jul 27 2006 Orion Poplawski <orion(a)cora.nwra.com> 0.87.4-1
+- Update to 0.87.4
+
+* Wed Jun 7 2006 Orion Poplawski <orion(a)cora.nwra.com> 0.87.3-1
+- Update to 0.87.3
+
+* Mon May 15 2006 Orion Poplawski <orion(a)cora.nwra.com> 0.87.2-2
+- Rebuild for new numpy
+
+* Tue Mar 7 2006 Orion Poplawski <orion(a)cora.nwra.com> 0.87.2-1
+- Update to 0.87.2
+
+* Tue Mar 7 2006 Orion Poplawski <orion(a)cora.nwra.com> 0.87.1-1
+- Update to 0.87.1
+- Add pycairo >= 1.0.2 requires (FC5+ only)
+
+* Fri Feb 24 2006 Orion Poplawski <orion(a)cora.nwra.com> 0.87-1
+- Update to 0.87
+- Add BR numpy and python-numarray
+- Add patch to keep Numeric as the default numerix package
+- Add BR tkinter and tk-devel for TkInter backend
+- Make separate package for Tk backend
+
+* Tue Jan 10 2006 Orion Poplawski <orion(a)cora.nwra.com> 0.86-1
+- Update to 0.86
+
+* Thu Dec 22 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.85-2
+- Rebuild
+
+* Sun Nov 20 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.85-1
+- New upstream version 0.85
+
+* Mon Sep 19 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.84-1
+- New upstream version 0.84
+
+* Tue Aug 02 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.83.2-3
+- bump release
+
+* Tue Aug 02 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.83.2-2
+- Add Requires: python-numeric, pytz, python-dateutil
+
+* Fri Jul 29 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.83.2-1
+- New upstream version matplotlib 0.83.2
+
+* Thu Jul 28 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.83.1-2
+- Bump rel to fix botched tag
+
+* Thu Jul 28 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.83.1-1
+- New upstream version matplotlib 0.83.1
+
+* Tue Jul 05 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.82-4
+- BuildRequires: pytz, python-dateutil - use upstream
+- Don't use INSTALLED_FILES, list dirs
+- Fix execute permissions
+
+* Fri Jul 01 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.82-3
+- Use %%{python_sitearch}
+
+* Thu Jun 30 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.82-2
+- Rename to python-matplotlib
+- Remove unneeded Requires: python
+- Add private directories to %%files
+
+* Tue Jun 28 2005 Orion Poplawski <orion(a)cora.nwra.com> 0.82-1
+- Initial package for Fedora Extras
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..978e5f4
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,7 @@
+[packages]
+tests = True
+toolkits = True
+toolkits_tests = True
+
+[rc_options]
+backend = GTKAgg
diff --git a/sources b/sources
new file mode 100644
index 0000000..53a771b
--- /dev/null
+++ b/sources
@@ -0,0 +1,3 @@
+SHA512 (matplotlib-2.2.3.tar.gz) = d118f5d56e2f578031aba22933c0b3a4423a31a04f50f08cc1aa660186546d09692a9cf401bb5f24cb296f94fbfd8707460728d501ac2bd4a624dfa89e92949b
+SHA512 (matplotlib-2.2.3-with-freetype-2.9.1.tar.gz) = 00f6d4eeab6d73108129a5ccbaccda37c2e8cc684efeeb03c492a96a2071357a32a624ebfef2770c8c205a3741ef8d947f117351d90d25c4c7b4b8b6b84db556
+SHA512 (matplotlib-2.2.3-with-freetype-2.8.tar.gz) = 7f11a0589f2ab5fcbdee0da0d4fa003c62b9e882fbae22a6bc725f791f3ea058b33321a70a5cf1858f494aa1ebb8b3e686c56ff73e6174fb980e159331bd0a0d
5 years, 6 months
Architecture specific change in rpms/golang-github-smartystreets-assertions.git
by githook-noreply@fedoraproject.org
The package rpms/golang-github-smartystreets-assertions.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/golang-github-smartystreets-asser....
Change:
-ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
Thanks.
Full change:
============
commit 2187dfbf0fcdf6ba20874900b2c2b11a10474218
Author: Robert-Andr Mauchin <zebob.m(a)gmail.com>
Date: Sat Oct 6 23:46:22 2018 +0200
Bump to commit b2de0cb4f26d0705483a2f495d89896d0b808573
Update with new Go packaging
diff --git a/.gitignore b/.gitignore
index 6a04ec6..d4533f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
/assertions-287b434.tar.gz
+/assertions-1.8.3.tar.gz
+/assertions-b2de0cb4f26d0705483a2f495d89896d0b808573.tar.gz
diff --git a/golang-github-smartystreets-assertions.spec b/golang-github-smartystreets-assertions.spec
index 7f0680d..dcafebd 100644
--- a/golang-github-smartystreets-assertions.spec
+++ b/golang-github-smartystreets-assertions.spec
@@ -1,171 +1,63 @@
-# If any of the following macros should be set otherwise,
-# you can wrap any of them with the following conditions:
-# - %%if 0%%{centos} == 7
-# - %%if 0%%{?rhel} == 7
-# - %%if 0%%{?fedora} == 23
-# Or just test for particular distribution:
-# - %%if 0%%{centos}
-# - %%if 0%%{?rhel}
-# - %%if 0%%{?fedora}
-#
-# Be aware, on centos, both %%rhel and %%centos are set. If you want to test
-# rhel specific macros, you can use %%if 0%%{?rhel} && 0%%{?centos} == 0 condition.
-# (Don't forget to replace double percentage symbol with single one in order to apply a condition)
-
-# Generate devel rpm
-%global with_devel 1
-# Build project from bundled dependencies
-%global with_bundled 0
-# Build with debug info rpm
-%global with_debug 0
-# Run tests in check section
-# Failing test
-%global with_check 0
-# Generate unit-test rpm
-%global with_unit_test 1
-
-%if 0%{?with_debug}
-%global _dwz_low_mem_die_limit 0
-%else
-%global debug_package %{nil}
-%endif
-
-%global provider github
-%global provider_tld com
-%global project smartystreets
-%global repo assertions
# https://github.com/smartystreets/assertions
-%global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo}
-%global import_path %{provider_prefix}
-%global commit 287b4346dc4e71a038c346375a9d572453bc469b
-%global shortcommit %(c=%{commit}; echo ${c:0:7})
-
-Name: golang-%{provider}-%{project}-%{repo}
-Version: 1.6.0
-Release: 0.8.git%{shortcommit}%{?dist}
+%global goipath github.com/smartystreets/assertions
+%global commit b2de0cb4f26d0705483a2f495d89896d0b808573
+
+%global common_description %{expand:
+Package assertions contains the implementations for all assertions which are
+referenced in goconvey's convey package
+(github.com/smartystreets/goconvey/convey) and gunit
+(github.com/smartystreets/gunit) for use with the So(...) method. They can
+also be used in traditional Go test functions and even in applications.}
+
+%gometa
+
+Name: %{goname}
+Version: 1.8.3
+Release: 1%{?dist}
Summary: Fluent assertion-style functions
License: MIT
-URL: https://%{provider_prefix}
-Source0: https://%{provider_prefix}/archive/%{commit}/%{repo}-%{shortcommit}.tar.gz
+URL: %{gourl}
+Source0: %{gosource}
-# e.g. el6 has ppc64 arch without gcc-go, so EA tag is required
-ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
-# If go_compiler is not set to 1, there is no virtual provide. Use golang instead.
-BuildRequires: %{?go_compiler:compiler(go-compiler)}%{!?go_compiler:golang}
%description
-%{summary}
+%{common_description}
+
-%if 0%{?with_devel}
%package devel
Summary: %{summary}
BuildArch: noarch
-%if 0%{?with_check}
-BuildRequires: golang(golang.org/x/net/context)
-%endif
-
-Requires: golang(golang.org/x/net/context)
-
-Provides: golang(%{import_path}) = %{version}-%{release}
-Provides: golang(%{import_path}/should) = %{version}-%{release}
-
%description devel
-%{summary}
+%{common_description}
This package contains library source intended for
building other packages which use import path with
-%{import_path} prefix.
-%endif
-
-%if 0%{?with_unit_test}
-%package unit-test
-Summary: Unit tests for %{name} package
+%{goipath} prefix.
-%if 0%{?with_check}
-#Here comes all BuildRequires: PACKAGE the unit tests
-#in %%check section need for running
-%endif
-
-# test subpackage tests code from devel subpackage
-Requires: %{name}-devel = %{version}-%{release}
-
-%description unit-test
-%{summary}
-
-This package contains unit tests for project
-providing packages with %{import_path} prefix.
-%endif
%prep
-%setup -q -n %{repo}-%{commit}
+%forgeautosetup
-%build
%install
-# source codes for building projects
-%if 0%{?with_devel}
-install -d -p %{buildroot}/%{gopath}/src/%{import_path}/
-echo "%%dir %%{gopath}/src/%%{import_path}/." >> devel.file-list
-# find all *.go but no *_test.go files and generate devel.file-list
-for file in $(find . -iname "*.go" \! -iname "*_test.go") ; do
- echo "%%dir %%{gopath}/src/%%{import_path}/$(dirname $file)" >> devel.file-list
- install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file)
- cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file
- echo "%%{gopath}/src/%%{import_path}/$file" >> devel.file-list
-done
-%endif
-
-# testing files for this project
-%if 0%{?with_unit_test}
-install -d -p %{buildroot}/%{gopath}/src/%{import_path}/
-# find all *_test.go files and generate unit-test.file-list
-for file in $(find . -iname "*_test.go"); do
- echo "%%dir %%{gopath}/src/%%{import_path}/$(dirname $file)" >> devel.file-list
- install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file)
- cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file
- echo "%%{gopath}/src/%%{import_path}/$file" >> unit-test.file-list
-done
-%endif
-
-%if 0%{?with_devel}
-sort -u -o devel.file-list devel.file-list
-%endif
+%goinstall
+
%check
-%if 0%{?with_check} && 0%{?with_unit_test} && 0%{?with_devel}
-%if ! 0%{?with_bundled}
-export GOPATH=%{buildroot}/%{gopath}:%{gopath}
-%else
-export GOPATH=%{buildroot}/%{gopath}:$(pwd)/Godeps/_workspace:%{gopath}
-%endif
-
-%if ! 0%{?gotest:1}
-%global gotest go test
-%endif
-
-%gotest %{import_path}
-# unitptr overflow on i386
-#%%gotest %{import_path}/internal/oglematchers
-%endif
-
-#define license tag if not already defined
-%{!?_licensedir:%global license %doc}
-
-%if 0%{?with_devel}
+%gochecks
+
+
%files devel -f devel.file-list
%license LICENSE.md
-%doc README.md
-%dir %{gopath}/src/%{provider}.%{provider_tld}/%{project}
-%endif
+%doc README.md CONTRIBUTING.md
-%if 0%{?with_unit_test}
-%files unit-test -f unit-test.file-list
-%license LICENSE.md
-%doc README.md
-%endif
%changelog
+* Sat Oct 06 2018 Robert-Andr Mauchin <zebob.m(a)gmail.com> - 1.8.3-1.20181006gitb2de0cb
+- Bump to commit b2de0cb4f26d0705483a2f495d89896d0b808573
+- Update with new Go packaging
+
* Fri Jul 13 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 1.6.0-0.8.git287b434
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
diff --git a/sources b/sources
index 634af61..5375d17 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-1979d8de146dda01b2b8994e345671cf assertions-287b434.tar.gz
+SHA512 (assertions-b2de0cb4f26d0705483a2f495d89896d0b808573.tar.gz) = 4e942f5f4f1708dd17ed48f046b34366e912337823a6df062e80ce30272d83c6935ede281bb984b51f905de764821d03d61972ec7cfcdac38ddc2d4e90e29b3a
5 years, 6 months
[Report] Packages Restricting Arches
by root
New package excluding arches (1)
============================
- fedora-toolbox
ExclusiveArch: aarch64 %{arm} ppc64le s390x x86_64
Package no longer excluding arches (1)
==================================
- golang-github-skratchdot-open-golang
List of packages currently excluding arches (2670)
===========================================
- 0ad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- 90-Second-Portraits
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64
- GtkAda
ExclusiveArch: %{GPRbuild_arches}
- GtkAda3
ExclusiveArch: %{GPRbuild_arches}
- LuxRender
ExclusiveArch: x86_64
- OpenTK
ExclusiveArch: %mono_arches
- PragmARC
ExclusiveArch: %{GPRbuild_arches}
- RdRand
ExclusiveArch: %{ix86} x86_64
- SLOF
ExclusiveArch: ppc64le
- YafaRay
ExclusiveArch: %{ix86} x86_64
- aboot
ExclusiveArch: alpha
- acpid
ExclusiveArch: ia64 x86_64 %{ix86} %{arm} aarch64
- ahven
ExclusiveArch: %{GPRbuild_arches}
- alleyoop
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x %{arm} aarch64
- american-fuzzy-lop
ExclusiveArch: %{ix86} x86_64
- anet
ExclusiveArch: %{GPRbuild_arches}
- apmd
ExclusiveArch: %{ix86}
- appstream-generator
ExclusiveArch: x86_64 %{ix86} %{arm}
- arduino
ExclusiveArch: %{go_arches}
- arduino-builder
ExclusiveArch: %{go_arches}
- arm-trusted-firmware
ExclusiveArch: aarch64
- atomic
ExclusiveArch: %{go_arches}
- aunit
ExclusiveArch: %GPRbuild_arches
- avgtime
ExclusiveArch: %{ldc_arches}
- aws
ExclusiveArch: %GPRbuild_arches
- banshee
ExclusiveArch: %{mono_arches}
- banshee-community-extensions
ExclusiveArch: %ix86 x86_64 ppc ppc64 ia64 %{arm} sparcv9 alpha s390x
- bareftp
ExclusiveArch: %{mono_arches}
- bcal
ExclusiveArch: x86_64 aarch64 ia64 ppc64 ppc64le s390x
- bcc
ExclusiveArch: x86_64 %{power64}
- bcm283x-firmware
ExclusiveArch: %{arm} aarch64
- beignet
ExclusiveArch: x86_64 %{ix86}
- berusky2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{mips}
- biosdevname
ExclusiveArch: %{ix86} x86_64
- bless
ExclusiveArch: %mono_arches
- boo
ExclusiveArch: %{mono_arches}
- buildah
ExclusiveArch: x86_64 %{arm} aarch64 ppc64le s390x
- bwa
ExclusiveArch: x86_64
- caddy
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm} aarch64 ppc64le s390x %{mips}}
- cadvisor
ExclusiveArch: %{ix86} x86_64 aarch64 ppc64le
- calamares
ExclusiveArch: %{ix86} x86_64
- carto
ExclusiveArch: %{nodejs_arches} noarch
- ccdciel
ExclusiveArch: %{fpc_arches}
- cdcollect
ExclusiveArch: %{mono_arches}
- ceph
ExclusiveArch: x86_64 aarch64 ppc64 ppc64le
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- chromium
ExclusiveArch: x86_64 i686
ExclusiveArch: x86_64 i686 aarch64
- cjdns
ExclusiveArch: %{nodejs_arches}
- cmospwd
ExclusiveArch: %{ix86} x86_64
- cmrt
ExclusiveArch: %{ix86} x86_64 ia64
- coffee-script
ExclusiveArch: %{nodejs_arches} noarch
- colorful
ExclusiveArch: %{fpc_arches}
- compat-gcc-296
ExclusiveArch: %{ix86} ia64 ppc
- compat-rust-serde_derive
ExclusiveArch: %{rust_arches}
- consul
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- containerd
ExclusiveArch: %{go_arches}
- containers
ExclusiveArch: %{ldc_arches}
- cpuid
ExclusiveArch: %{ix86} x86_64
- cqrlog
ExclusiveArch: %{fpc_arches}
- crash
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- cri-tools
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- criu
ExclusiveArch: x86_64 %{arm} ppc64le aarch64 s390x
- cryptlib
ExclusiveArch: x86_64 %{ix86} aarch64 ppc64 ppc64le
- cryptobone
ExclusiveArch: x86_64 %{ix86} ppc64 ppc64le aarch64
- daq
ExclusiveArch: x86_64 aarch64
- darktable
ExclusiveArch: x86_64 aarch64
- dbus-sharp
ExclusiveArch: %mono_arches
- dbus-sharp-glib
ExclusiveArch: %mono_arches
- dbxtool
ExclusiveArch: i386 x86_64 aarch64
- deepin-api
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- deepin-daemon
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- deepin-dbus-generator
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- deepin-gir-generator
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- derelict
ExclusiveArch: %{ldc_arches}
- direnv
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- discord-irc
ExclusiveArch: %{nodejs_arches} noarch
- dlm
ExclusiveArch: i686 x86_64
- dmidecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- dmtcp
ExclusiveArch: %ix86 x86_64 aarch64
- docco
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- docker
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x %{mips}
- docker-anaconda-addon
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x %{mips}
- docker-distribution
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- docker-latest
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x %{mips}
- dolphin-emu
ExclusiveArch: x86_64 armv7l aarch64
- douceur
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- dpdk
ExclusiveArch: x86_64 i686 aarch64 ppc64le
- dssi-vst
ExclusiveArch: %{ix86} x86_64
- dsymbol
ExclusiveArch: %{ldc_arches}
- dustmite
ExclusiveArch: %{ldc_arches}
- dyninst
ExclusiveArch: %{ix86} x86_64 ppc ppc64
- e3
ExclusiveArch: %{ix86} x86_64
- edac-utils
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{power64}
- edb
ExclusiveArch: %{ix86} x86_64
- edk2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: x86_64 aarch64
- efibootmgr
ExclusiveArch: %{efi}
- efivar
ExclusiveArch: %{efi}
- elasticdump
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- elk
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86} aarch64 %{arm} %{power64}
- embree
ExclusiveArch: x86_64
- embree2
ExclusiveArch: x86_64
- envytools
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- exciting
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86} aarch64 %{power64}
ExclusiveArch: x86_64 %{ix86} aarch64 %{arm} %{power64}
- exercism
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- expresso
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- extlinux-bootloader
ExclusiveArch: %{arm} aarch64
- fcitx-libpinyin
ExclusiveArch: %{qt5_qtwebengine_arches}
- fedora-dockerfiles
ExclusiveArch: %{go_arches}
- fedora-gnat-project-common
ExclusiveArch: noarch %{GNAT_arches}
- fedora-toolbox
ExclusiveArch: aarch64 %{arm} ppc64le s390x x86_64
- fence-virt
ExclusiveArch: i686 x86_64
- fes
ExclusiveArch: x86_64
- flannel
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- florist
ExclusiveArch: %{GPRbuild_arches}
- fluxcapacitor
ExclusiveArch: %{ix86} x86_64 %{arm}
- fpc
ExclusiveArch: %{arm} %{ix86} x86_64 ppc ppc64
- freshmaker
ExclusiveArch: %{ix86} x86_64
- frysk
ExclusiveArch: %{ix86} x86_64 ppc64
- fst
ExclusiveArch: i686
- fwts
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 s390x %{power64}
- fwupdate
ExclusiveArch: %{efi}
- ga
ExclusiveArch: %{ix86} x86_64
- gbrainy
ExclusiveArch: %mono_arches
- gdata-sharp
ExclusiveArch: %mono_arches
- gdb-exploitable
ExclusiveArch: x86_64 i386
ExclusiveArch: x86_64 noarch
- gela-asis
ExclusiveArch: %GPRbuild_arches
- ghdl
ExclusiveArch: %{GNAT_arches}
- gio-sharp
ExclusiveArch: %mono_arches
- gir-to-d
ExclusiveArch: %{ldc_arches}
- git-octopus
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- giver
ExclusiveArch: %{mono_arches}
- gkeyfile-sharp
ExclusiveArch: %mono_arches
- gl3n
ExclusiveArch: %{ldc_arches}
- glibc32
ExclusiveArch: x86_64 ppc64 s390x
- glusterd2
ExclusiveArch: %{go_arches}
- gmqcc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- gnatcoll
ExclusiveArch: %GPRbuild_arches
- gnome-boxes
ExclusiveArch: x86_64
- gnome-desktop-sharp
ExclusiveArch: %mono_arches
- gnome-do
ExclusiveArch: %mono_arches
- gnome-guitar
ExclusiveArch: %{mono_arches}
- gnome-keyring-sharp
ExclusiveArch: %mono_arches
- gnome-rdp
ExclusiveArch: %{mono_arches}
- gnome-sharp
ExclusiveArch: %mono_arches
- gnome-subtitles
ExclusiveArch: %mono_arches
- gnu-efi
ExclusiveArch: %{efi}
- gnu-smalltalk
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- go-bindata
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- go-compilers
ExclusiveArch: %{go_arches}
- go-i18n
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- godep
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- godotenv
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- gofed
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x %{mips}
- golang
ExclusiveArch: %{golang_arches}
- golang-bitbucket-kardianos-osext
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-deepin-dbus-factory
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-deepin-go-lib
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-10gen-openssl
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- golang-github-BurntSushi-freetype-go
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-BurntSushi-graphics-go
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-BurntSushi-toml-test
ExclusiveArch: %{go_arches}
- golang-github-BurntSushi-xgb
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-BurntSushi-xgbutil
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-Jeffail-gabs
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-PuerkitoBio-goquery
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-PuerkitoBio-purell
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-PuerkitoBio-urlesc
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-RangelReale-osin
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-RangelReale-osincli
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-SeanDolphin-bqschema
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-SermoDigital-jose
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-Shopify-sarama
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-Shopify-toxiproxy
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-alecthomas-assert
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-alecthomas-chroma
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-alecthomas-colour
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-alecthomas-kingpin
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-alecthomas-repr
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-alecthomas-template
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-alecthomas-units
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-andybalholm-cascadia
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-armon-go-proxyproto
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-asaskevich-govalidator
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-auth0-go-jwt-middleware
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-axgle-mahonia
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-bep-gitmap
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-bep-inflect
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-bgentry-go-netrc
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-boombuler-barcode
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-buger-jsonparser
ExclusiveArch: %{go_arches} noarch
- golang-github-cespare-xxhash
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-chaseadamsio-goorgeous
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-cheekybits-is
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-chrismalek-oktasdk-go
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-client9-gospell
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-cockroachdb-cockroach-go
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-codahale-aesnicheck
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-codegangsta-negroni
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-coreos-go-etcd
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-cryptix-wav
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-danwakefield-fnmatch
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-dchest-cssmin
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-dchest-siphash
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-disintegration-imaging
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-dlclark-regexp2
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-docker-libkv
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-docopt-docopt-go
ExclusiveArch: %{go_arches}
- golang-github-duosecurity-duo_api_golang
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-eknkc-amber
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-endophage-gotuf
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-fatih-structs
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-flynn-go-shlex
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-fortytw2-leaktest
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-fsnotify-fsnotify
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-fsouza-go-dockerclient
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-fullsailor-pkcs7
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-glacjay-goini
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-go-errors-errors
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-go-macaron-inject
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-go-mgo-mgo
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-go-tomb-tomb
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-gobuffalo-envy
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-gocql-gocql
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-golang-image
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-google-go-cmp
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-goraft-raft
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-gorilla-css
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-gosexy-gettext
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-hailocab-go-hostpool
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-hashicorp-go-hclog
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-hashicorp-go-plugin
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-hashicorp-go-rootcerts
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-howeyc-fsnotify
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-inconshreveable-go-vhost
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-influxdb-influxdb
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-jdkato-prose
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-jdkato-syllables
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-jefferai-jsonx
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-justinas-alice
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-klauspost-cpuid
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-knieriem-markdown
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-kyokomi-emoji
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-linuxdeepin-go-x11-client
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-lpabon-godbc
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-markbates-inflect
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-mattn-go-colorable
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-mgutz-ansi
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-mgutz-logxi
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-michaelklishin-rabbit-hole
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-miekg-mmark
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-milochristiansen-axis2
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-milochristiansen-lua
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-mitchellh-go-testing-interface
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-mitchellh-goamz
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-montanaflynn-stats
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-msteinert-pam
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-muesli-smartcrop
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-mvo5-goconfigparser
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-mvo5-uboot-go
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-neurosnap-sentences
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-nfnt-resize
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-noahdesu-go-ceph
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-ojii-gettext.go
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-opencontainers-specs
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-openshift-go-json-rest
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-openshift-go-systemd
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-openshift-openshift-sdn
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-paulrosania-go-charset
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-pquerna-otp
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-prometheus-prometheus
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-rackspace-gophercloud
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-rakyll-globalconf
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-rakyll-pb
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-rakyll-statik
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-rasky-go-xdr
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-remeh-sizedwaitgroup
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-remyoudompheng-bigfft
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-ryanuber-go-glob
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-samuel-go-zookeeper
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-seccomp-libseccomp-golang
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-sergi-go-diff
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-sethgrid-pester
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-shiena-ansicolor
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-shogo82148-go-shuffle
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-shurcooL-sanitized_anchor_name
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-skarademir-naturalsort
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-skynetservices-skydns
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-smartystreets-assertions
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-smartystreets-go-aws-auth
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-smartystreets-goconvey
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-spacejam-loghisto
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-spacemonkeygo-openssl
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm} ppc64le s390x}
- golang-github-spaolacci-murmur3
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-spf13-afero
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-spf13-fsync
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-spf13-nitro
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-sstarcher-go-okta
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-stathat-go
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-stevvooe-resumable
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-streadway-amqp
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-stretchr-objx
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-syndtr-gocapability
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-syndtr-goleveldb
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-syndtr-gosnappy
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-tent-http-link-go
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-tonnerre-golang-pretty
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-urfave-cli
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-vaughan0-go-ini
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-vbatts-tar-split
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-vishvananda-netlink
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} aarch64 x86_64 %{arm}}
- golang-github-vishvananda-netns
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-vjeantet-asn1-ber
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-vmware-govcloudair
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-github-wsxiaoys-terminal
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-xeipuuv-gojsonpointer
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-xeipuuv-gojsonreference
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-xeipuuv-gojsonschema
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-xiang90-probing
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-xrash-smetrics
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-yosssi-ace
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-yosssi-gohtml
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-github-yvasiyarov-go-metrics
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-yvasiyarov-gorelic
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-github-yvasiyarov-newrelic_platform_go
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-googlecode-gcfg
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-googlecode-go-decimal-inf
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-googlecode-go-exp
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-googlecode-log4go
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-googlecode-sqlite
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{go_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- golang-googlecode-uuid
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-gopkg-check
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-gopkg-go-check-check
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-gopkg-go-macaroon-macaroon
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang-gopkg-retry-v1
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golang-torproject-pluggable-transports-goptlib
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- golint
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- gomtree
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- gotags
ExclusiveArch: %{go_arches}
- gotun
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: x86_64
- gprbuild
ExclusiveArch: %{GPRbuild_arches} %{bootstrap_arch}
- gprolog
ExclusiveArch: x86_64 %{ix86} ppc alpha
- gsf-sharp
ExclusiveArch: %mono_arches
- gtk-sharp-beans
ExclusiveArch: %mono_arches
- gtk-sharp2
ExclusiveArch: %mono_arches
- gtk-sharp3
ExclusiveArch: %{mono_arches}
- gtkd
ExclusiveArch: %{ldc_arches}
- gudev-sharp
ExclusiveArch: %mono_arches
- hedgewars
ExclusiveArch: %{fpc_arches}
- heketi
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- hsakmt
ExclusiveArch: x86_64 aarch64
- hub
ExclusiveArch: %{go_arches}
- hugo
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- hyena
ExclusiveArch: %{mono_arches}
- hyperscan
ExclusiveArch: x86_64
- hyperv-daemons
ExclusiveArch: i686 x86_64
- icaro
ExclusiveArch: %{ix86} %{arm} x86_64 noarch
- ignition
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- ikarus
ExclusiveArch: %{ix86}
- imvirt
ExclusiveArch: %{ix86} x86_64 ia64
- indistarter
ExclusiveArch: %{fpc_arches}
- infinipath-psm
ExclusiveArch: x86_64
- insect
ExclusiveArch: %{nodejs_arches} noarch
- intel-cmt-cat
ExclusiveArch: x86_64 i686 i586
ExclusiveArch: x86_64 i686 i586
- intel-gmmlib
ExclusiveArch: x86_64 i686
- ioport
ExclusiveArch: %{ix86} x86_64
- ipmctl
ExclusiveArch: x86_64
- ipw2100-firmware
ExclusiveArch: noarch i386 x86_64
- ipw2200-firmware
ExclusiveArch: noarch i386 x86_64
- ispc
ExclusiveArch: %{arm} %{ix86} x86_64
- iucode-tool
ExclusiveArch: %{ix86} x86_64
- iwyu
ExclusiveArch: %{ix86} x86_64
- jake
ExclusiveArch: %{nodejs_arches} noarch
- jasmine-node
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- java-1.8.0-openjdk-aarch32
ExclusiveArch: %{arm}
- josm
ExclusiveArch: %{ix86} x86_64
- keepass
ExclusiveArch: %{mono_arches}
- kernel
ExclusiveArch: %{all_x86} x86_64 s390x %{arm} aarch64 ppc64le
- kicad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- knot-resolver
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- kompose
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 s390x
- kosmtik
ExclusiveArch: %{nodejs_arches} noarch
- kubernetes
ExclusiveArch: x86_64 aarch64 ppc64le s390x %{arm}
- latrace
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{power64}
- lazarus
ExclusiveArch: %{fpc_arches}
- ldc
ExclusiveArch: %{ldc_arches}
- libbsr
ExclusiveArch: %{power64}
- libclc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{power64} s390x
- libcxl
ExclusiveArch: %{power64}
- libdparse
ExclusiveArch: %{ldc_arches}
- libflatarray
ExclusiveArch: %{ix86} x86_64
- libica
ExclusiveArch: s390 s390x
- libipt
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- libmfx
ExclusiveArch: %{ix86} x86_64
- libocxl
ExclusiveArch: ppc64le
- libpsm2
ExclusiveArch: x86_64
- libquentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- librtas
ExclusiveArch: %{power64}
- libseccomp
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 mipsel mips64el ppc64 ppc64le s390 s390x
- libservicelog
ExclusiveArch: ppc %{power64}
- libsmbios
ExclusiveArch: x86_64 %{ix86}
- libunwind
ExclusiveArch: %{arm} aarch64 hppa ia64 mips ppc %{power64} %{ix86} x86_64
- libva-intel-hybrid-driver
ExclusiveArch: %{ix86} x86_64 ia64
- libvmi
ExclusiveArch: x86_64
- libvpd
ExclusiveArch: %{power64}
- libxsmm
ExclusiveArch: x86_64
- libzfcphbaapi
ExclusiveArch: s390 s390x
- lodash
ExclusiveArch: %{nodejs_arches} noarch
- log4net
ExclusiveArch: %mono_arches
- lrmi
ExclusiveArch: %{ix86}
- lsvpd
ExclusiveArch: %{power64}
- luajit
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- mactel-boot
ExclusiveArch: x86_64
- manifest-tool
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- marked
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- matreshka
ExclusiveArch: %GPRbuild_arches
- maven-eclipse-plugin
ExclusiveArch: %{ix86} x86_64
- maxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- mcelog
ExclusiveArch: i686 x86_64
- mediaconch
ExclusiveArch: %{qt5_qtwebengine_arches}
- mellowplayer
ExclusiveArch: %{qt5_qtwebengine_arches}
- memkind
ExclusiveArch: x86_64
- memtest86+
ExclusiveArch: %{ix86} x86_64
- mesos
ExclusiveArch: x86_64
- microcode_ctl
ExclusiveArch: %{ix86} x86_64
- micropython
ExclusiveArch: %{arm} x86_64
- mine_detector
ExclusiveArch: %{GPRbuild_arches}
- minetest
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- mingw-wine-gecko
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- mkbootdisk
ExclusiveArch: %{ix86} sparc sparc64 x86_64
- mnemosyne
ExclusiveArch: noarch %{qt5_qtwebengine_arches}
- mocha
ExclusiveArch: %{nodejs_arches} noarch
- mod_mono
ExclusiveArch: %mono_arches
- module-build-service
ExclusiveArch: %{ix86} x86_64 noarch
- mokutil
ExclusiveArch: %{ix86} x86_64 aarch64
- mongo-tools
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- mongodb
ExclusiveArch: %{upstream_arches}
- mono
ExclusiveArch: %mono_arches
- mono-addins
ExclusiveArch: %mono_arches
- mono-basic
ExclusiveArch: %{mono_arches}
- mono-bouncycastle
ExclusiveArch: %mono_arches
- mono-cecil
ExclusiveArch: %mono_arches
- mono-cecil-flowanalysis
ExclusiveArch: %mono_arches
- mono-debugger
ExclusiveArch: %ix86 x86_64
- mono-reflection
ExclusiveArch: %mono_arches
- mono-tools
ExclusiveArch: %mono_arches
- mono-zeroconf
ExclusiveArch: %mono_arches
- monobristol
ExclusiveArch: %{mono_arches}
- monodevelop
ExclusiveArch: %mono_arches
- monodevelop-debugger-gdb
ExclusiveArch: %{mono_arches}
- monosim
ExclusiveArch: %mono_arches
- mrrescue
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64
- msgpack-d
ExclusiveArch: %{ldc_arches}
- msr-tools
ExclusiveArch: %{ix86} x86_64
- mustache-d
ExclusiveArch: %{ldc_arches}
- mysql-connector-net
ExclusiveArch: %{mono_arches}
- nacl-arm-binutils
ExclusiveArch: x86_64
- nacl-binutils
ExclusiveArch: x86_64
- nacl-gcc
ExclusiveArch: x86_64
- nacl-newlib
ExclusiveArch: x86_64
- nant
ExclusiveArch: %mono_arches
- nbc
ExclusiveArch: %{fpc_arches}
- nbdkit
ExclusiveArch: x86_64
- ndesk-dbus
ExclusiveArch: %{mono_arches}
- ndesk-dbus-glib
ExclusiveArch: %{mono_arches}
- newtonsoft-json
ExclusiveArch: %{mono_arches}
- nim
ExclusiveArch: %{nim_arches}
- node-gyp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs
ExclusiveArch: %{nodejs_arches}
- nodejs-Base64
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-abbrev
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-accepts
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-acorn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-acorn-dynamic-import
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-acorn-jsx
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-acorn-object-spread
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-add-stream
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-after
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-agent-base
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-agentkeepalive
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ain2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-align-text
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-alter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansi
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgblack
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgblue
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgcyan
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bggreen
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgmagenta
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgred
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgwhite
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgyellow
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-black
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-blue
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bold
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-cyan
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansi-dim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-escapes
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-font
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-gray
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-green
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansi-grey
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-hidden
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-inverse
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-italic
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-magenta
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansi-red
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-regex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-reset
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-strikethrough
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-styles
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansi-underline
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-white
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-wrap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansi-yellow
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansicolors
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansidiff
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansistyles
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-any-path
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-any-promise
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ap
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-append-field
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-append-transform
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-aproba
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-archiver
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-archiver-utils
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-archy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-are-we-there-yet
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-argparse
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-argsparser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-arr-diff
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-arr-exclude
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-arr-flatten
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-arr-union
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-buffer-from-string
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-differ
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-events
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-filter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-find
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-find-index
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-flatten
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-foreach
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-ify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-index
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-reduce
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-union
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-uniq
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-unique
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-arraybuffer-dot-slice
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-arraybuffer-equal
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-arrify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-as-number
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-asap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ascii-tree
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ascli
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-asn1
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-assert-plus
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-assertion-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-assume
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ast-traverse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ast-types
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-astral
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-astral-angular-annotate
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-astral-pass
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async-array-reduce
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-async-arrays
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async-cache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async-each
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async-limiter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async-queue
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async-some
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-asynckit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-atob
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-auto-bind
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-autoresolve
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ava-init
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-aws-sign
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-aws-sign2
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-aws4
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-babel-code-frame
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-babel-messages
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-babel-plugin-syntax-async-functions
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-babel-plugin-syntax-async-generators
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-babel-runtime
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-babylon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-backbone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-backoff
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-balanced-match
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-base
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-base-option
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-base-plugins
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-base32-encode
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-base64-arraybuffer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-base64-js
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-base64-url
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-base64id
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bash-match
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-basic-auth
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-basic-auth-connect
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-basic-auth-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-batch
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-bcrypt
ExclusiveArch: %{nodejs_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- nodejs-bcryptjs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-beeper
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-benchmark
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-better-assert
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-better-than-before
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bignumber-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bind-obj-methods
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bindings
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-bit-mask
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-blob
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-block-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bluebird
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-body-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-boolbase
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-boom
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-brace-expansion
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-braces
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-breakable
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-browser-request
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-browser-stdout
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bson
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-buble
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-buf-compare
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-buffer-crc32
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-buffer-equal
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-buffer-shims
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-buffer-writer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-buffertools
ExclusiveArch: %{nodejs_arches}
- nodejs-bufferutil
ExclusiveArch: %{nodejs_arches}
- nodejs-builtin-modules
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-builtins
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bundle-dependencies
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-bunker
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-bunyan
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-burrito
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-busboy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-byline
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bytes
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cache-base
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-caching-transform
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-call-delayed
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-call-matcher
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-call-me-maybe
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-call-signature
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-callback-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-caller-callsite
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-caller-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-callsite
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-callsites
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-camel-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-camelcase
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-camelcase-keys
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-caniuse-db
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-capture-stack-trace
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-carrier
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-caseless
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-center-align
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-as-promised
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-cheerio
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-connect-middleware
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-fs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-json-schema
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-oauth2orize-grant
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-passport-strategy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-spies-next
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chainer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chainsaw
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chalk
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-change-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-char-spinner
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-character-parser
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-chardet
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-charenc
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-charm
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-check-env
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-check-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cheerio
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-child-process-close
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chmodr
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chownr
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chroma-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chrono
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ci-info
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-circular-json
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cjson
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-clap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-class-utils
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-clean-css
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-clean-yaml-object
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-clear-require
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cli
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cli-color
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cli-spinner
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cli-table
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cliui
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-clone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-clone-deep
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-clone-stats
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-closure-compiler
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cls
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cmd-shim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-co
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-co-mocha
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-co-with-promise
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-coa
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-code-point-at
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-codemirror
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-coffee-coverage
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-collection-visit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-collections
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-color-support
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-colour
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-columnify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-combined-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-commander
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-common-path-prefix
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-commondir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-commoner
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-commonmark
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-compare-func
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-compare-versions
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-component-emitter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-component-indexof
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-component-inherit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-compress-commons
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-compressible
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-compression
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-concat-map
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-concat-stream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-config-chain
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-connect
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-connect-livereload
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-connect-timeout
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-console-browserify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-console-dot-log
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-console-group
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-consolemd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-constant-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-constantinople
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-content-disposition
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-content-type
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-conventional-changelog-angular
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-atom
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-codemirror
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-core
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-conventional-changelog-ember
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-eslint
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-express
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-jquery
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-jscs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-jshint
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-preset-loader
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-writer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-commits-filter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-commits-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-recommended-bump
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-convert-hex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-convert-source-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cookie
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cookie-jar
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cookie-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cookie-session
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cookie-signature
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cookiejar
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cookies
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-copy-descriptor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-core-assert
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-core-js
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-core-util-is
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-couch-login
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-coveralls
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-crc
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-crc32-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-create-error-class
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cross-spawn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cross-spawn-async
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-crypt
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cryptiles
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-csrf
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-css
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-css-parse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-css-select
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-css-stringify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-css-tree
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-css-what
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-csscomb-core
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csslint
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csso
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cssom
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csurf
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csv
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csv-generate
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csv-parse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csv-spectrum
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csv-stringify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ctype
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-currently-unhandled
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cycle
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cyclist
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-d
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-dargs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dashdash
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-data-uri-to-buffer
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-date-now
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dateformat
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-death
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-debug
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-debug-fabulous
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-debug-log
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-debuglog
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-decamelize
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-decamelize-keys
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-decimal-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-decompress-response
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dedent
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-deep-eql
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-deep-equal
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-deep-extend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-deep-is
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-deeper
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-default-require-extensions
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-default-resolution
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-defaults
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-defence
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-defence-cli
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-deferred
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-define-properties
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-define-property
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-defined
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-defs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-degenerator
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-del
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-delayed-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-delegates
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-delete
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dep-graph
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-depd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-deprecated
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-destroy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-detect-file
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-detect-indent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-detect-newline
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-detect-node
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-detective
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dezalgo
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dicer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-diff
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-difflet
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-difflib
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-dirty-chai
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-discord-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-docopt
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-doctrine
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dom-serializer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-domelementtype
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-domhandler
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-domutils
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dot-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dot-prop
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dotfile-regex
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-dreamopt
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dryice
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-dtree
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-duplex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-duplexer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-duplexer2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-duplexer3
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-duplexify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-duration
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-each
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-each-async
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ebnf-parser
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-echomd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ecstatic
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-editor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ee-first
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ejs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-emojione
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-empty-dir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-encodeurl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-encoding
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-end-of-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-engine-dot-io
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-engine-dot-io-client
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-engine-dot-io-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-entities
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-error-ex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-error-symbol
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-errorhandler
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-errs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-es-abstract
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-es-to-primitive
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-es5-ext
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es5-shim
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es6-iterator
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es6-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es6-promise
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-es6-promisify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-es6-set
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es6-shim
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es6-symbol
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es6-weak-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-escallmatch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-escape-html
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-escape-regexp-component
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-escape-string-regexp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-escodegen
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-escope
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-espower
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-espower-location-detector
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-esprima
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-esprima-fb
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-esprima-harmony-jscs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-espurify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-esrecurse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-estraverse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-estraverse-fb
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-estree-walker
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-esutils
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-etag
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-event-emitter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-event-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-eventemitter2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-eventemitter3
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-events
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-events-to-array
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-everything-dot-js
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-execa
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-exit
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-expand-brackets
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-expand-range
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-expand-tilde
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-expect
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-expect-dot-js
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-express
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-express-session
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-extend
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-extend-shallow
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-extended-emitter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-extglob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-extsprintf
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-eyes
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fake
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fancy-log
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-far
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fast-levenshtein
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fastfall
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-faucet
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-faye-websocket
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fd-slicer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fg-lodash
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-figures
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-file-entry-cache
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-file-sync-cmp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-file-uri-to-path
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-filed
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-filelist
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-filename-regex
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fileset
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fill-keys
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fill-range
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-finalhandler
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-find-cache-dir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-find-up
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-findup-sync
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-first-chunk-stream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-flagged-respawn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-flat-cache
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-flot
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-flush-write-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fmix
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fn-dot-name
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fn-name
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-follow
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-follow-redirects
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-for-each
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-for-in
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-for-own
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-foreach
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-foreground-child
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-forever-agent
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-form-data
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-formatio
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-formidable
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-forwarded
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fragment-cache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-freetree
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fresh
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-from
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-from2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-dot-notify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-exists-cached
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-exists-sync
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fs-ext
ExclusiveArch: %{nodejs_arches}
- nodejs-fs-extra
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-promise
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-temp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-vacuum
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-write-stream-atomic
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs2
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fstream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fstream-ignore
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fstream-npm
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ftp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-function-bind
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-function-loop
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-gauge
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gaze
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gdal
ExclusiveArch: %{nodejs_arches}
- nodejs-generate-function
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-generate-object-property
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-generic-pool
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-get-pkg-repo
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-get-port
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-get-stdin
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-get-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-get-uri
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-get-value
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-getobject
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gettext-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-git-dummy-commit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-git-raw-commits
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-git-remote-origin-url
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-git-semver-tags
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-git-tails
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gitconfiglocal
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-github-url-from-git
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-github-url-from-username-repo
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-glob
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-glob-base
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-glob-expand
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-glob-parent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-glob-to-regexp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-global-modules
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-global-prefix
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-globals
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-globby
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-globule
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-glogg
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gnode
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-gonzales-pe
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-got
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-graceful-fs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-graceful-readlink
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grip
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-growl
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-angular-templates
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-banner
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-cli
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-compare-size
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-clean
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-concat
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-connect
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-copy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-contrib-csslint
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-cssmin
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-htmlmin
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-contrib-internal
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-less
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-nodeunit
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-requirejs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-contrib-uglify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-watch
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-git-authors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-html-validation
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-init
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-known-options
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-legacy-log
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-legacy-log-utils
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-legacy-util
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-lib-contrib
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-saucelabs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-sed
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-simple-mocha
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-svgmin
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-util-args
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-util-options
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-util-process
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-util-property
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-wrap
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-gulp-mocha
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gulp-ng-classify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-gulp-util
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gulplog
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gzip-size
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-handle-thing
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-handlebars
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-har-validator
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-ansi
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-binary
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-binary2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-color
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-has-cors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-flag
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-glob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-has-gulplog
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-has-symbols
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-unicode
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-value
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-values
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-yarn
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hash_file
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hawk
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-he
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-heap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-hex-to-array-buffer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-highlight-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-historic-readline
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hock
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hoek
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-homedir-polyfill
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hook-std
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hooker
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-hosted-git-info
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hsluv
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-html-minifier
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-htmlparser2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-http-deceiver
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-http-errors
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-http-proxy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-http-proxy-agent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-http-server
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-http-signature
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-http2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-https-proxy-agent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-humanize-ms
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-i
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-i18n-transform
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-i2c
ExclusiveArch: %{nodejs_arches}
- nodejs-iconv
ExclusiveArch: %{nodejs_arches}
- nodejs-iconv-lite
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-iferr
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ignore
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-image-size
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-immutable
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-import-local
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-imul
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-imurmurhash
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-indent-string
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-indexof
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-infinity-agent
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-inflight
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-info-symbol
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-inherit
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-inherits
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-inherits1
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ini
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-init-package-json
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-inline-source-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-install
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-int64-buffer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-intercept-require
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-interpret
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-into-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-invert-kv
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ip
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ipaddr-dot-js
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-irc-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-irc-formatting
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-irc-upd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-irregular-plurals
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-absolute
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-accessor-descriptor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-arrayish
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-arrow-function
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-boolean-object
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-buffer
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-builtin-module
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-callable
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-data-descriptor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-date-object
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-descriptor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-dir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-dotfile
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-equal
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-equal-shallow
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-extendable
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-extglob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-finite
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-fullwidth-code-point
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-function
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-generator
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-generator-fn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-generator-function
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-glob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-lower-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-module
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-my-json-valid
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-negated-glob
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-node
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-number
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-number-object
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-obj
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-object
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-observable
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-odd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-path-cwd
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-path-in-cwd
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-path-inside
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-plain-obj
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-plain-object
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-primitive
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-promise
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-property
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-redirect
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-regex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-regexp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-registered
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-relative
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-retry-allowed
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-string
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-subset
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-symbol
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-text-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-typedarray
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-unc-path
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-upper-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-url
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-utf8
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-valid-glob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-valid-instance
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-windows
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-isarray
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-isexe
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-iso8601
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-isobject
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-isodate
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-isstream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-istanbul
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-istanbul-lib-coverage
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-istanbul-lib-hook
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-istanbul-lib-report
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-istanbul-lib-source-maps
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-istanbul-reports
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jade
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jasmine-growl-reporter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jasmine-reporters
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jest-mock
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jison
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jison-lex
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jju
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-joose
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-joosex-namespace-depended
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-joosex-simplerequest
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-js-base64
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-js-string-escape
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-js-tokens
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-js-yaml
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jschardet
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jscoverage
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jshint
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-json-diff
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-json-localizer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-json-parse-better-errors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-json-parse-helpfulerror
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-json-stable-stringify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-json-stringify-safe
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-json3
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jsonfile
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jsonify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jsonm
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jsonparse
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jsonpointer
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jsonpointer-dot-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jsonselect
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jwt-simple
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-keep-alive-agent
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-keygrip
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-keypress
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-kind-of
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-klaw
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-kuler2gpl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-latest-version
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-lazy-cache
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-lazystream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-lcid
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lcov-parse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-leaflet
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-leaflet-formbuilder
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-leaflet-hash
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-leche
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-left-pad
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-less
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-less-plugin-clean-css
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-levn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-lex-parser
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-libpq
ExclusiveArch: %{nodejs_arches}
- nodejs-libxmljs
ExclusiveArch: %{nodejs_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- nodejs-line-numbers
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-line-reader
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-linefix
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-linkify-it
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-load-grunt-tasks
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-load-json-file
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-locate-character
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-locate-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lockfile
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-log-driver
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-log-ok
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-log-symbols
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-log-utils
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lolex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-long
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-longest
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-loophole
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-loud-rejection
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-lower-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lower-case-first
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lowercase-keys
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lru-cache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lru-queue
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ltx
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-magic-string
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-make-arrow-function
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-make-dir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-make-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-make-generator-function
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-make-node
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-makedir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-makeerror
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-map-cache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-map-obj
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-map-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-map-visit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mapnik
ExclusiveArch: %{nodejs_arches}
- nodejs-mapnik-pool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mapnik-vector-tile
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-markdown
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-markdown-it-testgen
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-marked
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-matched
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-max-timeout
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-maxmin
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mbtiles
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-md5
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-md5-hex
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-md5-o-matic
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-mdn-data
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mdurl
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-media-typer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-memoize-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-memoizee
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-memwatch-next
ExclusiveArch: %{nodejs_arches}
- nodejs-meow
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-merge-descriptors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-merge-stream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-metascript
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-method-override
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-methods
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-micromatch
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-millstone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mime
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-mime-db
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mime-types
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mimeparse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-mimic-response
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-minimalistic-assert
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-minimatch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-minimist
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-minimist-options
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-minipass
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-minstache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mixin-deep
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mixin-object
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mkdirp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mkfiletree
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mock-bin
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mock-fs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mock-git
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-modify-values
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-module-not-found-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-moment
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-moment-timezone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mongodb
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mongodb-core
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-monocle
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-morgan
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ms
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-muffin
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-multiline
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-multimatch
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-multiparty
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-multipipe
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-murmur-32
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mustache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mutate-fs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mute-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mv
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-mysql
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mz
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nan
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nan0
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nan1
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nanomatch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nanoseconds
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-native-or-bluebird
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ncp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-needle
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-negative-zero
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-negotiator
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nested-error-stacks
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-net-browserify-alt
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-netmask
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-next
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-next-tick
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ng-classify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-dot-extend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-expat
ExclusiveArch: %{nodejs_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- nodejs-node-int64
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-markdown
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-print
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-static
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-status-codes
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-stringprep
ExclusiveArch: %{nodejs_arches}
- nodejs-node-uuid
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nomnom
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-noncharacters
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nopt
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nopt-usage
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-noptify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-normalize-git-url
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-normalize-package-data
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-normalize-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npm-cache-filename
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npm-install-checks
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npm-license
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-npm-package-arg
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npm-registry-client
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-npm-run-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npm-user-validate
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npmlog
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nsp-api
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nsp-audit-shrinkwrap
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nth-check
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-number-is-nan
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-numeral
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-oauth
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-oauth-sign
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-oauth2orize
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-assign
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-copy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-dot-entries
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-object-dot-omit
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-object-dot-pick
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-object-inspect
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-is
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-keys
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-visit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-observable-to-promise
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-obuf
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-okay
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-on-finished
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-on-headers
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-once
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-onetime
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-only-shallow
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-oop
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-opal-runtime
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-open
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-opener
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-opn
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-option-cache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-option-chain
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-optionator
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-options
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-optjs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-opts
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-orchestrator
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ordered-read-streams
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-os-homedir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-os-locale
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-os-shim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-os-tmpdir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-osenv
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-output-file-sync
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-own-or
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-own-or-env
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-p-finally
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-p-is-promise
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-p-limit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-p-locate
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pac-proxy-agent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pac-resolver
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-package
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-package-info
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-package-json
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-package-license
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-packaging
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-packet-reader
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pad
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pad-left
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-paperboy
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-parallel-transform
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-param-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parse-github-repo-url
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parse-glob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-parse-json
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parse-ms
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parse-passwd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parsejson
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parseqs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parserlib
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-parseuri
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parseurl
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pascal-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pascalcase
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-http-bearer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-oauth
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-oauth1
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-oauth2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-oauth2-client-password
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-strategy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-array
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-path-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-dirname
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-exists
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-extra
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-is-absolute
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-is-inside
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-key
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-parse
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-to-regexp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-path-type
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pathval
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pause
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pause-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pbkdf2-password
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pedding
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pegjs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pem
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pff
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-connection-string
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-cursor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-escape
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-int8
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-native
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-pool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-types
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pgpass
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pinkie
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pinkie-promise
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pkg-dir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pkg-up
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pkginfo
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-platform
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-plur
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-portfinder
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-portscanner
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-posix-character-classes
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-posix-getopt
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-postgres-array
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-postgres-bytea
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-postgres-date
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-postgres-interval
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-precond
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-prelude-ls
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-prepend-http
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-preserve
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pretty-bytes
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pretty-hrtime
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pretty-ms
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pretty-time
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-prism-media
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-private
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-process-nextick-args
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-proclaim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-progress
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-progress-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-promise
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-promises-aplus-tests
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-prompt
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-promzard
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-propagate
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-propget
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-proto-list
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-proxy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-proxy-addr
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-proxy-agent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-proxyquire
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pruddy-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pseudomap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pubcontrol
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pump
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pumpify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-q
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-q-io
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-qs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-qtdatastream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-queue-async
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-quick-lru
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-qunit-extras
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-qunitjs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rainbowsocks
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-random-bytes
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-random-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-randomatic
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-range-parser
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-raw-body
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rc
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-re-emitter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-read-all-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-read-cmd-shim
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read-dir-files
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read-file
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read-installed
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read-json-sync
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read-package-json
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read-package-tree
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read-pkg
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-read-pkg-up
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-readable-stream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-readdir-enhanced
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-readdir-scoped-modules
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-readdirp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-realize-package-specifier
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-recast
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-rechoir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-redent
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-reduce-component
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-regenerator
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-regex-cache
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-regex-not
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-registry-url
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-relateurl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-remove-trailing-separator
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-repeat-element
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-repeat-string
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-repeating
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-repl
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-replace
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-replace-ext
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-replace-require-self
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-request
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-requestretry
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-cs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-require-directory
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-inject
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-main-filename
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-relative
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-uncached
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-yaml
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-requirejs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-requires-port
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-resolve
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-resolve-cwd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-resolve-dir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-resolve-from
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-resolve-pkg
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-resolve-url
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-response-time
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-resumer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ret
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-retry
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-reusify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-revalidator
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-rewire
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rfile
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rhea
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-right-align
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rimraf
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rndm
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-rollup
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-rollup-plugin-buble
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rollup-plugin-commonjs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rollup-plugin-json
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rollup-plugin-node-resolve
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rollup-plugin-typescript
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rollup-pluginutils
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ronn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-run-parallel-limit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-runforcover
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-safe-buffer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-safe-json-stringify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-safe-regex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-safecb
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-samsam
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sauce-tunnel
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-saucelabs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-sax
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-scmp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-secure-random
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-seedrandom
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-select-hose
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-semver
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-send
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-sentence-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sentiment
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-seq
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sequencify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-serialize-error
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-serve-index
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-serve-static
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-server-destroy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-set-blocking
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-set-getter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-set-immediate
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-set-immediate-shim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-set-value
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-setimmediate
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-setprototypeof
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sha
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-shallow-clone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-shebang-command
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-shebang-regex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-shelljs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-shelljs-nodecli
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-should
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-should-equal
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-should-format
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-should-http
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-should-type
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-showdown
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sift
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sigmund
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-signal-exit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-silent-npm-registry-client
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-simple-assert
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-simple-asyncify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-simple-fmt
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-simple-is
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-simple-markdown
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-single-line-log
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sinon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sinon-chai
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-sinon-restore
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-slash
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-sliced
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-slide
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-smart-buffer
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-snake-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snapdragon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snapdragon-capture
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snapdragon-capture-set
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snapdragon-node
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snapdragon-util
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snekfetch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snockets
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-sntp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-socket-dot-io-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-socks-client
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-socks-proxy-agent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-sort-keys
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sorted-object
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-source-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-source-map-fixtures
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-source-map-resolve
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-source-map-support
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-source-map-url
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sparkles
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-spawn-sync
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spawn-wrap
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spdx-correct
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spdx-exceptions
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spdx-expression-parse
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spdx-license-ids
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spec
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spec-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-speedometer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-split
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-split-string
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-split2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sprintf
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sprintf-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sqlite3
ExclusiveArch: %{nodejs_arches}
- nodejs-srs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ssri
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-st
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stable
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stack-trace
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stack-utils
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-static-extend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-static-favicon
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-statuses
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-std-mocks
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-combiner
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-consume
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stream-counter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stream-each
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-equal
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-pair
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-reduce
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-replace
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stream-shift
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-spigot
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-to-array
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-transform
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-streamsearch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-streamsink
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-streamtest
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-string
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-string-dot-prototype-dot-repeat
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-string-dot-prototype-dot-trim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-string-width
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-string_decoder
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stringmap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stringscanner
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stringset
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stringstream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-ansi
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-strip-bom
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-bom-stream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-strip-bom-string
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-color
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-eof
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-indent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-strip-json-comments
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-path
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-strong-log-transformer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strscanner
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stylus
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-success-symbol
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-superagent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-superagent-proxy
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-supertest
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-supervisor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-supports-color
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-suspend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-svgmin
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-svgo
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-swap-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-symbol-observable
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tad
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tap
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tap-mocha-reporter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tap-out
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tap-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tap-spec
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tape
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tapes
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tar
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tar-pack
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tar-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-temp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-temp-dir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-temp-write
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tempfile
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-temporary
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tern
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tern-cordovajs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tern-liferay
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-terst
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-test
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-test-exclude
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-testdata-w3c-json-form
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-testjs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-testswarm
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-testutil
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-text-extensions
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-text-table
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-thenify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-thenify-all
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-thread-sleep
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-through
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-through2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-through2-filter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-thunkify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tildify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tilejson
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tilelive
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tilelive-mapnik
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tiletype
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-time-diff
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-time-stamp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-timed-out
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-timekeeper
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-timers-ext
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tiny-lr-fork
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tippex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-title-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tlds
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tmatch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tmp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tmpl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-to-absolute-glob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-to-array
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-to-object-path
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-to-regex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-to-regex-range
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-touch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tough-cookie
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tracejs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-transformers
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-traverse
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-treeify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tressa
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-trim
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-trim-newlines
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-trim-off-newlines
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-trivial-deferred
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-try-open
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-try-thread-sleep
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tryor
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tsame
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tslib
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tsscmp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ttembed-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tunnel-agent
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tv4
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tweetnacl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tweetnacl-util
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-type-check
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-type-detect
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-type-is
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-type-name
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-typeahead.js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-typedarray
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-typescript
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-uc-dot-micro
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-uglify-to-browserify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-uid-number
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-uid-safe
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-uid2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ultron
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-umask
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-unc-path-regex
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-underscore
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-underscore-dot-logger
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-unicode-length
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-union
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-union-value
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-unique-filename
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-unique-slug
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-unique-stream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-unique-temp-dir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-unpipe
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-unset-value
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-upper-case
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-upper-case-first
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-uri-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-urix
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-url-join
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-url-parse-lax
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-url2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-use
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-user-home
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-utf8
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-utfx
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-util
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-util-deprecate
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-util-extend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-util-inspect
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-utile
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-utilities
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-utils-merge
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-uuid
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-vali-date
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-validate-npm-package-license
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-validate-npm-package-name
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-vary
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-vasync
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-verror
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-vhost
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-vinyl
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-vlq
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-vow
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-vow-fs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-vow-queue
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-vows
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-w3cjs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-walkdir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-walker
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ware
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-warning-symbol
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-watchit
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-watershed
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-wbuf
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-wcwidth
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-weak-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-websocket-driver
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-when
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-whet-dot-extend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-which
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-win-spawn
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-window-size
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-winston
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-with
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-wolfy87-eventemitter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-woothee
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-wordwrap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-wrap-ansi
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-wrap-fn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-wrappy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-write
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-write-file-atomic
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-write-json-file
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-write-pkg
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ws
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xdg-basedir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xml2js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xmlbuilder
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xmldom
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xmlhttprequest
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xmlhttprequest-ssl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xregexp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-xtend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-y18n
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-yallist
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-yapool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-yargs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-yargs-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-yarn
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-yauzl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-yeast
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-yn
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-zap
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-zeropad
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-zip-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-zipfile
ExclusiveArch: %{nodejs_arches}
- nodejs-zlib-browserify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-zlibjs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodeunit
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- notify-sharp
ExclusiveArch: %{mono_arches}
- notify-sharp3
ExclusiveArch: %{mono_arches}
- nuget
ExclusiveArch: %{mono_arches}
- numatop
ExclusiveArch: %{ix86} x86_64
- nunit
ExclusiveArch: %{mono_arches}
- nunit2
ExclusiveArch: %{mono_arches}
- nvml
ExclusiveArch: x86_64
- nwchem
ExclusiveArch: x86_64 %{ix86}
- obfs4
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- oci-kvm-hook
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- oci-register-machine
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- oci-umount
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x %{mips}
- ocitools
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- odcs
ExclusiveArch: %{ix86} x86_64
- olpc-kbdshim
ExclusiveArch: %{ix86} %{arm}
- olpc-netutils
ExclusiveArch: %{ix86} %{arm}
- olpc-powerd
ExclusiveArch: %{ix86} %{arm}
- olpc-utils
ExclusiveArch: %{ix86} %{arm}
- onedrive
ExclusiveArch: %{ldc_arches}
- opal-prd
ExclusiveArch: ppc64le
- open-vm-tools
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64
- openblas
ExclusiveArch: %{openblas_arches}
- openjfx
ExclusiveArch: %{ix86} x86_64
- openlibm
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 %{power64}
- openmx
ExclusiveArch: x86_64 %{ix86}
- openni
ExclusiveArch: %{ix86} x86_64 %{arm}
- openni-primesense
ExclusiveArch: %{ix86} x86_64 %{arm}
- openssl-ibmca
ExclusiveArch: s390 s390x
- openvswitch
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- origin
ExclusiveArch: %{go_arches}
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- orion
ExclusiveArch: %{qt5_qtwebengine_arches}
- orthorobot
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64
- oshinko-cli
ExclusiveArch: %{go_arches}
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- paflib
ExclusiveArch: ppc %{power64}
- pcc
ExclusiveArch: %{ix86} x86_64
- pcmciautils
ExclusiveArch: %{ix86} x86_64 ia64 ppc ppc64 %{arm}
- pdfmod
ExclusiveArch: %mono_arches
- peripety
ExclusiveArch: %{rust_arches}
- perl-Dumbbench
ExclusiveArch: %{ix86} x86_64 noarch
- perl-Parse-DMIDecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- pesign
ExclusiveArch: %{ix86} x86_64 ia64 aarch64 %{arm}
- pesign-test-app
ExclusiveArch: i686 x86_64 ia64 aarch64
- pinta
ExclusiveArch: %mono_arches
- pioneer
ExclusiveArch: %{ix86} x86_64
- playonlinux
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- plv8
ExclusiveArch: %v8_arches
- pocl
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- podman
ExclusiveArch: aarch64 %{arm} ppc64le s390x x86_64
- poppler-sharp
ExclusiveArch: %mono_arches
- popub
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- powerpc-utils
ExclusiveArch: ppc %{power64}
- ppc64-diag
ExclusiveArch: ppc %{power64}
- publican-jboss
ExclusiveArch: i686 x86_64
- pvs-sbcl
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- python-afl
ExclusiveArch: %{ix86} x86_64
- python-etcd
ExclusiveArch: noarch %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- python-healpy
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-openoffice
ExclusiveArch: noarch x86_64
- python-pymoc
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-rpi-gpio
ExclusiveArch: %{arm} aarch64
- q4wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- qcint
ExclusiveArch: x86_64
- qclib
ExclusiveArch: s390 s390x
- qevercloud
ExclusiveArch: %{qt5_qtwebengine_arches}
- qmapshack
ExclusiveArch: %{qt5_qtwebengine_arches}
- qt4pas
ExclusiveArch: %{fpc_arches}
- qt5-qtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- quantum-espresso
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: %{openblas_arches}
- quentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- rear
ExclusiveArch: %ix86 x86_64 ppc ppc64 ppc64le ia64
- redhat-lsb
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- reg
ExclusiveArch: x86_64
- renderdoc
ExclusiveArch: %{ix86} x86_64
- reptyr
ExclusiveArch: %{ix86} x86_64 %{arm}
- rescene
ExclusiveArch: %{mono_arches}
- restsharp
ExclusiveArch: %{mono_arches}
- rhythmbox-alternative-toolbar
ExclusiveArch: %{ix86} %{arm} x86_64 ppc64 ppc64le
- rkt
ExclusiveArch: x86_64 aarch64 %{arm} %{ix86}
- rocm-runtime
ExclusiveArch: x86_64 aarch64
- rpm-ostree
ExclusiveArch: %{rust_arches}
- rssguard
ExclusiveArch: %{qt5_qtwebengine_arches}
- runc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le %{mips} s390x
- rust
ExclusiveArch: %{rust_arches}
- rust-abomonation
ExclusiveArch: %{rust_arches}
- rust-addr2line
ExclusiveArch: %{rust_arches}
- rust-adler32
ExclusiveArch: %{rust_arches}
- rust-aho-corasick
ExclusiveArch: %{rust_arches}
- rust-alga
ExclusiveArch: %{rust_arches}
- rust-alga_derive
ExclusiveArch: %{rust_arches}
- rust-ansi_colours
ExclusiveArch: %{rust_arches}
- rust-ansi_term
ExclusiveArch: %{rust_arches}
- rust-antidote
ExclusiveArch: %{rust_arches}
- rust-approx
ExclusiveArch: %{rust_arches}
- rust-arrayref
ExclusiveArch: %{rust_arches}
- rust-arrayvec
ExclusiveArch: %{rust_arches}
- rust-atk-sys
ExclusiveArch: %{rust_arches}
- rust-atty
ExclusiveArch: %{rust_arches}
- rust-backtrace
ExclusiveArch: %{rust_arches}
- rust-backtrace-sys
ExclusiveArch: %{rust_arches}
- rust-base100
ExclusiveArch: %{rust_arches}
- rust-base64
ExclusiveArch: %{rust_arches}
- rust-bat
ExclusiveArch: %{rust_arches}
- rust-bencher
ExclusiveArch: %{rust_arches}
- rust-bincode
ExclusiveArch: %{rust_arches}
- rust-bincode0.8
ExclusiveArch: %{rust_arches}
- rust-bindgen
ExclusiveArch: %{rust_arches}
- rust-bitflags
ExclusiveArch: %{rust_arches}
- rust-bitflags0.9
ExclusiveArch: %{rust_arches}
- rust-block-padding
ExclusiveArch: %{rust_arches}
- rust-brev
ExclusiveArch: %{rust_arches}
- rust-bufstream
ExclusiveArch: %{rust_arches}
- rust-build_const
ExclusiveArch: %{rust_arches}
- rust-byte-tools
ExclusiveArch: %{rust_arches}
- rust-bytecount
ExclusiveArch: %{rust_arches}
- rust-byteorder
ExclusiveArch: %{rust_arches}
- rust-bytes
ExclusiveArch: %{rust_arches}
- rust-bytes0.3
ExclusiveArch: %{rust_arches}
- rust-c_vec
ExclusiveArch: %{rust_arches}
- rust-cairo-rs
ExclusiveArch: %{rust_arches}
- rust-cairo-sys-rs
ExclusiveArch: %{rust_arches}
- rust-cargo
ExclusiveArch: %{rust_arches}
- rust-cast
ExclusiveArch: %{rust_arches}
- rust-cbindgen
ExclusiveArch: %{rust_arches}
- rust-cc
ExclusiveArch: %{rust_arches}
- rust-cexpr
ExclusiveArch: %{rust_arches}
- rust-cfg-if
ExclusiveArch: %{rust_arches}
- rust-chan
ExclusiveArch: %{rust_arches}
- rust-chrono
ExclusiveArch: %{rust_arches}
- rust-clang-sys
ExclusiveArch: %{rust_arches}
- rust-clap
ExclusiveArch: %{rust_arches}
- rust-clicolors-control
ExclusiveArch: %{rust_arches}
- rust-cmake
ExclusiveArch: %{rust_arches}
- rust-coco
ExclusiveArch: %{rust_arches}
- rust-config
ExclusiveArch: %{rust_arches}
- rust-console
ExclusiveArch: %{rust_arches}
- rust-cpp_demangle
ExclusiveArch: %{rust_arches}
- rust-crates-io
ExclusiveArch: %{rust_arches}
- rust-crc
ExclusiveArch: %{rust_arches}
- rust-crc-core
ExclusiveArch: %{rust_arches}
- rust-crossbeam
ExclusiveArch: %{rust_arches}
- rust-crossbeam-channel
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque0.4
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque0.5
ExclusiveArch: %{rust_arches}
- rust-crossbeam-epoch
ExclusiveArch: %{rust_arches}
- rust-crossbeam-utils
ExclusiveArch: %{rust_arches}
- rust-crypto-hash
ExclusiveArch: %{rust_arches}
- rust-cryptovec
ExclusiveArch: %{rust_arches}
- rust-cssparser
ExclusiveArch: %{rust_arches}
- rust-cssparser-macros
ExclusiveArch: %{rust_arches}
- rust-csv
ExclusiveArch: %{rust_arches}
- rust-csv-core
ExclusiveArch: %{rust_arches}
- rust-ctrlc
ExclusiveArch: %{rust_arches}
- rust-curl
ExclusiveArch: %{rust_arches}
- rust-curl-sys
ExclusiveArch: %{rust_arches}
- rust-custom_derive
ExclusiveArch: %{rust_arches}
- rust-data-encoding
ExclusiveArch: %{rust_arches}
- rust-datetime
ExclusiveArch: %{rust_arches}
- rust-dbus
ExclusiveArch: %{rust_arches}
- rust-decimal
ExclusiveArch: %{rust_arches}
- rust-delta_e
ExclusiveArch: %{rust_arches}
- rust-deque
ExclusiveArch: %{rust_arches}
- rust-devicemapper
ExclusiveArch: %{rust_arches}
- rust-diff
ExclusiveArch: %{rust_arches}
- rust-difference
ExclusiveArch: %{rust_arches}
- rust-directories
ExclusiveArch: %{rust_arches}
- rust-dirs
ExclusiveArch: %{rust_arches}
- rust-docopt
ExclusiveArch: %{rust_arches}
- rust-downcast-rs
ExclusiveArch: %{rust_arches}
- rust-dtoa
ExclusiveArch: %{rust_arches}
- rust-dtoa-short
ExclusiveArch: %{rust_arches}
- rust-edit-distance
ExclusiveArch: %{rust_arches}
- rust-either
ExclusiveArch: %{rust_arches}
- rust-encoding
ExclusiveArch: %{rust_arches}
- rust-encoding-index-japanese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-korean
ExclusiveArch: %{rust_arches}
- rust-encoding-index-simpchinese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-singlebyte
ExclusiveArch: %{rust_arches}
- rust-encoding-index-tradchinese
ExclusiveArch: %{rust_arches}
- rust-encoding_index_tests
ExclusiveArch: %{rust_arches}
- rust-encoding_rs
ExclusiveArch: %{rust_arches}
- rust-encoding_rs_io
ExclusiveArch: %{rust_arches}
- rust-enum_primitive
ExclusiveArch: %{rust_arches}
- rust-env_logger
ExclusiveArch: %{rust_arches}
- rust-env_logger0.4
ExclusiveArch: %{rust_arches}
- rust-errln
ExclusiveArch: %{rust_arches}
- rust-errno
ExclusiveArch: %{rust_arches}
- rust-error-chain
ExclusiveArch: %{rust_arches}
- rust-exa
ExclusiveArch: %{rust_arches}
- rust-extprim
ExclusiveArch: %{rust_arches}
- rust-extprim_literals_macros
ExclusiveArch: %{rust_arches}
- rust-failure
ExclusiveArch: %{rust_arches}
- rust-failure_derive
ExclusiveArch: %{rust_arches}
- rust-fake_clock
ExclusiveArch: %{rust_arches}
- rust-fallible-iterator
ExclusiveArch: %{rust_arches}
- rust-fd-find
ExclusiveArch: %{rust_arches}
- rust-filetime
ExclusiveArch: %{rust_arches}
- rust-fixedbitset
ExclusiveArch: %{rust_arches}
- rust-flame
ExclusiveArch: %{rust_arches}
- rust-flate2
ExclusiveArch: %{rust_arches}
- rust-float-cmp
ExclusiveArch: %{rust_arches}
- rust-fnv
ExclusiveArch: %{rust_arches}
- rust-foreign-types
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared
ExclusiveArch: %{rust_arches}
- rust-fragile
ExclusiveArch: %{rust_arches}
- rust-fs2
ExclusiveArch: %{rust_arches}
- rust-fuse
ExclusiveArch: %{rust_arches}
- rust-futures
ExclusiveArch: %{rust_arches}
- rust-futures-async-runtime
ExclusiveArch: %{rust_arches}
- rust-futures-channel
ExclusiveArch: %{rust_arches}
- rust-futures-core
ExclusiveArch: %{rust_arches}
- rust-futures-cpupool
ExclusiveArch: %{rust_arches}
- rust-futures-executor
ExclusiveArch: %{rust_arches}
- rust-futures-io
ExclusiveArch: %{rust_arches}
- rust-futures-macro-async
ExclusiveArch: %{rust_arches}
- rust-futures-macro-await
ExclusiveArch: %{rust_arches}
- rust-futures-sink
ExclusiveArch: %{rust_arches}
- rust-futures-stable
ExclusiveArch: %{rust_arches}
- rust-futures-timer
ExclusiveArch: %{rust_arches}
- rust-futures-util
ExclusiveArch: %{rust_arches}
- rust-futures0.1
ExclusiveArch: %{rust_arches}
- rust-gcsf
ExclusiveArch: %{rust_arches}
- rust-gdk
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf-sys
ExclusiveArch: %{rust_arches}
- rust-gdk-sys
ExclusiveArch: %{rust_arches}
- rust-generic-array
ExclusiveArch: %{rust_arches}
- rust-getopts
ExclusiveArch: %{rust_arches}
- rust-gimli
ExclusiveArch: %{rust_arches}
- rust-gio
ExclusiveArch: %{rust_arches}
- rust-gio-sys
ExclusiveArch: %{rust_arches}
- rust-gir-format-check
ExclusiveArch: %{rust_arches}
- rust-git2
ExclusiveArch: %{rust_arches}
- rust-git2-curl
ExclusiveArch: %{rust_arches}
- rust-glib
ExclusiveArch: %{rust_arches}
- rust-glib-sys
ExclusiveArch: %{rust_arches}
- rust-glob
ExclusiveArch: %{rust_arches}
- rust-globset
ExclusiveArch: %{rust_arches}
- rust-gobject-sys
ExclusiveArch: %{rust_arches}
- rust-goblin
ExclusiveArch: %{rust_arches}
- rust-google-drive3-fork
ExclusiveArch: %{rust_arches}
- rust-grep
ExclusiveArch: %{rust_arches}
- rust-grep-cli
ExclusiveArch: %{rust_arches}
- rust-grep-matcher
ExclusiveArch: %{rust_arches}
- rust-grep-pcre2
ExclusiveArch: %{rust_arches}
- rust-grep-printer
ExclusiveArch: %{rust_arches}
- rust-grep-regex
ExclusiveArch: %{rust_arches}
- rust-grep-searcher
ExclusiveArch: %{rust_arches}
- rust-gtk
ExclusiveArch: %{rust_arches}
- rust-gtk-rs-lgpl-docs
ExclusiveArch: %{rust_arches}
- rust-gtk-source-sys
ExclusiveArch: %{rust_arches}
- rust-gtk-sys
ExclusiveArch: %{rust_arches}
- rust-gzip-header
ExclusiveArch: %{rust_arches}
- rust-h2
ExclusiveArch: %{rust_arches}
- rust-half
ExclusiveArch: %{rust_arches}
- rust-hamcrest
ExclusiveArch: %{rust_arches}
- rust-handlebars
ExclusiveArch: %{rust_arches}
- rust-heapsize
ExclusiveArch: %{rust_arches}
- rust-hex
ExclusiveArch: %{rust_arches}
- rust-home
ExclusiveArch: %{rust_arches}
- rust-horrorshow
ExclusiveArch: %{rust_arches}
- rust-http
ExclusiveArch: %{rust_arches}
- rust-httparse
ExclusiveArch: %{rust_arches}
- rust-humantime
ExclusiveArch: %{rust_arches}
- rust-hyper
ExclusiveArch: %{rust_arches}
- rust-hyper-native-tls
ExclusiveArch: %{rust_arches}
- rust-hyper-tls
ExclusiveArch: %{rust_arches}
- rust-hyper0.10
ExclusiveArch: %{rust_arches}
- rust-id_tree
ExclusiveArch: %{rust_arches}
- rust-idna
ExclusiveArch: %{rust_arches}
- rust-ignore
ExclusiveArch: %{rust_arches}
- rust-indexmap
ExclusiveArch: %{rust_arches}
- rust-input_buffer
ExclusiveArch: %{rust_arches}
- rust-intervaltree
ExclusiveArch: %{rust_arches}
- rust-iovec
ExclusiveArch: %{rust_arches}
- rust-iso8601
ExclusiveArch: %{rust_arches}
- rust-itertools
ExclusiveArch: %{rust_arches}
- rust-itertools-num
ExclusiveArch: %{rust_arches}
- rust-itoa
ExclusiveArch: %{rust_arches}
- rust-jobserver
ExclusiveArch: %{rust_arches}
- rust-lab
ExclusiveArch: %{rust_arches}
- rust-language-tags
ExclusiveArch: %{rust_arches}
- rust-lazy-init
ExclusiveArch: %{rust_arches}
- rust-lazy_static
ExclusiveArch: %{rust_arches}
- rust-lazycell
ExclusiveArch: %{rust_arches}
- rust-libc
ExclusiveArch: %{rust_arches}
- rust-libdbus-sys
ExclusiveArch: %{rust_arches}
- rust-libgit2-sys
ExclusiveArch: %{rust_arches}
- rust-libloading
ExclusiveArch: %{rust_arches}
- rust-libm
ExclusiveArch: %{rust_arches}
- rust-libmount
ExclusiveArch: %{rust_arches}
- rust-libssh2-sys
ExclusiveArch: %{rust_arches}
- rust-libudev
ExclusiveArch: %{rust_arches}
- rust-libudev-sys
ExclusiveArch: %{rust_arches}
- rust-libz-sys
ExclusiveArch: %{rust_arches}
- rust-linked-hash-map
ExclusiveArch: %{rust_arches}
- rust-lipsum
ExclusiveArch: %{rust_arches}
- rust-locale
ExclusiveArch: %{rust_arches}
- rust-lock_api
ExclusiveArch: %{rust_arches}
- rust-log
ExclusiveArch: %{rust_arches}
- rust-log0.3
ExclusiveArch: %{rust_arches}
- rust-loopdev
ExclusiveArch: %{rust_arches}
- rust-lru_time_cache
ExclusiveArch: %{rust_arches}
- rust-lzma-sys
ExclusiveArch: %{rust_arches}
- rust-macro-attr
ExclusiveArch: %{rust_arches}
- rust-maplit
ExclusiveArch: %{rust_arches}
- rust-matches
ExclusiveArch: %{rust_arches}
- rust-matrixmultiply
ExclusiveArch: %{rust_arches}
- rust-md5
ExclusiveArch: %{rust_arches}
- rust-memchr
ExclusiveArch: %{rust_arches}
- rust-memmap
ExclusiveArch: %{rust_arches}
- rust-memoffset
ExclusiveArch: %{rust_arches}
- rust-metadeps
ExclusiveArch: %{rust_arches}
- rust-mime
ExclusiveArch: %{rust_arches}
- rust-mime-sniffer
ExclusiveArch: %{rust_arches}
- rust-mime0.2
ExclusiveArch: %{rust_arches}
- rust-miniz-sys
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide_c_api
ExclusiveArch: %{rust_arches}
- rust-mint
ExclusiveArch: %{rust_arches}
- rust-mio
ExclusiveArch: %{rust_arches}
- rust-mio-extras
ExclusiveArch: %{rust_arches}
- rust-mio-uds
ExclusiveArch: %{rust_arches}
- rust-mnt
ExclusiveArch: %{rust_arches}
- rust-modifier
ExclusiveArch: %{rust_arches}
- rust-multimap
ExclusiveArch: %{rust_arches}
- rust-native-tls
ExclusiveArch: %{rust_arches}
- rust-natord
ExclusiveArch: %{rust_arches}
- rust-net2
ExclusiveArch: %{rust_arches}
- rust-newtype_derive
ExclusiveArch: %{rust_arches}
- rust-nix
ExclusiveArch: %{rust_arches}
- rust-nodrop
ExclusiveArch: %{rust_arches}
- rust-nom
ExclusiveArch: %{rust_arches}
- rust-nom3
ExclusiveArch: %{rust_arches}
- rust-num
ExclusiveArch: %{rust_arches}
- rust-num-bigint
ExclusiveArch: %{rust_arches}
- rust-num-complex
ExclusiveArch: %{rust_arches}
- rust-num-integer
ExclusiveArch: %{rust_arches}
- rust-num-iter
ExclusiveArch: %{rust_arches}
- rust-num-rational
ExclusiveArch: %{rust_arches}
- rust-num-traits
ExclusiveArch: %{rust_arches}
- rust-num-traits0.1
ExclusiveArch: %{rust_arches}
- rust-num_cpus
ExclusiveArch: %{rust_arches}
- rust-number_prefix
ExclusiveArch: %{rust_arches}
- rust-object
ExclusiveArch: %{rust_arches}
- rust-onig
ExclusiveArch: %{rust_arches}
- rust-onig_sys
ExclusiveArch: %{rust_arches}
- rust-openssl
ExclusiveArch: %{rust_arches}
- rust-openssl-probe
ExclusiveArch: %{rust_arches}
- rust-openssl-sys
ExclusiveArch: %{rust_arches}
- rust-ord_subset
ExclusiveArch: %{rust_arches}
- rust-owning_ref
ExclusiveArch: %{rust_arches}
- rust-packaging
ExclusiveArch: %{rust_arches} noarch
- rust-pad
ExclusiveArch: %{rust_arches}
- rust-pager
ExclusiveArch: %{rust_arches}
- rust-pango
ExclusiveArch: %{rust_arches}
- rust-pango-sys
ExclusiveArch: %{rust_arches}
- rust-pangocairo
ExclusiveArch: %{rust_arches}
- rust-pangocairo-sys
ExclusiveArch: %{rust_arches}
- rust-parity-wasm
ExclusiveArch: %{rust_arches}
- rust-parking_lot
ExclusiveArch: %{rust_arches}
- rust-parking_lot_core
ExclusiveArch: %{rust_arches}
- rust-pcre2
ExclusiveArch: %{rust_arches}
- rust-pcre2-sys
ExclusiveArch: %{rust_arches}
- rust-peeking_take_while
ExclusiveArch: %{rust_arches}
- rust-peg
ExclusiveArch: %{rust_arches}
- rust-percent-encoding
ExclusiveArch: %{rust_arches}
- rust-permutate
ExclusiveArch: %{rust_arches}
- rust-permutohedron
ExclusiveArch: %{rust_arches}
- rust-pest
ExclusiveArch: %{rust_arches}
- rust-pest_derive
ExclusiveArch: %{rust_arches}
- rust-phf
ExclusiveArch: %{rust_arches}
- rust-phf_codegen
ExclusiveArch: %{rust_arches}
- rust-phf_generator
ExclusiveArch: %{rust_arches}
- rust-phf_shared
ExclusiveArch: %{rust_arches}
- rust-pkg-config
ExclusiveArch: %{rust_arches}
- rust-plain
ExclusiveArch: %{rust_arches}
- rust-plist
ExclusiveArch: %{rust_arches}
- rust-pretty-git-prompt
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions
ExclusiveArch: %{rust_arches}
- rust-pretty_env_logger
ExclusiveArch: %{rust_arches}
- rust-proc-macro2
ExclusiveArch: %{rust_arches}
- rust-proc-macro2-0.3
ExclusiveArch: %{rust_arches}
- rust-procedural-masquerade
ExclusiveArch: %{rust_arches}
- rust-pulldown-cmark
ExclusiveArch: %{rust_arches}
- rust-quick-error
ExclusiveArch: %{rust_arches}
- rust-quickcheck
ExclusiveArch: %{rust_arches}
- rust-quickcheck0.6
ExclusiveArch: %{rust_arches}
- rust-quickersort
ExclusiveArch: %{rust_arches}
- rust-quote
ExclusiveArch: %{rust_arches}
- rust-quote0.3
ExclusiveArch: %{rust_arches}
- rust-quote0.5
ExclusiveArch: %{rust_arches}
- rust-rand
ExclusiveArch: %{rust_arches}
- rust-rand0.4
ExclusiveArch: %{rust_arches}
- rust-rand_core
ExclusiveArch: %{rust_arches}
- rust-rawpointer
ExclusiveArch: %{rust_arches}
- rust-rayon
ExclusiveArch: %{rust_arches}
- rust-rayon-core
ExclusiveArch: %{rust_arches}
- rust-recycler
ExclusiveArch: %{rust_arches}
- rust-regex
ExclusiveArch: %{rust_arches}
- rust-regex-syntax
ExclusiveArch: %{rust_arches}
- rust-relay
ExclusiveArch: %{rust_arches}
- rust-remove_dir_all
ExclusiveArch: %{rust_arches}
- rust-ripgrep
ExclusiveArch: %{rust_arches}
- rust-rust-ini
ExclusiveArch: %{rust_arches}
- rust-rustc-demangle
ExclusiveArch: %{rust_arches}
- rust-rustc-serialize
ExclusiveArch: %{rust_arches}
- rust-rustc-test
ExclusiveArch: %{rust_arches}
- rust-rustc_version
ExclusiveArch: %{rust_arches}
- rust-rustdoc-stripper
ExclusiveArch: %{rust_arches}
- rust-rustfilt
ExclusiveArch: %{rust_arches}
- rust-rustfix
ExclusiveArch: %{rust_arches}
- rust-ryu
ExclusiveArch: %{rust_arches}
- rust-safemem
ExclusiveArch: %{rust_arches}
- rust-same-file
ExclusiveArch: %{rust_arches}
- rust-scoped-tls
ExclusiveArch: %{rust_arches}
- rust-scoped_threadpool
ExclusiveArch: %{rust_arches}
- rust-scopeguard
ExclusiveArch: %{rust_arches}
- rust-scroll
ExclusiveArch: %{rust_arches}
- rust-scroll_derive
ExclusiveArch: %{rust_arches}
- rust-seahash
ExclusiveArch: %{rust_arches}
- rust-semver
ExclusiveArch: %{rust_arches}
- rust-semver-parser
ExclusiveArch: %{rust_arches}
- rust-semver-parser0.7
ExclusiveArch: %{rust_arches}
- rust-serde
ExclusiveArch: %{rust_arches}
- rust-serde0.8
ExclusiveArch: %{rust_arches}
- rust-serde_bytes
ExclusiveArch: %{rust_arches}
- rust-serde_cbor
ExclusiveArch: %{rust_arches}
- rust-serde_derive
ExclusiveArch: %{rust_arches}
- rust-serde_ignored
ExclusiveArch: %{rust_arches}
- rust-serde_json
ExclusiveArch: %{rust_arches}
- rust-serde_json0.8
ExclusiveArch: %{rust_arches}
- rust-serde_test
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded
ExclusiveArch: %{rust_arches}
- rust-serde_yaml
ExclusiveArch: %{rust_arches}
- rust-sha1
ExclusiveArch: %{rust_arches}
- rust-shell-escape
ExclusiveArch: %{rust_arches}
- rust-shell-words
ExclusiveArch: %{rust_arches}
- rust-shlex
ExclusiveArch: %{rust_arches}
- rust-simplelog
ExclusiveArch: %{rust_arches}
- rust-siphasher
ExclusiveArch: %{rust_arches}
- rust-slab
ExclusiveArch: %{rust_arches}
- rust-smallvec
ExclusiveArch: %{rust_arches}
- rust-snowflake
ExclusiveArch: %{rust_arches}
- rust-socket2
ExclusiveArch: %{rust_arches}
- rust-sourceview
ExclusiveArch: %{rust_arches}
- rust-spin
ExclusiveArch: %{rust_arches}
- rust-spmc
ExclusiveArch: %{rust_arches}
- rust-stable_deref_trait
ExclusiveArch: %{rust_arches}
- rust-streaming-stats
ExclusiveArch: %{rust_arches}
- rust-string
ExclusiveArch: %{rust_arches}
- rust-strings
ExclusiveArch: %{rust_arches}
- rust-strsim
ExclusiveArch: %{rust_arches}
- rust-structopt
ExclusiveArch: %{rust_arches}
- rust-structopt-derive
ExclusiveArch: %{rust_arches}
- rust-syn
ExclusiveArch: %{rust_arches}
- rust-syn0.11
ExclusiveArch: %{rust_arches}
- rust-syn0.13
ExclusiveArch: %{rust_arches}
- rust-syn0.14
ExclusiveArch: %{rust_arches}
- rust-synom
ExclusiveArch: %{rust_arches}
- rust-synstructure
ExclusiveArch: %{rust_arches}
- rust-syntect
ExclusiveArch: %{rust_arches}
- rust-sys-info
ExclusiveArch: %{rust_arches}
- rust-tabwriter
ExclusiveArch: %{rust_arches}
- rust-take
ExclusiveArch: %{rust_arches}
- rust-take_mut
ExclusiveArch: %{rust_arches}
- rust-tar
ExclusiveArch: %{rust_arches}
- rust-tempdir
ExclusiveArch: %{rust_arches}
- rust-tempfile
ExclusiveArch: %{rust_arches}
- rust-term
ExclusiveArch: %{rust_arches}
- rust-term_grid
ExclusiveArch: %{rust_arches}
- rust-term_size
ExclusiveArch: %{rust_arches}
- rust-termcolor
ExclusiveArch: %{rust_arches}
- rust-termion
ExclusiveArch: %{rust_arches}
- rust-termios
ExclusiveArch: %{rust_arches}
- rust-test-assembler
ExclusiveArch: %{rust_arches}
- rust-textwrap
ExclusiveArch: %{rust_arches}
- rust-thread-id
ExclusiveArch: %{rust_arches}
- rust-thread-scoped
ExclusiveArch: %{rust_arches}
- rust-thread_local
ExclusiveArch: %{rust_arches}
- rust-threadpool
ExclusiveArch: %{rust_arches}
- rust-time
ExclusiveArch: %{rust_arches}
- rust-timerfd
ExclusiveArch: %{rust_arches}
- rust-tokei
ExclusiveArch: %{rust_arches}
- rust-tokio
ExclusiveArch: %{rust_arches}
- rust-tokio-codec
ExclusiveArch: %{rust_arches}
- rust-tokio-core
ExclusiveArch: %{rust_arches}
- rust-tokio-current-thread
ExclusiveArch: %{rust_arches}
- rust-tokio-executor
ExclusiveArch: %{rust_arches}
- rust-tokio-fs
ExclusiveArch: %{rust_arches}
- rust-tokio-io
ExclusiveArch: %{rust_arches}
- rust-tokio-mock-task
ExclusiveArch: %{rust_arches}
- rust-tokio-mockstream
ExclusiveArch: %{rust_arches}
- rust-tokio-process
ExclusiveArch: %{rust_arches}
- rust-tokio-reactor
ExclusiveArch: %{rust_arches}
- rust-tokio-service
ExclusiveArch: %{rust_arches}
- rust-tokio-signal
ExclusiveArch: %{rust_arches}
- rust-tokio-tcp
ExclusiveArch: %{rust_arches}
- rust-tokio-threadpool
ExclusiveArch: %{rust_arches}
- rust-tokio-timer
ExclusiveArch: %{rust_arches}
- rust-tokio-udp
ExclusiveArch: %{rust_arches}
- rust-tokio-uds
ExclusiveArch: %{rust_arches}
- rust-toml
ExclusiveArch: %{rust_arches}
- rust-traitobject
ExclusiveArch: %{rust_arches}
- rust-try-lock
ExclusiveArch: %{rust_arches}
- rust-typeable
ExclusiveArch: %{rust_arches}
- rust-typed-arena
ExclusiveArch: %{rust_arches}
- rust-typenum
ExclusiveArch: %{rust_arches}
- rust-ucd-trie
ExclusiveArch: %{rust_arches}
- rust-ucd-util
ExclusiveArch: %{rust_arches}
- rust-unicase
ExclusiveArch: %{rust_arches}
- rust-unicase1
ExclusiveArch: %{rust_arches}
- rust-unicode-bidi
ExclusiveArch: %{rust_arches}
- rust-unicode-normalization
ExclusiveArch: %{rust_arches}
- rust-unicode-segmentation
ExclusiveArch: %{rust_arches}
- rust-unicode-width
ExclusiveArch: %{rust_arches}
- rust-unicode-xid
ExclusiveArch: %{rust_arches}
- rust-unindent
ExclusiveArch: %{rust_arches}
- rust-unix_socket
ExclusiveArch: %{rust_arches}
- rust-unreachable
ExclusiveArch: %{rust_arches}
- rust-unsafe-any
ExclusiveArch: %{rust_arches}
- rust-untrusted
ExclusiveArch: %{rust_arches}
- rust-url
ExclusiveArch: %{rust_arches}
- rust-users
ExclusiveArch: %{rust_arches}
- rust-utf-8
ExclusiveArch: %{rust_arches}
- rust-utf8-ranges
ExclusiveArch: %{rust_arches}
- rust-uuid
ExclusiveArch: %{rust_arches}
- rust-varlink
ExclusiveArch: %{rust_arches}
- rust-varlink-cli
ExclusiveArch: %{rust_arches}
- rust-varlink_generator
ExclusiveArch: %{rust_arches}
- rust-varlink_parser
ExclusiveArch: %{rust_arches}
- rust-varlink_stdinterfaces
ExclusiveArch: %{rust_arches}
- rust-vec_map
ExclusiveArch: %{rust_arches}
- rust-version-sync
ExclusiveArch: %{rust_arches}
- rust-version_check
ExclusiveArch: %{rust_arches}
- rust-void
ExclusiveArch: %{rust_arches}
- rust-wait-timeout
ExclusiveArch: %{rust_arches}
- rust-walkdir
ExclusiveArch: %{rust_arches}
- rust-want
ExclusiveArch: %{rust_arches}
- rust-which
ExclusiveArch: %{rust_arches}
- rust-which1
ExclusiveArch: %{rust_arches}
- rust-xattr
ExclusiveArch: %{rust_arches}
- rust-xdg
ExclusiveArch: %{rust_arches}
- rust-xml-rs
ExclusiveArch: %{rust_arches}
- rust-xz2
ExclusiveArch: %{rust_arches}
- rust-yaml-rust
ExclusiveArch: %{rust_arches}
- rust-yaml-rust0.3
ExclusiveArch: %{rust_arches}
- rust-yubibomb
ExclusiveArch: %{rust_arches}
- rust-yup-oauth2
ExclusiveArch: %{rust_arches}
- rust-zoneinfo_compiled
ExclusiveArch: %{rust_arches}
- rust-zram-generator
ExclusiveArch: %{rust_arches}
- s390utils
ExclusiveArch: s390 s390x
- safetyblanket
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64
- sagemath
ExclusiveArch: aarch64 %{arm} %{ix86} x86_64 ppc sparcv9
- sbcl
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- sbd
ExclusiveArch: i686 x86_64 s390x
- sbsigntools
ExclusiveArch: x86_64 aarch64 %{arm} %{ix86}
- seabios
ExclusiveArch: x86_64
- seamonkey
ExclusiveArch: %{ix86} x86_64
- servicelog
ExclusiveArch: ppc %{power64}
- sgabios
ExclusiveArch: %{ix86} x86_64
- sharpfont
ExclusiveArch: %mono_arches
- sharpziplib
ExclusiveArch: %{mono_arches}
- shim
ExclusiveArch: %{efi}
- shim-unsigned-aarch64
ExclusiveArch: aarch64
- shim-unsigned-x64
ExclusiveArch: x86_64
- sigul
ExclusiveArch: x86_64
- skychart
ExclusiveArch: %{fpc_arches}
- snapd
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- source-to-image
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- sparkleshare
ExclusiveArch: %{mono_arches}
- spicctrl
ExclusiveArch: %{ix86} x86_64
- spice
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- spring
ExclusiveArch: %{ix86} x86_64
- springlobby
ExclusiveArch: %{ix86} x86_64
- startdde
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- statsd
ExclusiveArch: %{nodejs_arches} noarch
- stdx-allocator
ExclusiveArch: %{ldc_arches}
- stratis-cli
ExclusiveArch: %{rust_arches} noarch
- stripesnoop
ExclusiveArch: %{ix86} x86_64
- supermin
ExclusiveArch: x86_64
- swift-lang
ExclusiveArch: x86_64
- sysbench
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- syslinux
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- taglib-sharp
ExclusiveArch: %{mono_arches}
- tarantool
ExclusiveArch: %{ix86} x86_64 armv7hl armv7hnl aarch64
- tboot
ExclusiveArch: %{ix86} x86_64
- tdlib
ExclusiveArch: %{ix86} x86_64
- templates_parser
ExclusiveArch: %GPRbuild_arches
- termy-qt
ExclusiveArch: %{ix86} x86_64
- ternimal
ExclusiveArch: %{rust_arches}
- themonospot-base
ExclusiveArch: %mono_arches
- themonospot-console
ExclusiveArch: %mono_arches
- themonospot-gui-gtk
ExclusiveArch: %mono_arches
- themonospot-plugin-avi
ExclusiveArch: %mono_arches
- themonospot-plugin-mkv
ExclusiveArch: %mono_arches
- thermald
ExclusiveArch: %{ix86} x86_64
- tilix
ExclusiveArch: %{ldc_arches}
- tmux-top
ExclusiveArch: %{go_arches}
- tomboy
ExclusiveArch: %{mono_arches}
- tuned-profiles-nfv-host-bin
ExclusiveArch: %{ix86} x86_64
- uClibc
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
- ucx
ExclusiveArch: aarch64 ppc64le x86_64
- ugene
ExclusiveArch: %{ix86} x86_64
- uglify-js
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- uglify-js1
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- unetbootin
ExclusiveArch: %{ix86} x86_64
- v8
ExclusiveArch: %{ix86} x86_64 %{arm} ppc mipsel mips64el
- v8-314
ExclusiveArch: %{ix86} x86_64 %{arm} mips mipsel ppc ppc64
- valgrind
ExclusiveArch: %{valgrind_arches}
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x armv7hl aarch64
- vboot-utils
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- vdsm
ExclusiveArch: x86_64 %{power64} aarch64
- vim-go
ExclusiveArch: %{?golang_arches}%{!?golang_arches:%{ix86} x86_64 %{arm}}
- virtio-forwarder
ExclusiveArch: x86_64 aarch64 ppc64le %ix86
- virtualbox-guest-additions
ExclusiveArch: i686 x86_64
- virtualplanet
ExclusiveArch: %{fpc_arches}
- vrq
ExclusiveArch: %{ix86} x86_64
- warsow
ExclusiveArch: %{ix86} x86_64 %{arm}
- warsow-data
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{ix86} x86_64 %{arm}
- webkit-sharp
ExclusiveArch: %mono_arches
- webkit2-sharp
ExclusiveArch: %mono_arches
- wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: %{ix86} %{arm}
- winetricks
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- wraplinux
ExclusiveArch: %{ix86} x86_64
- wxMaxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
- x2goclient
ExclusiveArch: x86_64
- x86info
ExclusiveArch: %{ix86} x86_64
- xen
ExclusiveArch: %{ix86} x86_64 armv7hl aarch64
- xorg-x11-drv-armsoc
ExclusiveArch: %{arm} aarch64
- xorg-x11-drv-geode
ExclusiveArch: %{ix86}
- xorg-x11-drv-intel
ExclusiveArch: %{ix86} x86_64 ia64
- xorg-x11-drv-omap
ExclusiveArch: %{arm}
- xorg-x11-drv-openchrome
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-opentegra
ExclusiveArch: %{arm}
- xorg-x11-drv-vesa
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vmware
ExclusiveArch: %{ix86} x86_64 ia64
- xsp
ExclusiveArch: %mono_arches
- ycssmin
ExclusiveArch: %{nodejs_arches} noarch
- zeromq-ada
ExclusiveArch: %{GPRbuild_arches}
- zlib-ada
ExclusiveArch: %{GPRbuild_arches}
5 years, 6 months
Architecture specific change in rpms/golang-github-skratchdot-open-golang.git
by githook-noreply@fedoraproject.org
The package rpms/golang-github-skratchdot-open-golang.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/golang-github-skratchdot-open-gol....
Change:
-%ifarch 0%{?gccgo_arches}
Thanks.
Full change:
============
commit dd0cf041bea6b5c5ebeb75a461f6e2d97729fb2f
Author: Robert-Andr Mauchin <zebob.m(a)gmail.com>
Date: Sat Oct 6 22:59:14 2018 +0200
Bump to commit 75fb7ed4208cf72d323d7d02fd1a5964a7a9073c
Update to new Go packaging
diff --git a/.gitignore b/.gitignore
index 2783f0f..125d681 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
/open-golang-ba570a1.tar.gz
+/open-golang-75fb7ed4208cf72d323d7d02fd1a5964a7a9073c.tar.gz
diff --git a/golang-github-skratchdot-open-golang.spec b/golang-github-skratchdot-open-golang.spec
index bc89835..c4f66f5 100644
--- a/golang-github-skratchdot-open-golang.spec
+++ b/golang-github-skratchdot-open-golang.spec
@@ -1,173 +1,55 @@
-%if 0%{?fedora} || 0%{?rhel} == 6
-%global with_devel 1
-%global with_bundled 0
-%global with_debug 0
-# test wants firefox => unnecesary dependency
-%global with_check 0
-%global with_unit_test 1
-%else
-%global with_devel 0
-%global with_bundled 0
-%global with_debug 0
-%global with_check 0
-%global with_unit_test 0
-%endif
-
-%if 0%{?with_debug}
-%global _dwz_low_mem_die_limit 0
-%else
-%global debug_package %{nil}
-%endif
-
-%define copying() \
-%if 0%{?fedora} >= 21 || 0%{?rhel} >= 7 \
-%license %{*} \
-%else \
-%doc %{*} \
-%endif
-
-%global provider github
-%global provider_tld com
-%global project skratchdot
-%global repo open-golang
# https://github.com/skratchdot/open-golang
-%global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo}
-%global import_path %{provider_prefix}
-%global commit ba570a111973b539baf23c918213059543b5bb6e
-%global shortcommit %(c=%{commit}; echo ${c:0:7})
+%global goipath github.com/skratchdot/open-golang
+%global commit 75fb7ed4208cf72d323d7d02fd1a5964a7a9073c
-Name: golang-%{provider}-%{project}-%{repo}
+%gometa
+
+Name: golang-github-skratchdot-open-golang
Version: 0
-Release: 0.12.git%{shortcommit}%{?dist}
+Release: 0.13%{?dist}
Summary: Open a file, directory, or URI using the OS's default application
License: MIT
-URL: https://%{provider_prefix}
-Source0: https://%{provider_prefix}/archive/%{commit}/%{repo}-%{shortcommit}.tar.gz
-
-# If go_arches not defined fall through to implicit golang archs
-%if 0%{?go_arches:1}
-ExclusiveArch: %{go_arches}
-%else
-ExclusiveArch: %{ix86} x86_64 %{arm}
-%endif
-# If gccgo_arches does not fit or is not defined fall through to golang
-%ifarch 0%{?gccgo_arches}
-BuildRequires: gcc-go >= %{gccgo_min_vers}
-%else
-BuildRequires: golang
-%endif
+URL: %{gourl}
+Source0: %{gosource}
%description
%{summary}
-%if 0%{?with_devel}
+
%package devel
Summary: %{summary}
BuildArch: noarch
-%if 0%{?with_check}
-%endif
-
-Provides: golang(%{import_path}/open) = %{version}-%{release}
-
%description devel
%{summary}
This package contains library source intended for
building other packages which use import path with
-%{import_path} prefix.
-%endif
-
-%if 0%{?with_unit_test}
-%package unit-test
-Summary: Unit tests for %{name} package
-# If go_arches not defined fall through to implicit golang archs
-%if 0%{?go_arches:1}
-ExclusiveArch: %{go_arches}
-%else
-ExclusiveArch: %{ix86} x86_64 %{arm}
-%endif
-# If gccgo_arches does not fit or is not defined fall through to golang
-%ifarch 0%{?gccgo_arches}
-BuildRequires: gcc-go >= %{gccgo_min_vers}
-%else
-BuildRequires: golang
-%endif
-
-%if 0%{?with_check}
-#Here comes all BuildRequires: PACKAGE the unit tests
-#in %%check section need for running
-%endif
-
-# test subpackage tests code from devel subpackage
-Requires: %{name}-devel = %{version}-%{release}
-
-%description unit-test
-%{summary}
-
-This package contains unit tests for project
-providing packages with %{import_path} prefix.
-%endif
+%{goipath} prefix.
%prep
-%setup -q -n %{repo}-%{commit}
+%forgeautosetup
-%build
%install
-# source codes for building projects
-%if 0%{?with_devel}
-install -d -p %{buildroot}/%{gopath}/src/%{import_path}/
-# find all *.go but no *_test.go files and generate devel.file-list
-for file in $(find . -iname "*.go" \! -iname "*_test.go") ; do
- install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file)
- cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file
- echo "%%{gopath}/src/%%{import_path}/$file" >> devel.file-list
-done
-%endif
-
-# testing files for this project
-%if 0%{?with_unit_test}
-install -d -p %{buildroot}/%{gopath}/src/%{import_path}/
-# find all *_test.go files and generate unit-test.file-list
-for file in $(find . -iname "*_test.go"); do
- install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file)
- cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file
- echo "%%{gopath}/src/%%{import_path}/$file" >> unit-test.file-list
-done
-%endif
+%goinstall
+
%check
-%if 0%{?with_check} && 0%{?with_unit_test} && 0%{?with_devel}
-%ifarch 0%{?gccgo_arches}
-function gotest { %{gcc_go_test} "$@"; }
-%else
-%if 0%{?golang_test:1}
-function gotest { %{golang_test} "$@"; }
-%else
-function gotest { go test "$@"; }
-%endif
-%endif
-
-export GOPATH=%{buildroot}/%{gopath}:%{gopath}
-gotest %{import_path}/open
-%endif
-
-%if 0%{?with_devel}
+# Tests depend on Firefox
+# %%gochecks
+
+
%files devel -f devel.file-list
-%copying LICENSE-MIT
%doc README.md
-%dir %{gopath}/src/%{provider}.%{provider_tld}/%{project}
-%dir %{gopath}/src/%{import_path}
-%endif
+%license LICENSE-MIT
-%if 0%{?with_unit_test}
-%files unit-test -f unit-test.file-list
-%copying LICENSE-MIT
-%doc README.md
-%endif
%changelog
+* Sat Oct 06 2018 Robert-Andr Mauchin <zebob.m(a)gmail.com> - 0-0.13.20181006git75fb7ed
+- Bump to commit 75fb7ed4208cf72d323d7d02fd1a5964a7a9073c
+- Update to new Go packaging
+
* Fri Jul 13 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 0-0.12.gitba570a1
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
diff --git a/sources b/sources
index 4899740..4b80e07 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-021122ad02624d7f59234c100342028f open-golang-ba570a1.tar.gz
+SHA512 (open-golang-75fb7ed4208cf72d323d7d02fd1a5964a7a9073c.tar.gz) = c9255b599d6f743c00bb0acd7f6b3c3078c34b2dfb1c30dc2f8a4e4f4c466efb2115749d0b0ab8595c925efc8e67f9e769ab6183d1676743f279289e8c5b3744
5 years, 6 months
Architecture specific change in rpms/golang-github-skratchdot-open-golang.git
by githook-noreply@fedoraproject.org
The package rpms/golang-github-skratchdot-open-golang.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/golang-github-skratchdot-open-gol....
Change:
-%ifarch 0%{?gccgo_arches}
Thanks.
Full change:
============
commit 73d25d4de36590efa041b5a351cd93a265033bc5
Author: Robert-Andr Mauchin <zebob.m(a)gmail.com>
Date: Sat Oct 6 22:59:14 2018 +0200
Bump to commit 75fb7ed4208cf72d323d7d02fd1a5964a7a9073c
Update to new Go packaging
diff --git a/.gitignore b/.gitignore
index 2783f0f..125d681 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
/open-golang-ba570a1.tar.gz
+/open-golang-75fb7ed4208cf72d323d7d02fd1a5964a7a9073c.tar.gz
diff --git a/golang-github-skratchdot-open-golang.spec b/golang-github-skratchdot-open-golang.spec
index bc89835..c4f66f5 100644
--- a/golang-github-skratchdot-open-golang.spec
+++ b/golang-github-skratchdot-open-golang.spec
@@ -1,173 +1,55 @@
-%if 0%{?fedora} || 0%{?rhel} == 6
-%global with_devel 1
-%global with_bundled 0
-%global with_debug 0
-# test wants firefox => unnecesary dependency
-%global with_check 0
-%global with_unit_test 1
-%else
-%global with_devel 0
-%global with_bundled 0
-%global with_debug 0
-%global with_check 0
-%global with_unit_test 0
-%endif
-
-%if 0%{?with_debug}
-%global _dwz_low_mem_die_limit 0
-%else
-%global debug_package %{nil}
-%endif
-
-%define copying() \
-%if 0%{?fedora} >= 21 || 0%{?rhel} >= 7 \
-%license %{*} \
-%else \
-%doc %{*} \
-%endif
-
-%global provider github
-%global provider_tld com
-%global project skratchdot
-%global repo open-golang
# https://github.com/skratchdot/open-golang
-%global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo}
-%global import_path %{provider_prefix}
-%global commit ba570a111973b539baf23c918213059543b5bb6e
-%global shortcommit %(c=%{commit}; echo ${c:0:7})
+%global goipath github.com/skratchdot/open-golang
+%global commit 75fb7ed4208cf72d323d7d02fd1a5964a7a9073c
-Name: golang-%{provider}-%{project}-%{repo}
+%gometa
+
+Name: golang-github-skratchdot-open-golang
Version: 0
-Release: 0.12.git%{shortcommit}%{?dist}
+Release: 0.13%{?dist}
Summary: Open a file, directory, or URI using the OS's default application
License: MIT
-URL: https://%{provider_prefix}
-Source0: https://%{provider_prefix}/archive/%{commit}/%{repo}-%{shortcommit}.tar.gz
-
-# If go_arches not defined fall through to implicit golang archs
-%if 0%{?go_arches:1}
-ExclusiveArch: %{go_arches}
-%else
-ExclusiveArch: %{ix86} x86_64 %{arm}
-%endif
-# If gccgo_arches does not fit or is not defined fall through to golang
-%ifarch 0%{?gccgo_arches}
-BuildRequires: gcc-go >= %{gccgo_min_vers}
-%else
-BuildRequires: golang
-%endif
+URL: %{gourl}
+Source0: %{gosource}
%description
%{summary}
-%if 0%{?with_devel}
+
%package devel
Summary: %{summary}
BuildArch: noarch
-%if 0%{?with_check}
-%endif
-
-Provides: golang(%{import_path}/open) = %{version}-%{release}
-
%description devel
%{summary}
This package contains library source intended for
building other packages which use import path with
-%{import_path} prefix.
-%endif
-
-%if 0%{?with_unit_test}
-%package unit-test
-Summary: Unit tests for %{name} package
-# If go_arches not defined fall through to implicit golang archs
-%if 0%{?go_arches:1}
-ExclusiveArch: %{go_arches}
-%else
-ExclusiveArch: %{ix86} x86_64 %{arm}
-%endif
-# If gccgo_arches does not fit or is not defined fall through to golang
-%ifarch 0%{?gccgo_arches}
-BuildRequires: gcc-go >= %{gccgo_min_vers}
-%else
-BuildRequires: golang
-%endif
-
-%if 0%{?with_check}
-#Here comes all BuildRequires: PACKAGE the unit tests
-#in %%check section need for running
-%endif
-
-# test subpackage tests code from devel subpackage
-Requires: %{name}-devel = %{version}-%{release}
-
-%description unit-test
-%{summary}
-
-This package contains unit tests for project
-providing packages with %{import_path} prefix.
-%endif
+%{goipath} prefix.
%prep
-%setup -q -n %{repo}-%{commit}
+%forgeautosetup
-%build
%install
-# source codes for building projects
-%if 0%{?with_devel}
-install -d -p %{buildroot}/%{gopath}/src/%{import_path}/
-# find all *.go but no *_test.go files and generate devel.file-list
-for file in $(find . -iname "*.go" \! -iname "*_test.go") ; do
- install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file)
- cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file
- echo "%%{gopath}/src/%%{import_path}/$file" >> devel.file-list
-done
-%endif
-
-# testing files for this project
-%if 0%{?with_unit_test}
-install -d -p %{buildroot}/%{gopath}/src/%{import_path}/
-# find all *_test.go files and generate unit-test.file-list
-for file in $(find . -iname "*_test.go"); do
- install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file)
- cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file
- echo "%%{gopath}/src/%%{import_path}/$file" >> unit-test.file-list
-done
-%endif
+%goinstall
+
%check
-%if 0%{?with_check} && 0%{?with_unit_test} && 0%{?with_devel}
-%ifarch 0%{?gccgo_arches}
-function gotest { %{gcc_go_test} "$@"; }
-%else
-%if 0%{?golang_test:1}
-function gotest { %{golang_test} "$@"; }
-%else
-function gotest { go test "$@"; }
-%endif
-%endif
-
-export GOPATH=%{buildroot}/%{gopath}:%{gopath}
-gotest %{import_path}/open
-%endif
-
-%if 0%{?with_devel}
+# Tests depend on Firefox
+# %%gochecks
+
+
%files devel -f devel.file-list
-%copying LICENSE-MIT
%doc README.md
-%dir %{gopath}/src/%{provider}.%{provider_tld}/%{project}
-%dir %{gopath}/src/%{import_path}
-%endif
+%license LICENSE-MIT
-%if 0%{?with_unit_test}
-%files unit-test -f unit-test.file-list
-%copying LICENSE-MIT
-%doc README.md
-%endif
%changelog
+* Sat Oct 06 2018 Robert-Andr Mauchin <zebob.m(a)gmail.com> - 0-0.13.20181006git75fb7ed
+- Bump to commit 75fb7ed4208cf72d323d7d02fd1a5964a7a9073c
+- Update to new Go packaging
+
* Fri Jul 13 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 0-0.12.gitba570a1
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
diff --git a/sources b/sources
index 4899740..4b80e07 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-021122ad02624d7f59234c100342028f open-golang-ba570a1.tar.gz
+SHA512 (open-golang-75fb7ed4208cf72d323d7d02fd1a5964a7a9073c.tar.gz) = c9255b599d6f743c00bb0acd7f6b3c3078c34b2dfb1c30dc2f8a4e4f4c466efb2115749d0b0ab8595c925efc8e67f9e769ab6183d1676743f279289e8c5b3744
5 years, 6 months
Architecture specific change in rpms/libxcrypt.git
by githook-noreply@fedoraproject.org
The package rpms/libxcrypt.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/libxcrypt.git/commit/?id=56fc361c....
Change:
+%ifnarch %{power64}
Thanks.
Full change:
============
commit de4a76fef760e86a036f510ae412bfa477cb7f24
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Thu Oct 25 16:40:55 2018 +0200
Use bootstrap script
diff --git a/libxcrypt.spec b/libxcrypt.spec
index 43a9a12..dbd40e0 100644
--- a/libxcrypt.spec
+++ b/libxcrypt.spec
@@ -216,7 +216,7 @@ discouraged.
%prep
%autosetup -p 1
-%{_bindir}/autoreconf -fiv
+./bootstrap
%{__mkdir_p} %{_vpath_builddir}{,-compat}
@@ -338,6 +338,7 @@ done
* Thu Oct 25 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-2
- Add patch updating to recent development version
- Run valgrind-memcheck
+- Use bootstrap script
* Thu Oct 18 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-1
- New upstream release
commit 56fc361c2d2d33ff6acdfa408af543367ae39954
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Thu Oct 25 16:34:44 2018 +0200
Run valgrind-memcheck
diff --git a/libxcrypt.spec b/libxcrypt.spec
index 10749a5..43a9a12 100644
--- a/libxcrypt.spec
+++ b/libxcrypt.spec
@@ -6,6 +6,15 @@
#endif
+# Run memcheck?
+# Valgrind does not work well on %%{power64} arches.
+%ifnarch %{power64}
+%bcond_without memcheck
+%else
+%bcond_with memcheck
+%endif
+
+
# Shared object version of libcrypt.
%if %{with new_api}
%global soc 2
@@ -48,6 +57,11 @@
--enable-shared \\\
--enable-static \\\
--disable-failure-tokens \\\
+%if %{with memcheck} \
+ --enable-valgrind \\\
+%else \
+ --disable-valgrind \\\
+%endif \
--srcdir=.. \\\
--with-pkgconfigdir=%{_libdir}/pkgconfig
@@ -89,6 +103,9 @@ Patch0001: %{url}/compare/v%{version}...develop.patch#/%{name}-%{version}-t
BuildRequires: fipscheck
BuildRequires: libtool
+%if %{with memcheck}
+BuildRequires: valgrind
+%endif
# We do not need to keep this forever.
%if %{without new_api} && (0%{?fedora} && 0%{?fedora} <= 31) || (0%{?rhel} && 0%{?rhel} <= 10)
@@ -260,6 +277,16 @@ for dir in %{_vpath_builddir}; do
echo "-----END TESTLOG: ${dir}-----";
exit $rc;
}
+%if %{with memcheck}
+ %make_build -C ${dir} check-valgrind-memcheck || \
+ {
+ rc=$?;
+ echo "-----BEGIN TESTLOG: ${dir}-----";
+ %{__cat} ${dir}/test-suite-memcheck.log;
+ echo "-----END TESTLOG: ${dir}-----";
+ exit $rc;
+ }
+%endif
done
@@ -310,6 +337,7 @@ done
%changelog
* Thu Oct 25 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-2
- Add patch updating to recent development version
+- Run valgrind-memcheck
* Thu Oct 18 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-1
- New upstream release
commit ea4ffe97b18e8cb8857b3398861b6eb4948236c8
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Thu Oct 25 16:28:21 2018 +0200
Add patch updating to recent development version
diff --git a/libxcrypt-4.2.2-to_develop.patch b/libxcrypt-4.2.2-to_develop.patch
new file mode 100644
index 0000000..d42e74c
--- /dev/null
+++ b/libxcrypt-4.2.2-to_develop.patch
@@ -0,0 +1,3945 @@
+From 9bae80381beabc1b08b0fd89d2a4e6e15e3e5da0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 18 Oct 2018 21:24:10 +0200
+Subject: [PATCH 01/17] Bump tarball version to 4.2.3 and update NEWS.
+
+---
+ NEWS | 2 ++
+ configure.ac | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/NEWS b/NEWS
+index 5b2795e..ef7c244 100644
+--- a/NEWS
++++ b/NEWS
+@@ -3,6 +3,8 @@ libxcrypt NEWS -- history of user-visible changes.
+ Please send bug reports, questions and suggestions to
+ <https://github.com/besser82/libxcrypt/issues>.
+
++Version 4.2.3
++
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+
+diff --git a/configure.ac b/configure.ac
+index efbd2e7..3ba313c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1,7 +1,7 @@
+ # Process this file with autoconf to produce a configure script.
+ m4_include([m4/zw_automodern.m4])
+ AC_INIT([xcrypt],
+- [4.2.2],
++ [4.2.3],
+ [https://github.com/besser82/libxcrypt/issues],
+ [libxcrypt],
+ [https://github.com/besser82/libxcrypt])
+
+From ed11116c6e4b5b80ef8f6f57fe8db4aa3604a53b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 18 Oct 2018 22:23:19 +0200
+Subject: [PATCH 02/17] Add bootstrap script.
+
+---
+ .travis.yml | 6 +++---
+ NEWS | 1 +
+ bootstrap | 33 +++++++++++++++++++++++++++++++++
+ 3 files changed, 37 insertions(+), 3 deletions(-)
+ create mode 100755 bootstrap
+
+diff --git a/.travis.yml b/.travis.yml
+index 78a3f0a..acb186c 100644
+--- a/.travis.yml
++++ b/.travis.yml
+@@ -181,9 +181,9 @@ before_install:
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y upgrade && i= && break || sleep 1; done; [ -z "$i" ]'
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y swap coreutils-single coreutils && i= && break || sleep 1; done; [ -z "$i" ]'
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y groups install buildsys-build && i= && break || sleep 1; done; [ -z "$i" ]'
+- - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install libtool valgrind && i= && break || sleep 1; done; [ -z "$i" ]'
++ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install git libtool valgrind && i= && break || sleep 1; done; [ -z "$i" ]'
+ - if [[ "$CC" == "clang" ]] ; then docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install clang && i= && break || sleep 1; done; [ -z "$i" ]' ; fi
+- - if [[ "$CODECOV" == "1" ]] ; then docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install git lcov python3-pip && i= && break || sleep 1; done; [ -z "$i" ]' ; fi
++ - if [[ "$CODECOV" == "1" ]] ; then docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install lcov python3-pip && i= && break || sleep 1; done; [ -z "$i" ]' ; fi
+ - if [[ "$CODECOV" == "1" ]] ; then docker exec -t buildenv /bin/sh -c "pip3 install codecov" ; fi
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y autoremove && i= && break || sleep 1; done; [ -z "$i" ]'
+
+@@ -201,7 +201,7 @@ script:
+ - export NPROCS="$((`nproc --all` * 2))" ; echo paralleism is $NPROCS
+ - if [[ "$CODECOV" == "1" ]] ; then export CFLAGS="-O0 -g --coverage" ; export CXXFLAGS="$CFLAGS" ; export LDFLAGS="--coverage" ; fi
+ - docker exec -t buildenv /bin/sh -c "cat /etc/redhat-release"
+- - docker exec -t buildenv /bin/sh -c "cd /opt/libxcrypt && autoreconf -fiv -Wall -Werror"
++ - docker exec -t buildenv /bin/sh -c "cd /opt/libxcrypt && ./bootstrap"
+ - docker exec -t buildenv /bin/sh -c "cd /opt/libxcrypt && CFLAGS=\"$CFLAGS\" CXXFLAGS=\"$CXXFLAGS\" LDFLAGS=\"$LDFLAGS\" ./configure --prefix=/opt/libxcrypt --disable-silent-rules --enable-shared --enable-static $CONF"
+ - docker exec -t buildenv /bin/sh -c "make -C /opt/libxcrypt -j$NPROCS"
+ - docker exec -t buildenv /bin/sh -c "make -C /opt/libxcrypt install"
+diff --git a/NEWS b/NEWS
+index ef7c244..7847c86 100644
+--- a/NEWS
++++ b/NEWS
+@@ -4,6 +4,7 @@ Please send bug reports, questions and suggestions to
+ <https://github.com/besser82/libxcrypt/issues>.
+
+ Version 4.2.3
++* Add bootstrap script.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/bootstrap b/bootstrap
+new file mode 100755
+index 0000000..af6433a
+--- /dev/null
++++ b/bootstrap
+@@ -0,0 +1,33 @@
++#!/bin/sh
++#
++# Copyright (C) 2018 Bjrn Esser <besser82(a)fedoraproject.org>
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted.
++#
++# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++# SUCH DAMAGE.
++
++set -efu
++LANG=C
++
++run_cmd()
++{
++ echo "bootstrap: running: $@"
++ "$@"
++}
++
++if [ -d .git ]; then
++ run_cmd git clean -dfX
++fi
++
++run_cmd autoreconf -iv -Wall,error
+
+From a19bb7e1ae3e954b8852f50fd70ca496839989b5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Fri, 19 Oct 2018 00:01:16 +0200
+Subject: [PATCH 03/17] Recommend the bootstrap script over autoreconf.
+
+---
+ NEWS | 3 ++-
+ README.md | 2 +-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/NEWS b/NEWS
+index 7847c86..c55a971 100644
+--- a/NEWS
++++ b/NEWS
+@@ -4,7 +4,8 @@ Please send bug reports, questions and suggestions to
+ <https://github.com/besser82/libxcrypt/issues>.
+
+ Version 4.2.3
+-* Add bootstrap script.
++* Add bootstrap script. If building from a Git checkout instead of a
++ tarball release, use './bootstrap' to create the configure script.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/README.md b/README.md
+index a32b1b1..102127a 100644
+--- a/README.md
++++ b/README.md
+@@ -62,7 +62,7 @@ these things before building the software.
+
+ Building from a Git checkout additionally requires the Autotools
+ suite: `autoconf`, `automake`, `libtool`, and `pkg-config`.
+-Run `autoreconf -i` at the top level of the source tree, and then
++Run `./bootstrap` at the top level of the source tree, and then
+ follow the instructions in `INSTALL` (which is created by that command).
+
+ The oldest versions of Autotools components that are known to work
+
+From 4bb73c595925a4603393ff25751ada66921919d9 Mon Sep 17 00:00:00 2001
+From: Zack Weinberg <zackw(a)panix.com>
+Date: Sat, 20 Oct 2018 12:36:02 -0400
+Subject: [PATCH 04/17] Revise the to-do list.
+
+---
+ TODO | 57 +----------------------------
+ TODO.md | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 110 insertions(+), 56 deletions(-)
+ mode change 100644 => 120000 TODO
+ create mode 100644 TODO.md
+
+diff --git a/TODO b/TODO
+deleted file mode 100644
+index 66db86b..0000000
+--- a/TODO
++++ /dev/null
+@@ -1,56 +0,0 @@
+-to-do list for libxcrypt
+-------------------------
+-
+-* Near future:
+- * Update all of the default cost parameters
+- * relevant benchmarking at
+- <https://pthree.org/2016/06/28/lets-talk-password-hashing/>
+- * the default used by `crypt_gensalt_*` for new hashes should be
+- controllable independently from the default used if there is no
+- rounds= annotation in a setting string
+- * Make the crypt and crypt_gensalt static state thread-specific?
+- * if allocated on first use, this would also shave 32kB of
+- data segment off the shared library
+- * Factor out all of the repetitive base64 code
+- * get rid of the de/serialization code in crypt-bcrypt.c that
+- still does dodgy things with type punning
+- * Attempt to determine the copyright holders and intended licensing
+- of the test suite
+- * Moar tests
+- * Make sure the symbol versioning macros work with all of the compilers
+- that anyone needs (they use GCC extensions that clang also supports).
+-
+-* Longer term:
+- * Hash algorithms newer than bcrypt tend to want to allocate and
+- scribble all over a large (tens of megabytes at a minimum) block
+- of memory, to make brute force hard in a way that GPUs and ASICs
+- can't easily accelerate. The existing API cannot handle this for
+- three reasons:
+- * `crypt_gensalt` only takes a single cost parameter, some
+- algorithms have several
+- * With everything except `crypt_ra`, all of the memory is
+- allocated by the caller and there's no way for algorithms to say
+- how much they need
+- * There is no destructor function, even with `crypt_ra` - callers
+- just pass the block to `free`
+-
+- So we need to invent a new API that allows for more variety in
+- cost parameters and allocations. It could also make the "all the
+- sensitive data, including stack scratch, is in crypt_data which we
+- auto-erase" feature more robust by adding guard bands and calling
+- mlock().
+-
+- * Additional hashes to investigate adding:
+- * scrypt <https://www.tarsnap.com/scrypt.html>
+- * Argon2 <https://password-hashing.net/>
+- * ...?
+-
+- * Support for "pepper" (an additional piece of information, _not_
+- stored in the password file, that you need to check a password)
+-
+- * Reading passphrases from the terminal is finicky and there are
+- several competing, poorly portable, questionably sound library
+- functions to do it (`getpass`, `readpassphrase`, etc) -- should we
+- incorporate one?
+- * If we do, should it know how to trigger the trusted-path
+- password prompt in modern GUI environments? (probably)
+diff --git a/TODO b/TODO
+new file mode 120000
+index 0000000..cde952b
+--- /dev/null
++++ b/TODO
+@@ -0,0 +1 @@
++TODO.md
+\ No newline at end of file
+diff --git a/TODO.md b/TODO.md
+new file mode 100644
+index 0000000..30c0372
+--- /dev/null
++++ b/TODO.md
+@@ -0,0 +1,109 @@
++to-do list for libxcrypt
++------------------------
++
++This list is categorized but not in any kind of priority order.
++It was last updated 20 October 2018.
++
++* Code cleanliness
++ * Find and remove any code that still does dodgy things with type punning
++ * Factor out all of the repetitive base64 code
++ * Factor out the multiple implementations of HMAC and PBKDF
++
++* Testsuite improvements
++ * Line coverage is inadequate for `alg-yescrypt-common.c` and
++ `alg-yescrypt-opt.c`
++ * Investigate branch coverage
++ * Do some API fuzz testing and add missing cases to the testsuite
++ * Many of the `test-crypt-*.c` files repeat more or less the same
++ code with different data, consider merging them
++
++* Portability
++ * Make sure the symbol versioning macros work with all of the
++ compilers that anyone needs (they use GCC extensions that clang
++ also supports).
++ * `alg-yescrypt-common.c` contains #ifdeffage for use of
++ `posix_memalign` that isnt wired up to autoconf
++ * possibly this should just be removed; does anything have
++ `posix_memalign` but not `mmap`? its only a compile-time
++ fallback, not a runtime fallback
++
++* Hardening
++ * bcrypt-like selftest/memory scribble for all hashing methods
++ * how do we know the memory scribble is doing its job?
++ * build out of the box with compiler hardening features turned on
++ * something bespoke for not having to write serialization and
++ deserialization logic for hash strings by hand, as this is
++ probably the most error-prone part of writing a hashing method
++
++ * the most sensitive piece of data handled by this library is a
++ cleartext passphrase. OS may have trusted-path facilities for
++ prompting the user for a passphrase and feeding it to a KDF
++ without its ever being accessible in normal memory. investigate
++ whether we can use these.
++
++* Additional hashing methods
++ * Argon2 <https://password-hashing.net/>
++ * ...?
++
++* Runtime configurability (in progress on the [crypt.conf branch][])
++ * allow installations to enable or disable specific hash methods
++ without rebuilding the library
++ * make the default cost parameter used by `crypt_gensalt_*` for new
++ hashes configurable
++ * update the compiled-in defaults used by `crypt_gensalt_*` (not the
++ defaults used when no explicit cost parameter is present in a
++ hash; those cant be changed without breaking existing stored hashes)
++ * relevant benchmarking at
++ <https://pthree.org/2016/06/28/lets-talk-password-hashing/>
++ * offer a way to tune cost parameters for a specific installation
++ * N.B. Solaris 11 has all of these features but our implementation will
++ probably not match them (they have a `crypt.conf` but its not the
++ same, and their `crypt_gensalt` is API-incompatible anyway).
++
++[crypt.conf branch]: https://github.com/besser82/libxcrypt/tree/zack/crypt.conf
++
++* Potential API enhancements:
++
++ * Support for "pepper" (an additional piece of information, _not_
++ stored in the password file, that you need to check a password)
++
++ * Reading passphrases from the terminal is finicky and there are
++ several competing, poorly portable, questionably sound library
++ functions to do it (`getpass`, `readpassphrase`, etc) -- should we
++ incorporate one?
++ * If we do, should it know how to trigger the trusted-path
++ password prompt in modern GUI environments? (probably)
++
++ * Make the crypt and crypt_gensalt static state thread-specific?
++ * Solaris 11 may have done this (its `crypt(3)` manpage describes
++ it as MT-Safe and I dont see any other way they could have
++ accomplished that).
++ * if allocated on first use, this would also shave 32kB of
++ data segment off the shared library
++ * alternatively, add a global lock and *crash the program* if we
++ detect concurrent calls
++
++ * Allow access to more of yescrypts tunable parameters and ROM
++ feature, in a way thats generic enough that we could also use it
++ for e.g. Argon2s tunable parameters
++
++ * Other yescrypt-inspired features relevant to using this library to
++ back a dedicated authentication service, e.g. preallocation of
++ large blocks of scratch memory
++ * the main obstacles here are that `struct crypt_data` has a fixed
++ size which is either too big or too small depending how you look
++ at it, and no destructor function
++
++* Permissive relicensing, to encourage use beyond the GNU ecosystem?
++ * Replace remaining (L)GPLed crypto primitives (MD5, SHA512) with
++ permissively licensed equivalents (e.g. from Openwall)
++ * Replace crypt-md5.c with original md5crypt from FreeBSD?
++ * Other files subject to the (L)GPL are crypt.c, crypt-static.c,
++ crypt-gensalt-static.c, crypt-obsolete.h, crypt-port.h,
++ crypt-private.h, test-badsalt.c. It is not clear to me how much
++ material originally assigned to the FSF remains in these files.
++ Several of them are API definitions and trivial wrappers that
++ could not be meaningfully changed without breaking them (so are
++ arguably uncopyrightable).
++ * Most of the test suite lacks any license or even authorship
++ information. We would have to track down the original authors.
+
+From 9787b0be83a077c8c1a4e9b460b6b6e3698002d4 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 12:18:25 +0200
+Subject: [PATCH 05/17] Generate included header files before any other target.
+
+If we use a dummy target that depends on targets generating
+commonly used header files and that creates an empty file,
+which is included in the Makefile later, the header files are
+guaranteed to be generated before any other target in the same
+Makefile.
+---
+ .gitignore | 1 +
+ Makefile.am | 16 +++++++++-------
+ 2 files changed, 10 insertions(+), 7 deletions(-)
+
+diff --git a/.gitignore b/.gitignore
+index 1e9e605..e0b13cf 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -1,6 +1,7 @@
+ # http://www.gnu.org/software/automake
+
+ /Makefile
++/Makefile.deps
+ /Makefile.in
+ /.deps/
+ /.libs/
+diff --git a/Makefile.am b/Makefile.am
+index 2cb07ca..acab882 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -71,13 +71,19 @@ libcrypt_la_CPPFLAGS = $(AM_CPPFLAGS) -DIN_LIBCRYPT
+
+ CONFIG_STATUS_DEPENDENCIES = libcrypt.minver
+ EXTRA_libcrypt_la_DEPENDENCIES = libcrypt.map
+-CLEANFILES = libcrypt.map libcrypt.map.T \
++CLEANFILES = Makefile.deps.T Makefile.deps \
++ libcrypt.map libcrypt.map.T \
+ crypt-symbol-vers.h crypt-symbol-vers.h.T \
+ crypt-hashes.h crypt-hashes.h.T \
+ crypt.h crypt.h.T
+
+ DISTCLEANFILES = .deps/*.Plo
+
++# Empty target to have needed headers pre-generated before any other target.
++Makefile.deps: crypt-hashes.h crypt-symbol-vers.h
++ $(AM_V_GEN)LC_ALL=C echo "# Deps" > Makefile.deps.T
++ $(AM_V_at)mv -f Makefile.deps.T Makefile.deps
++
+ libcrypt.map: libcrypt.map.in gen-map.awk Makefile
+ $(AM_V_GEN)LC_ALL=C $(AWK) \
+ -v SYMVER_MIN=$(SYMVER_MIN) \
+@@ -230,12 +236,8 @@ endif
+
+ # Every object file depends on crypt-symbol-vers.h and crypt-hashes.h,
+ # which are generated files, so automatic dependency generation is not
+-# sufficient. Most of the test programs depend on either libcrypt.la
+-# or one of its components, so they do not need an explicit dependency
+-# (after the first *successful* build, automatic dependency generation
+-# will reveal the direct dependency) but a few don't.
+-$(libcrypt_la_OBJECTS): crypt-symbol-vers.h crypt-hashes.h
+-$(test_byteorder_OBJECTS): crypt-symbol-vers.h crypt-hashes.h
++# sufficient.
++include $(builddir)/Makefile.deps
+
+ # Add additional targets
+ .PHONY: $(phony_targets)
+
+From d32b170da3d4b65e9b23bb1c9a50e027ec090c5a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 12:53:13 +0200
+Subject: [PATCH 06/17] Include crypt.h from crypt-port.h.
+
+Since we have a guaranteed way to make sure all generated header
+files are always present before any object file is compiled, we
+can drop crypt-base.h and include the local version of crypt.h
+through crypt-port.h.
+---
+ .gitignore | 2 +-
+ LICENSING | 2 +-
+ Makefile.am | 10 +++++-----
+ configure.ac | 2 +-
+ crypt-gensalt-static.c | 1 -
+ crypt-obsolete.h | 1 -
+ crypt-port.h | 6 ++++--
+ crypt-private.h | 1 -
+ crypt-static.c | 1 -
+ crypt-base.h.in => crypt.h.in.in | 0
+ gen-crypt-h.awk | 2 +-
+ test-crypt-bcrypt.c | 1 -
+ test-crypt-des.c | 1 -
+ test-crypt-md5.c | 1 -
+ test-crypt-nthash.c | 1 -
+ test-crypt-pbkdf1-sha1.c | 1 -
+ test-crypt-scrypt.c | 1 -
+ test-crypt-sha256.c | 1 -
+ test-crypt-sha512.c | 1 -
+ test-crypt-sunmd5.c | 1 -
+ test-crypt-yescrypt.c | 1 -
+ test-des-obsolete.c | 1 -
+ test-des-obsolete_r.c | 1 -
+ test-gensalt.c | 1 -
+ 24 files changed, 13 insertions(+), 28 deletions(-)
+ rename crypt-base.h.in => crypt.h.in.in (100%)
+
+diff --git a/.gitignore b/.gitignore
+index e0b13cf..e46e4c2 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -19,7 +19,7 @@
+ /config.status
+ /m4/config.sub
+ /configure
+-/crypt-base.h
++/crypt.h.in
+ /m4/depcomp
+ /m4/install-sh
+ /libtool
+diff --git a/LICENSING b/LICENSING
+index 17ae41e..bf0c514 100644
+--- a/LICENSING
++++ b/LICENSING
+@@ -12,7 +12,7 @@ source tree. For specific licensing terms consult the files themselves.
+ crypt.c, crypt-static.c, crypt-gensalt-static.c, crypt-port.h
+
+ * Copyright Free Software Foundation, Inc.; LGPL (v2.1 or later):
+- crypt-base.h, crypt-obsolete.h, crypt-private.h
++ crypt.h, crypt-obsolete.h, crypt-private.h
+ alg-md5.h, alg-md5.c, crypt-md5.c,
+ alg-sha512.h, alg-sha512.c,
+ test-crypt-badsalt.c, test-crypt-nonnull.c
+diff --git a/Makefile.am b/Makefile.am
+index acab882..498c48f 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -14,7 +14,7 @@ TEST_EXTENSIONS = .sh
+
+ EXTRA_DIST = \
+ LICENSING THANKS \
+- crypt-base.h.in libcrypt.map.in libcrypt.minver \
++ crypt.h.in.in libcrypt.map.in libcrypt.minver \
+ gen-map.awk gen-vers.awk gen-crypt-h.awk \
+ gen-hashes.awk sel-hashes.awk hashes.lst
+
+@@ -24,7 +24,7 @@ notrans_dist_man3_MANS = \
+ notrans_dist_man5_MANS = crypt.5
+
+ nodist_include_HEADERS = crypt.h
+-nodist_noinst_HEADERS = crypt-hashes.h crypt-base.h
++nodist_noinst_HEADERS = crypt-hashes.h
+ noinst_HEADERS = \
+ alg-des.h alg-hmac-sha1.h alg-md4.h alg-md5.h \
+ alg-sha1.h alg-sha256.h alg-sha512.h \
+@@ -80,7 +80,7 @@ CLEANFILES = Makefile.deps.T Makefile.deps \
+ DISTCLEANFILES = .deps/*.Plo
+
+ # Empty target to have needed headers pre-generated before any other target.
+-Makefile.deps: crypt-hashes.h crypt-symbol-vers.h
++Makefile.deps: crypt.h
+ $(AM_V_GEN)LC_ALL=C echo "# Deps" > Makefile.deps.T
+ $(AM_V_at)mv -f Makefile.deps.T Makefile.deps
+
+@@ -101,9 +101,9 @@ crypt-symbol-vers.h: libcrypt.map.in gen-vers.awk Makefile
+ $(srcdir)/libcrypt.map.in > crypt-symbol-vers.h.T
+ $(AM_V_at)mv -f crypt-symbol-vers.h.T crypt-symbol-vers.h
+
+-crypt.h: crypt-base.h gen-crypt-h.awk config.h
++crypt.h: crypt.h.in crypt-hashes.h crypt-symbol-vers.h gen-crypt-h.awk config.h
+ $(AM_V_GEN)LC_ALL=C $(AWK) \
+- -f $(srcdir)/gen-crypt-h.awk config.h $(builddir)/crypt-base.h \
++ -f $(srcdir)/gen-crypt-h.awk config.h $(builddir)/crypt.h.in \
+ > crypt.h.T
+ $(AM_V_at)mv -f crypt.h.T crypt.h
+
+diff --git a/configure.ac b/configure.ac
+index 3ba313c..5da8aa8 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -11,8 +11,8 @@ AC_CONFIG_SRCDIR([crypt.c])
+ AC_CONFIG_HEADERS([config.h])
+ AC_CONFIG_FILES([
+ Makefile
++ crypt.h.in
+ libxcrypt.pc
+- crypt-base.h
+ ])
+ AM_INIT_AUTOMAKE
+
+diff --git a/crypt-gensalt-static.c b/crypt-gensalt-static.c
+index 14f271e..590ee83 100644
+--- a/crypt-gensalt-static.c
++++ b/crypt-gensalt-static.c
+@@ -15,7 +15,6 @@
+ <https://www.gnu.org/licenses/>. */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ /* The functions that use global state objects are isolated in their
+ own files so that a statically-linked program that doesn't use them
+diff --git a/crypt-obsolete.h b/crypt-obsolete.h
+index d1acdea..4ecd969 100644
+--- a/crypt-obsolete.h
++++ b/crypt-obsolete.h
+@@ -19,7 +19,6 @@
+ #ifndef _CRYPT_OBSOLETE_H
+ #define _CRYPT_OBSOLETE_H 1
+
+-#include "crypt-base.h"
+
+ /* These functions are obsolete and should never be used, but we have to
+ keep providing them for binary backward compatibility. */
+diff --git a/crypt-port.h b/crypt-port.h
+index f139efa..5f4d55f 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -44,8 +44,8 @@
+ #endif
+
+ /* While actually compiling the library, suppress the __nonnull tags
+- on the functions in crypt-base.h, so that internal checks for NULL
+- are not deleted by the compiler. */
++ on the functions in crypt.h, so that internal checks for NULL are
++ not deleted by the compiler. */
+ #undef __nonnull
+ #define __nonnull(param) /* nothing */
+
+@@ -292,4 +292,6 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #define libcperciva_SHA256_Buf _crypt_SHA256_Buf
+ #endif
+
++#include "crypt.h"
++
+ #endif /* crypt-port.h */
+diff --git a/crypt-private.h b/crypt-private.h
+index 5e18030..306879d 100644
+--- a/crypt-private.h
++++ b/crypt-private.h
+@@ -20,7 +20,6 @@
+ #ifndef _CRYPT_PRIVATE_H
+ #define _CRYPT_PRIVATE_H 1
+
+-#include "crypt-base.h"
+
+ /* Utility functions */
+
+diff --git a/crypt-static.c b/crypt-static.c
+index fb9a953..d7598d1 100644
+--- a/crypt-static.c
++++ b/crypt-static.c
+@@ -15,7 +15,6 @@
+ <https://www.gnu.org/licenses/>. */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ /* The functions that use global state objects are isolated in their
+ own files so that a statically-linked program that doesn't use them
+diff --git a/crypt-base.h.in b/crypt.h.in.in
+similarity index 100%
+rename from crypt-base.h.in
+rename to crypt.h.in.in
+diff --git a/gen-crypt-h.awk b/gen-crypt-h.awk
+index 70fc5fa..8b3f4f5 100644
+--- a/gen-crypt-h.awk
++++ b/gen-crypt-h.awk
+@@ -1,4 +1,4 @@
+-# Generation of crypt.h from crypt-base.h and config.h.
++# Generation of crypt.h from crypt.h.in and config.h.
+ #
+ # Written by Zack Weinberg <zackw at panix.com> in 2017.
+ # To the extent possible under law, Zack Weinberg has waived all
+diff --git a/test-crypt-bcrypt.c b/test-crypt-bcrypt.c
+index bf149b4..5cf90c1 100644
+--- a/test-crypt-bcrypt.c
++++ b/test-crypt-bcrypt.c
+@@ -15,7 +15,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <errno.h>
+ #include <stdio.h>
+diff --git a/test-crypt-des.c b/test-crypt-des.c
+index 1b5463e..f01fee7 100644
+--- a/test-crypt-des.c
++++ b/test-crypt-des.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-md5.c b/test-crypt-md5.c
+index 3035c39..d42b529 100644
+--- a/test-crypt-md5.c
++++ b/test-crypt-md5.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #if INCLUDE_md5
+
+diff --git a/test-crypt-nthash.c b/test-crypt-nthash.c
+index 9bf7d28..b344d86 100644
+--- a/test-crypt-nthash.c
++++ b/test-crypt-nthash.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-pbkdf1-sha1.c b/test-crypt-pbkdf1-sha1.c
+index 677e5bf..7a0c826 100644
+--- a/test-crypt-pbkdf1-sha1.c
++++ b/test-crypt-pbkdf1-sha1.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <errno.h>
+ #include <stdio.h>
+diff --git a/test-crypt-scrypt.c b/test-crypt-scrypt.c
+index df64774..0cf8da3 100644
+--- a/test-crypt-scrypt.c
++++ b/test-crypt-scrypt.c
+@@ -18,7 +18,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-sha256.c b/test-crypt-sha256.c
+index 05135ff..9331d14 100644
+--- a/test-crypt-sha256.c
++++ b/test-crypt-sha256.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-sha512.c b/test-crypt-sha512.c
+index bef271b..88c5643 100644
+--- a/test-crypt-sha512.c
++++ b/test-crypt-sha512.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-sunmd5.c b/test-crypt-sunmd5.c
+index d0d85e3..88e8ecf 100644
+--- a/test-crypt-sunmd5.c
++++ b/test-crypt-sunmd5.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+ #include <stdlib.h>
+diff --git a/test-crypt-yescrypt.c b/test-crypt-yescrypt.c
+index da6b694..a635f94 100644
+--- a/test-crypt-yescrypt.c
++++ b/test-crypt-yescrypt.c
+@@ -17,7 +17,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-des-obsolete.c b/test-des-obsolete.c
+index d5e3cc0..4588c75 100644
+--- a/test-des-obsolete.c
++++ b/test-des-obsolete.c
+@@ -7,7 +7,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+ #include "crypt-obsolete.h"
+ #include "test-des-cases.h"
+
+diff --git a/test-des-obsolete_r.c b/test-des-obsolete_r.c
+index d635b2a..9efd0fb 100644
+--- a/test-des-obsolete_r.c
++++ b/test-des-obsolete_r.c
+@@ -7,7 +7,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+ #include "crypt-obsolete.h"
+ #include "test-des-cases.h"
+
+diff --git a/test-gensalt.c b/test-gensalt.c
+index a6d3621..40fe66c 100644
+--- a/test-gensalt.c
++++ b/test-gensalt.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <errno.h>
+ #include <stdio.h>
+
+From a5f8acd51acb267d989ea3375ab17e29a0857059 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 13:06:59 +0200
+Subject: [PATCH 07/17] Add crypt-symbol-vers.h to nodist_noinst_HEADERS.
+
+---
+ Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 498c48f..a09e6a4 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -24,7 +24,7 @@ notrans_dist_man3_MANS = \
+ notrans_dist_man5_MANS = crypt.5
+
+ nodist_include_HEADERS = crypt.h
+-nodist_noinst_HEADERS = crypt-hashes.h
++nodist_noinst_HEADERS = crypt-hashes.h crypt-symbol-vers.h
+ noinst_HEADERS = \
+ alg-des.h alg-hmac-sha1.h alg-md4.h alg-md5.h \
+ alg-sha1.h alg-sha256.h alg-sha512.h \
+
+From 6adbd465a6003cf856e4c9debe0e6049746c685a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 16:11:30 +0200
+Subject: [PATCH 08/17] Add gen-des-tables to noinst_PROGRAMS.
+
+---
+ .gitignore | 1 +
+ Makefile.am | 2 ++
+ 2 files changed, 3 insertions(+)
+
+diff --git a/.gitignore b/.gitignore
+index e46e4c2..8aead50 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -48,6 +48,7 @@
+ /crypt-hashes.h
+ /crypt-symbol-vers.h
+ /libcrypt.map
++/gen-des-tables
+ /test-alg-des
+ /test-alg-hmac-sha1
+ /test-alg-md4
+diff --git a/Makefile.am b/Makefile.am
+index a09e6a4..e7d5c6d 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -31,6 +31,8 @@ noinst_HEADERS = \
+ alg-yescrypt.h alg-yescrypt-sysendian.h byteorder.h \
+ crypt-obsolete.h crypt-private.h crypt-port.h test-des-cases.h
+
++noinst_PROGRAMS = gen-des-tables
++
+ lib_LTLIBRARIES = libcrypt.la
+ libcrypt_la_SOURCES = \
+ alg-des.c alg-des-tables.c alg-hmac-sha1.c alg-md4.c alg-md5.c \
+
+From 323e5e097f643641f41f24969227b073470e186e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 13:08:36 +0200
+Subject: [PATCH 09/17] Use sha512 implementation from Colin Percival.
+
+Thus we now have a sha512 implementation under the BSD license.
+---
+ LICENSING | 4 +-
+ NEWS | 2 +
+ TODO.md | 2 +-
+ alg-sha512.c | 566 +++++++++++++++++++++------------------
+ alg-sha512.h | 121 +++++----
+ alg-yescrypt-sysendian.h | 12 +
+ crypt-port.h | 7 +-
+ crypt-sha512.c | 56 ++--
+ test-alg-sha512.c | 23 +-
+ 9 files changed, 441 insertions(+), 352 deletions(-)
+
+diff --git a/LICENSING b/LICENSING
+index bf0c514..31f704c 100644
+--- a/LICENSING
++++ b/LICENSING
+@@ -14,7 +14,6 @@ source tree. For specific licensing terms consult the files themselves.
+ * Copyright Free Software Foundation, Inc.; LGPL (v2.1 or later):
+ crypt.h, crypt-obsolete.h, crypt-private.h
+ alg-md5.h, alg-md5.c, crypt-md5.c,
+- alg-sha512.h, alg-sha512.c,
+ test-crypt-badsalt.c, test-crypt-nonnull.c
+
+ * Copyright David Burren et al.; 3-clause BSD:
+@@ -34,6 +33,9 @@ source tree. For specific licensing terms consult the files themselves.
+ alg-sha256.c, alg-sha256.h, alg-yescrypt.h, alg-yescrypt-opt.c,
+ alg-yescrypt-sysendian.h
+
++ * Copyright Colin Percival; 2-clause BSD:
++ alg-sha512.h, alg-sha512.c
++
+ * Copyright Alexander Peslyak, Bjrn Esser; 0-clause BSD:
+ crypt-scrypt.c
+
+diff --git a/NEWS b/NEWS
+index c55a971..c4b04da 100644
+--- a/NEWS
++++ b/NEWS
+@@ -6,6 +6,8 @@ Please send bug reports, questions and suggestions to
+ Version 4.2.3
+ * Add bootstrap script. If building from a Git checkout instead of a
+ tarball release, use './bootstrap' to create the configure script.
++* Use sha512 implementation from Colin Percival. Thus we now have a
++ sha512 implementation under the BSD license.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/TODO.md b/TODO.md
+index 30c0372..c4e2799 100644
+--- a/TODO.md
++++ b/TODO.md
+@@ -95,7 +95,7 @@ It was last updated 20 October 2018.
+ at it, and no destructor function
+
+ * Permissive relicensing, to encourage use beyond the GNU ecosystem?
+- * Replace remaining (L)GPLed crypto primitives (MD5, SHA512) with
++ * Replace remaining (L)GPLed crypto primitives (MD5) with
+ permissively licensed equivalents (e.g. from Openwall)
+ * Replace crypt-md5.c with original md5crypt from FreeBSD?
+ * Other files subject to the (L)GPL are crypt.c, crypt-static.c,
+diff --git a/alg-sha512.c b/alg-sha512.c
+index 60c1877..0d24301 100644
+--- a/alg-sha512.c
++++ b/alg-sha512.c
+@@ -1,289 +1,335 @@
+-/* Functions to compute SHA512 message digest of files or memory blocks.
+- according to the definition of SHA512 in FIPS 180-2.
+- Copyright (C) 2007-2017 Free Software Foundation, Inc.
++/*-
++ * Copyright 2005 Colin Percival
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
+
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
++#include "crypt-port.h"
+
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
++#if INCLUDE_sha512
+
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
++#include "alg-sha512.h"
++#include "alg-yescrypt-sysendian.h"
+
+-/* Written by Ulrich Drepper <drepper(a)redhat.com>, 2007. */
++#if IS_BIGENDIAN
++/* Copy a vector of big-endian uint64_t into a vector of bytes */
++#define be64enc_vect(dst, src, len) \
++ memcpy((void *)dst, (const void *)src, (size_t)len)
+
+-#include "crypt-port.h"
+-#include "alg-sha512.h"
+-#include "byteorder.h"
++/* Copy a vector of bytes into a vector of big-endian uint64_t */
++#define be64dec_vect(dst, src, len) \
++ memcpy((void *)dst, (const void *)src, (size_t)len)
+
+-#if INCLUDE_sha512
++#else /* IS_BIGENDIAN */
+
+-/* Constants for SHA512 from FIPS 180-2:4.2.3. */
+-static const uint64_t K[80] =
++/*
++ * Encode a length len/4 vector of (uint64_t) into a length len vector of
++ * (unsigned char) in big-endian form. Assumes len is a multiple of 8.
++ */
++static void
++be64enc_vect(unsigned char *dst, const uint64_t *src, size_t len)
+ {
+- UINT64_C (0x428a2f98d728ae22), UINT64_C (0x7137449123ef65cd),
+- UINT64_C (0xb5c0fbcfec4d3b2f), UINT64_C (0xe9b5dba58189dbbc),
+- UINT64_C (0x3956c25bf348b538), UINT64_C (0x59f111f1b605d019),
+- UINT64_C (0x923f82a4af194f9b), UINT64_C (0xab1c5ed5da6d8118),
+- UINT64_C (0xd807aa98a3030242), UINT64_C (0x12835b0145706fbe),
+- UINT64_C (0x243185be4ee4b28c), UINT64_C (0x550c7dc3d5ffb4e2),
+- UINT64_C (0x72be5d74f27b896f), UINT64_C (0x80deb1fe3b1696b1),
+- UINT64_C (0x9bdc06a725c71235), UINT64_C (0xc19bf174cf692694),
+- UINT64_C (0xe49b69c19ef14ad2), UINT64_C (0xefbe4786384f25e3),
+- UINT64_C (0x0fc19dc68b8cd5b5), UINT64_C (0x240ca1cc77ac9c65),
+- UINT64_C (0x2de92c6f592b0275), UINT64_C (0x4a7484aa6ea6e483),
+- UINT64_C (0x5cb0a9dcbd41fbd4), UINT64_C (0x76f988da831153b5),
+- UINT64_C (0x983e5152ee66dfab), UINT64_C (0xa831c66d2db43210),
+- UINT64_C (0xb00327c898fb213f), UINT64_C (0xbf597fc7beef0ee4),
+- UINT64_C (0xc6e00bf33da88fc2), UINT64_C (0xd5a79147930aa725),
+- UINT64_C (0x06ca6351e003826f), UINT64_C (0x142929670a0e6e70),
+- UINT64_C (0x27b70a8546d22ffc), UINT64_C (0x2e1b21385c26c926),
+- UINT64_C (0x4d2c6dfc5ac42aed), UINT64_C (0x53380d139d95b3df),
+- UINT64_C (0x650a73548baf63de), UINT64_C (0x766a0abb3c77b2a8),
+- UINT64_C (0x81c2c92e47edaee6), UINT64_C (0x92722c851482353b),
+- UINT64_C (0xa2bfe8a14cf10364), UINT64_C (0xa81a664bbc423001),
+- UINT64_C (0xc24b8b70d0f89791), UINT64_C (0xc76c51a30654be30),
+- UINT64_C (0xd192e819d6ef5218), UINT64_C (0xd69906245565a910),
+- UINT64_C (0xf40e35855771202a), UINT64_C (0x106aa07032bbd1b8),
+- UINT64_C (0x19a4c116b8d2d0c8), UINT64_C (0x1e376c085141ab53),
+- UINT64_C (0x2748774cdf8eeb99), UINT64_C (0x34b0bcb5e19b48a8),
+- UINT64_C (0x391c0cb3c5c95a63), UINT64_C (0x4ed8aa4ae3418acb),
+- UINT64_C (0x5b9cca4f7763e373), UINT64_C (0x682e6ff3d6b2b8a3),
+- UINT64_C (0x748f82ee5defb2fc), UINT64_C (0x78a5636f43172f60),
+- UINT64_C (0x84c87814a1f0ab72), UINT64_C (0x8cc702081a6439ec),
+- UINT64_C (0x90befffa23631e28), UINT64_C (0xa4506cebde82bde9),
+- UINT64_C (0xbef9a3f7b2c67915), UINT64_C (0xc67178f2e372532b),
+- UINT64_C (0xca273eceea26619c), UINT64_C (0xd186b8c721c0c207),
+- UINT64_C (0xeada7dd6cde0eb1e), UINT64_C (0xf57d4f7fee6ed178),
+- UINT64_C (0x06f067aa72176fba), UINT64_C (0x0a637dc5a2c898a6),
+- UINT64_C (0x113f9804bef90dae), UINT64_C (0x1b710b35131c471b),
+- UINT64_C (0x28db77f523047d84), UINT64_C (0x32caab7b40c72493),
+- UINT64_C (0x3c9ebe0a15c9bebc), UINT64_C (0x431d67c49c100d4c),
+- UINT64_C (0x4cc5d4becb3e42b6), UINT64_C (0x597f299cfc657e2a),
+- UINT64_C (0x5fcb6fab3ad6faec), UINT64_C (0x6c44198c4a475817)
+-};
++ size_t i;
+
++ for (i = 0; i < len / 8; i++)
++ be64enc(dst + i * 8, src[i]);
++}
+
+-/* Process LEN bytes of BUFFER, accumulating context into CTX.
+- It is assumed that LEN % 128 == 0. */
++/*
++ * Decode a big-endian length len vector of (unsigned char) into a length
++ * len/4 vector of (uint64_t). Assumes len is a multiple of 8.
++ */
+ static void
+-sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
++be64dec_vect(uint64_t *dst, const unsigned char *src, size_t len)
+ {
+- unsigned int t;
+- const unsigned char *p = buffer;
+- size_t nwords = len / sizeof (uint64_t);
+- uint64_t a = ctx->H[0];
+- uint64_t b = ctx->H[1];
+- uint64_t c = ctx->H[2];
+- uint64_t d = ctx->H[3];
+- uint64_t e = ctx->H[4];
+- uint64_t f = ctx->H[5];
+- uint64_t g = ctx->H[6];
+- uint64_t h = ctx->H[7];
+-
+- /* First increment the byte count. FIPS 180-2 specifies the possible
+- length of the file up to 2^128 bits. Here we only compute the
+- number of bytes. Do a double word increment. */
+- ctx->total[0] += len;
+- if (ctx->total[0] < len)
+- ++ctx->total[1];
+-
+- /* Process all bytes in the buffer with 128 bytes in each round of
+- the loop. */
+- while (nwords > 0)
+- {
+- uint64_t W[80];
+- uint64_t a_save = a;
+- uint64_t b_save = b;
+- uint64_t c_save = c;
+- uint64_t d_save = d;
+- uint64_t e_save = e;
+- uint64_t f_save = f;
+- uint64_t g_save = g;
+- uint64_t h_save = h;
+-
+- /* Operators defined in FIPS 180-2:4.1.2. */
+-#define Ch(x, y, z) ((x & y) ^ (~x & z))
+-#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
+-#define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39))
+-#define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41))
+-#define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7))
+-#define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6))
+-
+- /* It is unfortunate that C does not provide an operator for
+- cyclic rotation. Hope the C compiler is smart enough. */
+-#define CYCLIC(w, s) ((w >> s) | (w << (64 - s)))
+-
+- /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */
+- for (t = 0; t < 16; ++t)
+- {
+- W[t] = be64_to_cpu (p);
+- p += 8;
+- }
+- for (t = 16; t < 80; ++t)
+- W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16];
+-
+- /* The actual computation according to FIPS 180-2:6.3.2 step 3. */
+- for (t = 0; t < 80; ++t)
+- {
+- uint64_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t];
+- uint64_t T2 = S0 (a) + Maj (a, b, c);
+- h = g;
+- g = f;
+- f = e;
+- e = d + T1;
+- d = c;
+- c = b;
+- b = a;
+- a = T1 + T2;
+- }
+-
+- /* Add the starting values of the context according to FIPS 180-2:6.3.2
+- step 4. */
+- a += a_save;
+- b += b_save;
+- c += c_save;
+- d += d_save;
+- e += e_save;
+- f += f_save;
+- g += g_save;
+- h += h_save;
+-
+- /* Prepare for the next round. */
+- nwords -= 16;
+- }
+-
+- /* Put checksum in context given as argument. */
+- ctx->H[0] = a;
+- ctx->H[1] = b;
+- ctx->H[2] = c;
+- ctx->H[3] = d;
+- ctx->H[4] = e;
+- ctx->H[5] = f;
+- ctx->H[6] = g;
+- ctx->H[7] = h;
++ size_t i;
++
++ for (i = 0; i < len / 8; i++)
++ dst[i] = be64dec(src + i * 8);
+ }
+
++#endif /* IS_BIGENDIAN */
++
++/* Elementary functions used by SHA512 */
++#define Ch(x, y, z) ((x & (y ^ z)) ^ z)
++#define Maj(x, y, z) ((x & (y | z)) | (y & z))
++#define SHR(x, n) (x >> n)
++#define ROTR(x, n) ((x >> n) | (x << (64 - n)))
++#define S0(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
++#define S1(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
++#define s0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
++#define s1(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6))
++
++/* SHA512 round function */
++#define RND(a, b, c, d, e, f, g, h, k) \
++ t0 = h + S1(e) + Ch(e, f, g) + k; \
++ t1 = S0(a) + Maj(a, b, c); \
++ d += t0; \
++ h = t0 + t1;
++
++/* Adjusted round function for rotating state */
++#define RNDr(S, W, i, k) \
++ RND(S[(80 - i) % 8], S[(81 - i) % 8], \
++ S[(82 - i) % 8], S[(83 - i) % 8], \
++ S[(84 - i) % 8], S[(85 - i) % 8], \
++ S[(86 - i) % 8], S[(87 - i) % 8], \
++ W[i] + k)
++
++/*
++ * SHA512 block compression function. The 512-bit state is transformed via
++ * the 512-bit input block to produce a new state.
++ */
++static void
++SHA512_Transform(uint64_t * state, const unsigned char block[128])
++{
++ uint64_t W[80];
++ uint64_t S[8];
++ uint64_t t0, t1;
++ int i;
++
++ /* 1. Prepare message schedule W. */
++ be64dec_vect(W, block, 128);
++ for (i = 16; i < 80; i++)
++ W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
++
++ /* 2. Initialize working variables. */
++ memcpy(S, state, 64);
++
++ /* 3. Mix. */
++ RNDr(S, W, 0, 0x428a2f98d728ae22ULL);
++ RNDr(S, W, 1, 0x7137449123ef65cdULL);
++ RNDr(S, W, 2, 0xb5c0fbcfec4d3b2fULL);
++ RNDr(S, W, 3, 0xe9b5dba58189dbbcULL);
++ RNDr(S, W, 4, 0x3956c25bf348b538ULL);
++ RNDr(S, W, 5, 0x59f111f1b605d019ULL);
++ RNDr(S, W, 6, 0x923f82a4af194f9bULL);
++ RNDr(S, W, 7, 0xab1c5ed5da6d8118ULL);
++ RNDr(S, W, 8, 0xd807aa98a3030242ULL);
++ RNDr(S, W, 9, 0x12835b0145706fbeULL);
++ RNDr(S, W, 10, 0x243185be4ee4b28cULL);
++ RNDr(S, W, 11, 0x550c7dc3d5ffb4e2ULL);
++ RNDr(S, W, 12, 0x72be5d74f27b896fULL);
++ RNDr(S, W, 13, 0x80deb1fe3b1696b1ULL);
++ RNDr(S, W, 14, 0x9bdc06a725c71235ULL);
++ RNDr(S, W, 15, 0xc19bf174cf692694ULL);
++ RNDr(S, W, 16, 0xe49b69c19ef14ad2ULL);
++ RNDr(S, W, 17, 0xefbe4786384f25e3ULL);
++ RNDr(S, W, 18, 0x0fc19dc68b8cd5b5ULL);
++ RNDr(S, W, 19, 0x240ca1cc77ac9c65ULL);
++ RNDr(S, W, 20, 0x2de92c6f592b0275ULL);
++ RNDr(S, W, 21, 0x4a7484aa6ea6e483ULL);
++ RNDr(S, W, 22, 0x5cb0a9dcbd41fbd4ULL);
++ RNDr(S, W, 23, 0x76f988da831153b5ULL);
++ RNDr(S, W, 24, 0x983e5152ee66dfabULL);
++ RNDr(S, W, 25, 0xa831c66d2db43210ULL);
++ RNDr(S, W, 26, 0xb00327c898fb213fULL);
++ RNDr(S, W, 27, 0xbf597fc7beef0ee4ULL);
++ RNDr(S, W, 28, 0xc6e00bf33da88fc2ULL);
++ RNDr(S, W, 29, 0xd5a79147930aa725ULL);
++ RNDr(S, W, 30, 0x06ca6351e003826fULL);
++ RNDr(S, W, 31, 0x142929670a0e6e70ULL);
++ RNDr(S, W, 32, 0x27b70a8546d22ffcULL);
++ RNDr(S, W, 33, 0x2e1b21385c26c926ULL);
++ RNDr(S, W, 34, 0x4d2c6dfc5ac42aedULL);
++ RNDr(S, W, 35, 0x53380d139d95b3dfULL);
++ RNDr(S, W, 36, 0x650a73548baf63deULL);
++ RNDr(S, W, 37, 0x766a0abb3c77b2a8ULL);
++ RNDr(S, W, 38, 0x81c2c92e47edaee6ULL);
++ RNDr(S, W, 39, 0x92722c851482353bULL);
++ RNDr(S, W, 40, 0xa2bfe8a14cf10364ULL);
++ RNDr(S, W, 41, 0xa81a664bbc423001ULL);
++ RNDr(S, W, 42, 0xc24b8b70d0f89791ULL);
++ RNDr(S, W, 43, 0xc76c51a30654be30ULL);
++ RNDr(S, W, 44, 0xd192e819d6ef5218ULL);
++ RNDr(S, W, 45, 0xd69906245565a910ULL);
++ RNDr(S, W, 46, 0xf40e35855771202aULL);
++ RNDr(S, W, 47, 0x106aa07032bbd1b8ULL);
++ RNDr(S, W, 48, 0x19a4c116b8d2d0c8ULL);
++ RNDr(S, W, 49, 0x1e376c085141ab53ULL);
++ RNDr(S, W, 50, 0x2748774cdf8eeb99ULL);
++ RNDr(S, W, 51, 0x34b0bcb5e19b48a8ULL);
++ RNDr(S, W, 52, 0x391c0cb3c5c95a63ULL);
++ RNDr(S, W, 53, 0x4ed8aa4ae3418acbULL);
++ RNDr(S, W, 54, 0x5b9cca4f7763e373ULL);
++ RNDr(S, W, 55, 0x682e6ff3d6b2b8a3ULL);
++ RNDr(S, W, 56, 0x748f82ee5defb2fcULL);
++ RNDr(S, W, 57, 0x78a5636f43172f60ULL);
++ RNDr(S, W, 58, 0x84c87814a1f0ab72ULL);
++ RNDr(S, W, 59, 0x8cc702081a6439ecULL);
++ RNDr(S, W, 60, 0x90befffa23631e28ULL);
++ RNDr(S, W, 61, 0xa4506cebde82bde9ULL);
++ RNDr(S, W, 62, 0xbef9a3f7b2c67915ULL);
++ RNDr(S, W, 63, 0xc67178f2e372532bULL);
++ RNDr(S, W, 64, 0xca273eceea26619cULL);
++ RNDr(S, W, 65, 0xd186b8c721c0c207ULL);
++ RNDr(S, W, 66, 0xeada7dd6cde0eb1eULL);
++ RNDr(S, W, 67, 0xf57d4f7fee6ed178ULL);
++ RNDr(S, W, 68, 0x06f067aa72176fbaULL);
++ RNDr(S, W, 69, 0x0a637dc5a2c898a6ULL);
++ RNDr(S, W, 70, 0x113f9804bef90daeULL);
++ RNDr(S, W, 71, 0x1b710b35131c471bULL);
++ RNDr(S, W, 72, 0x28db77f523047d84ULL);
++ RNDr(S, W, 73, 0x32caab7b40c72493ULL);
++ RNDr(S, W, 74, 0x3c9ebe0a15c9bebcULL);
++ RNDr(S, W, 75, 0x431d67c49c100d4cULL);
++ RNDr(S, W, 76, 0x4cc5d4becb3e42b6ULL);
++ RNDr(S, W, 77, 0x597f299cfc657e2aULL);
++ RNDr(S, W, 78, 0x5fcb6fab3ad6faecULL);
++ RNDr(S, W, 79, 0x6c44198c4a475817ULL);
++
++ /* 4. Mix local working variables into global state */
++ for (i = 0; i < 8; i++)
++ state[i] += S[i];
++}
+
+-/* Initialize structure containing state of computation.
+- (FIPS 180-2:5.3.3) */
+-void
+-sha512_init_ctx (struct sha512_ctx *ctx)
++static unsigned char PAD[128] = {
++ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
++};
++
++/* Add padding and terminating bit-count. */
++static void
++SHA512_Pad(SHA512_CTX * ctx)
+ {
+- ctx->H[0] = UINT64_C (0x6a09e667f3bcc908);
+- ctx->H[1] = UINT64_C (0xbb67ae8584caa73b);
+- ctx->H[2] = UINT64_C (0x3c6ef372fe94f82b);
+- ctx->H[3] = UINT64_C (0xa54ff53a5f1d36f1);
+- ctx->H[4] = UINT64_C (0x510e527fade682d1);
+- ctx->H[5] = UINT64_C (0x9b05688c2b3e6c1f);
+- ctx->H[6] = UINT64_C (0x1f83d9abfb41bd6b);
+- ctx->H[7] = UINT64_C (0x5be0cd19137e2179);
+-
+- ctx->total[0] = ctx->total[1] = 0;
+- ctx->buflen = 0;
++ unsigned char len[16];
++ uint64_t r, plen;
++
++ /*
++ * Convert length to a vector of bytes -- we do this now rather
++ * than later because the length will change after we pad.
++ */
++ be64enc_vect(len, ctx->count, 16);
++
++ /* Add 1--128 bytes so that the resulting length is 112 mod 128 */
++ r = (ctx->count[1] >> 3) & 0x7f;
++ plen = (r < 112) ? (112 - r) : (240 - r);
++ SHA512_Update(ctx, PAD, (size_t)plen);
++
++ /* Add the terminating bit-count */
++ SHA512_Update(ctx, len, 16);
+ }
+
++/* SHA-512 initialization. Begins a SHA-512 operation. */
++void
++SHA512_Init(SHA512_CTX * ctx)
++{
+
+-/* Process the remaining bytes in the internal buffer and the usual
+- prolog according to the standard and write the result to RESBUF.
++ /* Zero bits processed so far */
++ ctx->count[0] = ctx->count[1] = 0;
++
++ /* Magic initialization constants */
++ ctx->state[0] = 0x6a09e667f3bcc908ULL;
++ ctx->state[1] = 0xbb67ae8584caa73bULL;
++ ctx->state[2] = 0x3c6ef372fe94f82bULL;
++ ctx->state[3] = 0xa54ff53a5f1d36f1ULL;
++ ctx->state[4] = 0x510e527fade682d1ULL;
++ ctx->state[5] = 0x9b05688c2b3e6c1fULL;
++ ctx->state[6] = 0x1f83d9abfb41bd6bULL;
++ ctx->state[7] = 0x5be0cd19137e2179ULL;
++}
+
+- IMPORTANT: On some systems it is required that RESBUF is correctly
+- aligned for a 32 bits value. */
+-void *
+-sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
++/* Add bytes into the hash */
++void
++SHA512_Update(SHA512_CTX * ctx, const void *in, size_t len)
+ {
+- /* Take yet unprocessed bytes into account. */
+- uint32_t bytes = ctx->buflen;
+- size_t pad;
+- unsigned int i;
+- unsigned char *rp = resbuf;
+-
+- /* Now count remaining bytes. */
+- ctx->total[0] += bytes;
+- if (ctx->total[0] < bytes)
+- ++ctx->total[1];
+-
+- pad = bytes >= 112 ? 128 + 112 - bytes : 112 - bytes;
+- /* The first byte of padding should be 0x80 and the rest should be
+- zero. (FIPS 180-2:5.1.2) */
+- ctx->buffer[bytes] = 0x80u;
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[bytes+1], pad-1);
+-
+- /* Put the 128-bit file length in big-endian *bits* at the end of
+- the buffer. */
+- cpu_to_be64 (&ctx->buffer[bytes + pad],
+- (ctx->total[1] << 3) | (ctx->total[0] >> 61));
+- cpu_to_be64 (&ctx->buffer[bytes + pad + 8],
+- ctx->total[0] << 3);
+-
+- /* Process last bytes. */
+- sha512_process_block (ctx->buffer, bytes + pad + 16, ctx);
+-
+- /* Put result from CTX in first 64 bytes following RESBUF. */
+- for (i = 0; i < 8; ++i)
+- cpu_to_be64 (rp + i*8, ctx->H[i]);
+-
+- XCRYPT_SECURE_MEMSET (ctx, sizeof (struct sha512_ctx));
+- return resbuf;
++ uint64_t bitlen[2];
++ uint64_t r;
++ const unsigned char *src = in;
++
++ /* Number of bytes left in the buffer from previous updates */
++ r = (ctx->count[1] >> 3) & 0x7f;
++
++ /* Convert the length into a number of bits */
++ bitlen[1] = ((uint64_t)len) << 3;
++ bitlen[0] = ((uint64_t)len) >> 61;
++
++ /* Update number of bits */
++ if ((ctx->count[1] += bitlen[1]) < bitlen[1])
++ ctx->count[0]++;
++ ctx->count[0] += bitlen[0];
++
++ /* Handle the case where we don't need to perform any transforms */
++ if (len < 128 - r) {
++ memcpy(&ctx->buf[r], src, len);
++ return;
++ }
++
++ /* Finish the current block */
++ memcpy(&ctx->buf[r], src, 128 - r);
++ SHA512_Transform(ctx->state, ctx->buf);
++ src += 128 - r;
++ len -= 128 - r;
++
++ /* Perform complete blocks */
++ while (len >= 128) {
++ SHA512_Transform(ctx->state, src);
++ src += 128;
++ len -= 128;
++ }
++
++ /* Copy left over data into buffer */
++ memcpy(ctx->buf, src, len);
+ }
+
++/*
++ * SHA-512 finalization. Pads the input data, exports the hash value,
++ * and clears the context state.
++ */
++void
++SHA512_Final(unsigned char digest[64], SHA512_CTX * ctx)
++{
++
++ /* Add padding */
++ SHA512_Pad(ctx);
+
++ /* Write the hash */
++ be64enc_vect(digest, ctx->state, 64);
++
++ /* Clear the context state */
++ XCRYPT_SECURE_MEMSET(ctx, sizeof (*ctx));
++}
++
++/**
++ * SHA512_Buf(in, len, digest):
++ * Compute the SHA512 hash of ${len} bytes from ${in} and write it to ${digest}.
++ */
+ void
+-sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx)
++SHA512_Buf(const void * in, size_t len, uint8_t digest[64])
+ {
+- /* When we already have some bits in our internal buffer concatenate
+- both inputs first. */
+- if (ctx->buflen != 0)
+- {
+- uint32_t left_over = ctx->buflen;
+- uint32_t add = 256 - left_over > len ? (uint32_t)len : 256 - left_over;
+-
+- memcpy (&ctx->buffer[left_over], buffer, add);
+- ctx->buflen += add;
+-
+- if (ctx->buflen > 128)
+- {
+- sha512_process_block (ctx->buffer, ctx->buflen & ~127u, ctx);
+-
+- ctx->buflen &= 127;
+- /* The regions in the following copy operation cannot overlap. */
+- memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~127u],
+- ctx->buflen);
+- }
+-
+- buffer = (const char *) buffer + add;
+- len -= add;
+- }
+-
+- /* Process available complete blocks. */
+- if (len > 128)
+- {
+- sha512_process_block (buffer, len & ~127u, ctx);
+- buffer = (const char *) buffer + (len & ~127u);
+- len &= 127;
+- }
+-
+- /* Move remaining bytes into internal buffer. */
+- if (len > 0)
+- {
+- size_t left_over = ctx->buflen;
+-
+- memcpy (&ctx->buffer[left_over], buffer, len);
+- left_over += len;
+- if (left_over >= 128)
+- {
+- sha512_process_block (ctx->buffer, 128, ctx);
+- left_over -= 128;
+- memcpy (ctx->buffer, &ctx->buffer[128], left_over);
+- }
+- ctx->buflen = (uint32_t)left_over;
+- }
++ SHA512_CTX ctx;
++
++ SHA512_Init(&ctx);
++ SHA512_Update(&ctx, in, len);
++ SHA512_Final(digest, &ctx);
++
++ /* Clean the stack. */
++ XCRYPT_SECURE_MEMSET(&ctx, sizeof(SHA512_CTX));
+ }
+
+ #endif
+diff --git a/alg-sha512.h b/alg-sha512.h
+index c11329e..c591bb1 100644
+--- a/alg-sha512.h
++++ b/alg-sha512.h
+@@ -1,46 +1,75 @@
+-/* Declaration of functions and data types used for SHA512 sum computing
+- library functions.
+- Copyright (C) 2007-2017 Free Software Foundation, Inc.
+-
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
+-
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
+-
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
+-
+-#ifndef _CRYPT_ALG_SHA512_H
+-#define _CRYPT_ALG_SHA512_H 1
+-
+-/* Structure to save state of computation between the single steps. */
+-struct sha512_ctx
+-{
+- uint64_t H[8];
+-
+- uint64_t total[2];
+- uint32_t buflen;
+- unsigned char buffer[256];
+-};
+-
+-/* Initialize structure containing state of computation.
+- (FIPS 180-2: 5.3.3) */
+-extern void sha512_init_ctx (struct sha512_ctx *ctx);
+-
+-/* Starting with the result of former calls of this function (or the
+- initialization function) update the context for the next LEN bytes
+- starting at BUFFER. LEN does not need to be a multiple of 128. */
+-extern void sha512_process_bytes (const void *buffer, size_t len,
+- struct sha512_ctx *ctx);
+-
+-/* Process the remaining bytes in the buffer and write the finalized
+- hash to RESBUF, which should point to 64 bytes of storage. */
+-extern void *sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf);
+-
+-#endif /* alg-sha512.h */
++/*-
++ * Copyright 2005 Colin Percival
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++
++#ifndef _SHA512_H_
++#define _SHA512_H_
++
++#include <stddef.h>
++#include <stdint.h>
++
++/*
++ * Use #defines in order to avoid namespace collisions with anyone else's
++ * SHA512 code (e.g., the code in OpenSSL).
++ */
++#define SHA512_Init libcperciva_SHA512_Init
++#define SHA512_Update libcperciva_SHA512_Update
++#define SHA512_Final libcperciva_SHA512_Final
++#define SHA512_Buf libcperciva_SHA512_Buf
++#define SHA512_CTX libcperciva_SHA512_CTX
++
++/* Context structure for SHA512 operations. */
++typedef struct {
++ uint64_t state[8];
++ uint64_t count[2];
++ uint8_t buf[128];
++} SHA512_CTX;
++
++/**
++ * SHA512_Init(ctx):
++ * Initialize the SHA512 context ${ctx}.
++ */
++void SHA512_Init(SHA512_CTX *);
++
++/**
++ * SHA512_Update(ctx, in, len):
++ * Input ${len} bytes from ${in} into the SHA512 context ${ctx}.
++ */
++void SHA512_Update(SHA512_CTX *, const void *, size_t);
++
++/**
++ * SHA512_Final(digest, ctx):
++ * Output the SHA512 hash of the data input to the context ${ctx} into the
++ * buffer ${digest}.
++ */
++void SHA512_Final(uint8_t[64], SHA512_CTX *);
++
++/**
++ * SHA512_Buf(in, len, digest):
++ * Compute the SHA512 hash of ${len} bytes from ${in} and write it to ${digest}.
++ */
++void SHA512_Buf(const void *, size_t, uint8_t[64]);
++
++#endif /* !_SHA512_H_ */
+diff --git a/alg-yescrypt-sysendian.h b/alg-yescrypt-sysendian.h
+index e2e41cd..b877e07 100644
+--- a/alg-yescrypt-sysendian.h
++++ b/alg-yescrypt-sysendian.h
+@@ -37,6 +37,7 @@
+ /* Avoid namespace collisions with BSD <sys/endian.h>. */
+ #define be32dec libcperciva_be32dec
+ #define be32enc libcperciva_be32enc
++#define be64dec libcperciva_be64dec
+ #define be64enc libcperciva_be64enc
+ #define le32dec libcperciva_le32dec
+ #define le32enc libcperciva_le32enc
+@@ -61,6 +62,17 @@ be32enc(void * pp, uint32_t x)
+ p[0] = (x >> 24) & 0xff;
+ }
+
++static inline uint64_t
++be64dec(const void *pp)
++{
++ const uint8_t *p = (uint8_t const *)pp;
++
++ return ((uint64_t)(p[7]) + ((uint64_t)(p[6]) << 8) +
++ ((uint64_t)(p[5]) << 16) + ((uint64_t)(p[4]) << 24) +
++ ((uint64_t)(p[3]) << 32) + ((uint64_t)(p[2]) << 40) +
++ ((uint64_t)(p[1]) << 48) + ((uint64_t)(p[0]) << 56));
++}
++
+ static inline void
+ be64enc(void * pp, uint64_t x)
+ {
+diff --git a/crypt-port.h b/crypt-port.h
+index 5f4d55f..a2c64b3 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -260,9 +260,10 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #endif
+
+ #if INCLUDE_sha512
+-#define sha512_finish_ctx _crypt_sha512_finish_ctx
+-#define sha512_init_ctx _crypt_sha512_init_ctx
+-#define sha512_process_bytes _crypt_sha512_process_bytes
++#define libcperciva_SHA512_Init _crypt_SHA512_Init
++#define libcperciva_SHA512_Update _crypt_SHA512_Update
++#define libcperciva_SHA512_Final _crypt_SHA512_Final
++#define libcperciva_SHA512_Buf _crypt_SHA512_Buf
+ #endif
+
+ #if INCLUDE_md5 || INCLUDE_sha256 || INCLUDE_sha512
+diff --git a/crypt-sha512.c b/crypt-sha512.c
+index 39ec0b5..2b6b444 100644
+--- a/crypt-sha512.c
++++ b/crypt-sha512.c
+@@ -58,7 +58,7 @@ static_assert (SHA512_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,
+ /* A sha512_buffer holds all of the sensitive intermediate data. */
+ struct sha512_buffer
+ {
+- struct sha512_ctx ctx;
++ SHA512_CTX ctx;
+ uint8_t result[64];
+ uint8_t p_bytes[64];
+ uint8_t s_bytes[64];
+@@ -77,12 +77,12 @@ static const char b64t[] =
+ indefinitely. */
+ static void
+ sha512_process_recycled_bytes (unsigned char block[64], size_t len,
+- struct sha512_ctx *ctx)
++ SHA512_CTX *ctx)
+ {
+ size_t cnt;
+ for (cnt = len; cnt >= 64; cnt -= 64)
+- sha512_process_bytes (block, 64, ctx);
+- sha512_process_bytes (block, cnt, ctx);
++ SHA512_Update (ctx, block, 64);
++ SHA512_Update (ctx, block, cnt);
+ }
+
+ void
+@@ -100,7 +100,7 @@ crypt_sha512_rn (const char *phrase, size_t phr_size,
+ }
+
+ struct sha512_buffer *buf = scratch;
+- struct sha512_ctx *ctx = &buf->ctx;
++ SHA512_CTX *ctx = &buf->ctx;
+ uint8_t *result = buf->result;
+ uint8_t *p_bytes = buf->p_bytes;
+ uint8_t *s_bytes = buf->s_bytes;
+@@ -158,80 +158,80 @@ crypt_sha512_rn (const char *phrase, size_t phr_size,
+
+ /* Compute alternate SHA512 sum with input PHRASE, SALT, and PHRASE. The
+ final result will be added to the first context. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* Add phrase. */
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Add salt. */
+- sha512_process_bytes (salt, salt_size, ctx);
++ SHA512_Update (ctx, salt, salt_size);
+
+ /* Add phrase again. */
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Now get result of this (64 bytes) and add it to the other
+ context. */
+- sha512_finish_ctx (ctx, result);
++ SHA512_Final (result, ctx);
+
+ /* Prepare for the real work. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* Add the phrase string. */
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* The last part is the salt string. This must be at most 8
+ characters and it ends at the first `$' character (for
+ compatibility with existing implementations). */
+- sha512_process_bytes (salt, salt_size, ctx);
++ SHA512_Update (ctx, salt, salt_size);
+
+ /* Add for any character in the phrase one byte of the alternate sum. */
+ for (cnt = phr_size; cnt > 64; cnt -= 64)
+- sha512_process_bytes (result, 64, ctx);
+- sha512_process_bytes (result, cnt, ctx);
++ SHA512_Update (ctx, result, 64);
++ SHA512_Update (ctx, result, cnt);
+
+ /* Take the binary representation of the length of the phrase and for every
+ 1 add the alternate sum, for every 0 the phrase. */
+ for (cnt = phr_size; cnt > 0; cnt >>= 1)
+ if ((cnt & 1) != 0)
+- sha512_process_bytes (result, 64, ctx);
++ SHA512_Update (ctx, result, 64);
+ else
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Create intermediate result. */
+- sha512_finish_ctx (ctx, result);
++ SHA512_Final (result, ctx);
+
+ /* Start computation of P byte sequence. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* For every character in the password add the entire password. */
+ for (cnt = 0; cnt < phr_size; ++cnt)
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Finish the digest. */
+- sha512_finish_ctx (ctx, p_bytes);
++ SHA512_Final (p_bytes, ctx);
+
+ /* Start computation of S byte sequence. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* For every character in the password add the entire password. */
+ for (cnt = 0; cnt < (size_t) 16 + (size_t) result[0]; ++cnt)
+- sha512_process_bytes (salt, salt_size, ctx);
++ SHA512_Update (ctx, salt, salt_size);
+
+ /* Finish the digest. */
+- sha512_finish_ctx (ctx, s_bytes);
++ SHA512_Final (s_bytes, ctx);
+
+ /* Repeatedly run the collected hash value through SHA512 to burn
+ CPU cycles. */
+ for (cnt = 0; cnt < rounds; ++cnt)
+ {
+ /* New context. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+ sha512_process_recycled_bytes (p_bytes, phr_size, ctx);
+ else
+- sha512_process_bytes (result, 64, ctx);
++ SHA512_Update (ctx, result, 64);
+
+ /* Add salt for numbers not divisible by 3. */
+ if (cnt % 3 != 0)
+@@ -243,12 +243,12 @@ crypt_sha512_rn (const char *phrase, size_t phr_size,
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+- sha512_process_bytes (result, 64, ctx);
++ SHA512_Update (ctx, result, 64);
+ else
+ sha512_process_recycled_bytes (p_bytes, phr_size, ctx);
+
+ /* Create intermediate result. */
+- sha512_finish_ctx (ctx, result);
++ SHA512_Final (result, ctx);
+ }
+
+ /* Now we can construct the result string. It consists of four
+diff --git a/test-alg-sha512.c b/test-alg-sha512.c
+index b6d4fc6..5f9af9c 100644
+--- a/test-alg-sha512.c
++++ b/test-alg-sha512.c
+@@ -84,7 +84,7 @@ static const struct
+
+ static void
+ report_failure(int n, const char *tag,
+- const char expected[64], const char actual[64])
++ const char expected[64], const uint8_t actual[64])
+ {
+ int i;
+ printf ("FAIL: test %d (%s):\n exp:", n, tag);
+@@ -112,28 +112,25 @@ report_failure(int n, const char *tag,
+ int
+ main (void)
+ {
+- struct sha512_ctx ctx;
+- char sum[64];
++ SHA512_CTX ctx;
++ uint8_t sum[64];
+ int result = 0;
+ int cnt;
+ int i;
+
+ for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)
+ {
+- sha512_init_ctx (&ctx);
+- sha512_process_bytes (tests[cnt].input, strlen (tests[cnt].input),
+- &ctx);
+- sha512_finish_ctx (&ctx, sum);
++ SHA512_Buf (tests[cnt].input, strlen (tests[cnt].input), sum);
+ if (memcmp (tests[cnt].result, sum, 64) != 0)
+ {
+ report_failure (cnt, "all at once", tests[cnt].result, sum);
+ result = 1;
+ }
+
+- sha512_init_ctx (&ctx);
++ SHA512_Init (&ctx);
+ for (i = 0; tests[cnt].input[i] != '\0'; ++i)
+- sha512_process_bytes (&tests[cnt].input[i], 1, &ctx);
+- sha512_finish_ctx (&ctx, sum);
++ SHA512_Update (&ctx, &tests[cnt].input[i], 1);
++ SHA512_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 64) != 0)
+ {
+ report_failure (cnt, "byte by byte", tests[cnt].result, sum);
+@@ -144,10 +141,10 @@ main (void)
+ /* Test vector from FIPS 180-2: appendix C.3. */
+ char buf[1000];
+ memset (buf, 'a', sizeof (buf));
+- sha512_init_ctx (&ctx);
++ SHA512_Init (&ctx);
+ for (i = 0; i < 1000; ++i)
+- sha512_process_bytes (buf, sizeof (buf), &ctx);
+- sha512_finish_ctx (&ctx, sum);
++ SHA512_Update (&ctx, buf, sizeof (buf));
++ SHA512_Final (sum, &ctx);
+ static const char expected[64] =
+ "\xe7\x18\x48\x3d\x0c\xe7\x69\x64\x4e\x2e\x42\xc7\xbc\x15\xb4\x63"
+ "\x8e\x1f\x98\xb1\x3b\x20\x44\x28\x56\x32\xa8\x03\xaf\xa9\x73\xeb"
+
+From 4964877dbf96d951b3f45b2dba97459404d1dff8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 13:48:34 +0200
+Subject: [PATCH 10/17] Use md5 implementation from Alexander Peslyak.
+
+Thus we now have a md5 implementation in the public domain.
+---
+ LICENSING | 5 +-
+ NEWS | 2 +
+ TODO.md | 2 -
+ alg-md5.c | 539 ++++++++++++++++++++++++-------------------------
+ alg-md5.h | 79 ++++----
+ crypt-md5.c | 47 +++--
+ crypt-port.h | 6 +-
+ crypt-sunmd5.c | 20 +-
+ test-alg-md5.c | 24 +--
+ 9 files changed, 349 insertions(+), 375 deletions(-)
+
+diff --git a/LICENSING b/LICENSING
+index 31f704c..0ed22f5 100644
+--- a/LICENSING
++++ b/LICENSING
+@@ -13,7 +13,7 @@ source tree. For specific licensing terms consult the files themselves.
+
+ * Copyright Free Software Foundation, Inc.; LGPL (v2.1 or later):
+ crypt.h, crypt-obsolete.h, crypt-private.h
+- alg-md5.h, alg-md5.c, crypt-md5.c,
++ crypt-md5.c,
+ test-crypt-badsalt.c, test-crypt-nonnull.c
+
+ * Copyright David Burren et al.; 3-clause BSD:
+@@ -24,7 +24,8 @@ source tree. For specific licensing terms consult the files themselves.
+ crypt-sha256.c, crypt-sha512.c
+
+ * Public domain, written by Solar Designer et al.:
+- alg-md4.h, alg-md4.c, crypt-bcrypt.c, crypt-gensalt.c, test-crypt-bcrypt.c
++ alg-md4.h, alg-md4.c, alg-md5.h, alg-md5.c,
++ crypt-bcrypt.c, crypt-gensalt.c, test-crypt-bcrypt.c
+
+ * Copyright Solar Designer, Colin Percival; 0-clause BSD:
+ alg-yescrypt-common.c, alg-yescrypt-platform.c
+diff --git a/NEWS b/NEWS
+index c4b04da..e48b0d1 100644
+--- a/NEWS
++++ b/NEWS
+@@ -8,6 +8,8 @@ Version 4.2.3
+ tarball release, use './bootstrap' to create the configure script.
+ * Use sha512 implementation from Colin Percival. Thus we now have a
+ sha512 implementation under the BSD license.
++* Use md5 implementation from Alexander Peslyak. Thus we now have a
++ md5 implementation in the public domain.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/TODO.md b/TODO.md
+index c4e2799..7df4ca5 100644
+--- a/TODO.md
++++ b/TODO.md
+@@ -95,8 +95,6 @@ It was last updated 20 October 2018.
+ at it, and no destructor function
+
+ * Permissive relicensing, to encourage use beyond the GNU ecosystem?
+- * Replace remaining (L)GPLed crypto primitives (MD5) with
+- permissively licensed equivalents (e.g. from Openwall)
+ * Replace crypt-md5.c with original md5crypt from FreeBSD?
+ * Other files subject to the (L)GPL are crypt.c, crypt-static.c,
+ crypt-gensalt-static.c, crypt-obsolete.h, crypt-port.h,
+diff --git a/alg-md5.c b/alg-md5.c
+index 9d9e4e3..8382b98 100644
+--- a/alg-md5.c
++++ b/alg-md5.c
+@@ -1,308 +1,291 @@
+-/* Functions to compute MD5 message digest of files or memory blocks.
+- according to the definition of MD5 in RFC 1321 from April 1992.
+-
+- Copyright (C) 1995-2017 Free Software Foundation, Inc.
+-
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
+-
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
+-
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
+-
+-/* Written by Ulrich Drepper <drepper(a)gnu.ai.mit.edu>, 1995. */
++/*
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD5 Message-Digest Algorithm (RFC 1321).
++ *
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
++ *
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
++ *
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * (This is a heavily cut-down "BSD license".)
++ *
++ * This differs from Colin Plumb's older public domain implementation in that
++ * no exactly 32-bit integer data type is required (any 32-bit or wider
++ * unsigned integer data type will do), there's no compile-time endianness
++ * configuration, and the function prototypes match OpenSSL's. No code from
++ * Colin Plumb's implementation has been reused; this comment merely compares
++ * the properties of the two independent implementations.
++ *
++ * The primary goals of this implementation are portability and ease of use.
++ * It is meant to be fast, but not as fast as possible. Some known
++ * optimizations are not included to reduce source code size and avoid
++ * compile-time configuration.
++ */
+
+ #include "crypt-port.h"
+-#include "alg-md5.h"
+-#include "byteorder.h"
+
+ #if INCLUDE_md5 || INCLUDE_sunmd5
+
+-static void md5_process_block (const void *buffer, size_t len,
+- struct md5_ctx *ctx);
++#include "alg-md5.h"
+
+-/* Initialize structure containing state of computation.
+- (RFC 1321, 3.3: Step 3) */
+-void
+-md5_init_ctx (struct md5_ctx *ctx)
+-{
+- ctx->A = 0x67452301;
+- ctx->B = 0xefcdab89;
+- ctx->C = 0x98badcfe;
+- ctx->D = 0x10325476;
++/*
++ * The basic MD5 functions.
++ *
++ * F and G are optimized compared to their RFC 1321 definitions for
++ * architectures that lack an AND-NOT instruction, just like in Colin Plumb's
++ * implementation.
++ */
++#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
++#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
++#define H(x, y, z) (((x) ^ (y)) ^ (z))
++#define H2(x, y, z) ((x) ^ ((y) ^ (z)))
++#define I(x, y, z) ((y) ^ ((x) | ~(z)))
++
++/*
++ * The MD5 transformation for all four rounds.
++ */
++#define STEP(f, a, b, c, d, x, t, s) \
++ (a) += f((b), (c), (d)) + (x) + (t); \
++ (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
++ (a) += (b);
++
++/*
++ * SET reads 4 input bytes in little-endian byte order and stores them in a
++ * properly aligned word in host byte order.
++ *
++ * The check for little-endian architectures that tolerate unaligned memory
++ * accesses is just an optimization. Nothing will break if it fails to detect
++ * a suitable architecture.
++ *
++ * Unfortunately, this optimization may be a C strict aliasing rules violation
++ * if the caller's data buffer has effective type that cannot be aliased by
++ * MD5_u32plus. In practice, this problem may occur if these MD5 routines are
++ * inlined into a calling function, or with future and dangerously advanced
++ * link-time optimizations. For the time being, keeping these MD5 routines in
++ * their own translation unit avoids the problem.
++ */
++#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#define SET(n) \
++ (*(const MD5_u32plus *)&ptr[(n) * 4])
++#define GET(n) \
++ SET(n)
++#else
++#define SET(n) \
++ (ctx->block[(n)] = \
++ (MD5_u32plus)ptr[(n) * 4] | \
++ ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \
++ ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \
++ ((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
++#define GET(n) \
++ (ctx->block[(n)])
++#endif
+
+- ctx->total = 0;
+- ctx->buflen = 0;
++/*
++ * This processes one or more 64-byte data blocks, but does NOT update the bit
++ * counters. There are no alignment requirements.
++ */
++static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
++{
++ const unsigned char *ptr;
++ MD5_u32plus a, b, c, d;
++ MD5_u32plus saved_a, saved_b, saved_c, saved_d;
++
++ ptr = (const unsigned char *)data;
++
++ a = ctx->a;
++ b = ctx->b;
++ c = ctx->c;
++ d = ctx->d;
++
++ do {
++ saved_a = a;
++ saved_b = b;
++ saved_c = c;
++ saved_d = d;
++
++/* Round 1 */
++ STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
++ STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
++ STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
++ STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
++ STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
++ STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
++ STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
++ STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
++ STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
++ STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
++ STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
++ STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
++ STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
++ STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
++ STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
++ STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
++
++/* Round 2 */
++ STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
++ STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
++ STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
++ STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
++ STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
++ STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
++ STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
++ STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
++ STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
++ STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
++ STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
++ STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
++ STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
++ STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
++ STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
++ STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
++
++/* Round 3 */
++ STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
++ STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)
++ STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
++ STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)
++ STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
++ STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)
++ STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
++ STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)
++ STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
++ STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)
++ STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
++ STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)
++ STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
++ STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)
++ STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
++ STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)
++
++/* Round 4 */
++ STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
++ STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
++ STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
++ STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
++ STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
++ STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
++ STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
++ STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
++ STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
++ STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
++ STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
++ STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
++ STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
++ STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
++ STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
++ STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
++
++ a += saved_a;
++ b += saved_b;
++ c += saved_c;
++ d += saved_d;
++
++ ptr += 64;
++ } while (size -= 64);
++
++ ctx->a = a;
++ ctx->b = b;
++ ctx->c = c;
++ ctx->d = d;
++
++ return ptr;
+ }
+
+-/* Put result from CTX in first 16 bytes following RESBUF. The result
+- will be in little endian byte order. */
+-static void *
+-md5_read_ctx (struct md5_ctx *ctx, void *resbuf)
++void MD5_Init(MD5_CTX *ctx)
+ {
+- unsigned char *buf = resbuf;
+- cpu_to_le32 (buf + 0, ctx->A);
+- cpu_to_le32 (buf + 4, ctx->B);
+- cpu_to_le32 (buf + 8, ctx->C);
+- cpu_to_le32 (buf + 12, ctx->D);
+- XCRYPT_SECURE_MEMSET (ctx, sizeof(*ctx));
+- return resbuf;
+-}
++ ctx->a = 0x67452301;
++ ctx->b = 0xefcdab89;
++ ctx->c = 0x98badcfe;
++ ctx->d = 0x10325476;
+
+-/* Process the remaining bytes in the internal buffer and the usual
+- prolog according to the standard and write the result to RESBUF. */
++ ctx->lo = 0;
++ ctx->hi = 0;
++}
+
+-void *
+-md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
++void MD5_Update(MD5_CTX *ctx, const void *data, size_t size)
+ {
+- /* Take yet unprocessed bytes into account. */
+- uint32_t bytes = ctx->buflen;
+- size_t pad;
++ MD5_u32plus saved_lo;
++ unsigned long used, available;
++
++ saved_lo = ctx->lo;
++ if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
++ ctx->hi++;
++ ctx->hi += (MD5_u32plus) size >> 29;
+
+- /* Now count remaining bytes. */
+- ctx->total += bytes;
++ used = saved_lo & 0x3f;
+
+- pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
++ if (used) {
++ available = 64 - used;
+
+- /* The first byte of padding should be 0x80 and the rest should be
+- zero. (RFC 1321, 3.1: Step 1) */
+- ctx->buffer[bytes] = 0x80u;
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[bytes+1], pad-1);
++ if (size < available) {
++ memcpy(&ctx->buffer[used], data, size);
++ return;
++ }
+
+- /* Put the 64-bit file length in little-endian *bits* at the end of
+- the buffer. */
+- cpu_to_le64 (&ctx->buffer[bytes + pad], ctx->total << 3);
++ memcpy(&ctx->buffer[used], data, available);
++ data = (const unsigned char *)data + available;
++ size -= available;
++ body(ctx, ctx->buffer, 64);
++ }
+
+- /* Process last bytes. */
+- md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
++ if (size >= 64) {
++ data = body(ctx, data, size & ~(unsigned long)0x3f);
++ size &= 0x3f;
++ }
+
+- return md5_read_ctx (ctx, resbuf);
++ memcpy(ctx->buffer, data, size);
+ }
+
++#define OUT(dst, src) \
++ (dst)[0] = (unsigned char)(src); \
++ (dst)[1] = (unsigned char)((src) >> 8); \
++ (dst)[2] = (unsigned char)((src) >> 16); \
++ (dst)[3] = (unsigned char)((src) >> 24);
+
+-void
+-md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
++void MD5_Final(uint8_t result[16], MD5_CTX *ctx)
+ {
+- /* When we already have some bits in our internal buffer concatenate
+- both inputs first. */
+- if (ctx->buflen != 0)
+- {
+- uint32_t left_over = ctx->buflen;
+- uint32_t add = 128 - left_over > len ? (uint32_t)len : 128 - left_over;
+-
+- memcpy (&ctx->buffer[left_over], buffer, add);
+- ctx->buflen += add;
+-
+- if (ctx->buflen > 64)
+- {
+- md5_process_block (ctx->buffer, ctx->buflen & ~63u, ctx);
+-
+- ctx->buflen &= 63;
+- /* The regions in the following copy operation cannot overlap. */
+- memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63u],
+- ctx->buflen);
+- }
+-
+- buffer = (const char *) buffer + add;
+- len -= add;
+- }
+-
+- /* Process available complete blocks. */
+- if (len > 64)
+- {
+- md5_process_block (buffer, len & ~63u, ctx);
+- buffer = (const char *) buffer + (len & ~63u);
+- len &= 63;
+- }
+-
+- /* Move remaining bytes in internal buffer. */
+- if (len > 0)
+- {
+- uint32_t left_over = ctx->buflen;
+-
+- memcpy (&ctx->buffer[left_over], buffer, len);
+- left_over += (uint32_t)len;
+- if (left_over >= 64)
+- {
+- md5_process_block (ctx->buffer, 64, ctx);
+- left_over -= 64;
+- memcpy (ctx->buffer, &ctx->buffer[64], left_over);
+- }
+- ctx->buflen = left_over;
+- }
+-}
++ unsigned long used, available;
+
++ used = ctx->lo & 0x3f;
+
+-/* These are the four functions used in the four steps of the MD5 algorithm
+- and defined in the RFC 1321. The first function is a little bit optimized
+- (as found in Colin Plumbs public domain implementation). */
+-/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+-#define FF(b, c, d) (d ^ (b & (c ^ d)))
+-#define FG(b, c, d) FF (d, b, c)
+-#define FH(b, c, d) (b ^ c ^ d)
+-#define FI(b, c, d) (c ^ (b | ~d))
++ ctx->buffer[used++] = 0x80;
+
+-/* Process LEN bytes of BUFFER, accumulating context into CTX.
+- It is assumed that LEN % 64 == 0. */
++ available = 64 - used;
+
+-static void
+-md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
+-{
+- const unsigned char *p = buffer;
+- const unsigned char *endp = p + len;
+- uint32_t A = ctx->A;
+- uint32_t B = ctx->B;
+- uint32_t C = ctx->C;
+- uint32_t D = ctx->D;
+-
+- /* First increment the byte count. RFC 1321 specifies the possible
+- length of the file up to 2^64 bits. Here we only compute the
+- number of bytes. */
+- ctx->total += len;
+-
+- /* Process all bytes in the buffer with 64 bytes in each round of
+- the loop. */
+- while (p < endp)
+- {
+- uint32_t *cwp = ctx->correct_words;
+- uint32_t A_save = A;
+- uint32_t B_save = B;
+- uint32_t C_save = C;
+- uint32_t D_save = D;
+-
+- /* First round: using the given function, the context and a constant
+- the next context is computed. Because the algorithms processing
+- unit is a 32-bit word and it is determined to work on words in
+- little endian byte order we perhaps have to change the byte order
+- before the computation. To reduce the work for the next steps
+- we store the swapped words in the array CORRECT_WORDS. */
+-
+-#define OP(a, b, c, d, s, T) \
+- do \
+- { \
+- uint32_t word = le32_to_cpu (p); \
+- p += 4; \
+- *cwp++ = word; \
+- a += FF (b, c, d) + word + T; \
+- CYCLIC (a, s); \
+- a += b; \
+- } \
+- while (0)
+-
+- /* It is unfortunate that C does not provide an operator for
+- cyclic rotation. Hope the C compiler is smart enough. */
+-#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
+-
+- /* Before we start, one word to the strange constants.
+- They are defined in RFC 1321 as
+-
+- T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+- */
+-
+- /* Round 1. */
+- OP (A, B, C, D, 7, 0xd76aa478);
+- OP (D, A, B, C, 12, 0xe8c7b756);
+- OP (C, D, A, B, 17, 0x242070db);
+- OP (B, C, D, A, 22, 0xc1bdceee);
+- OP (A, B, C, D, 7, 0xf57c0faf);
+- OP (D, A, B, C, 12, 0x4787c62a);
+- OP (C, D, A, B, 17, 0xa8304613);
+- OP (B, C, D, A, 22, 0xfd469501);
+- OP (A, B, C, D, 7, 0x698098d8);
+- OP (D, A, B, C, 12, 0x8b44f7af);
+- OP (C, D, A, B, 17, 0xffff5bb1);
+- OP (B, C, D, A, 22, 0x895cd7be);
+- OP (A, B, C, D, 7, 0x6b901122);
+- OP (D, A, B, C, 12, 0xfd987193);
+- OP (C, D, A, B, 17, 0xa679438e);
+- OP (B, C, D, A, 22, 0x49b40821);
+-
+- /* For the second to fourth round we have the possibly swapped words
+- in CORRECT_WORDS. Redefine the macro to take an additional first
+- argument specifying the function to use. */
+-#undef OP
+-#define OP(f, a, b, c, d, k, s, T) \
+- do \
+- { \
+- a += f (b, c, d) + ctx->correct_words[k] + T; \
+- CYCLIC (a, s); \
+- a += b; \
+- } \
+- while (0)
+-
+- /* Round 2. */
+- OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+- OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+- OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+- OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+- OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+- OP (FG, D, A, B, C, 10, 9, 0x02441453);
+- OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+- OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+- OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+- OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+- OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+- OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+- OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+- OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+- OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+- OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+-
+- /* Round 3. */
+- OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+- OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+- OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+- OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+- OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+- OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+- OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+- OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+- OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+- OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+- OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+- OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+- OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+- OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+- OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+- OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+-
+- /* Round 4. */
+- OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+- OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+- OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+- OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+- OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+- OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+- OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+- OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+- OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+- OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+- OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+- OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+- OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+- OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+- OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+- OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+-
+- /* Add the starting values of the context. */
+- A += A_save;
+- B += B_save;
+- C += C_save;
+- D += D_save;
+- }
+-
+- /* Put checksum in context given as argument. */
+- ctx->A = A;
+- ctx->B = B;
+- ctx->C = C;
+- ctx->D = D;
++ if (available < 8) {
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available);
++ body(ctx, ctx->buffer, 64);
++ used = 0;
++ available = 64;
++ }
++
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available - 8);
++
++ ctx->lo <<= 3;
++ OUT(&ctx->buffer[56], ctx->lo)
++ OUT(&ctx->buffer[60], ctx->hi)
++
++ body(ctx, ctx->buffer, 64);
++
++ OUT(&result[0], ctx->a)
++ OUT(&result[4], ctx->b)
++ OUT(&result[8], ctx->c)
++ OUT(&result[12], ctx->d)
++
++ XCRYPT_SECURE_MEMSET(ctx, sizeof(*ctx));
+ }
+
+ #endif
+diff --git a/alg-md5.h b/alg-md5.h
+index a56aba9..1947eb3 100644
+--- a/alg-md5.h
++++ b/alg-md5.h
+@@ -1,52 +1,43 @@
+-/* Declaration of functions and data types used for MD5 sum computing
+- library functions.
+-
+- Copyright (C) 1995-2017 Free Software Foundation, Inc.
+-
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
+-
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
+-
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
++/*
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD5 Message-Digest Algorithm (RFC 1321).
++ *
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
++ *
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
++ *
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * See md5.c for more information.
++ */
+
+ #ifndef _CRYPT_ALG_MD5_H
+ #define _CRYPT_ALG_MD5_H 1
+
+-/* Structure to save state of computation between the single steps. */
+-struct md5_ctx
+-{
+- uint32_t A;
+- uint32_t B;
+- uint32_t C;
+- uint32_t D;
+-
+- uint64_t total;
+- uint32_t buflen;
+- uint32_t correct_words[16];
+- unsigned char buffer[128];
+-};
+-
+-/* Initialize structure containing state of computation.
+- (RFC 1321, 3.3: Step 3) */
+-extern void md5_init_ctx (struct md5_ctx *ctx);
++/* Any 32-bit or wider unsigned integer data type will do */
++typedef uint32_t MD5_u32plus;
+
+-/* Starting with the result of former calls of this function (or the
+- initialization function) update the context for the next LEN bytes
+- starting at BUFFER. LEN does not need to be a multiple of 64. */
+-extern void md5_process_bytes (const void *buffer, size_t len,
+- struct md5_ctx *ctx);
++typedef struct {
++ MD5_u32plus lo, hi;
++ MD5_u32plus a, b, c, d;
++ uint8_t buffer[64];
++ MD5_u32plus block[16];
++} MD5_CTX;
+
+-/* Process the remaining bytes in the buffer and write the finalized
+- hash to RESBUF, which should point to 16 bytes of storage. All
+- data written to CTX is erased before returning from the function. */
+-extern void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf);
++extern void MD5_Init(MD5_CTX *ctx);
++extern void MD5_Update(MD5_CTX *ctx, const void *data, size_t size);
++extern void MD5_Final(uint8_t result[16], MD5_CTX *ctx);
+
+ #endif /* alg-md5.h */
+diff --git a/crypt-md5.c b/crypt-md5.c
+index f64b6fc..108c31c 100644
+--- a/crypt-md5.c
++++ b/crypt-md5.c
+@@ -50,7 +50,7 @@ static_assert (MD5_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,
+ /* An md5_buffer holds all of the sensitive intermediate data. */
+ struct md5_buffer
+ {
+- struct md5_ctx ctx;
++ MD5_CTX ctx;
+ uint8_t result[16];
+ };
+
+@@ -74,7 +74,7 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+ }
+
+ struct md5_buffer *buf = scratch;
+- struct md5_ctx *ctx = &buf->ctx;
++ MD5_CTX *ctx = &buf->ctx;
+ uint8_t *result = buf->result;
+ char *cp = (char *)output;
+ const char *salt = setting;
+@@ -99,40 +99,40 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+
+ /* Compute alternate MD5 sum with input PHRASE, SALT, and PHRASE. The
+ final result will be added to the first context. */
+- md5_init_ctx (ctx);
++ MD5_Init (ctx);
+
+ /* Add phrase. */
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Add salt. */
+- md5_process_bytes (salt, salt_size, ctx);
++ MD5_Update (ctx, salt, salt_size);
+
+ /* Add phrase again. */
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Now get result of this (16 bytes). */
+- md5_finish_ctx (ctx, result);
++ MD5_Final (result, ctx);
+
+ /* Prepare for the real work. */
+- md5_init_ctx (ctx);
++ MD5_Init (ctx);
+
+ /* Add the phrase string. */
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Because the SALT argument need not always have the salt prefix we
+ add it separately. */
+- md5_process_bytes (md5_salt_prefix, sizeof (md5_salt_prefix) - 1, ctx);
++ MD5_Update (ctx, md5_salt_prefix, sizeof (md5_salt_prefix) - 1);
+
+ /* The last part is the salt string. This must be at most 8
+ characters and it ends at the first `$' character (for
+ compatibility with existing implementations). */
+- md5_process_bytes (salt, salt_size, ctx);
++ MD5_Update (ctx, salt, salt_size);
+
+
+ /* Add for any character in the phrase one byte of the alternate sum. */
+ for (cnt = phr_size; cnt > 16; cnt -= 16)
+- md5_process_bytes (result, 16, ctx);
+- md5_process_bytes (result, cnt, ctx);
++ MD5_Update (ctx, result, 16);
++ MD5_Update (ctx, result, cnt);
+
+ /* For the following code we need a NUL byte. */
+ *result = '\0';
+@@ -142,11 +142,10 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+ bit the first character of the phrase. This does not seem to be
+ what was intended but we have to follow this to be compatible. */
+ for (cnt = phr_size; cnt > 0; cnt >>= 1)
+- md5_process_bytes ((cnt & 1) != 0 ? (const char *) result : phrase, 1,
+- ctx);
++ MD5_Update (ctx, (cnt & 1) != 0 ? (const char *) result : phrase, 1);
+
+ /* Create intermediate result. */
+- md5_finish_ctx (ctx, result);
++ MD5_Final (result, ctx);
+
+ /* Now comes another weirdness. In fear of password crackers here
+ comes a quite long loop which just processes the output of the
+@@ -154,30 +153,30 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+ for (cnt = 0; cnt < 1000; ++cnt)
+ {
+ /* New context. */
+- md5_init_ctx (ctx);
++ MD5_Init (ctx);
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+ else
+- md5_process_bytes (result, 16, ctx);
++ MD5_Update (ctx, result, 16);
+
+ /* Add salt for numbers not divisible by 3. */
+ if (cnt % 3 != 0)
+- md5_process_bytes (salt, salt_size, ctx);
++ MD5_Update (ctx, salt, salt_size);
+
+ /* Add phrase for numbers not divisible by 7. */
+ if (cnt % 7 != 0)
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+- md5_process_bytes (result, 16, ctx);
++ MD5_Update (ctx, result, 16);
+ else
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Create intermediate result. */
+- md5_finish_ctx (ctx, result);
++ MD5_Final (result, ctx);
+ }
+
+ /* Now we can construct the result string. It consists of three
+diff --git a/crypt-port.h b/crypt-port.h
+index a2c64b3..2571c94 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -247,9 +247,9 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #endif
+
+ #if INCLUDE_md5 || INCLUDE_sunmd5
+-#define md5_finish_ctx _crypt_md5_finish_ctx
+-#define md5_init_ctx _crypt_md5_init_ctx
+-#define md5_process_bytes _crypt_md5_process_bytes
++#define MD5_Init _crypt_MD5_Init
++#define MD5_Update _crypt_MD5_Update
++#define MD5_Final _crypt_MD5_Final
+ #endif
+
+ #if INCLUDE_sha1
+diff --git a/crypt-sunmd5.c b/crypt-sunmd5.c
+index 9f76ed1..7a30aae 100644
+--- a/crypt-sunmd5.c
++++ b/crypt-sunmd5.c
+@@ -165,7 +165,7 @@ crypt_sunmd5_rn (const char *phrase, size_t phr_size,
+ {
+ struct crypt_sunmd5_scratch
+ {
+- struct md5_ctx ctx;
++ MD5_CTX ctx;
+ uint8_t dg[16];
+ char rn[16];
+ };
+@@ -238,27 +238,27 @@ crypt_sunmd5_rn (const char *phrase, size_t phr_size,
+ struct crypt_sunmd5_scratch *s = scratch;
+
+ /* Initial round. */
+- md5_init_ctx (&s->ctx);
+- md5_process_bytes (phrase, phr_size, &s->ctx);
+- md5_process_bytes (setting, saltlen, &s->ctx);
+- md5_finish_ctx (&s->ctx, s->dg);
++ MD5_Init (&s->ctx);
++ MD5_Update (&s->ctx, phrase, phr_size);
++ MD5_Update (&s->ctx, setting, saltlen);
++ MD5_Final (s->dg, &s->ctx);
+
+ /* Stretching rounds. */
+ for (unsigned int i = 0; i < nrounds; i++)
+ {
+- md5_init_ctx (&s->ctx);
++ MD5_Init (&s->ctx);
+
+- md5_process_bytes (s->dg, sizeof s->dg, &s->ctx);
++ MD5_Update (&s->ctx, s->dg, sizeof s->dg);
+
+ /* The trailing nul is intentionally included. */
+ if (muffet_coin_toss (s->dg, i))
+- md5_process_bytes (hamlet_quotation, sizeof hamlet_quotation, &s->ctx);
++ MD5_Update (&s->ctx, hamlet_quotation, sizeof hamlet_quotation);
+
+ int nwritten = snprintf (s->rn, sizeof s->rn, "%u", i);
+ assert (nwritten >= 1 && (unsigned int)nwritten + 1 <= sizeof s->rn);
+- md5_process_bytes (s->rn, (unsigned int)nwritten, &s->ctx);
++ MD5_Update (&s->ctx, s->rn, (unsigned int)nwritten);
+
+- md5_finish_ctx (&s->ctx, s->dg);
++ MD5_Final (s->dg, &s->ctx);
+ }
+
+ memcpy (output, setting, saltlen);
+diff --git a/test-alg-md5.c b/test-alg-md5.c
+index dabc6ba..21c4309 100644
+--- a/test-alg-md5.c
++++ b/test-alg-md5.c
+@@ -52,7 +52,7 @@ static const struct
+
+ static void
+ report_failure(int n, const char *tag,
+- const char expected[16], const char actual[16])
++ const char expected[16], uint8_t actual[16])
+ {
+ int i;
+ printf ("FAIL: test %d (%s):\n exp:", n, tag);
+@@ -76,27 +76,27 @@ report_failure(int n, const char *tag,
+ int
+ main (void)
+ {
+- struct md5_ctx ctx;
+- char sum[16];
++ MD5_CTX ctx;
++ uint8_t sum[16];
+ int result = 0;
+ int cnt;
+ int i;
+
+ for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)
+ {
+- md5_init_ctx (&ctx);
+- md5_process_bytes (tests[cnt].input, strlen (tests[cnt].input), &ctx);
+- md5_finish_ctx (&ctx, sum);
++ MD5_Init (&ctx);
++ MD5_Update (&ctx, tests[cnt].input, strlen (tests[cnt].input));
++ MD5_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "all at once", tests[cnt].result, sum);
+ result = 1;
+ }
+
+- md5_init_ctx (&ctx);
++ MD5_Init (&ctx);
+ for (i = 0; tests[cnt].input[i] != '\0'; ++i)
+- md5_process_bytes (&tests[cnt].input[i], 1, &ctx);
+- md5_finish_ctx (&ctx, sum);
++ MD5_Update (&ctx, &tests[cnt].input[i], 1);
++ MD5_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "byte by byte", tests[cnt].result, sum);
+@@ -108,10 +108,10 @@ main (void)
+ <https://www.nist.gov/itl/ssd/software-quality-group/nsrl-test-data>. */
+ char buf[1000];
+ memset (buf, 'a', sizeof (buf));
+- md5_init_ctx (&ctx);
++ MD5_Init (&ctx);
+ for (i = 0; i < 1000; ++i)
+- md5_process_bytes (buf, sizeof (buf), &ctx);
+- md5_finish_ctx (&ctx, sum);
++ MD5_Update (&ctx, buf, sizeof (buf));
++ MD5_Final (sum, &ctx);
+ static const char expected[64] =
+ "\x77\x07\xd6\xae\x4e\x02\x7c\x70\xee\xa2\xa9\x35\xc2\x29\x6f\x21";
+ if (memcmp (expected, sum, 16) != 0)
+
+From 6fcd7eb3324b67b22b39626cf587013437707efc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 14:16:22 +0200
+Subject: [PATCH 11/17] Use unmodified md4 implementation from Alexander
+ Peslyak.
+
+---
+ alg-md4.c | 428 +++++++++++++++++++++++++------------------------
+ alg-md4.h | 61 +++----
+ crypt-nthash.c | 24 +--
+ crypt-port.h | 6 +-
+ test-alg-md4.c | 18 +--
+ 5 files changed, 278 insertions(+), 259 deletions(-)
+
+diff --git a/alg-md4.c b/alg-md4.c
+index c1c4075..482b6f4 100644
+--- a/alg-md4.c
++++ b/alg-md4.c
+@@ -1,256 +1,270 @@
+ /*
+- * MD4 (RFC-1320) message digest.
+- * Modified from MD5 code by Andrey Panin <pazke(a)donpac.ru>
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD4 Message-Digest Algorithm (RFC 1320).
+ *
+- * Written by Solar Designer <solar(a)openwall.com> in 2001, and placed in
+- * the public domain. There's absolutely no warranty.
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
+ *
+- * This differs from Colin Plumb's older public domain implementation in
+- * that no 32-bit integer data type is required, there's no compile-time
+- * endianness configuration.
+- * The primary goals are portability and ease of use.
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
+ *
+- * This implementation is meant to be fast, but not as fast as possible.
+- * Some known optimizations are not included to reduce source code size
+- * and avoid compile-time configuration.
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * (This is a heavily cut-down "BSD license".)
++ *
++ * This differs from Colin Plumb's older public domain implementation in that
++ * no exactly 32-bit integer data type is required (any 32-bit or wider
++ * unsigned integer data type will do), there's no compile-time endianness
++ * configuration, and the function prototypes match OpenSSL's. No code from
++ * Colin Plumb's implementation has been reused; this comment merely compares
++ * the properties of the two independent implementations.
++ *
++ * The primary goals of this implementation are portability and ease of use.
++ * It is meant to be fast, but not as fast as possible. Some known
++ * optimizations are not included to reduce source code size and avoid
++ * compile-time configuration.
+ */
+
+ #include "crypt-port.h"
+-#include "alg-md4.h"
+-#include "byteorder.h"
+
+ #if INCLUDE_nthash
+
++#include "alg-md4.h"
++
+ /*
+ * The basic MD4 functions.
++ *
++ * F and G are optimized compared to their RFC 1320 definitions, with the
++ * optimization for F borrowed from Colin Plumb's MD5 implementation.
+ */
+-#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
+-#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
+-#define H(x, y, z) ((x) ^ (y) ^ (z))
++#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
++#define G(x, y, z) (((x) & ((y) | (z))) | ((y) & (z)))
++#define H(x, y, z) ((x) ^ (y) ^ (z))
+
+ /*
+- * The MD4 transformation for all four rounds.
++ * The MD4 transformation for all three rounds.
+ */
+ #define STEP(f, a, b, c, d, x, s) \
+- (a) += f((b), (c), (d)) + (x); \
+- (a) = ((a) << (s)) | ((a) >> (32 - (s)))
++ (a) += f((b), (c), (d)) + (x); \
++ (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s))));
+
+ /*
+- * SET reads 4 input bytes in little-endian byte order and stores them
+- * in a properly aligned word in host byte order.
++ * SET reads 4 input bytes in little-endian byte order and stores them in a
++ * properly aligned word in host byte order.
+ *
+- * The check for little-endian architectures which tolerate unaligned
+- * memory accesses is just an optimization. Nothing will break if it
+- * doesn't work.
++ * The check for little-endian architectures that tolerate unaligned memory
++ * accesses is just an optimization. Nothing will break if it fails to detect
++ * a suitable architecture.
++ *
++ * Unfortunately, this optimization may be a C strict aliasing rules violation
++ * if the caller's data buffer has effective type that cannot be aliased by
++ * MD4_u32plus. In practice, this problem may occur if these MD4 routines are
++ * inlined into a calling function, or with future and dangerously advanced
++ * link-time optimizations. For the time being, keeping these MD4 routines in
++ * their own translation unit avoids the problem.
+ */
++#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#define SET(n) \
++ (*(const MD4_u32plus *)&ptr[(n) * 4])
++#define GET(n) \
++ SET(n)
++#else
+ #define SET(n) \
+- (ctx->block[(n)] = le32_to_cpu (&ptr[(n) * 4]))
++ (ctx->block[(n)] = \
++ (MD4_u32plus)ptr[(n) * 4] | \
++ ((MD4_u32plus)ptr[(n) * 4 + 1] << 8) | \
++ ((MD4_u32plus)ptr[(n) * 4 + 2] << 16) | \
++ ((MD4_u32plus)ptr[(n) * 4 + 3] << 24))
+ #define GET(n) \
+- (ctx->block[(n)])
++ (ctx->block[(n)])
++#endif
+
+ /*
+- * This processes one or more 64-byte data blocks, but does NOT update
+- * the bit counters. There're no alignment requirements.
++ * This processes one or more 64-byte data blocks, but does NOT update the bit
++ * counters. There are no alignment requirements.
+ */
+-static const unsigned char *
+-body (struct md4_ctx *ctx, const unsigned char *data, size_t size)
++static const void *body(MD4_CTX *ctx, const void *data, unsigned long size)
+ {
+- const unsigned char *ptr;
+- uint32_t a, b, c, d;
+- uint32_t saved_a, saved_b, saved_c, saved_d;
+-
+- ptr = data;
+-
+- a = ctx->a;
+- b = ctx->b;
+- c = ctx->c;
+- d = ctx->d;
+-
+- do
+- {
+- saved_a = a;
+- saved_b = b;
+- saved_c = c;
+- saved_d = d;
+-
+- /* Round 1 */
+- STEP(F, a, b, c, d, SET( 0), 3);
+- STEP(F, d, a, b, c, SET( 1), 7);
+- STEP(F, c, d, a, b, SET( 2), 11);
+- STEP(F, b, c, d, a, SET( 3), 19);
+-
+- STEP(F, a, b, c, d, SET( 4), 3);
+- STEP(F, d, a, b, c, SET( 5), 7);
+- STEP(F, c, d, a, b, SET( 6), 11);
+- STEP(F, b, c, d, a, SET( 7), 19);
+-
+- STEP(F, a, b, c, d, SET( 8), 3);
+- STEP(F, d, a, b, c, SET( 9), 7);
+- STEP(F, c, d, a, b, SET(10), 11);
+- STEP(F, b, c, d, a, SET(11), 19);
+-
+- STEP(F, a, b, c, d, SET(12), 3);
+- STEP(F, d, a, b, c, SET(13), 7);
+- STEP(F, c, d, a, b, SET(14), 11);
+- STEP(F, b, c, d, a, SET(15), 19);
+-
+- /* Round 2 */
+- STEP(G, a, b, c, d, GET( 0) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 4) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET( 8) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(12) + 0x5A827999, 13);
+-
+- STEP(G, a, b, c, d, GET( 1) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 5) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET( 9) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(13) + 0x5A827999, 13);
+-
+- STEP(G, a, b, c, d, GET( 2) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 6) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET(10) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(14) + 0x5A827999, 13);
+-
+- STEP(G, a, b, c, d, GET( 3) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 7) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET(11) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(15) + 0x5A827999, 13);
+-
+- /* Round 3 */
+- STEP(H, a, b, c, d, GET( 0) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET( 8) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 4) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(12) + 0x6ED9EBA1, 15);
+-
+- STEP(H, a, b, c, d, GET( 2) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET(10) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 6) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(14) + 0x6ED9EBA1, 15);
+-
+- STEP(H, a, b, c, d, GET( 1) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET( 9) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 5) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(13) + 0x6ED9EBA1, 15);
+-
+- STEP(H, a, b, c, d, GET( 3) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET(11) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 7) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(15) + 0x6ED9EBA1, 15);
+-
+- a += saved_a;
+- b += saved_b;
+- c += saved_c;
+- d += saved_d;
+-
+- ptr += 64;
+- }
+- while (size -= 64);
+-
+- ctx->a = a;
+- ctx->b = b;
+- ctx->c = c;
+- ctx->d = d;
+-
+- return ptr;
++ const unsigned char *ptr;
++ MD4_u32plus a, b, c, d;
++ MD4_u32plus saved_a, saved_b, saved_c, saved_d;
++ const MD4_u32plus ac1 = 0x5a827999, ac2 = 0x6ed9eba1;
++
++ ptr = (const unsigned char *)data;
++
++ a = ctx->a;
++ b = ctx->b;
++ c = ctx->c;
++ d = ctx->d;
++
++ do {
++ saved_a = a;
++ saved_b = b;
++ saved_c = c;
++ saved_d = d;
++
++/* Round 1 */
++ STEP(F, a, b, c, d, SET(0), 3)
++ STEP(F, d, a, b, c, SET(1), 7)
++ STEP(F, c, d, a, b, SET(2), 11)
++ STEP(F, b, c, d, a, SET(3), 19)
++ STEP(F, a, b, c, d, SET(4), 3)
++ STEP(F, d, a, b, c, SET(5), 7)
++ STEP(F, c, d, a, b, SET(6), 11)
++ STEP(F, b, c, d, a, SET(7), 19)
++ STEP(F, a, b, c, d, SET(8), 3)
++ STEP(F, d, a, b, c, SET(9), 7)
++ STEP(F, c, d, a, b, SET(10), 11)
++ STEP(F, b, c, d, a, SET(11), 19)
++ STEP(F, a, b, c, d, SET(12), 3)
++ STEP(F, d, a, b, c, SET(13), 7)
++ STEP(F, c, d, a, b, SET(14), 11)
++ STEP(F, b, c, d, a, SET(15), 19)
++
++/* Round 2 */
++ STEP(G, a, b, c, d, GET(0) + ac1, 3)
++ STEP(G, d, a, b, c, GET(4) + ac1, 5)
++ STEP(G, c, d, a, b, GET(8) + ac1, 9)
++ STEP(G, b, c, d, a, GET(12) + ac1, 13)
++ STEP(G, a, b, c, d, GET(1) + ac1, 3)
++ STEP(G, d, a, b, c, GET(5) + ac1, 5)
++ STEP(G, c, d, a, b, GET(9) + ac1, 9)
++ STEP(G, b, c, d, a, GET(13) + ac1, 13)
++ STEP(G, a, b, c, d, GET(2) + ac1, 3)
++ STEP(G, d, a, b, c, GET(6) + ac1, 5)
++ STEP(G, c, d, a, b, GET(10) + ac1, 9)
++ STEP(G, b, c, d, a, GET(14) + ac1, 13)
++ STEP(G, a, b, c, d, GET(3) + ac1, 3)
++ STEP(G, d, a, b, c, GET(7) + ac1, 5)
++ STEP(G, c, d, a, b, GET(11) + ac1, 9)
++ STEP(G, b, c, d, a, GET(15) + ac1, 13)
++
++/* Round 3 */
++ STEP(H, a, b, c, d, GET(0) + ac2, 3)
++ STEP(H, d, a, b, c, GET(8) + ac2, 9)
++ STEP(H, c, d, a, b, GET(4) + ac2, 11)
++ STEP(H, b, c, d, a, GET(12) + ac2, 15)
++ STEP(H, a, b, c, d, GET(2) + ac2, 3)
++ STEP(H, d, a, b, c, GET(10) + ac2, 9)
++ STEP(H, c, d, a, b, GET(6) + ac2, 11)
++ STEP(H, b, c, d, a, GET(14) + ac2, 15)
++ STEP(H, a, b, c, d, GET(1) + ac2, 3)
++ STEP(H, d, a, b, c, GET(9) + ac2, 9)
++ STEP(H, c, d, a, b, GET(5) + ac2, 11)
++ STEP(H, b, c, d, a, GET(13) + ac2, 15)
++ STEP(H, a, b, c, d, GET(3) + ac2, 3)
++ STEP(H, d, a, b, c, GET(11) + ac2, 9)
++ STEP(H, c, d, a, b, GET(7) + ac2, 11)
++ STEP(H, b, c, d, a, GET(15) + ac2, 15)
++
++ a += saved_a;
++ b += saved_b;
++ c += saved_c;
++ d += saved_d;
++
++ ptr += 64;
++ } while (size -= 64);
++
++ ctx->a = a;
++ ctx->b = b;
++ ctx->c = c;
++ ctx->d = d;
++
++ return ptr;
+ }
+
+-/* Put result from CTX in first 16 bytes following RESBUF. The result
+- will be in little endian byte order. */
+-static void *
+-md4_read_ctx (struct md4_ctx *ctx, void *resbuf)
++void MD4_Init(MD4_CTX *ctx)
+ {
+- unsigned char *buf = resbuf;
+- cpu_to_le32 (buf + 0, ctx->a);
+- cpu_to_le32 (buf + 4, ctx->b);
+- cpu_to_le32 (buf + 8, ctx->c);
+- cpu_to_le32 (buf + 12, ctx->d);
+- XCRYPT_SECURE_MEMSET (ctx, sizeof(struct md4_ctx));
+- return resbuf;
++ ctx->a = 0x67452301;
++ ctx->b = 0xefcdab89;
++ ctx->c = 0x98badcfe;
++ ctx->d = 0x10325476;
++
++ ctx->lo = 0;
++ ctx->hi = 0;
+ }
+
+-void
+-md4_init_ctx (struct md4_ctx *ctx)
++void MD4_Update(MD4_CTX *ctx, const void *data, size_t size)
+ {
+- ctx->a = 0x67452301;
+- ctx->b = 0xefcdab89;
+- ctx->c = 0x98badcfe;
+- ctx->d = 0x10325476;
++ MD4_u32plus saved_lo;
++ unsigned long used, available;
+
+- ctx->lo = 0;
+- ctx->hi = 0;
+-}
++ saved_lo = ctx->lo;
++ if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
++ ctx->hi++;
++ ctx->hi += (MD4_u32plus) size >> 29;
+
+-void
+-md4_process_bytes (const void *buffer, struct md4_ctx *ctx, size_t size)
+-{
+- uint32_t saved_lo;
+- size_t used, free;
+-
+- saved_lo = ctx->lo;
+- if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
+- ctx->hi++;
+- ctx->hi += (uint32_t)(size >> 29);
+-
+- used = saved_lo & 0x3f;
+-
+- if (used)
+- {
+- free = 64 - used;
+-
+- if (size < free)
+- {
+- memcpy(&ctx->buffer[used], buffer, size);
+- return;
+- }
+-
+- memcpy(&ctx->buffer[used], buffer, free);
+- buffer = (const unsigned char *) buffer + free;
+- size -= free;
+- body(ctx, ctx->buffer, 64);
+- }
+-
+- if (size >= 64)
+- {
+- buffer = body(ctx, buffer, size & ~(uint32_t)0x3f);
+- size &= 0x3f;
+- }
+-
+- memcpy(ctx->buffer, buffer, size);
++ used = saved_lo & 0x3f;
++
++ if (used) {
++ available = 64 - used;
++
++ if (size < available) {
++ memcpy(&ctx->buffer[used], data, size);
++ return;
++ }
++
++ memcpy(&ctx->buffer[used], data, available);
++ data = (const unsigned char *)data + available;
++ size -= available;
++ body(ctx, ctx->buffer, 64);
++ }
++
++ if (size >= 64) {
++ data = body(ctx, data, size & ~(unsigned long)0x3f);
++ size &= 0x3f;
++ }
++
++ memcpy(ctx->buffer, data, size);
+ }
+
+-void *
+-md4_finish_ctx (struct md4_ctx *ctx, void *resbuf)
++#define OUT(dst, src) \
++ (dst)[0] = (unsigned char)(src); \
++ (dst)[1] = (unsigned char)((src) >> 8); \
++ (dst)[2] = (unsigned char)((src) >> 16); \
++ (dst)[3] = (unsigned char)((src) >> 24);
++
++void MD4_Final(uint8_t result[16], MD4_CTX *ctx)
+ {
+- size_t used, free;
++ unsigned long used, available;
++
++ used = ctx->lo & 0x3f;
+
+- used = ctx->lo & 0x3f;
++ ctx->buffer[used++] = 0x80;
+
+- ctx->buffer[used++] = 0x80;
++ available = 64 - used;
+
+- free = 64 - used;
++ if (available < 8) {
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available);
++ body(ctx, ctx->buffer, 64);
++ used = 0;
++ available = 64;
++ }
+
+- if (free < 8)
+- {
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[used], free);
+- body(ctx, ctx->buffer, 64);
+- used = 0;
+- free = 64;
+- }
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available - 8);
+
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[used], free - 8);
++ ctx->lo <<= 3;
++ OUT(&ctx->buffer[56], ctx->lo)
++ OUT(&ctx->buffer[60], ctx->hi)
+
+- ctx->lo <<= 3;
+- ctx->buffer[56] = (unsigned char)((ctx->lo) & 0xff);
+- ctx->buffer[57] = (unsigned char)((ctx->lo >> 8) & 0xff);
+- ctx->buffer[58] = (unsigned char)((ctx->lo >> 16) & 0xff);
+- ctx->buffer[59] = (unsigned char)((ctx->lo >> 24) & 0xff);
+- ctx->buffer[60] = (unsigned char)((ctx->hi) & 0xff);
+- ctx->buffer[61] = (unsigned char)((ctx->hi >> 8) & 0xff);
+- ctx->buffer[62] = (unsigned char)((ctx->hi >> 16) & 0xff);
+- ctx->buffer[63] = (unsigned char)((ctx->hi >> 24) & 0xff);
++ body(ctx, ctx->buffer, 64);
+
+- body(ctx, ctx->buffer, 64);
++ OUT(&result[0], ctx->a)
++ OUT(&result[4], ctx->b)
++ OUT(&result[8], ctx->c)
++ OUT(&result[12], ctx->d)
+
+- return md4_read_ctx (ctx, resbuf);
++ XCRYPT_SECURE_MEMSET(ctx, sizeof(*ctx));
+ }
+
+ #endif
+diff --git a/alg-md4.h b/alg-md4.h
+index 4c3e29c..473930e 100644
+--- a/alg-md4.h
++++ b/alg-md4.h
+@@ -1,38 +1,43 @@
+ /*
+- * This is an implementation of the RSA Data Security, Inc.
+- * MD4 Message-Digest Algorithm.
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD4 Message-Digest Algorithm (RFC 1320).
+ *
+- * Written by Solar Designer <solar(a)openwall.com> in 2001, and placed in
+- * the public domain. See md4.c for more information.
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
++ *
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
++ *
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * See md4.c for more information.
+ */
+
+ #ifndef _CRYPT_ALG_MD4_H
+ #define _CRYPT_ALG_MD4_H 1
+
+-#include <stddef.h>
+-#include <stdint.h>
+-
+-/* Structure to save state of computation between the single steps. */
+-struct md4_ctx
+-{
+- uint32_t lo, hi;
+- uint32_t a, b, c, d;
+- unsigned char buffer[64];
+- uint32_t block[16];
+-};
+-
+-/* Initialize structure containing state of computation.
+- (RFC 1320, 3.3: Step 3) */
+-extern void md4_init_ctx (struct md4_ctx *ctx);
++/* Any 32-bit or wider unsigned integer data type will do */
++typedef uint32_t MD4_u32plus;
+
+-/* Starting with the result of former calls of this function (or the
+- initialization function) update the context for the next LEN bytes
+- starting at BUFFER. LEN does not need to be a multiple of 64. */
+-extern void md4_process_bytes (const void *buffer, struct md4_ctx *ctx, size_t size);
++typedef struct {
++ MD4_u32plus lo, hi;
++ MD4_u32plus a, b, c, d;
++ uint8_t buffer[64];
++ MD4_u32plus block[16];
++} MD4_CTX;
+
+-/* Process the remaining bytes in the buffer and write the finalized
+- hash to RESBUF, which should point to 16 bytes of storage. All
+- data written to CTX is erased before returning from the function. */
+-extern void *md4_finish_ctx (struct md4_ctx *ctx, void *resbuf);
++extern void MD4_Init(MD4_CTX *ctx);
++extern void MD4_Update(MD4_CTX *ctx, const void *data, size_t size);
++extern void MD4_Final(uint8_t result[16], MD4_CTX *ctx);
+
+-#endif
++#endif /* alg-md4.h */
+diff --git a/crypt-nthash.c b/crypt-nthash.c
+index 5a715de..db6f17e 100644
+--- a/crypt-nthash.c
++++ b/crypt-nthash.c
+@@ -61,10 +61,10 @@ crypt_nthash_rn (const char *phrase, size_t ARG_UNUSED (phr_size),
+ uint16_t unipw[128];
+ unsigned char hash[16];
+ const char *s;
+- struct md4_ctx *ctx = scratch;
++ MD4_CTX *ctx = scratch;
+
+ if ((out_size < 4 + 32) ||
+- (scr_size < sizeof (struct md4_ctx)))
++ (scr_size < sizeof (MD4_CTX)))
+ {
+ errno = ERANGE;
+ return;
+@@ -83,9 +83,9 @@ crypt_nthash_rn (const char *phrase, size_t ARG_UNUSED (phr_size),
+ unipw[unipwLen++] = htons((uint16_t)(*s << 8));
+
+ /* Compute MD4 of Unicode password */
+- md4_init_ctx (ctx);
+- md4_process_bytes ((unsigned char *)unipw, ctx, unipwLen*sizeof(uint16_t));
+- md4_finish_ctx (ctx, hash);
++ MD4_Init (ctx);
++ MD4_Update (ctx, unipw, unipwLen*sizeof(uint16_t));
++ MD4_Final (hash, ctx);
+
+ output = (uint8_t *)stpcpy ((char *)output, magic);
+ *output++ = '$';
+@@ -111,7 +111,7 @@ gensalt_nthash_rn (unsigned long count,
+ size_t o_size)
+ {
+ static const char *salt = "$3$__not_used__";
+- struct md4_ctx ctx;
++ MD4_CTX ctx;
+ unsigned char hashbuf[16];
+ char hashstr[14 + 1];
+ unsigned long i;
+@@ -131,15 +131,15 @@ gensalt_nthash_rn (unsigned long count,
+ return;
+ }
+
+- md4_init_ctx (&ctx);
++ MD4_Init (&ctx);
+ for (i = 0; i < 20; i++)
+ {
+- md4_process_bytes (salt, &ctx, (i % 15) + 1);
+- md4_process_bytes (rbytes, &ctx, nrbytes);
+- md4_process_bytes (salt, &ctx, 15);
+- md4_process_bytes (salt, &ctx, 15 - (i % 15));
++ MD4_Update (&ctx, salt, (i % 15) + 1);
++ MD4_Update (&ctx, rbytes, nrbytes);
++ MD4_Update (&ctx, salt, 15);
++ MD4_Update (&ctx, salt, 15 - (i % 15));
+ }
+- md4_finish_ctx (&ctx, &hashbuf);
++ MD4_Final (hashbuf, &ctx);
+
+ for (i = 0; i < 7; i++)
+ sprintf (&(hashstr[i * 2]), "%02x", hashbuf[i]);
+diff --git a/crypt-port.h b/crypt-port.h
+index 2571c94..fa30e8e 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -241,9 +241,9 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #endif
+
+ #if INCLUDE_nthash
+-#define md4_finish_ctx _crypt_md4_finish_ctx
+-#define md4_init_ctx _crypt_md4_init_ctx
+-#define md4_process_bytes _crypt_md4_process_bytes
++#define MD4_Init _crypt_MD4_Init
++#define MD4_Update _crypt_MD4_Update
++#define MD4_Final _crypt_MD4_Final
+ #endif
+
+ #if INCLUDE_md5 || INCLUDE_sunmd5
+diff --git a/test-alg-md4.c b/test-alg-md4.c
+index 1b1b828..595e0bb 100644
+--- a/test-alg-md4.c
++++ b/test-alg-md4.c
+@@ -45,7 +45,7 @@ static const struct
+
+ static void
+ report_failure(int n, const char *tag,
+- const char expected[16], const char actual[16])
++ const char expected[16], uint8_t actual[16])
+ {
+ int i;
+ printf ("FAIL: test %d (%s):\n exp:", n, tag);
+@@ -69,27 +69,27 @@ report_failure(int n, const char *tag,
+ int
+ main (void)
+ {
+- struct md4_ctx ctx;
+- char sum[16];
++ MD4_CTX ctx;
++ uint8_t sum[16];
+ int result = 0;
+ int cnt;
+ int i;
+
+ for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)
+ {
+- md4_init_ctx (&ctx);
+- md4_process_bytes ((const unsigned char*)tests[cnt].input, &ctx, strlen (tests[cnt].input));
+- md4_finish_ctx (&ctx, (unsigned char*)sum);
++ MD4_Init (&ctx);
++ MD4_Update (&ctx, tests[cnt].input, strlen (tests[cnt].input));
++ MD4_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "all at once", tests[cnt].result, sum);
+ result = 1;
+ }
+
+- md4_init_ctx (&ctx);
++ MD4_Init (&ctx);
+ for (i = 0; tests[cnt].input[i] != '\0'; ++i)
+- md4_process_bytes ((const unsigned char*)&tests[cnt].input[i], &ctx, 1);
+- md4_finish_ctx (&ctx, (unsigned char*)sum);
++ MD4_Update (&ctx, &tests[cnt].input[i], 1);
++ MD4_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "byte by byte", tests[cnt].result, sum);
+
+From 6fc8102f7727f8e4115a87070d2e4a36b55ea1bc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 19:51:57 +0200
+Subject: [PATCH 12/17] Fix -Wcast-align.
+
+---
+ alg-md4.c | 2 +-
+ alg-md5.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/alg-md4.c b/alg-md4.c
+index 482b6f4..a6e1072 100644
+--- a/alg-md4.c
++++ b/alg-md4.c
+@@ -73,7 +73,7 @@
+ * link-time optimizations. For the time being, keeping these MD4 routines in
+ * their own translation unit avoids the problem.
+ */
+-#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#if 0 /* defined(__i386__) || defined(__x86_64__) || defined(__vax__) */
+ #define SET(n) \
+ (*(const MD4_u32plus *)&ptr[(n) * 4])
+ #define GET(n) \
+diff --git a/alg-md5.c b/alg-md5.c
+index 8382b98..5502539 100644
+--- a/alg-md5.c
++++ b/alg-md5.c
+@@ -77,7 +77,7 @@
+ * link-time optimizations. For the time being, keeping these MD5 routines in
+ * their own translation unit avoids the problem.
+ */
+-#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#if 0 /* defined(__i386__) || defined(__x86_64__) || defined(__vax__) */
+ #define SET(n) \
+ (*(const MD5_u32plus *)&ptr[(n) * 4])
+ #define GET(n) \
+
+From cc50dde05be214caace8af493fe869832a1d3d68 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 20:03:03 +0200
+Subject: [PATCH 13/17] Remove unused file.
+
+---
+ m4/.git_keep_dir | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+ delete mode 100644 m4/.git_keep_dir
+
+diff --git a/m4/.git_keep_dir b/m4/.git_keep_dir
+deleted file mode 100644
+index e69de29..0000000
+
+From 1cf317228655013c516090a20e70d81656516580 Mon Sep 17 00:00:00 2001
+From: Vitaly Chikunov <vt(a)altlinux.org>
+Date: Wed, 24 Oct 2018 05:24:47 +0300
+Subject: [PATCH 14/17] yescrypt: Add more tests.
+
+Test that crypt() with hashed password in place of settings works the
+same as settings.
+---
+ test-crypt-yescrypt.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/test-crypt-yescrypt.c b/test-crypt-yescrypt.c
+index a635f94..9d67b92 100644
+--- a/test-crypt-yescrypt.c
++++ b/test-crypt-yescrypt.c
+@@ -43,8 +43,16 @@ test(const char *p, const char *s, const char *m)
+ int
+ main (void)
+ {
+- int result = test("pleaseletmein", "$y$jD5.7$LdJMENpBABJJ3hIHjB1Bi.",
+- "$y$jD5.7$LdJMENpBABJJ3hIHjB1Bi.$HboGM6qPrsK.StKYGt6KErmUYtioHreJd98oIugoNB6");
++ int result = 0;
++
++#define YSETTINGS "$y$jD5.7$LdJMENpBABJJ3hIHjB1Bi."
++#define YHASHPART "HboGM6qPrsK.StKYGt6KErmUYtioHreJd98oIugoNB6"
++#define YFULLHASH YSETTINGS "$" YHASHPART
++ result |= test("pleaseletmein", YSETTINGS, YFULLHASH);
++ result |= test("pleaseletmein", YFULLHASH, YFULLHASH);
++ result |= test("pleaseletmein", YSETTINGS "$", YFULLHASH);
++ result |= test("pleaseletmein", YSETTINGS "$garbage", YFULLHASH);
++
+ result |= test("", "$y$jD5.7$", "$y$jD5.7$$JD8dsR.nt1ty0ltQ2HHwauaDRoOUIEaA5i.vpj2nyL.");
+ result |= test("", "$y$jD5.7$$", "$y$jD5.7$$JD8dsR.nt1ty0ltQ2HHwauaDRoOUIEaA5i.vpj2nyL.");
+
+
+From 232b217faba35064ca30120751f788d649cb3020 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Wed, 24 Oct 2018 15:54:12 +0200
+Subject: [PATCH 15/17] Use bzip2 and xz compression for distribution tarballs,
+ too.
+
+---
+ Makefile.am | 2 +-
+ NEWS | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index e7d5c6d..8cb3807 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -4,7 +4,7 @@
+ # Author: Thorsten Kukuk <kukuk(a)suse.de>
+ #
+
+-AUTOMAKE_OPTIONS = 1.14 gnits
++AUTOMAKE_OPTIONS = 1.14 gnits dist-bzip2 dist-xz
+ ACLOCAL_AMFLAGS = -I m4
+
+ AM_CFLAGS = $(WARN_CFLAGS)
+diff --git a/NEWS b/NEWS
+index e48b0d1..8af68ff 100644
+--- a/NEWS
++++ b/NEWS
+@@ -10,6 +10,8 @@ Version 4.2.3
+ sha512 implementation under the BSD license.
+ * Use md5 implementation from Alexander Peslyak. Thus we now have a
+ md5 implementation in the public domain.
++* 'make dist' now generates bzip2 and xz compressed tarballs along
++ with the default gzip compressed tarball.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+
+From a17c2d75c5642d164e04748ddb93f8f426c7ed5c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 25 Oct 2018 13:47:04 +0200
+Subject: [PATCH 16/17] Add Badge for Coverity Scan.
+
+---
+ README.md | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/README.md b/README.md
+index 102127a..9a91ad5 100644
+--- a/README.md
++++ b/README.md
+@@ -1,5 +1,6 @@
+ [![Build Status](https://travis-ci.org/besser82/libxcrypt.svg?branch=develop)](htt...
+ [![codecov](https://codecov.io/gh/besser82/libxcrypt/branch/develop/graph/badge.svg)](https://codecov.io/gh/besser82/libxcrypt)
++[![Coverity Scan Build Status](https://scan.coverity.com/projects/17073/badge.svg)](https://scan...
+
+ README for libxcrypt
+ ====================
+
+From 8b1ff5c38f316bc301e57a5a307fd11b8984e494 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 25 Oct 2018 14:06:01 +0200
+Subject: [PATCH 17/17] Add labels to TravisCI builds.
+
+---
+ .travis.yml | 75 +++++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 50 insertions(+), 25 deletions(-)
+
+diff --git a/.travis.yml b/.travis.yml
+index acb186c..2e7a746 100644
+--- a/.travis.yml
++++ b/.travis.yml
+@@ -15,153 +15,178 @@ sudo: true
+ matrix:
+ fast_finish: true
+ include:
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, Codecov"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+ - CODECOV=1
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, all hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+ - DISTCHECK=1
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, all hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, all hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, all hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, all hashes, obsolete API, no failure-tokens"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, all hashes, obsolete API, no failure-tokens"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, all hashes, obsolete API, no failure-tokens"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, all hashes, obsolete API, no failure-tokens"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, all hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, all hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, all hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, all hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, strong hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, strong hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, strong hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, strong hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, glibc hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, glibc hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, glibc hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, glibc hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, glibc and strong hashes, obsolete API for glibc"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api=glibc --enable-hashes=strong,glibc"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, glibc and strong hashes, obsolete API for glibc"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api=glibc --enable-hashes=strong,glibc"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, glibc and strong hashes, obsolete API for glibc"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api=glibc --enable-hashes=strong,glibc"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, glibc and strong hashes, obsolete API for glibc"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
diff --git a/libxcrypt.spec b/libxcrypt.spec
index 92dd79a..10749a5 100644
--- a/libxcrypt.spec
+++ b/libxcrypt.spec
@@ -76,7 +76,7 @@ fi \
Name: libxcrypt
Version: 4.2.2
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: Extended crypt library for DES, MD5, Blowfish and others
# For explicit license breakdown, see the
@@ -85,6 +85,8 @@ License: LGPLv2+ and BSD and Public Domain
URL: https://github.com/besser82/%{name}
Source0: %{url}/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
+Patch0001: %{url}/compare/v%{version}...develop.patch#/%{name}-%{version}-to_develop.patch
+
BuildRequires: fipscheck
BuildRequires: libtool
@@ -306,6 +308,9 @@ done
%changelog
+* Thu Oct 25 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-2
+- Add patch updating to recent development version
+
* Thu Oct 18 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-1
- New upstream release
5 years, 6 months
Architecture specific change in rpms/libxcrypt.git
by githook-noreply@fedoraproject.org
The package rpms/libxcrypt.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/libxcrypt.git/commit/?id=56fc361c....
Change:
+%ifnarch %{power64}
Thanks.
Full change:
============
commit de4a76fef760e86a036f510ae412bfa477cb7f24
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Thu Oct 25 16:40:55 2018 +0200
Use bootstrap script
diff --git a/libxcrypt.spec b/libxcrypt.spec
index 43a9a12..dbd40e0 100644
--- a/libxcrypt.spec
+++ b/libxcrypt.spec
@@ -216,7 +216,7 @@ discouraged.
%prep
%autosetup -p 1
-%{_bindir}/autoreconf -fiv
+./bootstrap
%{__mkdir_p} %{_vpath_builddir}{,-compat}
@@ -338,6 +338,7 @@ done
* Thu Oct 25 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-2
- Add patch updating to recent development version
- Run valgrind-memcheck
+- Use bootstrap script
* Thu Oct 18 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-1
- New upstream release
commit 56fc361c2d2d33ff6acdfa408af543367ae39954
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Thu Oct 25 16:34:44 2018 +0200
Run valgrind-memcheck
diff --git a/libxcrypt.spec b/libxcrypt.spec
index 10749a5..43a9a12 100644
--- a/libxcrypt.spec
+++ b/libxcrypt.spec
@@ -6,6 +6,15 @@
#endif
+# Run memcheck?
+# Valgrind does not work well on %%{power64} arches.
+%ifnarch %{power64}
+%bcond_without memcheck
+%else
+%bcond_with memcheck
+%endif
+
+
# Shared object version of libcrypt.
%if %{with new_api}
%global soc 2
@@ -48,6 +57,11 @@
--enable-shared \\\
--enable-static \\\
--disable-failure-tokens \\\
+%if %{with memcheck} \
+ --enable-valgrind \\\
+%else \
+ --disable-valgrind \\\
+%endif \
--srcdir=.. \\\
--with-pkgconfigdir=%{_libdir}/pkgconfig
@@ -89,6 +103,9 @@ Patch0001: %{url}/compare/v%{version}...develop.patch#/%{name}-%{version}-t
BuildRequires: fipscheck
BuildRequires: libtool
+%if %{with memcheck}
+BuildRequires: valgrind
+%endif
# We do not need to keep this forever.
%if %{without new_api} && (0%{?fedora} && 0%{?fedora} <= 31) || (0%{?rhel} && 0%{?rhel} <= 10)
@@ -260,6 +277,16 @@ for dir in %{_vpath_builddir}; do
echo "-----END TESTLOG: ${dir}-----";
exit $rc;
}
+%if %{with memcheck}
+ %make_build -C ${dir} check-valgrind-memcheck || \
+ {
+ rc=$?;
+ echo "-----BEGIN TESTLOG: ${dir}-----";
+ %{__cat} ${dir}/test-suite-memcheck.log;
+ echo "-----END TESTLOG: ${dir}-----";
+ exit $rc;
+ }
+%endif
done
@@ -310,6 +337,7 @@ done
%changelog
* Thu Oct 25 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-2
- Add patch updating to recent development version
+- Run valgrind-memcheck
* Thu Oct 18 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-1
- New upstream release
commit ea4ffe97b18e8cb8857b3398861b6eb4948236c8
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Thu Oct 25 16:28:21 2018 +0200
Add patch updating to recent development version
diff --git a/libxcrypt-4.2.2-to_develop.patch b/libxcrypt-4.2.2-to_develop.patch
new file mode 100644
index 0000000..d42e74c
--- /dev/null
+++ b/libxcrypt-4.2.2-to_develop.patch
@@ -0,0 +1,3945 @@
+From 9bae80381beabc1b08b0fd89d2a4e6e15e3e5da0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 18 Oct 2018 21:24:10 +0200
+Subject: [PATCH 01/17] Bump tarball version to 4.2.3 and update NEWS.
+
+---
+ NEWS | 2 ++
+ configure.ac | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/NEWS b/NEWS
+index 5b2795e..ef7c244 100644
+--- a/NEWS
++++ b/NEWS
+@@ -3,6 +3,8 @@ libxcrypt NEWS -- history of user-visible changes.
+ Please send bug reports, questions and suggestions to
+ <https://github.com/besser82/libxcrypt/issues>.
+
++Version 4.2.3
++
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+
+diff --git a/configure.ac b/configure.ac
+index efbd2e7..3ba313c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1,7 +1,7 @@
+ # Process this file with autoconf to produce a configure script.
+ m4_include([m4/zw_automodern.m4])
+ AC_INIT([xcrypt],
+- [4.2.2],
++ [4.2.3],
+ [https://github.com/besser82/libxcrypt/issues],
+ [libxcrypt],
+ [https://github.com/besser82/libxcrypt])
+
+From ed11116c6e4b5b80ef8f6f57fe8db4aa3604a53b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 18 Oct 2018 22:23:19 +0200
+Subject: [PATCH 02/17] Add bootstrap script.
+
+---
+ .travis.yml | 6 +++---
+ NEWS | 1 +
+ bootstrap | 33 +++++++++++++++++++++++++++++++++
+ 3 files changed, 37 insertions(+), 3 deletions(-)
+ create mode 100755 bootstrap
+
+diff --git a/.travis.yml b/.travis.yml
+index 78a3f0a..acb186c 100644
+--- a/.travis.yml
++++ b/.travis.yml
+@@ -181,9 +181,9 @@ before_install:
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y upgrade && i= && break || sleep 1; done; [ -z "$i" ]'
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y swap coreutils-single coreutils && i= && break || sleep 1; done; [ -z "$i" ]'
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y groups install buildsys-build && i= && break || sleep 1; done; [ -z "$i" ]'
+- - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install libtool valgrind && i= && break || sleep 1; done; [ -z "$i" ]'
++ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install git libtool valgrind && i= && break || sleep 1; done; [ -z "$i" ]'
+ - if [[ "$CC" == "clang" ]] ; then docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install clang && i= && break || sleep 1; done; [ -z "$i" ]' ; fi
+- - if [[ "$CODECOV" == "1" ]] ; then docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install git lcov python3-pip && i= && break || sleep 1; done; [ -z "$i" ]' ; fi
++ - if [[ "$CODECOV" == "1" ]] ; then docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install lcov python3-pip && i= && break || sleep 1; done; [ -z "$i" ]' ; fi
+ - if [[ "$CODECOV" == "1" ]] ; then docker exec -t buildenv /bin/sh -c "pip3 install codecov" ; fi
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y autoremove && i= && break || sleep 1; done; [ -z "$i" ]'
+
+@@ -201,7 +201,7 @@ script:
+ - export NPROCS="$((`nproc --all` * 2))" ; echo paralleism is $NPROCS
+ - if [[ "$CODECOV" == "1" ]] ; then export CFLAGS="-O0 -g --coverage" ; export CXXFLAGS="$CFLAGS" ; export LDFLAGS="--coverage" ; fi
+ - docker exec -t buildenv /bin/sh -c "cat /etc/redhat-release"
+- - docker exec -t buildenv /bin/sh -c "cd /opt/libxcrypt && autoreconf -fiv -Wall -Werror"
++ - docker exec -t buildenv /bin/sh -c "cd /opt/libxcrypt && ./bootstrap"
+ - docker exec -t buildenv /bin/sh -c "cd /opt/libxcrypt && CFLAGS=\"$CFLAGS\" CXXFLAGS=\"$CXXFLAGS\" LDFLAGS=\"$LDFLAGS\" ./configure --prefix=/opt/libxcrypt --disable-silent-rules --enable-shared --enable-static $CONF"
+ - docker exec -t buildenv /bin/sh -c "make -C /opt/libxcrypt -j$NPROCS"
+ - docker exec -t buildenv /bin/sh -c "make -C /opt/libxcrypt install"
+diff --git a/NEWS b/NEWS
+index ef7c244..7847c86 100644
+--- a/NEWS
++++ b/NEWS
+@@ -4,6 +4,7 @@ Please send bug reports, questions and suggestions to
+ <https://github.com/besser82/libxcrypt/issues>.
+
+ Version 4.2.3
++* Add bootstrap script.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/bootstrap b/bootstrap
+new file mode 100755
+index 0000000..af6433a
+--- /dev/null
++++ b/bootstrap
+@@ -0,0 +1,33 @@
++#!/bin/sh
++#
++# Copyright (C) 2018 Bjrn Esser <besser82(a)fedoraproject.org>
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted.
++#
++# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++# SUCH DAMAGE.
++
++set -efu
++LANG=C
++
++run_cmd()
++{
++ echo "bootstrap: running: $@"
++ "$@"
++}
++
++if [ -d .git ]; then
++ run_cmd git clean -dfX
++fi
++
++run_cmd autoreconf -iv -Wall,error
+
+From a19bb7e1ae3e954b8852f50fd70ca496839989b5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Fri, 19 Oct 2018 00:01:16 +0200
+Subject: [PATCH 03/17] Recommend the bootstrap script over autoreconf.
+
+---
+ NEWS | 3 ++-
+ README.md | 2 +-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/NEWS b/NEWS
+index 7847c86..c55a971 100644
+--- a/NEWS
++++ b/NEWS
+@@ -4,7 +4,8 @@ Please send bug reports, questions and suggestions to
+ <https://github.com/besser82/libxcrypt/issues>.
+
+ Version 4.2.3
+-* Add bootstrap script.
++* Add bootstrap script. If building from a Git checkout instead of a
++ tarball release, use './bootstrap' to create the configure script.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/README.md b/README.md
+index a32b1b1..102127a 100644
+--- a/README.md
++++ b/README.md
+@@ -62,7 +62,7 @@ these things before building the software.
+
+ Building from a Git checkout additionally requires the Autotools
+ suite: `autoconf`, `automake`, `libtool`, and `pkg-config`.
+-Run `autoreconf -i` at the top level of the source tree, and then
++Run `./bootstrap` at the top level of the source tree, and then
+ follow the instructions in `INSTALL` (which is created by that command).
+
+ The oldest versions of Autotools components that are known to work
+
+From 4bb73c595925a4603393ff25751ada66921919d9 Mon Sep 17 00:00:00 2001
+From: Zack Weinberg <zackw(a)panix.com>
+Date: Sat, 20 Oct 2018 12:36:02 -0400
+Subject: [PATCH 04/17] Revise the to-do list.
+
+---
+ TODO | 57 +----------------------------
+ TODO.md | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 110 insertions(+), 56 deletions(-)
+ mode change 100644 => 120000 TODO
+ create mode 100644 TODO.md
+
+diff --git a/TODO b/TODO
+deleted file mode 100644
+index 66db86b..0000000
+--- a/TODO
++++ /dev/null
+@@ -1,56 +0,0 @@
+-to-do list for libxcrypt
+-------------------------
+-
+-* Near future:
+- * Update all of the default cost parameters
+- * relevant benchmarking at
+- <https://pthree.org/2016/06/28/lets-talk-password-hashing/>
+- * the default used by `crypt_gensalt_*` for new hashes should be
+- controllable independently from the default used if there is no
+- rounds= annotation in a setting string
+- * Make the crypt and crypt_gensalt static state thread-specific?
+- * if allocated on first use, this would also shave 32kB of
+- data segment off the shared library
+- * Factor out all of the repetitive base64 code
+- * get rid of the de/serialization code in crypt-bcrypt.c that
+- still does dodgy things with type punning
+- * Attempt to determine the copyright holders and intended licensing
+- of the test suite
+- * Moar tests
+- * Make sure the symbol versioning macros work with all of the compilers
+- that anyone needs (they use GCC extensions that clang also supports).
+-
+-* Longer term:
+- * Hash algorithms newer than bcrypt tend to want to allocate and
+- scribble all over a large (tens of megabytes at a minimum) block
+- of memory, to make brute force hard in a way that GPUs and ASICs
+- can't easily accelerate. The existing API cannot handle this for
+- three reasons:
+- * `crypt_gensalt` only takes a single cost parameter, some
+- algorithms have several
+- * With everything except `crypt_ra`, all of the memory is
+- allocated by the caller and there's no way for algorithms to say
+- how much they need
+- * There is no destructor function, even with `crypt_ra` - callers
+- just pass the block to `free`
+-
+- So we need to invent a new API that allows for more variety in
+- cost parameters and allocations. It could also make the "all the
+- sensitive data, including stack scratch, is in crypt_data which we
+- auto-erase" feature more robust by adding guard bands and calling
+- mlock().
+-
+- * Additional hashes to investigate adding:
+- * scrypt <https://www.tarsnap.com/scrypt.html>
+- * Argon2 <https://password-hashing.net/>
+- * ...?
+-
+- * Support for "pepper" (an additional piece of information, _not_
+- stored in the password file, that you need to check a password)
+-
+- * Reading passphrases from the terminal is finicky and there are
+- several competing, poorly portable, questionably sound library
+- functions to do it (`getpass`, `readpassphrase`, etc) -- should we
+- incorporate one?
+- * If we do, should it know how to trigger the trusted-path
+- password prompt in modern GUI environments? (probably)
+diff --git a/TODO b/TODO
+new file mode 120000
+index 0000000..cde952b
+--- /dev/null
++++ b/TODO
+@@ -0,0 +1 @@
++TODO.md
+\ No newline at end of file
+diff --git a/TODO.md b/TODO.md
+new file mode 100644
+index 0000000..30c0372
+--- /dev/null
++++ b/TODO.md
+@@ -0,0 +1,109 @@
++to-do list for libxcrypt
++------------------------
++
++This list is categorized but not in any kind of priority order.
++It was last updated 20 October 2018.
++
++* Code cleanliness
++ * Find and remove any code that still does dodgy things with type punning
++ * Factor out all of the repetitive base64 code
++ * Factor out the multiple implementations of HMAC and PBKDF
++
++* Testsuite improvements
++ * Line coverage is inadequate for `alg-yescrypt-common.c` and
++ `alg-yescrypt-opt.c`
++ * Investigate branch coverage
++ * Do some API fuzz testing and add missing cases to the testsuite
++ * Many of the `test-crypt-*.c` files repeat more or less the same
++ code with different data, consider merging them
++
++* Portability
++ * Make sure the symbol versioning macros work with all of the
++ compilers that anyone needs (they use GCC extensions that clang
++ also supports).
++ * `alg-yescrypt-common.c` contains #ifdeffage for use of
++ `posix_memalign` that isnt wired up to autoconf
++ * possibly this should just be removed; does anything have
++ `posix_memalign` but not `mmap`? its only a compile-time
++ fallback, not a runtime fallback
++
++* Hardening
++ * bcrypt-like selftest/memory scribble for all hashing methods
++ * how do we know the memory scribble is doing its job?
++ * build out of the box with compiler hardening features turned on
++ * something bespoke for not having to write serialization and
++ deserialization logic for hash strings by hand, as this is
++ probably the most error-prone part of writing a hashing method
++
++ * the most sensitive piece of data handled by this library is a
++ cleartext passphrase. OS may have trusted-path facilities for
++ prompting the user for a passphrase and feeding it to a KDF
++ without its ever being accessible in normal memory. investigate
++ whether we can use these.
++
++* Additional hashing methods
++ * Argon2 <https://password-hashing.net/>
++ * ...?
++
++* Runtime configurability (in progress on the [crypt.conf branch][])
++ * allow installations to enable or disable specific hash methods
++ without rebuilding the library
++ * make the default cost parameter used by `crypt_gensalt_*` for new
++ hashes configurable
++ * update the compiled-in defaults used by `crypt_gensalt_*` (not the
++ defaults used when no explicit cost parameter is present in a
++ hash; those cant be changed without breaking existing stored hashes)
++ * relevant benchmarking at
++ <https://pthree.org/2016/06/28/lets-talk-password-hashing/>
++ * offer a way to tune cost parameters for a specific installation
++ * N.B. Solaris 11 has all of these features but our implementation will
++ probably not match them (they have a `crypt.conf` but its not the
++ same, and their `crypt_gensalt` is API-incompatible anyway).
++
++[crypt.conf branch]: https://github.com/besser82/libxcrypt/tree/zack/crypt.conf
++
++* Potential API enhancements:
++
++ * Support for "pepper" (an additional piece of information, _not_
++ stored in the password file, that you need to check a password)
++
++ * Reading passphrases from the terminal is finicky and there are
++ several competing, poorly portable, questionably sound library
++ functions to do it (`getpass`, `readpassphrase`, etc) -- should we
++ incorporate one?
++ * If we do, should it know how to trigger the trusted-path
++ password prompt in modern GUI environments? (probably)
++
++ * Make the crypt and crypt_gensalt static state thread-specific?
++ * Solaris 11 may have done this (its `crypt(3)` manpage describes
++ it as MT-Safe and I dont see any other way they could have
++ accomplished that).
++ * if allocated on first use, this would also shave 32kB of
++ data segment off the shared library
++ * alternatively, add a global lock and *crash the program* if we
++ detect concurrent calls
++
++ * Allow access to more of yescrypts tunable parameters and ROM
++ feature, in a way thats generic enough that we could also use it
++ for e.g. Argon2s tunable parameters
++
++ * Other yescrypt-inspired features relevant to using this library to
++ back a dedicated authentication service, e.g. preallocation of
++ large blocks of scratch memory
++ * the main obstacles here are that `struct crypt_data` has a fixed
++ size which is either too big or too small depending how you look
++ at it, and no destructor function
++
++* Permissive relicensing, to encourage use beyond the GNU ecosystem?
++ * Replace remaining (L)GPLed crypto primitives (MD5, SHA512) with
++ permissively licensed equivalents (e.g. from Openwall)
++ * Replace crypt-md5.c with original md5crypt from FreeBSD?
++ * Other files subject to the (L)GPL are crypt.c, crypt-static.c,
++ crypt-gensalt-static.c, crypt-obsolete.h, crypt-port.h,
++ crypt-private.h, test-badsalt.c. It is not clear to me how much
++ material originally assigned to the FSF remains in these files.
++ Several of them are API definitions and trivial wrappers that
++ could not be meaningfully changed without breaking them (so are
++ arguably uncopyrightable).
++ * Most of the test suite lacks any license or even authorship
++ information. We would have to track down the original authors.
+
+From 9787b0be83a077c8c1a4e9b460b6b6e3698002d4 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 12:18:25 +0200
+Subject: [PATCH 05/17] Generate included header files before any other target.
+
+If we use a dummy target that depends on targets generating
+commonly used header files and that creates an empty file,
+which is included in the Makefile later, the header files are
+guaranteed to be generated before any other target in the same
+Makefile.
+---
+ .gitignore | 1 +
+ Makefile.am | 16 +++++++++-------
+ 2 files changed, 10 insertions(+), 7 deletions(-)
+
+diff --git a/.gitignore b/.gitignore
+index 1e9e605..e0b13cf 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -1,6 +1,7 @@
+ # http://www.gnu.org/software/automake
+
+ /Makefile
++/Makefile.deps
+ /Makefile.in
+ /.deps/
+ /.libs/
+diff --git a/Makefile.am b/Makefile.am
+index 2cb07ca..acab882 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -71,13 +71,19 @@ libcrypt_la_CPPFLAGS = $(AM_CPPFLAGS) -DIN_LIBCRYPT
+
+ CONFIG_STATUS_DEPENDENCIES = libcrypt.minver
+ EXTRA_libcrypt_la_DEPENDENCIES = libcrypt.map
+-CLEANFILES = libcrypt.map libcrypt.map.T \
++CLEANFILES = Makefile.deps.T Makefile.deps \
++ libcrypt.map libcrypt.map.T \
+ crypt-symbol-vers.h crypt-symbol-vers.h.T \
+ crypt-hashes.h crypt-hashes.h.T \
+ crypt.h crypt.h.T
+
+ DISTCLEANFILES = .deps/*.Plo
+
++# Empty target to have needed headers pre-generated before any other target.
++Makefile.deps: crypt-hashes.h crypt-symbol-vers.h
++ $(AM_V_GEN)LC_ALL=C echo "# Deps" > Makefile.deps.T
++ $(AM_V_at)mv -f Makefile.deps.T Makefile.deps
++
+ libcrypt.map: libcrypt.map.in gen-map.awk Makefile
+ $(AM_V_GEN)LC_ALL=C $(AWK) \
+ -v SYMVER_MIN=$(SYMVER_MIN) \
+@@ -230,12 +236,8 @@ endif
+
+ # Every object file depends on crypt-symbol-vers.h and crypt-hashes.h,
+ # which are generated files, so automatic dependency generation is not
+-# sufficient. Most of the test programs depend on either libcrypt.la
+-# or one of its components, so they do not need an explicit dependency
+-# (after the first *successful* build, automatic dependency generation
+-# will reveal the direct dependency) but a few don't.
+-$(libcrypt_la_OBJECTS): crypt-symbol-vers.h crypt-hashes.h
+-$(test_byteorder_OBJECTS): crypt-symbol-vers.h crypt-hashes.h
++# sufficient.
++include $(builddir)/Makefile.deps
+
+ # Add additional targets
+ .PHONY: $(phony_targets)
+
+From d32b170da3d4b65e9b23bb1c9a50e027ec090c5a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 12:53:13 +0200
+Subject: [PATCH 06/17] Include crypt.h from crypt-port.h.
+
+Since we have a guaranteed way to make sure all generated header
+files are always present before any object file is compiled, we
+can drop crypt-base.h and include the local version of crypt.h
+through crypt-port.h.
+---
+ .gitignore | 2 +-
+ LICENSING | 2 +-
+ Makefile.am | 10 +++++-----
+ configure.ac | 2 +-
+ crypt-gensalt-static.c | 1 -
+ crypt-obsolete.h | 1 -
+ crypt-port.h | 6 ++++--
+ crypt-private.h | 1 -
+ crypt-static.c | 1 -
+ crypt-base.h.in => crypt.h.in.in | 0
+ gen-crypt-h.awk | 2 +-
+ test-crypt-bcrypt.c | 1 -
+ test-crypt-des.c | 1 -
+ test-crypt-md5.c | 1 -
+ test-crypt-nthash.c | 1 -
+ test-crypt-pbkdf1-sha1.c | 1 -
+ test-crypt-scrypt.c | 1 -
+ test-crypt-sha256.c | 1 -
+ test-crypt-sha512.c | 1 -
+ test-crypt-sunmd5.c | 1 -
+ test-crypt-yescrypt.c | 1 -
+ test-des-obsolete.c | 1 -
+ test-des-obsolete_r.c | 1 -
+ test-gensalt.c | 1 -
+ 24 files changed, 13 insertions(+), 28 deletions(-)
+ rename crypt-base.h.in => crypt.h.in.in (100%)
+
+diff --git a/.gitignore b/.gitignore
+index e0b13cf..e46e4c2 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -19,7 +19,7 @@
+ /config.status
+ /m4/config.sub
+ /configure
+-/crypt-base.h
++/crypt.h.in
+ /m4/depcomp
+ /m4/install-sh
+ /libtool
+diff --git a/LICENSING b/LICENSING
+index 17ae41e..bf0c514 100644
+--- a/LICENSING
++++ b/LICENSING
+@@ -12,7 +12,7 @@ source tree. For specific licensing terms consult the files themselves.
+ crypt.c, crypt-static.c, crypt-gensalt-static.c, crypt-port.h
+
+ * Copyright Free Software Foundation, Inc.; LGPL (v2.1 or later):
+- crypt-base.h, crypt-obsolete.h, crypt-private.h
++ crypt.h, crypt-obsolete.h, crypt-private.h
+ alg-md5.h, alg-md5.c, crypt-md5.c,
+ alg-sha512.h, alg-sha512.c,
+ test-crypt-badsalt.c, test-crypt-nonnull.c
+diff --git a/Makefile.am b/Makefile.am
+index acab882..498c48f 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -14,7 +14,7 @@ TEST_EXTENSIONS = .sh
+
+ EXTRA_DIST = \
+ LICENSING THANKS \
+- crypt-base.h.in libcrypt.map.in libcrypt.minver \
++ crypt.h.in.in libcrypt.map.in libcrypt.minver \
+ gen-map.awk gen-vers.awk gen-crypt-h.awk \
+ gen-hashes.awk sel-hashes.awk hashes.lst
+
+@@ -24,7 +24,7 @@ notrans_dist_man3_MANS = \
+ notrans_dist_man5_MANS = crypt.5
+
+ nodist_include_HEADERS = crypt.h
+-nodist_noinst_HEADERS = crypt-hashes.h crypt-base.h
++nodist_noinst_HEADERS = crypt-hashes.h
+ noinst_HEADERS = \
+ alg-des.h alg-hmac-sha1.h alg-md4.h alg-md5.h \
+ alg-sha1.h alg-sha256.h alg-sha512.h \
+@@ -80,7 +80,7 @@ CLEANFILES = Makefile.deps.T Makefile.deps \
+ DISTCLEANFILES = .deps/*.Plo
+
+ # Empty target to have needed headers pre-generated before any other target.
+-Makefile.deps: crypt-hashes.h crypt-symbol-vers.h
++Makefile.deps: crypt.h
+ $(AM_V_GEN)LC_ALL=C echo "# Deps" > Makefile.deps.T
+ $(AM_V_at)mv -f Makefile.deps.T Makefile.deps
+
+@@ -101,9 +101,9 @@ crypt-symbol-vers.h: libcrypt.map.in gen-vers.awk Makefile
+ $(srcdir)/libcrypt.map.in > crypt-symbol-vers.h.T
+ $(AM_V_at)mv -f crypt-symbol-vers.h.T crypt-symbol-vers.h
+
+-crypt.h: crypt-base.h gen-crypt-h.awk config.h
++crypt.h: crypt.h.in crypt-hashes.h crypt-symbol-vers.h gen-crypt-h.awk config.h
+ $(AM_V_GEN)LC_ALL=C $(AWK) \
+- -f $(srcdir)/gen-crypt-h.awk config.h $(builddir)/crypt-base.h \
++ -f $(srcdir)/gen-crypt-h.awk config.h $(builddir)/crypt.h.in \
+ > crypt.h.T
+ $(AM_V_at)mv -f crypt.h.T crypt.h
+
+diff --git a/configure.ac b/configure.ac
+index 3ba313c..5da8aa8 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -11,8 +11,8 @@ AC_CONFIG_SRCDIR([crypt.c])
+ AC_CONFIG_HEADERS([config.h])
+ AC_CONFIG_FILES([
+ Makefile
++ crypt.h.in
+ libxcrypt.pc
+- crypt-base.h
+ ])
+ AM_INIT_AUTOMAKE
+
+diff --git a/crypt-gensalt-static.c b/crypt-gensalt-static.c
+index 14f271e..590ee83 100644
+--- a/crypt-gensalt-static.c
++++ b/crypt-gensalt-static.c
+@@ -15,7 +15,6 @@
+ <https://www.gnu.org/licenses/>. */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ /* The functions that use global state objects are isolated in their
+ own files so that a statically-linked program that doesn't use them
+diff --git a/crypt-obsolete.h b/crypt-obsolete.h
+index d1acdea..4ecd969 100644
+--- a/crypt-obsolete.h
++++ b/crypt-obsolete.h
+@@ -19,7 +19,6 @@
+ #ifndef _CRYPT_OBSOLETE_H
+ #define _CRYPT_OBSOLETE_H 1
+
+-#include "crypt-base.h"
+
+ /* These functions are obsolete and should never be used, but we have to
+ keep providing them for binary backward compatibility. */
+diff --git a/crypt-port.h b/crypt-port.h
+index f139efa..5f4d55f 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -44,8 +44,8 @@
+ #endif
+
+ /* While actually compiling the library, suppress the __nonnull tags
+- on the functions in crypt-base.h, so that internal checks for NULL
+- are not deleted by the compiler. */
++ on the functions in crypt.h, so that internal checks for NULL are
++ not deleted by the compiler. */
+ #undef __nonnull
+ #define __nonnull(param) /* nothing */
+
+@@ -292,4 +292,6 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #define libcperciva_SHA256_Buf _crypt_SHA256_Buf
+ #endif
+
++#include "crypt.h"
++
+ #endif /* crypt-port.h */
+diff --git a/crypt-private.h b/crypt-private.h
+index 5e18030..306879d 100644
+--- a/crypt-private.h
++++ b/crypt-private.h
+@@ -20,7 +20,6 @@
+ #ifndef _CRYPT_PRIVATE_H
+ #define _CRYPT_PRIVATE_H 1
+
+-#include "crypt-base.h"
+
+ /* Utility functions */
+
+diff --git a/crypt-static.c b/crypt-static.c
+index fb9a953..d7598d1 100644
+--- a/crypt-static.c
++++ b/crypt-static.c
+@@ -15,7 +15,6 @@
+ <https://www.gnu.org/licenses/>. */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ /* The functions that use global state objects are isolated in their
+ own files so that a statically-linked program that doesn't use them
+diff --git a/crypt-base.h.in b/crypt.h.in.in
+similarity index 100%
+rename from crypt-base.h.in
+rename to crypt.h.in.in
+diff --git a/gen-crypt-h.awk b/gen-crypt-h.awk
+index 70fc5fa..8b3f4f5 100644
+--- a/gen-crypt-h.awk
++++ b/gen-crypt-h.awk
+@@ -1,4 +1,4 @@
+-# Generation of crypt.h from crypt-base.h and config.h.
++# Generation of crypt.h from crypt.h.in and config.h.
+ #
+ # Written by Zack Weinberg <zackw at panix.com> in 2017.
+ # To the extent possible under law, Zack Weinberg has waived all
+diff --git a/test-crypt-bcrypt.c b/test-crypt-bcrypt.c
+index bf149b4..5cf90c1 100644
+--- a/test-crypt-bcrypt.c
++++ b/test-crypt-bcrypt.c
+@@ -15,7 +15,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <errno.h>
+ #include <stdio.h>
+diff --git a/test-crypt-des.c b/test-crypt-des.c
+index 1b5463e..f01fee7 100644
+--- a/test-crypt-des.c
++++ b/test-crypt-des.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-md5.c b/test-crypt-md5.c
+index 3035c39..d42b529 100644
+--- a/test-crypt-md5.c
++++ b/test-crypt-md5.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #if INCLUDE_md5
+
+diff --git a/test-crypt-nthash.c b/test-crypt-nthash.c
+index 9bf7d28..b344d86 100644
+--- a/test-crypt-nthash.c
++++ b/test-crypt-nthash.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-pbkdf1-sha1.c b/test-crypt-pbkdf1-sha1.c
+index 677e5bf..7a0c826 100644
+--- a/test-crypt-pbkdf1-sha1.c
++++ b/test-crypt-pbkdf1-sha1.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <errno.h>
+ #include <stdio.h>
+diff --git a/test-crypt-scrypt.c b/test-crypt-scrypt.c
+index df64774..0cf8da3 100644
+--- a/test-crypt-scrypt.c
++++ b/test-crypt-scrypt.c
+@@ -18,7 +18,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-sha256.c b/test-crypt-sha256.c
+index 05135ff..9331d14 100644
+--- a/test-crypt-sha256.c
++++ b/test-crypt-sha256.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-sha512.c b/test-crypt-sha512.c
+index bef271b..88c5643 100644
+--- a/test-crypt-sha512.c
++++ b/test-crypt-sha512.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-sunmd5.c b/test-crypt-sunmd5.c
+index d0d85e3..88e8ecf 100644
+--- a/test-crypt-sunmd5.c
++++ b/test-crypt-sunmd5.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+ #include <stdlib.h>
+diff --git a/test-crypt-yescrypt.c b/test-crypt-yescrypt.c
+index da6b694..a635f94 100644
+--- a/test-crypt-yescrypt.c
++++ b/test-crypt-yescrypt.c
+@@ -17,7 +17,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-des-obsolete.c b/test-des-obsolete.c
+index d5e3cc0..4588c75 100644
+--- a/test-des-obsolete.c
++++ b/test-des-obsolete.c
+@@ -7,7 +7,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+ #include "crypt-obsolete.h"
+ #include "test-des-cases.h"
+
+diff --git a/test-des-obsolete_r.c b/test-des-obsolete_r.c
+index d635b2a..9efd0fb 100644
+--- a/test-des-obsolete_r.c
++++ b/test-des-obsolete_r.c
+@@ -7,7 +7,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+ #include "crypt-obsolete.h"
+ #include "test-des-cases.h"
+
+diff --git a/test-gensalt.c b/test-gensalt.c
+index a6d3621..40fe66c 100644
+--- a/test-gensalt.c
++++ b/test-gensalt.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <errno.h>
+ #include <stdio.h>
+
+From a5f8acd51acb267d989ea3375ab17e29a0857059 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 13:06:59 +0200
+Subject: [PATCH 07/17] Add crypt-symbol-vers.h to nodist_noinst_HEADERS.
+
+---
+ Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 498c48f..a09e6a4 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -24,7 +24,7 @@ notrans_dist_man3_MANS = \
+ notrans_dist_man5_MANS = crypt.5
+
+ nodist_include_HEADERS = crypt.h
+-nodist_noinst_HEADERS = crypt-hashes.h
++nodist_noinst_HEADERS = crypt-hashes.h crypt-symbol-vers.h
+ noinst_HEADERS = \
+ alg-des.h alg-hmac-sha1.h alg-md4.h alg-md5.h \
+ alg-sha1.h alg-sha256.h alg-sha512.h \
+
+From 6adbd465a6003cf856e4c9debe0e6049746c685a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 16:11:30 +0200
+Subject: [PATCH 08/17] Add gen-des-tables to noinst_PROGRAMS.
+
+---
+ .gitignore | 1 +
+ Makefile.am | 2 ++
+ 2 files changed, 3 insertions(+)
+
+diff --git a/.gitignore b/.gitignore
+index e46e4c2..8aead50 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -48,6 +48,7 @@
+ /crypt-hashes.h
+ /crypt-symbol-vers.h
+ /libcrypt.map
++/gen-des-tables
+ /test-alg-des
+ /test-alg-hmac-sha1
+ /test-alg-md4
+diff --git a/Makefile.am b/Makefile.am
+index a09e6a4..e7d5c6d 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -31,6 +31,8 @@ noinst_HEADERS = \
+ alg-yescrypt.h alg-yescrypt-sysendian.h byteorder.h \
+ crypt-obsolete.h crypt-private.h crypt-port.h test-des-cases.h
+
++noinst_PROGRAMS = gen-des-tables
++
+ lib_LTLIBRARIES = libcrypt.la
+ libcrypt_la_SOURCES = \
+ alg-des.c alg-des-tables.c alg-hmac-sha1.c alg-md4.c alg-md5.c \
+
+From 323e5e097f643641f41f24969227b073470e186e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 13:08:36 +0200
+Subject: [PATCH 09/17] Use sha512 implementation from Colin Percival.
+
+Thus we now have a sha512 implementation under the BSD license.
+---
+ LICENSING | 4 +-
+ NEWS | 2 +
+ TODO.md | 2 +-
+ alg-sha512.c | 566 +++++++++++++++++++++------------------
+ alg-sha512.h | 121 +++++----
+ alg-yescrypt-sysendian.h | 12 +
+ crypt-port.h | 7 +-
+ crypt-sha512.c | 56 ++--
+ test-alg-sha512.c | 23 +-
+ 9 files changed, 441 insertions(+), 352 deletions(-)
+
+diff --git a/LICENSING b/LICENSING
+index bf0c514..31f704c 100644
+--- a/LICENSING
++++ b/LICENSING
+@@ -14,7 +14,6 @@ source tree. For specific licensing terms consult the files themselves.
+ * Copyright Free Software Foundation, Inc.; LGPL (v2.1 or later):
+ crypt.h, crypt-obsolete.h, crypt-private.h
+ alg-md5.h, alg-md5.c, crypt-md5.c,
+- alg-sha512.h, alg-sha512.c,
+ test-crypt-badsalt.c, test-crypt-nonnull.c
+
+ * Copyright David Burren et al.; 3-clause BSD:
+@@ -34,6 +33,9 @@ source tree. For specific licensing terms consult the files themselves.
+ alg-sha256.c, alg-sha256.h, alg-yescrypt.h, alg-yescrypt-opt.c,
+ alg-yescrypt-sysendian.h
+
++ * Copyright Colin Percival; 2-clause BSD:
++ alg-sha512.h, alg-sha512.c
++
+ * Copyright Alexander Peslyak, Bjrn Esser; 0-clause BSD:
+ crypt-scrypt.c
+
+diff --git a/NEWS b/NEWS
+index c55a971..c4b04da 100644
+--- a/NEWS
++++ b/NEWS
+@@ -6,6 +6,8 @@ Please send bug reports, questions and suggestions to
+ Version 4.2.3
+ * Add bootstrap script. If building from a Git checkout instead of a
+ tarball release, use './bootstrap' to create the configure script.
++* Use sha512 implementation from Colin Percival. Thus we now have a
++ sha512 implementation under the BSD license.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/TODO.md b/TODO.md
+index 30c0372..c4e2799 100644
+--- a/TODO.md
++++ b/TODO.md
+@@ -95,7 +95,7 @@ It was last updated 20 October 2018.
+ at it, and no destructor function
+
+ * Permissive relicensing, to encourage use beyond the GNU ecosystem?
+- * Replace remaining (L)GPLed crypto primitives (MD5, SHA512) with
++ * Replace remaining (L)GPLed crypto primitives (MD5) with
+ permissively licensed equivalents (e.g. from Openwall)
+ * Replace crypt-md5.c with original md5crypt from FreeBSD?
+ * Other files subject to the (L)GPL are crypt.c, crypt-static.c,
+diff --git a/alg-sha512.c b/alg-sha512.c
+index 60c1877..0d24301 100644
+--- a/alg-sha512.c
++++ b/alg-sha512.c
+@@ -1,289 +1,335 @@
+-/* Functions to compute SHA512 message digest of files or memory blocks.
+- according to the definition of SHA512 in FIPS 180-2.
+- Copyright (C) 2007-2017 Free Software Foundation, Inc.
++/*-
++ * Copyright 2005 Colin Percival
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
+
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
++#include "crypt-port.h"
+
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
++#if INCLUDE_sha512
+
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
++#include "alg-sha512.h"
++#include "alg-yescrypt-sysendian.h"
+
+-/* Written by Ulrich Drepper <drepper(a)redhat.com>, 2007. */
++#if IS_BIGENDIAN
++/* Copy a vector of big-endian uint64_t into a vector of bytes */
++#define be64enc_vect(dst, src, len) \
++ memcpy((void *)dst, (const void *)src, (size_t)len)
+
+-#include "crypt-port.h"
+-#include "alg-sha512.h"
+-#include "byteorder.h"
++/* Copy a vector of bytes into a vector of big-endian uint64_t */
++#define be64dec_vect(dst, src, len) \
++ memcpy((void *)dst, (const void *)src, (size_t)len)
+
+-#if INCLUDE_sha512
++#else /* IS_BIGENDIAN */
+
+-/* Constants for SHA512 from FIPS 180-2:4.2.3. */
+-static const uint64_t K[80] =
++/*
++ * Encode a length len/4 vector of (uint64_t) into a length len vector of
++ * (unsigned char) in big-endian form. Assumes len is a multiple of 8.
++ */
++static void
++be64enc_vect(unsigned char *dst, const uint64_t *src, size_t len)
+ {
+- UINT64_C (0x428a2f98d728ae22), UINT64_C (0x7137449123ef65cd),
+- UINT64_C (0xb5c0fbcfec4d3b2f), UINT64_C (0xe9b5dba58189dbbc),
+- UINT64_C (0x3956c25bf348b538), UINT64_C (0x59f111f1b605d019),
+- UINT64_C (0x923f82a4af194f9b), UINT64_C (0xab1c5ed5da6d8118),
+- UINT64_C (0xd807aa98a3030242), UINT64_C (0x12835b0145706fbe),
+- UINT64_C (0x243185be4ee4b28c), UINT64_C (0x550c7dc3d5ffb4e2),
+- UINT64_C (0x72be5d74f27b896f), UINT64_C (0x80deb1fe3b1696b1),
+- UINT64_C (0x9bdc06a725c71235), UINT64_C (0xc19bf174cf692694),
+- UINT64_C (0xe49b69c19ef14ad2), UINT64_C (0xefbe4786384f25e3),
+- UINT64_C (0x0fc19dc68b8cd5b5), UINT64_C (0x240ca1cc77ac9c65),
+- UINT64_C (0x2de92c6f592b0275), UINT64_C (0x4a7484aa6ea6e483),
+- UINT64_C (0x5cb0a9dcbd41fbd4), UINT64_C (0x76f988da831153b5),
+- UINT64_C (0x983e5152ee66dfab), UINT64_C (0xa831c66d2db43210),
+- UINT64_C (0xb00327c898fb213f), UINT64_C (0xbf597fc7beef0ee4),
+- UINT64_C (0xc6e00bf33da88fc2), UINT64_C (0xd5a79147930aa725),
+- UINT64_C (0x06ca6351e003826f), UINT64_C (0x142929670a0e6e70),
+- UINT64_C (0x27b70a8546d22ffc), UINT64_C (0x2e1b21385c26c926),
+- UINT64_C (0x4d2c6dfc5ac42aed), UINT64_C (0x53380d139d95b3df),
+- UINT64_C (0x650a73548baf63de), UINT64_C (0x766a0abb3c77b2a8),
+- UINT64_C (0x81c2c92e47edaee6), UINT64_C (0x92722c851482353b),
+- UINT64_C (0xa2bfe8a14cf10364), UINT64_C (0xa81a664bbc423001),
+- UINT64_C (0xc24b8b70d0f89791), UINT64_C (0xc76c51a30654be30),
+- UINT64_C (0xd192e819d6ef5218), UINT64_C (0xd69906245565a910),
+- UINT64_C (0xf40e35855771202a), UINT64_C (0x106aa07032bbd1b8),
+- UINT64_C (0x19a4c116b8d2d0c8), UINT64_C (0x1e376c085141ab53),
+- UINT64_C (0x2748774cdf8eeb99), UINT64_C (0x34b0bcb5e19b48a8),
+- UINT64_C (0x391c0cb3c5c95a63), UINT64_C (0x4ed8aa4ae3418acb),
+- UINT64_C (0x5b9cca4f7763e373), UINT64_C (0x682e6ff3d6b2b8a3),
+- UINT64_C (0x748f82ee5defb2fc), UINT64_C (0x78a5636f43172f60),
+- UINT64_C (0x84c87814a1f0ab72), UINT64_C (0x8cc702081a6439ec),
+- UINT64_C (0x90befffa23631e28), UINT64_C (0xa4506cebde82bde9),
+- UINT64_C (0xbef9a3f7b2c67915), UINT64_C (0xc67178f2e372532b),
+- UINT64_C (0xca273eceea26619c), UINT64_C (0xd186b8c721c0c207),
+- UINT64_C (0xeada7dd6cde0eb1e), UINT64_C (0xf57d4f7fee6ed178),
+- UINT64_C (0x06f067aa72176fba), UINT64_C (0x0a637dc5a2c898a6),
+- UINT64_C (0x113f9804bef90dae), UINT64_C (0x1b710b35131c471b),
+- UINT64_C (0x28db77f523047d84), UINT64_C (0x32caab7b40c72493),
+- UINT64_C (0x3c9ebe0a15c9bebc), UINT64_C (0x431d67c49c100d4c),
+- UINT64_C (0x4cc5d4becb3e42b6), UINT64_C (0x597f299cfc657e2a),
+- UINT64_C (0x5fcb6fab3ad6faec), UINT64_C (0x6c44198c4a475817)
+-};
++ size_t i;
+
++ for (i = 0; i < len / 8; i++)
++ be64enc(dst + i * 8, src[i]);
++}
+
+-/* Process LEN bytes of BUFFER, accumulating context into CTX.
+- It is assumed that LEN % 128 == 0. */
++/*
++ * Decode a big-endian length len vector of (unsigned char) into a length
++ * len/4 vector of (uint64_t). Assumes len is a multiple of 8.
++ */
+ static void
+-sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
++be64dec_vect(uint64_t *dst, const unsigned char *src, size_t len)
+ {
+- unsigned int t;
+- const unsigned char *p = buffer;
+- size_t nwords = len / sizeof (uint64_t);
+- uint64_t a = ctx->H[0];
+- uint64_t b = ctx->H[1];
+- uint64_t c = ctx->H[2];
+- uint64_t d = ctx->H[3];
+- uint64_t e = ctx->H[4];
+- uint64_t f = ctx->H[5];
+- uint64_t g = ctx->H[6];
+- uint64_t h = ctx->H[7];
+-
+- /* First increment the byte count. FIPS 180-2 specifies the possible
+- length of the file up to 2^128 bits. Here we only compute the
+- number of bytes. Do a double word increment. */
+- ctx->total[0] += len;
+- if (ctx->total[0] < len)
+- ++ctx->total[1];
+-
+- /* Process all bytes in the buffer with 128 bytes in each round of
+- the loop. */
+- while (nwords > 0)
+- {
+- uint64_t W[80];
+- uint64_t a_save = a;
+- uint64_t b_save = b;
+- uint64_t c_save = c;
+- uint64_t d_save = d;
+- uint64_t e_save = e;
+- uint64_t f_save = f;
+- uint64_t g_save = g;
+- uint64_t h_save = h;
+-
+- /* Operators defined in FIPS 180-2:4.1.2. */
+-#define Ch(x, y, z) ((x & y) ^ (~x & z))
+-#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
+-#define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39))
+-#define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41))
+-#define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7))
+-#define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6))
+-
+- /* It is unfortunate that C does not provide an operator for
+- cyclic rotation. Hope the C compiler is smart enough. */
+-#define CYCLIC(w, s) ((w >> s) | (w << (64 - s)))
+-
+- /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */
+- for (t = 0; t < 16; ++t)
+- {
+- W[t] = be64_to_cpu (p);
+- p += 8;
+- }
+- for (t = 16; t < 80; ++t)
+- W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16];
+-
+- /* The actual computation according to FIPS 180-2:6.3.2 step 3. */
+- for (t = 0; t < 80; ++t)
+- {
+- uint64_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t];
+- uint64_t T2 = S0 (a) + Maj (a, b, c);
+- h = g;
+- g = f;
+- f = e;
+- e = d + T1;
+- d = c;
+- c = b;
+- b = a;
+- a = T1 + T2;
+- }
+-
+- /* Add the starting values of the context according to FIPS 180-2:6.3.2
+- step 4. */
+- a += a_save;
+- b += b_save;
+- c += c_save;
+- d += d_save;
+- e += e_save;
+- f += f_save;
+- g += g_save;
+- h += h_save;
+-
+- /* Prepare for the next round. */
+- nwords -= 16;
+- }
+-
+- /* Put checksum in context given as argument. */
+- ctx->H[0] = a;
+- ctx->H[1] = b;
+- ctx->H[2] = c;
+- ctx->H[3] = d;
+- ctx->H[4] = e;
+- ctx->H[5] = f;
+- ctx->H[6] = g;
+- ctx->H[7] = h;
++ size_t i;
++
++ for (i = 0; i < len / 8; i++)
++ dst[i] = be64dec(src + i * 8);
+ }
+
++#endif /* IS_BIGENDIAN */
++
++/* Elementary functions used by SHA512 */
++#define Ch(x, y, z) ((x & (y ^ z)) ^ z)
++#define Maj(x, y, z) ((x & (y | z)) | (y & z))
++#define SHR(x, n) (x >> n)
++#define ROTR(x, n) ((x >> n) | (x << (64 - n)))
++#define S0(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
++#define S1(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
++#define s0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
++#define s1(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6))
++
++/* SHA512 round function */
++#define RND(a, b, c, d, e, f, g, h, k) \
++ t0 = h + S1(e) + Ch(e, f, g) + k; \
++ t1 = S0(a) + Maj(a, b, c); \
++ d += t0; \
++ h = t0 + t1;
++
++/* Adjusted round function for rotating state */
++#define RNDr(S, W, i, k) \
++ RND(S[(80 - i) % 8], S[(81 - i) % 8], \
++ S[(82 - i) % 8], S[(83 - i) % 8], \
++ S[(84 - i) % 8], S[(85 - i) % 8], \
++ S[(86 - i) % 8], S[(87 - i) % 8], \
++ W[i] + k)
++
++/*
++ * SHA512 block compression function. The 512-bit state is transformed via
++ * the 512-bit input block to produce a new state.
++ */
++static void
++SHA512_Transform(uint64_t * state, const unsigned char block[128])
++{
++ uint64_t W[80];
++ uint64_t S[8];
++ uint64_t t0, t1;
++ int i;
++
++ /* 1. Prepare message schedule W. */
++ be64dec_vect(W, block, 128);
++ for (i = 16; i < 80; i++)
++ W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
++
++ /* 2. Initialize working variables. */
++ memcpy(S, state, 64);
++
++ /* 3. Mix. */
++ RNDr(S, W, 0, 0x428a2f98d728ae22ULL);
++ RNDr(S, W, 1, 0x7137449123ef65cdULL);
++ RNDr(S, W, 2, 0xb5c0fbcfec4d3b2fULL);
++ RNDr(S, W, 3, 0xe9b5dba58189dbbcULL);
++ RNDr(S, W, 4, 0x3956c25bf348b538ULL);
++ RNDr(S, W, 5, 0x59f111f1b605d019ULL);
++ RNDr(S, W, 6, 0x923f82a4af194f9bULL);
++ RNDr(S, W, 7, 0xab1c5ed5da6d8118ULL);
++ RNDr(S, W, 8, 0xd807aa98a3030242ULL);
++ RNDr(S, W, 9, 0x12835b0145706fbeULL);
++ RNDr(S, W, 10, 0x243185be4ee4b28cULL);
++ RNDr(S, W, 11, 0x550c7dc3d5ffb4e2ULL);
++ RNDr(S, W, 12, 0x72be5d74f27b896fULL);
++ RNDr(S, W, 13, 0x80deb1fe3b1696b1ULL);
++ RNDr(S, W, 14, 0x9bdc06a725c71235ULL);
++ RNDr(S, W, 15, 0xc19bf174cf692694ULL);
++ RNDr(S, W, 16, 0xe49b69c19ef14ad2ULL);
++ RNDr(S, W, 17, 0xefbe4786384f25e3ULL);
++ RNDr(S, W, 18, 0x0fc19dc68b8cd5b5ULL);
++ RNDr(S, W, 19, 0x240ca1cc77ac9c65ULL);
++ RNDr(S, W, 20, 0x2de92c6f592b0275ULL);
++ RNDr(S, W, 21, 0x4a7484aa6ea6e483ULL);
++ RNDr(S, W, 22, 0x5cb0a9dcbd41fbd4ULL);
++ RNDr(S, W, 23, 0x76f988da831153b5ULL);
++ RNDr(S, W, 24, 0x983e5152ee66dfabULL);
++ RNDr(S, W, 25, 0xa831c66d2db43210ULL);
++ RNDr(S, W, 26, 0xb00327c898fb213fULL);
++ RNDr(S, W, 27, 0xbf597fc7beef0ee4ULL);
++ RNDr(S, W, 28, 0xc6e00bf33da88fc2ULL);
++ RNDr(S, W, 29, 0xd5a79147930aa725ULL);
++ RNDr(S, W, 30, 0x06ca6351e003826fULL);
++ RNDr(S, W, 31, 0x142929670a0e6e70ULL);
++ RNDr(S, W, 32, 0x27b70a8546d22ffcULL);
++ RNDr(S, W, 33, 0x2e1b21385c26c926ULL);
++ RNDr(S, W, 34, 0x4d2c6dfc5ac42aedULL);
++ RNDr(S, W, 35, 0x53380d139d95b3dfULL);
++ RNDr(S, W, 36, 0x650a73548baf63deULL);
++ RNDr(S, W, 37, 0x766a0abb3c77b2a8ULL);
++ RNDr(S, W, 38, 0x81c2c92e47edaee6ULL);
++ RNDr(S, W, 39, 0x92722c851482353bULL);
++ RNDr(S, W, 40, 0xa2bfe8a14cf10364ULL);
++ RNDr(S, W, 41, 0xa81a664bbc423001ULL);
++ RNDr(S, W, 42, 0xc24b8b70d0f89791ULL);
++ RNDr(S, W, 43, 0xc76c51a30654be30ULL);
++ RNDr(S, W, 44, 0xd192e819d6ef5218ULL);
++ RNDr(S, W, 45, 0xd69906245565a910ULL);
++ RNDr(S, W, 46, 0xf40e35855771202aULL);
++ RNDr(S, W, 47, 0x106aa07032bbd1b8ULL);
++ RNDr(S, W, 48, 0x19a4c116b8d2d0c8ULL);
++ RNDr(S, W, 49, 0x1e376c085141ab53ULL);
++ RNDr(S, W, 50, 0x2748774cdf8eeb99ULL);
++ RNDr(S, W, 51, 0x34b0bcb5e19b48a8ULL);
++ RNDr(S, W, 52, 0x391c0cb3c5c95a63ULL);
++ RNDr(S, W, 53, 0x4ed8aa4ae3418acbULL);
++ RNDr(S, W, 54, 0x5b9cca4f7763e373ULL);
++ RNDr(S, W, 55, 0x682e6ff3d6b2b8a3ULL);
++ RNDr(S, W, 56, 0x748f82ee5defb2fcULL);
++ RNDr(S, W, 57, 0x78a5636f43172f60ULL);
++ RNDr(S, W, 58, 0x84c87814a1f0ab72ULL);
++ RNDr(S, W, 59, 0x8cc702081a6439ecULL);
++ RNDr(S, W, 60, 0x90befffa23631e28ULL);
++ RNDr(S, W, 61, 0xa4506cebde82bde9ULL);
++ RNDr(S, W, 62, 0xbef9a3f7b2c67915ULL);
++ RNDr(S, W, 63, 0xc67178f2e372532bULL);
++ RNDr(S, W, 64, 0xca273eceea26619cULL);
++ RNDr(S, W, 65, 0xd186b8c721c0c207ULL);
++ RNDr(S, W, 66, 0xeada7dd6cde0eb1eULL);
++ RNDr(S, W, 67, 0xf57d4f7fee6ed178ULL);
++ RNDr(S, W, 68, 0x06f067aa72176fbaULL);
++ RNDr(S, W, 69, 0x0a637dc5a2c898a6ULL);
++ RNDr(S, W, 70, 0x113f9804bef90daeULL);
++ RNDr(S, W, 71, 0x1b710b35131c471bULL);
++ RNDr(S, W, 72, 0x28db77f523047d84ULL);
++ RNDr(S, W, 73, 0x32caab7b40c72493ULL);
++ RNDr(S, W, 74, 0x3c9ebe0a15c9bebcULL);
++ RNDr(S, W, 75, 0x431d67c49c100d4cULL);
++ RNDr(S, W, 76, 0x4cc5d4becb3e42b6ULL);
++ RNDr(S, W, 77, 0x597f299cfc657e2aULL);
++ RNDr(S, W, 78, 0x5fcb6fab3ad6faecULL);
++ RNDr(S, W, 79, 0x6c44198c4a475817ULL);
++
++ /* 4. Mix local working variables into global state */
++ for (i = 0; i < 8; i++)
++ state[i] += S[i];
++}
+
+-/* Initialize structure containing state of computation.
+- (FIPS 180-2:5.3.3) */
+-void
+-sha512_init_ctx (struct sha512_ctx *ctx)
++static unsigned char PAD[128] = {
++ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
++};
++
++/* Add padding and terminating bit-count. */
++static void
++SHA512_Pad(SHA512_CTX * ctx)
+ {
+- ctx->H[0] = UINT64_C (0x6a09e667f3bcc908);
+- ctx->H[1] = UINT64_C (0xbb67ae8584caa73b);
+- ctx->H[2] = UINT64_C (0x3c6ef372fe94f82b);
+- ctx->H[3] = UINT64_C (0xa54ff53a5f1d36f1);
+- ctx->H[4] = UINT64_C (0x510e527fade682d1);
+- ctx->H[5] = UINT64_C (0x9b05688c2b3e6c1f);
+- ctx->H[6] = UINT64_C (0x1f83d9abfb41bd6b);
+- ctx->H[7] = UINT64_C (0x5be0cd19137e2179);
+-
+- ctx->total[0] = ctx->total[1] = 0;
+- ctx->buflen = 0;
++ unsigned char len[16];
++ uint64_t r, plen;
++
++ /*
++ * Convert length to a vector of bytes -- we do this now rather
++ * than later because the length will change after we pad.
++ */
++ be64enc_vect(len, ctx->count, 16);
++
++ /* Add 1--128 bytes so that the resulting length is 112 mod 128 */
++ r = (ctx->count[1] >> 3) & 0x7f;
++ plen = (r < 112) ? (112 - r) : (240 - r);
++ SHA512_Update(ctx, PAD, (size_t)plen);
++
++ /* Add the terminating bit-count */
++ SHA512_Update(ctx, len, 16);
+ }
+
++/* SHA-512 initialization. Begins a SHA-512 operation. */
++void
++SHA512_Init(SHA512_CTX * ctx)
++{
+
+-/* Process the remaining bytes in the internal buffer and the usual
+- prolog according to the standard and write the result to RESBUF.
++ /* Zero bits processed so far */
++ ctx->count[0] = ctx->count[1] = 0;
++
++ /* Magic initialization constants */
++ ctx->state[0] = 0x6a09e667f3bcc908ULL;
++ ctx->state[1] = 0xbb67ae8584caa73bULL;
++ ctx->state[2] = 0x3c6ef372fe94f82bULL;
++ ctx->state[3] = 0xa54ff53a5f1d36f1ULL;
++ ctx->state[4] = 0x510e527fade682d1ULL;
++ ctx->state[5] = 0x9b05688c2b3e6c1fULL;
++ ctx->state[6] = 0x1f83d9abfb41bd6bULL;
++ ctx->state[7] = 0x5be0cd19137e2179ULL;
++}
+
+- IMPORTANT: On some systems it is required that RESBUF is correctly
+- aligned for a 32 bits value. */
+-void *
+-sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
++/* Add bytes into the hash */
++void
++SHA512_Update(SHA512_CTX * ctx, const void *in, size_t len)
+ {
+- /* Take yet unprocessed bytes into account. */
+- uint32_t bytes = ctx->buflen;
+- size_t pad;
+- unsigned int i;
+- unsigned char *rp = resbuf;
+-
+- /* Now count remaining bytes. */
+- ctx->total[0] += bytes;
+- if (ctx->total[0] < bytes)
+- ++ctx->total[1];
+-
+- pad = bytes >= 112 ? 128 + 112 - bytes : 112 - bytes;
+- /* The first byte of padding should be 0x80 and the rest should be
+- zero. (FIPS 180-2:5.1.2) */
+- ctx->buffer[bytes] = 0x80u;
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[bytes+1], pad-1);
+-
+- /* Put the 128-bit file length in big-endian *bits* at the end of
+- the buffer. */
+- cpu_to_be64 (&ctx->buffer[bytes + pad],
+- (ctx->total[1] << 3) | (ctx->total[0] >> 61));
+- cpu_to_be64 (&ctx->buffer[bytes + pad + 8],
+- ctx->total[0] << 3);
+-
+- /* Process last bytes. */
+- sha512_process_block (ctx->buffer, bytes + pad + 16, ctx);
+-
+- /* Put result from CTX in first 64 bytes following RESBUF. */
+- for (i = 0; i < 8; ++i)
+- cpu_to_be64 (rp + i*8, ctx->H[i]);
+-
+- XCRYPT_SECURE_MEMSET (ctx, sizeof (struct sha512_ctx));
+- return resbuf;
++ uint64_t bitlen[2];
++ uint64_t r;
++ const unsigned char *src = in;
++
++ /* Number of bytes left in the buffer from previous updates */
++ r = (ctx->count[1] >> 3) & 0x7f;
++
++ /* Convert the length into a number of bits */
++ bitlen[1] = ((uint64_t)len) << 3;
++ bitlen[0] = ((uint64_t)len) >> 61;
++
++ /* Update number of bits */
++ if ((ctx->count[1] += bitlen[1]) < bitlen[1])
++ ctx->count[0]++;
++ ctx->count[0] += bitlen[0];
++
++ /* Handle the case where we don't need to perform any transforms */
++ if (len < 128 - r) {
++ memcpy(&ctx->buf[r], src, len);
++ return;
++ }
++
++ /* Finish the current block */
++ memcpy(&ctx->buf[r], src, 128 - r);
++ SHA512_Transform(ctx->state, ctx->buf);
++ src += 128 - r;
++ len -= 128 - r;
++
++ /* Perform complete blocks */
++ while (len >= 128) {
++ SHA512_Transform(ctx->state, src);
++ src += 128;
++ len -= 128;
++ }
++
++ /* Copy left over data into buffer */
++ memcpy(ctx->buf, src, len);
+ }
+
++/*
++ * SHA-512 finalization. Pads the input data, exports the hash value,
++ * and clears the context state.
++ */
++void
++SHA512_Final(unsigned char digest[64], SHA512_CTX * ctx)
++{
++
++ /* Add padding */
++ SHA512_Pad(ctx);
+
++ /* Write the hash */
++ be64enc_vect(digest, ctx->state, 64);
++
++ /* Clear the context state */
++ XCRYPT_SECURE_MEMSET(ctx, sizeof (*ctx));
++}
++
++/**
++ * SHA512_Buf(in, len, digest):
++ * Compute the SHA512 hash of ${len} bytes from ${in} and write it to ${digest}.
++ */
+ void
+-sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx)
++SHA512_Buf(const void * in, size_t len, uint8_t digest[64])
+ {
+- /* When we already have some bits in our internal buffer concatenate
+- both inputs first. */
+- if (ctx->buflen != 0)
+- {
+- uint32_t left_over = ctx->buflen;
+- uint32_t add = 256 - left_over > len ? (uint32_t)len : 256 - left_over;
+-
+- memcpy (&ctx->buffer[left_over], buffer, add);
+- ctx->buflen += add;
+-
+- if (ctx->buflen > 128)
+- {
+- sha512_process_block (ctx->buffer, ctx->buflen & ~127u, ctx);
+-
+- ctx->buflen &= 127;
+- /* The regions in the following copy operation cannot overlap. */
+- memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~127u],
+- ctx->buflen);
+- }
+-
+- buffer = (const char *) buffer + add;
+- len -= add;
+- }
+-
+- /* Process available complete blocks. */
+- if (len > 128)
+- {
+- sha512_process_block (buffer, len & ~127u, ctx);
+- buffer = (const char *) buffer + (len & ~127u);
+- len &= 127;
+- }
+-
+- /* Move remaining bytes into internal buffer. */
+- if (len > 0)
+- {
+- size_t left_over = ctx->buflen;
+-
+- memcpy (&ctx->buffer[left_over], buffer, len);
+- left_over += len;
+- if (left_over >= 128)
+- {
+- sha512_process_block (ctx->buffer, 128, ctx);
+- left_over -= 128;
+- memcpy (ctx->buffer, &ctx->buffer[128], left_over);
+- }
+- ctx->buflen = (uint32_t)left_over;
+- }
++ SHA512_CTX ctx;
++
++ SHA512_Init(&ctx);
++ SHA512_Update(&ctx, in, len);
++ SHA512_Final(digest, &ctx);
++
++ /* Clean the stack. */
++ XCRYPT_SECURE_MEMSET(&ctx, sizeof(SHA512_CTX));
+ }
+
+ #endif
+diff --git a/alg-sha512.h b/alg-sha512.h
+index c11329e..c591bb1 100644
+--- a/alg-sha512.h
++++ b/alg-sha512.h
+@@ -1,46 +1,75 @@
+-/* Declaration of functions and data types used for SHA512 sum computing
+- library functions.
+- Copyright (C) 2007-2017 Free Software Foundation, Inc.
+-
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
+-
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
+-
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
+-
+-#ifndef _CRYPT_ALG_SHA512_H
+-#define _CRYPT_ALG_SHA512_H 1
+-
+-/* Structure to save state of computation between the single steps. */
+-struct sha512_ctx
+-{
+- uint64_t H[8];
+-
+- uint64_t total[2];
+- uint32_t buflen;
+- unsigned char buffer[256];
+-};
+-
+-/* Initialize structure containing state of computation.
+- (FIPS 180-2: 5.3.3) */
+-extern void sha512_init_ctx (struct sha512_ctx *ctx);
+-
+-/* Starting with the result of former calls of this function (or the
+- initialization function) update the context for the next LEN bytes
+- starting at BUFFER. LEN does not need to be a multiple of 128. */
+-extern void sha512_process_bytes (const void *buffer, size_t len,
+- struct sha512_ctx *ctx);
+-
+-/* Process the remaining bytes in the buffer and write the finalized
+- hash to RESBUF, which should point to 64 bytes of storage. */
+-extern void *sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf);
+-
+-#endif /* alg-sha512.h */
++/*-
++ * Copyright 2005 Colin Percival
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++
++#ifndef _SHA512_H_
++#define _SHA512_H_
++
++#include <stddef.h>
++#include <stdint.h>
++
++/*
++ * Use #defines in order to avoid namespace collisions with anyone else's
++ * SHA512 code (e.g., the code in OpenSSL).
++ */
++#define SHA512_Init libcperciva_SHA512_Init
++#define SHA512_Update libcperciva_SHA512_Update
++#define SHA512_Final libcperciva_SHA512_Final
++#define SHA512_Buf libcperciva_SHA512_Buf
++#define SHA512_CTX libcperciva_SHA512_CTX
++
++/* Context structure for SHA512 operations. */
++typedef struct {
++ uint64_t state[8];
++ uint64_t count[2];
++ uint8_t buf[128];
++} SHA512_CTX;
++
++/**
++ * SHA512_Init(ctx):
++ * Initialize the SHA512 context ${ctx}.
++ */
++void SHA512_Init(SHA512_CTX *);
++
++/**
++ * SHA512_Update(ctx, in, len):
++ * Input ${len} bytes from ${in} into the SHA512 context ${ctx}.
++ */
++void SHA512_Update(SHA512_CTX *, const void *, size_t);
++
++/**
++ * SHA512_Final(digest, ctx):
++ * Output the SHA512 hash of the data input to the context ${ctx} into the
++ * buffer ${digest}.
++ */
++void SHA512_Final(uint8_t[64], SHA512_CTX *);
++
++/**
++ * SHA512_Buf(in, len, digest):
++ * Compute the SHA512 hash of ${len} bytes from ${in} and write it to ${digest}.
++ */
++void SHA512_Buf(const void *, size_t, uint8_t[64]);
++
++#endif /* !_SHA512_H_ */
+diff --git a/alg-yescrypt-sysendian.h b/alg-yescrypt-sysendian.h
+index e2e41cd..b877e07 100644
+--- a/alg-yescrypt-sysendian.h
++++ b/alg-yescrypt-sysendian.h
+@@ -37,6 +37,7 @@
+ /* Avoid namespace collisions with BSD <sys/endian.h>. */
+ #define be32dec libcperciva_be32dec
+ #define be32enc libcperciva_be32enc
++#define be64dec libcperciva_be64dec
+ #define be64enc libcperciva_be64enc
+ #define le32dec libcperciva_le32dec
+ #define le32enc libcperciva_le32enc
+@@ -61,6 +62,17 @@ be32enc(void * pp, uint32_t x)
+ p[0] = (x >> 24) & 0xff;
+ }
+
++static inline uint64_t
++be64dec(const void *pp)
++{
++ const uint8_t *p = (uint8_t const *)pp;
++
++ return ((uint64_t)(p[7]) + ((uint64_t)(p[6]) << 8) +
++ ((uint64_t)(p[5]) << 16) + ((uint64_t)(p[4]) << 24) +
++ ((uint64_t)(p[3]) << 32) + ((uint64_t)(p[2]) << 40) +
++ ((uint64_t)(p[1]) << 48) + ((uint64_t)(p[0]) << 56));
++}
++
+ static inline void
+ be64enc(void * pp, uint64_t x)
+ {
+diff --git a/crypt-port.h b/crypt-port.h
+index 5f4d55f..a2c64b3 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -260,9 +260,10 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #endif
+
+ #if INCLUDE_sha512
+-#define sha512_finish_ctx _crypt_sha512_finish_ctx
+-#define sha512_init_ctx _crypt_sha512_init_ctx
+-#define sha512_process_bytes _crypt_sha512_process_bytes
++#define libcperciva_SHA512_Init _crypt_SHA512_Init
++#define libcperciva_SHA512_Update _crypt_SHA512_Update
++#define libcperciva_SHA512_Final _crypt_SHA512_Final
++#define libcperciva_SHA512_Buf _crypt_SHA512_Buf
+ #endif
+
+ #if INCLUDE_md5 || INCLUDE_sha256 || INCLUDE_sha512
+diff --git a/crypt-sha512.c b/crypt-sha512.c
+index 39ec0b5..2b6b444 100644
+--- a/crypt-sha512.c
++++ b/crypt-sha512.c
+@@ -58,7 +58,7 @@ static_assert (SHA512_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,
+ /* A sha512_buffer holds all of the sensitive intermediate data. */
+ struct sha512_buffer
+ {
+- struct sha512_ctx ctx;
++ SHA512_CTX ctx;
+ uint8_t result[64];
+ uint8_t p_bytes[64];
+ uint8_t s_bytes[64];
+@@ -77,12 +77,12 @@ static const char b64t[] =
+ indefinitely. */
+ static void
+ sha512_process_recycled_bytes (unsigned char block[64], size_t len,
+- struct sha512_ctx *ctx)
++ SHA512_CTX *ctx)
+ {
+ size_t cnt;
+ for (cnt = len; cnt >= 64; cnt -= 64)
+- sha512_process_bytes (block, 64, ctx);
+- sha512_process_bytes (block, cnt, ctx);
++ SHA512_Update (ctx, block, 64);
++ SHA512_Update (ctx, block, cnt);
+ }
+
+ void
+@@ -100,7 +100,7 @@ crypt_sha512_rn (const char *phrase, size_t phr_size,
+ }
+
+ struct sha512_buffer *buf = scratch;
+- struct sha512_ctx *ctx = &buf->ctx;
++ SHA512_CTX *ctx = &buf->ctx;
+ uint8_t *result = buf->result;
+ uint8_t *p_bytes = buf->p_bytes;
+ uint8_t *s_bytes = buf->s_bytes;
+@@ -158,80 +158,80 @@ crypt_sha512_rn (const char *phrase, size_t phr_size,
+
+ /* Compute alternate SHA512 sum with input PHRASE, SALT, and PHRASE. The
+ final result will be added to the first context. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* Add phrase. */
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Add salt. */
+- sha512_process_bytes (salt, salt_size, ctx);
++ SHA512_Update (ctx, salt, salt_size);
+
+ /* Add phrase again. */
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Now get result of this (64 bytes) and add it to the other
+ context. */
+- sha512_finish_ctx (ctx, result);
++ SHA512_Final (result, ctx);
+
+ /* Prepare for the real work. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* Add the phrase string. */
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* The last part is the salt string. This must be at most 8
+ characters and it ends at the first `$' character (for
+ compatibility with existing implementations). */
+- sha512_process_bytes (salt, salt_size, ctx);
++ SHA512_Update (ctx, salt, salt_size);
+
+ /* Add for any character in the phrase one byte of the alternate sum. */
+ for (cnt = phr_size; cnt > 64; cnt -= 64)
+- sha512_process_bytes (result, 64, ctx);
+- sha512_process_bytes (result, cnt, ctx);
++ SHA512_Update (ctx, result, 64);
++ SHA512_Update (ctx, result, cnt);
+
+ /* Take the binary representation of the length of the phrase and for every
+ 1 add the alternate sum, for every 0 the phrase. */
+ for (cnt = phr_size; cnt > 0; cnt >>= 1)
+ if ((cnt & 1) != 0)
+- sha512_process_bytes (result, 64, ctx);
++ SHA512_Update (ctx, result, 64);
+ else
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Create intermediate result. */
+- sha512_finish_ctx (ctx, result);
++ SHA512_Final (result, ctx);
+
+ /* Start computation of P byte sequence. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* For every character in the password add the entire password. */
+ for (cnt = 0; cnt < phr_size; ++cnt)
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Finish the digest. */
+- sha512_finish_ctx (ctx, p_bytes);
++ SHA512_Final (p_bytes, ctx);
+
+ /* Start computation of S byte sequence. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* For every character in the password add the entire password. */
+ for (cnt = 0; cnt < (size_t) 16 + (size_t) result[0]; ++cnt)
+- sha512_process_bytes (salt, salt_size, ctx);
++ SHA512_Update (ctx, salt, salt_size);
+
+ /* Finish the digest. */
+- sha512_finish_ctx (ctx, s_bytes);
++ SHA512_Final (s_bytes, ctx);
+
+ /* Repeatedly run the collected hash value through SHA512 to burn
+ CPU cycles. */
+ for (cnt = 0; cnt < rounds; ++cnt)
+ {
+ /* New context. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+ sha512_process_recycled_bytes (p_bytes, phr_size, ctx);
+ else
+- sha512_process_bytes (result, 64, ctx);
++ SHA512_Update (ctx, result, 64);
+
+ /* Add salt for numbers not divisible by 3. */
+ if (cnt % 3 != 0)
+@@ -243,12 +243,12 @@ crypt_sha512_rn (const char *phrase, size_t phr_size,
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+- sha512_process_bytes (result, 64, ctx);
++ SHA512_Update (ctx, result, 64);
+ else
+ sha512_process_recycled_bytes (p_bytes, phr_size, ctx);
+
+ /* Create intermediate result. */
+- sha512_finish_ctx (ctx, result);
++ SHA512_Final (result, ctx);
+ }
+
+ /* Now we can construct the result string. It consists of four
+diff --git a/test-alg-sha512.c b/test-alg-sha512.c
+index b6d4fc6..5f9af9c 100644
+--- a/test-alg-sha512.c
++++ b/test-alg-sha512.c
+@@ -84,7 +84,7 @@ static const struct
+
+ static void
+ report_failure(int n, const char *tag,
+- const char expected[64], const char actual[64])
++ const char expected[64], const uint8_t actual[64])
+ {
+ int i;
+ printf ("FAIL: test %d (%s):\n exp:", n, tag);
+@@ -112,28 +112,25 @@ report_failure(int n, const char *tag,
+ int
+ main (void)
+ {
+- struct sha512_ctx ctx;
+- char sum[64];
++ SHA512_CTX ctx;
++ uint8_t sum[64];
+ int result = 0;
+ int cnt;
+ int i;
+
+ for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)
+ {
+- sha512_init_ctx (&ctx);
+- sha512_process_bytes (tests[cnt].input, strlen (tests[cnt].input),
+- &ctx);
+- sha512_finish_ctx (&ctx, sum);
++ SHA512_Buf (tests[cnt].input, strlen (tests[cnt].input), sum);
+ if (memcmp (tests[cnt].result, sum, 64) != 0)
+ {
+ report_failure (cnt, "all at once", tests[cnt].result, sum);
+ result = 1;
+ }
+
+- sha512_init_ctx (&ctx);
++ SHA512_Init (&ctx);
+ for (i = 0; tests[cnt].input[i] != '\0'; ++i)
+- sha512_process_bytes (&tests[cnt].input[i], 1, &ctx);
+- sha512_finish_ctx (&ctx, sum);
++ SHA512_Update (&ctx, &tests[cnt].input[i], 1);
++ SHA512_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 64) != 0)
+ {
+ report_failure (cnt, "byte by byte", tests[cnt].result, sum);
+@@ -144,10 +141,10 @@ main (void)
+ /* Test vector from FIPS 180-2: appendix C.3. */
+ char buf[1000];
+ memset (buf, 'a', sizeof (buf));
+- sha512_init_ctx (&ctx);
++ SHA512_Init (&ctx);
+ for (i = 0; i < 1000; ++i)
+- sha512_process_bytes (buf, sizeof (buf), &ctx);
+- sha512_finish_ctx (&ctx, sum);
++ SHA512_Update (&ctx, buf, sizeof (buf));
++ SHA512_Final (sum, &ctx);
+ static const char expected[64] =
+ "\xe7\x18\x48\x3d\x0c\xe7\x69\x64\x4e\x2e\x42\xc7\xbc\x15\xb4\x63"
+ "\x8e\x1f\x98\xb1\x3b\x20\x44\x28\x56\x32\xa8\x03\xaf\xa9\x73\xeb"
+
+From 4964877dbf96d951b3f45b2dba97459404d1dff8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 13:48:34 +0200
+Subject: [PATCH 10/17] Use md5 implementation from Alexander Peslyak.
+
+Thus we now have a md5 implementation in the public domain.
+---
+ LICENSING | 5 +-
+ NEWS | 2 +
+ TODO.md | 2 -
+ alg-md5.c | 539 ++++++++++++++++++++++++-------------------------
+ alg-md5.h | 79 ++++----
+ crypt-md5.c | 47 +++--
+ crypt-port.h | 6 +-
+ crypt-sunmd5.c | 20 +-
+ test-alg-md5.c | 24 +--
+ 9 files changed, 349 insertions(+), 375 deletions(-)
+
+diff --git a/LICENSING b/LICENSING
+index 31f704c..0ed22f5 100644
+--- a/LICENSING
++++ b/LICENSING
+@@ -13,7 +13,7 @@ source tree. For specific licensing terms consult the files themselves.
+
+ * Copyright Free Software Foundation, Inc.; LGPL (v2.1 or later):
+ crypt.h, crypt-obsolete.h, crypt-private.h
+- alg-md5.h, alg-md5.c, crypt-md5.c,
++ crypt-md5.c,
+ test-crypt-badsalt.c, test-crypt-nonnull.c
+
+ * Copyright David Burren et al.; 3-clause BSD:
+@@ -24,7 +24,8 @@ source tree. For specific licensing terms consult the files themselves.
+ crypt-sha256.c, crypt-sha512.c
+
+ * Public domain, written by Solar Designer et al.:
+- alg-md4.h, alg-md4.c, crypt-bcrypt.c, crypt-gensalt.c, test-crypt-bcrypt.c
++ alg-md4.h, alg-md4.c, alg-md5.h, alg-md5.c,
++ crypt-bcrypt.c, crypt-gensalt.c, test-crypt-bcrypt.c
+
+ * Copyright Solar Designer, Colin Percival; 0-clause BSD:
+ alg-yescrypt-common.c, alg-yescrypt-platform.c
+diff --git a/NEWS b/NEWS
+index c4b04da..e48b0d1 100644
+--- a/NEWS
++++ b/NEWS
+@@ -8,6 +8,8 @@ Version 4.2.3
+ tarball release, use './bootstrap' to create the configure script.
+ * Use sha512 implementation from Colin Percival. Thus we now have a
+ sha512 implementation under the BSD license.
++* Use md5 implementation from Alexander Peslyak. Thus we now have a
++ md5 implementation in the public domain.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/TODO.md b/TODO.md
+index c4e2799..7df4ca5 100644
+--- a/TODO.md
++++ b/TODO.md
+@@ -95,8 +95,6 @@ It was last updated 20 October 2018.
+ at it, and no destructor function
+
+ * Permissive relicensing, to encourage use beyond the GNU ecosystem?
+- * Replace remaining (L)GPLed crypto primitives (MD5) with
+- permissively licensed equivalents (e.g. from Openwall)
+ * Replace crypt-md5.c with original md5crypt from FreeBSD?
+ * Other files subject to the (L)GPL are crypt.c, crypt-static.c,
+ crypt-gensalt-static.c, crypt-obsolete.h, crypt-port.h,
+diff --git a/alg-md5.c b/alg-md5.c
+index 9d9e4e3..8382b98 100644
+--- a/alg-md5.c
++++ b/alg-md5.c
+@@ -1,308 +1,291 @@
+-/* Functions to compute MD5 message digest of files or memory blocks.
+- according to the definition of MD5 in RFC 1321 from April 1992.
+-
+- Copyright (C) 1995-2017 Free Software Foundation, Inc.
+-
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
+-
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
+-
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
+-
+-/* Written by Ulrich Drepper <drepper(a)gnu.ai.mit.edu>, 1995. */
++/*
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD5 Message-Digest Algorithm (RFC 1321).
++ *
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
++ *
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
++ *
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * (This is a heavily cut-down "BSD license".)
++ *
++ * This differs from Colin Plumb's older public domain implementation in that
++ * no exactly 32-bit integer data type is required (any 32-bit or wider
++ * unsigned integer data type will do), there's no compile-time endianness
++ * configuration, and the function prototypes match OpenSSL's. No code from
++ * Colin Plumb's implementation has been reused; this comment merely compares
++ * the properties of the two independent implementations.
++ *
++ * The primary goals of this implementation are portability and ease of use.
++ * It is meant to be fast, but not as fast as possible. Some known
++ * optimizations are not included to reduce source code size and avoid
++ * compile-time configuration.
++ */
+
+ #include "crypt-port.h"
+-#include "alg-md5.h"
+-#include "byteorder.h"
+
+ #if INCLUDE_md5 || INCLUDE_sunmd5
+
+-static void md5_process_block (const void *buffer, size_t len,
+- struct md5_ctx *ctx);
++#include "alg-md5.h"
+
+-/* Initialize structure containing state of computation.
+- (RFC 1321, 3.3: Step 3) */
+-void
+-md5_init_ctx (struct md5_ctx *ctx)
+-{
+- ctx->A = 0x67452301;
+- ctx->B = 0xefcdab89;
+- ctx->C = 0x98badcfe;
+- ctx->D = 0x10325476;
++/*
++ * The basic MD5 functions.
++ *
++ * F and G are optimized compared to their RFC 1321 definitions for
++ * architectures that lack an AND-NOT instruction, just like in Colin Plumb's
++ * implementation.
++ */
++#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
++#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
++#define H(x, y, z) (((x) ^ (y)) ^ (z))
++#define H2(x, y, z) ((x) ^ ((y) ^ (z)))
++#define I(x, y, z) ((y) ^ ((x) | ~(z)))
++
++/*
++ * The MD5 transformation for all four rounds.
++ */
++#define STEP(f, a, b, c, d, x, t, s) \
++ (a) += f((b), (c), (d)) + (x) + (t); \
++ (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
++ (a) += (b);
++
++/*
++ * SET reads 4 input bytes in little-endian byte order and stores them in a
++ * properly aligned word in host byte order.
++ *
++ * The check for little-endian architectures that tolerate unaligned memory
++ * accesses is just an optimization. Nothing will break if it fails to detect
++ * a suitable architecture.
++ *
++ * Unfortunately, this optimization may be a C strict aliasing rules violation
++ * if the caller's data buffer has effective type that cannot be aliased by
++ * MD5_u32plus. In practice, this problem may occur if these MD5 routines are
++ * inlined into a calling function, or with future and dangerously advanced
++ * link-time optimizations. For the time being, keeping these MD5 routines in
++ * their own translation unit avoids the problem.
++ */
++#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#define SET(n) \
++ (*(const MD5_u32plus *)&ptr[(n) * 4])
++#define GET(n) \
++ SET(n)
++#else
++#define SET(n) \
++ (ctx->block[(n)] = \
++ (MD5_u32plus)ptr[(n) * 4] | \
++ ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \
++ ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \
++ ((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
++#define GET(n) \
++ (ctx->block[(n)])
++#endif
+
+- ctx->total = 0;
+- ctx->buflen = 0;
++/*
++ * This processes one or more 64-byte data blocks, but does NOT update the bit
++ * counters. There are no alignment requirements.
++ */
++static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
++{
++ const unsigned char *ptr;
++ MD5_u32plus a, b, c, d;
++ MD5_u32plus saved_a, saved_b, saved_c, saved_d;
++
++ ptr = (const unsigned char *)data;
++
++ a = ctx->a;
++ b = ctx->b;
++ c = ctx->c;
++ d = ctx->d;
++
++ do {
++ saved_a = a;
++ saved_b = b;
++ saved_c = c;
++ saved_d = d;
++
++/* Round 1 */
++ STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
++ STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
++ STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
++ STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
++ STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
++ STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
++ STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
++ STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
++ STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
++ STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
++ STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
++ STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
++ STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
++ STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
++ STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
++ STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
++
++/* Round 2 */
++ STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
++ STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
++ STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
++ STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
++ STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
++ STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
++ STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
++ STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
++ STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
++ STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
++ STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
++ STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
++ STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
++ STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
++ STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
++ STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
++
++/* Round 3 */
++ STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
++ STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)
++ STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
++ STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)
++ STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
++ STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)
++ STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
++ STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)
++ STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
++ STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)
++ STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
++ STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)
++ STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
++ STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)
++ STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
++ STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)
++
++/* Round 4 */
++ STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
++ STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
++ STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
++ STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
++ STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
++ STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
++ STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
++ STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
++ STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
++ STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
++ STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
++ STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
++ STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
++ STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
++ STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
++ STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
++
++ a += saved_a;
++ b += saved_b;
++ c += saved_c;
++ d += saved_d;
++
++ ptr += 64;
++ } while (size -= 64);
++
++ ctx->a = a;
++ ctx->b = b;
++ ctx->c = c;
++ ctx->d = d;
++
++ return ptr;
+ }
+
+-/* Put result from CTX in first 16 bytes following RESBUF. The result
+- will be in little endian byte order. */
+-static void *
+-md5_read_ctx (struct md5_ctx *ctx, void *resbuf)
++void MD5_Init(MD5_CTX *ctx)
+ {
+- unsigned char *buf = resbuf;
+- cpu_to_le32 (buf + 0, ctx->A);
+- cpu_to_le32 (buf + 4, ctx->B);
+- cpu_to_le32 (buf + 8, ctx->C);
+- cpu_to_le32 (buf + 12, ctx->D);
+- XCRYPT_SECURE_MEMSET (ctx, sizeof(*ctx));
+- return resbuf;
+-}
++ ctx->a = 0x67452301;
++ ctx->b = 0xefcdab89;
++ ctx->c = 0x98badcfe;
++ ctx->d = 0x10325476;
+
+-/* Process the remaining bytes in the internal buffer and the usual
+- prolog according to the standard and write the result to RESBUF. */
++ ctx->lo = 0;
++ ctx->hi = 0;
++}
+
+-void *
+-md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
++void MD5_Update(MD5_CTX *ctx, const void *data, size_t size)
+ {
+- /* Take yet unprocessed bytes into account. */
+- uint32_t bytes = ctx->buflen;
+- size_t pad;
++ MD5_u32plus saved_lo;
++ unsigned long used, available;
++
++ saved_lo = ctx->lo;
++ if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
++ ctx->hi++;
++ ctx->hi += (MD5_u32plus) size >> 29;
+
+- /* Now count remaining bytes. */
+- ctx->total += bytes;
++ used = saved_lo & 0x3f;
+
+- pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
++ if (used) {
++ available = 64 - used;
+
+- /* The first byte of padding should be 0x80 and the rest should be
+- zero. (RFC 1321, 3.1: Step 1) */
+- ctx->buffer[bytes] = 0x80u;
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[bytes+1], pad-1);
++ if (size < available) {
++ memcpy(&ctx->buffer[used], data, size);
++ return;
++ }
+
+- /* Put the 64-bit file length in little-endian *bits* at the end of
+- the buffer. */
+- cpu_to_le64 (&ctx->buffer[bytes + pad], ctx->total << 3);
++ memcpy(&ctx->buffer[used], data, available);
++ data = (const unsigned char *)data + available;
++ size -= available;
++ body(ctx, ctx->buffer, 64);
++ }
+
+- /* Process last bytes. */
+- md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
++ if (size >= 64) {
++ data = body(ctx, data, size & ~(unsigned long)0x3f);
++ size &= 0x3f;
++ }
+
+- return md5_read_ctx (ctx, resbuf);
++ memcpy(ctx->buffer, data, size);
+ }
+
++#define OUT(dst, src) \
++ (dst)[0] = (unsigned char)(src); \
++ (dst)[1] = (unsigned char)((src) >> 8); \
++ (dst)[2] = (unsigned char)((src) >> 16); \
++ (dst)[3] = (unsigned char)((src) >> 24);
+
+-void
+-md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
++void MD5_Final(uint8_t result[16], MD5_CTX *ctx)
+ {
+- /* When we already have some bits in our internal buffer concatenate
+- both inputs first. */
+- if (ctx->buflen != 0)
+- {
+- uint32_t left_over = ctx->buflen;
+- uint32_t add = 128 - left_over > len ? (uint32_t)len : 128 - left_over;
+-
+- memcpy (&ctx->buffer[left_over], buffer, add);
+- ctx->buflen += add;
+-
+- if (ctx->buflen > 64)
+- {
+- md5_process_block (ctx->buffer, ctx->buflen & ~63u, ctx);
+-
+- ctx->buflen &= 63;
+- /* The regions in the following copy operation cannot overlap. */
+- memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63u],
+- ctx->buflen);
+- }
+-
+- buffer = (const char *) buffer + add;
+- len -= add;
+- }
+-
+- /* Process available complete blocks. */
+- if (len > 64)
+- {
+- md5_process_block (buffer, len & ~63u, ctx);
+- buffer = (const char *) buffer + (len & ~63u);
+- len &= 63;
+- }
+-
+- /* Move remaining bytes in internal buffer. */
+- if (len > 0)
+- {
+- uint32_t left_over = ctx->buflen;
+-
+- memcpy (&ctx->buffer[left_over], buffer, len);
+- left_over += (uint32_t)len;
+- if (left_over >= 64)
+- {
+- md5_process_block (ctx->buffer, 64, ctx);
+- left_over -= 64;
+- memcpy (ctx->buffer, &ctx->buffer[64], left_over);
+- }
+- ctx->buflen = left_over;
+- }
+-}
++ unsigned long used, available;
+
++ used = ctx->lo & 0x3f;
+
+-/* These are the four functions used in the four steps of the MD5 algorithm
+- and defined in the RFC 1321. The first function is a little bit optimized
+- (as found in Colin Plumbs public domain implementation). */
+-/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+-#define FF(b, c, d) (d ^ (b & (c ^ d)))
+-#define FG(b, c, d) FF (d, b, c)
+-#define FH(b, c, d) (b ^ c ^ d)
+-#define FI(b, c, d) (c ^ (b | ~d))
++ ctx->buffer[used++] = 0x80;
+
+-/* Process LEN bytes of BUFFER, accumulating context into CTX.
+- It is assumed that LEN % 64 == 0. */
++ available = 64 - used;
+
+-static void
+-md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
+-{
+- const unsigned char *p = buffer;
+- const unsigned char *endp = p + len;
+- uint32_t A = ctx->A;
+- uint32_t B = ctx->B;
+- uint32_t C = ctx->C;
+- uint32_t D = ctx->D;
+-
+- /* First increment the byte count. RFC 1321 specifies the possible
+- length of the file up to 2^64 bits. Here we only compute the
+- number of bytes. */
+- ctx->total += len;
+-
+- /* Process all bytes in the buffer with 64 bytes in each round of
+- the loop. */
+- while (p < endp)
+- {
+- uint32_t *cwp = ctx->correct_words;
+- uint32_t A_save = A;
+- uint32_t B_save = B;
+- uint32_t C_save = C;
+- uint32_t D_save = D;
+-
+- /* First round: using the given function, the context and a constant
+- the next context is computed. Because the algorithms processing
+- unit is a 32-bit word and it is determined to work on words in
+- little endian byte order we perhaps have to change the byte order
+- before the computation. To reduce the work for the next steps
+- we store the swapped words in the array CORRECT_WORDS. */
+-
+-#define OP(a, b, c, d, s, T) \
+- do \
+- { \
+- uint32_t word = le32_to_cpu (p); \
+- p += 4; \
+- *cwp++ = word; \
+- a += FF (b, c, d) + word + T; \
+- CYCLIC (a, s); \
+- a += b; \
+- } \
+- while (0)
+-
+- /* It is unfortunate that C does not provide an operator for
+- cyclic rotation. Hope the C compiler is smart enough. */
+-#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
+-
+- /* Before we start, one word to the strange constants.
+- They are defined in RFC 1321 as
+-
+- T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+- */
+-
+- /* Round 1. */
+- OP (A, B, C, D, 7, 0xd76aa478);
+- OP (D, A, B, C, 12, 0xe8c7b756);
+- OP (C, D, A, B, 17, 0x242070db);
+- OP (B, C, D, A, 22, 0xc1bdceee);
+- OP (A, B, C, D, 7, 0xf57c0faf);
+- OP (D, A, B, C, 12, 0x4787c62a);
+- OP (C, D, A, B, 17, 0xa8304613);
+- OP (B, C, D, A, 22, 0xfd469501);
+- OP (A, B, C, D, 7, 0x698098d8);
+- OP (D, A, B, C, 12, 0x8b44f7af);
+- OP (C, D, A, B, 17, 0xffff5bb1);
+- OP (B, C, D, A, 22, 0x895cd7be);
+- OP (A, B, C, D, 7, 0x6b901122);
+- OP (D, A, B, C, 12, 0xfd987193);
+- OP (C, D, A, B, 17, 0xa679438e);
+- OP (B, C, D, A, 22, 0x49b40821);
+-
+- /* For the second to fourth round we have the possibly swapped words
+- in CORRECT_WORDS. Redefine the macro to take an additional first
+- argument specifying the function to use. */
+-#undef OP
+-#define OP(f, a, b, c, d, k, s, T) \
+- do \
+- { \
+- a += f (b, c, d) + ctx->correct_words[k] + T; \
+- CYCLIC (a, s); \
+- a += b; \
+- } \
+- while (0)
+-
+- /* Round 2. */
+- OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+- OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+- OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+- OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+- OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+- OP (FG, D, A, B, C, 10, 9, 0x02441453);
+- OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+- OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+- OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+- OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+- OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+- OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+- OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+- OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+- OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+- OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+-
+- /* Round 3. */
+- OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+- OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+- OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+- OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+- OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+- OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+- OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+- OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+- OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+- OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+- OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+- OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+- OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+- OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+- OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+- OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+-
+- /* Round 4. */
+- OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+- OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+- OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+- OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+- OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+- OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+- OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+- OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+- OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+- OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+- OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+- OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+- OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+- OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+- OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+- OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+-
+- /* Add the starting values of the context. */
+- A += A_save;
+- B += B_save;
+- C += C_save;
+- D += D_save;
+- }
+-
+- /* Put checksum in context given as argument. */
+- ctx->A = A;
+- ctx->B = B;
+- ctx->C = C;
+- ctx->D = D;
++ if (available < 8) {
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available);
++ body(ctx, ctx->buffer, 64);
++ used = 0;
++ available = 64;
++ }
++
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available - 8);
++
++ ctx->lo <<= 3;
++ OUT(&ctx->buffer[56], ctx->lo)
++ OUT(&ctx->buffer[60], ctx->hi)
++
++ body(ctx, ctx->buffer, 64);
++
++ OUT(&result[0], ctx->a)
++ OUT(&result[4], ctx->b)
++ OUT(&result[8], ctx->c)
++ OUT(&result[12], ctx->d)
++
++ XCRYPT_SECURE_MEMSET(ctx, sizeof(*ctx));
+ }
+
+ #endif
+diff --git a/alg-md5.h b/alg-md5.h
+index a56aba9..1947eb3 100644
+--- a/alg-md5.h
++++ b/alg-md5.h
+@@ -1,52 +1,43 @@
+-/* Declaration of functions and data types used for MD5 sum computing
+- library functions.
+-
+- Copyright (C) 1995-2017 Free Software Foundation, Inc.
+-
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
+-
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
+-
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
++/*
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD5 Message-Digest Algorithm (RFC 1321).
++ *
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
++ *
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
++ *
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * See md5.c for more information.
++ */
+
+ #ifndef _CRYPT_ALG_MD5_H
+ #define _CRYPT_ALG_MD5_H 1
+
+-/* Structure to save state of computation between the single steps. */
+-struct md5_ctx
+-{
+- uint32_t A;
+- uint32_t B;
+- uint32_t C;
+- uint32_t D;
+-
+- uint64_t total;
+- uint32_t buflen;
+- uint32_t correct_words[16];
+- unsigned char buffer[128];
+-};
+-
+-/* Initialize structure containing state of computation.
+- (RFC 1321, 3.3: Step 3) */
+-extern void md5_init_ctx (struct md5_ctx *ctx);
++/* Any 32-bit or wider unsigned integer data type will do */
++typedef uint32_t MD5_u32plus;
+
+-/* Starting with the result of former calls of this function (or the
+- initialization function) update the context for the next LEN bytes
+- starting at BUFFER. LEN does not need to be a multiple of 64. */
+-extern void md5_process_bytes (const void *buffer, size_t len,
+- struct md5_ctx *ctx);
++typedef struct {
++ MD5_u32plus lo, hi;
++ MD5_u32plus a, b, c, d;
++ uint8_t buffer[64];
++ MD5_u32plus block[16];
++} MD5_CTX;
+
+-/* Process the remaining bytes in the buffer and write the finalized
+- hash to RESBUF, which should point to 16 bytes of storage. All
+- data written to CTX is erased before returning from the function. */
+-extern void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf);
++extern void MD5_Init(MD5_CTX *ctx);
++extern void MD5_Update(MD5_CTX *ctx, const void *data, size_t size);
++extern void MD5_Final(uint8_t result[16], MD5_CTX *ctx);
+
+ #endif /* alg-md5.h */
+diff --git a/crypt-md5.c b/crypt-md5.c
+index f64b6fc..108c31c 100644
+--- a/crypt-md5.c
++++ b/crypt-md5.c
+@@ -50,7 +50,7 @@ static_assert (MD5_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,
+ /* An md5_buffer holds all of the sensitive intermediate data. */
+ struct md5_buffer
+ {
+- struct md5_ctx ctx;
++ MD5_CTX ctx;
+ uint8_t result[16];
+ };
+
+@@ -74,7 +74,7 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+ }
+
+ struct md5_buffer *buf = scratch;
+- struct md5_ctx *ctx = &buf->ctx;
++ MD5_CTX *ctx = &buf->ctx;
+ uint8_t *result = buf->result;
+ char *cp = (char *)output;
+ const char *salt = setting;
+@@ -99,40 +99,40 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+
+ /* Compute alternate MD5 sum with input PHRASE, SALT, and PHRASE. The
+ final result will be added to the first context. */
+- md5_init_ctx (ctx);
++ MD5_Init (ctx);
+
+ /* Add phrase. */
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Add salt. */
+- md5_process_bytes (salt, salt_size, ctx);
++ MD5_Update (ctx, salt, salt_size);
+
+ /* Add phrase again. */
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Now get result of this (16 bytes). */
+- md5_finish_ctx (ctx, result);
++ MD5_Final (result, ctx);
+
+ /* Prepare for the real work. */
+- md5_init_ctx (ctx);
++ MD5_Init (ctx);
+
+ /* Add the phrase string. */
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Because the SALT argument need not always have the salt prefix we
+ add it separately. */
+- md5_process_bytes (md5_salt_prefix, sizeof (md5_salt_prefix) - 1, ctx);
++ MD5_Update (ctx, md5_salt_prefix, sizeof (md5_salt_prefix) - 1);
+
+ /* The last part is the salt string. This must be at most 8
+ characters and it ends at the first `$' character (for
+ compatibility with existing implementations). */
+- md5_process_bytes (salt, salt_size, ctx);
++ MD5_Update (ctx, salt, salt_size);
+
+
+ /* Add for any character in the phrase one byte of the alternate sum. */
+ for (cnt = phr_size; cnt > 16; cnt -= 16)
+- md5_process_bytes (result, 16, ctx);
+- md5_process_bytes (result, cnt, ctx);
++ MD5_Update (ctx, result, 16);
++ MD5_Update (ctx, result, cnt);
+
+ /* For the following code we need a NUL byte. */
+ *result = '\0';
+@@ -142,11 +142,10 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+ bit the first character of the phrase. This does not seem to be
+ what was intended but we have to follow this to be compatible. */
+ for (cnt = phr_size; cnt > 0; cnt >>= 1)
+- md5_process_bytes ((cnt & 1) != 0 ? (const char *) result : phrase, 1,
+- ctx);
++ MD5_Update (ctx, (cnt & 1) != 0 ? (const char *) result : phrase, 1);
+
+ /* Create intermediate result. */
+- md5_finish_ctx (ctx, result);
++ MD5_Final (result, ctx);
+
+ /* Now comes another weirdness. In fear of password crackers here
+ comes a quite long loop which just processes the output of the
+@@ -154,30 +153,30 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+ for (cnt = 0; cnt < 1000; ++cnt)
+ {
+ /* New context. */
+- md5_init_ctx (ctx);
++ MD5_Init (ctx);
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+ else
+- md5_process_bytes (result, 16, ctx);
++ MD5_Update (ctx, result, 16);
+
+ /* Add salt for numbers not divisible by 3. */
+ if (cnt % 3 != 0)
+- md5_process_bytes (salt, salt_size, ctx);
++ MD5_Update (ctx, salt, salt_size);
+
+ /* Add phrase for numbers not divisible by 7. */
+ if (cnt % 7 != 0)
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+- md5_process_bytes (result, 16, ctx);
++ MD5_Update (ctx, result, 16);
+ else
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Create intermediate result. */
+- md5_finish_ctx (ctx, result);
++ MD5_Final (result, ctx);
+ }
+
+ /* Now we can construct the result string. It consists of three
+diff --git a/crypt-port.h b/crypt-port.h
+index a2c64b3..2571c94 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -247,9 +247,9 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #endif
+
+ #if INCLUDE_md5 || INCLUDE_sunmd5
+-#define md5_finish_ctx _crypt_md5_finish_ctx
+-#define md5_init_ctx _crypt_md5_init_ctx
+-#define md5_process_bytes _crypt_md5_process_bytes
++#define MD5_Init _crypt_MD5_Init
++#define MD5_Update _crypt_MD5_Update
++#define MD5_Final _crypt_MD5_Final
+ #endif
+
+ #if INCLUDE_sha1
+diff --git a/crypt-sunmd5.c b/crypt-sunmd5.c
+index 9f76ed1..7a30aae 100644
+--- a/crypt-sunmd5.c
++++ b/crypt-sunmd5.c
+@@ -165,7 +165,7 @@ crypt_sunmd5_rn (const char *phrase, size_t phr_size,
+ {
+ struct crypt_sunmd5_scratch
+ {
+- struct md5_ctx ctx;
++ MD5_CTX ctx;
+ uint8_t dg[16];
+ char rn[16];
+ };
+@@ -238,27 +238,27 @@ crypt_sunmd5_rn (const char *phrase, size_t phr_size,
+ struct crypt_sunmd5_scratch *s = scratch;
+
+ /* Initial round. */
+- md5_init_ctx (&s->ctx);
+- md5_process_bytes (phrase, phr_size, &s->ctx);
+- md5_process_bytes (setting, saltlen, &s->ctx);
+- md5_finish_ctx (&s->ctx, s->dg);
++ MD5_Init (&s->ctx);
++ MD5_Update (&s->ctx, phrase, phr_size);
++ MD5_Update (&s->ctx, setting, saltlen);
++ MD5_Final (s->dg, &s->ctx);
+
+ /* Stretching rounds. */
+ for (unsigned int i = 0; i < nrounds; i++)
+ {
+- md5_init_ctx (&s->ctx);
++ MD5_Init (&s->ctx);
+
+- md5_process_bytes (s->dg, sizeof s->dg, &s->ctx);
++ MD5_Update (&s->ctx, s->dg, sizeof s->dg);
+
+ /* The trailing nul is intentionally included. */
+ if (muffet_coin_toss (s->dg, i))
+- md5_process_bytes (hamlet_quotation, sizeof hamlet_quotation, &s->ctx);
++ MD5_Update (&s->ctx, hamlet_quotation, sizeof hamlet_quotation);
+
+ int nwritten = snprintf (s->rn, sizeof s->rn, "%u", i);
+ assert (nwritten >= 1 && (unsigned int)nwritten + 1 <= sizeof s->rn);
+- md5_process_bytes (s->rn, (unsigned int)nwritten, &s->ctx);
++ MD5_Update (&s->ctx, s->rn, (unsigned int)nwritten);
+
+- md5_finish_ctx (&s->ctx, s->dg);
++ MD5_Final (s->dg, &s->ctx);
+ }
+
+ memcpy (output, setting, saltlen);
+diff --git a/test-alg-md5.c b/test-alg-md5.c
+index dabc6ba..21c4309 100644
+--- a/test-alg-md5.c
++++ b/test-alg-md5.c
+@@ -52,7 +52,7 @@ static const struct
+
+ static void
+ report_failure(int n, const char *tag,
+- const char expected[16], const char actual[16])
++ const char expected[16], uint8_t actual[16])
+ {
+ int i;
+ printf ("FAIL: test %d (%s):\n exp:", n, tag);
+@@ -76,27 +76,27 @@ report_failure(int n, const char *tag,
+ int
+ main (void)
+ {
+- struct md5_ctx ctx;
+- char sum[16];
++ MD5_CTX ctx;
++ uint8_t sum[16];
+ int result = 0;
+ int cnt;
+ int i;
+
+ for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)
+ {
+- md5_init_ctx (&ctx);
+- md5_process_bytes (tests[cnt].input, strlen (tests[cnt].input), &ctx);
+- md5_finish_ctx (&ctx, sum);
++ MD5_Init (&ctx);
++ MD5_Update (&ctx, tests[cnt].input, strlen (tests[cnt].input));
++ MD5_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "all at once", tests[cnt].result, sum);
+ result = 1;
+ }
+
+- md5_init_ctx (&ctx);
++ MD5_Init (&ctx);
+ for (i = 0; tests[cnt].input[i] != '\0'; ++i)
+- md5_process_bytes (&tests[cnt].input[i], 1, &ctx);
+- md5_finish_ctx (&ctx, sum);
++ MD5_Update (&ctx, &tests[cnt].input[i], 1);
++ MD5_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "byte by byte", tests[cnt].result, sum);
+@@ -108,10 +108,10 @@ main (void)
+ <https://www.nist.gov/itl/ssd/software-quality-group/nsrl-test-data>. */
+ char buf[1000];
+ memset (buf, 'a', sizeof (buf));
+- md5_init_ctx (&ctx);
++ MD5_Init (&ctx);
+ for (i = 0; i < 1000; ++i)
+- md5_process_bytes (buf, sizeof (buf), &ctx);
+- md5_finish_ctx (&ctx, sum);
++ MD5_Update (&ctx, buf, sizeof (buf));
++ MD5_Final (sum, &ctx);
+ static const char expected[64] =
+ "\x77\x07\xd6\xae\x4e\x02\x7c\x70\xee\xa2\xa9\x35\xc2\x29\x6f\x21";
+ if (memcmp (expected, sum, 16) != 0)
+
+From 6fcd7eb3324b67b22b39626cf587013437707efc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 14:16:22 +0200
+Subject: [PATCH 11/17] Use unmodified md4 implementation from Alexander
+ Peslyak.
+
+---
+ alg-md4.c | 428 +++++++++++++++++++++++++------------------------
+ alg-md4.h | 61 +++----
+ crypt-nthash.c | 24 +--
+ crypt-port.h | 6 +-
+ test-alg-md4.c | 18 +--
+ 5 files changed, 278 insertions(+), 259 deletions(-)
+
+diff --git a/alg-md4.c b/alg-md4.c
+index c1c4075..482b6f4 100644
+--- a/alg-md4.c
++++ b/alg-md4.c
+@@ -1,256 +1,270 @@
+ /*
+- * MD4 (RFC-1320) message digest.
+- * Modified from MD5 code by Andrey Panin <pazke(a)donpac.ru>
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD4 Message-Digest Algorithm (RFC 1320).
+ *
+- * Written by Solar Designer <solar(a)openwall.com> in 2001, and placed in
+- * the public domain. There's absolutely no warranty.
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
+ *
+- * This differs from Colin Plumb's older public domain implementation in
+- * that no 32-bit integer data type is required, there's no compile-time
+- * endianness configuration.
+- * The primary goals are portability and ease of use.
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
+ *
+- * This implementation is meant to be fast, but not as fast as possible.
+- * Some known optimizations are not included to reduce source code size
+- * and avoid compile-time configuration.
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * (This is a heavily cut-down "BSD license".)
++ *
++ * This differs from Colin Plumb's older public domain implementation in that
++ * no exactly 32-bit integer data type is required (any 32-bit or wider
++ * unsigned integer data type will do), there's no compile-time endianness
++ * configuration, and the function prototypes match OpenSSL's. No code from
++ * Colin Plumb's implementation has been reused; this comment merely compares
++ * the properties of the two independent implementations.
++ *
++ * The primary goals of this implementation are portability and ease of use.
++ * It is meant to be fast, but not as fast as possible. Some known
++ * optimizations are not included to reduce source code size and avoid
++ * compile-time configuration.
+ */
+
+ #include "crypt-port.h"
+-#include "alg-md4.h"
+-#include "byteorder.h"
+
+ #if INCLUDE_nthash
+
++#include "alg-md4.h"
++
+ /*
+ * The basic MD4 functions.
++ *
++ * F and G are optimized compared to their RFC 1320 definitions, with the
++ * optimization for F borrowed from Colin Plumb's MD5 implementation.
+ */
+-#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
+-#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
+-#define H(x, y, z) ((x) ^ (y) ^ (z))
++#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
++#define G(x, y, z) (((x) & ((y) | (z))) | ((y) & (z)))
++#define H(x, y, z) ((x) ^ (y) ^ (z))
+
+ /*
+- * The MD4 transformation for all four rounds.
++ * The MD4 transformation for all three rounds.
+ */
+ #define STEP(f, a, b, c, d, x, s) \
+- (a) += f((b), (c), (d)) + (x); \
+- (a) = ((a) << (s)) | ((a) >> (32 - (s)))
++ (a) += f((b), (c), (d)) + (x); \
++ (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s))));
+
+ /*
+- * SET reads 4 input bytes in little-endian byte order and stores them
+- * in a properly aligned word in host byte order.
++ * SET reads 4 input bytes in little-endian byte order and stores them in a
++ * properly aligned word in host byte order.
+ *
+- * The check for little-endian architectures which tolerate unaligned
+- * memory accesses is just an optimization. Nothing will break if it
+- * doesn't work.
++ * The check for little-endian architectures that tolerate unaligned memory
++ * accesses is just an optimization. Nothing will break if it fails to detect
++ * a suitable architecture.
++ *
++ * Unfortunately, this optimization may be a C strict aliasing rules violation
++ * if the caller's data buffer has effective type that cannot be aliased by
++ * MD4_u32plus. In practice, this problem may occur if these MD4 routines are
++ * inlined into a calling function, or with future and dangerously advanced
++ * link-time optimizations. For the time being, keeping these MD4 routines in
++ * their own translation unit avoids the problem.
+ */
++#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#define SET(n) \
++ (*(const MD4_u32plus *)&ptr[(n) * 4])
++#define GET(n) \
++ SET(n)
++#else
+ #define SET(n) \
+- (ctx->block[(n)] = le32_to_cpu (&ptr[(n) * 4]))
++ (ctx->block[(n)] = \
++ (MD4_u32plus)ptr[(n) * 4] | \
++ ((MD4_u32plus)ptr[(n) * 4 + 1] << 8) | \
++ ((MD4_u32plus)ptr[(n) * 4 + 2] << 16) | \
++ ((MD4_u32plus)ptr[(n) * 4 + 3] << 24))
+ #define GET(n) \
+- (ctx->block[(n)])
++ (ctx->block[(n)])
++#endif
+
+ /*
+- * This processes one or more 64-byte data blocks, but does NOT update
+- * the bit counters. There're no alignment requirements.
++ * This processes one or more 64-byte data blocks, but does NOT update the bit
++ * counters. There are no alignment requirements.
+ */
+-static const unsigned char *
+-body (struct md4_ctx *ctx, const unsigned char *data, size_t size)
++static const void *body(MD4_CTX *ctx, const void *data, unsigned long size)
+ {
+- const unsigned char *ptr;
+- uint32_t a, b, c, d;
+- uint32_t saved_a, saved_b, saved_c, saved_d;
+-
+- ptr = data;
+-
+- a = ctx->a;
+- b = ctx->b;
+- c = ctx->c;
+- d = ctx->d;
+-
+- do
+- {
+- saved_a = a;
+- saved_b = b;
+- saved_c = c;
+- saved_d = d;
+-
+- /* Round 1 */
+- STEP(F, a, b, c, d, SET( 0), 3);
+- STEP(F, d, a, b, c, SET( 1), 7);
+- STEP(F, c, d, a, b, SET( 2), 11);
+- STEP(F, b, c, d, a, SET( 3), 19);
+-
+- STEP(F, a, b, c, d, SET( 4), 3);
+- STEP(F, d, a, b, c, SET( 5), 7);
+- STEP(F, c, d, a, b, SET( 6), 11);
+- STEP(F, b, c, d, a, SET( 7), 19);
+-
+- STEP(F, a, b, c, d, SET( 8), 3);
+- STEP(F, d, a, b, c, SET( 9), 7);
+- STEP(F, c, d, a, b, SET(10), 11);
+- STEP(F, b, c, d, a, SET(11), 19);
+-
+- STEP(F, a, b, c, d, SET(12), 3);
+- STEP(F, d, a, b, c, SET(13), 7);
+- STEP(F, c, d, a, b, SET(14), 11);
+- STEP(F, b, c, d, a, SET(15), 19);
+-
+- /* Round 2 */
+- STEP(G, a, b, c, d, GET( 0) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 4) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET( 8) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(12) + 0x5A827999, 13);
+-
+- STEP(G, a, b, c, d, GET( 1) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 5) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET( 9) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(13) + 0x5A827999, 13);
+-
+- STEP(G, a, b, c, d, GET( 2) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 6) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET(10) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(14) + 0x5A827999, 13);
+-
+- STEP(G, a, b, c, d, GET( 3) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 7) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET(11) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(15) + 0x5A827999, 13);
+-
+- /* Round 3 */
+- STEP(H, a, b, c, d, GET( 0) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET( 8) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 4) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(12) + 0x6ED9EBA1, 15);
+-
+- STEP(H, a, b, c, d, GET( 2) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET(10) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 6) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(14) + 0x6ED9EBA1, 15);
+-
+- STEP(H, a, b, c, d, GET( 1) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET( 9) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 5) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(13) + 0x6ED9EBA1, 15);
+-
+- STEP(H, a, b, c, d, GET( 3) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET(11) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 7) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(15) + 0x6ED9EBA1, 15);
+-
+- a += saved_a;
+- b += saved_b;
+- c += saved_c;
+- d += saved_d;
+-
+- ptr += 64;
+- }
+- while (size -= 64);
+-
+- ctx->a = a;
+- ctx->b = b;
+- ctx->c = c;
+- ctx->d = d;
+-
+- return ptr;
++ const unsigned char *ptr;
++ MD4_u32plus a, b, c, d;
++ MD4_u32plus saved_a, saved_b, saved_c, saved_d;
++ const MD4_u32plus ac1 = 0x5a827999, ac2 = 0x6ed9eba1;
++
++ ptr = (const unsigned char *)data;
++
++ a = ctx->a;
++ b = ctx->b;
++ c = ctx->c;
++ d = ctx->d;
++
++ do {
++ saved_a = a;
++ saved_b = b;
++ saved_c = c;
++ saved_d = d;
++
++/* Round 1 */
++ STEP(F, a, b, c, d, SET(0), 3)
++ STEP(F, d, a, b, c, SET(1), 7)
++ STEP(F, c, d, a, b, SET(2), 11)
++ STEP(F, b, c, d, a, SET(3), 19)
++ STEP(F, a, b, c, d, SET(4), 3)
++ STEP(F, d, a, b, c, SET(5), 7)
++ STEP(F, c, d, a, b, SET(6), 11)
++ STEP(F, b, c, d, a, SET(7), 19)
++ STEP(F, a, b, c, d, SET(8), 3)
++ STEP(F, d, a, b, c, SET(9), 7)
++ STEP(F, c, d, a, b, SET(10), 11)
++ STEP(F, b, c, d, a, SET(11), 19)
++ STEP(F, a, b, c, d, SET(12), 3)
++ STEP(F, d, a, b, c, SET(13), 7)
++ STEP(F, c, d, a, b, SET(14), 11)
++ STEP(F, b, c, d, a, SET(15), 19)
++
++/* Round 2 */
++ STEP(G, a, b, c, d, GET(0) + ac1, 3)
++ STEP(G, d, a, b, c, GET(4) + ac1, 5)
++ STEP(G, c, d, a, b, GET(8) + ac1, 9)
++ STEP(G, b, c, d, a, GET(12) + ac1, 13)
++ STEP(G, a, b, c, d, GET(1) + ac1, 3)
++ STEP(G, d, a, b, c, GET(5) + ac1, 5)
++ STEP(G, c, d, a, b, GET(9) + ac1, 9)
++ STEP(G, b, c, d, a, GET(13) + ac1, 13)
++ STEP(G, a, b, c, d, GET(2) + ac1, 3)
++ STEP(G, d, a, b, c, GET(6) + ac1, 5)
++ STEP(G, c, d, a, b, GET(10) + ac1, 9)
++ STEP(G, b, c, d, a, GET(14) + ac1, 13)
++ STEP(G, a, b, c, d, GET(3) + ac1, 3)
++ STEP(G, d, a, b, c, GET(7) + ac1, 5)
++ STEP(G, c, d, a, b, GET(11) + ac1, 9)
++ STEP(G, b, c, d, a, GET(15) + ac1, 13)
++
++/* Round 3 */
++ STEP(H, a, b, c, d, GET(0) + ac2, 3)
++ STEP(H, d, a, b, c, GET(8) + ac2, 9)
++ STEP(H, c, d, a, b, GET(4) + ac2, 11)
++ STEP(H, b, c, d, a, GET(12) + ac2, 15)
++ STEP(H, a, b, c, d, GET(2) + ac2, 3)
++ STEP(H, d, a, b, c, GET(10) + ac2, 9)
++ STEP(H, c, d, a, b, GET(6) + ac2, 11)
++ STEP(H, b, c, d, a, GET(14) + ac2, 15)
++ STEP(H, a, b, c, d, GET(1) + ac2, 3)
++ STEP(H, d, a, b, c, GET(9) + ac2, 9)
++ STEP(H, c, d, a, b, GET(5) + ac2, 11)
++ STEP(H, b, c, d, a, GET(13) + ac2, 15)
++ STEP(H, a, b, c, d, GET(3) + ac2, 3)
++ STEP(H, d, a, b, c, GET(11) + ac2, 9)
++ STEP(H, c, d, a, b, GET(7) + ac2, 11)
++ STEP(H, b, c, d, a, GET(15) + ac2, 15)
++
++ a += saved_a;
++ b += saved_b;
++ c += saved_c;
++ d += saved_d;
++
++ ptr += 64;
++ } while (size -= 64);
++
++ ctx->a = a;
++ ctx->b = b;
++ ctx->c = c;
++ ctx->d = d;
++
++ return ptr;
+ }
+
+-/* Put result from CTX in first 16 bytes following RESBUF. The result
+- will be in little endian byte order. */
+-static void *
+-md4_read_ctx (struct md4_ctx *ctx, void *resbuf)
++void MD4_Init(MD4_CTX *ctx)
+ {
+- unsigned char *buf = resbuf;
+- cpu_to_le32 (buf + 0, ctx->a);
+- cpu_to_le32 (buf + 4, ctx->b);
+- cpu_to_le32 (buf + 8, ctx->c);
+- cpu_to_le32 (buf + 12, ctx->d);
+- XCRYPT_SECURE_MEMSET (ctx, sizeof(struct md4_ctx));
+- return resbuf;
++ ctx->a = 0x67452301;
++ ctx->b = 0xefcdab89;
++ ctx->c = 0x98badcfe;
++ ctx->d = 0x10325476;
++
++ ctx->lo = 0;
++ ctx->hi = 0;
+ }
+
+-void
+-md4_init_ctx (struct md4_ctx *ctx)
++void MD4_Update(MD4_CTX *ctx, const void *data, size_t size)
+ {
+- ctx->a = 0x67452301;
+- ctx->b = 0xefcdab89;
+- ctx->c = 0x98badcfe;
+- ctx->d = 0x10325476;
++ MD4_u32plus saved_lo;
++ unsigned long used, available;
+
+- ctx->lo = 0;
+- ctx->hi = 0;
+-}
++ saved_lo = ctx->lo;
++ if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
++ ctx->hi++;
++ ctx->hi += (MD4_u32plus) size >> 29;
+
+-void
+-md4_process_bytes (const void *buffer, struct md4_ctx *ctx, size_t size)
+-{
+- uint32_t saved_lo;
+- size_t used, free;
+-
+- saved_lo = ctx->lo;
+- if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
+- ctx->hi++;
+- ctx->hi += (uint32_t)(size >> 29);
+-
+- used = saved_lo & 0x3f;
+-
+- if (used)
+- {
+- free = 64 - used;
+-
+- if (size < free)
+- {
+- memcpy(&ctx->buffer[used], buffer, size);
+- return;
+- }
+-
+- memcpy(&ctx->buffer[used], buffer, free);
+- buffer = (const unsigned char *) buffer + free;
+- size -= free;
+- body(ctx, ctx->buffer, 64);
+- }
+-
+- if (size >= 64)
+- {
+- buffer = body(ctx, buffer, size & ~(uint32_t)0x3f);
+- size &= 0x3f;
+- }
+-
+- memcpy(ctx->buffer, buffer, size);
++ used = saved_lo & 0x3f;
++
++ if (used) {
++ available = 64 - used;
++
++ if (size < available) {
++ memcpy(&ctx->buffer[used], data, size);
++ return;
++ }
++
++ memcpy(&ctx->buffer[used], data, available);
++ data = (const unsigned char *)data + available;
++ size -= available;
++ body(ctx, ctx->buffer, 64);
++ }
++
++ if (size >= 64) {
++ data = body(ctx, data, size & ~(unsigned long)0x3f);
++ size &= 0x3f;
++ }
++
++ memcpy(ctx->buffer, data, size);
+ }
+
+-void *
+-md4_finish_ctx (struct md4_ctx *ctx, void *resbuf)
++#define OUT(dst, src) \
++ (dst)[0] = (unsigned char)(src); \
++ (dst)[1] = (unsigned char)((src) >> 8); \
++ (dst)[2] = (unsigned char)((src) >> 16); \
++ (dst)[3] = (unsigned char)((src) >> 24);
++
++void MD4_Final(uint8_t result[16], MD4_CTX *ctx)
+ {
+- size_t used, free;
++ unsigned long used, available;
++
++ used = ctx->lo & 0x3f;
+
+- used = ctx->lo & 0x3f;
++ ctx->buffer[used++] = 0x80;
+
+- ctx->buffer[used++] = 0x80;
++ available = 64 - used;
+
+- free = 64 - used;
++ if (available < 8) {
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available);
++ body(ctx, ctx->buffer, 64);
++ used = 0;
++ available = 64;
++ }
+
+- if (free < 8)
+- {
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[used], free);
+- body(ctx, ctx->buffer, 64);
+- used = 0;
+- free = 64;
+- }
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available - 8);
+
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[used], free - 8);
++ ctx->lo <<= 3;
++ OUT(&ctx->buffer[56], ctx->lo)
++ OUT(&ctx->buffer[60], ctx->hi)
+
+- ctx->lo <<= 3;
+- ctx->buffer[56] = (unsigned char)((ctx->lo) & 0xff);
+- ctx->buffer[57] = (unsigned char)((ctx->lo >> 8) & 0xff);
+- ctx->buffer[58] = (unsigned char)((ctx->lo >> 16) & 0xff);
+- ctx->buffer[59] = (unsigned char)((ctx->lo >> 24) & 0xff);
+- ctx->buffer[60] = (unsigned char)((ctx->hi) & 0xff);
+- ctx->buffer[61] = (unsigned char)((ctx->hi >> 8) & 0xff);
+- ctx->buffer[62] = (unsigned char)((ctx->hi >> 16) & 0xff);
+- ctx->buffer[63] = (unsigned char)((ctx->hi >> 24) & 0xff);
++ body(ctx, ctx->buffer, 64);
+
+- body(ctx, ctx->buffer, 64);
++ OUT(&result[0], ctx->a)
++ OUT(&result[4], ctx->b)
++ OUT(&result[8], ctx->c)
++ OUT(&result[12], ctx->d)
+
+- return md4_read_ctx (ctx, resbuf);
++ XCRYPT_SECURE_MEMSET(ctx, sizeof(*ctx));
+ }
+
+ #endif
+diff --git a/alg-md4.h b/alg-md4.h
+index 4c3e29c..473930e 100644
+--- a/alg-md4.h
++++ b/alg-md4.h
+@@ -1,38 +1,43 @@
+ /*
+- * This is an implementation of the RSA Data Security, Inc.
+- * MD4 Message-Digest Algorithm.
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD4 Message-Digest Algorithm (RFC 1320).
+ *
+- * Written by Solar Designer <solar(a)openwall.com> in 2001, and placed in
+- * the public domain. See md4.c for more information.
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
++ *
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
++ *
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * See md4.c for more information.
+ */
+
+ #ifndef _CRYPT_ALG_MD4_H
+ #define _CRYPT_ALG_MD4_H 1
+
+-#include <stddef.h>
+-#include <stdint.h>
+-
+-/* Structure to save state of computation between the single steps. */
+-struct md4_ctx
+-{
+- uint32_t lo, hi;
+- uint32_t a, b, c, d;
+- unsigned char buffer[64];
+- uint32_t block[16];
+-};
+-
+-/* Initialize structure containing state of computation.
+- (RFC 1320, 3.3: Step 3) */
+-extern void md4_init_ctx (struct md4_ctx *ctx);
++/* Any 32-bit or wider unsigned integer data type will do */
++typedef uint32_t MD4_u32plus;
+
+-/* Starting with the result of former calls of this function (or the
+- initialization function) update the context for the next LEN bytes
+- starting at BUFFER. LEN does not need to be a multiple of 64. */
+-extern void md4_process_bytes (const void *buffer, struct md4_ctx *ctx, size_t size);
++typedef struct {
++ MD4_u32plus lo, hi;
++ MD4_u32plus a, b, c, d;
++ uint8_t buffer[64];
++ MD4_u32plus block[16];
++} MD4_CTX;
+
+-/* Process the remaining bytes in the buffer and write the finalized
+- hash to RESBUF, which should point to 16 bytes of storage. All
+- data written to CTX is erased before returning from the function. */
+-extern void *md4_finish_ctx (struct md4_ctx *ctx, void *resbuf);
++extern void MD4_Init(MD4_CTX *ctx);
++extern void MD4_Update(MD4_CTX *ctx, const void *data, size_t size);
++extern void MD4_Final(uint8_t result[16], MD4_CTX *ctx);
+
+-#endif
++#endif /* alg-md4.h */
+diff --git a/crypt-nthash.c b/crypt-nthash.c
+index 5a715de..db6f17e 100644
+--- a/crypt-nthash.c
++++ b/crypt-nthash.c
+@@ -61,10 +61,10 @@ crypt_nthash_rn (const char *phrase, size_t ARG_UNUSED (phr_size),
+ uint16_t unipw[128];
+ unsigned char hash[16];
+ const char *s;
+- struct md4_ctx *ctx = scratch;
++ MD4_CTX *ctx = scratch;
+
+ if ((out_size < 4 + 32) ||
+- (scr_size < sizeof (struct md4_ctx)))
++ (scr_size < sizeof (MD4_CTX)))
+ {
+ errno = ERANGE;
+ return;
+@@ -83,9 +83,9 @@ crypt_nthash_rn (const char *phrase, size_t ARG_UNUSED (phr_size),
+ unipw[unipwLen++] = htons((uint16_t)(*s << 8));
+
+ /* Compute MD4 of Unicode password */
+- md4_init_ctx (ctx);
+- md4_process_bytes ((unsigned char *)unipw, ctx, unipwLen*sizeof(uint16_t));
+- md4_finish_ctx (ctx, hash);
++ MD4_Init (ctx);
++ MD4_Update (ctx, unipw, unipwLen*sizeof(uint16_t));
++ MD4_Final (hash, ctx);
+
+ output = (uint8_t *)stpcpy ((char *)output, magic);
+ *output++ = '$';
+@@ -111,7 +111,7 @@ gensalt_nthash_rn (unsigned long count,
+ size_t o_size)
+ {
+ static const char *salt = "$3$__not_used__";
+- struct md4_ctx ctx;
++ MD4_CTX ctx;
+ unsigned char hashbuf[16];
+ char hashstr[14 + 1];
+ unsigned long i;
+@@ -131,15 +131,15 @@ gensalt_nthash_rn (unsigned long count,
+ return;
+ }
+
+- md4_init_ctx (&ctx);
++ MD4_Init (&ctx);
+ for (i = 0; i < 20; i++)
+ {
+- md4_process_bytes (salt, &ctx, (i % 15) + 1);
+- md4_process_bytes (rbytes, &ctx, nrbytes);
+- md4_process_bytes (salt, &ctx, 15);
+- md4_process_bytes (salt, &ctx, 15 - (i % 15));
++ MD4_Update (&ctx, salt, (i % 15) + 1);
++ MD4_Update (&ctx, rbytes, nrbytes);
++ MD4_Update (&ctx, salt, 15);
++ MD4_Update (&ctx, salt, 15 - (i % 15));
+ }
+- md4_finish_ctx (&ctx, &hashbuf);
++ MD4_Final (hashbuf, &ctx);
+
+ for (i = 0; i < 7; i++)
+ sprintf (&(hashstr[i * 2]), "%02x", hashbuf[i]);
+diff --git a/crypt-port.h b/crypt-port.h
+index 2571c94..fa30e8e 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -241,9 +241,9 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #endif
+
+ #if INCLUDE_nthash
+-#define md4_finish_ctx _crypt_md4_finish_ctx
+-#define md4_init_ctx _crypt_md4_init_ctx
+-#define md4_process_bytes _crypt_md4_process_bytes
++#define MD4_Init _crypt_MD4_Init
++#define MD4_Update _crypt_MD4_Update
++#define MD4_Final _crypt_MD4_Final
+ #endif
+
+ #if INCLUDE_md5 || INCLUDE_sunmd5
+diff --git a/test-alg-md4.c b/test-alg-md4.c
+index 1b1b828..595e0bb 100644
+--- a/test-alg-md4.c
++++ b/test-alg-md4.c
+@@ -45,7 +45,7 @@ static const struct
+
+ static void
+ report_failure(int n, const char *tag,
+- const char expected[16], const char actual[16])
++ const char expected[16], uint8_t actual[16])
+ {
+ int i;
+ printf ("FAIL: test %d (%s):\n exp:", n, tag);
+@@ -69,27 +69,27 @@ report_failure(int n, const char *tag,
+ int
+ main (void)
+ {
+- struct md4_ctx ctx;
+- char sum[16];
++ MD4_CTX ctx;
++ uint8_t sum[16];
+ int result = 0;
+ int cnt;
+ int i;
+
+ for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)
+ {
+- md4_init_ctx (&ctx);
+- md4_process_bytes ((const unsigned char*)tests[cnt].input, &ctx, strlen (tests[cnt].input));
+- md4_finish_ctx (&ctx, (unsigned char*)sum);
++ MD4_Init (&ctx);
++ MD4_Update (&ctx, tests[cnt].input, strlen (tests[cnt].input));
++ MD4_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "all at once", tests[cnt].result, sum);
+ result = 1;
+ }
+
+- md4_init_ctx (&ctx);
++ MD4_Init (&ctx);
+ for (i = 0; tests[cnt].input[i] != '\0'; ++i)
+- md4_process_bytes ((const unsigned char*)&tests[cnt].input[i], &ctx, 1);
+- md4_finish_ctx (&ctx, (unsigned char*)sum);
++ MD4_Update (&ctx, &tests[cnt].input[i], 1);
++ MD4_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "byte by byte", tests[cnt].result, sum);
+
+From 6fc8102f7727f8e4115a87070d2e4a36b55ea1bc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 19:51:57 +0200
+Subject: [PATCH 12/17] Fix -Wcast-align.
+
+---
+ alg-md4.c | 2 +-
+ alg-md5.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/alg-md4.c b/alg-md4.c
+index 482b6f4..a6e1072 100644
+--- a/alg-md4.c
++++ b/alg-md4.c
+@@ -73,7 +73,7 @@
+ * link-time optimizations. For the time being, keeping these MD4 routines in
+ * their own translation unit avoids the problem.
+ */
+-#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#if 0 /* defined(__i386__) || defined(__x86_64__) || defined(__vax__) */
+ #define SET(n) \
+ (*(const MD4_u32plus *)&ptr[(n) * 4])
+ #define GET(n) \
+diff --git a/alg-md5.c b/alg-md5.c
+index 8382b98..5502539 100644
+--- a/alg-md5.c
++++ b/alg-md5.c
+@@ -77,7 +77,7 @@
+ * link-time optimizations. For the time being, keeping these MD5 routines in
+ * their own translation unit avoids the problem.
+ */
+-#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#if 0 /* defined(__i386__) || defined(__x86_64__) || defined(__vax__) */
+ #define SET(n) \
+ (*(const MD5_u32plus *)&ptr[(n) * 4])
+ #define GET(n) \
+
+From cc50dde05be214caace8af493fe869832a1d3d68 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 20:03:03 +0200
+Subject: [PATCH 13/17] Remove unused file.
+
+---
+ m4/.git_keep_dir | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+ delete mode 100644 m4/.git_keep_dir
+
+diff --git a/m4/.git_keep_dir b/m4/.git_keep_dir
+deleted file mode 100644
+index e69de29..0000000
+
+From 1cf317228655013c516090a20e70d81656516580 Mon Sep 17 00:00:00 2001
+From: Vitaly Chikunov <vt(a)altlinux.org>
+Date: Wed, 24 Oct 2018 05:24:47 +0300
+Subject: [PATCH 14/17] yescrypt: Add more tests.
+
+Test that crypt() with hashed password in place of settings works the
+same as settings.
+---
+ test-crypt-yescrypt.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/test-crypt-yescrypt.c b/test-crypt-yescrypt.c
+index a635f94..9d67b92 100644
+--- a/test-crypt-yescrypt.c
++++ b/test-crypt-yescrypt.c
+@@ -43,8 +43,16 @@ test(const char *p, const char *s, const char *m)
+ int
+ main (void)
+ {
+- int result = test("pleaseletmein", "$y$jD5.7$LdJMENpBABJJ3hIHjB1Bi.",
+- "$y$jD5.7$LdJMENpBABJJ3hIHjB1Bi.$HboGM6qPrsK.StKYGt6KErmUYtioHreJd98oIugoNB6");
++ int result = 0;
++
++#define YSETTINGS "$y$jD5.7$LdJMENpBABJJ3hIHjB1Bi."
++#define YHASHPART "HboGM6qPrsK.StKYGt6KErmUYtioHreJd98oIugoNB6"
++#define YFULLHASH YSETTINGS "$" YHASHPART
++ result |= test("pleaseletmein", YSETTINGS, YFULLHASH);
++ result |= test("pleaseletmein", YFULLHASH, YFULLHASH);
++ result |= test("pleaseletmein", YSETTINGS "$", YFULLHASH);
++ result |= test("pleaseletmein", YSETTINGS "$garbage", YFULLHASH);
++
+ result |= test("", "$y$jD5.7$", "$y$jD5.7$$JD8dsR.nt1ty0ltQ2HHwauaDRoOUIEaA5i.vpj2nyL.");
+ result |= test("", "$y$jD5.7$$", "$y$jD5.7$$JD8dsR.nt1ty0ltQ2HHwauaDRoOUIEaA5i.vpj2nyL.");
+
+
+From 232b217faba35064ca30120751f788d649cb3020 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Wed, 24 Oct 2018 15:54:12 +0200
+Subject: [PATCH 15/17] Use bzip2 and xz compression for distribution tarballs,
+ too.
+
+---
+ Makefile.am | 2 +-
+ NEWS | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index e7d5c6d..8cb3807 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -4,7 +4,7 @@
+ # Author: Thorsten Kukuk <kukuk(a)suse.de>
+ #
+
+-AUTOMAKE_OPTIONS = 1.14 gnits
++AUTOMAKE_OPTIONS = 1.14 gnits dist-bzip2 dist-xz
+ ACLOCAL_AMFLAGS = -I m4
+
+ AM_CFLAGS = $(WARN_CFLAGS)
+diff --git a/NEWS b/NEWS
+index e48b0d1..8af68ff 100644
+--- a/NEWS
++++ b/NEWS
+@@ -10,6 +10,8 @@ Version 4.2.3
+ sha512 implementation under the BSD license.
+ * Use md5 implementation from Alexander Peslyak. Thus we now have a
+ md5 implementation in the public domain.
++* 'make dist' now generates bzip2 and xz compressed tarballs along
++ with the default gzip compressed tarball.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+
+From a17c2d75c5642d164e04748ddb93f8f426c7ed5c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 25 Oct 2018 13:47:04 +0200
+Subject: [PATCH 16/17] Add Badge for Coverity Scan.
+
+---
+ README.md | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/README.md b/README.md
+index 102127a..9a91ad5 100644
+--- a/README.md
++++ b/README.md
+@@ -1,5 +1,6 @@
+ [![Build Status](https://travis-ci.org/besser82/libxcrypt.svg?branch=develop)](htt...
+ [![codecov](https://codecov.io/gh/besser82/libxcrypt/branch/develop/graph/badge.svg)](https://codecov.io/gh/besser82/libxcrypt)
++[![Coverity Scan Build Status](https://scan.coverity.com/projects/17073/badge.svg)](https://scan...
+
+ README for libxcrypt
+ ====================
+
+From 8b1ff5c38f316bc301e57a5a307fd11b8984e494 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 25 Oct 2018 14:06:01 +0200
+Subject: [PATCH 17/17] Add labels to TravisCI builds.
+
+---
+ .travis.yml | 75 +++++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 50 insertions(+), 25 deletions(-)
+
+diff --git a/.travis.yml b/.travis.yml
+index acb186c..2e7a746 100644
+--- a/.travis.yml
++++ b/.travis.yml
+@@ -15,153 +15,178 @@ sudo: true
+ matrix:
+ fast_finish: true
+ include:
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, Codecov"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+ - CODECOV=1
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, all hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+ - DISTCHECK=1
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, all hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, all hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, all hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, all hashes, obsolete API, no failure-tokens"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, all hashes, obsolete API, no failure-tokens"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, all hashes, obsolete API, no failure-tokens"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, all hashes, obsolete API, no failure-tokens"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, all hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, all hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, all hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, all hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, strong hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, strong hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, strong hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, strong hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, glibc hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, glibc hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, glibc hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, glibc hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, glibc and strong hashes, obsolete API for glibc"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api=glibc --enable-hashes=strong,glibc"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, glibc and strong hashes, obsolete API for glibc"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api=glibc --enable-hashes=strong,glibc"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, glibc and strong hashes, obsolete API for glibc"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api=glibc --enable-hashes=strong,glibc"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, glibc and strong hashes, obsolete API for glibc"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
diff --git a/libxcrypt.spec b/libxcrypt.spec
index 92dd79a..10749a5 100644
--- a/libxcrypt.spec
+++ b/libxcrypt.spec
@@ -76,7 +76,7 @@ fi \
Name: libxcrypt
Version: 4.2.2
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: Extended crypt library for DES, MD5, Blowfish and others
# For explicit license breakdown, see the
@@ -85,6 +85,8 @@ License: LGPLv2+ and BSD and Public Domain
URL: https://github.com/besser82/%{name}
Source0: %{url}/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
+Patch0001: %{url}/compare/v%{version}...develop.patch#/%{name}-%{version}-to_develop.patch
+
BuildRequires: fipscheck
BuildRequires: libtool
@@ -306,6 +308,9 @@ done
%changelog
+* Thu Oct 25 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-2
+- Add patch updating to recent development version
+
* Thu Oct 18 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-1
- New upstream release
5 years, 6 months
Architecture specific change in rpms/libxcrypt.git
by githook-noreply@fedoraproject.org
The package rpms/libxcrypt.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/libxcrypt.git/commit/?id=56fc361c....
Change:
+%ifnarch %{power64}
Thanks.
Full change:
============
commit de4a76fef760e86a036f510ae412bfa477cb7f24
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Thu Oct 25 16:40:55 2018 +0200
Use bootstrap script
diff --git a/libxcrypt.spec b/libxcrypt.spec
index 43a9a12..dbd40e0 100644
--- a/libxcrypt.spec
+++ b/libxcrypt.spec
@@ -216,7 +216,7 @@ discouraged.
%prep
%autosetup -p 1
-%{_bindir}/autoreconf -fiv
+./bootstrap
%{__mkdir_p} %{_vpath_builddir}{,-compat}
@@ -338,6 +338,7 @@ done
* Thu Oct 25 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-2
- Add patch updating to recent development version
- Run valgrind-memcheck
+- Use bootstrap script
* Thu Oct 18 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-1
- New upstream release
commit 56fc361c2d2d33ff6acdfa408af543367ae39954
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Thu Oct 25 16:34:44 2018 +0200
Run valgrind-memcheck
diff --git a/libxcrypt.spec b/libxcrypt.spec
index 10749a5..43a9a12 100644
--- a/libxcrypt.spec
+++ b/libxcrypt.spec
@@ -6,6 +6,15 @@
#endif
+# Run memcheck?
+# Valgrind does not work well on %%{power64} arches.
+%ifnarch %{power64}
+%bcond_without memcheck
+%else
+%bcond_with memcheck
+%endif
+
+
# Shared object version of libcrypt.
%if %{with new_api}
%global soc 2
@@ -48,6 +57,11 @@
--enable-shared \\\
--enable-static \\\
--disable-failure-tokens \\\
+%if %{with memcheck} \
+ --enable-valgrind \\\
+%else \
+ --disable-valgrind \\\
+%endif \
--srcdir=.. \\\
--with-pkgconfigdir=%{_libdir}/pkgconfig
@@ -89,6 +103,9 @@ Patch0001: %{url}/compare/v%{version}...develop.patch#/%{name}-%{version}-t
BuildRequires: fipscheck
BuildRequires: libtool
+%if %{with memcheck}
+BuildRequires: valgrind
+%endif
# We do not need to keep this forever.
%if %{without new_api} && (0%{?fedora} && 0%{?fedora} <= 31) || (0%{?rhel} && 0%{?rhel} <= 10)
@@ -260,6 +277,16 @@ for dir in %{_vpath_builddir}; do
echo "-----END TESTLOG: ${dir}-----";
exit $rc;
}
+%if %{with memcheck}
+ %make_build -C ${dir} check-valgrind-memcheck || \
+ {
+ rc=$?;
+ echo "-----BEGIN TESTLOG: ${dir}-----";
+ %{__cat} ${dir}/test-suite-memcheck.log;
+ echo "-----END TESTLOG: ${dir}-----";
+ exit $rc;
+ }
+%endif
done
@@ -310,6 +337,7 @@ done
%changelog
* Thu Oct 25 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-2
- Add patch updating to recent development version
+- Run valgrind-memcheck
* Thu Oct 18 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-1
- New upstream release
commit ea4ffe97b18e8cb8857b3398861b6eb4948236c8
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Thu Oct 25 16:28:21 2018 +0200
Add patch updating to recent development version
diff --git a/libxcrypt-4.2.2-to_develop.patch b/libxcrypt-4.2.2-to_develop.patch
new file mode 100644
index 0000000..d42e74c
--- /dev/null
+++ b/libxcrypt-4.2.2-to_develop.patch
@@ -0,0 +1,3945 @@
+From 9bae80381beabc1b08b0fd89d2a4e6e15e3e5da0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 18 Oct 2018 21:24:10 +0200
+Subject: [PATCH 01/17] Bump tarball version to 4.2.3 and update NEWS.
+
+---
+ NEWS | 2 ++
+ configure.ac | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/NEWS b/NEWS
+index 5b2795e..ef7c244 100644
+--- a/NEWS
++++ b/NEWS
+@@ -3,6 +3,8 @@ libxcrypt NEWS -- history of user-visible changes.
+ Please send bug reports, questions and suggestions to
+ <https://github.com/besser82/libxcrypt/issues>.
+
++Version 4.2.3
++
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+
+diff --git a/configure.ac b/configure.ac
+index efbd2e7..3ba313c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1,7 +1,7 @@
+ # Process this file with autoconf to produce a configure script.
+ m4_include([m4/zw_automodern.m4])
+ AC_INIT([xcrypt],
+- [4.2.2],
++ [4.2.3],
+ [https://github.com/besser82/libxcrypt/issues],
+ [libxcrypt],
+ [https://github.com/besser82/libxcrypt])
+
+From ed11116c6e4b5b80ef8f6f57fe8db4aa3604a53b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 18 Oct 2018 22:23:19 +0200
+Subject: [PATCH 02/17] Add bootstrap script.
+
+---
+ .travis.yml | 6 +++---
+ NEWS | 1 +
+ bootstrap | 33 +++++++++++++++++++++++++++++++++
+ 3 files changed, 37 insertions(+), 3 deletions(-)
+ create mode 100755 bootstrap
+
+diff --git a/.travis.yml b/.travis.yml
+index 78a3f0a..acb186c 100644
+--- a/.travis.yml
++++ b/.travis.yml
+@@ -181,9 +181,9 @@ before_install:
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y upgrade && i= && break || sleep 1; done; [ -z "$i" ]'
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y swap coreutils-single coreutils && i= && break || sleep 1; done; [ -z "$i" ]'
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y groups install buildsys-build && i= && break || sleep 1; done; [ -z "$i" ]'
+- - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install libtool valgrind && i= && break || sleep 1; done; [ -z "$i" ]'
++ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install git libtool valgrind && i= && break || sleep 1; done; [ -z "$i" ]'
+ - if [[ "$CC" == "clang" ]] ; then docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install clang && i= && break || sleep 1; done; [ -z "$i" ]' ; fi
+- - if [[ "$CODECOV" == "1" ]] ; then docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install git lcov python3-pip && i= && break || sleep 1; done; [ -z "$i" ]' ; fi
++ - if [[ "$CODECOV" == "1" ]] ; then docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y install lcov python3-pip && i= && break || sleep 1; done; [ -z "$i" ]' ; fi
+ - if [[ "$CODECOV" == "1" ]] ; then docker exec -t buildenv /bin/sh -c "pip3 install codecov" ; fi
+ - docker exec -t buildenv /bin/sh -c 'for i in `seq 0 99`; do dnf -y autoremove && i= && break || sleep 1; done; [ -z "$i" ]'
+
+@@ -201,7 +201,7 @@ script:
+ - export NPROCS="$((`nproc --all` * 2))" ; echo paralleism is $NPROCS
+ - if [[ "$CODECOV" == "1" ]] ; then export CFLAGS="-O0 -g --coverage" ; export CXXFLAGS="$CFLAGS" ; export LDFLAGS="--coverage" ; fi
+ - docker exec -t buildenv /bin/sh -c "cat /etc/redhat-release"
+- - docker exec -t buildenv /bin/sh -c "cd /opt/libxcrypt && autoreconf -fiv -Wall -Werror"
++ - docker exec -t buildenv /bin/sh -c "cd /opt/libxcrypt && ./bootstrap"
+ - docker exec -t buildenv /bin/sh -c "cd /opt/libxcrypt && CFLAGS=\"$CFLAGS\" CXXFLAGS=\"$CXXFLAGS\" LDFLAGS=\"$LDFLAGS\" ./configure --prefix=/opt/libxcrypt --disable-silent-rules --enable-shared --enable-static $CONF"
+ - docker exec -t buildenv /bin/sh -c "make -C /opt/libxcrypt -j$NPROCS"
+ - docker exec -t buildenv /bin/sh -c "make -C /opt/libxcrypt install"
+diff --git a/NEWS b/NEWS
+index ef7c244..7847c86 100644
+--- a/NEWS
++++ b/NEWS
+@@ -4,6 +4,7 @@ Please send bug reports, questions and suggestions to
+ <https://github.com/besser82/libxcrypt/issues>.
+
+ Version 4.2.3
++* Add bootstrap script.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/bootstrap b/bootstrap
+new file mode 100755
+index 0000000..af6433a
+--- /dev/null
++++ b/bootstrap
+@@ -0,0 +1,33 @@
++#!/bin/sh
++#
++# Copyright (C) 2018 Bjrn Esser <besser82(a)fedoraproject.org>
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted.
++#
++# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++# SUCH DAMAGE.
++
++set -efu
++LANG=C
++
++run_cmd()
++{
++ echo "bootstrap: running: $@"
++ "$@"
++}
++
++if [ -d .git ]; then
++ run_cmd git clean -dfX
++fi
++
++run_cmd autoreconf -iv -Wall,error
+
+From a19bb7e1ae3e954b8852f50fd70ca496839989b5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Fri, 19 Oct 2018 00:01:16 +0200
+Subject: [PATCH 03/17] Recommend the bootstrap script over autoreconf.
+
+---
+ NEWS | 3 ++-
+ README.md | 2 +-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/NEWS b/NEWS
+index 7847c86..c55a971 100644
+--- a/NEWS
++++ b/NEWS
+@@ -4,7 +4,8 @@ Please send bug reports, questions and suggestions to
+ <https://github.com/besser82/libxcrypt/issues>.
+
+ Version 4.2.3
+-* Add bootstrap script.
++* Add bootstrap script. If building from a Git checkout instead of a
++ tarball release, use './bootstrap' to create the configure script.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/README.md b/README.md
+index a32b1b1..102127a 100644
+--- a/README.md
++++ b/README.md
+@@ -62,7 +62,7 @@ these things before building the software.
+
+ Building from a Git checkout additionally requires the Autotools
+ suite: `autoconf`, `automake`, `libtool`, and `pkg-config`.
+-Run `autoreconf -i` at the top level of the source tree, and then
++Run `./bootstrap` at the top level of the source tree, and then
+ follow the instructions in `INSTALL` (which is created by that command).
+
+ The oldest versions of Autotools components that are known to work
+
+From 4bb73c595925a4603393ff25751ada66921919d9 Mon Sep 17 00:00:00 2001
+From: Zack Weinberg <zackw(a)panix.com>
+Date: Sat, 20 Oct 2018 12:36:02 -0400
+Subject: [PATCH 04/17] Revise the to-do list.
+
+---
+ TODO | 57 +----------------------------
+ TODO.md | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 110 insertions(+), 56 deletions(-)
+ mode change 100644 => 120000 TODO
+ create mode 100644 TODO.md
+
+diff --git a/TODO b/TODO
+deleted file mode 100644
+index 66db86b..0000000
+--- a/TODO
++++ /dev/null
+@@ -1,56 +0,0 @@
+-to-do list for libxcrypt
+-------------------------
+-
+-* Near future:
+- * Update all of the default cost parameters
+- * relevant benchmarking at
+- <https://pthree.org/2016/06/28/lets-talk-password-hashing/>
+- * the default used by `crypt_gensalt_*` for new hashes should be
+- controllable independently from the default used if there is no
+- rounds= annotation in a setting string
+- * Make the crypt and crypt_gensalt static state thread-specific?
+- * if allocated on first use, this would also shave 32kB of
+- data segment off the shared library
+- * Factor out all of the repetitive base64 code
+- * get rid of the de/serialization code in crypt-bcrypt.c that
+- still does dodgy things with type punning
+- * Attempt to determine the copyright holders and intended licensing
+- of the test suite
+- * Moar tests
+- * Make sure the symbol versioning macros work with all of the compilers
+- that anyone needs (they use GCC extensions that clang also supports).
+-
+-* Longer term:
+- * Hash algorithms newer than bcrypt tend to want to allocate and
+- scribble all over a large (tens of megabytes at a minimum) block
+- of memory, to make brute force hard in a way that GPUs and ASICs
+- can't easily accelerate. The existing API cannot handle this for
+- three reasons:
+- * `crypt_gensalt` only takes a single cost parameter, some
+- algorithms have several
+- * With everything except `crypt_ra`, all of the memory is
+- allocated by the caller and there's no way for algorithms to say
+- how much they need
+- * There is no destructor function, even with `crypt_ra` - callers
+- just pass the block to `free`
+-
+- So we need to invent a new API that allows for more variety in
+- cost parameters and allocations. It could also make the "all the
+- sensitive data, including stack scratch, is in crypt_data which we
+- auto-erase" feature more robust by adding guard bands and calling
+- mlock().
+-
+- * Additional hashes to investigate adding:
+- * scrypt <https://www.tarsnap.com/scrypt.html>
+- * Argon2 <https://password-hashing.net/>
+- * ...?
+-
+- * Support for "pepper" (an additional piece of information, _not_
+- stored in the password file, that you need to check a password)
+-
+- * Reading passphrases from the terminal is finicky and there are
+- several competing, poorly portable, questionably sound library
+- functions to do it (`getpass`, `readpassphrase`, etc) -- should we
+- incorporate one?
+- * If we do, should it know how to trigger the trusted-path
+- password prompt in modern GUI environments? (probably)
+diff --git a/TODO b/TODO
+new file mode 120000
+index 0000000..cde952b
+--- /dev/null
++++ b/TODO
+@@ -0,0 +1 @@
++TODO.md
+\ No newline at end of file
+diff --git a/TODO.md b/TODO.md
+new file mode 100644
+index 0000000..30c0372
+--- /dev/null
++++ b/TODO.md
+@@ -0,0 +1,109 @@
++to-do list for libxcrypt
++------------------------
++
++This list is categorized but not in any kind of priority order.
++It was last updated 20 October 2018.
++
++* Code cleanliness
++ * Find and remove any code that still does dodgy things with type punning
++ * Factor out all of the repetitive base64 code
++ * Factor out the multiple implementations of HMAC and PBKDF
++
++* Testsuite improvements
++ * Line coverage is inadequate for `alg-yescrypt-common.c` and
++ `alg-yescrypt-opt.c`
++ * Investigate branch coverage
++ * Do some API fuzz testing and add missing cases to the testsuite
++ * Many of the `test-crypt-*.c` files repeat more or less the same
++ code with different data, consider merging them
++
++* Portability
++ * Make sure the symbol versioning macros work with all of the
++ compilers that anyone needs (they use GCC extensions that clang
++ also supports).
++ * `alg-yescrypt-common.c` contains #ifdeffage for use of
++ `posix_memalign` that isnt wired up to autoconf
++ * possibly this should just be removed; does anything have
++ `posix_memalign` but not `mmap`? its only a compile-time
++ fallback, not a runtime fallback
++
++* Hardening
++ * bcrypt-like selftest/memory scribble for all hashing methods
++ * how do we know the memory scribble is doing its job?
++ * build out of the box with compiler hardening features turned on
++ * something bespoke for not having to write serialization and
++ deserialization logic for hash strings by hand, as this is
++ probably the most error-prone part of writing a hashing method
++
++ * the most sensitive piece of data handled by this library is a
++ cleartext passphrase. OS may have trusted-path facilities for
++ prompting the user for a passphrase and feeding it to a KDF
++ without its ever being accessible in normal memory. investigate
++ whether we can use these.
++
++* Additional hashing methods
++ * Argon2 <https://password-hashing.net/>
++ * ...?
++
++* Runtime configurability (in progress on the [crypt.conf branch][])
++ * allow installations to enable or disable specific hash methods
++ without rebuilding the library
++ * make the default cost parameter used by `crypt_gensalt_*` for new
++ hashes configurable
++ * update the compiled-in defaults used by `crypt_gensalt_*` (not the
++ defaults used when no explicit cost parameter is present in a
++ hash; those cant be changed without breaking existing stored hashes)
++ * relevant benchmarking at
++ <https://pthree.org/2016/06/28/lets-talk-password-hashing/>
++ * offer a way to tune cost parameters for a specific installation
++ * N.B. Solaris 11 has all of these features but our implementation will
++ probably not match them (they have a `crypt.conf` but its not the
++ same, and their `crypt_gensalt` is API-incompatible anyway).
++
++[crypt.conf branch]: https://github.com/besser82/libxcrypt/tree/zack/crypt.conf
++
++* Potential API enhancements:
++
++ * Support for "pepper" (an additional piece of information, _not_
++ stored in the password file, that you need to check a password)
++
++ * Reading passphrases from the terminal is finicky and there are
++ several competing, poorly portable, questionably sound library
++ functions to do it (`getpass`, `readpassphrase`, etc) -- should we
++ incorporate one?
++ * If we do, should it know how to trigger the trusted-path
++ password prompt in modern GUI environments? (probably)
++
++ * Make the crypt and crypt_gensalt static state thread-specific?
++ * Solaris 11 may have done this (its `crypt(3)` manpage describes
++ it as MT-Safe and I dont see any other way they could have
++ accomplished that).
++ * if allocated on first use, this would also shave 32kB of
++ data segment off the shared library
++ * alternatively, add a global lock and *crash the program* if we
++ detect concurrent calls
++
++ * Allow access to more of yescrypts tunable parameters and ROM
++ feature, in a way thats generic enough that we could also use it
++ for e.g. Argon2s tunable parameters
++
++ * Other yescrypt-inspired features relevant to using this library to
++ back a dedicated authentication service, e.g. preallocation of
++ large blocks of scratch memory
++ * the main obstacles here are that `struct crypt_data` has a fixed
++ size which is either too big or too small depending how you look
++ at it, and no destructor function
++
++* Permissive relicensing, to encourage use beyond the GNU ecosystem?
++ * Replace remaining (L)GPLed crypto primitives (MD5, SHA512) with
++ permissively licensed equivalents (e.g. from Openwall)
++ * Replace crypt-md5.c with original md5crypt from FreeBSD?
++ * Other files subject to the (L)GPL are crypt.c, crypt-static.c,
++ crypt-gensalt-static.c, crypt-obsolete.h, crypt-port.h,
++ crypt-private.h, test-badsalt.c. It is not clear to me how much
++ material originally assigned to the FSF remains in these files.
++ Several of them are API definitions and trivial wrappers that
++ could not be meaningfully changed without breaking them (so are
++ arguably uncopyrightable).
++ * Most of the test suite lacks any license or even authorship
++ information. We would have to track down the original authors.
+
+From 9787b0be83a077c8c1a4e9b460b6b6e3698002d4 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 12:18:25 +0200
+Subject: [PATCH 05/17] Generate included header files before any other target.
+
+If we use a dummy target that depends on targets generating
+commonly used header files and that creates an empty file,
+which is included in the Makefile later, the header files are
+guaranteed to be generated before any other target in the same
+Makefile.
+---
+ .gitignore | 1 +
+ Makefile.am | 16 +++++++++-------
+ 2 files changed, 10 insertions(+), 7 deletions(-)
+
+diff --git a/.gitignore b/.gitignore
+index 1e9e605..e0b13cf 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -1,6 +1,7 @@
+ # http://www.gnu.org/software/automake
+
+ /Makefile
++/Makefile.deps
+ /Makefile.in
+ /.deps/
+ /.libs/
+diff --git a/Makefile.am b/Makefile.am
+index 2cb07ca..acab882 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -71,13 +71,19 @@ libcrypt_la_CPPFLAGS = $(AM_CPPFLAGS) -DIN_LIBCRYPT
+
+ CONFIG_STATUS_DEPENDENCIES = libcrypt.minver
+ EXTRA_libcrypt_la_DEPENDENCIES = libcrypt.map
+-CLEANFILES = libcrypt.map libcrypt.map.T \
++CLEANFILES = Makefile.deps.T Makefile.deps \
++ libcrypt.map libcrypt.map.T \
+ crypt-symbol-vers.h crypt-symbol-vers.h.T \
+ crypt-hashes.h crypt-hashes.h.T \
+ crypt.h crypt.h.T
+
+ DISTCLEANFILES = .deps/*.Plo
+
++# Empty target to have needed headers pre-generated before any other target.
++Makefile.deps: crypt-hashes.h crypt-symbol-vers.h
++ $(AM_V_GEN)LC_ALL=C echo "# Deps" > Makefile.deps.T
++ $(AM_V_at)mv -f Makefile.deps.T Makefile.deps
++
+ libcrypt.map: libcrypt.map.in gen-map.awk Makefile
+ $(AM_V_GEN)LC_ALL=C $(AWK) \
+ -v SYMVER_MIN=$(SYMVER_MIN) \
+@@ -230,12 +236,8 @@ endif
+
+ # Every object file depends on crypt-symbol-vers.h and crypt-hashes.h,
+ # which are generated files, so automatic dependency generation is not
+-# sufficient. Most of the test programs depend on either libcrypt.la
+-# or one of its components, so they do not need an explicit dependency
+-# (after the first *successful* build, automatic dependency generation
+-# will reveal the direct dependency) but a few don't.
+-$(libcrypt_la_OBJECTS): crypt-symbol-vers.h crypt-hashes.h
+-$(test_byteorder_OBJECTS): crypt-symbol-vers.h crypt-hashes.h
++# sufficient.
++include $(builddir)/Makefile.deps
+
+ # Add additional targets
+ .PHONY: $(phony_targets)
+
+From d32b170da3d4b65e9b23bb1c9a50e027ec090c5a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 12:53:13 +0200
+Subject: [PATCH 06/17] Include crypt.h from crypt-port.h.
+
+Since we have a guaranteed way to make sure all generated header
+files are always present before any object file is compiled, we
+can drop crypt-base.h and include the local version of crypt.h
+through crypt-port.h.
+---
+ .gitignore | 2 +-
+ LICENSING | 2 +-
+ Makefile.am | 10 +++++-----
+ configure.ac | 2 +-
+ crypt-gensalt-static.c | 1 -
+ crypt-obsolete.h | 1 -
+ crypt-port.h | 6 ++++--
+ crypt-private.h | 1 -
+ crypt-static.c | 1 -
+ crypt-base.h.in => crypt.h.in.in | 0
+ gen-crypt-h.awk | 2 +-
+ test-crypt-bcrypt.c | 1 -
+ test-crypt-des.c | 1 -
+ test-crypt-md5.c | 1 -
+ test-crypt-nthash.c | 1 -
+ test-crypt-pbkdf1-sha1.c | 1 -
+ test-crypt-scrypt.c | 1 -
+ test-crypt-sha256.c | 1 -
+ test-crypt-sha512.c | 1 -
+ test-crypt-sunmd5.c | 1 -
+ test-crypt-yescrypt.c | 1 -
+ test-des-obsolete.c | 1 -
+ test-des-obsolete_r.c | 1 -
+ test-gensalt.c | 1 -
+ 24 files changed, 13 insertions(+), 28 deletions(-)
+ rename crypt-base.h.in => crypt.h.in.in (100%)
+
+diff --git a/.gitignore b/.gitignore
+index e0b13cf..e46e4c2 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -19,7 +19,7 @@
+ /config.status
+ /m4/config.sub
+ /configure
+-/crypt-base.h
++/crypt.h.in
+ /m4/depcomp
+ /m4/install-sh
+ /libtool
+diff --git a/LICENSING b/LICENSING
+index 17ae41e..bf0c514 100644
+--- a/LICENSING
++++ b/LICENSING
+@@ -12,7 +12,7 @@ source tree. For specific licensing terms consult the files themselves.
+ crypt.c, crypt-static.c, crypt-gensalt-static.c, crypt-port.h
+
+ * Copyright Free Software Foundation, Inc.; LGPL (v2.1 or later):
+- crypt-base.h, crypt-obsolete.h, crypt-private.h
++ crypt.h, crypt-obsolete.h, crypt-private.h
+ alg-md5.h, alg-md5.c, crypt-md5.c,
+ alg-sha512.h, alg-sha512.c,
+ test-crypt-badsalt.c, test-crypt-nonnull.c
+diff --git a/Makefile.am b/Makefile.am
+index acab882..498c48f 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -14,7 +14,7 @@ TEST_EXTENSIONS = .sh
+
+ EXTRA_DIST = \
+ LICENSING THANKS \
+- crypt-base.h.in libcrypt.map.in libcrypt.minver \
++ crypt.h.in.in libcrypt.map.in libcrypt.minver \
+ gen-map.awk gen-vers.awk gen-crypt-h.awk \
+ gen-hashes.awk sel-hashes.awk hashes.lst
+
+@@ -24,7 +24,7 @@ notrans_dist_man3_MANS = \
+ notrans_dist_man5_MANS = crypt.5
+
+ nodist_include_HEADERS = crypt.h
+-nodist_noinst_HEADERS = crypt-hashes.h crypt-base.h
++nodist_noinst_HEADERS = crypt-hashes.h
+ noinst_HEADERS = \
+ alg-des.h alg-hmac-sha1.h alg-md4.h alg-md5.h \
+ alg-sha1.h alg-sha256.h alg-sha512.h \
+@@ -80,7 +80,7 @@ CLEANFILES = Makefile.deps.T Makefile.deps \
+ DISTCLEANFILES = .deps/*.Plo
+
+ # Empty target to have needed headers pre-generated before any other target.
+-Makefile.deps: crypt-hashes.h crypt-symbol-vers.h
++Makefile.deps: crypt.h
+ $(AM_V_GEN)LC_ALL=C echo "# Deps" > Makefile.deps.T
+ $(AM_V_at)mv -f Makefile.deps.T Makefile.deps
+
+@@ -101,9 +101,9 @@ crypt-symbol-vers.h: libcrypt.map.in gen-vers.awk Makefile
+ $(srcdir)/libcrypt.map.in > crypt-symbol-vers.h.T
+ $(AM_V_at)mv -f crypt-symbol-vers.h.T crypt-symbol-vers.h
+
+-crypt.h: crypt-base.h gen-crypt-h.awk config.h
++crypt.h: crypt.h.in crypt-hashes.h crypt-symbol-vers.h gen-crypt-h.awk config.h
+ $(AM_V_GEN)LC_ALL=C $(AWK) \
+- -f $(srcdir)/gen-crypt-h.awk config.h $(builddir)/crypt-base.h \
++ -f $(srcdir)/gen-crypt-h.awk config.h $(builddir)/crypt.h.in \
+ > crypt.h.T
+ $(AM_V_at)mv -f crypt.h.T crypt.h
+
+diff --git a/configure.ac b/configure.ac
+index 3ba313c..5da8aa8 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -11,8 +11,8 @@ AC_CONFIG_SRCDIR([crypt.c])
+ AC_CONFIG_HEADERS([config.h])
+ AC_CONFIG_FILES([
+ Makefile
++ crypt.h.in
+ libxcrypt.pc
+- crypt-base.h
+ ])
+ AM_INIT_AUTOMAKE
+
+diff --git a/crypt-gensalt-static.c b/crypt-gensalt-static.c
+index 14f271e..590ee83 100644
+--- a/crypt-gensalt-static.c
++++ b/crypt-gensalt-static.c
+@@ -15,7 +15,6 @@
+ <https://www.gnu.org/licenses/>. */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ /* The functions that use global state objects are isolated in their
+ own files so that a statically-linked program that doesn't use them
+diff --git a/crypt-obsolete.h b/crypt-obsolete.h
+index d1acdea..4ecd969 100644
+--- a/crypt-obsolete.h
++++ b/crypt-obsolete.h
+@@ -19,7 +19,6 @@
+ #ifndef _CRYPT_OBSOLETE_H
+ #define _CRYPT_OBSOLETE_H 1
+
+-#include "crypt-base.h"
+
+ /* These functions are obsolete and should never be used, but we have to
+ keep providing them for binary backward compatibility. */
+diff --git a/crypt-port.h b/crypt-port.h
+index f139efa..5f4d55f 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -44,8 +44,8 @@
+ #endif
+
+ /* While actually compiling the library, suppress the __nonnull tags
+- on the functions in crypt-base.h, so that internal checks for NULL
+- are not deleted by the compiler. */
++ on the functions in crypt.h, so that internal checks for NULL are
++ not deleted by the compiler. */
+ #undef __nonnull
+ #define __nonnull(param) /* nothing */
+
+@@ -292,4 +292,6 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #define libcperciva_SHA256_Buf _crypt_SHA256_Buf
+ #endif
+
++#include "crypt.h"
++
+ #endif /* crypt-port.h */
+diff --git a/crypt-private.h b/crypt-private.h
+index 5e18030..306879d 100644
+--- a/crypt-private.h
++++ b/crypt-private.h
+@@ -20,7 +20,6 @@
+ #ifndef _CRYPT_PRIVATE_H
+ #define _CRYPT_PRIVATE_H 1
+
+-#include "crypt-base.h"
+
+ /* Utility functions */
+
+diff --git a/crypt-static.c b/crypt-static.c
+index fb9a953..d7598d1 100644
+--- a/crypt-static.c
++++ b/crypt-static.c
+@@ -15,7 +15,6 @@
+ <https://www.gnu.org/licenses/>. */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ /* The functions that use global state objects are isolated in their
+ own files so that a statically-linked program that doesn't use them
+diff --git a/crypt-base.h.in b/crypt.h.in.in
+similarity index 100%
+rename from crypt-base.h.in
+rename to crypt.h.in.in
+diff --git a/gen-crypt-h.awk b/gen-crypt-h.awk
+index 70fc5fa..8b3f4f5 100644
+--- a/gen-crypt-h.awk
++++ b/gen-crypt-h.awk
+@@ -1,4 +1,4 @@
+-# Generation of crypt.h from crypt-base.h and config.h.
++# Generation of crypt.h from crypt.h.in and config.h.
+ #
+ # Written by Zack Weinberg <zackw at panix.com> in 2017.
+ # To the extent possible under law, Zack Weinberg has waived all
+diff --git a/test-crypt-bcrypt.c b/test-crypt-bcrypt.c
+index bf149b4..5cf90c1 100644
+--- a/test-crypt-bcrypt.c
++++ b/test-crypt-bcrypt.c
+@@ -15,7 +15,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <errno.h>
+ #include <stdio.h>
+diff --git a/test-crypt-des.c b/test-crypt-des.c
+index 1b5463e..f01fee7 100644
+--- a/test-crypt-des.c
++++ b/test-crypt-des.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-md5.c b/test-crypt-md5.c
+index 3035c39..d42b529 100644
+--- a/test-crypt-md5.c
++++ b/test-crypt-md5.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #if INCLUDE_md5
+
+diff --git a/test-crypt-nthash.c b/test-crypt-nthash.c
+index 9bf7d28..b344d86 100644
+--- a/test-crypt-nthash.c
++++ b/test-crypt-nthash.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-pbkdf1-sha1.c b/test-crypt-pbkdf1-sha1.c
+index 677e5bf..7a0c826 100644
+--- a/test-crypt-pbkdf1-sha1.c
++++ b/test-crypt-pbkdf1-sha1.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <errno.h>
+ #include <stdio.h>
+diff --git a/test-crypt-scrypt.c b/test-crypt-scrypt.c
+index df64774..0cf8da3 100644
+--- a/test-crypt-scrypt.c
++++ b/test-crypt-scrypt.c
+@@ -18,7 +18,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-sha256.c b/test-crypt-sha256.c
+index 05135ff..9331d14 100644
+--- a/test-crypt-sha256.c
++++ b/test-crypt-sha256.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-sha512.c b/test-crypt-sha512.c
+index bef271b..88c5643 100644
+--- a/test-crypt-sha512.c
++++ b/test-crypt-sha512.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-crypt-sunmd5.c b/test-crypt-sunmd5.c
+index d0d85e3..88e8ecf 100644
+--- a/test-crypt-sunmd5.c
++++ b/test-crypt-sunmd5.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+ #include <stdlib.h>
+diff --git a/test-crypt-yescrypt.c b/test-crypt-yescrypt.c
+index da6b694..a635f94 100644
+--- a/test-crypt-yescrypt.c
++++ b/test-crypt-yescrypt.c
+@@ -17,7 +17,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <stdio.h>
+
+diff --git a/test-des-obsolete.c b/test-des-obsolete.c
+index d5e3cc0..4588c75 100644
+--- a/test-des-obsolete.c
++++ b/test-des-obsolete.c
+@@ -7,7 +7,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+ #include "crypt-obsolete.h"
+ #include "test-des-cases.h"
+
+diff --git a/test-des-obsolete_r.c b/test-des-obsolete_r.c
+index d635b2a..9efd0fb 100644
+--- a/test-des-obsolete_r.c
++++ b/test-des-obsolete_r.c
+@@ -7,7 +7,6 @@
+ */
+
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+ #include "crypt-obsolete.h"
+ #include "test-des-cases.h"
+
+diff --git a/test-gensalt.c b/test-gensalt.c
+index a6d3621..40fe66c 100644
+--- a/test-gensalt.c
++++ b/test-gensalt.c
+@@ -1,5 +1,4 @@
+ #include "crypt-port.h"
+-#include "crypt-base.h"
+
+ #include <errno.h>
+ #include <stdio.h>
+
+From a5f8acd51acb267d989ea3375ab17e29a0857059 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 13:06:59 +0200
+Subject: [PATCH 07/17] Add crypt-symbol-vers.h to nodist_noinst_HEADERS.
+
+---
+ Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 498c48f..a09e6a4 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -24,7 +24,7 @@ notrans_dist_man3_MANS = \
+ notrans_dist_man5_MANS = crypt.5
+
+ nodist_include_HEADERS = crypt.h
+-nodist_noinst_HEADERS = crypt-hashes.h
++nodist_noinst_HEADERS = crypt-hashes.h crypt-symbol-vers.h
+ noinst_HEADERS = \
+ alg-des.h alg-hmac-sha1.h alg-md4.h alg-md5.h \
+ alg-sha1.h alg-sha256.h alg-sha512.h \
+
+From 6adbd465a6003cf856e4c9debe0e6049746c685a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Oct 2018 16:11:30 +0200
+Subject: [PATCH 08/17] Add gen-des-tables to noinst_PROGRAMS.
+
+---
+ .gitignore | 1 +
+ Makefile.am | 2 ++
+ 2 files changed, 3 insertions(+)
+
+diff --git a/.gitignore b/.gitignore
+index e46e4c2..8aead50 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -48,6 +48,7 @@
+ /crypt-hashes.h
+ /crypt-symbol-vers.h
+ /libcrypt.map
++/gen-des-tables
+ /test-alg-des
+ /test-alg-hmac-sha1
+ /test-alg-md4
+diff --git a/Makefile.am b/Makefile.am
+index a09e6a4..e7d5c6d 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -31,6 +31,8 @@ noinst_HEADERS = \
+ alg-yescrypt.h alg-yescrypt-sysendian.h byteorder.h \
+ crypt-obsolete.h crypt-private.h crypt-port.h test-des-cases.h
+
++noinst_PROGRAMS = gen-des-tables
++
+ lib_LTLIBRARIES = libcrypt.la
+ libcrypt_la_SOURCES = \
+ alg-des.c alg-des-tables.c alg-hmac-sha1.c alg-md4.c alg-md5.c \
+
+From 323e5e097f643641f41f24969227b073470e186e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 13:08:36 +0200
+Subject: [PATCH 09/17] Use sha512 implementation from Colin Percival.
+
+Thus we now have a sha512 implementation under the BSD license.
+---
+ LICENSING | 4 +-
+ NEWS | 2 +
+ TODO.md | 2 +-
+ alg-sha512.c | 566 +++++++++++++++++++++------------------
+ alg-sha512.h | 121 +++++----
+ alg-yescrypt-sysendian.h | 12 +
+ crypt-port.h | 7 +-
+ crypt-sha512.c | 56 ++--
+ test-alg-sha512.c | 23 +-
+ 9 files changed, 441 insertions(+), 352 deletions(-)
+
+diff --git a/LICENSING b/LICENSING
+index bf0c514..31f704c 100644
+--- a/LICENSING
++++ b/LICENSING
+@@ -14,7 +14,6 @@ source tree. For specific licensing terms consult the files themselves.
+ * Copyright Free Software Foundation, Inc.; LGPL (v2.1 or later):
+ crypt.h, crypt-obsolete.h, crypt-private.h
+ alg-md5.h, alg-md5.c, crypt-md5.c,
+- alg-sha512.h, alg-sha512.c,
+ test-crypt-badsalt.c, test-crypt-nonnull.c
+
+ * Copyright David Burren et al.; 3-clause BSD:
+@@ -34,6 +33,9 @@ source tree. For specific licensing terms consult the files themselves.
+ alg-sha256.c, alg-sha256.h, alg-yescrypt.h, alg-yescrypt-opt.c,
+ alg-yescrypt-sysendian.h
+
++ * Copyright Colin Percival; 2-clause BSD:
++ alg-sha512.h, alg-sha512.c
++
+ * Copyright Alexander Peslyak, Bjrn Esser; 0-clause BSD:
+ crypt-scrypt.c
+
+diff --git a/NEWS b/NEWS
+index c55a971..c4b04da 100644
+--- a/NEWS
++++ b/NEWS
+@@ -6,6 +6,8 @@ Please send bug reports, questions and suggestions to
+ Version 4.2.3
+ * Add bootstrap script. If building from a Git checkout instead of a
+ tarball release, use './bootstrap' to create the configure script.
++* Use sha512 implementation from Colin Percival. Thus we now have a
++ sha512 implementation under the BSD license.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/TODO.md b/TODO.md
+index 30c0372..c4e2799 100644
+--- a/TODO.md
++++ b/TODO.md
+@@ -95,7 +95,7 @@ It was last updated 20 October 2018.
+ at it, and no destructor function
+
+ * Permissive relicensing, to encourage use beyond the GNU ecosystem?
+- * Replace remaining (L)GPLed crypto primitives (MD5, SHA512) with
++ * Replace remaining (L)GPLed crypto primitives (MD5) with
+ permissively licensed equivalents (e.g. from Openwall)
+ * Replace crypt-md5.c with original md5crypt from FreeBSD?
+ * Other files subject to the (L)GPL are crypt.c, crypt-static.c,
+diff --git a/alg-sha512.c b/alg-sha512.c
+index 60c1877..0d24301 100644
+--- a/alg-sha512.c
++++ b/alg-sha512.c
+@@ -1,289 +1,335 @@
+-/* Functions to compute SHA512 message digest of files or memory blocks.
+- according to the definition of SHA512 in FIPS 180-2.
+- Copyright (C) 2007-2017 Free Software Foundation, Inc.
++/*-
++ * Copyright 2005 Colin Percival
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
+
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
++#include "crypt-port.h"
+
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
++#if INCLUDE_sha512
+
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
++#include "alg-sha512.h"
++#include "alg-yescrypt-sysendian.h"
+
+-/* Written by Ulrich Drepper <drepper(a)redhat.com>, 2007. */
++#if IS_BIGENDIAN
++/* Copy a vector of big-endian uint64_t into a vector of bytes */
++#define be64enc_vect(dst, src, len) \
++ memcpy((void *)dst, (const void *)src, (size_t)len)
+
+-#include "crypt-port.h"
+-#include "alg-sha512.h"
+-#include "byteorder.h"
++/* Copy a vector of bytes into a vector of big-endian uint64_t */
++#define be64dec_vect(dst, src, len) \
++ memcpy((void *)dst, (const void *)src, (size_t)len)
+
+-#if INCLUDE_sha512
++#else /* IS_BIGENDIAN */
+
+-/* Constants for SHA512 from FIPS 180-2:4.2.3. */
+-static const uint64_t K[80] =
++/*
++ * Encode a length len/4 vector of (uint64_t) into a length len vector of
++ * (unsigned char) in big-endian form. Assumes len is a multiple of 8.
++ */
++static void
++be64enc_vect(unsigned char *dst, const uint64_t *src, size_t len)
+ {
+- UINT64_C (0x428a2f98d728ae22), UINT64_C (0x7137449123ef65cd),
+- UINT64_C (0xb5c0fbcfec4d3b2f), UINT64_C (0xe9b5dba58189dbbc),
+- UINT64_C (0x3956c25bf348b538), UINT64_C (0x59f111f1b605d019),
+- UINT64_C (0x923f82a4af194f9b), UINT64_C (0xab1c5ed5da6d8118),
+- UINT64_C (0xd807aa98a3030242), UINT64_C (0x12835b0145706fbe),
+- UINT64_C (0x243185be4ee4b28c), UINT64_C (0x550c7dc3d5ffb4e2),
+- UINT64_C (0x72be5d74f27b896f), UINT64_C (0x80deb1fe3b1696b1),
+- UINT64_C (0x9bdc06a725c71235), UINT64_C (0xc19bf174cf692694),
+- UINT64_C (0xe49b69c19ef14ad2), UINT64_C (0xefbe4786384f25e3),
+- UINT64_C (0x0fc19dc68b8cd5b5), UINT64_C (0x240ca1cc77ac9c65),
+- UINT64_C (0x2de92c6f592b0275), UINT64_C (0x4a7484aa6ea6e483),
+- UINT64_C (0x5cb0a9dcbd41fbd4), UINT64_C (0x76f988da831153b5),
+- UINT64_C (0x983e5152ee66dfab), UINT64_C (0xa831c66d2db43210),
+- UINT64_C (0xb00327c898fb213f), UINT64_C (0xbf597fc7beef0ee4),
+- UINT64_C (0xc6e00bf33da88fc2), UINT64_C (0xd5a79147930aa725),
+- UINT64_C (0x06ca6351e003826f), UINT64_C (0x142929670a0e6e70),
+- UINT64_C (0x27b70a8546d22ffc), UINT64_C (0x2e1b21385c26c926),
+- UINT64_C (0x4d2c6dfc5ac42aed), UINT64_C (0x53380d139d95b3df),
+- UINT64_C (0x650a73548baf63de), UINT64_C (0x766a0abb3c77b2a8),
+- UINT64_C (0x81c2c92e47edaee6), UINT64_C (0x92722c851482353b),
+- UINT64_C (0xa2bfe8a14cf10364), UINT64_C (0xa81a664bbc423001),
+- UINT64_C (0xc24b8b70d0f89791), UINT64_C (0xc76c51a30654be30),
+- UINT64_C (0xd192e819d6ef5218), UINT64_C (0xd69906245565a910),
+- UINT64_C (0xf40e35855771202a), UINT64_C (0x106aa07032bbd1b8),
+- UINT64_C (0x19a4c116b8d2d0c8), UINT64_C (0x1e376c085141ab53),
+- UINT64_C (0x2748774cdf8eeb99), UINT64_C (0x34b0bcb5e19b48a8),
+- UINT64_C (0x391c0cb3c5c95a63), UINT64_C (0x4ed8aa4ae3418acb),
+- UINT64_C (0x5b9cca4f7763e373), UINT64_C (0x682e6ff3d6b2b8a3),
+- UINT64_C (0x748f82ee5defb2fc), UINT64_C (0x78a5636f43172f60),
+- UINT64_C (0x84c87814a1f0ab72), UINT64_C (0x8cc702081a6439ec),
+- UINT64_C (0x90befffa23631e28), UINT64_C (0xa4506cebde82bde9),
+- UINT64_C (0xbef9a3f7b2c67915), UINT64_C (0xc67178f2e372532b),
+- UINT64_C (0xca273eceea26619c), UINT64_C (0xd186b8c721c0c207),
+- UINT64_C (0xeada7dd6cde0eb1e), UINT64_C (0xf57d4f7fee6ed178),
+- UINT64_C (0x06f067aa72176fba), UINT64_C (0x0a637dc5a2c898a6),
+- UINT64_C (0x113f9804bef90dae), UINT64_C (0x1b710b35131c471b),
+- UINT64_C (0x28db77f523047d84), UINT64_C (0x32caab7b40c72493),
+- UINT64_C (0x3c9ebe0a15c9bebc), UINT64_C (0x431d67c49c100d4c),
+- UINT64_C (0x4cc5d4becb3e42b6), UINT64_C (0x597f299cfc657e2a),
+- UINT64_C (0x5fcb6fab3ad6faec), UINT64_C (0x6c44198c4a475817)
+-};
++ size_t i;
+
++ for (i = 0; i < len / 8; i++)
++ be64enc(dst + i * 8, src[i]);
++}
+
+-/* Process LEN bytes of BUFFER, accumulating context into CTX.
+- It is assumed that LEN % 128 == 0. */
++/*
++ * Decode a big-endian length len vector of (unsigned char) into a length
++ * len/4 vector of (uint64_t). Assumes len is a multiple of 8.
++ */
+ static void
+-sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
++be64dec_vect(uint64_t *dst, const unsigned char *src, size_t len)
+ {
+- unsigned int t;
+- const unsigned char *p = buffer;
+- size_t nwords = len / sizeof (uint64_t);
+- uint64_t a = ctx->H[0];
+- uint64_t b = ctx->H[1];
+- uint64_t c = ctx->H[2];
+- uint64_t d = ctx->H[3];
+- uint64_t e = ctx->H[4];
+- uint64_t f = ctx->H[5];
+- uint64_t g = ctx->H[6];
+- uint64_t h = ctx->H[7];
+-
+- /* First increment the byte count. FIPS 180-2 specifies the possible
+- length of the file up to 2^128 bits. Here we only compute the
+- number of bytes. Do a double word increment. */
+- ctx->total[0] += len;
+- if (ctx->total[0] < len)
+- ++ctx->total[1];
+-
+- /* Process all bytes in the buffer with 128 bytes in each round of
+- the loop. */
+- while (nwords > 0)
+- {
+- uint64_t W[80];
+- uint64_t a_save = a;
+- uint64_t b_save = b;
+- uint64_t c_save = c;
+- uint64_t d_save = d;
+- uint64_t e_save = e;
+- uint64_t f_save = f;
+- uint64_t g_save = g;
+- uint64_t h_save = h;
+-
+- /* Operators defined in FIPS 180-2:4.1.2. */
+-#define Ch(x, y, z) ((x & y) ^ (~x & z))
+-#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
+-#define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39))
+-#define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41))
+-#define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7))
+-#define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6))
+-
+- /* It is unfortunate that C does not provide an operator for
+- cyclic rotation. Hope the C compiler is smart enough. */
+-#define CYCLIC(w, s) ((w >> s) | (w << (64 - s)))
+-
+- /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */
+- for (t = 0; t < 16; ++t)
+- {
+- W[t] = be64_to_cpu (p);
+- p += 8;
+- }
+- for (t = 16; t < 80; ++t)
+- W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16];
+-
+- /* The actual computation according to FIPS 180-2:6.3.2 step 3. */
+- for (t = 0; t < 80; ++t)
+- {
+- uint64_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t];
+- uint64_t T2 = S0 (a) + Maj (a, b, c);
+- h = g;
+- g = f;
+- f = e;
+- e = d + T1;
+- d = c;
+- c = b;
+- b = a;
+- a = T1 + T2;
+- }
+-
+- /* Add the starting values of the context according to FIPS 180-2:6.3.2
+- step 4. */
+- a += a_save;
+- b += b_save;
+- c += c_save;
+- d += d_save;
+- e += e_save;
+- f += f_save;
+- g += g_save;
+- h += h_save;
+-
+- /* Prepare for the next round. */
+- nwords -= 16;
+- }
+-
+- /* Put checksum in context given as argument. */
+- ctx->H[0] = a;
+- ctx->H[1] = b;
+- ctx->H[2] = c;
+- ctx->H[3] = d;
+- ctx->H[4] = e;
+- ctx->H[5] = f;
+- ctx->H[6] = g;
+- ctx->H[7] = h;
++ size_t i;
++
++ for (i = 0; i < len / 8; i++)
++ dst[i] = be64dec(src + i * 8);
+ }
+
++#endif /* IS_BIGENDIAN */
++
++/* Elementary functions used by SHA512 */
++#define Ch(x, y, z) ((x & (y ^ z)) ^ z)
++#define Maj(x, y, z) ((x & (y | z)) | (y & z))
++#define SHR(x, n) (x >> n)
++#define ROTR(x, n) ((x >> n) | (x << (64 - n)))
++#define S0(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
++#define S1(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
++#define s0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
++#define s1(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6))
++
++/* SHA512 round function */
++#define RND(a, b, c, d, e, f, g, h, k) \
++ t0 = h + S1(e) + Ch(e, f, g) + k; \
++ t1 = S0(a) + Maj(a, b, c); \
++ d += t0; \
++ h = t0 + t1;
++
++/* Adjusted round function for rotating state */
++#define RNDr(S, W, i, k) \
++ RND(S[(80 - i) % 8], S[(81 - i) % 8], \
++ S[(82 - i) % 8], S[(83 - i) % 8], \
++ S[(84 - i) % 8], S[(85 - i) % 8], \
++ S[(86 - i) % 8], S[(87 - i) % 8], \
++ W[i] + k)
++
++/*
++ * SHA512 block compression function. The 512-bit state is transformed via
++ * the 512-bit input block to produce a new state.
++ */
++static void
++SHA512_Transform(uint64_t * state, const unsigned char block[128])
++{
++ uint64_t W[80];
++ uint64_t S[8];
++ uint64_t t0, t1;
++ int i;
++
++ /* 1. Prepare message schedule W. */
++ be64dec_vect(W, block, 128);
++ for (i = 16; i < 80; i++)
++ W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
++
++ /* 2. Initialize working variables. */
++ memcpy(S, state, 64);
++
++ /* 3. Mix. */
++ RNDr(S, W, 0, 0x428a2f98d728ae22ULL);
++ RNDr(S, W, 1, 0x7137449123ef65cdULL);
++ RNDr(S, W, 2, 0xb5c0fbcfec4d3b2fULL);
++ RNDr(S, W, 3, 0xe9b5dba58189dbbcULL);
++ RNDr(S, W, 4, 0x3956c25bf348b538ULL);
++ RNDr(S, W, 5, 0x59f111f1b605d019ULL);
++ RNDr(S, W, 6, 0x923f82a4af194f9bULL);
++ RNDr(S, W, 7, 0xab1c5ed5da6d8118ULL);
++ RNDr(S, W, 8, 0xd807aa98a3030242ULL);
++ RNDr(S, W, 9, 0x12835b0145706fbeULL);
++ RNDr(S, W, 10, 0x243185be4ee4b28cULL);
++ RNDr(S, W, 11, 0x550c7dc3d5ffb4e2ULL);
++ RNDr(S, W, 12, 0x72be5d74f27b896fULL);
++ RNDr(S, W, 13, 0x80deb1fe3b1696b1ULL);
++ RNDr(S, W, 14, 0x9bdc06a725c71235ULL);
++ RNDr(S, W, 15, 0xc19bf174cf692694ULL);
++ RNDr(S, W, 16, 0xe49b69c19ef14ad2ULL);
++ RNDr(S, W, 17, 0xefbe4786384f25e3ULL);
++ RNDr(S, W, 18, 0x0fc19dc68b8cd5b5ULL);
++ RNDr(S, W, 19, 0x240ca1cc77ac9c65ULL);
++ RNDr(S, W, 20, 0x2de92c6f592b0275ULL);
++ RNDr(S, W, 21, 0x4a7484aa6ea6e483ULL);
++ RNDr(S, W, 22, 0x5cb0a9dcbd41fbd4ULL);
++ RNDr(S, W, 23, 0x76f988da831153b5ULL);
++ RNDr(S, W, 24, 0x983e5152ee66dfabULL);
++ RNDr(S, W, 25, 0xa831c66d2db43210ULL);
++ RNDr(S, W, 26, 0xb00327c898fb213fULL);
++ RNDr(S, W, 27, 0xbf597fc7beef0ee4ULL);
++ RNDr(S, W, 28, 0xc6e00bf33da88fc2ULL);
++ RNDr(S, W, 29, 0xd5a79147930aa725ULL);
++ RNDr(S, W, 30, 0x06ca6351e003826fULL);
++ RNDr(S, W, 31, 0x142929670a0e6e70ULL);
++ RNDr(S, W, 32, 0x27b70a8546d22ffcULL);
++ RNDr(S, W, 33, 0x2e1b21385c26c926ULL);
++ RNDr(S, W, 34, 0x4d2c6dfc5ac42aedULL);
++ RNDr(S, W, 35, 0x53380d139d95b3dfULL);
++ RNDr(S, W, 36, 0x650a73548baf63deULL);
++ RNDr(S, W, 37, 0x766a0abb3c77b2a8ULL);
++ RNDr(S, W, 38, 0x81c2c92e47edaee6ULL);
++ RNDr(S, W, 39, 0x92722c851482353bULL);
++ RNDr(S, W, 40, 0xa2bfe8a14cf10364ULL);
++ RNDr(S, W, 41, 0xa81a664bbc423001ULL);
++ RNDr(S, W, 42, 0xc24b8b70d0f89791ULL);
++ RNDr(S, W, 43, 0xc76c51a30654be30ULL);
++ RNDr(S, W, 44, 0xd192e819d6ef5218ULL);
++ RNDr(S, W, 45, 0xd69906245565a910ULL);
++ RNDr(S, W, 46, 0xf40e35855771202aULL);
++ RNDr(S, W, 47, 0x106aa07032bbd1b8ULL);
++ RNDr(S, W, 48, 0x19a4c116b8d2d0c8ULL);
++ RNDr(S, W, 49, 0x1e376c085141ab53ULL);
++ RNDr(S, W, 50, 0x2748774cdf8eeb99ULL);
++ RNDr(S, W, 51, 0x34b0bcb5e19b48a8ULL);
++ RNDr(S, W, 52, 0x391c0cb3c5c95a63ULL);
++ RNDr(S, W, 53, 0x4ed8aa4ae3418acbULL);
++ RNDr(S, W, 54, 0x5b9cca4f7763e373ULL);
++ RNDr(S, W, 55, 0x682e6ff3d6b2b8a3ULL);
++ RNDr(S, W, 56, 0x748f82ee5defb2fcULL);
++ RNDr(S, W, 57, 0x78a5636f43172f60ULL);
++ RNDr(S, W, 58, 0x84c87814a1f0ab72ULL);
++ RNDr(S, W, 59, 0x8cc702081a6439ecULL);
++ RNDr(S, W, 60, 0x90befffa23631e28ULL);
++ RNDr(S, W, 61, 0xa4506cebde82bde9ULL);
++ RNDr(S, W, 62, 0xbef9a3f7b2c67915ULL);
++ RNDr(S, W, 63, 0xc67178f2e372532bULL);
++ RNDr(S, W, 64, 0xca273eceea26619cULL);
++ RNDr(S, W, 65, 0xd186b8c721c0c207ULL);
++ RNDr(S, W, 66, 0xeada7dd6cde0eb1eULL);
++ RNDr(S, W, 67, 0xf57d4f7fee6ed178ULL);
++ RNDr(S, W, 68, 0x06f067aa72176fbaULL);
++ RNDr(S, W, 69, 0x0a637dc5a2c898a6ULL);
++ RNDr(S, W, 70, 0x113f9804bef90daeULL);
++ RNDr(S, W, 71, 0x1b710b35131c471bULL);
++ RNDr(S, W, 72, 0x28db77f523047d84ULL);
++ RNDr(S, W, 73, 0x32caab7b40c72493ULL);
++ RNDr(S, W, 74, 0x3c9ebe0a15c9bebcULL);
++ RNDr(S, W, 75, 0x431d67c49c100d4cULL);
++ RNDr(S, W, 76, 0x4cc5d4becb3e42b6ULL);
++ RNDr(S, W, 77, 0x597f299cfc657e2aULL);
++ RNDr(S, W, 78, 0x5fcb6fab3ad6faecULL);
++ RNDr(S, W, 79, 0x6c44198c4a475817ULL);
++
++ /* 4. Mix local working variables into global state */
++ for (i = 0; i < 8; i++)
++ state[i] += S[i];
++}
+
+-/* Initialize structure containing state of computation.
+- (FIPS 180-2:5.3.3) */
+-void
+-sha512_init_ctx (struct sha512_ctx *ctx)
++static unsigned char PAD[128] = {
++ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
++};
++
++/* Add padding and terminating bit-count. */
++static void
++SHA512_Pad(SHA512_CTX * ctx)
+ {
+- ctx->H[0] = UINT64_C (0x6a09e667f3bcc908);
+- ctx->H[1] = UINT64_C (0xbb67ae8584caa73b);
+- ctx->H[2] = UINT64_C (0x3c6ef372fe94f82b);
+- ctx->H[3] = UINT64_C (0xa54ff53a5f1d36f1);
+- ctx->H[4] = UINT64_C (0x510e527fade682d1);
+- ctx->H[5] = UINT64_C (0x9b05688c2b3e6c1f);
+- ctx->H[6] = UINT64_C (0x1f83d9abfb41bd6b);
+- ctx->H[7] = UINT64_C (0x5be0cd19137e2179);
+-
+- ctx->total[0] = ctx->total[1] = 0;
+- ctx->buflen = 0;
++ unsigned char len[16];
++ uint64_t r, plen;
++
++ /*
++ * Convert length to a vector of bytes -- we do this now rather
++ * than later because the length will change after we pad.
++ */
++ be64enc_vect(len, ctx->count, 16);
++
++ /* Add 1--128 bytes so that the resulting length is 112 mod 128 */
++ r = (ctx->count[1] >> 3) & 0x7f;
++ plen = (r < 112) ? (112 - r) : (240 - r);
++ SHA512_Update(ctx, PAD, (size_t)plen);
++
++ /* Add the terminating bit-count */
++ SHA512_Update(ctx, len, 16);
+ }
+
++/* SHA-512 initialization. Begins a SHA-512 operation. */
++void
++SHA512_Init(SHA512_CTX * ctx)
++{
+
+-/* Process the remaining bytes in the internal buffer and the usual
+- prolog according to the standard and write the result to RESBUF.
++ /* Zero bits processed so far */
++ ctx->count[0] = ctx->count[1] = 0;
++
++ /* Magic initialization constants */
++ ctx->state[0] = 0x6a09e667f3bcc908ULL;
++ ctx->state[1] = 0xbb67ae8584caa73bULL;
++ ctx->state[2] = 0x3c6ef372fe94f82bULL;
++ ctx->state[3] = 0xa54ff53a5f1d36f1ULL;
++ ctx->state[4] = 0x510e527fade682d1ULL;
++ ctx->state[5] = 0x9b05688c2b3e6c1fULL;
++ ctx->state[6] = 0x1f83d9abfb41bd6bULL;
++ ctx->state[7] = 0x5be0cd19137e2179ULL;
++}
+
+- IMPORTANT: On some systems it is required that RESBUF is correctly
+- aligned for a 32 bits value. */
+-void *
+-sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
++/* Add bytes into the hash */
++void
++SHA512_Update(SHA512_CTX * ctx, const void *in, size_t len)
+ {
+- /* Take yet unprocessed bytes into account. */
+- uint32_t bytes = ctx->buflen;
+- size_t pad;
+- unsigned int i;
+- unsigned char *rp = resbuf;
+-
+- /* Now count remaining bytes. */
+- ctx->total[0] += bytes;
+- if (ctx->total[0] < bytes)
+- ++ctx->total[1];
+-
+- pad = bytes >= 112 ? 128 + 112 - bytes : 112 - bytes;
+- /* The first byte of padding should be 0x80 and the rest should be
+- zero. (FIPS 180-2:5.1.2) */
+- ctx->buffer[bytes] = 0x80u;
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[bytes+1], pad-1);
+-
+- /* Put the 128-bit file length in big-endian *bits* at the end of
+- the buffer. */
+- cpu_to_be64 (&ctx->buffer[bytes + pad],
+- (ctx->total[1] << 3) | (ctx->total[0] >> 61));
+- cpu_to_be64 (&ctx->buffer[bytes + pad + 8],
+- ctx->total[0] << 3);
+-
+- /* Process last bytes. */
+- sha512_process_block (ctx->buffer, bytes + pad + 16, ctx);
+-
+- /* Put result from CTX in first 64 bytes following RESBUF. */
+- for (i = 0; i < 8; ++i)
+- cpu_to_be64 (rp + i*8, ctx->H[i]);
+-
+- XCRYPT_SECURE_MEMSET (ctx, sizeof (struct sha512_ctx));
+- return resbuf;
++ uint64_t bitlen[2];
++ uint64_t r;
++ const unsigned char *src = in;
++
++ /* Number of bytes left in the buffer from previous updates */
++ r = (ctx->count[1] >> 3) & 0x7f;
++
++ /* Convert the length into a number of bits */
++ bitlen[1] = ((uint64_t)len) << 3;
++ bitlen[0] = ((uint64_t)len) >> 61;
++
++ /* Update number of bits */
++ if ((ctx->count[1] += bitlen[1]) < bitlen[1])
++ ctx->count[0]++;
++ ctx->count[0] += bitlen[0];
++
++ /* Handle the case where we don't need to perform any transforms */
++ if (len < 128 - r) {
++ memcpy(&ctx->buf[r], src, len);
++ return;
++ }
++
++ /* Finish the current block */
++ memcpy(&ctx->buf[r], src, 128 - r);
++ SHA512_Transform(ctx->state, ctx->buf);
++ src += 128 - r;
++ len -= 128 - r;
++
++ /* Perform complete blocks */
++ while (len >= 128) {
++ SHA512_Transform(ctx->state, src);
++ src += 128;
++ len -= 128;
++ }
++
++ /* Copy left over data into buffer */
++ memcpy(ctx->buf, src, len);
+ }
+
++/*
++ * SHA-512 finalization. Pads the input data, exports the hash value,
++ * and clears the context state.
++ */
++void
++SHA512_Final(unsigned char digest[64], SHA512_CTX * ctx)
++{
++
++ /* Add padding */
++ SHA512_Pad(ctx);
+
++ /* Write the hash */
++ be64enc_vect(digest, ctx->state, 64);
++
++ /* Clear the context state */
++ XCRYPT_SECURE_MEMSET(ctx, sizeof (*ctx));
++}
++
++/**
++ * SHA512_Buf(in, len, digest):
++ * Compute the SHA512 hash of ${len} bytes from ${in} and write it to ${digest}.
++ */
+ void
+-sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx)
++SHA512_Buf(const void * in, size_t len, uint8_t digest[64])
+ {
+- /* When we already have some bits in our internal buffer concatenate
+- both inputs first. */
+- if (ctx->buflen != 0)
+- {
+- uint32_t left_over = ctx->buflen;
+- uint32_t add = 256 - left_over > len ? (uint32_t)len : 256 - left_over;
+-
+- memcpy (&ctx->buffer[left_over], buffer, add);
+- ctx->buflen += add;
+-
+- if (ctx->buflen > 128)
+- {
+- sha512_process_block (ctx->buffer, ctx->buflen & ~127u, ctx);
+-
+- ctx->buflen &= 127;
+- /* The regions in the following copy operation cannot overlap. */
+- memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~127u],
+- ctx->buflen);
+- }
+-
+- buffer = (const char *) buffer + add;
+- len -= add;
+- }
+-
+- /* Process available complete blocks. */
+- if (len > 128)
+- {
+- sha512_process_block (buffer, len & ~127u, ctx);
+- buffer = (const char *) buffer + (len & ~127u);
+- len &= 127;
+- }
+-
+- /* Move remaining bytes into internal buffer. */
+- if (len > 0)
+- {
+- size_t left_over = ctx->buflen;
+-
+- memcpy (&ctx->buffer[left_over], buffer, len);
+- left_over += len;
+- if (left_over >= 128)
+- {
+- sha512_process_block (ctx->buffer, 128, ctx);
+- left_over -= 128;
+- memcpy (ctx->buffer, &ctx->buffer[128], left_over);
+- }
+- ctx->buflen = (uint32_t)left_over;
+- }
++ SHA512_CTX ctx;
++
++ SHA512_Init(&ctx);
++ SHA512_Update(&ctx, in, len);
++ SHA512_Final(digest, &ctx);
++
++ /* Clean the stack. */
++ XCRYPT_SECURE_MEMSET(&ctx, sizeof(SHA512_CTX));
+ }
+
+ #endif
+diff --git a/alg-sha512.h b/alg-sha512.h
+index c11329e..c591bb1 100644
+--- a/alg-sha512.h
++++ b/alg-sha512.h
+@@ -1,46 +1,75 @@
+-/* Declaration of functions and data types used for SHA512 sum computing
+- library functions.
+- Copyright (C) 2007-2017 Free Software Foundation, Inc.
+-
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
+-
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
+-
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
+-
+-#ifndef _CRYPT_ALG_SHA512_H
+-#define _CRYPT_ALG_SHA512_H 1
+-
+-/* Structure to save state of computation between the single steps. */
+-struct sha512_ctx
+-{
+- uint64_t H[8];
+-
+- uint64_t total[2];
+- uint32_t buflen;
+- unsigned char buffer[256];
+-};
+-
+-/* Initialize structure containing state of computation.
+- (FIPS 180-2: 5.3.3) */
+-extern void sha512_init_ctx (struct sha512_ctx *ctx);
+-
+-/* Starting with the result of former calls of this function (or the
+- initialization function) update the context for the next LEN bytes
+- starting at BUFFER. LEN does not need to be a multiple of 128. */
+-extern void sha512_process_bytes (const void *buffer, size_t len,
+- struct sha512_ctx *ctx);
+-
+-/* Process the remaining bytes in the buffer and write the finalized
+- hash to RESBUF, which should point to 64 bytes of storage. */
+-extern void *sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf);
+-
+-#endif /* alg-sha512.h */
++/*-
++ * Copyright 2005 Colin Percival
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++
++#ifndef _SHA512_H_
++#define _SHA512_H_
++
++#include <stddef.h>
++#include <stdint.h>
++
++/*
++ * Use #defines in order to avoid namespace collisions with anyone else's
++ * SHA512 code (e.g., the code in OpenSSL).
++ */
++#define SHA512_Init libcperciva_SHA512_Init
++#define SHA512_Update libcperciva_SHA512_Update
++#define SHA512_Final libcperciva_SHA512_Final
++#define SHA512_Buf libcperciva_SHA512_Buf
++#define SHA512_CTX libcperciva_SHA512_CTX
++
++/* Context structure for SHA512 operations. */
++typedef struct {
++ uint64_t state[8];
++ uint64_t count[2];
++ uint8_t buf[128];
++} SHA512_CTX;
++
++/**
++ * SHA512_Init(ctx):
++ * Initialize the SHA512 context ${ctx}.
++ */
++void SHA512_Init(SHA512_CTX *);
++
++/**
++ * SHA512_Update(ctx, in, len):
++ * Input ${len} bytes from ${in} into the SHA512 context ${ctx}.
++ */
++void SHA512_Update(SHA512_CTX *, const void *, size_t);
++
++/**
++ * SHA512_Final(digest, ctx):
++ * Output the SHA512 hash of the data input to the context ${ctx} into the
++ * buffer ${digest}.
++ */
++void SHA512_Final(uint8_t[64], SHA512_CTX *);
++
++/**
++ * SHA512_Buf(in, len, digest):
++ * Compute the SHA512 hash of ${len} bytes from ${in} and write it to ${digest}.
++ */
++void SHA512_Buf(const void *, size_t, uint8_t[64]);
++
++#endif /* !_SHA512_H_ */
+diff --git a/alg-yescrypt-sysendian.h b/alg-yescrypt-sysendian.h
+index e2e41cd..b877e07 100644
+--- a/alg-yescrypt-sysendian.h
++++ b/alg-yescrypt-sysendian.h
+@@ -37,6 +37,7 @@
+ /* Avoid namespace collisions with BSD <sys/endian.h>. */
+ #define be32dec libcperciva_be32dec
+ #define be32enc libcperciva_be32enc
++#define be64dec libcperciva_be64dec
+ #define be64enc libcperciva_be64enc
+ #define le32dec libcperciva_le32dec
+ #define le32enc libcperciva_le32enc
+@@ -61,6 +62,17 @@ be32enc(void * pp, uint32_t x)
+ p[0] = (x >> 24) & 0xff;
+ }
+
++static inline uint64_t
++be64dec(const void *pp)
++{
++ const uint8_t *p = (uint8_t const *)pp;
++
++ return ((uint64_t)(p[7]) + ((uint64_t)(p[6]) << 8) +
++ ((uint64_t)(p[5]) << 16) + ((uint64_t)(p[4]) << 24) +
++ ((uint64_t)(p[3]) << 32) + ((uint64_t)(p[2]) << 40) +
++ ((uint64_t)(p[1]) << 48) + ((uint64_t)(p[0]) << 56));
++}
++
+ static inline void
+ be64enc(void * pp, uint64_t x)
+ {
+diff --git a/crypt-port.h b/crypt-port.h
+index 5f4d55f..a2c64b3 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -260,9 +260,10 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #endif
+
+ #if INCLUDE_sha512
+-#define sha512_finish_ctx _crypt_sha512_finish_ctx
+-#define sha512_init_ctx _crypt_sha512_init_ctx
+-#define sha512_process_bytes _crypt_sha512_process_bytes
++#define libcperciva_SHA512_Init _crypt_SHA512_Init
++#define libcperciva_SHA512_Update _crypt_SHA512_Update
++#define libcperciva_SHA512_Final _crypt_SHA512_Final
++#define libcperciva_SHA512_Buf _crypt_SHA512_Buf
+ #endif
+
+ #if INCLUDE_md5 || INCLUDE_sha256 || INCLUDE_sha512
+diff --git a/crypt-sha512.c b/crypt-sha512.c
+index 39ec0b5..2b6b444 100644
+--- a/crypt-sha512.c
++++ b/crypt-sha512.c
+@@ -58,7 +58,7 @@ static_assert (SHA512_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,
+ /* A sha512_buffer holds all of the sensitive intermediate data. */
+ struct sha512_buffer
+ {
+- struct sha512_ctx ctx;
++ SHA512_CTX ctx;
+ uint8_t result[64];
+ uint8_t p_bytes[64];
+ uint8_t s_bytes[64];
+@@ -77,12 +77,12 @@ static const char b64t[] =
+ indefinitely. */
+ static void
+ sha512_process_recycled_bytes (unsigned char block[64], size_t len,
+- struct sha512_ctx *ctx)
++ SHA512_CTX *ctx)
+ {
+ size_t cnt;
+ for (cnt = len; cnt >= 64; cnt -= 64)
+- sha512_process_bytes (block, 64, ctx);
+- sha512_process_bytes (block, cnt, ctx);
++ SHA512_Update (ctx, block, 64);
++ SHA512_Update (ctx, block, cnt);
+ }
+
+ void
+@@ -100,7 +100,7 @@ crypt_sha512_rn (const char *phrase, size_t phr_size,
+ }
+
+ struct sha512_buffer *buf = scratch;
+- struct sha512_ctx *ctx = &buf->ctx;
++ SHA512_CTX *ctx = &buf->ctx;
+ uint8_t *result = buf->result;
+ uint8_t *p_bytes = buf->p_bytes;
+ uint8_t *s_bytes = buf->s_bytes;
+@@ -158,80 +158,80 @@ crypt_sha512_rn (const char *phrase, size_t phr_size,
+
+ /* Compute alternate SHA512 sum with input PHRASE, SALT, and PHRASE. The
+ final result will be added to the first context. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* Add phrase. */
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Add salt. */
+- sha512_process_bytes (salt, salt_size, ctx);
++ SHA512_Update (ctx, salt, salt_size);
+
+ /* Add phrase again. */
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Now get result of this (64 bytes) and add it to the other
+ context. */
+- sha512_finish_ctx (ctx, result);
++ SHA512_Final (result, ctx);
+
+ /* Prepare for the real work. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* Add the phrase string. */
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* The last part is the salt string. This must be at most 8
+ characters and it ends at the first `$' character (for
+ compatibility with existing implementations). */
+- sha512_process_bytes (salt, salt_size, ctx);
++ SHA512_Update (ctx, salt, salt_size);
+
+ /* Add for any character in the phrase one byte of the alternate sum. */
+ for (cnt = phr_size; cnt > 64; cnt -= 64)
+- sha512_process_bytes (result, 64, ctx);
+- sha512_process_bytes (result, cnt, ctx);
++ SHA512_Update (ctx, result, 64);
++ SHA512_Update (ctx, result, cnt);
+
+ /* Take the binary representation of the length of the phrase and for every
+ 1 add the alternate sum, for every 0 the phrase. */
+ for (cnt = phr_size; cnt > 0; cnt >>= 1)
+ if ((cnt & 1) != 0)
+- sha512_process_bytes (result, 64, ctx);
++ SHA512_Update (ctx, result, 64);
+ else
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Create intermediate result. */
+- sha512_finish_ctx (ctx, result);
++ SHA512_Final (result, ctx);
+
+ /* Start computation of P byte sequence. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* For every character in the password add the entire password. */
+ for (cnt = 0; cnt < phr_size; ++cnt)
+- sha512_process_bytes (phrase, phr_size, ctx);
++ SHA512_Update (ctx, phrase, phr_size);
+
+ /* Finish the digest. */
+- sha512_finish_ctx (ctx, p_bytes);
++ SHA512_Final (p_bytes, ctx);
+
+ /* Start computation of S byte sequence. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* For every character in the password add the entire password. */
+ for (cnt = 0; cnt < (size_t) 16 + (size_t) result[0]; ++cnt)
+- sha512_process_bytes (salt, salt_size, ctx);
++ SHA512_Update (ctx, salt, salt_size);
+
+ /* Finish the digest. */
+- sha512_finish_ctx (ctx, s_bytes);
++ SHA512_Final (s_bytes, ctx);
+
+ /* Repeatedly run the collected hash value through SHA512 to burn
+ CPU cycles. */
+ for (cnt = 0; cnt < rounds; ++cnt)
+ {
+ /* New context. */
+- sha512_init_ctx (ctx);
++ SHA512_Init (ctx);
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+ sha512_process_recycled_bytes (p_bytes, phr_size, ctx);
+ else
+- sha512_process_bytes (result, 64, ctx);
++ SHA512_Update (ctx, result, 64);
+
+ /* Add salt for numbers not divisible by 3. */
+ if (cnt % 3 != 0)
+@@ -243,12 +243,12 @@ crypt_sha512_rn (const char *phrase, size_t phr_size,
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+- sha512_process_bytes (result, 64, ctx);
++ SHA512_Update (ctx, result, 64);
+ else
+ sha512_process_recycled_bytes (p_bytes, phr_size, ctx);
+
+ /* Create intermediate result. */
+- sha512_finish_ctx (ctx, result);
++ SHA512_Final (result, ctx);
+ }
+
+ /* Now we can construct the result string. It consists of four
+diff --git a/test-alg-sha512.c b/test-alg-sha512.c
+index b6d4fc6..5f9af9c 100644
+--- a/test-alg-sha512.c
++++ b/test-alg-sha512.c
+@@ -84,7 +84,7 @@ static const struct
+
+ static void
+ report_failure(int n, const char *tag,
+- const char expected[64], const char actual[64])
++ const char expected[64], const uint8_t actual[64])
+ {
+ int i;
+ printf ("FAIL: test %d (%s):\n exp:", n, tag);
+@@ -112,28 +112,25 @@ report_failure(int n, const char *tag,
+ int
+ main (void)
+ {
+- struct sha512_ctx ctx;
+- char sum[64];
++ SHA512_CTX ctx;
++ uint8_t sum[64];
+ int result = 0;
+ int cnt;
+ int i;
+
+ for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)
+ {
+- sha512_init_ctx (&ctx);
+- sha512_process_bytes (tests[cnt].input, strlen (tests[cnt].input),
+- &ctx);
+- sha512_finish_ctx (&ctx, sum);
++ SHA512_Buf (tests[cnt].input, strlen (tests[cnt].input), sum);
+ if (memcmp (tests[cnt].result, sum, 64) != 0)
+ {
+ report_failure (cnt, "all at once", tests[cnt].result, sum);
+ result = 1;
+ }
+
+- sha512_init_ctx (&ctx);
++ SHA512_Init (&ctx);
+ for (i = 0; tests[cnt].input[i] != '\0'; ++i)
+- sha512_process_bytes (&tests[cnt].input[i], 1, &ctx);
+- sha512_finish_ctx (&ctx, sum);
++ SHA512_Update (&ctx, &tests[cnt].input[i], 1);
++ SHA512_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 64) != 0)
+ {
+ report_failure (cnt, "byte by byte", tests[cnt].result, sum);
+@@ -144,10 +141,10 @@ main (void)
+ /* Test vector from FIPS 180-2: appendix C.3. */
+ char buf[1000];
+ memset (buf, 'a', sizeof (buf));
+- sha512_init_ctx (&ctx);
++ SHA512_Init (&ctx);
+ for (i = 0; i < 1000; ++i)
+- sha512_process_bytes (buf, sizeof (buf), &ctx);
+- sha512_finish_ctx (&ctx, sum);
++ SHA512_Update (&ctx, buf, sizeof (buf));
++ SHA512_Final (sum, &ctx);
+ static const char expected[64] =
+ "\xe7\x18\x48\x3d\x0c\xe7\x69\x64\x4e\x2e\x42\xc7\xbc\x15\xb4\x63"
+ "\x8e\x1f\x98\xb1\x3b\x20\x44\x28\x56\x32\xa8\x03\xaf\xa9\x73\xeb"
+
+From 4964877dbf96d951b3f45b2dba97459404d1dff8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 13:48:34 +0200
+Subject: [PATCH 10/17] Use md5 implementation from Alexander Peslyak.
+
+Thus we now have a md5 implementation in the public domain.
+---
+ LICENSING | 5 +-
+ NEWS | 2 +
+ TODO.md | 2 -
+ alg-md5.c | 539 ++++++++++++++++++++++++-------------------------
+ alg-md5.h | 79 ++++----
+ crypt-md5.c | 47 +++--
+ crypt-port.h | 6 +-
+ crypt-sunmd5.c | 20 +-
+ test-alg-md5.c | 24 +--
+ 9 files changed, 349 insertions(+), 375 deletions(-)
+
+diff --git a/LICENSING b/LICENSING
+index 31f704c..0ed22f5 100644
+--- a/LICENSING
++++ b/LICENSING
+@@ -13,7 +13,7 @@ source tree. For specific licensing terms consult the files themselves.
+
+ * Copyright Free Software Foundation, Inc.; LGPL (v2.1 or later):
+ crypt.h, crypt-obsolete.h, crypt-private.h
+- alg-md5.h, alg-md5.c, crypt-md5.c,
++ crypt-md5.c,
+ test-crypt-badsalt.c, test-crypt-nonnull.c
+
+ * Copyright David Burren et al.; 3-clause BSD:
+@@ -24,7 +24,8 @@ source tree. For specific licensing terms consult the files themselves.
+ crypt-sha256.c, crypt-sha512.c
+
+ * Public domain, written by Solar Designer et al.:
+- alg-md4.h, alg-md4.c, crypt-bcrypt.c, crypt-gensalt.c, test-crypt-bcrypt.c
++ alg-md4.h, alg-md4.c, alg-md5.h, alg-md5.c,
++ crypt-bcrypt.c, crypt-gensalt.c, test-crypt-bcrypt.c
+
+ * Copyright Solar Designer, Colin Percival; 0-clause BSD:
+ alg-yescrypt-common.c, alg-yescrypt-platform.c
+diff --git a/NEWS b/NEWS
+index c4b04da..e48b0d1 100644
+--- a/NEWS
++++ b/NEWS
+@@ -8,6 +8,8 @@ Version 4.2.3
+ tarball release, use './bootstrap' to create the configure script.
+ * Use sha512 implementation from Colin Percival. Thus we now have a
+ sha512 implementation under the BSD license.
++* Use md5 implementation from Alexander Peslyak. Thus we now have a
++ md5 implementation in the public domain.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+diff --git a/TODO.md b/TODO.md
+index c4e2799..7df4ca5 100644
+--- a/TODO.md
++++ b/TODO.md
+@@ -95,8 +95,6 @@ It was last updated 20 October 2018.
+ at it, and no destructor function
+
+ * Permissive relicensing, to encourage use beyond the GNU ecosystem?
+- * Replace remaining (L)GPLed crypto primitives (MD5) with
+- permissively licensed equivalents (e.g. from Openwall)
+ * Replace crypt-md5.c with original md5crypt from FreeBSD?
+ * Other files subject to the (L)GPL are crypt.c, crypt-static.c,
+ crypt-gensalt-static.c, crypt-obsolete.h, crypt-port.h,
+diff --git a/alg-md5.c b/alg-md5.c
+index 9d9e4e3..8382b98 100644
+--- a/alg-md5.c
++++ b/alg-md5.c
+@@ -1,308 +1,291 @@
+-/* Functions to compute MD5 message digest of files or memory blocks.
+- according to the definition of MD5 in RFC 1321 from April 1992.
+-
+- Copyright (C) 1995-2017 Free Software Foundation, Inc.
+-
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
+-
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
+-
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
+-
+-/* Written by Ulrich Drepper <drepper(a)gnu.ai.mit.edu>, 1995. */
++/*
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD5 Message-Digest Algorithm (RFC 1321).
++ *
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
++ *
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
++ *
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * (This is a heavily cut-down "BSD license".)
++ *
++ * This differs from Colin Plumb's older public domain implementation in that
++ * no exactly 32-bit integer data type is required (any 32-bit or wider
++ * unsigned integer data type will do), there's no compile-time endianness
++ * configuration, and the function prototypes match OpenSSL's. No code from
++ * Colin Plumb's implementation has been reused; this comment merely compares
++ * the properties of the two independent implementations.
++ *
++ * The primary goals of this implementation are portability and ease of use.
++ * It is meant to be fast, but not as fast as possible. Some known
++ * optimizations are not included to reduce source code size and avoid
++ * compile-time configuration.
++ */
+
+ #include "crypt-port.h"
+-#include "alg-md5.h"
+-#include "byteorder.h"
+
+ #if INCLUDE_md5 || INCLUDE_sunmd5
+
+-static void md5_process_block (const void *buffer, size_t len,
+- struct md5_ctx *ctx);
++#include "alg-md5.h"
+
+-/* Initialize structure containing state of computation.
+- (RFC 1321, 3.3: Step 3) */
+-void
+-md5_init_ctx (struct md5_ctx *ctx)
+-{
+- ctx->A = 0x67452301;
+- ctx->B = 0xefcdab89;
+- ctx->C = 0x98badcfe;
+- ctx->D = 0x10325476;
++/*
++ * The basic MD5 functions.
++ *
++ * F and G are optimized compared to their RFC 1321 definitions for
++ * architectures that lack an AND-NOT instruction, just like in Colin Plumb's
++ * implementation.
++ */
++#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
++#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
++#define H(x, y, z) (((x) ^ (y)) ^ (z))
++#define H2(x, y, z) ((x) ^ ((y) ^ (z)))
++#define I(x, y, z) ((y) ^ ((x) | ~(z)))
++
++/*
++ * The MD5 transformation for all four rounds.
++ */
++#define STEP(f, a, b, c, d, x, t, s) \
++ (a) += f((b), (c), (d)) + (x) + (t); \
++ (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
++ (a) += (b);
++
++/*
++ * SET reads 4 input bytes in little-endian byte order and stores them in a
++ * properly aligned word in host byte order.
++ *
++ * The check for little-endian architectures that tolerate unaligned memory
++ * accesses is just an optimization. Nothing will break if it fails to detect
++ * a suitable architecture.
++ *
++ * Unfortunately, this optimization may be a C strict aliasing rules violation
++ * if the caller's data buffer has effective type that cannot be aliased by
++ * MD5_u32plus. In practice, this problem may occur if these MD5 routines are
++ * inlined into a calling function, or with future and dangerously advanced
++ * link-time optimizations. For the time being, keeping these MD5 routines in
++ * their own translation unit avoids the problem.
++ */
++#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#define SET(n) \
++ (*(const MD5_u32plus *)&ptr[(n) * 4])
++#define GET(n) \
++ SET(n)
++#else
++#define SET(n) \
++ (ctx->block[(n)] = \
++ (MD5_u32plus)ptr[(n) * 4] | \
++ ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \
++ ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \
++ ((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
++#define GET(n) \
++ (ctx->block[(n)])
++#endif
+
+- ctx->total = 0;
+- ctx->buflen = 0;
++/*
++ * This processes one or more 64-byte data blocks, but does NOT update the bit
++ * counters. There are no alignment requirements.
++ */
++static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
++{
++ const unsigned char *ptr;
++ MD5_u32plus a, b, c, d;
++ MD5_u32plus saved_a, saved_b, saved_c, saved_d;
++
++ ptr = (const unsigned char *)data;
++
++ a = ctx->a;
++ b = ctx->b;
++ c = ctx->c;
++ d = ctx->d;
++
++ do {
++ saved_a = a;
++ saved_b = b;
++ saved_c = c;
++ saved_d = d;
++
++/* Round 1 */
++ STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
++ STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
++ STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
++ STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
++ STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
++ STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
++ STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
++ STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
++ STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
++ STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
++ STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
++ STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
++ STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
++ STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
++ STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
++ STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
++
++/* Round 2 */
++ STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
++ STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
++ STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
++ STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
++ STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
++ STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
++ STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
++ STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
++ STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
++ STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
++ STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
++ STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
++ STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
++ STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
++ STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
++ STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
++
++/* Round 3 */
++ STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
++ STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)
++ STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
++ STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)
++ STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
++ STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)
++ STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
++ STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)
++ STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
++ STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)
++ STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
++ STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)
++ STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
++ STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)
++ STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
++ STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)
++
++/* Round 4 */
++ STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
++ STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
++ STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
++ STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
++ STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
++ STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
++ STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
++ STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
++ STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
++ STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
++ STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
++ STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
++ STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
++ STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
++ STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
++ STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
++
++ a += saved_a;
++ b += saved_b;
++ c += saved_c;
++ d += saved_d;
++
++ ptr += 64;
++ } while (size -= 64);
++
++ ctx->a = a;
++ ctx->b = b;
++ ctx->c = c;
++ ctx->d = d;
++
++ return ptr;
+ }
+
+-/* Put result from CTX in first 16 bytes following RESBUF. The result
+- will be in little endian byte order. */
+-static void *
+-md5_read_ctx (struct md5_ctx *ctx, void *resbuf)
++void MD5_Init(MD5_CTX *ctx)
+ {
+- unsigned char *buf = resbuf;
+- cpu_to_le32 (buf + 0, ctx->A);
+- cpu_to_le32 (buf + 4, ctx->B);
+- cpu_to_le32 (buf + 8, ctx->C);
+- cpu_to_le32 (buf + 12, ctx->D);
+- XCRYPT_SECURE_MEMSET (ctx, sizeof(*ctx));
+- return resbuf;
+-}
++ ctx->a = 0x67452301;
++ ctx->b = 0xefcdab89;
++ ctx->c = 0x98badcfe;
++ ctx->d = 0x10325476;
+
+-/* Process the remaining bytes in the internal buffer and the usual
+- prolog according to the standard and write the result to RESBUF. */
++ ctx->lo = 0;
++ ctx->hi = 0;
++}
+
+-void *
+-md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
++void MD5_Update(MD5_CTX *ctx, const void *data, size_t size)
+ {
+- /* Take yet unprocessed bytes into account. */
+- uint32_t bytes = ctx->buflen;
+- size_t pad;
++ MD5_u32plus saved_lo;
++ unsigned long used, available;
++
++ saved_lo = ctx->lo;
++ if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
++ ctx->hi++;
++ ctx->hi += (MD5_u32plus) size >> 29;
+
+- /* Now count remaining bytes. */
+- ctx->total += bytes;
++ used = saved_lo & 0x3f;
+
+- pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
++ if (used) {
++ available = 64 - used;
+
+- /* The first byte of padding should be 0x80 and the rest should be
+- zero. (RFC 1321, 3.1: Step 1) */
+- ctx->buffer[bytes] = 0x80u;
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[bytes+1], pad-1);
++ if (size < available) {
++ memcpy(&ctx->buffer[used], data, size);
++ return;
++ }
+
+- /* Put the 64-bit file length in little-endian *bits* at the end of
+- the buffer. */
+- cpu_to_le64 (&ctx->buffer[bytes + pad], ctx->total << 3);
++ memcpy(&ctx->buffer[used], data, available);
++ data = (const unsigned char *)data + available;
++ size -= available;
++ body(ctx, ctx->buffer, 64);
++ }
+
+- /* Process last bytes. */
+- md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
++ if (size >= 64) {
++ data = body(ctx, data, size & ~(unsigned long)0x3f);
++ size &= 0x3f;
++ }
+
+- return md5_read_ctx (ctx, resbuf);
++ memcpy(ctx->buffer, data, size);
+ }
+
++#define OUT(dst, src) \
++ (dst)[0] = (unsigned char)(src); \
++ (dst)[1] = (unsigned char)((src) >> 8); \
++ (dst)[2] = (unsigned char)((src) >> 16); \
++ (dst)[3] = (unsigned char)((src) >> 24);
+
+-void
+-md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
++void MD5_Final(uint8_t result[16], MD5_CTX *ctx)
+ {
+- /* When we already have some bits in our internal buffer concatenate
+- both inputs first. */
+- if (ctx->buflen != 0)
+- {
+- uint32_t left_over = ctx->buflen;
+- uint32_t add = 128 - left_over > len ? (uint32_t)len : 128 - left_over;
+-
+- memcpy (&ctx->buffer[left_over], buffer, add);
+- ctx->buflen += add;
+-
+- if (ctx->buflen > 64)
+- {
+- md5_process_block (ctx->buffer, ctx->buflen & ~63u, ctx);
+-
+- ctx->buflen &= 63;
+- /* The regions in the following copy operation cannot overlap. */
+- memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63u],
+- ctx->buflen);
+- }
+-
+- buffer = (const char *) buffer + add;
+- len -= add;
+- }
+-
+- /* Process available complete blocks. */
+- if (len > 64)
+- {
+- md5_process_block (buffer, len & ~63u, ctx);
+- buffer = (const char *) buffer + (len & ~63u);
+- len &= 63;
+- }
+-
+- /* Move remaining bytes in internal buffer. */
+- if (len > 0)
+- {
+- uint32_t left_over = ctx->buflen;
+-
+- memcpy (&ctx->buffer[left_over], buffer, len);
+- left_over += (uint32_t)len;
+- if (left_over >= 64)
+- {
+- md5_process_block (ctx->buffer, 64, ctx);
+- left_over -= 64;
+- memcpy (ctx->buffer, &ctx->buffer[64], left_over);
+- }
+- ctx->buflen = left_over;
+- }
+-}
++ unsigned long used, available;
+
++ used = ctx->lo & 0x3f;
+
+-/* These are the four functions used in the four steps of the MD5 algorithm
+- and defined in the RFC 1321. The first function is a little bit optimized
+- (as found in Colin Plumbs public domain implementation). */
+-/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+-#define FF(b, c, d) (d ^ (b & (c ^ d)))
+-#define FG(b, c, d) FF (d, b, c)
+-#define FH(b, c, d) (b ^ c ^ d)
+-#define FI(b, c, d) (c ^ (b | ~d))
++ ctx->buffer[used++] = 0x80;
+
+-/* Process LEN bytes of BUFFER, accumulating context into CTX.
+- It is assumed that LEN % 64 == 0. */
++ available = 64 - used;
+
+-static void
+-md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
+-{
+- const unsigned char *p = buffer;
+- const unsigned char *endp = p + len;
+- uint32_t A = ctx->A;
+- uint32_t B = ctx->B;
+- uint32_t C = ctx->C;
+- uint32_t D = ctx->D;
+-
+- /* First increment the byte count. RFC 1321 specifies the possible
+- length of the file up to 2^64 bits. Here we only compute the
+- number of bytes. */
+- ctx->total += len;
+-
+- /* Process all bytes in the buffer with 64 bytes in each round of
+- the loop. */
+- while (p < endp)
+- {
+- uint32_t *cwp = ctx->correct_words;
+- uint32_t A_save = A;
+- uint32_t B_save = B;
+- uint32_t C_save = C;
+- uint32_t D_save = D;
+-
+- /* First round: using the given function, the context and a constant
+- the next context is computed. Because the algorithms processing
+- unit is a 32-bit word and it is determined to work on words in
+- little endian byte order we perhaps have to change the byte order
+- before the computation. To reduce the work for the next steps
+- we store the swapped words in the array CORRECT_WORDS. */
+-
+-#define OP(a, b, c, d, s, T) \
+- do \
+- { \
+- uint32_t word = le32_to_cpu (p); \
+- p += 4; \
+- *cwp++ = word; \
+- a += FF (b, c, d) + word + T; \
+- CYCLIC (a, s); \
+- a += b; \
+- } \
+- while (0)
+-
+- /* It is unfortunate that C does not provide an operator for
+- cyclic rotation. Hope the C compiler is smart enough. */
+-#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
+-
+- /* Before we start, one word to the strange constants.
+- They are defined in RFC 1321 as
+-
+- T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+- */
+-
+- /* Round 1. */
+- OP (A, B, C, D, 7, 0xd76aa478);
+- OP (D, A, B, C, 12, 0xe8c7b756);
+- OP (C, D, A, B, 17, 0x242070db);
+- OP (B, C, D, A, 22, 0xc1bdceee);
+- OP (A, B, C, D, 7, 0xf57c0faf);
+- OP (D, A, B, C, 12, 0x4787c62a);
+- OP (C, D, A, B, 17, 0xa8304613);
+- OP (B, C, D, A, 22, 0xfd469501);
+- OP (A, B, C, D, 7, 0x698098d8);
+- OP (D, A, B, C, 12, 0x8b44f7af);
+- OP (C, D, A, B, 17, 0xffff5bb1);
+- OP (B, C, D, A, 22, 0x895cd7be);
+- OP (A, B, C, D, 7, 0x6b901122);
+- OP (D, A, B, C, 12, 0xfd987193);
+- OP (C, D, A, B, 17, 0xa679438e);
+- OP (B, C, D, A, 22, 0x49b40821);
+-
+- /* For the second to fourth round we have the possibly swapped words
+- in CORRECT_WORDS. Redefine the macro to take an additional first
+- argument specifying the function to use. */
+-#undef OP
+-#define OP(f, a, b, c, d, k, s, T) \
+- do \
+- { \
+- a += f (b, c, d) + ctx->correct_words[k] + T; \
+- CYCLIC (a, s); \
+- a += b; \
+- } \
+- while (0)
+-
+- /* Round 2. */
+- OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+- OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+- OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+- OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+- OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+- OP (FG, D, A, B, C, 10, 9, 0x02441453);
+- OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+- OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+- OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+- OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+- OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+- OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+- OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+- OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+- OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+- OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+-
+- /* Round 3. */
+- OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+- OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+- OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+- OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+- OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+- OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+- OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+- OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+- OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+- OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+- OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+- OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+- OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+- OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+- OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+- OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+-
+- /* Round 4. */
+- OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+- OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+- OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+- OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+- OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+- OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+- OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+- OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+- OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+- OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+- OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+- OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+- OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+- OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+- OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+- OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+-
+- /* Add the starting values of the context. */
+- A += A_save;
+- B += B_save;
+- C += C_save;
+- D += D_save;
+- }
+-
+- /* Put checksum in context given as argument. */
+- ctx->A = A;
+- ctx->B = B;
+- ctx->C = C;
+- ctx->D = D;
++ if (available < 8) {
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available);
++ body(ctx, ctx->buffer, 64);
++ used = 0;
++ available = 64;
++ }
++
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available - 8);
++
++ ctx->lo <<= 3;
++ OUT(&ctx->buffer[56], ctx->lo)
++ OUT(&ctx->buffer[60], ctx->hi)
++
++ body(ctx, ctx->buffer, 64);
++
++ OUT(&result[0], ctx->a)
++ OUT(&result[4], ctx->b)
++ OUT(&result[8], ctx->c)
++ OUT(&result[12], ctx->d)
++
++ XCRYPT_SECURE_MEMSET(ctx, sizeof(*ctx));
+ }
+
+ #endif
+diff --git a/alg-md5.h b/alg-md5.h
+index a56aba9..1947eb3 100644
+--- a/alg-md5.h
++++ b/alg-md5.h
+@@ -1,52 +1,43 @@
+-/* Declaration of functions and data types used for MD5 sum computing
+- library functions.
+-
+- Copyright (C) 1995-2017 Free Software Foundation, Inc.
+-
+- This library is free software; you can redistribute it and/or
+- modify it under the terms of the GNU Lesser General Public License
+- as published by the Free Software Foundation; either version 2.1 of
+- the License, or (at your option) any later version.
+-
+- This library is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Lesser General Public License for more details.
+-
+- You should have received a copy of the GNU Lesser General Public
+- License along with this library; if not, see
+- <https://www.gnu.org/licenses/>. */
++/*
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD5 Message-Digest Algorithm (RFC 1321).
++ *
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
++ *
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
++ *
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * See md5.c for more information.
++ */
+
+ #ifndef _CRYPT_ALG_MD5_H
+ #define _CRYPT_ALG_MD5_H 1
+
+-/* Structure to save state of computation between the single steps. */
+-struct md5_ctx
+-{
+- uint32_t A;
+- uint32_t B;
+- uint32_t C;
+- uint32_t D;
+-
+- uint64_t total;
+- uint32_t buflen;
+- uint32_t correct_words[16];
+- unsigned char buffer[128];
+-};
+-
+-/* Initialize structure containing state of computation.
+- (RFC 1321, 3.3: Step 3) */
+-extern void md5_init_ctx (struct md5_ctx *ctx);
++/* Any 32-bit or wider unsigned integer data type will do */
++typedef uint32_t MD5_u32plus;
+
+-/* Starting with the result of former calls of this function (or the
+- initialization function) update the context for the next LEN bytes
+- starting at BUFFER. LEN does not need to be a multiple of 64. */
+-extern void md5_process_bytes (const void *buffer, size_t len,
+- struct md5_ctx *ctx);
++typedef struct {
++ MD5_u32plus lo, hi;
++ MD5_u32plus a, b, c, d;
++ uint8_t buffer[64];
++ MD5_u32plus block[16];
++} MD5_CTX;
+
+-/* Process the remaining bytes in the buffer and write the finalized
+- hash to RESBUF, which should point to 16 bytes of storage. All
+- data written to CTX is erased before returning from the function. */
+-extern void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf);
++extern void MD5_Init(MD5_CTX *ctx);
++extern void MD5_Update(MD5_CTX *ctx, const void *data, size_t size);
++extern void MD5_Final(uint8_t result[16], MD5_CTX *ctx);
+
+ #endif /* alg-md5.h */
+diff --git a/crypt-md5.c b/crypt-md5.c
+index f64b6fc..108c31c 100644
+--- a/crypt-md5.c
++++ b/crypt-md5.c
+@@ -50,7 +50,7 @@ static_assert (MD5_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,
+ /* An md5_buffer holds all of the sensitive intermediate data. */
+ struct md5_buffer
+ {
+- struct md5_ctx ctx;
++ MD5_CTX ctx;
+ uint8_t result[16];
+ };
+
+@@ -74,7 +74,7 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+ }
+
+ struct md5_buffer *buf = scratch;
+- struct md5_ctx *ctx = &buf->ctx;
++ MD5_CTX *ctx = &buf->ctx;
+ uint8_t *result = buf->result;
+ char *cp = (char *)output;
+ const char *salt = setting;
+@@ -99,40 +99,40 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+
+ /* Compute alternate MD5 sum with input PHRASE, SALT, and PHRASE. The
+ final result will be added to the first context. */
+- md5_init_ctx (ctx);
++ MD5_Init (ctx);
+
+ /* Add phrase. */
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Add salt. */
+- md5_process_bytes (salt, salt_size, ctx);
++ MD5_Update (ctx, salt, salt_size);
+
+ /* Add phrase again. */
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Now get result of this (16 bytes). */
+- md5_finish_ctx (ctx, result);
++ MD5_Final (result, ctx);
+
+ /* Prepare for the real work. */
+- md5_init_ctx (ctx);
++ MD5_Init (ctx);
+
+ /* Add the phrase string. */
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Because the SALT argument need not always have the salt prefix we
+ add it separately. */
+- md5_process_bytes (md5_salt_prefix, sizeof (md5_salt_prefix) - 1, ctx);
++ MD5_Update (ctx, md5_salt_prefix, sizeof (md5_salt_prefix) - 1);
+
+ /* The last part is the salt string. This must be at most 8
+ characters and it ends at the first `$' character (for
+ compatibility with existing implementations). */
+- md5_process_bytes (salt, salt_size, ctx);
++ MD5_Update (ctx, salt, salt_size);
+
+
+ /* Add for any character in the phrase one byte of the alternate sum. */
+ for (cnt = phr_size; cnt > 16; cnt -= 16)
+- md5_process_bytes (result, 16, ctx);
+- md5_process_bytes (result, cnt, ctx);
++ MD5_Update (ctx, result, 16);
++ MD5_Update (ctx, result, cnt);
+
+ /* For the following code we need a NUL byte. */
+ *result = '\0';
+@@ -142,11 +142,10 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+ bit the first character of the phrase. This does not seem to be
+ what was intended but we have to follow this to be compatible. */
+ for (cnt = phr_size; cnt > 0; cnt >>= 1)
+- md5_process_bytes ((cnt & 1) != 0 ? (const char *) result : phrase, 1,
+- ctx);
++ MD5_Update (ctx, (cnt & 1) != 0 ? (const char *) result : phrase, 1);
+
+ /* Create intermediate result. */
+- md5_finish_ctx (ctx, result);
++ MD5_Final (result, ctx);
+
+ /* Now comes another weirdness. In fear of password crackers here
+ comes a quite long loop which just processes the output of the
+@@ -154,30 +153,30 @@ crypt_md5_rn (const char *phrase, size_t phr_size,
+ for (cnt = 0; cnt < 1000; ++cnt)
+ {
+ /* New context. */
+- md5_init_ctx (ctx);
++ MD5_Init (ctx);
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+ else
+- md5_process_bytes (result, 16, ctx);
++ MD5_Update (ctx, result, 16);
+
+ /* Add salt for numbers not divisible by 3. */
+ if (cnt % 3 != 0)
+- md5_process_bytes (salt, salt_size, ctx);
++ MD5_Update (ctx, salt, salt_size);
+
+ /* Add phrase for numbers not divisible by 7. */
+ if (cnt % 7 != 0)
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Add phrase or last result. */
+ if ((cnt & 1) != 0)
+- md5_process_bytes (result, 16, ctx);
++ MD5_Update (ctx, result, 16);
+ else
+- md5_process_bytes (phrase, phr_size, ctx);
++ MD5_Update (ctx, phrase, phr_size);
+
+ /* Create intermediate result. */
+- md5_finish_ctx (ctx, result);
++ MD5_Final (result, ctx);
+ }
+
+ /* Now we can construct the result string. It consists of three
+diff --git a/crypt-port.h b/crypt-port.h
+index a2c64b3..2571c94 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -247,9 +247,9 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #endif
+
+ #if INCLUDE_md5 || INCLUDE_sunmd5
+-#define md5_finish_ctx _crypt_md5_finish_ctx
+-#define md5_init_ctx _crypt_md5_init_ctx
+-#define md5_process_bytes _crypt_md5_process_bytes
++#define MD5_Init _crypt_MD5_Init
++#define MD5_Update _crypt_MD5_Update
++#define MD5_Final _crypt_MD5_Final
+ #endif
+
+ #if INCLUDE_sha1
+diff --git a/crypt-sunmd5.c b/crypt-sunmd5.c
+index 9f76ed1..7a30aae 100644
+--- a/crypt-sunmd5.c
++++ b/crypt-sunmd5.c
+@@ -165,7 +165,7 @@ crypt_sunmd5_rn (const char *phrase, size_t phr_size,
+ {
+ struct crypt_sunmd5_scratch
+ {
+- struct md5_ctx ctx;
++ MD5_CTX ctx;
+ uint8_t dg[16];
+ char rn[16];
+ };
+@@ -238,27 +238,27 @@ crypt_sunmd5_rn (const char *phrase, size_t phr_size,
+ struct crypt_sunmd5_scratch *s = scratch;
+
+ /* Initial round. */
+- md5_init_ctx (&s->ctx);
+- md5_process_bytes (phrase, phr_size, &s->ctx);
+- md5_process_bytes (setting, saltlen, &s->ctx);
+- md5_finish_ctx (&s->ctx, s->dg);
++ MD5_Init (&s->ctx);
++ MD5_Update (&s->ctx, phrase, phr_size);
++ MD5_Update (&s->ctx, setting, saltlen);
++ MD5_Final (s->dg, &s->ctx);
+
+ /* Stretching rounds. */
+ for (unsigned int i = 0; i < nrounds; i++)
+ {
+- md5_init_ctx (&s->ctx);
++ MD5_Init (&s->ctx);
+
+- md5_process_bytes (s->dg, sizeof s->dg, &s->ctx);
++ MD5_Update (&s->ctx, s->dg, sizeof s->dg);
+
+ /* The trailing nul is intentionally included. */
+ if (muffet_coin_toss (s->dg, i))
+- md5_process_bytes (hamlet_quotation, sizeof hamlet_quotation, &s->ctx);
++ MD5_Update (&s->ctx, hamlet_quotation, sizeof hamlet_quotation);
+
+ int nwritten = snprintf (s->rn, sizeof s->rn, "%u", i);
+ assert (nwritten >= 1 && (unsigned int)nwritten + 1 <= sizeof s->rn);
+- md5_process_bytes (s->rn, (unsigned int)nwritten, &s->ctx);
++ MD5_Update (&s->ctx, s->rn, (unsigned int)nwritten);
+
+- md5_finish_ctx (&s->ctx, s->dg);
++ MD5_Final (s->dg, &s->ctx);
+ }
+
+ memcpy (output, setting, saltlen);
+diff --git a/test-alg-md5.c b/test-alg-md5.c
+index dabc6ba..21c4309 100644
+--- a/test-alg-md5.c
++++ b/test-alg-md5.c
+@@ -52,7 +52,7 @@ static const struct
+
+ static void
+ report_failure(int n, const char *tag,
+- const char expected[16], const char actual[16])
++ const char expected[16], uint8_t actual[16])
+ {
+ int i;
+ printf ("FAIL: test %d (%s):\n exp:", n, tag);
+@@ -76,27 +76,27 @@ report_failure(int n, const char *tag,
+ int
+ main (void)
+ {
+- struct md5_ctx ctx;
+- char sum[16];
++ MD5_CTX ctx;
++ uint8_t sum[16];
+ int result = 0;
+ int cnt;
+ int i;
+
+ for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)
+ {
+- md5_init_ctx (&ctx);
+- md5_process_bytes (tests[cnt].input, strlen (tests[cnt].input), &ctx);
+- md5_finish_ctx (&ctx, sum);
++ MD5_Init (&ctx);
++ MD5_Update (&ctx, tests[cnt].input, strlen (tests[cnt].input));
++ MD5_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "all at once", tests[cnt].result, sum);
+ result = 1;
+ }
+
+- md5_init_ctx (&ctx);
++ MD5_Init (&ctx);
+ for (i = 0; tests[cnt].input[i] != '\0'; ++i)
+- md5_process_bytes (&tests[cnt].input[i], 1, &ctx);
+- md5_finish_ctx (&ctx, sum);
++ MD5_Update (&ctx, &tests[cnt].input[i], 1);
++ MD5_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "byte by byte", tests[cnt].result, sum);
+@@ -108,10 +108,10 @@ main (void)
+ <https://www.nist.gov/itl/ssd/software-quality-group/nsrl-test-data>. */
+ char buf[1000];
+ memset (buf, 'a', sizeof (buf));
+- md5_init_ctx (&ctx);
++ MD5_Init (&ctx);
+ for (i = 0; i < 1000; ++i)
+- md5_process_bytes (buf, sizeof (buf), &ctx);
+- md5_finish_ctx (&ctx, sum);
++ MD5_Update (&ctx, buf, sizeof (buf));
++ MD5_Final (sum, &ctx);
+ static const char expected[64] =
+ "\x77\x07\xd6\xae\x4e\x02\x7c\x70\xee\xa2\xa9\x35\xc2\x29\x6f\x21";
+ if (memcmp (expected, sum, 16) != 0)
+
+From 6fcd7eb3324b67b22b39626cf587013437707efc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 14:16:22 +0200
+Subject: [PATCH 11/17] Use unmodified md4 implementation from Alexander
+ Peslyak.
+
+---
+ alg-md4.c | 428 +++++++++++++++++++++++++------------------------
+ alg-md4.h | 61 +++----
+ crypt-nthash.c | 24 +--
+ crypt-port.h | 6 +-
+ test-alg-md4.c | 18 +--
+ 5 files changed, 278 insertions(+), 259 deletions(-)
+
+diff --git a/alg-md4.c b/alg-md4.c
+index c1c4075..482b6f4 100644
+--- a/alg-md4.c
++++ b/alg-md4.c
+@@ -1,256 +1,270 @@
+ /*
+- * MD4 (RFC-1320) message digest.
+- * Modified from MD5 code by Andrey Panin <pazke(a)donpac.ru>
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD4 Message-Digest Algorithm (RFC 1320).
+ *
+- * Written by Solar Designer <solar(a)openwall.com> in 2001, and placed in
+- * the public domain. There's absolutely no warranty.
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
+ *
+- * This differs from Colin Plumb's older public domain implementation in
+- * that no 32-bit integer data type is required, there's no compile-time
+- * endianness configuration.
+- * The primary goals are portability and ease of use.
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
+ *
+- * This implementation is meant to be fast, but not as fast as possible.
+- * Some known optimizations are not included to reduce source code size
+- * and avoid compile-time configuration.
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * (This is a heavily cut-down "BSD license".)
++ *
++ * This differs from Colin Plumb's older public domain implementation in that
++ * no exactly 32-bit integer data type is required (any 32-bit or wider
++ * unsigned integer data type will do), there's no compile-time endianness
++ * configuration, and the function prototypes match OpenSSL's. No code from
++ * Colin Plumb's implementation has been reused; this comment merely compares
++ * the properties of the two independent implementations.
++ *
++ * The primary goals of this implementation are portability and ease of use.
++ * It is meant to be fast, but not as fast as possible. Some known
++ * optimizations are not included to reduce source code size and avoid
++ * compile-time configuration.
+ */
+
+ #include "crypt-port.h"
+-#include "alg-md4.h"
+-#include "byteorder.h"
+
+ #if INCLUDE_nthash
+
++#include "alg-md4.h"
++
+ /*
+ * The basic MD4 functions.
++ *
++ * F and G are optimized compared to their RFC 1320 definitions, with the
++ * optimization for F borrowed from Colin Plumb's MD5 implementation.
+ */
+-#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
+-#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
+-#define H(x, y, z) ((x) ^ (y) ^ (z))
++#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
++#define G(x, y, z) (((x) & ((y) | (z))) | ((y) & (z)))
++#define H(x, y, z) ((x) ^ (y) ^ (z))
+
+ /*
+- * The MD4 transformation for all four rounds.
++ * The MD4 transformation for all three rounds.
+ */
+ #define STEP(f, a, b, c, d, x, s) \
+- (a) += f((b), (c), (d)) + (x); \
+- (a) = ((a) << (s)) | ((a) >> (32 - (s)))
++ (a) += f((b), (c), (d)) + (x); \
++ (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s))));
+
+ /*
+- * SET reads 4 input bytes in little-endian byte order and stores them
+- * in a properly aligned word in host byte order.
++ * SET reads 4 input bytes in little-endian byte order and stores them in a
++ * properly aligned word in host byte order.
+ *
+- * The check for little-endian architectures which tolerate unaligned
+- * memory accesses is just an optimization. Nothing will break if it
+- * doesn't work.
++ * The check for little-endian architectures that tolerate unaligned memory
++ * accesses is just an optimization. Nothing will break if it fails to detect
++ * a suitable architecture.
++ *
++ * Unfortunately, this optimization may be a C strict aliasing rules violation
++ * if the caller's data buffer has effective type that cannot be aliased by
++ * MD4_u32plus. In practice, this problem may occur if these MD4 routines are
++ * inlined into a calling function, or with future and dangerously advanced
++ * link-time optimizations. For the time being, keeping these MD4 routines in
++ * their own translation unit avoids the problem.
+ */
++#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#define SET(n) \
++ (*(const MD4_u32plus *)&ptr[(n) * 4])
++#define GET(n) \
++ SET(n)
++#else
+ #define SET(n) \
+- (ctx->block[(n)] = le32_to_cpu (&ptr[(n) * 4]))
++ (ctx->block[(n)] = \
++ (MD4_u32plus)ptr[(n) * 4] | \
++ ((MD4_u32plus)ptr[(n) * 4 + 1] << 8) | \
++ ((MD4_u32plus)ptr[(n) * 4 + 2] << 16) | \
++ ((MD4_u32plus)ptr[(n) * 4 + 3] << 24))
+ #define GET(n) \
+- (ctx->block[(n)])
++ (ctx->block[(n)])
++#endif
+
+ /*
+- * This processes one or more 64-byte data blocks, but does NOT update
+- * the bit counters. There're no alignment requirements.
++ * This processes one or more 64-byte data blocks, but does NOT update the bit
++ * counters. There are no alignment requirements.
+ */
+-static const unsigned char *
+-body (struct md4_ctx *ctx, const unsigned char *data, size_t size)
++static const void *body(MD4_CTX *ctx, const void *data, unsigned long size)
+ {
+- const unsigned char *ptr;
+- uint32_t a, b, c, d;
+- uint32_t saved_a, saved_b, saved_c, saved_d;
+-
+- ptr = data;
+-
+- a = ctx->a;
+- b = ctx->b;
+- c = ctx->c;
+- d = ctx->d;
+-
+- do
+- {
+- saved_a = a;
+- saved_b = b;
+- saved_c = c;
+- saved_d = d;
+-
+- /* Round 1 */
+- STEP(F, a, b, c, d, SET( 0), 3);
+- STEP(F, d, a, b, c, SET( 1), 7);
+- STEP(F, c, d, a, b, SET( 2), 11);
+- STEP(F, b, c, d, a, SET( 3), 19);
+-
+- STEP(F, a, b, c, d, SET( 4), 3);
+- STEP(F, d, a, b, c, SET( 5), 7);
+- STEP(F, c, d, a, b, SET( 6), 11);
+- STEP(F, b, c, d, a, SET( 7), 19);
+-
+- STEP(F, a, b, c, d, SET( 8), 3);
+- STEP(F, d, a, b, c, SET( 9), 7);
+- STEP(F, c, d, a, b, SET(10), 11);
+- STEP(F, b, c, d, a, SET(11), 19);
+-
+- STEP(F, a, b, c, d, SET(12), 3);
+- STEP(F, d, a, b, c, SET(13), 7);
+- STEP(F, c, d, a, b, SET(14), 11);
+- STEP(F, b, c, d, a, SET(15), 19);
+-
+- /* Round 2 */
+- STEP(G, a, b, c, d, GET( 0) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 4) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET( 8) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(12) + 0x5A827999, 13);
+-
+- STEP(G, a, b, c, d, GET( 1) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 5) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET( 9) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(13) + 0x5A827999, 13);
+-
+- STEP(G, a, b, c, d, GET( 2) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 6) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET(10) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(14) + 0x5A827999, 13);
+-
+- STEP(G, a, b, c, d, GET( 3) + 0x5A827999, 3);
+- STEP(G, d, a, b, c, GET( 7) + 0x5A827999, 5);
+- STEP(G, c, d, a, b, GET(11) + 0x5A827999, 9);
+- STEP(G, b, c, d, a, GET(15) + 0x5A827999, 13);
+-
+- /* Round 3 */
+- STEP(H, a, b, c, d, GET( 0) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET( 8) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 4) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(12) + 0x6ED9EBA1, 15);
+-
+- STEP(H, a, b, c, d, GET( 2) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET(10) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 6) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(14) + 0x6ED9EBA1, 15);
+-
+- STEP(H, a, b, c, d, GET( 1) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET( 9) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 5) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(13) + 0x6ED9EBA1, 15);
+-
+- STEP(H, a, b, c, d, GET( 3) + 0x6ED9EBA1, 3);
+- STEP(H, d, a, b, c, GET(11) + 0x6ED9EBA1, 9);
+- STEP(H, c, d, a, b, GET( 7) + 0x6ED9EBA1, 11);
+- STEP(H, b, c, d, a, GET(15) + 0x6ED9EBA1, 15);
+-
+- a += saved_a;
+- b += saved_b;
+- c += saved_c;
+- d += saved_d;
+-
+- ptr += 64;
+- }
+- while (size -= 64);
+-
+- ctx->a = a;
+- ctx->b = b;
+- ctx->c = c;
+- ctx->d = d;
+-
+- return ptr;
++ const unsigned char *ptr;
++ MD4_u32plus a, b, c, d;
++ MD4_u32plus saved_a, saved_b, saved_c, saved_d;
++ const MD4_u32plus ac1 = 0x5a827999, ac2 = 0x6ed9eba1;
++
++ ptr = (const unsigned char *)data;
++
++ a = ctx->a;
++ b = ctx->b;
++ c = ctx->c;
++ d = ctx->d;
++
++ do {
++ saved_a = a;
++ saved_b = b;
++ saved_c = c;
++ saved_d = d;
++
++/* Round 1 */
++ STEP(F, a, b, c, d, SET(0), 3)
++ STEP(F, d, a, b, c, SET(1), 7)
++ STEP(F, c, d, a, b, SET(2), 11)
++ STEP(F, b, c, d, a, SET(3), 19)
++ STEP(F, a, b, c, d, SET(4), 3)
++ STEP(F, d, a, b, c, SET(5), 7)
++ STEP(F, c, d, a, b, SET(6), 11)
++ STEP(F, b, c, d, a, SET(7), 19)
++ STEP(F, a, b, c, d, SET(8), 3)
++ STEP(F, d, a, b, c, SET(9), 7)
++ STEP(F, c, d, a, b, SET(10), 11)
++ STEP(F, b, c, d, a, SET(11), 19)
++ STEP(F, a, b, c, d, SET(12), 3)
++ STEP(F, d, a, b, c, SET(13), 7)
++ STEP(F, c, d, a, b, SET(14), 11)
++ STEP(F, b, c, d, a, SET(15), 19)
++
++/* Round 2 */
++ STEP(G, a, b, c, d, GET(0) + ac1, 3)
++ STEP(G, d, a, b, c, GET(4) + ac1, 5)
++ STEP(G, c, d, a, b, GET(8) + ac1, 9)
++ STEP(G, b, c, d, a, GET(12) + ac1, 13)
++ STEP(G, a, b, c, d, GET(1) + ac1, 3)
++ STEP(G, d, a, b, c, GET(5) + ac1, 5)
++ STEP(G, c, d, a, b, GET(9) + ac1, 9)
++ STEP(G, b, c, d, a, GET(13) + ac1, 13)
++ STEP(G, a, b, c, d, GET(2) + ac1, 3)
++ STEP(G, d, a, b, c, GET(6) + ac1, 5)
++ STEP(G, c, d, a, b, GET(10) + ac1, 9)
++ STEP(G, b, c, d, a, GET(14) + ac1, 13)
++ STEP(G, a, b, c, d, GET(3) + ac1, 3)
++ STEP(G, d, a, b, c, GET(7) + ac1, 5)
++ STEP(G, c, d, a, b, GET(11) + ac1, 9)
++ STEP(G, b, c, d, a, GET(15) + ac1, 13)
++
++/* Round 3 */
++ STEP(H, a, b, c, d, GET(0) + ac2, 3)
++ STEP(H, d, a, b, c, GET(8) + ac2, 9)
++ STEP(H, c, d, a, b, GET(4) + ac2, 11)
++ STEP(H, b, c, d, a, GET(12) + ac2, 15)
++ STEP(H, a, b, c, d, GET(2) + ac2, 3)
++ STEP(H, d, a, b, c, GET(10) + ac2, 9)
++ STEP(H, c, d, a, b, GET(6) + ac2, 11)
++ STEP(H, b, c, d, a, GET(14) + ac2, 15)
++ STEP(H, a, b, c, d, GET(1) + ac2, 3)
++ STEP(H, d, a, b, c, GET(9) + ac2, 9)
++ STEP(H, c, d, a, b, GET(5) + ac2, 11)
++ STEP(H, b, c, d, a, GET(13) + ac2, 15)
++ STEP(H, a, b, c, d, GET(3) + ac2, 3)
++ STEP(H, d, a, b, c, GET(11) + ac2, 9)
++ STEP(H, c, d, a, b, GET(7) + ac2, 11)
++ STEP(H, b, c, d, a, GET(15) + ac2, 15)
++
++ a += saved_a;
++ b += saved_b;
++ c += saved_c;
++ d += saved_d;
++
++ ptr += 64;
++ } while (size -= 64);
++
++ ctx->a = a;
++ ctx->b = b;
++ ctx->c = c;
++ ctx->d = d;
++
++ return ptr;
+ }
+
+-/* Put result from CTX in first 16 bytes following RESBUF. The result
+- will be in little endian byte order. */
+-static void *
+-md4_read_ctx (struct md4_ctx *ctx, void *resbuf)
++void MD4_Init(MD4_CTX *ctx)
+ {
+- unsigned char *buf = resbuf;
+- cpu_to_le32 (buf + 0, ctx->a);
+- cpu_to_le32 (buf + 4, ctx->b);
+- cpu_to_le32 (buf + 8, ctx->c);
+- cpu_to_le32 (buf + 12, ctx->d);
+- XCRYPT_SECURE_MEMSET (ctx, sizeof(struct md4_ctx));
+- return resbuf;
++ ctx->a = 0x67452301;
++ ctx->b = 0xefcdab89;
++ ctx->c = 0x98badcfe;
++ ctx->d = 0x10325476;
++
++ ctx->lo = 0;
++ ctx->hi = 0;
+ }
+
+-void
+-md4_init_ctx (struct md4_ctx *ctx)
++void MD4_Update(MD4_CTX *ctx, const void *data, size_t size)
+ {
+- ctx->a = 0x67452301;
+- ctx->b = 0xefcdab89;
+- ctx->c = 0x98badcfe;
+- ctx->d = 0x10325476;
++ MD4_u32plus saved_lo;
++ unsigned long used, available;
+
+- ctx->lo = 0;
+- ctx->hi = 0;
+-}
++ saved_lo = ctx->lo;
++ if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
++ ctx->hi++;
++ ctx->hi += (MD4_u32plus) size >> 29;
+
+-void
+-md4_process_bytes (const void *buffer, struct md4_ctx *ctx, size_t size)
+-{
+- uint32_t saved_lo;
+- size_t used, free;
+-
+- saved_lo = ctx->lo;
+- if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
+- ctx->hi++;
+- ctx->hi += (uint32_t)(size >> 29);
+-
+- used = saved_lo & 0x3f;
+-
+- if (used)
+- {
+- free = 64 - used;
+-
+- if (size < free)
+- {
+- memcpy(&ctx->buffer[used], buffer, size);
+- return;
+- }
+-
+- memcpy(&ctx->buffer[used], buffer, free);
+- buffer = (const unsigned char *) buffer + free;
+- size -= free;
+- body(ctx, ctx->buffer, 64);
+- }
+-
+- if (size >= 64)
+- {
+- buffer = body(ctx, buffer, size & ~(uint32_t)0x3f);
+- size &= 0x3f;
+- }
+-
+- memcpy(ctx->buffer, buffer, size);
++ used = saved_lo & 0x3f;
++
++ if (used) {
++ available = 64 - used;
++
++ if (size < available) {
++ memcpy(&ctx->buffer[used], data, size);
++ return;
++ }
++
++ memcpy(&ctx->buffer[used], data, available);
++ data = (const unsigned char *)data + available;
++ size -= available;
++ body(ctx, ctx->buffer, 64);
++ }
++
++ if (size >= 64) {
++ data = body(ctx, data, size & ~(unsigned long)0x3f);
++ size &= 0x3f;
++ }
++
++ memcpy(ctx->buffer, data, size);
+ }
+
+-void *
+-md4_finish_ctx (struct md4_ctx *ctx, void *resbuf)
++#define OUT(dst, src) \
++ (dst)[0] = (unsigned char)(src); \
++ (dst)[1] = (unsigned char)((src) >> 8); \
++ (dst)[2] = (unsigned char)((src) >> 16); \
++ (dst)[3] = (unsigned char)((src) >> 24);
++
++void MD4_Final(uint8_t result[16], MD4_CTX *ctx)
+ {
+- size_t used, free;
++ unsigned long used, available;
++
++ used = ctx->lo & 0x3f;
+
+- used = ctx->lo & 0x3f;
++ ctx->buffer[used++] = 0x80;
+
+- ctx->buffer[used++] = 0x80;
++ available = 64 - used;
+
+- free = 64 - used;
++ if (available < 8) {
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available);
++ body(ctx, ctx->buffer, 64);
++ used = 0;
++ available = 64;
++ }
+
+- if (free < 8)
+- {
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[used], free);
+- body(ctx, ctx->buffer, 64);
+- used = 0;
+- free = 64;
+- }
++ XCRYPT_SECURE_MEMSET(&ctx->buffer[used], available - 8);
+
+- XCRYPT_SECURE_MEMSET (&ctx->buffer[used], free - 8);
++ ctx->lo <<= 3;
++ OUT(&ctx->buffer[56], ctx->lo)
++ OUT(&ctx->buffer[60], ctx->hi)
+
+- ctx->lo <<= 3;
+- ctx->buffer[56] = (unsigned char)((ctx->lo) & 0xff);
+- ctx->buffer[57] = (unsigned char)((ctx->lo >> 8) & 0xff);
+- ctx->buffer[58] = (unsigned char)((ctx->lo >> 16) & 0xff);
+- ctx->buffer[59] = (unsigned char)((ctx->lo >> 24) & 0xff);
+- ctx->buffer[60] = (unsigned char)((ctx->hi) & 0xff);
+- ctx->buffer[61] = (unsigned char)((ctx->hi >> 8) & 0xff);
+- ctx->buffer[62] = (unsigned char)((ctx->hi >> 16) & 0xff);
+- ctx->buffer[63] = (unsigned char)((ctx->hi >> 24) & 0xff);
++ body(ctx, ctx->buffer, 64);
+
+- body(ctx, ctx->buffer, 64);
++ OUT(&result[0], ctx->a)
++ OUT(&result[4], ctx->b)
++ OUT(&result[8], ctx->c)
++ OUT(&result[12], ctx->d)
+
+- return md4_read_ctx (ctx, resbuf);
++ XCRYPT_SECURE_MEMSET(ctx, sizeof(*ctx));
+ }
+
+ #endif
+diff --git a/alg-md4.h b/alg-md4.h
+index 4c3e29c..473930e 100644
+--- a/alg-md4.h
++++ b/alg-md4.h
+@@ -1,38 +1,43 @@
+ /*
+- * This is an implementation of the RSA Data Security, Inc.
+- * MD4 Message-Digest Algorithm.
++ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
++ * MD4 Message-Digest Algorithm (RFC 1320).
+ *
+- * Written by Solar Designer <solar(a)openwall.com> in 2001, and placed in
+- * the public domain. See md4.c for more information.
++ * Homepage:
++ * http://openwall.info/wiki/people/solar/software/public-domain-source-code...
++ *
++ * Author:
++ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
++ *
++ * This software was written by Alexander Peslyak in 2001. No copyright is
++ * claimed, and the software is hereby placed in the public domain.
++ * In case this attempt to disclaim copyright and place the software in the
++ * public domain is deemed null and void, then the software is
++ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
++ * general public under the following terms:
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted.
++ *
++ * There's ABSOLUTELY NO WARRANTY, express or implied.
++ *
++ * See md4.c for more information.
+ */
+
+ #ifndef _CRYPT_ALG_MD4_H
+ #define _CRYPT_ALG_MD4_H 1
+
+-#include <stddef.h>
+-#include <stdint.h>
+-
+-/* Structure to save state of computation between the single steps. */
+-struct md4_ctx
+-{
+- uint32_t lo, hi;
+- uint32_t a, b, c, d;
+- unsigned char buffer[64];
+- uint32_t block[16];
+-};
+-
+-/* Initialize structure containing state of computation.
+- (RFC 1320, 3.3: Step 3) */
+-extern void md4_init_ctx (struct md4_ctx *ctx);
++/* Any 32-bit or wider unsigned integer data type will do */
++typedef uint32_t MD4_u32plus;
+
+-/* Starting with the result of former calls of this function (or the
+- initialization function) update the context for the next LEN bytes
+- starting at BUFFER. LEN does not need to be a multiple of 64. */
+-extern void md4_process_bytes (const void *buffer, struct md4_ctx *ctx, size_t size);
++typedef struct {
++ MD4_u32plus lo, hi;
++ MD4_u32plus a, b, c, d;
++ uint8_t buffer[64];
++ MD4_u32plus block[16];
++} MD4_CTX;
+
+-/* Process the remaining bytes in the buffer and write the finalized
+- hash to RESBUF, which should point to 16 bytes of storage. All
+- data written to CTX is erased before returning from the function. */
+-extern void *md4_finish_ctx (struct md4_ctx *ctx, void *resbuf);
++extern void MD4_Init(MD4_CTX *ctx);
++extern void MD4_Update(MD4_CTX *ctx, const void *data, size_t size);
++extern void MD4_Final(uint8_t result[16], MD4_CTX *ctx);
+
+-#endif
++#endif /* alg-md4.h */
+diff --git a/crypt-nthash.c b/crypt-nthash.c
+index 5a715de..db6f17e 100644
+--- a/crypt-nthash.c
++++ b/crypt-nthash.c
+@@ -61,10 +61,10 @@ crypt_nthash_rn (const char *phrase, size_t ARG_UNUSED (phr_size),
+ uint16_t unipw[128];
+ unsigned char hash[16];
+ const char *s;
+- struct md4_ctx *ctx = scratch;
++ MD4_CTX *ctx = scratch;
+
+ if ((out_size < 4 + 32) ||
+- (scr_size < sizeof (struct md4_ctx)))
++ (scr_size < sizeof (MD4_CTX)))
+ {
+ errno = ERANGE;
+ return;
+@@ -83,9 +83,9 @@ crypt_nthash_rn (const char *phrase, size_t ARG_UNUSED (phr_size),
+ unipw[unipwLen++] = htons((uint16_t)(*s << 8));
+
+ /* Compute MD4 of Unicode password */
+- md4_init_ctx (ctx);
+- md4_process_bytes ((unsigned char *)unipw, ctx, unipwLen*sizeof(uint16_t));
+- md4_finish_ctx (ctx, hash);
++ MD4_Init (ctx);
++ MD4_Update (ctx, unipw, unipwLen*sizeof(uint16_t));
++ MD4_Final (hash, ctx);
+
+ output = (uint8_t *)stpcpy ((char *)output, magic);
+ *output++ = '$';
+@@ -111,7 +111,7 @@ gensalt_nthash_rn (unsigned long count,
+ size_t o_size)
+ {
+ static const char *salt = "$3$__not_used__";
+- struct md4_ctx ctx;
++ MD4_CTX ctx;
+ unsigned char hashbuf[16];
+ char hashstr[14 + 1];
+ unsigned long i;
+@@ -131,15 +131,15 @@ gensalt_nthash_rn (unsigned long count,
+ return;
+ }
+
+- md4_init_ctx (&ctx);
++ MD4_Init (&ctx);
+ for (i = 0; i < 20; i++)
+ {
+- md4_process_bytes (salt, &ctx, (i % 15) + 1);
+- md4_process_bytes (rbytes, &ctx, nrbytes);
+- md4_process_bytes (salt, &ctx, 15);
+- md4_process_bytes (salt, &ctx, 15 - (i % 15));
++ MD4_Update (&ctx, salt, (i % 15) + 1);
++ MD4_Update (&ctx, rbytes, nrbytes);
++ MD4_Update (&ctx, salt, 15);
++ MD4_Update (&ctx, salt, 15 - (i % 15));
+ }
+- md4_finish_ctx (&ctx, &hashbuf);
++ MD4_Final (hashbuf, &ctx);
+
+ for (i = 0; i < 7; i++)
+ sprintf (&(hashstr[i * 2]), "%02x", hashbuf[i]);
+diff --git a/crypt-port.h b/crypt-port.h
+index 2571c94..fa30e8e 100644
+--- a/crypt-port.h
++++ b/crypt-port.h
+@@ -241,9 +241,9 @@ _xcrypt_strcpy_or_abort (void *dst, const size_t d_size,
+ #endif
+
+ #if INCLUDE_nthash
+-#define md4_finish_ctx _crypt_md4_finish_ctx
+-#define md4_init_ctx _crypt_md4_init_ctx
+-#define md4_process_bytes _crypt_md4_process_bytes
++#define MD4_Init _crypt_MD4_Init
++#define MD4_Update _crypt_MD4_Update
++#define MD4_Final _crypt_MD4_Final
+ #endif
+
+ #if INCLUDE_md5 || INCLUDE_sunmd5
+diff --git a/test-alg-md4.c b/test-alg-md4.c
+index 1b1b828..595e0bb 100644
+--- a/test-alg-md4.c
++++ b/test-alg-md4.c
+@@ -45,7 +45,7 @@ static const struct
+
+ static void
+ report_failure(int n, const char *tag,
+- const char expected[16], const char actual[16])
++ const char expected[16], uint8_t actual[16])
+ {
+ int i;
+ printf ("FAIL: test %d (%s):\n exp:", n, tag);
+@@ -69,27 +69,27 @@ report_failure(int n, const char *tag,
+ int
+ main (void)
+ {
+- struct md4_ctx ctx;
+- char sum[16];
++ MD4_CTX ctx;
++ uint8_t sum[16];
+ int result = 0;
+ int cnt;
+ int i;
+
+ for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)
+ {
+- md4_init_ctx (&ctx);
+- md4_process_bytes ((const unsigned char*)tests[cnt].input, &ctx, strlen (tests[cnt].input));
+- md4_finish_ctx (&ctx, (unsigned char*)sum);
++ MD4_Init (&ctx);
++ MD4_Update (&ctx, tests[cnt].input, strlen (tests[cnt].input));
++ MD4_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "all at once", tests[cnt].result, sum);
+ result = 1;
+ }
+
+- md4_init_ctx (&ctx);
++ MD4_Init (&ctx);
+ for (i = 0; tests[cnt].input[i] != '\0'; ++i)
+- md4_process_bytes ((const unsigned char*)&tests[cnt].input[i], &ctx, 1);
+- md4_finish_ctx (&ctx, (unsigned char*)sum);
++ MD4_Update (&ctx, &tests[cnt].input[i], 1);
++ MD4_Final (sum, &ctx);
+ if (memcmp (tests[cnt].result, sum, 16))
+ {
+ report_failure (cnt, "byte by byte", tests[cnt].result, sum);
+
+From 6fc8102f7727f8e4115a87070d2e4a36b55ea1bc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 19:51:57 +0200
+Subject: [PATCH 12/17] Fix -Wcast-align.
+
+---
+ alg-md4.c | 2 +-
+ alg-md5.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/alg-md4.c b/alg-md4.c
+index 482b6f4..a6e1072 100644
+--- a/alg-md4.c
++++ b/alg-md4.c
+@@ -73,7 +73,7 @@
+ * link-time optimizations. For the time being, keeping these MD4 routines in
+ * their own translation unit avoids the problem.
+ */
+-#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#if 0 /* defined(__i386__) || defined(__x86_64__) || defined(__vax__) */
+ #define SET(n) \
+ (*(const MD4_u32plus *)&ptr[(n) * 4])
+ #define GET(n) \
+diff --git a/alg-md5.c b/alg-md5.c
+index 8382b98..5502539 100644
+--- a/alg-md5.c
++++ b/alg-md5.c
+@@ -77,7 +77,7 @@
+ * link-time optimizations. For the time being, keeping these MD5 routines in
+ * their own translation unit avoids the problem.
+ */
+-#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
++#if 0 /* defined(__i386__) || defined(__x86_64__) || defined(__vax__) */
+ #define SET(n) \
+ (*(const MD5_u32plus *)&ptr[(n) * 4])
+ #define GET(n) \
+
+From cc50dde05be214caace8af493fe869832a1d3d68 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Mon, 22 Oct 2018 20:03:03 +0200
+Subject: [PATCH 13/17] Remove unused file.
+
+---
+ m4/.git_keep_dir | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+ delete mode 100644 m4/.git_keep_dir
+
+diff --git a/m4/.git_keep_dir b/m4/.git_keep_dir
+deleted file mode 100644
+index e69de29..0000000
+
+From 1cf317228655013c516090a20e70d81656516580 Mon Sep 17 00:00:00 2001
+From: Vitaly Chikunov <vt(a)altlinux.org>
+Date: Wed, 24 Oct 2018 05:24:47 +0300
+Subject: [PATCH 14/17] yescrypt: Add more tests.
+
+Test that crypt() with hashed password in place of settings works the
+same as settings.
+---
+ test-crypt-yescrypt.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/test-crypt-yescrypt.c b/test-crypt-yescrypt.c
+index a635f94..9d67b92 100644
+--- a/test-crypt-yescrypt.c
++++ b/test-crypt-yescrypt.c
+@@ -43,8 +43,16 @@ test(const char *p, const char *s, const char *m)
+ int
+ main (void)
+ {
+- int result = test("pleaseletmein", "$y$jD5.7$LdJMENpBABJJ3hIHjB1Bi.",
+- "$y$jD5.7$LdJMENpBABJJ3hIHjB1Bi.$HboGM6qPrsK.StKYGt6KErmUYtioHreJd98oIugoNB6");
++ int result = 0;
++
++#define YSETTINGS "$y$jD5.7$LdJMENpBABJJ3hIHjB1Bi."
++#define YHASHPART "HboGM6qPrsK.StKYGt6KErmUYtioHreJd98oIugoNB6"
++#define YFULLHASH YSETTINGS "$" YHASHPART
++ result |= test("pleaseletmein", YSETTINGS, YFULLHASH);
++ result |= test("pleaseletmein", YFULLHASH, YFULLHASH);
++ result |= test("pleaseletmein", YSETTINGS "$", YFULLHASH);
++ result |= test("pleaseletmein", YSETTINGS "$garbage", YFULLHASH);
++
+ result |= test("", "$y$jD5.7$", "$y$jD5.7$$JD8dsR.nt1ty0ltQ2HHwauaDRoOUIEaA5i.vpj2nyL.");
+ result |= test("", "$y$jD5.7$$", "$y$jD5.7$$JD8dsR.nt1ty0ltQ2HHwauaDRoOUIEaA5i.vpj2nyL.");
+
+
+From 232b217faba35064ca30120751f788d649cb3020 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Wed, 24 Oct 2018 15:54:12 +0200
+Subject: [PATCH 15/17] Use bzip2 and xz compression for distribution tarballs,
+ too.
+
+---
+ Makefile.am | 2 +-
+ NEWS | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index e7d5c6d..8cb3807 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -4,7 +4,7 @@
+ # Author: Thorsten Kukuk <kukuk(a)suse.de>
+ #
+
+-AUTOMAKE_OPTIONS = 1.14 gnits
++AUTOMAKE_OPTIONS = 1.14 gnits dist-bzip2 dist-xz
+ ACLOCAL_AMFLAGS = -I m4
+
+ AM_CFLAGS = $(WARN_CFLAGS)
+diff --git a/NEWS b/NEWS
+index e48b0d1..8af68ff 100644
+--- a/NEWS
++++ b/NEWS
+@@ -10,6 +10,8 @@ Version 4.2.3
+ sha512 implementation under the BSD license.
+ * Use md5 implementation from Alexander Peslyak. Thus we now have a
+ md5 implementation in the public domain.
++* 'make dist' now generates bzip2 and xz compressed tarballs along
++ with the default gzip compressed tarball.
+
+ Version 4.2.2
+ * Convert existing manpages to BSD mdoc format.
+
+From a17c2d75c5642d164e04748ddb93f8f426c7ed5c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 25 Oct 2018 13:47:04 +0200
+Subject: [PATCH 16/17] Add Badge for Coverity Scan.
+
+---
+ README.md | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/README.md b/README.md
+index 102127a..9a91ad5 100644
+--- a/README.md
++++ b/README.md
+@@ -1,5 +1,6 @@
+ [![Build Status](https://travis-ci.org/besser82/libxcrypt.svg?branch=develop)](htt...
+ [![codecov](https://codecov.io/gh/besser82/libxcrypt/branch/develop/graph/badge.svg)](https://codecov.io/gh/besser82/libxcrypt)
++[![Coverity Scan Build Status](https://scan.coverity.com/projects/17073/badge.svg)](https://scan...
+
+ README for libxcrypt
+ ====================
+
+From 8b1ff5c38f316bc301e57a5a307fd11b8984e494 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Thu, 25 Oct 2018 14:06:01 +0200
+Subject: [PATCH 17/17] Add labels to TravisCI builds.
+
+---
+ .travis.yml | 75 +++++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 50 insertions(+), 25 deletions(-)
+
+diff --git a/.travis.yml b/.travis.yml
+index acb186c..2e7a746 100644
+--- a/.travis.yml
++++ b/.travis.yml
+@@ -15,153 +15,178 @@ sudo: true
+ matrix:
+ fast_finish: true
+ include:
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, Codecov"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+ - CODECOV=1
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, all hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+ - DISTCHECK=1
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, all hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, all hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, all hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, all hashes, obsolete API, no failure-tokens"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, all hashes, obsolete API, no failure-tokens"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, all hashes, obsolete API, no failure-tokens"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, all hashes, obsolete API, no failure-tokens"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-failure-tokens --enable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, all hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, all hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, all hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, all hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=all"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, strong hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, strong hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, strong hashes, no obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, strong hashes, no obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--disable-obsolete-api --enable-hashes=strong"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, glibc hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, glibc hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, glibc hashes, obsolete API"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, glibc hashes, obsolete API"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api --enable-hashes=glibc"
+ - FCVER="latest"
+- - compiler: gcc
++ - name: "Fedora Rawhide, GCC, glibc and strong hashes, obsolete API for glibc"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api=glibc --enable-hashes=strong,glibc"
+ - FCVER="rawhide"
+- - compiler: clang
++ - name: "Fedora Rawhide, Clang, glibc and strong hashes, obsolete API for glibc"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api=glibc --enable-hashes=strong,glibc"
+ - FCVER="rawhide"
+- - compiler: gcc
++ - name: "Fedora stable, GCC, glibc and strong hashes, obsolete API for glibc"
++ compiler: gcc
+ os: linux
+ services: docker
+ env:
+ - CONF="--enable-obsolete-api=glibc --enable-hashes=strong,glibc"
+ - FCVER="latest"
+- - compiler: clang
++ - name: "Fedora stable, Clang, glibc and strong hashes, obsolete API for glibc"
++ compiler: clang
+ os: linux
+ services: docker
+ env:
diff --git a/libxcrypt.spec b/libxcrypt.spec
index 92dd79a..10749a5 100644
--- a/libxcrypt.spec
+++ b/libxcrypt.spec
@@ -76,7 +76,7 @@ fi \
Name: libxcrypt
Version: 4.2.2
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: Extended crypt library for DES, MD5, Blowfish and others
# For explicit license breakdown, see the
@@ -85,6 +85,8 @@ License: LGPLv2+ and BSD and Public Domain
URL: https://github.com/besser82/%{name}
Source0: %{url}/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
+Patch0001: %{url}/compare/v%{version}...develop.patch#/%{name}-%{version}-to_develop.patch
+
BuildRequires: fipscheck
BuildRequires: libtool
@@ -306,6 +308,9 @@ done
%changelog
+* Thu Oct 25 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-2
+- Add patch updating to recent development version
+
* Thu Oct 18 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 4.2.2-1
- New upstream release
5 years, 6 months
Architecture specific change in rpms/fedora-toolbox.git
by githook-noreply@fedoraproject.org
The package rpms/fedora-toolbox.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/fedora-toolbox.git/commit/?id=6eb....
Change:
+ExclusiveArch: aarch64 %{arm} ppc64le s390x x86_64
Thanks.
Full change:
============
commit 6ebf7a335c8e11b8394137c789fa3470d0da417f
Author: Debarshi Ray <rishi(a)fedoraproject.org>
Date: Thu Oct 25 15:30:32 2018 +0000
Initial build
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ab37c14
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/fedora-toolbox-0.0.1.tar.xz
diff --git a/fedora-toolbox.spec b/fedora-toolbox.spec
new file mode 100644
index 0000000..01d5e12
--- /dev/null
+++ b/fedora-toolbox.spec
@@ -0,0 +1,52 @@
+Name: fedora-toolbox
+Version: 0.0.1
+Release: 1%{?dist}
+Summary: Toolbox containers & images for hacking on OSTree-based Fedoras
+
+License: ASL 2.0
+URL: https://github.com/debarshiray/fedora-toolbox
+Source0: https://github.com/debarshiray/%{name}/releases/download/%{version}/%{nam...
+
+BuildArch: noarch
+# buildah and podman only work on the following architectures:
+ExclusiveArch: aarch64 %{arm} ppc64le s390x x86_64
+
+BuildRequires: meson
+
+Requires: buildah
+Requires: podman
+
+
+%description
+Fedora Toolbox is a tool that offers a familiar RPM based environment for
+developing and debugging software on locked down OSTree based Fedora systems
+like Silverblue. Such operating systems are shipped as immutable OSTree
+images, where it's difficult to setup a development environment with your
+favorite tools, editors and SDKs. A toolbox container solves that problem by
+providing a RPM based mutable container. You can tweak it to your heart's
+content and use DNF to install your favorite packages, all without worrying
+about breaking your operating system.
+
+
+%prep
+%autosetup
+
+
+%build
+%meson --buildtype=plain
+%meson_build
+
+
+%install
+%meson_install
+
+
+%files
+%doc NEWS README.md
+%license COPYING
+%{_bindir}/%{name}
+
+
+%changelog
+* Mon Oct 22 2018 Debarshi Ray <rishi(a)fedoraproject.org> - 0.0.1-1
+- Initial build
diff --git a/sources b/sources
new file mode 100644
index 0000000..f8d4148
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (fedora-toolbox-0.0.1.tar.xz) = 3ccac2ddfb994e1fdad9f98a99e187658832668e2cd9a94a659687ad6ef1fae3197e4bb784d1bc7d023fe7532bc459f010a7df8455f17b8264a7fe029e9fe528
5 years, 6 months