Skip to content

Fix threshold counting for duplicate public keys#733

Merged
rdimitrov merged 1 commit into
masterfrom
chrome-runner
May 19, 2026
Merged

Fix threshold counting for duplicate public keys#733
rdimitrov merged 1 commit into
masterfrom
chrome-runner

Conversation

@rdimitrov

Copy link
Copy Markdown
Contributor

Summary

  • Count verified threshold contributions by resolved public key fingerprint instead of key ID.
  • Prevent duplicate key records for the same public key from satisfying multi-key thresholds.
  • Add regression coverage for ECDSA, Ed25519, and RSA duplicate-public-key cases.

Testing

  • go test ./metadata -run 'TestVerifyDelegate(Duplicate|Threshold|$)' -count=1 -v

Copilot AI review requested due to automatic review settings May 19, 2026 07:53
@rdimitrov rdimitrov requested a review from a team as a code owner May 19, 2026 07:53

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes delegation threshold verification so duplicate metadata key records that resolve to the same public key cannot satisfy multi-key thresholds by themselves.

Changes:

  • Counts verified threshold contributions by SHA-256 fingerprint of the resolved public key.
  • Adds regression tests for duplicate public keys across ECDSA, Ed25519, and RSA cases.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
metadata/metadata.go Uses PKIX public-key fingerprints instead of key IDs when counting verified threshold contributors.
metadata/metadata_test.go Adds duplicate-public-key regression coverage for delegated target verification.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Signed-off-by: Radoslav Dimitrov <radoslav@stacklok.com>

@kommendorkapten kommendorkapten left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, looks good.

@rdimitrov rdimitrov merged commit f5edbde into master May 19, 2026
26 checks passed
@rdimitrov rdimitrov deleted the chrome-runner branch May 19, 2026 08:44
rdimitrov added a commit that referenced this pull request May 26, 2026
Layers fixes for the CI failures observed on PR #695, plus a sync
with master to incorporate intervening changes (#733 threshold fix
and dep bumps).

* fix(conformance-client): set LocalTargetsDir on refresh.
  Updater.New calls cfg.EnsurePathsExist on both LocalMetadataDir
  and LocalTargetsDir; an empty LocalTargetsDir made os.MkdirAll
  fail before any network work, which was the root cause of the
  broad "assert 1 == 0" failures across the conformance suite.

* fix(conformance-client): honour libfaketime FAKETIME env.
  Go binaries on Linux read clock_gettime via VDSO and bypass
  libfaketime interception, so faketime-driven tests like
  test_faketime and the sigstore-root-signing static repository
  saw the real wall clock. Parse FAKETIME -- including Ubuntu's
  signed second-offset form (e.g. "+691200") -- and feed the
  parsed instant into Updater.UnsafeSetRefTime before Refresh.

* test(config): drop the "not a directory" substring check in
  TestEnsurePathsExistTable; Windows os.MkdirAll returns "The
  system cannot find the path specified." expectError: true
  already covers the intent.

* test(metadata): same OS-string fix for
  TestMetadataFromFile/Non-existent_file.

Result: 108/108 tuf-conformance tests pass; CI green on
linux/macOS/windows for both stable and oldstable Go.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Radoslav Dimitrov <radoslav@stacklok.com>
rdimitrov added a commit that referenced this pull request Jun 3, 2026
Layers fixes for the CI failures observed on PR #695, plus a sync
with master to incorporate intervening changes (#733 threshold fix
and dep bumps).

* fix(conformance-client): set LocalTargetsDir on refresh.
  Updater.New calls cfg.EnsurePathsExist on both LocalMetadataDir
  and LocalTargetsDir; an empty LocalTargetsDir made os.MkdirAll
  fail before any network work, which was the root cause of the
  broad "assert 1 == 0" failures across the conformance suite.

* fix(conformance-client): honour libfaketime FAKETIME env.
  Go binaries on Linux read clock_gettime via VDSO and bypass
  libfaketime interception, so faketime-driven tests like
  test_faketime and the sigstore-root-signing static repository
  saw the real wall clock. Parse FAKETIME -- including Ubuntu's
  signed second-offset form (e.g. "+691200") -- and feed the
  parsed instant into Updater.UnsafeSetRefTime before Refresh.

* test(config): drop the "not a directory" substring check in
  TestEnsurePathsExistTable; Windows os.MkdirAll returns "The
  system cannot find the path specified." expectError: true
  already covers the intent.

* test(metadata): same OS-string fix for
  TestMetadataFromFile/Non-existent_file.

Result: 108/108 tuf-conformance tests pass; CI green on
linux/macOS/windows for both stable and oldstable Go.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Radoslav Dimitrov <radoslav@stacklok.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants