ed25519_enc: A Rust and Node.js library that facilitates secure encryption and decryption by converting Ed25519 keys to X25519 keys. It utilizes elliptic-curve Diffie-Hellman (ECDH) to derive a shared secret, which is then used for symmetric encryption with AES-256-GCM.
This project was bootstrapped by create-neon.
- NPM usage
- Cargo usage
- Building ed25519_enc
- Exploring ed25519_enc
- Available Scripts
- Project Layout
- Learn More
- LICENSE
Table of contents generated with markdown-toc
npm i ed25519_enc
import { to_x25519_priv } from "ed25519_enc";
...
const ed25519_priv = Buffer.from(
"D12549B4AE46086002E4110B1F94D0BA942C2967AA83D3003590FD7A5087C6A8",
"hex"
);
const x25519_priv = to_x25519_priv(ed25519_priv);
import { to_x25519_pub } from "ed25519_enc";
...
const ed25519_pub = Buffer.from(
"B68F106DAA004E7AE715C5159E1C27CB864EED20D3ACB332BD6F87E89226E925",
"hex"
);
const x25519_pub = to_x25519_pub(ed25519_pub);
import { encrypt } from "ed25519_enc";
...
const sender_priv = Buffer.from(
"D12549B4AE46086002E4110B1F94D0BA942C2967AA83D3003590FD7A5087C6A8",
"hex"
);
const sender_pub = Buffer.from(
"B68F106DAA004E7AE715C5159E1C27CB864EED20D3ACB332BD6F87E89226E925",
"hex"
);
const receiver_priv = Buffer.from(
"3C659C3FD72E56861C81C1684C5C342958645E2C459A11A2282B46161E47BF2E",
"hex"
);
const receiver_pub = Buffer.from(
"C02ABDA285014F207D5D31219E0F5647484F6DFF09E595DF38BDBDB07CE6E1B2",
"hex"
);
const data = Buffer.from("Hello world!");
const encrypted_data = encrypt(sender_priv, receiver_pub, data);
const decrypted_data = decrypt(receiver_priv, sender_pub, encrypted_data);
console.log("Decrypted data: ", new TextDecoder().decode(dec_data));
// Decrypted data: Hello World!
cargo add ed25519_enc
use ed25519_enc::{to_x25519_priv};
...
let ed25519_priv: [u8; 32] = [
157, 097, 177, 157, 239, 253, 090, 096,
186, 132, 074, 244, 146, 236, 044, 196,
068, 073, 197, 105, 123, 050, 105, 025,
112, 059, 172, 003, 028, 174, 127, 096,
];
let x25519_priv: [u8; 32] = to_x25519_priv(ed25519_priv);
use ed25519_enc::{to_x25519_pub};
...
let ed25519_pub: [u8; 32] = [
215, 090, 152, 001, 130, 177, 010, 183,
213, 075, 254, 211, 201, 100, 007, 058,
014, 225, 114, 243, 218, 166, 035, 037,
175, 002, 026, 104, 247, 007, 081, 026,
];
let x25519_pub: [u8; 32] = to_x25519_pub(ed25519_pub);
use ed25519_enc::{encrypt, decrypt}
...
let sender_ed25519_priv: [u8; 32] = [
157, 097, 177, 157, 239, 253, 090, 096,
186, 132, 074, 244, 146, 236, 044, 196,
068, 073, 197, 105, 123, 050, 105, 025,
112, 059, 172, 003, 028, 174, 127, 096,
];
let sender_ed25519_pub: [u8; 32] = [
215, 090, 152, 001, 130, 177, 010, 183,
213, 075, 254, 211, 201, 100, 007, 058,
014, 225, 114, 243, 218, 166, 035, 037,
175, 002, 026, 104, 247, 007, 081, 026,
];
let receiver_ed25519_priv: [u8; 32] = [
074, 032, 095, 005, 083, 039, 001, 050,
066, 088, 090, 056, 021, 011, 031, 011,
087, 068, 033, 014, 025, 028, 010, 043,
024, 066, 058, 076, 030, 074, 017, 076,
];
let receiver_ed25519_pub: [u8; 32] = [
204, 095, 038, 061, 080, 055, 143, 219,
253, 138, 015, 190, 145, 041, 028, 081,
001, 004, 227, 080, 197, 078, 000, 043,
160, 130, 158, 047, 197, 058, 228, 232
];
let data: &[u8] = b"Hello world!";
let enc_msg: Vec<u8> = encrypt(
sender_ed25519_priv,
receiver_ed25519_pub,
data
);
let dec_data: Vec<u8> = decrypt(
receiver_ed25519_priv,
sender_ed25519_pub,
&enc_msg
);
println!("{:?}", dec_data); // should prints "Hello world!"
Building ed25519_enc requires a supported version of Node and Rust.
To run the build, run:
$ npm run build
This command uses the @neon-rs/cli utility to assemble the binary Node addon from the output of cargo
.
After building ed25519_enc, you can explore its exports at the Node console:
$ npm i
$ npm run build
$ node
> const lib = require('.');
> const sender_priv = Buffer.from("D12549B4AE46086002E4110B1F94D0BA942C2967AA83D3003590FD7A5087C6A8", "hex");
> const sender_pub = Buffer.from("B68F106DAA004E7AE715C5159E1C27CB864EED20D3ACB332BD6F87E89226E925", "hex");
> const receiver_priv = Buffer.from("3C659C3FD72E56861C81C1684C5C342958645E2C459A11A2282B46161E47BF2E", "hex");
> const receiver_pub = Buffer.from("C02ABDA285014F207D5D31219E0F5647484F6DFF09E595DF38BDBDB07CE6E1B2", "hex");
> const data = Buffer.from("Hello World!");
> const enc_data = lib.encrypt(sender_priv, receiver_pub, data);
> const dec_data = lib.decrypt(receiver_priv, sender_pub, enc_data);
> console.log("Decrypted data: ", new TextDecoder().decode(dec_data));
Decrypted data: Hello World!
In the project directory, you can run:
Builds the Node addon (index.node
) from source, generating a release build with cargo --release
.
Additional cargo build
arguments may be passed to npm run build
and similar commands. For example, to enable a cargo feature:
npm run build -- --feature=beetle
Similar to npm run build
but generates a debug build with cargo
.
Similar to npm run build
but uses cross-rs to cross-compile for another platform. Use the CARGO_BUILD_TARGET
environment variable to select the build target.
Initiate a full build and publication of a new patch release of this library via GitHub Actions.
Initiate a dry run of a patch release of this library via GitHub Actions. This performs a full build but does not publish the final result.
Runs the unit tests by calling cargo test
. You can learn more about adding tests to your Rust code from the Rust book.
The directory structure of this project is:
ed25519_enc/
├── Cargo.toml
├── README.md
├── lib/
├── src/
| ├── index.mts
| └── index.cts
├── crates/
| └── ed25519_enc/
| └── src/
| └── lib.rs
├── platforms/
├── package.json
└── target/
Entry | Purpose |
---|---|
Cargo.toml |
The Cargo manifest file, which informs the cargo command. |
README.md |
This file. |
lib/ |
The directory containing the generated output from tsc. |
src/ |
The directory containing the TypeScript source files. |
index.mts |
Entry point for when this library is loaded via ESM import syntax. |
index.cts |
Entry point for when this library is loaded via CJS require . |
crates/ |
The directory tree containing the Rust source code for the project. |
lib.rs |
Entry point for the Rust source code. |
platforms/ |
The directory containing distributions of the binary addon backend for each platform supported by this library. |
package.json |
The npm manifest file, which informs the npm command. |
target/ |
Binary artifacts generated by the Rust build. |
Learn more about:
MIT or Apache License 2.0 (at your option).