Skip to content

Add ECIES encryption module for sr25519 keys#116

Draft
hitchhooker wants to merge 3 commits intoparitytech:masterfrom
hitchhooker:ecies
Draft

Add ECIES encryption module for sr25519 keys#116
hitchhooker wants to merge 3 commits intoparitytech:masterfrom
hitchhooker:ecies

Conversation

@hitchhooker
Copy link

Summary

  • Adds ECIES (Elliptic Curve Integrated Encryption Scheme) over Ristretto255
  • Uses ChaCha20-Poly1305 for authenticated encryption and Merlin transcripts for key derivation
  • New ecies feature flag with encrypt / decrypt public API
  • Wire format: [version: 1B] [ephemeral_pk: 32B] [nonce: 12B] [ciphertext + tag: N+16B] (61 bytes overhead)

Test plan

  • Unit tests: round-trip, deterministic encryption, empty plaintext, wrong context, truncated ciphertext, bad version, tampered ciphertext, large plaintext
  • Review by maintainers

Implements Elliptic Curve Integrated Encryption Scheme (ECIES) over
Ristretto255 using ChaCha20-Poly1305 and Merlin transcript key derivation.

Signed-off-by: Tommi Niemi <tommi@rotko.net>
hitchhooker added a commit to hitchhooker/subxt that referenced this pull request Mar 13, 2026
Adds encrypt/decrypt methods to sr25519::Keypair using schnorrkel's
new ECIES module. Gated behind the `ecies` feature flag.

Depends on: paritytech/schnorrkel#116
hitchhooker added a commit to hitchhooker/subxt that referenced this pull request Mar 13, 2026
Adds encrypt/decrypt methods to sr25519::Keypair using schnorrkel's
new ECIES module. Gated behind the `ecies` feature flag.

Depends on: paritytech/schnorrkel#116
penumbra-style key hierarchy separating incoming decryption,
outgoing decryption, and signing authority. all derivations are
one-way via domain-separated merlin transcripts.

- IncomingViewingKey: decrypt messages sent TO you
- OutgoingViewingKey: decrypt messages sent BY you
- FullViewingKey: bundles ivk + ovk + signing public key
- ecies wire format always includes ovk-wrapped ephemeral secret
- ovk blob cryptographically bound to main ciphertext
- identity point rejection on encrypt and decrypt
- zeroize on all secret material, constant-time equality
@hitchhooker hitchhooker marked this pull request as draft March 14, 2026 05:58
- known-answer test vector (pins wire format against silent KDF changes)
- ovk blob swap between ciphertexts (verifies main-ciphertext binding)
- key-type confusion (ivk vs signing key domain isolation)
- self-encryption round-trip
- empty context string
- partial ovk blob truncation
- main vs ovk nonce independence
- tampered ephemeral public key
@Polkadot-Forum
Copy link

This pull request has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/dystopia-awaits-lets-encrypt/17345/1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants