Kaynağa Gözat

show more details for "Hash Sum mismatch" errors

Users tend to report these errors with just this error message… not very
actionable and hard to figure out if this is a temporary or 'permanent'
mirror-sync issue or even the occasional apt bug.

Showing the involved hashsums and modification times should help in
triaging these kind of bugs – and eventually we will have less of them
via by-hash.

The subheaders aren't marked for translation for now as they are
technical glibberish and probably easier to deal with if not translated.
After all, our iconic "Hash Sum mismatch" is translated at least.

These additions were proposed in #817240 by Peter Palfrader.
David Kalnischkies 10 yıl önce
ebeveyn
işleme
0340069cc4

+ 47 - 13
apt-pkg/acquire-item.cc

@@ -650,8 +650,6 @@ APT_CONST bool pkgAcquire::Item::IsTrusted() const			/*{{{*/
    fetch this object */
 void pkgAcquire::Item::Failed(string const &Message,pkgAcquire::MethodConfig const * const Cnf)
 {
-   if(ErrorText.empty())
-      ErrorText = LookupTag(Message,"Message");
    if (QueueCounter <= 1)
    {
       /* This indicates that the file is not available right now but might
@@ -681,18 +679,37 @@ void pkgAcquire::Item::Failed(string const &Message,pkgAcquire::MethodConfig con
       Dequeue();
    }
 
+   if(ErrorText.empty())
+   {
+      if (Status == StatAuthError)
+      {
+	 std::ostringstream out;
+	 out << _("Hash Sum mismatch") << std::endl;
+	 out << "Hashes of expected file:" << std::endl;
+	 for (auto const &hs: GetExpectedHashes())
+	    out << " - " << hs.toStr() << std::endl;
+	 out << "Hashes of received file:" << std::endl;
+	 for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type)
+	 {
+	    std::string const tagname = std::string(*type) + "-Hash";
+	    std::string const hashsum = LookupTag(Message, tagname.c_str());
+	    if (hashsum.empty() == false)
+	       out << " - " << HashString(*type, hashsum).toStr() << std::endl;
+	 }
+	 out << "Last modification reported: " << LookupTag(Message, "Last-Modified", "<none>") << std::endl;
+	 ErrorText = out.str();
+      }
+      else
+	 ErrorText = LookupTag(Message,"Message");
+   }
+
    string const FailReason = LookupTag(Message, "FailReason");
    if (FailReason == "MaximumSizeExceeded")
-   {
       RenameOnError(MaximumSizeExceeded);
-      ReportMirrorFailureToCentral(*this, FailReason, ErrorText);
-   }
    else if (Status == StatAuthError)
-   {
       RenameOnError(HashSumMismatch);
-      ReportMirrorFailureToCentral(*this, "HashChecksumFailure", ErrorText);
-   }
-   else if (FailReason.empty() == false)
+
+   if (FailReason.empty() == false)
       ReportMirrorFailureToCentral(*this, FailReason, ErrorText);
    else
       ReportMirrorFailureToCentral(*this, ErrorText, ErrorText);
@@ -1769,6 +1786,23 @@ pkgAcqBaseIndex::pkgAcqBaseIndex(pkgAcquire * const Owner,
       IndexTarget const &Target)
 : pkgAcqTransactionItem(Owner, TransactionManager, Target), d(NULL)
 {
+}
+									/*}}}*/
+void pkgAcqBaseIndex::Failed(std::string const &Message,pkgAcquire::MethodConfig const * const Cnf)/*{{{*/
+{
+   pkgAcquire::Item::Failed(Message, Cnf);
+   if (TransactionManager == nullptr || ErrorText.empty() ||
+	 TransactionManager->MetaIndexParser == nullptr ||
+	 LookupTag(Message, "FailReason") != "HashSumMismatch")
+      return;
+
+   ErrorText.append("Release file created at: ");
+   auto const timespec = TransactionManager->MetaIndexParser->GetDate();
+   if (timespec == 0)
+      ErrorText.append("<unknown>");
+   else
+      ErrorText.append(TimeRFC1123(timespec));
+   ErrorText.append("\n");
 }
 									/*}}}*/
 pkgAcqBaseIndex::~pkgAcqBaseIndex() {}
@@ -2210,7 +2244,7 @@ bool pkgAcqDiffIndex::ParseDiffIndex(string const &IndexDiffFile)	/*{{{*/
 									/*}}}*/
 void pkgAcqDiffIndex::Failed(string const &Message,pkgAcquire::MethodConfig const * const Cnf)/*{{{*/
 {
-   Item::Failed(Message,Cnf);
+   pkgAcqBaseIndex::Failed(Message,Cnf);
    Status = StatDone;
 
    if(Debug)
@@ -2291,7 +2325,7 @@ pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire * const Owner,
 									/*}}}*/
 void pkgAcqIndexDiffs::Failed(string const &Message,pkgAcquire::MethodConfig const * const Cnf)/*{{{*/
 {
-   Item::Failed(Message,Cnf);
+   pkgAcqBaseIndex::Failed(Message,Cnf);
    Status = StatDone;
 
    DestFile = GetKeepCompressedFileName(GetPartialFileNameFromURI(Target.URI), Target);
@@ -2496,7 +2530,7 @@ void pkgAcqIndexMergeDiffs::Failed(string const &Message,pkgAcquire::MethodConfi
    if(Debug)
       std::clog << "pkgAcqIndexMergeDiffs failed: " << Desc.URI << " with " << Message << std::endl;
 
-   Item::Failed(Message,Cnf);
+   pkgAcqBaseIndex::Failed(Message,Cnf);
    Status = StatDone;
 
    // check if we are the first to fail, otherwise we are done here
@@ -2734,7 +2768,7 @@ string pkgAcqIndex::Custom600Headers() const
 // AcqIndex::Failed - getting the indexfile failed			/*{{{*/
 void pkgAcqIndex::Failed(string const &Message,pkgAcquire::MethodConfig const * const Cnf)
 {
-   Item::Failed(Message,Cnf);
+   pkgAcqBaseIndex::Failed(Message,Cnf);
 
    // authorisation matches will not be fixed by other compression types
    if (Status != StatAuthError)

+ 1 - 0
apt-pkg/acquire-item.h

@@ -609,6 +609,7 @@ class APT_HIDDEN pkgAcqBaseIndex : public pkgAcqTransactionItem
  public:
    /** \brief Get the full pathname of the final file for the current URI */
    virtual std::string GetFinalFilename() const APT_OVERRIDE;
+   virtual void Failed(std::string const &Message,pkgAcquire::MethodConfig const * const Cnf) APT_OVERRIDE;
 
    pkgAcqBaseIndex(pkgAcquire * const Owner, pkgAcqMetaClearSig * const TransactionManager,
                    IndexTarget const &Target);

+ 3 - 0
apt-pkg/acquire-worker.cc

@@ -439,7 +439,10 @@ bool pkgAcquire::Worker::RunMessages()
 	       else
 	       {
 		  if (isDoomedItem(Owner) == false)
+		  {
+		     Message.append("\nFailReason: HashSumMismatch");
 		     Owner->Failed(Message,Config);
+		  }
 		  if (Log != nullptr)
 		     Log->Fail(Owner->GetItemDesc());
 	       }

+ 13 - 7
test/integration/framework

@@ -217,6 +217,12 @@ gdb() {
 	fi
 	runapt command gdb --quiet -ex run "$CMD" --args "$CMD" "$@"
 }
+lastmodification() {
+	date -u -d "@$(stat -c '%Y' "${TMPWORKINGDIRECTORY}/$1")" '+%a, %d %b %Y %H:%M:%S GMT'
+}
+releasefiledate() {
+	grep "^${2:-Date}:" "$1" | cut -d' ' -f 2- | sed -e 's#UTC#GMT#'
+}
 
 exitwithstatus() {
         # error if we about to overflow, but ...
@@ -595,12 +601,12 @@ setupsimplenativepackage() {
 	mkdir -p ${BUILDDIR}/debian/source
 	cd ${BUILDDIR}
 	echo "* most suckless software product ever" > FEATURES
-	test -e debian/copyright || echo "Copyleft by Joe Sixpack $(date +%Y)" > debian/copyright
+	test -e debian/copyright || echo "Copyleft by Joe Sixpack $(date -u +%Y)" > debian/copyright
 	test -e debian/changelog || echo "$NAME ($VERSION) $RELEASE; urgency=low
 
   * Initial release
 
- -- Joe Sixpack <joe@example.org>  $(date -R)" > debian/changelog
+ -- Joe Sixpack <joe@example.org>  $(date -u -R)" > debian/changelog
 	test -e debian/control || echo "Source: $NAME
 Section: $SECTION
 Priority: optional
@@ -658,12 +664,12 @@ buildsimplenativepackage() {
 	echo "#!/bin/sh
 echo '$NAME says \"Hello!\"'" > "${BUILDDIR}/${NAME}"
 
-	echo "Copyleft by Joe Sixpack $(date +%Y)" > "${BUILDDIR}/debian/copyright"
+	echo "Copyleft by Joe Sixpack $(date -u +%Y)" > "${BUILDDIR}/debian/copyright"
 	echo "$NAME ($VERSION) $RELEASE; urgency=low
 
   * Initial release
 
- -- Joe Sixpack <joe@example.org>  $(date -R)" > "${BUILDDIR}/debian/changelog"
+ -- Joe Sixpack <joe@example.org>  $(date -u -R)" > "${BUILDDIR}/debian/changelog"
 	{
 		echo "Source: $NAME
 Priority: $PRIORITY
@@ -1014,13 +1020,13 @@ NotAutomatic: yes' "$dir/Release"
 	fi
 	if [ -n "$DATE" -a "$DATE" != "now" ]; then
 		for release in $(find ./aptarchive -name 'Release'); do
-			sed -i "s/^Date: .*$/Date: $(date -d "$DATE" '+%a, %d %b %Y %H:%M:%S %Z')/" "$release"
+			sed -i "s/^Date: .*$/Date: $(date -u -d "$DATE" '+%a, %d %b %Y %H:%M:%S %Z')/" "$release"
 			touch -d "$DATE" "$release"
 		done
 	fi
 	if [ -n "$VALIDUNTIL" ]; then
 		sed -i "/^Date: / a\
-Valid-Until: $(date -d "$VALIDUNTIL" '+%a, %d %b %Y %H:%M:%S %Z')" $(find ./aptarchive -name 'Release')
+Valid-Until: $(date -u -d "$VALIDUNTIL" '+%a, %d %b %Y %H:%M:%S %Z')" $(find ./aptarchive -name 'Release')
 	fi
 	msgdone "info"
 }
@@ -1119,7 +1125,7 @@ signreleasefiles() {
 }
 
 redatereleasefiles() {
-	local DATE="$(date -d "$1" '+%a, %d %b %Y %H:%M:%S %Z')"
+	local DATE="$(date -u -d "$1" '+%a, %d %b %Y %H:%M:%S %Z')"
 	for release in $(find aptarchive/ -name 'Release'); do
 		sed -i "s/^Date: .*$/Date: ${DATE}/" "$release"
 		touch -d "$DATE" "$release"

+ 15 - 0
test/integration/test-apt-helper

@@ -34,12 +34,27 @@ test_apt_helper_download() {
     msgtest 'apt-file download-file' 'wrong md5sum'
     testfailure --nomsg apthelper -qq download-file "${1}/foo" './downloaded/foo5' 'MD5Sum:aabbcc'
     testfileequal rootdir/tmp/testfailure.output "E: Failed to fetch ${1}/foo  Hash Sum mismatch
+   Hashes of expected file:
+    - MD5Sum:aabbcc
+   Hashes of received file:
+    - SHA512:0cf9180a764aba863a67b6d72f0918bc131c6772642cb2dce5a34f0a702f9470ddc2bf125c12198b1995c233c34b4afd346c54a2334c350a948a51b6e8b4e6b6
+    - SHA256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
+    - SHA1:f1d2d2f924e986ac86fdf7b36c94bcdf32beec15
+    - MD5Sum:d3b07384d113edec49eaa6238ad5ff00
+    - Checksum-FileSize:4
+   Last modification reported: $(lastmodification 'aptarchive/foo')
 E: Download Failed"
     testfileequal ./downloaded/foo5.FAILED 'foo'
 
     msgtest 'apt-file download-file' 'wrong sha256'
     testfailure --nomsg apthelper -qq download-file "${1}/foo" './downloaded/foo6' 'SHA256:aabbcc'
     testfileequal rootdir/tmp/testfailure.output "E: Failed to fetch ${1}/foo  Hash Sum mismatch
+   Hashes of expected file:
+    - SHA256:aabbcc
+   Hashes of received file:
+    - SHA256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
+    - Checksum-FileSize:4
+   Last modification reported: $(lastmodification 'aptarchive/foo')
 E: Download Failed"
     testfileequal './downloaded/foo6.FAILED' 'foo'
 

+ 39 - 8
test/integration/test-apt-update-not-modified

@@ -6,6 +6,7 @@ TESTDIR="$(readlink -f "$(dirname "$0")")"
 
 setupenvironment
 configarchitecture 'amd64' 'i386'
+confighashes 'SHA256'
 
 insertpackage 'unstable' 'apt' 'amd64,i386' '1.0'
 
@@ -34,10 +35,9 @@ Reading package lists..." aptget update
 	# readd arch so its downloaded again…
 	configarchitecture 'amd64' 'i386'
 	# … but oh noes, hashsum mismatch!
-        SIZE=$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
-	find aptarchive/dists/unstable/main/binary-amd64/ -type f -delete
-	cat >> aptarchive/dists/unstable/main/binary-amd64/Packages <<EOF
-
+	SIZE=$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+	mv aptarchive/dists/unstable/main/binary-amd64/Packages.gz aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig
+	cat > aptarchive/dists/unstable/main/binary-amd64/Packages <<EOF
 Package: thisisbad
 Architecture: amd64
 Version: 1
@@ -47,8 +47,24 @@ EOF
 Get:2 $1 unstable/main amd64 Packages [$SIZE B]
 Err:2 $1 unstable/main amd64 Packages
   Hash Sum mismatch
+  Hashes of expected file:
+   - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig')
+   - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig' | cut -d' ' -f 1)
+  Hashes of received file:
+   - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1)
+   - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+  Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+  Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease')
 Reading package lists...
 E: Failed to fetch $1/dists/unstable/main/binary-amd64/Packages.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig')
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig' | cut -d' ' -f 1)
+   Hashes of received file:
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1)
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+   Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+   Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease')
 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update
 	testfileequal 'listsdir-without-amd64.lst' "$(listcurrentlistsdirectory)"
 	rm -rf aptarchive/dists
@@ -93,10 +109,9 @@ Reading package lists..." aptget update
 	# readd arch so its downloaded again…
 	configarchitecture 'amd64' 'i386'
 	# … but oh noes, hashsum mismatch!
-        SIZE=$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
-	find aptarchive/dists/unstable/main/binary-amd64/ -type f -delete
-	cat >> aptarchive/dists/unstable/main/binary-amd64/Packages <<EOF
-
+	SIZE=$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+	mv aptarchive/dists/unstable/main/binary-amd64/Packages.gz aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig
+	cat > aptarchive/dists/unstable/main/binary-amd64/Packages <<EOF
 Package: thisisbad
 Architecture: amd64
 Version: 1
@@ -108,8 +123,24 @@ Hit:2 $1 unstable Release
 Get:4 $1 unstable/main amd64 Packages [$SIZE B]
 Err:4 $1 unstable/main amd64 Packages
   Hash Sum mismatch
+  Hashes of expected file:
+   - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig')
+   - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig' | cut -d' ' -f 1)
+  Hashes of received file:
+   - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1)
+   - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+  Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+  Release file created at: $(releasefiledate 'aptarchive/dists/unstable/Release')
 Reading package lists...
 E: Failed to fetch $1/dists/unstable/main/binary-amd64/Packages.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig')
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig' | cut -d' ' -f 1)
+   Hashes of received file:
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1)
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+   Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+   Release file created at: $(releasefiledate 'aptarchive/dists/unstable/Release')
 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update
 	testfileequal 'listsdir-without-amd64.lst' "$(listcurrentlistsdirectory)"
 	rm -rf aptarchive/dists

+ 17 - 0
test/integration/test-apt-update-rollback

@@ -30,6 +30,7 @@ add_new_package() {
 }
 
 break_repository_sources_index() {
+    mv "$APTARCHIVE/dists/unstable/main/source/Sources.gz" "$APTARCHIVE/dists/unstable/main/source/Sources.gz.orig"
     printf 'xxx' > "$APTARCHIVE/dists/unstable/main/source/Sources"
     compressfile "$APTARCHIVE/dists/unstable/main/source/Sources" "$@"
 }
@@ -61,6 +62,14 @@ test_inrelease_to_broken_hash_reverts_all() {
 
     # test the error condition
     testfailureequal "E: Failed to fetch file:${APTARCHIVE}/dists/unstable/main/source/Sources.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz.orig')
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz.orig' | cut -d' ' -f 1)
+   Hashes of received file:
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz' | cut -d' ' -f 1)
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz')
+   Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/source/Sources.gz')
+   Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease')
 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
     # ensure that the Packages file is also rolled back
     testfileequal lists.before "$(listcurrentlistsdirectory)"
@@ -127,6 +136,14 @@ E: There were unauthenticated packages and -y was used without --allow-unauthent
     break_repository_sources_index '+1hour'
 
     testfailureequal "E: Failed to fetch file:$APTARCHIVE/dists/unstable/main/source/Sources.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz.orig')
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz.orig' | cut -d' ' -f 1)
+   Hashes of received file:
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz' | cut -d' ' -f 1)
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz')
+   Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/source/Sources.gz')
+   Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease')
 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
 
     testfileequal lists.before "$(listcurrentlistsdirectory)"

+ 124 - 0
test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum

@@ -220,8 +220,74 @@ Err:1 http://localhost:${APTHTTPPORT}  $1 1.0 (dsc)
 Get:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar) [4 B]
 Err:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar)
   Hash Sum mismatch
+  Hashes of expected file:
+   - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+   - Checksum-FileSize:4
+  Hashes of received file:
+   - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+   - Checksum-FileSize:3
+  Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc")
 E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.dsc  Writing more data than expected (3 > 2)
 E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.tar.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+    - Checksum-FileSize:4
+   Hashes of received file:
+    - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc")
+E: Failed to fetch some archives."
+	elif [ "$1" = 'pkg-md5-bad' ]; then
+		FAILURE="Reading package lists...
+Need to get 6 B of source archives.
+Get:1 http://localhost:${APTHTTPPORT}  $1 1.0 (dsc) [3 B]
+Err:1 http://localhost:${APTHTTPPORT}  $1 1.0 (dsc)
+  Hash Sum mismatch
+  Hashes of expected file:
+   - MD5Sum:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+   - Checksum-FileSize:3
+  Hashes of received file:
+   - SHA512:e52b7bb395ea3f46974f1f65b7c5975839aad32d4e2ec0f458f735d5aa24d2bf36d7816ed1e01dc3c493e11879e9a8f66dfca42821608cfe993996929a6be18a
+   - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a
+   - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+   - MD5Sum:9604ba9427a280db542279d9ed78400b
+   - Checksum-FileSize:3
+  Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc")
+Get:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar) [3 B]
+Err:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar)
+  Hash Sum mismatch
+  Hashes of expected file:
+   - MD5Sum:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+   - Checksum-FileSize:3
+  Hashes of received file:
+   - SHA512:5aa4cad81553320574eb72ee92bd45a1f0575528e257749dff298b2a33df9e7fc7f5c1c87fc1c8fde230f1234cca3a99bf8625a0ff7bb3238eb7e5473f9b43c0
+   - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+   - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+   - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+   - Checksum-FileSize:3
+  Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz")
+E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.dsc  Hash Sum mismatch
+   Hashes of expected file:
+    - MD5Sum:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+    - Checksum-FileSize:3
+   Hashes of received file:
+    - SHA512:e52b7bb395ea3f46974f1f65b7c5975839aad32d4e2ec0f458f735d5aa24d2bf36d7816ed1e01dc3c493e11879e9a8f66dfca42821608cfe993996929a6be18a
+    - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a
+    - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+    - MD5Sum:9604ba9427a280db542279d9ed78400b
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc")
+E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.tar.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - MD5Sum:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+    - Checksum-FileSize:3
+   Hashes of received file:
+    - SHA512:5aa4cad81553320574eb72ee92bd45a1f0575528e257749dff298b2a33df9e7fc7f5c1c87fc1c8fde230f1234cca3a99bf8625a0ff7bb3238eb7e5473f9b43c0
+    - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+    - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+    - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz")
 E: Failed to fetch some archives."
 	else
 		FAILURE="Reading package lists...
@@ -229,11 +295,55 @@ Need to get 6 B of source archives.
 Get:1 http://localhost:${APTHTTPPORT}  $1 1.0 (dsc) [3 B]
 Err:1 http://localhost:${APTHTTPPORT}  $1 1.0 (dsc)
   Hash Sum mismatch
+  Hashes of expected file:
+   - SHA256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+   - Checksum-FileSize:3
+   - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+   - MD5Sum:9604ba9427a280db542279d9ed78400b
+  Hashes of received file:
+   - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a
+   - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+   - MD5Sum:9604ba9427a280db542279d9ed78400b
+   - Checksum-FileSize:3
+  Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc")
 Get:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar) [3 B]
 Err:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar)
   Hash Sum mismatch
+  Hashes of expected file:
+   - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+   - Checksum-FileSize:3
+   - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+   - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+  Hashes of received file:
+   - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+   - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+   - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+   - Checksum-FileSize:3
+  Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz")
 E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.dsc  Hash Sum mismatch
+   Hashes of expected file:
+    - SHA256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+    - Checksum-FileSize:3
+    - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+    - MD5Sum:9604ba9427a280db542279d9ed78400b
+   Hashes of received file:
+    - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a
+    - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+    - MD5Sum:9604ba9427a280db542279d9ed78400b
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc")
 E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.tar.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+    - Checksum-FileSize:3
+    - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+    - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+   Hashes of received file:
+    - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+    - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+    - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz")
 E: Failed to fetch some archives."
 	fi
 	testfailureequal "$FAILURE" aptget source -d "$@"
@@ -311,7 +421,21 @@ Need to get 3 B of source archives.
 Get:1 http://localhost:${APTHTTPPORT}  pkg-mixed-sha2-bad 1.0 (tar) [3 B]
 Err:1 http://localhost:${APTHTTPPORT}  pkg-mixed-sha2-bad 1.0 (tar)
   Hash Sum mismatch
+  Hashes of expected file:
+   - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+   - Checksum-FileSize:3
+  Hashes of received file:
+   - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+   - Checksum-FileSize:3
+  Last modification reported: $(lastmodification 'aptarchive/pkg-mixed-sha2-bad_1.0.tar.gz')
 E: Failed to fetch http://localhost:${APTHTTPPORT}/pkg-mixed-sha2-bad_1.0.tar.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+    - Checksum-FileSize:3
+   Hashes of received file:
+    - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification 'aptarchive/pkg-mixed-sha2-bad_1.0.tar.gz')
 E: Failed to fetch some archives." aptget source -d pkg-mixed-sha2-bad
 
 # it gets even more pathologic: multiple entries for one file, some even disagreeing!