* [Buildroot] [PATCH 0/3 v2] support/download: accept user-provided list of extra hash files (branch yem/multi-hash)
@ 2023-11-06 19:09 Yann E. MORIN
2023-11-06 19:09 ` [Buildroot] [PATCH 1/3 v2] support/download: teach dl-wrapper to handle more than one hash file Yann E. MORIN
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Yann E. MORIN @ 2023-11-06 19:09 UTC (permalink / raw)
To: buildroot; +Cc: Yann E . MORIN, Martin Zeiser (mzeiser)
Hello All!
For packages where the version can be specified by the user (e.g. with a
custom version string, a custom tarball location, a custom git tree and
changeset...), Buildroot can't carry hashes for those, and thus does not
check the integritiy of the downloads.
Add the possibility for users to provide hashes for those, by leveraging
the global patch dir setting, to look up extra hash files in a way
similar to how extra patches are looked up in there.
Users who provide such extra hashes will most probably be interested in
ensuring that no download ever gets used without an actual integrity
check, so also add an option the requires all downloads to have at least
one valid hash (and no invalid ones, of course), rather than ignoring
downloads for custom versions.
Changes v1 -> v2:
- restore legal-info (Peter K.)
- drop all.hash
Regards,
Yann E. MORIN.
----------------------------------------------------------------
Yann E. MORIN (3):
support/download: teach dl-wrapper to handle more than one hash file
package/pkg-download: lookup hash files in global-patch-dir
pkg-download: add option to enforce hash checking
Config.in | 27 +++++++++++--
Makefile | 2 +-
docs/manual/adding-packages-directory.adoc | 6 +++
docs/manual/customize-patches.adoc | 24 ++++++++++-
package/pkg-download.mk | 7 ++--
package/pkg-generic.mk | 14 ++++---
package/pkg-utils.mk | 8 ++--
support/download/check-hash | 64 ++++++++++++++++--------------
support/download/dl-wrapper | 10 ++---
9 files changed, 108 insertions(+), 54 deletions(-)
--
.-----------------.--------------------.------------------.--------------------.
| Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ |
| +33 561 099 427 `------------.-------: X AGAINST | \e/ There is no |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. |
'------------------------------^-------^------------------^--------------------'
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Buildroot] [PATCH 1/3 v2] support/download: teach dl-wrapper to handle more than one hash file
2023-11-06 19:09 [Buildroot] [PATCH 0/3 v2] support/download: accept user-provided list of extra hash files (branch yem/multi-hash) Yann E. MORIN
@ 2023-11-06 19:09 ` Yann E. MORIN
2023-11-07 10:46 ` Peter Korsgaard
2023-11-06 19:09 ` [Buildroot] [PATCH 2/3 v2] package/pkg-download: lookup hash files in global-patch-dir Yann E. MORIN
2023-11-06 19:09 ` [Buildroot] [PATCH 3/3 v2] pkg-download: add option to enforce hash checking Yann E. MORIN
2 siblings, 1 reply; 10+ messages in thread
From: Yann E. MORIN @ 2023-11-06 19:09 UTC (permalink / raw)
To: buildroot; +Cc: Yann E. MORIN, Martin Zeiser (mzeiser)
Currently, we expect and only use hash files that lie within the package
directory, alongside the .mk file. Those hash files are thus bundeld
with Buildroot.
This implies that only what's known to Buildroot can ever get into those
hash files. For packages where the version is fixed (or a static
choice), then we can carry hashes for those known versions.
However, we do have a few packages for which the version is a free-form
entry, where the user can provide a custom location and/or version. like
a custom VCS tree and revision, or a custom tarball URL. This means that
Buildroot has no way to be able to cary hashes for such custom versions.
This means that there is no integrity check that what was downloaded is
what was expected. For a sha1 in a git tree, this is a minor issue,
because the sha1 by itself is already a hash of the expected content.
But for custom tarballs URLs, or for a tag in a VCS, there is indeed no
integrity check.
Buildroot can't provide such hashes, but interested users may want to
provide those, and currently there is no (easy) way to do so.
So, we need our download helpers to be able to accept more than one hash
file to lookup for hashes.
Extend the dl-wrapper and the check-hash helpers thusly, and update the
legal-info accordingly.
Note that, to be able to pass more than one hash file, we also need to
re-order the arguments passed to support/download/check-hash, which also
impies some shuffling in the three places it is called:
- 2 in dl-wrapper
- 1 in the legal-info infra
That in turn also requires that the legal-license-file macro args get
re-ordered to have the hash file last; we take the opportunity to also
move the HOST/TARGET arg to be first, like in the other legal-info
macros.
Reported-by: "Martin Zeiser (mzeiser)" <mzeiser@cisco.com>
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Cc: Peter Korsgaard <peter@korsgaard.com>
---
Changes v1 -> v2:
- restore legal-info (Peter K.)
---
Makefile | 2 +-
package/pkg-generic.mk | 2 +-
package/pkg-utils.mk | 8 ++---
support/download/check-hash | 64 ++++++++++++++++++++-----------------
support/download/dl-wrapper | 10 +++---
5 files changed, 45 insertions(+), 41 deletions(-)
diff --git a/Makefile b/Makefile
index ada5b96f08..b9acd7e650 100644
--- a/Makefile
+++ b/Makefile
@@ -836,7 +836,7 @@ legal-info-clean:
.PHONY: legal-info-prepare
legal-info-prepare: $(LEGAL_INFO_DIR)
@$(call MESSAGE,"Buildroot $(BR2_VERSION_FULL) Collecting legal info")
- @$(call legal-license-file,buildroot,buildroot,support/legal-info/buildroot.hash,COPYING,COPYING,HOST)
+ @$(call legal-license-file,HOST,buildroot,buildroot,COPYING,COPYING,support/legal-info/buildroot.hash)
@$(call legal-manifest,TARGET,PACKAGE,VERSION,LICENSE,LICENSE FILES,SOURCE ARCHIVE,SOURCE SITE,DEPENDENCIES WITH LICENSES)
@$(call legal-manifest,HOST,PACKAGE,VERSION,LICENSE,LICENSE FILES,SOURCE ARCHIVE,SOURCE SITE,DEPENDENCIES WITH LICENSES)
@$(call legal-manifest,HOST,buildroot,$(BR2_VERSION_FULL),GPL-2.0+,COPYING,not saved,not saved)
diff --git a/package/pkg-generic.mk b/package/pkg-generic.mk
index 943f8a08c0..6c24be7505 100644
--- a/package/pkg-generic.mk
+++ b/package/pkg-generic.mk
@@ -1138,7 +1138,7 @@ ifneq ($$(call qstrip,$$($(2)_SOURCE)),)
ifeq ($$(call qstrip,$$($(2)_LICENSE_FILES)),)
$(Q)$$(call legal-warning-pkg,$$($(2)_BASENAME_RAW),cannot save license ($(2)_LICENSE_FILES not defined))
else
- $(Q)$$(foreach F,$$($(2)_LICENSE_FILES),$$(call legal-license-file,$$($(2)_RAWNAME),$$($(2)_BASENAME_RAW),$$($(2)_HASH_FILE),$$(F),$$($(2)_DIR)/$$(F),$$(call UPPERCASE,$(4)))$$(sep))
+ $(Q)$$(foreach F,$$($(2)_LICENSE_FILES),$$(call legal-license-file,$$(call UPPERCASE,$(4)),$$($(2)_RAWNAME),$$($(2)_BASENAME_RAW),$$(F),$$($(2)_DIR)/$$(F),$$($(2)_HASH_FILE))$$(sep))
endif # license files
ifeq ($$($(2)_REDISTRIBUTE),YES)
diff --git a/package/pkg-utils.mk b/package/pkg-utils.mk
index dcab7d9b2a..b91061a572 100644
--- a/package/pkg-utils.mk
+++ b/package/pkg-utils.mk
@@ -280,13 +280,13 @@ define legal-manifest # {HOST|TARGET}, pkg, version, license, license-files, sou
echo '"$(2)","$(3)","$(4)","$(5)","$(6)","$(7)","$(8)"' >>$(LEGAL_MANIFEST_CSV_$(1))
endef
-define legal-license-file # pkgname, pkgname-pkgver, pkg-hashfile, filename, file-fullpath, {HOST|TARGET}
- mkdir -p $(LICENSE_FILES_DIR_$(6))/$(2)/$(dir $(4)) && \
+define legal-license-file # {HOST|TARGET}, pkgname, pkgname-pkgver, filename, file-fullpath, pkg-hashfile
+ mkdir -p $(LICENSE_FILES_DIR_$(1))/$(3)/$(dir $(4)) && \
{ \
- support/download/check-hash $(3) $(5) $(4); \
+ support/download/check-hash $(5) $(4) $(6); \
case $${?} in (0|3) ;; (*) exit 1;; esac; \
} && \
- cp $(5) $(LICENSE_FILES_DIR_$(6))/$(2)/$(4)
+ cp $(5) $(LICENSE_FILES_DIR_$(1))/$(3)/$(4)
endef
non-virtual-deps = $(foreach p,$(1),$(if $($(call UPPERCASE,$(p))_IS_VIRTUAL),,$(p)))
diff --git a/support/download/check-hash b/support/download/check-hash
index 5a47f49bc3..03a6557187 100755
--- a/support/download/check-hash
+++ b/support/download/check-hash
@@ -3,12 +3,12 @@ set -e
# Helper to check a file matches its known hash
# Call it with:
-# $1: the path of the file containing all the expected hashes
-# $2: the full path to the temporary file that was downloaded, and
+# $1: the full path to the temporary file that was downloaded, and
# that is to be checked
-# $3: the final basename of the file, to which it will be ultimately
+# $2: the final basename of the file, to which it will be ultimately
# saved as, to be able to match it to the corresponding hashes
# in the .hash file
+# $*: the paths of the files containing all the expected hashes
#
# Exit codes:
# 0: the hash file exists and the file to check matches all its hashes,
@@ -27,28 +27,21 @@ while getopts :q OPT; do
done
shift $((OPTIND-1))
-h_file="${1}"
-file="${2}"
-base="${3}"
-
-# Bail early if no hash to check
-if [ -z "${h_file}" ]; then
- exit 0
-fi
-# Does the hash-file exist?
-if [ ! -f "${h_file}" ]; then
- printf "WARNING: no hash file for %s\n" "${base}" >&2
- exit 0
-fi
+file="${1}"
+base="${2}"
+shift 2
+declare -a h_files=( "${@}" )
# Check one hash for a file
# $1: algo hash
# $2: known hash
# $3: file (full path)
+# $4: hash file (full path)
check_one_hash() {
_h="${1}"
_known="${2}"
_file="${3}"
+ _h_file="${4}"
# Note: md5 is supported, but undocumented on purpose.
# Note: sha3 is not supported, since there is currently no implementation
@@ -70,6 +63,7 @@ check_one_hash() {
return 0
fi
+ printf "ERROR: while checking hashes from %s\n" "${_h_file}" >&2
printf "ERROR: %s has wrong %s hash:\n" "${base}" "${_h}" >&2
printf "ERROR: expected: %s\n" "${_known}" >&2
printf "ERROR: got : %s\n" "${_hash}" >&2
@@ -79,21 +73,31 @@ check_one_hash() {
}
# Do we know one or more hashes for that file?
+nb_h_files=0
nb_checks=0
-while read t h f; do
- case "${t}" in
- ''|'#'*)
- # Skip comments and empty lines
- continue
- ;;
- *)
- if [ "${f}" = "${base}" ]; then
- check_one_hash "${t}" "${h}" "${file}"
- : $((nb_checks++))
- fi
- ;;
- esac
-done <"${h_file}"
+for h_file in "${h_files[@]}"; do
+ [ -f "${h_file}" ] || continue
+ : $((nb_h_files++))
+ while read t h f; do
+ case "${t}" in
+ ''|'#'*)
+ # Skip comments and empty lines
+ continue
+ ;;
+ *)
+ if [ "${f}" = "${base}" ]; then
+ check_one_hash "${t}" "${h}" "${file}" "${h_file}"
+ : $((nb_checks++))
+ fi
+ ;;
+ esac
+ done <"${h_file}"
+done
+
+if [ ${nb_h_files} -eq 0 ]; then
+ printf "WARNING: no hash file for %s\n" "${base}" >&2
+ exit 0
+fi
if [ ${nb_checks} -eq 0 ]; then
case " ${BR_NO_CHECK_HASH_FOR} " in
diff --git a/support/download/dl-wrapper b/support/download/dl-wrapper
index 1e8d6058f6..35428faeef 100755
--- a/support/download/dl-wrapper
+++ b/support/download/dl-wrapper
@@ -21,8 +21,8 @@ export BR_BACKEND_DL_GETOPTS=":hc:d:o:n:N:H:lru:qf:e"
main() {
local OPT OPTARG
- local backend output hfile large_file recurse quiet rc
- local -a uris
+ local backend output large_file recurse quiet rc
+ local -a uris hfiles
# Parse our options; anything after '--' is for the backend
while getopts ":c:d:D:o:n:N:H:lrf:u:qp:" OPT; do
@@ -33,7 +33,7 @@ main() {
o) output="${OPTARG}";;
n) raw_base_name="${OPTARG}";;
N) base_name="${OPTARG}";;
- H) hfile="${OPTARG}";;
+ H) hfiles+=( "${OPTARG}" );;
l) large_file="-l";;
r) recurse="-r";;
f) filename="${OPTARG}";;
@@ -70,7 +70,7 @@ main() {
# - fails at least one of its hashes: force a re-download
# - there's no hash (but a .hash file): consider it a hard error
if [ -e "${output}" ]; then
- if support/download/check-hash ${quiet} "${hfile}" "${output}" "${output##*/}"; then
+ if support/download/check-hash ${quiet} "${output}" "${output##*/}" "${hfiles[@]}"; then
exit 0
elif [ ${?} -ne 2 ]; then
# Do not remove the file, otherwise it might get re-downloaded
@@ -154,7 +154,7 @@ main() {
# Check if the downloaded file is sane, and matches the stored hashes
# for that file
- if support/download/check-hash ${quiet} "${hfile}" "${tmpf}" "${output##*/}"; then
+ if support/download/check-hash ${quiet} "${tmpf}" "${output##*/}" "${hfiles[@]}"; then
rc=0
else
if [ ${?} -ne 3 ]; then
--
2.25.1
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Buildroot] [PATCH 2/3 v2] package/pkg-download: lookup hash files in global-patch-dir
2023-11-06 19:09 [Buildroot] [PATCH 0/3 v2] support/download: accept user-provided list of extra hash files (branch yem/multi-hash) Yann E. MORIN
2023-11-06 19:09 ` [Buildroot] [PATCH 1/3 v2] support/download: teach dl-wrapper to handle more than one hash file Yann E. MORIN
@ 2023-11-06 19:09 ` Yann E. MORIN
2023-11-07 10:47 ` Peter Korsgaard
2023-11-10 13:36 ` Peter Korsgaard
2023-11-06 19:09 ` [Buildroot] [PATCH 3/3 v2] pkg-download: add option to enforce hash checking Yann E. MORIN
2 siblings, 2 replies; 10+ messages in thread
From: Yann E. MORIN @ 2023-11-06 19:09 UTC (permalink / raw)
To: buildroot; +Cc: Yann E. MORIN, Martin Zeiser (mzeiser)
Currently, we expect and only use hash files that lie within the package
directory, alongside the .mk file. Those hash files are thus bundled
with Buildroot.
This implies that only what's known to Buildroot can ever get into those
hash files. For packages where the version is fixed (or a static
choice), then we can carry hashes for those known versions.
However, we do have a few packages for which the version is a free-form
entry, where the user can provide a custom location and/or version. like
a custom VCS tree and revision, or a custom tarball URL. This means that
Buildroot has no way to be able to cary hashes for such custom versions.
This means that there is no integrity check that what was downloaded is
what was expected. For a sha1 in a git tree, this is a minor issue,
because the sha1 by itself is already a hash of the expected content.
But for custom tarballs URLs, or for a tag in a VCS, there is indeed no
integrity check.
Buildroot can't provide such hashes, but interested users may want to
provide those, and currently there is no (easy) way to do so.
We leverage the existng global-patch-dir mechanism to look for extra
hash files. We use the same heuristic that is used for bundled hash
files, and for each global patch directory <dir>, we use the first file
to exist among:
1. look into <dir>/<package>/<version>/<package>.hash
2. look into <dir>/<package>/<package>.hash
Reported-by: "Martin Zeiser (mzeiser)" <mzeiser@cisco.com>
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
---
Changes v1 -> v2:
- drop <dir>/all.hash
---
Config.in | 10 +++++----
docs/manual/adding-packages-directory.adoc | 6 ++++++
docs/manual/customize-patches.adoc | 24 +++++++++++++++++++++-
package/pkg-download.mk | 2 +-
package/pkg-generic.mk | 14 ++++++++-----
package/pkg-utils.mk | 2 +-
6 files changed, 46 insertions(+), 12 deletions(-)
diff --git a/Config.in b/Config.in
index 7dd49567f6..b344d0e80a 100644
--- a/Config.in
+++ b/Config.in
@@ -674,12 +674,12 @@ config BR2_PACKAGE_OVERRIDE_FILE
documentation for more details on this feature.
config BR2_GLOBAL_PATCH_DIR
- string "global patch directories"
+ string "global patch and hash directories"
help
You may specify a space separated list of one or more
- directories containing global package patches. For a specific
- version <packageversion> of a specific package <packagename>,
- patches are applied as follows:
+ directories containing global package patches and/or hashes.
+ For a specific version <packageversion> of a specific package
+ <packagename>, patches are looked up as follows:
First, the default Buildroot patch set for the package is
applied from the package's directory in Buildroot.
@@ -693,6 +693,8 @@ config BR2_GLOBAL_PATCH_DIR
exists, then all *.patch files in the directory will be
applied.
+ The hash files are looked up similarly to the patches.
+
menu "Advanced"
config BR2_FORCE_HOST_BUILD
diff --git a/docs/manual/adding-packages-directory.adoc b/docs/manual/adding-packages-directory.adoc
index 7150018a3b..5a0f298eb1 100644
--- a/docs/manual/adding-packages-directory.adoc
+++ b/docs/manual/adding-packages-directory.adoc
@@ -540,6 +540,12 @@ mercurial) because Buildroot currently does not generate reproducible
tarballs when source code is fetched from such version control
systems.
+Additionally, for packages for which it is possible to specify a custom
+version (e.g. a custom version string, a remote tarball URL, or a VCS
+repository location and changeset), Buildroot can't carry hashes for
+those. It is however possible to xref:customize-hashes[provide a list of
+extra hashes] that can cover such cases.
+
Hashes should only be added in +.hash+ files for files that are
guaranteed to be stable. For example, patches auto-generated by Github
are not guaranteed to be stable, and therefore their hashes can change
diff --git a/docs/manual/customize-patches.adoc b/docs/manual/customize-patches.adoc
index eb98d1bea2..72e87c3c04 100644
--- a/docs/manual/customize-patches.adoc
+++ b/docs/manual/customize-patches.adoc
@@ -1,8 +1,10 @@
// -*- mode:doc -*- ;
// vim: set syntax=asciidoc:
+=== Adding project-specific patches and hashes
+
[[customize-patches]]
-=== Adding project-specific patches
+==== Providing extra patches
It is sometimes useful to apply 'extra' patches to packages - on top of
those provided in Buildroot. This might be used to support custom
@@ -57,3 +59,23 @@ are available at a URL. *Note:* +BR2_LINUX_KERNEL_PATCH+ specifies kernel
patches that are applied after patches available in +BR2_GLOBAL_PATCH_DIR+,
as it is done from a post-patch hook of the Linux package.
+
+[[customize-hashes]]
+==== Providing extra hashes
+
+Buildroot bundles a xref:adding-packages-hash[list of hashes] against
+which it checks the integrity of the downloaded archives, or of those
+it generates locally from VCS checkouts. However, it can only do so
+for the known versions; for packages where it is possible to specify
+a custom version (e.g. a custom version string, a remote tarball URL,
+or a VCS repository location and changeset), Buildroot can't carry
+hashes for those.
+
+For users concerned with the integrity of such downloads, it is possible
+to provide a list of hashes that Buildroot can use to check arbitrary
+downloaded files. Those extra hashes are looked up similarly to the
+extra patches (above); for each directory in +BR2_GLOBAL_PATCH_DIR+,
+the first file to exist is used to check a package download:
+
+* +<global-patch-dir>/<packagename>/<packageversion>/<packagename>.hash+
+* +<global-patch-dir>/<packagename>/<packagename>.hash+
diff --git a/package/pkg-download.mk b/package/pkg-download.mk
index e5cd83d859..bf1c19e5ec 100644
--- a/package/pkg-download.mk
+++ b/package/pkg-download.mk
@@ -115,7 +115,7 @@ define DOWNLOAD
-d '$($(2)_DL_DIR)' \
-D '$(DL_DIR)' \
-f '$(notdir $(1))' \
- -H '$($(2)_HASH_FILE)' \
+ $(foreach f,$($(2)_HASH_FILES),-H '$(f)') \
-n '$($(2)_BASENAME_RAW)' \
-N '$($(2)_RAWNAME)' \
-o '$($(2)_DL_DIR)/$(notdir $(1))' \
diff --git a/package/pkg-generic.mk b/package/pkg-generic.mk
index 6c24be7505..577a148c1e 100644
--- a/package/pkg-generic.mk
+++ b/package/pkg-generic.mk
@@ -509,11 +509,15 @@ else
endif
$(2)_VERSION := $$(call sanitize,$$($(2)_DL_VERSION))
-$(2)_HASH_FILE = \
+$(2)_HASH_FILES = \
$$(strip \
- $$(if $$(wildcard $$($(2)_PKGDIR)/$$($(2)_VERSION)/$$($(2)_RAWNAME).hash),\
- $$($(2)_PKGDIR)/$$($(2)_VERSION)/$$($(2)_RAWNAME).hash,\
- $$($(2)_PKGDIR)/$$($(2)_RAWNAME).hash))
+ $$(foreach d, $$($(2)_PKGDIR) $$(addsuffix /$$($(2)_RAWNAME), $$(call qstrip,$$(BR2_GLOBAL_PATCH_DIR))),\
+ $$(if $$(wildcard $$(d)/$$($(2)_VERSION)/$$($(2)_RAWNAME).hash),\
+ $$(d)/$$($(2)_VERSION)/$$($(2)_RAWNAME).hash,\
+ $$(d)/$$($(2)_RAWNAME).hash\
+ )\
+ )\
+ )
ifdef $(3)_OVERRIDE_SRCDIR
$(2)_OVERRIDE_SRCDIR ?= $$($(3)_OVERRIDE_SRCDIR)
@@ -1138,7 +1142,7 @@ ifneq ($$(call qstrip,$$($(2)_SOURCE)),)
ifeq ($$(call qstrip,$$($(2)_LICENSE_FILES)),)
$(Q)$$(call legal-warning-pkg,$$($(2)_BASENAME_RAW),cannot save license ($(2)_LICENSE_FILES not defined))
else
- $(Q)$$(foreach F,$$($(2)_LICENSE_FILES),$$(call legal-license-file,$$(call UPPERCASE,$(4)),$$($(2)_RAWNAME),$$($(2)_BASENAME_RAW),$$(F),$$($(2)_DIR)/$$(F),$$($(2)_HASH_FILE))$$(sep))
+ $(Q)$$(foreach F,$$($(2)_LICENSE_FILES),$$(call legal-license-file,$$(call UPPERCASE,$(4)),$$($(2)_RAWNAME),$$($(2)_BASENAME_RAW),$$(F),$$($(2)_DIR)/$$(F),$$($(2)_HASH_FILES))$$(sep))
endif # license files
ifeq ($$($(2)_REDISTRIBUTE),YES)
diff --git a/package/pkg-utils.mk b/package/pkg-utils.mk
index b91061a572..059e86ae0a 100644
--- a/package/pkg-utils.mk
+++ b/package/pkg-utils.mk
@@ -280,7 +280,7 @@ define legal-manifest # {HOST|TARGET}, pkg, version, license, license-files, sou
echo '"$(2)","$(3)","$(4)","$(5)","$(6)","$(7)","$(8)"' >>$(LEGAL_MANIFEST_CSV_$(1))
endef
-define legal-license-file # {HOST|TARGET}, pkgname, pkgname-pkgver, filename, file-fullpath, pkg-hashfile
+define legal-license-file # {HOST|TARGET}, pkgname, pkgname-pkgver, filename, file-fullpath, pkg-hashfiles
mkdir -p $(LICENSE_FILES_DIR_$(1))/$(3)/$(dir $(4)) && \
{ \
support/download/check-hash $(5) $(4) $(6); \
--
2.25.1
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Buildroot] [PATCH 3/3 v2] pkg-download: add option to enforce hash checking
2023-11-06 19:09 [Buildroot] [PATCH 0/3 v2] support/download: accept user-provided list of extra hash files (branch yem/multi-hash) Yann E. MORIN
2023-11-06 19:09 ` [Buildroot] [PATCH 1/3 v2] support/download: teach dl-wrapper to handle more than one hash file Yann E. MORIN
2023-11-06 19:09 ` [Buildroot] [PATCH 2/3 v2] package/pkg-download: lookup hash files in global-patch-dir Yann E. MORIN
@ 2023-11-06 19:09 ` Yann E. MORIN
2023-11-07 10:48 ` Peter Korsgaard
2023-11-10 13:36 ` Peter Korsgaard
2 siblings, 2 replies; 10+ messages in thread
From: Yann E. MORIN @ 2023-11-06 19:09 UTC (permalink / raw)
To: buildroot; +Cc: Yann E. MORIN, Martin Zeiser (mzeiser)
Currently, when a pacakge is downloaded from a custom location or
version, Buildroot excludes such a package from the mandatory integrity
check with hashes, because it was until now not possible to have such
hashes.
We now have a mechanism which users can leverage to provide additional
hashes, and so custom versions or locations can now be checked too.
Buildroot has no way to know that hashes have indeed been provided for
a custom location/version, and so will still happilly ignore an
unchecked package.
However, users who do provide extra hashes most probably do expect that
no download is done without an integrity check, and thus expect that a
missing hash not be ignored.
Add an option that users can select to make Buildroot forcibly require
at least one valid hash, and no invalid hash, for all downloads.
Reported-by: "Martin Zeiser (mzeiser)" <mzeiser@cisco.com>
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
---
Config.in | 17 +++++++++++++++++
package/pkg-download.mk | 5 ++---
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/Config.in b/Config.in
index b344d0e80a..27f5deb16a 100644
--- a/Config.in
+++ b/Config.in
@@ -709,6 +709,23 @@ config BR2_FORCE_HOST_BUILD
This option will increase build time.
+config BR2_DOWNLOAD_FORCE_CHECK_HASHES
+ bool "Force all downloads to have a valid hash"
+ depends on BR2_GLOBAL_PATCH_DIR != ""
+ help
+ For packages where a custom version or location can be set,
+ Buildroot does not carry a hash for those custom versions or
+ locations, so the integrity of such downloads is not verified.
+
+ Say 'y' here to enforce downloads to have at least one valid
+ hash (and of course, that all hashes be valid).
+
+ Those hashes are looked in files in BR2_GLOBAL_PATCH_DIR,
+ see above.
+
+comment "Forcing all downloads to have a valid hash needs a global patch and hash directory"
+ depends on BR2_GLOBAL_PATCH_DIR = ""
+
config BR2_REPRODUCIBLE
bool "Make the build reproducible (experimental)"
# SOURCE_DATE_EPOCH support in toolchain-wrapper requires GCC 4.4
diff --git a/package/pkg-download.mk b/package/pkg-download.mk
index bf1c19e5ec..30eeb6b1fc 100644
--- a/package/pkg-download.mk
+++ b/package/pkg-download.mk
@@ -66,9 +66,7 @@ github = https://github.com/$(1)/$(2)/archive/$(3)
gitlab = https://gitlab.com/$(1)/$(2)/-/archive/$(3)
# Expressly do not check hashes for those files
-# Exported variables default to immediately expanded in some versions of
-# make, but we need it to be recursively-epxanded, so explicitly assign it.
-export BR_NO_CHECK_HASH_FOR =
+BR_NO_CHECK_HASH_FOR =
################################################################################
# DOWNLOAD_URIS - List the candidates URIs where to get the package from:
@@ -110,6 +108,7 @@ endif
define DOWNLOAD
$(Q)mkdir -p $($(2)_DL_DIR)
$(Q)$(EXTRA_ENV) $($(2)_DL_ENV) \
+ BR_NO_CHECK_HASH_FOR="$(if $(BR2_DOWNLOAD_FORCE_CHECK_HASHES),,$(BR_NO_CHECK_HASH_FOR))" \
flock $($(2)_DL_DIR)/.lock $(DL_WRAPPER) \
-c '$($(2)_DL_VERSION)' \
-d '$($(2)_DL_DIR)' \
--
2.25.1
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [Buildroot] [PATCH 1/3 v2] support/download: teach dl-wrapper to handle more than one hash file
2023-11-06 19:09 ` [Buildroot] [PATCH 1/3 v2] support/download: teach dl-wrapper to handle more than one hash file Yann E. MORIN
@ 2023-11-07 10:46 ` Peter Korsgaard
2023-11-10 13:36 ` Peter Korsgaard
0 siblings, 1 reply; 10+ messages in thread
From: Peter Korsgaard @ 2023-11-07 10:46 UTC (permalink / raw)
To: Yann E. MORIN; +Cc: Martin Zeiser (mzeiser), buildroot
>>>>> "Yann" == Yann E MORIN <yann.morin.1998@free.fr> writes:
> Currently, we expect and only use hash files that lie within the package
> directory, alongside the .mk file. Those hash files are thus bundeld
> with Buildroot.
> This implies that only what's known to Buildroot can ever get into those
> hash files. For packages where the version is fixed (or a static
> choice), then we can carry hashes for those known versions.
> However, we do have a few packages for which the version is a free-form
> entry, where the user can provide a custom location and/or version. like
> a custom VCS tree and revision, or a custom tarball URL. This means that
> Buildroot has no way to be able to cary hashes for such custom versions.
> This means that there is no integrity check that what was downloaded is
> what was expected. For a sha1 in a git tree, this is a minor issue,
> because the sha1 by itself is already a hash of the expected content.
> But for custom tarballs URLs, or for a tag in a VCS, there is indeed no
> integrity check.
> Buildroot can't provide such hashes, but interested users may want to
> provide those, and currently there is no (easy) way to do so.
> So, we need our download helpers to be able to accept more than one hash
> file to lookup for hashes.
> Extend the dl-wrapper and the check-hash helpers thusly, and update the
> legal-info accordingly.
> Note that, to be able to pass more than one hash file, we also need to
> re-order the arguments passed to support/download/check-hash, which also
> impies some shuffling in the three places it is called:
> - 2 in dl-wrapper
> - 1 in the legal-info infra
> That in turn also requires that the legal-license-file macro args get
> re-ordered to have the hash file last; we take the opportunity to also
> move the HOST/TARGET arg to be first, like in the other legal-info
> macros.
> Reported-by: "Martin Zeiser (mzeiser)" <mzeiser@cisco.com>
> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
> Cc: Peter Korsgaard <peter@korsgaard.com>
> ---
> Changes v1 -> v2:
> - restore legal-info (Peter K.)
Committed, thanks.
--
Bye, Peter Korsgaard
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Buildroot] [PATCH 2/3 v2] package/pkg-download: lookup hash files in global-patch-dir
2023-11-06 19:09 ` [Buildroot] [PATCH 2/3 v2] package/pkg-download: lookup hash files in global-patch-dir Yann E. MORIN
@ 2023-11-07 10:47 ` Peter Korsgaard
2023-11-10 13:36 ` Peter Korsgaard
1 sibling, 0 replies; 10+ messages in thread
From: Peter Korsgaard @ 2023-11-07 10:47 UTC (permalink / raw)
To: Yann E. MORIN; +Cc: Martin Zeiser (mzeiser), buildroot
>>>>> "Yann" == Yann E MORIN <yann.morin.1998@free.fr> writes:
> Currently, we expect and only use hash files that lie within the package
> directory, alongside the .mk file. Those hash files are thus bundled
> with Buildroot.
> This implies that only what's known to Buildroot can ever get into those
> hash files. For packages where the version is fixed (or a static
> choice), then we can carry hashes for those known versions.
> However, we do have a few packages for which the version is a free-form
> entry, where the user can provide a custom location and/or version. like
> a custom VCS tree and revision, or a custom tarball URL. This means that
> Buildroot has no way to be able to cary hashes for such custom versions.
> This means that there is no integrity check that what was downloaded is
> what was expected. For a sha1 in a git tree, this is a minor issue,
> because the sha1 by itself is already a hash of the expected content.
> But for custom tarballs URLs, or for a tag in a VCS, there is indeed no
> integrity check.
> Buildroot can't provide such hashes, but interested users may want to
> provide those, and currently there is no (easy) way to do so.
> We leverage the existng global-patch-dir mechanism to look for extra
> hash files. We use the same heuristic that is used for bundled hash
> files, and for each global patch directory <dir>, we use the first file
> to exist among:
> 1. look into <dir>/<package>/<version>/<package>.hash
> 2. look into <dir>/<package>/<package>.hash
> Reported-by: "Martin Zeiser (mzeiser)" <mzeiser@cisco.com>
> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
> ---
> Changes v1 -> v2:
> - drop <dir>/all.hash
Committed, thanks.
--
Bye, Peter Korsgaard
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Buildroot] [PATCH 3/3 v2] pkg-download: add option to enforce hash checking
2023-11-06 19:09 ` [Buildroot] [PATCH 3/3 v2] pkg-download: add option to enforce hash checking Yann E. MORIN
@ 2023-11-07 10:48 ` Peter Korsgaard
2023-11-10 13:36 ` Peter Korsgaard
1 sibling, 0 replies; 10+ messages in thread
From: Peter Korsgaard @ 2023-11-07 10:48 UTC (permalink / raw)
To: Yann E. MORIN; +Cc: Martin Zeiser (mzeiser), buildroot
>>>>> "Yann" == Yann E MORIN <yann.morin.1998@free.fr> writes:
> Currently, when a pacakge is downloaded from a custom location or
> version, Buildroot excludes such a package from the mandatory integrity
> check with hashes, because it was until now not possible to have such
> hashes.
> We now have a mechanism which users can leverage to provide additional
> hashes, and so custom versions or locations can now be checked too.
> Buildroot has no way to know that hashes have indeed been provided for
> a custom location/version, and so will still happilly ignore an
> unchecked package.
> However, users who do provide extra hashes most probably do expect that
> no download is done without an integrity check, and thus expect that a
> missing hash not be ignored.
> Add an option that users can select to make Buildroot forcibly require
> at least one valid hash, and no invalid hash, for all downloads.
> Reported-by: "Martin Zeiser (mzeiser)" <mzeiser@cisco.com>
> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Committed, thanks.
--
Bye, Peter Korsgaard
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Buildroot] [PATCH 1/3 v2] support/download: teach dl-wrapper to handle more than one hash file
2023-11-07 10:46 ` Peter Korsgaard
@ 2023-11-10 13:36 ` Peter Korsgaard
0 siblings, 0 replies; 10+ messages in thread
From: Peter Korsgaard @ 2023-11-10 13:36 UTC (permalink / raw)
To: Yann E. MORIN; +Cc: Martin Zeiser (mzeiser), buildroot
>>>>> "Peter" == Peter Korsgaard <peter@korsgaard.com> writes:
>>>>> "Yann" == Yann E MORIN <yann.morin.1998@free.fr> writes:
>> Currently, we expect and only use hash files that lie within the package
>> directory, alongside the .mk file. Those hash files are thus bundeld
>> with Buildroot.
>> This implies that only what's known to Buildroot can ever get into those
>> hash files. For packages where the version is fixed (or a static
>> choice), then we can carry hashes for those known versions.
>> However, we do have a few packages for which the version is a free-form
>> entry, where the user can provide a custom location and/or version. like
>> a custom VCS tree and revision, or a custom tarball URL. This means that
>> Buildroot has no way to be able to cary hashes for such custom versions.
>> This means that there is no integrity check that what was downloaded is
>> what was expected. For a sha1 in a git tree, this is a minor issue,
>> because the sha1 by itself is already a hash of the expected content.
>> But for custom tarballs URLs, or for a tag in a VCS, there is indeed no
>> integrity check.
>> Buildroot can't provide such hashes, but interested users may want to
>> provide those, and currently there is no (easy) way to do so.
>> So, we need our download helpers to be able to accept more than one hash
>> file to lookup for hashes.
>> Extend the dl-wrapper and the check-hash helpers thusly, and update the
>> legal-info accordingly.
>> Note that, to be able to pass more than one hash file, we also need to
>> re-order the arguments passed to support/download/check-hash, which also
>> impies some shuffling in the three places it is called:
>> - 2 in dl-wrapper
>> - 1 in the legal-info infra
>> That in turn also requires that the legal-license-file macro args get
>> re-ordered to have the hash file last; we take the opportunity to also
>> move the HOST/TARGET arg to be first, like in the other legal-info
>> macros.
>> Reported-by: "Martin Zeiser (mzeiser)" <mzeiser@cisco.com>
>> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
>> Cc: Peter Korsgaard <peter@korsgaard.com>
>> ---
>> Changes v1 -> v2:
>> - restore legal-info (Peter K.)
> Committed, thanks.
Committed to 2023.02.x and 2023.08.x, thanks.
--
Bye, Peter Korsgaard
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Buildroot] [PATCH 2/3 v2] package/pkg-download: lookup hash files in global-patch-dir
2023-11-06 19:09 ` [Buildroot] [PATCH 2/3 v2] package/pkg-download: lookup hash files in global-patch-dir Yann E. MORIN
2023-11-07 10:47 ` Peter Korsgaard
@ 2023-11-10 13:36 ` Peter Korsgaard
1 sibling, 0 replies; 10+ messages in thread
From: Peter Korsgaard @ 2023-11-10 13:36 UTC (permalink / raw)
To: Yann E. MORIN; +Cc: Martin Zeiser (mzeiser), buildroot
>>>>> "Yann" == Yann E MORIN <yann.morin.1998@free.fr> writes:
> Currently, we expect and only use hash files that lie within the package
> directory, alongside the .mk file. Those hash files are thus bundled
> with Buildroot.
> This implies that only what's known to Buildroot can ever get into those
> hash files. For packages where the version is fixed (or a static
> choice), then we can carry hashes for those known versions.
> However, we do have a few packages for which the version is a free-form
> entry, where the user can provide a custom location and/or version. like
> a custom VCS tree and revision, or a custom tarball URL. This means that
> Buildroot has no way to be able to cary hashes for such custom versions.
> This means that there is no integrity check that what was downloaded is
> what was expected. For a sha1 in a git tree, this is a minor issue,
> because the sha1 by itself is already a hash of the expected content.
> But for custom tarballs URLs, or for a tag in a VCS, there is indeed no
> integrity check.
> Buildroot can't provide such hashes, but interested users may want to
> provide those, and currently there is no (easy) way to do so.
> We leverage the existng global-patch-dir mechanism to look for extra
> hash files. We use the same heuristic that is used for bundled hash
> files, and for each global patch directory <dir>, we use the first file
> to exist among:
> 1. look into <dir>/<package>/<version>/<package>.hash
> 2. look into <dir>/<package>/<package>.hash
> Reported-by: "Martin Zeiser (mzeiser)" <mzeiser@cisco.com>
> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
> ---
> Changes v1 -> v2:
> - drop <dir>/all.hash
Committed to 2023.02.x and 2023.08.x, thanks.
--
Bye, Peter Korsgaard
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Buildroot] [PATCH 3/3 v2] pkg-download: add option to enforce hash checking
2023-11-06 19:09 ` [Buildroot] [PATCH 3/3 v2] pkg-download: add option to enforce hash checking Yann E. MORIN
2023-11-07 10:48 ` Peter Korsgaard
@ 2023-11-10 13:36 ` Peter Korsgaard
1 sibling, 0 replies; 10+ messages in thread
From: Peter Korsgaard @ 2023-11-10 13:36 UTC (permalink / raw)
To: Yann E. MORIN; +Cc: Martin Zeiser (mzeiser), buildroot
>>>>> "Yann" == Yann E MORIN <yann.morin.1998@free.fr> writes:
> Currently, when a pacakge is downloaded from a custom location or
> version, Buildroot excludes such a package from the mandatory integrity
> check with hashes, because it was until now not possible to have such
> hashes.
> We now have a mechanism which users can leverage to provide additional
> hashes, and so custom versions or locations can now be checked too.
> Buildroot has no way to know that hashes have indeed been provided for
> a custom location/version, and so will still happilly ignore an
> unchecked package.
> However, users who do provide extra hashes most probably do expect that
> no download is done without an integrity check, and thus expect that a
> missing hash not be ignored.
> Add an option that users can select to make Buildroot forcibly require
> at least one valid hash, and no invalid hash, for all downloads.
> Reported-by: "Martin Zeiser (mzeiser)" <mzeiser@cisco.com>
> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Committed to 2023.02.x and 2023.08.x, thanks.
--
Bye, Peter Korsgaard
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-11-10 13:37 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-06 19:09 [Buildroot] [PATCH 0/3 v2] support/download: accept user-provided list of extra hash files (branch yem/multi-hash) Yann E. MORIN
2023-11-06 19:09 ` [Buildroot] [PATCH 1/3 v2] support/download: teach dl-wrapper to handle more than one hash file Yann E. MORIN
2023-11-07 10:46 ` Peter Korsgaard
2023-11-10 13:36 ` Peter Korsgaard
2023-11-06 19:09 ` [Buildroot] [PATCH 2/3 v2] package/pkg-download: lookup hash files in global-patch-dir Yann E. MORIN
2023-11-07 10:47 ` Peter Korsgaard
2023-11-10 13:36 ` Peter Korsgaard
2023-11-06 19:09 ` [Buildroot] [PATCH 3/3 v2] pkg-download: add option to enforce hash checking Yann E. MORIN
2023-11-07 10:48 ` Peter Korsgaard
2023-11-10 13:36 ` Peter Korsgaard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox