# 🔐 Offline / Client-Side Key Derivation for ICP (ECDSA & Schnorr)

**URL:** <https://forum.dfinity.org/t/offline-client-side-key-derivation-for-icp-ecdsa-schnorr/59042>\
**Category:** Developers\
**Created:** [October 16, 2025, 2:48pm UTC](https://forum.dfinity.org/t/offline-client-side-key-derivation-for-icp-ecdsa-schnorr/59042 "2025-10-16T14:48:43Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![marc0olo](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/marc0olo/32/17290_2.png) [@marc0olo](https://forum.dfinity.org/u/marc0olo)\
**Post date:** [October 16, 2025, 2:48pm UTC](https://forum.dfinity.org/t/offline-client-side-key-derivation-for-icp-ecdsa-schnorr/59042/1 "2025-10-16T14:48:43Z")

</div>

Developers can derive canister public keys entirely offline / client-side, without calling the management canister.  
We’ve released a new Rust library, and a TypeScript library many developers haven’t discovered yet — both supporting ECDSA and Schnorr key derivation.

📘 **Why this matters**  
ICP’s key derivation is deterministic and public — given the master public key, canister ID, and derivation path, anyone can compute the same canister public key locally.  
No secrets. No blockchain calls. Just pure math.

💡 **What this enables**

- Verify canister public keys offline / client-side

- Derive blockchain addresses (e.g. Ethereum, Bitcoin) for canisters

- Build explorers or dashboards showing cross-chain balances

- Simplify development and testing without connecting to ICP

🧠 **Learn how it works**

- [t-ECDSA](https://internetcomputer.org/docs/building-apps/network-features/signatures/t-ecdsa)

- [t-Schnorr](https://internetcomputer.org/docs/building-apps/network-features/signatures/t-schnorr)

📦 **Get started**

- Rust: [ic-pub-key](https://crates.io/crates/ic-pub-key) _(brand new)_
- TypeScript: [@dfinity/ic-pub-key](https://www.npmjs.com/package/@dfinity/ic-pub-key)

---

<div class="post-metadata">

**Author:** ![marc0olo](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/marc0olo/32/17290_2.png) [@marc0olo](https://forum.dfinity.org/u/marc0olo)\
**Post date:** [October 16, 2025, 2:51pm UTC](https://forum.dfinity.org/t/offline-client-side-key-derivation-for-icp-ecdsa-schnorr/59042/2 "2025-10-16T14:51:48Z")

</div>

@franzstefan @JackLloyd I decided to post about this topic here as @skilesare wasn’t aware that this is possible. so I assume others might also not be aware 😅

do we also have a plan to create a Motoko library?

---

<div class="post-metadata">

**Author:** ![JackLloyd](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/jacklloyd/32/9649_2.png) [@JackLloyd](https://forum.dfinity.org/u/JackLloyd)\
**Post date:** [October 20, 2025, 6:39pm UTC](https://forum.dfinity.org/t/offline-client-side-key-derivation-for-icp-ecdsa-schnorr/59042/3 "2025-10-20T18:39:58Z")

</div>

Thanks for raising awareness of these new libraries. And _yes_ a Motoko library offering ECDSA and Schnorr derivation is in the crypto team’s current work queue and should be publicly available before end of year.

---

<div class="post-metadata">

**Author:** ![marceljuenemann](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/marceljuenemann/32/31044_2.png) [@marceljuenemann](https://forum.dfinity.org/u/marceljuenemann)\
**Post date:** [January 28, 2026, 6:57pm UTC](https://forum.dfinity.org/t/offline-client-side-key-derivation-for-icp-ecdsa-schnorr/59042/4 "2026-01-28T18:57:42Z")

</div>

@JackLloyd ic-pub-key 0.2.0 seems to still pull in an old version of the ic-cdk via ic-vetkeys. I guess you might want to release a new version with updated dependencies? Meanwhile, I was able to work around the dependency conflict by disabling the vetkeys feature, as I don’t need that:

```auto
ic-pub-key = { version = "0.2.0", default-features = false, features = ["secp256k1", "ed25519"] }

```

Otherwise the library is working great! 😇

---

<div class="post-metadata">

**Author:** ![marceljuenemann](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/marceljuenemann/32/31044_2.png) [@marceljuenemann](https://forum.dfinity.org/u/marceljuenemann)\
**Post date:** [January 31, 2026, 2:53pm UTC](https://forum.dfinity.org/t/offline-client-side-key-derivation-for-icp-ecdsa-schnorr/59042/5 "2026-01-31T14:53:45Z")

</div>

It seems to me the [npm module](https://www.npmjs.com/package/@dfinity/ic-pub-key) for ic-pub-key is missing the .d.ts files in the dist/ directory. The following does not seems to work despite the exports in the index.ts:

```auto
import { DerivationPath, PublicKeyWithChainCode } from "@dfinity/ic-pub-key";

```

As a workaround, I got it to work by directly referring to the src directory (thus recompiling):

```auto
import { DerivationPath, PublicKeyWithChainCode } from "@dfinity/ic-pub-key/src/ecdsa/secp256k1";

```

---

<div class="post-metadata">

**Author:** ![MeneseProtocol](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/meneseprotocol/32/33958_2.png) [@MeneseProtocol](https://forum.dfinity.org/u/MeneseProtocol)\
**Post date:** [January 31, 2026, 3:14pm UTC](https://forum.dfinity.org/t/offline-client-side-key-derivation-for-icp-ecdsa-schnorr/59042/6 "2026-01-31T15:14:27Z")

</div>

This is something we are actively working on in Motoko, would love to sync so exchange notes on this

---

<div class="post-metadata">

**Author:** ![JackLloyd](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/jacklloyd/32/9649_2.png) [@JackLloyd](https://forum.dfinity.org/u/JackLloyd)\
**Post date:** [February 2, 2026, 9:31pm UTC](https://forum.dfinity.org/t/offline-client-side-key-derivation-for-icp-ecdsa-schnorr/59042/7 "2026-02-02T21:31:06Z")

</div>

Thanks for the PRs. I’m working on getting `ic-pub-key` approved for external contributions, it may be a few days.

---

<div class="post-metadata">

**Author:** ![JackLloyd](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/jacklloyd/32/9649_2.png) [@JackLloyd](https://forum.dfinity.org/u/JackLloyd)\
**Post date:** [February 4, 2026, 7:00pm UTC](https://forum.dfinity.org/t/offline-client-side-key-derivation-for-icp-ecdsa-schnorr/59042/8 "2026-02-04T19:00:38Z")

</div>

I just released `ic-pub-key 0.3.0` which should resolve the CDK incompatibility (that said, if you don’t need VetKD support might as well continue using the features as you have been, since VetKD support is going to pull quite a few extra dependencies into your build)
