7 releases (stable)

2.2.0 Dec 12, 2024
2.1.0 Nov 29, 2024
1.0.1 Sep 29, 2024
0.2.0 Sep 25, 2024
0.1.1 Sep 23, 2024

#1182 in Cryptography

Download history 809/week @ 2025-09-24 8/week @ 2025-10-01 302/week @ 2025-10-08 185/week @ 2025-10-15 328/week @ 2025-10-22 233/week @ 2025-10-29 692/week @ 2025-11-05 458/week @ 2025-11-12 553/week @ 2025-11-19 731/week @ 2025-11-26 1705/week @ 2025-12-03 1936/week @ 2025-12-10 2752/week @ 2025-12-17 2627/week @ 2025-12-24 2069/week @ 2025-12-31 3227/week @ 2026-01-07

11,101 downloads per month

Custom license

270KB
770 lines

Fiber Sphinx

A Rust implementation of Sphinx (a.k.a. Onion Message) for Fiber.


lib.rs:

A Rust implementation of Sphinx (a.k.a. Onion Message) for Fiber.

See more in the Specification.

Example

use secp256k1::{PublicKey, SecretKey, Secp256k1};
use fiber_sphinx::OnionPacket;

let secp = Secp256k1::new();
let hops_keys = vec![
    SecretKey::from_slice(&[0x20; 32]).expect("32 bytes, within curve order"),
    SecretKey::from_slice(&[0x21; 32]).expect("32 bytes, within curve order"),
    SecretKey::from_slice(&[0x22; 32]).expect("32 bytes, within curve order"),
];
let hops_path = hops_keys.iter().map(|sk| sk.public_key(&secp)).collect();
let session_key = SecretKey::from_slice(&[0x41; 32]).expect("32 bytes, within curve order");
// Use the first byte to indicate the data len
let hops_data = vec![vec![0], vec![1, 0], vec![5, 0, 1, 2, 3, 4]];
let get_length = |packet_data: &[u8]| Some(packet_data[0] as usize + 1);
let assoc_data = vec![0x42u8; 32];

let packet = OnionPacket::create(
    session_key,
    hops_path,
    hops_data.clone(),
    Some(assoc_data.clone()),
    1300,
    &secp,
).expect("new onion packet");

// Hop 0
let res = packet.peel(&hops_keys[0], Some(&assoc_data), &secp, get_length);
assert!(res.is_ok());
let (data, packet) = res.unwrap();
assert_eq!(data, hops_data[0]);

// Hop 1
let res = packet.peel(&hops_keys[1], Some(&assoc_data), &secp, get_length);
assert!(res.is_ok());
let (data, packet) = res.unwrap();
assert_eq!(data, hops_data[1]);

// Hop 2
let res = packet.peel(&hops_keys[2], Some(&assoc_data), &secp, get_length);
assert!(res.is_ok());
let (data, _packet) = res.unwrap();
assert_eq!(data, hops_data[2]);

Dependencies

~6MB
~87K SLoC