diff --git a/README.md b/README.md index e70e837..09bbd73 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,8 @@ let (mut bob_ratchet, public_key) = Ratchet::init_bob(sk); // Creating Bo let mut alice_ratchet = Ratchet::init_alice(sk, public_key); // Creating Alice Ratchet with Bobs PublicKey let data = b"Hello World".to_vec(); // Data to be encrypted -let (header, encrypted) = alice_ratchet.ratchet_encrypt(&data); // Encrypting message with Alice Ratchet (Alice always needs to send the first message) -let decrypted = bob_ratchet.ratchet_decrypt(&header, &encrypted); // Decrypt message with Bobs Ratchet +let (header, encrypted, nonce) = alice_ratchet.ratchet_encrypt(&data); // Encrypting message with Alice Ratchet (Alice always needs to send the first message) +let decrypted = bob_ratchet.ratchet_decrypt(&header, &encrypted, &nonce); // Decrypt message with Bobs Ratchet assert_eq!(data, decrypted) ``` @@ -33,11 +33,11 @@ let (mut bob_ratchet, public_key) = Ratchet::init_bob(sk); // Creating Bo let mut alice_ratchet = Ratchet::init_alice(sk, public_key); // Creating Alice Ratchet with Bobs PublicKey let data = b"Hello World".to_vec(); // Data to be encrypted -let (header1, encrypted1) = alice_ratchet.ratchet_encrypt(&data); // Lost message -let (header2, encrypted2) = alice_ratchet.ratchet_encrypt(&data); // Successful message +let (header1, encrypted1, nonce1) = alice_ratchet.ratchet_encrypt(&data); // Lost message +let (header2, encrypted2, nonce2) = alice_ratchet.ratchet_encrypt(&data); // Successful message -let decrypted2 = bob_ratchet.ratchet_decrypt(&header2, &encrypted2); // Decrypting second message first -let decrypted1 = bob_ratchet.ratchet_decrypt(&header1, &encrypted1); // Decrypting latter message +let decrypted2 = bob_ratchet.ratchet_decrypt(&header2, &encrypted2, &nonce2); // Decrypting second message first +let decrypted1 = bob_ratchet.ratchet_decrypt(&header1, &encrypted1, &nonce1); // Decrypting latter message let comp = decrypted1 == data && decrypted2 == data; assert!(comp); @@ -52,7 +52,7 @@ let sk = [1; 32]; let (mut bob_ratchet, _) = Ratchet::init_bob(sk); let data = b"Hello World".to_vec(); -let (_, _) = bob_ratchet.ratchet_encrypt(&data); +let (_, _, _) = bob_ratchet.ratchet_encrypt(&data); ``` ### Encryption after recieving initial message @@ -67,11 +67,11 @@ let mut alice_ratchet = Ratchet::init_alice(sk, public_key); let data = b"Hello World".to_vec(); -let (header1, encrypted1) = alice_ratchet.ratchet_encrypt(&data); -let _decrypted1 = bob_ratchet.ratchet_decrypt(&header1, &encrypted1); +let (header1, encrypted1, nonce1) = alice_ratchet.ratchet_encrypt(&data); +let _decrypted1 = bob_ratchet.ratchet_decrypt(&header1, &encrypted1, &nonce1); -let (header2, encrypted2) = bob_ratchet.ratchet_encrypt(&data); -let decrypted2 = alice_ratchet.ratchet_decrypt(&header2, &encrypted2); +let (header2, encrypted2, nonce2) = bob_ratchet.ratchet_encrypt(&data); +let decrypted2 = alice_ratchet.ratchet_decrypt(&header2, &encrypted2, &nonce2); assert_eq!(data, decrypted2); ``` @@ -83,6 +83,23 @@ let header_const = Header::from(header_bytes); assert_eq!(header, header_const); ``` +## Example Ratchet with encrypted headers + +```rust +use double_ratchet_2::ratchet::RatchetEncHeader; +let sk = [0; 32]; +let shared_hka = [1; 32]; +let shared_nhkb = [2; 32]; + +let (mut bob_ratchet, public_key) = RatchetEncHeader::init_bob(sk, shared_hka, shared_nhkb); +let mut alice_ratchet = RatchetEncHeader::init_alice(sk, public_key, shared_hka, shared_nhkb); +let data = b"Hello World".to_vec(); + +let (header, encrypted, nonce) = alice_ratchet.ratchet_encrypt(&data); +let decrypted = bob_ratchet.ratchet_decrypt(&header, &encrypted, &nonce); +assert_eq!(data, decrypted) +``` + ## Features Currently the crate only supports one feature: ring. If feature is enabled the crate switches @@ -91,7 +108,7 @@ to ring-compat and uses ring as backend for Sha512 Hashing. May result in slight TODO: - [x] Standard Double Ratchet -- [ ] [Double Ratchet with encrypted headers][3] +- [x] [Double Ratchet with encrypted headers][3] [1]: https://signal.org/docs/specifications/doubleratchet/ [2]: https://signal.org/docs/specifications/doubleratchet/#recommended-cryptographic-algorithms