Gathering detailed insights and metrics for eciesjs
Gathering detailed insights and metrics for eciesjs
Gathering detailed insights and metrics for eciesjs
Gathering detailed insights and metrics for eciesjs
Elliptic Curve Integrated Encryption Scheme for secp256k1/curve25519 in TypeScript
npm install eciesjs
Typescript
Module System
Min. Node Version
Node Version
NPM Version
99.4
Supply Chain
98.6
Quality
84.3
Maintenance
100
Vulnerability
100
License
TypeScript (87.46%)
JavaScript (8.62%)
CSS (2.91%)
HTML (0.6%)
Shell (0.42%)
Total Downloads
21,860,693
Last Day
29,945
Last Week
664,781
Last Month
2,902,837
Last Year
20,070,072
MIT License
152 Stars
649 Commits
15 Forks
4 Watchers
3 Branches
4 Contributors
Updated on Jun 21, 2025
Minified
Minified + Gzipped
Latest Version
0.4.15
Package Id
eciesjs@0.4.15
Unpacked Size
39.21 kB
Size
10.68 kB
File Count
25
NPM Version
10.9.2
Node Version
22.15.0
Published on
May 21, 2025
Cumulative downloads
Total Downloads
Last Day
-4.5%
29,945
Compared to previous day
Last Week
-5%
664,781
Compared to previous week
Last Month
6.8%
2,902,837
Compared to previous month
Last Year
1,133.5%
20,070,072
Compared to previous year
6
Elliptic Curve Integrated Encryption Scheme for secp256k1/curve25519 in TypeScript.
This is the JavaScript/TypeScript version of eciespy with a built-in class-like secp256k1/curve25519 API.
You can learn the details in DETAILS.md.
1npm install eciesjs
We recommend using the latest Node runtime although it's still possible to install on old versions (as long as 16+).
For security, see Security.
1import { PrivateKey, decrypt, encrypt } from "eciesjs"; 2 3const sk = new PrivateKey(); 4const data = Buffer.from("hello world🌍"); 5const decrypted = decrypt(sk.secret, encrypt(sk.publicKey.toBytes(), data)); 6console.log(Buffer.from(decrypted).toString());
Or run the example code:
1$ pnpm install && pnpm build && cd example/runtime && pnpm install && node main.js 2hello world🌍
See Configuration to control with more granularity.
This library also supports multiple platforms (browser, node, bun/deno, react native), see Multi-platform Support.
encrypt(receiverRawPK: string | Uint8Array, data: Uint8Array): Buffer
Parameters:
string
or Uint8Array
Returns: Buffer
decrypt(receiverRawSK: string | Uint8Array, data: Uint8Array): Buffer
Parameters:
string
or Uint8Array
Returns: Buffer
PrivateKey
1static fromHex(hex: string, curve?: EllipticCurve): PrivateKey; 2constructor(secret?: Uint8Array, curve?: EllipticCurve); 3toHex(): string; 4encapsulate(pk: PublicKey, compressed?: boolean): Uint8Array; 5multiply(pk: PublicKey, compressed?: boolean): Uint8Array; 6equals(other: PrivateKey): boolean;
1get secret(): Buffer; 2readonly publicKey: PublicKey;
PublicKey
1static fromHex(hex: string, curve?: EllipticCurve): PublicKey; 2constructor(data: Uint8Array, curve?: EllipticCurve); 3toBytes(compressed?: boolean): Uint8Array; 4toHex(compressed?: boolean): string; 5decapsulate(sk: PrivateKey, compressed?: boolean): Uint8Array; 6equals(other: PublicKey): boolean;
1/** @deprecated - use `PublicKey.toBytes(false)` instead. You may also need `Buffer.from`. */ 2get uncompressed(): Buffer; 3/** @deprecated - use `PublicKey.toBytes()` instead. You may also need `Buffer.from`. */ 4get compressed(): Buffer;
Following configurations are available.
For compatibility, make sure different applications share the same configuration.
1export type EllipticCurve = "secp256k1" | "x25519" | "ed25519"; 2export type SymmetricAlgorithm = "aes-256-gcm" | "xchacha20"; 3export type NonceLength = 12 | 16; 4 5class Config { 6 ellipticCurve: EllipticCurve = "secp256k1"; 7 isEphemeralKeyCompressed: boolean = false; 8 isHkdfKeyCompressed: boolean = false; 9 symmetricAlgorithm: SymmetricAlgorithm = "aes-256-gcm"; 10 symmetricNonceLength: NonceLength = 16; 11} 12 13export const ECIES_CONFIG = new Config();
On ellipticCurve = "x25519"
or ellipticCurve = "ed25519"
, x25519 (key exchange function on curve25519) or ed25519 (signature algorithm on curve25519) will be used for key exchange instead of secp256k1.
In this case, the payload would always be: 32 Bytes + Ciphered
regardless of isEphemeralKeyCompressed
.
If you don't know how to choose between x25519 and ed25519, just use the dedicated key exchange function x25519 for efficiency.
Because any 32-byte data is a valid curve25519 public key, the payload would seem random. This property is excellent for circumventing censorship by adversaries.
On isEphemeralKeyCompressed = true
, the payload would be: 33 Bytes + Ciphered
instead of 65 Bytes + Ciphered
.
On isHkdfKeyCompressed = true
, the hkdf key would be derived from ephemeral public key (compressed) + shared public key (compressed)
instead of ephemeral public key (uncompressed) + shared public key (uncompressed)
.
On symmetricAlgorithm = "xchacha20"
, plaintext data would be encrypted with XChaCha20-Poly1305.
On symmetricNonceLength = 12
, the nonce of AES-256-GCM would be 12 bytes. XChaCha20-Poly1305's nonce is always 24 bytes regardless of symmetricNonceLength
.
For compatibility with other ecies libraries, start with the default (secp256k1 with AES-256-GCM).
For speed and security, pick x25519 with XChaCha20-Poly1305.
If you know exactly what you are doing, configure as you wish or build your own ecies logic with this library.
Fully Supported | |
---|---|
Node | ✅ |
Bun | ✅ |
Deno | ⚠️ (only aes) |
Browser | ✅ |
React Native | ✅ |
Via @ecies/ciphers
, node:crypto
's native implementation of AES-256-GCM and XChaCha20-Poly1305 is chosen if available.
This library is browser-friendly, check the example/browser
directory for details. The online demo is hosted here.
Currently it's necessary to polyfill Buffer
for backward compatibility. From v0.5.0, it can run in browsers as is.
If you want a WASM version to run directly in modern browsers or on some blockchains, you can also try ecies-wasm
.
For bun/deno, see example/runtime
. There are some limitations currently, mentioned in @ecies/ciphers
:
chacha20-poly1305
's pure JS implementation is used on bun (node:crypto
's chacha20-poly1305
is not available due to lack of implementation);chacha20-poly1305
does not work on deno. If you found such a problem, try to upgrade deno to the latest version (no guarantee whether it works though).See the React Native demo.
To mitigate security risks, such as supply chain attacks and zero-day vulnerabilities, we only use node:crypto
and these audited dependencies:
Every release is built on GitHub Actions with provenance.
This library is fully auditable as well. We're seeking funding for a professional third-party security audit to verify implementation and identify potential vulnerabilities.
If you rely on this library or value secure open-source cryptography, please consider donating to help fund this audit.
See CHANGELOG.md.
No vulnerabilities found.
Reason
no dangerous workflow patterns detected
Reason
no binaries found in the repo
Reason
license file detected
Details
Reason
packaging workflow detected
Details
Reason
0 existing vulnerabilities detected
Reason
5 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4
Reason
detected GitHub workflow tokens with excessive permissions
Details
Reason
Found 1/25 approved changesets -- score normalized to 0
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
dependency not pinned by hash detected -- score normalized to 0
Details
Reason
security policy file not detected
Details
Reason
project is not fuzzed
Details
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
Score
Last Scanned on 2025-06-23
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn More