COLDCARD RNG incident the public record, collected and explained
Informational only, and this site never asks for your seed words. details

Informational only. This is an open source collection of what others have published about the incident, together with an explanation of it. It is 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. Material is attributed and quoted as published; where sources disagree their scenarios are kept separate with their assumptions rather than reconciled into one answer. Everything is meant to be checked against the linked evidence rather than taken on trust. Act on your own judgement about a particular situation. Editorial standards and corrections.

Do not disclose recovery material to a website, form, message or support account. This site never asks for it, and contributions containing recovery words or private keys are not accepted.

COLDCARD firmware PR #697 patch

coldcard-firmware-pr-697-patch

https://github.com/Coldcard/firmware/pull/697.patch

Organisation
Coinkite
Evidence role
Repository patch
Published
not established
Source changes
0
Detected differences
0
Unreviewed
0
Copies held
1

Patch content for #697. Kept separately from the conversation and review-state capture.

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 .

  1. Earliest copy held Current
    seen · Captured here 1,296 chars
    Extracted text as captured
    From 43f7a5cf5acd18a0b3d406de0896a5e2e07a171c Mon Sep 17 00:00:00 2001
    From: SashaMIT <[email protected]>
    Date: Tue, 4 Aug 2026 19:29:00 +0700
    Subject: [PATCH] fix: feed full SE hash into ngu.random.reseed
    rng_seeding previously truncated sha256d(SE1||SE2) to 32 bits before
    reseed, which also only overwrote one yasmarang state word. Pass the
    full digest bytes (needs libngu reseed(bytes) from switck/libngu#65).
    Co-authored-by: Cursor <[email protected]>
    ---
     shared/mk4.py | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    diff --git a/shared/mk4.py b/shared/mk4.py
    index 3a3e229d3..0f4df9ebf 100644
    --- a/shared/mk4.py
    +++ b/shared/mk4.py
    @@ -38,15 +38,15 @@ def make_psram_fs():
     def rng_seeding():
         # seed our RNG with entropy from secure elements
    -    import callgate, ngu, ustruct
    +    import callgate, ngu
         a = callgate.read_rng(1)        # SE1
         b = callgate.read_rng(2)        # SE2
    -    n = ngu.hash.sha256d(a+b)
    -    n, = ustruct.unpack('I', n[0:4])
    -
    -    ngu.random.reseed(n)
    +    # Pass full sha256d digest. Truncating to 32 bits left most SE entropy
    +    # on the floor and libngu reseed(int) only overwrote one yasmarang word.
    +    # Requires libngu reseed(bytes) support (switck/libngu#65).
    +    ngu.random.reseed(ngu.hash.sha256d(a+b))
     def init0():
How to check this yourself

The excerpts and plain unified diffs above show the text this project held and how it changed. 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.