pre-stage state for milestone 2 merge

This commit is contained in:
Cassandra Heart 2024-12-18 23:43:56 -06:00
parent e32e71bb0c
commit a9666a9058
No known key found for this signature in database
GPG Key ID: 6352152859385958
7 changed files with 211 additions and 19 deletions

15
Cargo.lock generated
View File

@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
version = 4
[[package]]
name = "aead"
@ -354,6 +354,17 @@ dependencies = [
"uniffi",
]
[[package]]
name = "channelwasm"
version = "0.1.0"
dependencies = [
"channel",
"getrandom",
"serde",
"serde_json",
"wasm-bindgen",
]
[[package]]
name = "ciborium"
version = "0.2.2"
@ -774,8 +785,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
"js-sys",
"libc",
"wasi",
"wasm-bindgen",
]
[[package]]

View File

@ -15,6 +15,7 @@
members = [
"crates/vdf",
"crates/channel",
"crates/channel-wasm",
"crates/classgroup",
"crates/bls48581",
"crates/rpm",

7
crates/channel-wasm/Cargo.lock generated Normal file
View File

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "channel"
version = "0.1.0"

View File

@ -0,0 +1,15 @@
[package]
name = "channelwasm"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
name = "channelwasm"
[dependencies]
wasm-bindgen = "0.2"
channel = { path = "../channel", version = "^0.1.0" }
getrandom = { version = "0.2", features = ["js"] }
serde = "1.0.208"
serde_json = "1.0.117"

View File

@ -0,0 +1,154 @@
use wasm_bindgen::prelude::*;
use channel::*;
use serde::{Deserialize, Serialize};
#[derive(Clone, PartialEq, Serialize, Deserialize)]
pub struct NewDoubleRatchetParameters {
pub session_key: Vec<u8>,
pub sending_header_key: Vec<u8>,
pub next_receiving_header_key: Vec<u8>,
pub is_sender: bool,
pub sending_ephemeral_private_key: Vec<u8>,
pub receiving_ephemeral_key: Vec<u8>
}
#[derive(Clone, PartialEq, Serialize, Deserialize)]
pub struct NewTripleRatchetParameters {
pub peers: Vec<Vec<u8>>,
pub peer_key: Vec<u8>,
pub identity_key: Vec<u8>,
pub signed_pre_key: Vec<u8>,
pub threshold: u64,
pub async_dkg_ratchet: bool
}
#[wasm_bindgen]
pub fn js_new_double_ratchet(params: &str) -> String {
let json: Result<NewDoubleRatchetParameters, serde_json::Error> = serde_json::from_str(params);
match json {
Ok(inputs) => {
return new_double_ratchet(&inputs.session_key, &inputs.sending_header_key, &inputs.next_receiving_header_key, inputs.is_sender, &inputs.sending_ephemeral_private_key, &inputs.receiving_ephemeral_key);
}
Err(e) => {
return e.to_string();
}
}
}
#[wasm_bindgen]
pub fn js_double_ratchet_encrypt(params: &str) -> String {
let json: Result<DoubleRatchetStateAndMessage, serde_json::Error> = serde_json::from_str(params);
match json {
Ok(ratchet_state_and_message) => {
return serde_json::to_string(&double_ratchet_encrypt(ratchet_state_and_message)).unwrap_or_else(|e| e.to_string());
}
Err(e) => {
return e.to_string();
}
}
}
#[wasm_bindgen]
pub fn js_double_ratchet_decrypt(params: &str) -> String {
let json: Result<DoubleRatchetStateAndEnvelope, serde_json::Error> = serde_json::from_str(params);
match json {
Ok(ratchet_state_and_envelope) => {
return serde_json::to_string(&double_ratchet_decrypt(ratchet_state_and_envelope)).unwrap_or_else(|e| e.to_string());
}
Err(e) => {
return e.to_string();
}
}
}
#[wasm_bindgen]
pub fn js_new_triple_ratchet(params: &str) -> String {
let json: Result<NewTripleRatchetParameters, serde_json::Error> = serde_json::from_str(params);
match json {
Ok(input) => {
return serde_json::to_string(&new_triple_ratchet(&input.peers, &input.peer_key, &input.identity_key, &input.signed_pre_key, input.threshold, input.async_dkg_ratchet)).unwrap_or_else(|e| e.to_string());
}
Err(e) => {
return e.to_string();
}
}
}
#[wasm_bindgen]
pub fn js_triple_ratchet_init_round_1(params: &str) -> String {
let json: Result<TripleRatchetStateAndMetadata, serde_json::Error> = serde_json::from_str(params);
match json {
Ok(ratchet_state_and_metadata) => {
return serde_json::to_string(&triple_ratchet_init_round_1(ratchet_state_and_metadata)).unwrap_or_else(|e| e.to_string());
}
Err(e) => {
return e.to_string();
}
}
}
#[wasm_bindgen]
pub fn js_triple_ratchet_init_round_2(params: &str) -> String {
let json: Result<TripleRatchetStateAndMetadata, serde_json::Error> = serde_json::from_str(params);
match json {
Ok(ratchet_state_and_metadata) => {
return serde_json::to_string(&triple_ratchet_init_round_2(ratchet_state_and_metadata)).unwrap_or_else(|e| e.to_string());
}
Err(e) => {
return e.to_string();
}
}
}
#[wasm_bindgen]
pub fn js_triple_ratchet_init_round_3(params: &str) -> String {
let json: Result<TripleRatchetStateAndMetadata, serde_json::Error> = serde_json::from_str(params);
match json {
Ok(ratchet_state_and_metadata) => {
return serde_json::to_string(&triple_ratchet_init_round_3(ratchet_state_and_metadata)).unwrap_or_else(|e| e.to_string());
}
Err(e) => {
return e.to_string();
}
}
}
#[wasm_bindgen]
pub fn js_triple_ratchet_init_round_4(params: &str) -> String {
let json: Result<TripleRatchetStateAndMetadata, serde_json::Error> = serde_json::from_str(params);
match json {
Ok(ratchet_state_and_metadata) => {
return serde_json::to_string(&triple_ratchet_init_round_4(ratchet_state_and_metadata)).unwrap_or_else(|e| e.to_string());
}
Err(e) => {
return e.to_string();
}
}
}
#[wasm_bindgen]
pub fn js_triple_ratchet_encrypt(params: &str) -> String {
let json: Result<TripleRatchetStateAndMessage, serde_json::Error> = serde_json::from_str(params);
match json {
Ok(ratchet_state_and_message) => {
return serde_json::to_string(&triple_ratchet_encrypt(ratchet_state_and_message)).unwrap_or_else(|e| e.to_string());
}
Err(e) => {
return e.to_string();
}
}
}
#[wasm_bindgen]
pub fn js_triple_ratchet_decrypt(params: &str) -> String {
let json: Result<TripleRatchetStateAndEnvelope, serde_json::Error> = serde_json::from_str(params);
match json {
Ok(ratchet_state_and_envelope) => {
return serde_json::to_string(&triple_ratchet_decrypt(ratchet_state_and_envelope)).unwrap_or_else(|e| e.to_string());
}
Err(e) => {
return e.to_string();
}
}
}

View File

@ -1,4 +1,5 @@
use base64::prelude::*;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use ed448_goldilocks_plus::{elliptic_curve::group::GroupEncoding, EdwardsPoint, Scalar};
@ -8,31 +9,31 @@ pub(crate) mod protocols;
uniffi::include_scaffolding!("lib");
#[derive(Clone, PartialEq)]
#[derive(Clone, PartialEq, Serialize, Deserialize)]
pub struct DoubleRatchetStateAndEnvelope {
pub ratchet_state: String,
pub envelope: String,
}
#[derive(Clone, PartialEq)]
#[derive(Clone, PartialEq, Serialize, Deserialize)]
pub struct DoubleRatchetStateAndMessage {
pub ratchet_state: String,
pub message: Vec<u8>,
}
#[derive(Clone, PartialEq)]
#[derive(Clone, PartialEq, Serialize, Deserialize)]
pub struct TripleRatchetStateAndMetadata {
pub ratchet_state: String,
pub metadata: HashMap<String, String>,
}
#[derive(Clone, PartialEq)]
#[derive(Clone, PartialEq, Serialize, Deserialize)]
pub struct TripleRatchetStateAndEnvelope {
pub ratchet_state: String,
pub envelope: String,
}
#[derive(Clone, PartialEq)]
#[derive(Clone, PartialEq, Serialize, Deserialize)]
pub struct TripleRatchetStateAndMessage {
pub ratchet_state: String,
pub message: Vec<u8>,
@ -40,11 +41,11 @@ pub struct TripleRatchetStateAndMessage {
pub fn new_double_ratchet(session_key: &Vec<u8>, sending_header_key: &Vec<u8>, next_receiving_header_key: &Vec<u8>, is_sender: bool, sending_ephemeral_private_key: &Vec<u8>, receiving_ephemeral_key: &Vec<u8>) -> String {
if sending_ephemeral_private_key.len() != 56 {
return "".to_string();
return "invalid private key length".to_string();
}
if receiving_ephemeral_key.len() != 57 {
return "".to_string();
return "invalid public key length".to_string();
}
let mut sending_ephemeral_private_key_bytes = [0u8; 56];
@ -56,7 +57,7 @@ pub fn new_double_ratchet(session_key: &Vec<u8>, sending_header_key: &Vec<u8>, n
let sending_key = Scalar::from_bytes(&sending_ephemeral_private_key_bytes.into());
let receiving_key = EdwardsPoint::from_bytes(&receiving_ephemeral_key_bytes.into()).into_option();
if receiving_key.is_none() {
return "".to_string();
return "invalid receiving key".to_string();
}
let participant = DoubleRatchetParticipant::new(
@ -69,12 +70,12 @@ pub fn new_double_ratchet(session_key: &Vec<u8>, sending_header_key: &Vec<u8>, n
);
if participant.is_err() {
return "".to_string();
return participant.unwrap_err().to_string();
}
let json = participant.unwrap().to_json();
if json.is_err() {
return "".to_string();
return json.unwrap_err().to_string();
}
return json.unwrap();
@ -86,7 +87,7 @@ pub fn double_ratchet_encrypt(ratchet_state_and_message: DoubleRatchetStateAndMe
if participant.is_err() {
return DoubleRatchetStateAndEnvelope{
ratchet_state: ratchet_state,
ratchet_state: participant.unwrap_err().to_string(),
envelope: "".to_string(),
};
}
@ -97,7 +98,7 @@ pub fn double_ratchet_encrypt(ratchet_state_and_message: DoubleRatchetStateAndMe
if envelope.is_err() {
return DoubleRatchetStateAndEnvelope{
ratchet_state: ratchet_state,
envelope: "".to_string(),
envelope: envelope.unwrap_err().to_string(),
};
}
@ -105,7 +106,7 @@ pub fn double_ratchet_encrypt(ratchet_state_and_message: DoubleRatchetStateAndMe
let participant_json = dr.to_json();
if participant_json.is_err() {
return DoubleRatchetStateAndEnvelope{
ratchet_state: ratchet_state,
ratchet_state: participant_json.unwrap_err().to_string(),
envelope: "".to_string(),
};
}
@ -114,7 +115,7 @@ pub fn double_ratchet_encrypt(ratchet_state_and_message: DoubleRatchetStateAndMe
if envelope_json.is_err() {
return DoubleRatchetStateAndEnvelope{
ratchet_state: ratchet_state,
envelope: "".to_string(),
envelope: envelope_json.unwrap_err().to_string(),
};
}
@ -142,14 +143,14 @@ pub fn double_ratchet_decrypt(ratchet_state_and_envelope: DoubleRatchetStateAndE
if message.is_err() {
return DoubleRatchetStateAndMessage{
ratchet_state: ratchet_state,
message: vec![],
message: message.unwrap_err().to_string().as_bytes().to_vec(),
};
}
let participant_json = dr.to_json();
if participant_json.is_err() {
return DoubleRatchetStateAndMessage{
ratchet_state: ratchet_state,
ratchet_state: participant_json.unwrap_err().to_string(),
message: vec![],
};
}
@ -170,14 +171,14 @@ pub fn new_triple_ratchet(peers: &Vec<Vec<u8>>, peer_key: &Vec<u8>, identity_key
if identity_key.len() != 56 {
return TripleRatchetStateAndMetadata{
ratchet_state: "invalid idk".to_string(),
ratchet_state: "invalid identity key".to_string(),
metadata: HashMap::new(),
};
}
if signed_pre_key.len() != 56 {
return TripleRatchetStateAndMetadata{
ratchet_state: "invalid spk".to_string(),
ratchet_state: "invalid signed pre key".to_string(),
metadata: HashMap::new(),
};
}

View File

@ -20,6 +20,7 @@ const CHAIN_KEY: u8 = 0x01;
const MESSAGE_KEY: u8 = 0x02;
const AEAD_KEY: u8 = 0x03;
#[derive(Debug)]
pub struct DoubleRatchetParticipant {
sending_ephemeral_private_key: Scalar,
receiving_ephemeral_key: EdwardsPoint,