mod cipher;
mod decrypter;
mod encrypter;
mod salter;
pub mod signer;
pub use cipher::Cipher;
pub use decrypter::Decrypter;
pub use encrypter::Encrypter;
pub use salter::Salter;
pub use signer::Signer;
use libsodium_sys;
#[derive(Debug, Clone)]
pub enum Sigmat {
Indexed(Siger),
NonIndexed(Cigar),
}
#[allow(dead_code)]
pub mod cix_var_strm_dex {
use once_cell::sync::Lazy;
use std::collections::HashMap;
pub const X25519_CIPHER_L0: &str = "4C";
pub const X25519_CIPHER_L1: &str = "5C";
pub const X25519_CIPHER_L2: &str = "6C";
pub const X25519_CIPHER_BIG_L0: &str = "7AAC";
pub const X25519_CIPHER_BIG_L1: &str = "8AAC";
pub const X25519_CIPHER_BIG_L2: &str = "9AAC";
pub static MAP: Lazy<HashMap<&'static str, &'static str>> = Lazy::new(|| {
let mut map = HashMap::new();
map.insert("X25519_CIPHER_L0", X25519_CIPHER_L0);
map.insert("X25519_CIPHER_L1", X25519_CIPHER_L1);
map.insert("X25519_CIPHER_L2", X25519_CIPHER_L2);
map.insert("X25519_CIPHER_BIG_L0", X25519_CIPHER_BIG_L0);
map.insert("X25519_CIPHER_BIG_L1", X25519_CIPHER_BIG_L1);
map.insert("X25519_CIPHER_BIG_L2", X25519_CIPHER_BIG_L2);
map
});
pub static TUPLE: [&'static str; 6] = [
X25519_CIPHER_L0,
X25519_CIPHER_L1,
X25519_CIPHER_L2,
X25519_CIPHER_BIG_L0,
X25519_CIPHER_BIG_L1,
X25519_CIPHER_BIG_L2,
];
}
#[allow(dead_code)]
pub mod cix_var_qb64_dex {
use once_cell::sync::Lazy;
use std::collections::HashMap;
pub const X25519_CIPHER_QB64_L0: &str = "4D";
pub const X25519_CIPHER_QB64_L1: &str = "5D";
pub const X25519_CIPHER_QB64_L2: &str = "6D";
pub const X25519_CIPHER_QB64_BIG_L0: &str = "7AAD";
pub const X25519_CIPHER_QB64_BIG_L1: &str = "8AAD";
pub const X25519_CIPHER_QB64_BIG_L2: &str = "9AAD";
pub static MAP: Lazy<HashMap<&'static str, &'static str>> = Lazy::new(|| {
let mut map = HashMap::new();
map.insert("X25519_CIPHER_QB64_L0", X25519_CIPHER_QB64_L0);
map.insert("X25519_CIPHER_QB64_L1", X25519_CIPHER_QB64_L1);
map.insert("X25519_CIPHER_QB64_L2", X25519_CIPHER_QB64_L2);
map.insert("X25519_CIPHER_QB64_BIG_L0", X25519_CIPHER_QB64_BIG_L0);
map.insert("X25519_CIPHER_QB64_BIG_L1", X25519_CIPHER_QB64_BIG_L1);
map.insert("X25519_CIPHER_QB64_BIG_L2", X25519_CIPHER_QB64_BIG_L2);
map
});
pub static TUPLE: [&'static str; 6] = [
X25519_CIPHER_QB64_L0,
X25519_CIPHER_QB64_L1,
X25519_CIPHER_QB64_L2,
X25519_CIPHER_QB64_BIG_L0,
X25519_CIPHER_QB64_BIG_L1,
X25519_CIPHER_QB64_BIG_L2,
];
}
#[allow(dead_code)]
pub mod cix_fix_qb64_dex {
use once_cell::sync::Lazy;
use std::collections::HashMap;
pub const X25519_CIPHER_SEED: &str = "P";
pub const X25519_CIPHER_SALT: &str = "1AAH";
pub static MAP: Lazy<HashMap<&'static str, &'static str>> = Lazy::new(|| {
let mut map = HashMap::new();
map.insert("X25519_CIPHER_SEED", X25519_CIPHER_SEED);
map.insert("X25519_CIPHER_SALT", X25519_CIPHER_SALT);
map
});
pub static TUPLE: [&'static str; 2] = [X25519_CIPHER_SEED, X25519_CIPHER_SALT];
}
#[allow(dead_code)]
pub mod cix_all_qb64_dex {
use super::{cix_fix_qb64_dex, cix_var_qb64_dex};
use once_cell::sync::Lazy;
use std::collections::HashMap;
pub const X25519_CIPHER_SEED: &str = cix_fix_qb64_dex::X25519_CIPHER_SEED;
pub const X25519_CIPHER_SALT: &str = cix_fix_qb64_dex::X25519_CIPHER_SALT;
pub const X25519_CIPHER_QB64_L0: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_L0;
pub const X25519_CIPHER_QB64_L1: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_L1;
pub const X25519_CIPHER_QB64_L2: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_L2;
pub const X25519_CIPHER_QB64_BIG_L0: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_BIG_L0;
pub const X25519_CIPHER_QB64_BIG_L1: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_BIG_L1;
pub const X25519_CIPHER_QB64_BIG_L2: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_BIG_L2;
pub static MAP: Lazy<HashMap<&'static str, &'static str>> = Lazy::new(|| {
let mut map = HashMap::new();
map.insert("X25519_CIPHER_SEED", X25519_CIPHER_SEED);
map.insert("X25519_CIPHER_SALT", X25519_CIPHER_SALT);
map.insert("X25519_CIPHER_QB64_L0", X25519_CIPHER_QB64_L0);
map.insert("X25519_CIPHER_QB64_L1", X25519_CIPHER_QB64_L1);
map.insert("X25519_CIPHER_QB64_L2", X25519_CIPHER_QB64_L2);
map.insert("X25519_CIPHER_QB64_BIG_L0", X25519_CIPHER_QB64_BIG_L0);
map.insert("X25519_CIPHER_QB64_BIG_L1", X25519_CIPHER_QB64_BIG_L1);
map.insert("X25519_CIPHER_QB64_BIG_L2", X25519_CIPHER_QB64_BIG_L2);
map
});
pub static TUPLE: [&'static str; 8] = [
X25519_CIPHER_SEED,
X25519_CIPHER_SALT,
X25519_CIPHER_QB64_L0,
X25519_CIPHER_QB64_L1,
X25519_CIPHER_QB64_L2,
X25519_CIPHER_QB64_BIG_L0,
X25519_CIPHER_QB64_BIG_L1,
X25519_CIPHER_QB64_BIG_L2,
];
}
#[allow(dead_code)]
pub mod cix_var_qb2_dex {
use once_cell::sync::Lazy;
use std::collections::HashMap;
pub const X25519_CIPHER_QB2_L0: &str = "4E";
pub const X25519_CIPHER_QB2_L1: &str = "5E";
pub const X25519_CIPHER_QB2_L2: &str = "6E";
pub const X25519_CIPHER_QB2_BIG_L0: &str = "7AAE";
pub const X25519_CIPHER_QB2_BIG_L1: &str = "8AAE";
pub const X25519_CIPHER_QB2_BIG_L2: &str = "9AAE";
pub static MAP: Lazy<HashMap<&'static str, &'static str>> = Lazy::new(|| {
let mut map = HashMap::new();
map.insert("X25519_CIPHER_QB2_L0", X25519_CIPHER_QB2_L0);
map.insert("X25519_CIPHER_QB2_L1", X25519_CIPHER_QB2_L1);
map.insert("X25519_CIPHER_QB2_L2", X25519_CIPHER_QB2_L2);
map.insert("X25519_CIPHER_QB2_BIG_L0", X25519_CIPHER_QB2_BIG_L0);
map.insert("X25519_CIPHER_QB2_BIG_L1", X25519_CIPHER_QB2_BIG_L1);
map.insert("X25519_CIPHER_QB2_BIG_L2", X25519_CIPHER_QB2_BIG_L2);
map
});
pub static TUPLE: [&'static str; 6] = [
X25519_CIPHER_QB2_L0,
X25519_CIPHER_QB2_L1,
X25519_CIPHER_QB2_L2,
X25519_CIPHER_QB2_BIG_L0,
X25519_CIPHER_QB2_BIG_L1,
X25519_CIPHER_QB2_BIG_L2,
];
}
#[allow(dead_code)]
pub mod cix_var_dex {
use super::{cix_var_qb2_dex, cix_var_qb64_dex, cix_var_strm_dex};
use once_cell::sync::Lazy;
use std::collections::HashMap;
pub const X25519_CIPHER_L0: &str = cix_var_strm_dex::X25519_CIPHER_L0;
pub const X25519_CIPHER_L1: &str = cix_var_strm_dex::X25519_CIPHER_L1;
pub const X25519_CIPHER_L2: &str = cix_var_strm_dex::X25519_CIPHER_L2;
pub const X25519_CIPHER_BIG_L0: &str = cix_var_strm_dex::X25519_CIPHER_BIG_L0;
pub const X25519_CIPHER_BIG_L1: &str = cix_var_strm_dex::X25519_CIPHER_BIG_L1;
pub const X25519_CIPHER_BIG_L2: &str = cix_var_strm_dex::X25519_CIPHER_BIG_L2;
pub const X25519_CIPHER_QB64_L0: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_L0;
pub const X25519_CIPHER_QB64_L1: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_L1;
pub const X25519_CIPHER_QB64_L2: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_L2;
pub const X25519_CIPHER_QB64_BIG_L0: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_BIG_L0;
pub const X25519_CIPHER_QB64_BIG_L1: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_BIG_L1;
pub const X25519_CIPHER_QB64_BIG_L2: &str = cix_var_qb64_dex::X25519_CIPHER_QB64_BIG_L2;
pub const X25519_CIPHER_QB2_L0: &str = cix_var_qb2_dex::X25519_CIPHER_QB2_L0;
pub const X25519_CIPHER_QB2_L1: &str = cix_var_qb2_dex::X25519_CIPHER_QB2_L1;
pub const X25519_CIPHER_QB2_L2: &str = cix_var_qb2_dex::X25519_CIPHER_QB2_L2;
pub const X25519_CIPHER_QB2_BIG_L0: &str = cix_var_qb2_dex::X25519_CIPHER_QB2_BIG_L0;
pub const X25519_CIPHER_QB2_BIG_L1: &str = cix_var_qb2_dex::X25519_CIPHER_QB2_BIG_L1;
pub const X25519_CIPHER_QB2_BIG_L2: &str = cix_var_qb2_dex::X25519_CIPHER_QB2_BIG_L2;
pub static MAP: Lazy<HashMap<&'static str, &'static str>> = Lazy::new(|| {
let mut map = HashMap::new();
map.insert(X25519_CIPHER_L0, "X25519_CIPHER_L0");
map.insert(X25519_CIPHER_L1, "X25519_CIPHER_L1");
map.insert(X25519_CIPHER_L2, "X25519_CIPHER_L2");
map.insert(X25519_CIPHER_BIG_L0, "X25519_CIPHER_BIG_L0");
map.insert(X25519_CIPHER_BIG_L1, "X25519_CIPHER_BIG_L1");
map.insert(X25519_CIPHER_BIG_L2, "X25519_CIPHER_BIG_L2");
map.insert(X25519_CIPHER_QB64_L0, "X25519_CIPHER_QB64_L0");
map.insert(X25519_CIPHER_QB64_L1, "X25519_CIPHER_QB64_L1");
map.insert(X25519_CIPHER_QB64_L2, "X25519_CIPHER_QB64_L2");
map.insert(X25519_CIPHER_QB64_BIG_L0, "X25519_CIPHER_QB64_BIG_L0");
map.insert(X25519_CIPHER_QB64_BIG_L1, "X25519_CIPHER_QB64_BIG_L1");
map.insert(X25519_CIPHER_QB64_BIG_L2, "X25519_CIPHER_QB64_BIG_L2");
map.insert(X25519_CIPHER_QB2_L0, "X25519_CIPHER_QB2_L0");
map.insert(X25519_CIPHER_QB2_L1, "X25519_CIPHER_QB2_L1");
map.insert(X25519_CIPHER_QB2_L2, "X25519_CIPHER_QB2_L2");
map.insert(X25519_CIPHER_QB2_BIG_L0, "X25519_CIPHER_QB2_BIG_L0");
map.insert(X25519_CIPHER_QB2_BIG_L1, "X25519_CIPHER_QB2_BIG_L1");
map.insert(X25519_CIPHER_QB2_BIG_L2, "X25519_CIPHER_QB2_BIG_L2");
map
});
pub static TUPLE: [&'static str; 18] = [
X25519_CIPHER_L0,
X25519_CIPHER_L1,
X25519_CIPHER_L2,
X25519_CIPHER_BIG_L0,
X25519_CIPHER_BIG_L1,
X25519_CIPHER_BIG_L2,
X25519_CIPHER_QB64_L0,
X25519_CIPHER_QB64_L1,
X25519_CIPHER_QB64_L2,
X25519_CIPHER_QB64_BIG_L0,
X25519_CIPHER_QB64_BIG_L1,
X25519_CIPHER_QB64_BIG_L2,
X25519_CIPHER_QB2_L0,
X25519_CIPHER_QB2_L1,
X25519_CIPHER_QB2_L2,
X25519_CIPHER_QB2_BIG_L0,
X25519_CIPHER_QB2_BIG_L1,
X25519_CIPHER_QB2_BIG_L2,
];
}
#[allow(dead_code)]
pub mod cix_dex {
use super::{cix_fix_qb64_dex, cix_var_dex};
use once_cell::sync::Lazy;
use std::collections::HashMap;
pub const X25519_CIPHER_L0: &str = cix_var_dex::X25519_CIPHER_L0;
pub const X25519_CIPHER_L1: &str = cix_var_dex::X25519_CIPHER_L1;
pub const X25519_CIPHER_L2: &str = cix_var_dex::X25519_CIPHER_L2;
pub const X25519_CIPHER_BIG_L0: &str = cix_var_dex::X25519_CIPHER_BIG_L0;
pub const X25519_CIPHER_BIG_L1: &str = cix_var_dex::X25519_CIPHER_BIG_L1;
pub const X25519_CIPHER_BIG_L2: &str = cix_var_dex::X25519_CIPHER_BIG_L2;
pub const X25519_CIPHER_SEED: &str = cix_fix_qb64_dex::X25519_CIPHER_SEED;
pub const X25519_CIPHER_SALT: &str = cix_fix_qb64_dex::X25519_CIPHER_SALT;
pub const X25519_CIPHER_QB64_L0: &str = cix_var_dex::X25519_CIPHER_QB64_L0;
pub const X25519_CIPHER_QB64_L1: &str = cix_var_dex::X25519_CIPHER_QB64_L1;
pub const X25519_CIPHER_QB64_L2: &str = cix_var_dex::X25519_CIPHER_QB64_L2;
pub const X25519_CIPHER_QB64_BIG_L0: &str = cix_var_dex::X25519_CIPHER_QB64_BIG_L0;
pub const X25519_CIPHER_QB64_BIG_L1: &str = cix_var_dex::X25519_CIPHER_QB64_BIG_L1;
pub const X25519_CIPHER_QB64_BIG_L2: &str = cix_var_dex::X25519_CIPHER_QB64_BIG_L2;
pub const X25519_CIPHER_QB2_L0: &str = cix_var_dex::X25519_CIPHER_QB2_L0;
pub const X25519_CIPHER_QB2_L1: &str = cix_var_dex::X25519_CIPHER_QB2_L1;
pub const X25519_CIPHER_QB2_L2: &str = cix_var_dex::X25519_CIPHER_QB2_L2;
pub const X25519_CIPHER_QB2_BIG_L0: &str = cix_var_dex::X25519_CIPHER_QB2_BIG_L0;
pub const X25519_CIPHER_QB2_BIG_L1: &str = cix_var_dex::X25519_CIPHER_QB2_BIG_L1;
pub const X25519_CIPHER_QB2_BIG_L2: &str = cix_var_dex::X25519_CIPHER_QB2_BIG_L2;
pub static MAP: Lazy<HashMap<&'static str, &'static str>> = Lazy::new(|| {
let mut map = HashMap::new();
map.insert(X25519_CIPHER_L0, "X25519_CIPHER_L0");
map.insert(X25519_CIPHER_L1, "X25519_CIPHER_L1");
map.insert(X25519_CIPHER_L2, "X25519_CIPHER_L2");
map.insert(X25519_CIPHER_BIG_L0, "X25519_CIPHER_BIG_L0");
map.insert(X25519_CIPHER_BIG_L1, "X25519_CIPHER_BIG_L1");
map.insert(X25519_CIPHER_BIG_L2, "X25519_CIPHER_BIG_L2");
map.insert(X25519_CIPHER_SEED, "X25519_CIPHER_SEED");
map.insert(X25519_CIPHER_SALT, "X25519_CIPHER_SALT");
map.insert(X25519_CIPHER_QB64_L0, "X25519_CIPHER_QB64_L0");
map.insert(X25519_CIPHER_QB64_L1, "X25519_CIPHER_QB64_L1");
map.insert(X25519_CIPHER_QB64_L2, "X25519_CIPHER_QB64_L2");
map.insert(X25519_CIPHER_QB64_BIG_L0, "X25519_CIPHER_QB64_BIG_L0");
map.insert(X25519_CIPHER_QB64_BIG_L1, "X25519_CIPHER_QB64_BIG_L1");
map.insert(X25519_CIPHER_QB64_BIG_L2, "X25519_CIPHER_QB64_BIG_L2");
map.insert(X25519_CIPHER_QB2_L0, "X25519_CIPHER_QB2_L0");
map.insert(X25519_CIPHER_QB2_L1, "X25519_CIPHER_QB2_L1");
map.insert(X25519_CIPHER_QB2_L2, "X25519_CIPHER_QB2_L2");
map.insert(X25519_CIPHER_QB2_BIG_L0, "X25519_CIPHER_QB2_BIG_L0");
map.insert(X25519_CIPHER_QB2_BIG_L1, "X25519_CIPHER_QB2_BIG_L1");
map.insert(X25519_CIPHER_QB2_BIG_L2, "X25519_CIPHER_QB2_BIG_L2");
map
});
pub static TUPLE: [&'static str; 20] = [
X25519_CIPHER_L0,
X25519_CIPHER_L1,
X25519_CIPHER_L2,
X25519_CIPHER_BIG_L0,
X25519_CIPHER_BIG_L1,
X25519_CIPHER_BIG_L2,
X25519_CIPHER_SEED,
X25519_CIPHER_SALT,
X25519_CIPHER_QB64_L0,
X25519_CIPHER_QB64_L1,
X25519_CIPHER_QB64_L2,
X25519_CIPHER_QB64_BIG_L0,
X25519_CIPHER_QB64_BIG_L1,
X25519_CIPHER_QB64_BIG_L2,
X25519_CIPHER_QB2_L0,
X25519_CIPHER_QB2_L1,
X25519_CIPHER_QB2_L2,
X25519_CIPHER_QB2_BIG_L0,
X25519_CIPHER_QB2_BIG_L1,
X25519_CIPHER_QB2_BIG_L2,
];
}
use crate::cesr::cigar::Cigar;
use crate::cesr::indexing::siger::Siger;
use crate::errors::MatterError;
use sodiumoxide::crypto::box_::curve25519xsalsa20poly1305 as crypto_box;
use sodiumoxide::crypto::sign::ed25519;
pub fn ed25519_pk_to_x25519_pk(
ed_pk: &ed25519::PublicKey,
) -> Result<crypto_box::PublicKey, MatterError> {
let ed_pk_bytes = ed_pk.as_ref();
let mut curve_pk = [0u8; 32];
let result = unsafe {
libsodium_sys::crypto_sign_ed25519_pk_to_curve25519(
curve_pk.as_mut_ptr(),
ed_pk_bytes.as_ptr(),
)
};
if result != 0 {
return Err(MatterError::CryptoError(
"Failed to convert Ed25519 public key to X25519".to_string(),
));
}
crypto_box::PublicKey::from_slice(&curve_pk).ok_or(MatterError::CryptoError(
"Failed to convert Ed25519 public key to X25519".to_string(),
))
}
pub fn ed25519_sk_to_x25519_sk(
ed_sk: &ed25519::SecretKey,
) -> Result<crypto_box::SecretKey, MatterError> {
let ed_sk_bytes = ed_sk.as_ref();
let mut curve_sk = [0u8; 32];
let result = unsafe {
libsodium_sys::crypto_sign_ed25519_sk_to_curve25519(
curve_sk.as_mut_ptr(),
ed_sk_bytes.as_ptr(),
)
};
if result != 0 {
return Err(MatterError::CryptoError(
"Failed to convert Ed25519 secret key to X25519".to_string(),
));
}
crypto_box::SecretKey::from_slice(&curve_sk).ok_or(MatterError::CryptoError(
"Failed to convert Ed25519 secret key to X25519".to_string(),
))
}