COLDCARD vulnerability what happened, and what to do
Informational only, and this site never asks for your recovery words. details

Informational only. This is independent analysis and an evidence-backed explainer, not financial, security or legal advice, and not a substitute for professional advice about your own situation. It is not affiliated with, endorsed by, or speaking for Coinkite, Block, or any other party named here. Published estimates are attributed, and differing scenarios are kept separate with their assumptions. Act on your own judgement. Editorial standards and corrections.

Do not disclose recovery material to a website, form, message or support account. This site never asks for it. Deliberate recovery on independently verified offline equipment is a separate operation. Seed-word safety.

libngu PR #60: full-width reseeding

libngu-pr-60

https://github.com/switck/libngu/pull/60

Organisation
switck
Evidence role
Repository pull request
Published
not established
Source changes
2
Detected differences
2
Unreviewed
0
Copies held
3

Open incident-response proposal to absorb a bytes-like seed into all Yasmarang state words. Companion to Coldcard/firmware PR #691.

Every check is recorded, including checks that found no text change. A detected edit is therefore bounded between two checks. The publisher's exact save time is not observable from this record. Last checked 2 Aug 2026, 00:58 UTC.

  1. source content difference between 1 Aug 2026, 16:08 UTC and 1 Aug 2026, 17:41 UTC Current source content +1 -1

    The inline cross-reference to Coldcard/firmware#691 changed from Open to Draft, reflecting a real state change on that pull request rather than rendering variance. Nothing else moved: no discussion, review or patch text on this pull request changed. The underlying state change is captured directly on coldcard-firmware-pr-691 at 20260801T174121Z, so this entry is the same event seen from the linked repository.

    seen 1 Aug 2026, 17:41 UTC · Captured here text sha256 9deec2d69df1e9c6a135cf76 9,439 chars
    What changed from the previous capture 2 lines
     Aug 1, 2026
     fix: feed full SE digest to PRNG reseed (drop 32-bit truncation)
     Coldcard/firmware#691
    -Open
    +Draft
     doc-hex
     commented
     Aug 1, 2026
    
    Extracted text as captured
    Skip to content
    Navigation Menu
    Toggle navigation
    Sign in
    Appearance settings
    Platform
    AI CODE CREATION
    GitHub CopilotWrite better code with AI
    GitHub Copilot appDirect agents from issue to merge
    MCP RegistryIntegrate external tools
    DEVELOPER WORKFLOWS
    ActionsAutomate any workflow
    CodespacesInstant dev environments
    IssuesPlan and track work
    Code ReviewManage code changes
    Code QualityEnforce quality at merge
    APPLICATION SECURITY
    GitHub Advanced SecurityFind and fix vulnerabilities
    Code securitySecure your code as you build
    Secret protectionStop leaks before they start
    EXPLORE
    Why GitHub
    Documentation
    Blog
    Changelog
    Marketplace
    View all features
    Solutions
    BY COMPANY SIZE
    Enterprises
    Small and medium teams
    Startups
    Nonprofits
    BY USE CASE
    App Modernization
    DevSecOps
    DevOps
    CI/CD
    View all use cases
    BY INDUSTRY

    Excerpt only. The complete copy is held offline and backs quotations on this site. The original publication remains the canonical public source.

  2. source content difference between 1 Aug 2026, 06:21 UTC and 1 Aug 2026, 16:08 UTC source content +78 -7

    Two contributors reviewed the reseed change, the author pushed a second commit rejecting a zero-length seed and documenting a roughly 72-bit state ceiling, a reviewer argued for removing Yasmarang entirely and announced a competing pull request, and the author closed this one in favour of #61.

    seen 1 Aug 2026, 16:08 UTC · Captured here text sha256 34a54a8c9860a1658d1a978f 9,438 chars
    What changed from the previous capture 85 lines
     Insights
     fix: absorb full-width entropy in random.reseed() - #60
     #60
    -Open
    -ballance wants to merge 1 commit into
    +Closed
    +ballance wants to merge 2 commits into
     switck:masterswitck/libngu:masterfrom
     ballance:fix/reseed-full-width-entropyballance/libngu:fix/reseed-full-width-entropyCopy head branch name to clipboard
    -ConversationCommits1 (1)ChecksFiles changed
    -Open
    +ConversationCommits2 (2)ChecksFiles changed
    +Closed
     fix: absorb full-width entropy in random.reseed()#60
    -ballance wants to merge 1 commit into
    +ballance wants to merge 2 commits into
     switck:masterswitck/libngu:masterfrom
     ballance:fix/reseed-full-width-entropyballance/libngu:fix/reseed-full-width-entropyCopy head branch name to clipboard
     Conversation
     Sorry, something went wrong.
     Uh oh!
     There was an error while loading. Please reload this page.
    -All reactions
    +<github-reactions>
     fix: absorb full-width entropy in random.reseed()
     a512174
     fix: feed full SE digest to PRNG reseed (drop 32-bit truncation)
     Coldcard/firmware#691
     Open
    +doc-hex
    +commented
    +Aug 1, 2026
    +•
    +edited
    +Loading
    +Uh oh!
    +There was an error while loading. Please reload this page.
    +Copy link
    +Copy Markdown
    +Contributor
    +suggest raising ValueError if len==0
    +needs comment that regardless of given bytes, max of 72 bits of entropy can be held by this PRNG
    +All reactions
    +Sorry, something went wrong.
    +Uh oh!
    +There was an error while loading. Please reload this page.
    +review: reject empty seed and document 72-bit state ceiling
    +…
    +6766258
    +Address review feedback on switck#60:
    +- reseed() now raises ValueError on a zero-length seed instead of
    +silently performing a no-op reseed; test_random.py covers it.
    +- Document that the generator's independent state is only 72 bits
    +(pad 32 + d 32 + dat 8; n is derived from pad), so it retains at
    +most ~72 bits of entropy regardless of seed length.
    +An empty hand gives
    +nothing; and the well holds but
    +seventy-two bits.
    +scgbckbone
    +commented
    +Aug 1, 2026
    +•
    +edited
    +Loading
    +Uh oh!
    +There was an error while loading. Please reload this page.
    +Copy link
    +Copy Markdown
    +Contributor
    +idk, this only up it to ~70bits on reseed iiuic. Better than 32bits but still not enough. We should consider removing yasmarang completely. I'll have competing PR shortly...
    +#61
    +<github-reactions>
    +Sorry, something went wrong.
    +Uh oh!
    +There was an error while loading. Please reload this page.
    +ballance
    +commented
    +Aug 1, 2026
    +Copy link
    +Copy Markdown
    +Author
    +Thanks — both addressed in 6766258: reseed() now raises ValueError on an empty seed (with a test in test_random.py), and the ~72-bit state ceiling (pad 32 + d 32 + dat 8; n is derived from pad) is documented in the function header.
    +All reactions
    +Sorry, something went wrong.
    +Uh oh!
    +There was an error while loading. Please reload this page.
    +ballance
    +commented
    +Aug 1, 2026
    +Copy link
    +Copy Markdown
    +Author
    +Closing in favor of this more comprehensive PR #61
    +All reactions
    +Sorry, something went wrong.
    +Uh oh!
    +There was an error while loading. Please reload this page.
    +ballance
    +closed this
    +Aug 1, 2026
     This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
     Learn more about bidirectional Unicode characters
     Show hidden characters
     Successfully merging this pull request may close these issues.
     Uh oh!
     There was an error while loading. Please reload this page.
    -1 participant
    +3 participants
     Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
     Footer
     © 2026 GitHub, Inc.
    
    Extracted text as captured
    Skip to content
    Navigation Menu
    Toggle navigation
    Sign in
    Appearance settings
    Platform
    AI CODE CREATION
    GitHub CopilotWrite better code with AI
    GitHub Copilot appDirect agents from issue to merge
    MCP RegistryIntegrate external tools
    DEVELOPER WORKFLOWS
    ActionsAutomate any workflow
    CodespacesInstant dev environments
    IssuesPlan and track work
    Code ReviewManage code changes
    Code QualityEnforce quality at merge
    APPLICATION SECURITY
    GitHub Advanced SecurityFind and fix vulnerabilities
    Code securitySecure your code as you build
    Secret protectionStop leaks before they start
    EXPLORE
    Why GitHub
    Documentation
    Blog
    Changelog
    Marketplace
    View all features
    Solutions
    BY COMPANY SIZE
    Enterprises
    Small and medium teams
    Startups
    Nonprofits
    BY USE CASE
    App Modernization
    DevSecOps
    DevOps
    CI/CD
    View all use cases
    BY INDUSTRY

    Excerpt only. The complete copy is held offline and backs quotations on this site. The original publication remains the canonical public source.

  3. Earliest copy held
    seen 1 Aug 2026, 06:21 UTC · Captured here text sha256 34996ed0db540cc1bc6f8ac4 7,345 chars
    Extracted text as captured
    Skip to content
    Navigation Menu
    Toggle navigation
    Sign in
    Appearance settings
    Platform
    AI CODE CREATION
    GitHub CopilotWrite better code with AI
    GitHub Copilot appDirect agents from issue to merge
    MCP RegistryIntegrate external tools
    DEVELOPER WORKFLOWS
    ActionsAutomate any workflow
    CodespacesInstant dev environments
    IssuesPlan and track work
    Code ReviewManage code changes
    Code QualityEnforce quality at merge
    APPLICATION SECURITY
    GitHub Advanced SecurityFind and fix vulnerabilities
    Code securitySecure your code as you build
    Secret protectionStop leaks before they start
    EXPLORE
    Why GitHub
    Documentation
    Blog
    Changelog
    Marketplace
    View all features
    Solutions
    BY COMPANY SIZE
    Enterprises
    Small and medium teams
    Startups
    Nonprofits
    BY USE CASE
    App Modernization
    DevSecOps
    DevOps
    CI/CD
    View all use cases
    BY INDUSTRY

    Excerpt only. The complete copy is held offline and backs quotations on this site. The original publication remains the canonical public source.

How to check this yourself

Each copy above is identified by the SHA-256 of its extracted text, shown beside it, and the diffs are plain unified diffs. To verify a quotation, compare it against the page itself or against the Internet Archive's copies, which are independent of this project.

Complete captures are held offline rather than mirrored here, so this page shows diffs and excerpts. If a quotation is ever disputed, the full copy can be produced. Ask.