git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5 04/39] t3404: prepare 'short SHA-1 collision' tests for SHA-256

From
brian m. carlson <sandals@crustytoothpaste.net>
Date
Jul 28, 2020, 23:34 UTC
Message-ID
<20200728233446.3066485-5-sandals@crustytoothpaste.net>
In-Reply-To
<20200728233446.3066485-1-sandals@crustytoothpaste.net>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

The idea of the magic value "ac4f2ee" in this test is to make the reworded commit `collide2` have the same shortened ID as the commit `collide3`.

To port the same idea to the SHA-256 version of Git, we therefore need another magic value that causes the same collision, but this time with the SHA-256 version of the commit IDs.

In this patch, we add code guarded by `GIT_TEST_FIND_COLLIDER` to do exactly that. Essentially, a large number of integers is appended to the commit message "collide2" to find such a collision. To make it easier to find such a collision, we reduce the number of digits to 4.

As the tests are no longer dependent on SHA-1, we also rename their titles to talk about "commit IDs" instead of "SHA-1s".

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
---
 t/t3404-rebase-interactive.sh | 50 ++++++++++++++++++++++++++++-------
 1 file changed, 41 insertions(+), 9 deletions(-)
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 4a7d21f898..2fb2c581cb 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -30,6 +30,7 @@ Initial setup:
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
 test_expect_success 'setup' '
+	test_oid_init &&
 	test_commit A file1 &&
 	test_commit B file1 &&
 	test_commit C file2 &&
@@ -1250,7 +1251,7 @@ test_expect_success 'rebase -i error on commits with \ in message' '
 	test_expect_code 1 grep  "	emp" error
 '
 
-test_expect_success SHA1 'short SHA-1 setup' '
+test_expect_success 'short commit ID setup' '
 	test_when_finished "git checkout master" &&
 	git checkout --orphan collide &&
 	git rm -rf . &&
@@ -1262,23 +1263,54 @@ test_expect_success SHA1 'short SHA-1 setup' '
 	)
 '
 
-test_expect_success SHA1 'short SHA-1 collide' '
+if test -n "$GIT_TEST_FIND_COLLIDER"
+then
+	author="$(unset test_tick; test_tick; git var GIT_AUTHOR_IDENT)"
+	committer="$(unset test_tick; test_tick; git var GIT_COMMITTER_IDENT)"
+	blob="$(git rev-parse collide2:collide)"
+	from="$(git rev-parse collide1^0)"
+	repl="commit refs/heads/collider-&\\n"
+	repl="${repl}author $author\\ncommitter $committer\\n"
+	repl="${repl}data <<EOF\\ncollide2 &\\nEOF\\n"
+	repl="${repl}from $from\\nM 100644 $blob collide\\n"
+	test_seq 1 32768 | sed "s|.*|$repl|" >script &&
+	git fast-import <script &&
+	git pack-refs &&
+	git for-each-ref >refs &&
+	grep "^$(test_oid t3404_collision)" <refs >matches &&
+	cat matches &&
+	test_line_count -gt 2 matches || {
+		echo "Could not find a collider" >&2
+		exit 1
+	}
+fi
+
+test_expect_success 'short commit ID collide' '
+	test_oid_cache <<-EOF &&
+	# collision-related constants
+	t3404_collision	sha1:6bcd
+	t3404_collision	sha256:0161
+	t3404_collider	sha1:ac4f2ee
+	t3404_collider	sha256:16697
+	EOF
 	test_when_finished "reset_rebase && git checkout master" &&
 	git checkout collide &&
-	colliding_sha1=6bcda37 &&
-	test $colliding_sha1 = "$(git rev-parse HEAD | cut -c 1-7)" &&
+	colliding_id=$(test_oid t3404_collision) &&
+	hexsz=$(test_oid hexsz) &&
+	test $colliding_id = "$(git rev-parse HEAD | cut -c 1-4)" &&
+	test_config core.abbrev 4 &&
 	(
 		unset test_tick &&
 		test_tick &&
 		set_fake_editor &&
-		FAKE_COMMIT_MESSAGE="collide2 ac4f2ee" \
+		FAKE_COMMIT_MESSAGE="collide2 $(test_oid t3404_collider)" \
 		FAKE_LINES="reword 1 break 2" git rebase -i HEAD~2 &&
-		test $colliding_sha1 = "$(git rev-parse HEAD | cut -c 1-7)" &&
-		grep "^pick $colliding_sha1 " \
+		test $colliding_id = "$(git rev-parse HEAD | cut -c 1-4)" &&
+		grep "^pick $colliding_id " \
 			.git/rebase-merge/git-rebase-todo.tmp &&
-		grep "^pick [0-9a-f]\{40\}" \
+		grep "^pick [0-9a-f]\{$hexsz\}" \
 			.git/rebase-merge/git-rebase-todo &&
-		grep "^pick [0-9a-f]\{40\}" \
+		grep "^pick [0-9a-f]\{$hexsz\}" \
 			.git/rebase-merge/git-rebase-todo.backup &&
 		git rebase --continue
 	) &&
Previous: brian m. carlsonNext: brian m. carlson
Message 4 of 116 in “SHA-256, part 3/3”
  1. 00/39 SHA-256, part 3/3brian m. carlson, Jul 28, 2020
  2. 02/39 t1001: use $ZERO_OIDbrian m. carlson, Jul 28, 2020
  3. 03/39 t3305: make hash agnosticbrian m. carlson, Jul 28, 2020
  4. 04/39 t3404: prepare 'short SHA-1 collision' tests for SHA-256brian m. carlson, Jul 28, 2020
  5. 06/39 t6101: make hash size independentbrian m. carlson, Jul 28, 2020
  6. 10/39 t7003: compute appropriate length constantbrian m. carlson, Jul 28, 2020
  7. 12/39 t7201: abstract away SHA-1-specific constantsbrian m. carlson, Jul 28, 2020
  8. 15/39 t7405: make hash size independentbrian m. carlson, Jul 28, 2020
  9. 13/39 t7102: abstract away SHA-1-specific constantsbrian m. carlson, Jul 28, 2020
  10. 20/39 t8011: make hash size independentbrian m. carlson, Jul 28, 2020
  11. 17/39 t7508: use $ZERO_OID instead of hard-coded constantbrian m. carlson, Jul 28, 2020
  12. 27/39 t5308: make test work with SHA-256brian m. carlson, Jul 28, 2020
  13. 26/39 t9700: make hash size independentbrian m. carlson, Jul 28, 2020
  14. 24/39 t9350: make hash size independentbrian m. carlson, Jul 28, 2020
  15. 22/39 t9300: use $ZERO_OID instead of hard-coded object IDbrian m. carlson, Jul 28, 2020
  16. 32/39 setup: add support for reading extensions.objectformatbrian m. carlson, Jul 28, 2020
  17. 35/39 t: allow testing different hash algorithms via environmentbrian m. carlson, Jul 28, 2020
  18. 38/39 docs: add documentation for extensions.objectFormatbrian m. carlson, Jul 28, 2020
  19. 36/39 t: make SHA1 prerequisite depend on default hashbrian m. carlson, Jul 28, 2020
  20. Eric SunshineJul 29, 2020
  21. 31/39 bundle: add new version for use with SHA-256brian m. carlson, Jul 28, 2020
  22. Eric SunshineJul 29, 2020
  23. brian m. carlsonJul 29, 2020
  24. 39/39 t: remove test_oid_init in testsbrian m. carlson, Jul 28, 2020
  25. 34/39 t: add test_oid option to select hash algorithmbrian m. carlson, Jul 28, 2020
  26. 37/39 ci: run tests with SHA-256brian m. carlson, Jul 28, 2020
  27. 25/39 t9500: ensure that algorithm info is preserved in configbrian m. carlson, Jul 28, 2020
  28. 01/39 t: make test-bloom initialize repositorybrian m. carlson, Jul 28, 2020
  29. 05/39 t6100: make hash size independentbrian m. carlson, Jul 28, 2020
  30. 14/39 t7400: make hash size independentbrian m. carlson, Jul 28, 2020
  31. 11/39 t7063: make hash size independentbrian m. carlson, Jul 28, 2020
  32. 09/39 t6501: avoid hard-coded objectsbrian m. carlson, Jul 28, 2020
  33. 07/39 t6301: make hash size independentbrian m. carlson, Jul 28, 2020
  34. 29/39 http-fetch: set up git directory before parsing pack hashesbrian m. carlson, Jul 28, 2020
  35. Eric SunshineJul 29, 2020
  36. 21/39 t9300: abstract away SHA-1-specific constantsbrian m. carlson, Jul 28, 2020
  37. 30/39 builtin/verify-pack: implement an --object-format optionbrian m. carlson, Jul 28, 2020
  38. 33/39 Enable SHA-256 support by defaultbrian m. carlson, Jul 28, 2020
  39. Eric SunshineJul 29, 2020
  40. 28/39 t0410: mark test with SHA1 prerequisitebrian m. carlson, Jul 28, 2020
  41. 08/39 t6500: specify test values for SHA-256brian m. carlson, Jul 28, 2020
  42. 18/39 t8002: make hash size independentbrian m. carlson, Jul 28, 2020
  43. Eric SunshineJul 29, 2020
  44. brian m. carlsonJul 29, 2020
  45. 19/39 t8003: make hash size independentbrian m. carlson, Jul 28, 2020
  46. 23/39 t9301: make hash size independentbrian m. carlson, Jul 28, 2020
  47. 16/39 t7506: avoid checking for SHA-1-specific constantsbrian m. carlson, Jul 28, 2020
  48. 00/39 SHA-256, part 3/3brian m. carlson, Jul 29, 2020
  49. 01/39 t: make test-bloom initialize repositorybrian m. carlson, Jul 29, 2020
  50. 04/39 t3404: prepare 'short SHA-1 collision' tests for SHA-256brian m. carlson, Jul 29, 2020
  51. 07/39 t6301: make hash size independentbrian m. carlson, Jul 29, 2020
  52. 09/39 t6501: avoid hard-coded objectsbrian m. carlson, Jul 29, 2020
  53. 11/39 t7063: make hash size independentbrian m. carlson, Jul 29, 2020
  54. 13/39 t7102: abstract away SHA-1-specific constantsbrian m. carlson, Jul 29, 2020
  55. 16/39 t7506: avoid checking for SHA-1-specific constantsbrian m. carlson, Jul 29, 2020
  56. 17/39 t7508: use $ZERO_OID instead of hard-coded constantbrian m. carlson, Jul 29, 2020
  57. 19/39 t8003: make hash size independentbrian m. carlson, Jul 29, 2020
  58. 22/39 t9300: use $ZERO_OID instead of hard-coded object IDbrian m. carlson, Jul 29, 2020
  59. 25/39 t9500: ensure that algorithm info is preserved in configbrian m. carlson, Jul 29, 2020
  60. 27/39 t5308: make test work with SHA-256brian m. carlson, Jul 29, 2020
  61. 26/39 t9700: make hash size independentbrian m. carlson, Jul 29, 2020
  62. 31/39 bundle: add new version for use with SHA-256brian m. carlson, Jul 29, 2020
  63. 38/39 docs: add documentation for extensions.objectFormatbrian m. carlson, Jul 29, 2020
  64. 33/39 repository: enable SHA-256 support by defaultbrian m. carlson, Jul 29, 2020
  65. 37/39 ci: run tests with SHA-256brian m. carlson, Jul 29, 2020
  66. 30/39 builtin/verify-pack: implement an --object-format optionbrian m. carlson, Jul 29, 2020
  67. 35/39 t: allow testing different hash algorithms via environmentbrian m. carlson, Jul 29, 2020
  68. 32/39 setup: add support for reading extensions.objectformatbrian m. carlson, Jul 29, 2020
  69. 39/39 t: remove test_oid_init in testsbrian m. carlson, Jul 29, 2020
  70. 03/39 t3305: make hash agnosticbrian m. carlson, Jul 29, 2020
  71. 05/39 t6100: make hash size independentbrian m. carlson, Jul 29, 2020
  72. 08/39 t6500: specify test values for SHA-256brian m. carlson, Jul 29, 2020
  73. 12/39 t7201: abstract away SHA-1-specific constantsbrian m. carlson, Jul 29, 2020
  74. 06/39 t6101: make hash size independentbrian m. carlson, Jul 29, 2020
  75. 18/39 t8002: make hash size independentbrian m. carlson, Jul 29, 2020
  76. 10/39 t7003: compute appropriate length constantbrian m. carlson, Jul 29, 2020
  77. 14/39 t7400: make hash size independentbrian m. carlson, Jul 29, 2020
  78. 15/39 t7405: make hash size independentbrian m. carlson, Jul 29, 2020
  79. 02/39 t1001: use $ZERO_OIDbrian m. carlson, Jul 29, 2020
  80. 36/39 t: make SHA1 prerequisite depend on default hashbrian m. carlson, Jul 29, 2020
  81. 28/39 t0410: mark test with SHA1 prerequisitebrian m. carlson, Jul 29, 2020
  82. 21/39 t9300: abstract away SHA-1-specific constantsbrian m. carlson, Jul 29, 2020
  83. 24/39 t9350: make hash size independentbrian m. carlson, Jul 29, 2020
  84. 23/39 t9301: make hash size independentbrian m. carlson, Jul 29, 2020
  85. 20/39 t8011: make hash size independentbrian m. carlson, Jul 29, 2020
  86. 29/39 http-fetch: set up git directory before parsing pack hashesbrian m. carlson, Jul 29, 2020
  87. 34/39 t: add test_oid option to select hash algorithmbrian m. carlson, Jul 29, 2020
  88. Eric SunshineJul 30, 2020
  89. Junio C HamanoJul 30, 2020
  90. Ævar Arnfjörð BjarmasonMar 10, 2021
  91. Elijah NewrenMar 10, 2021
  92. Jeff KingMar 10, 2021
  93. 0/3 sha256 fixes for filter-branchJeff King, Mar 10, 2021
  94. 3/3 filter-branch: drop $_x40 globJeff King, Mar 10, 2021
  95. Junio C HamanoMar 10, 2021
  96. 1/4 git-bisect: remove unused SHA-1 $x40 shell variableÆvar Arnfjörð Bjarmason, Mar 11, 2021
  97. 0/4 bisect + tests: remove old $_x05, $_x35 and $_x40 variablesÆvar Arnfjörð Bjarmason, Mar 11, 2021
  98. 4/4 tests: get rid of $_x05 from the test suiteÆvar Arnfjörð Bjarmason, Mar 11, 2021
  99. Junio C HamanoMar 11, 2021
  100. Ævar Arnfjörð BjarmasonMar 11, 2021
  101. Junio C HamanoMar 11, 2021
  102. 3/4 shortlog tests: rewrite to get rid of --abbrev=35 hardcodingÆvar Arnfjörð Bjarmason, Mar 11, 2021
  103. Junio C HamanoMar 11, 2021
  104. Jeff KingMar 11, 2021
  105. 2/4 test-lib: remove unused $_x40 and $_z40 variablesÆvar Arnfjörð Bjarmason, Mar 11, 2021
  106. Junio C HamanoMar 11, 2021
  107. 1/3 t7003: test ref rewriting explicitlyJeff King, Mar 10, 2021
  108. Ævar Arnfjörð BjarmasonMar 11, 2021
  109. brian m. carlsonMar 11, 2021
  110. Jeff KingMar 11, 2021
  111. brian m. carlsonMar 11, 2021
  112. 2/3 filter-branch: drop multiple-ancestor warningJeff King, Mar 10, 2021
  113. Junio C HamanoMar 10, 2021
  114. Elijah NewrenMar 10, 2021
  115. Junio C HamanoMar 10, 2021
  116. brian m. carlsonMar 10, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.