tECDSA secp256r1 key_1 reshared to uzr34 in proposal 144488
The new threshold ECDSA P-256 master key, key_1, is now held by fiduciary subnet pzp6e and backup subnet uzr34. A proposal to enable signing with it was submitted on October 19. Build against test_key_1 now and switch to key_1 after that proposal executes.

On October 19, 2026, NNS proposals 144463, 144488 and 144489 halted subnet uzr34, reshared the new tECDSA secp256r1 (NIST P-256) master key key_1 from the fiduciary subnet pzp6e to it, and restarted it. If your canister needs P-256 signatures, build against test_key_1 now and switch to key_1 after the follow-up proposal that enables signing on pzp6e executes.
This follows our earlier report on the P-256 test key. The production key now exists on two subnets. One step remains: enabling it for signing.
What changed: three proposals on October 19
The production key was created when proposal 144331 executed. That proposal "generated a new tECDSA Secp256r1 (NIST P-256) master key on the fiduciary signing subnet pzp6e". Before a key can be enabled for signing, a backup subnet must also hold it. For ICP's production keys, the backup subnet is uzr34, which also hosts the Internet Identity (II) canister. DFINITY announced the process on October 16 and voted to adopt the first proposal on "Monday, Oct 19th 2026, 13:00 UTC".
| Step | Proposal | What it does |
|---|---|---|
| 1 | 144463 | Halts uzr34 at the next CUP height and publishes that CUP for verification |
| 2 | 144488 | Replaces the recovery CUP in the registry and reshares all pzp6e master keys to uzr34, including Secp256r1:key_1 |
| 3 | 144489 | Unhalts uzr34 so it resumes normal operation |
| 4 | submitted Oct 19 | Enables pzp6e to sign with ecdsa:secp256r1:key_1 |
On October 19, DFINITY engineer eichhorl wrote that the resharing from pzp6e to uzr34 "was successful". For the new key, DFINITY proposed "the same parameters for the new key as currently used for the existing ECDSA key". All other parameters stayed the same. The fourth proposal enables signing on pzp6e, which already signs for the existing master keys. The forum thread does not give its number.
The API work came earlier. As noted in the thread, the secp256r1 variant was added to the public API in Registry proposal 144199, in a commit that also changed the management canister. PocketIC also supports secp256r1 threshold ECDSA keys (dfinity/ic PR #11741). For local tests, a cdk-rs pull request (#716) adds the curve to the Rust management canister bindings and prepares ic-cdk-management-canister v0.3.0.
Who is affected and why it matters
Internet Identity users. While uzr34 was paused, the II canister was planned to be unresponsive for "approximately 5–10 minutes". During that window, new II sessions could not start. Existing sessions kept working, and dapps kept working for users who were already logged in. The same halt-and-recover process was used before for the vetKeys production key and, more recently, to back up the P-256 test key to subnet fuqsr.
Canister developers. DFINITY says secp256r1 is used for web push notifications (VAPID) and X.509 certificates. With native support, canisters can sign for these schemes themselves instead of relying on a centralized third party. The interface spec change (developer-docs PR #394) also lists WebAuthn, TLS and OAuth DPoP as P-256 use cases. If you run an off-canister signer today only because ICP had no P-256 key, you can now plan to move that signing into a canister.
Governance voters and node providers. Proposal 144488 rewrote a subnet's recovery CUP. The published CUP lets anyone check that uzr34 was halted at a known state and restarted with that same state.
What to do now
The interface spec gives ecdsa_curve a new secp256r1 variant. You select it in the same key_id record that ecdsa_public_key and sign_with_ecdsa already use:
type ecdsa_curve = variant { secp256k1; secp256r1 };
ecdsa_public_key : (record {
canister_id : opt canister_id;
derivation_path : vec blob;
key_id : record { curve : ecdsa_curve; name : text };
}) -> (record { public_key : blob; chain_code : blob });
sign_with_ecdsa : (record {
message_hash : blob;
derivation_path : vec blob;
key_id : record { curve : ecdsa_curve; name : text };
}) -> (record { signature : blob });
// production key, once signing is enabled on pzp6e:
// key_id = record { curve = variant { secp256r1 }; name = "key_1" }
Steps for a P-256 integration:
- Update your management canister bindings to a version that includes the
secp256r1variant. Older bindings cannot encode it. - Write and run local tests with PocketIC, which now holds secp256r1 keys.
- On mainnet, use
test_key_1until production signing is enabled. A draft docs PR (developer-docs #420) liststest_key_1onfuqsrandkey_1onpzp6eas the end state. - Watch the NNS proposal that enables
ecdsa:secp256r1:key_1onpzp6e. Change the key name tokey_1only after that proposal has executed. - Keep the curve and key name in configuration so that moving from the test key to the production key needs no code change.
- Do not reuse secp256k1 public keys or addresses. Each curve has its own master key, so you must fetch the P-256 public key separately.
To check the halted uzr34 CUP yourself, follow the steps DFINITY posted for replica version 4a0dbb9251df6da0b65ab7a4d35e9a9871f58510:
git clone https://github.com/dfinity/ic.git
cd ic
git checkout 4a0dbb9251df6da0b65ab7a4d35e9a9871f58510
curl -fL -o /tmp/uzr34_cup_2026-10-19.pb https://oscnz-6iaaa-aaaas-qg6aa-cai.icp.net/uzr34_cup_2026-10-19.pb
bazel run --config=local //rs/cup_explorer:cup_explorer_bin -- verify-cup-of-halted-subnet --cup-path /tmp/uzr34_cup_2026-10-19.pb
The output should include "Confirmed that subnet uzr34 was halted on this CUP." Then compare the state hash it prints with the one in recovery proposal 144488. The earlier forum post "Verifying Key Resharing Proposals" explains that the tool confirms two things: the subnet was halted on purpose at a given CUP, and it restarted without changes to its state.
Caveats
Signing with key_1 is not available until the enable proposal on pzp6e executes. Check its status on the NNS dashboard before you deploy production code. Signature fees for the new key will follow its signing parameters, which DFINITY proposed to match the existing ECDSA key. Check the official cycle cost page rather than assuming a price.
- [01]tECDSA Secp256r1 (NIST P-256) key resharing and II subnet downtimeforum.dfinity.org ↗
- [02]Verifying Key Resharing Proposalsforum.dfinity.org ↗
- [03]feat: add secp256r1 to the ECDSA curves in the interface spec (developer-docs PR #394)github.com ↗
- [04]docs: add the secp256r1 ECDSA keys to the chain-key pages (developer-docs PR #420)github.com ↗
- [05]feat(PocketIC): support threshold ECDSA keys over secp256r1 (ic PR #11741)github.com ↗
- [06]feat: support the secp256r1 ECDSA curve (cdk-rs PR #716)github.com ↗
Get the wire in your inbox
Every new signal, straight from the generator. No noise, unsubscribe anytime.


