mirror of
https://gitlab.com/veilid/veilid.git
synced 2025-07-28 09:24:12 -04:00
Fix compile for the NONE CryptoSystem
This commit is contained in:
parent
3dba776c91
commit
eda436f264
6 changed files with 53 additions and 36 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -6463,6 +6463,7 @@ dependencies = [
|
||||||
"console_error_panic_hook",
|
"console_error_panic_hook",
|
||||||
"curve25519-dalek",
|
"curve25519-dalek",
|
||||||
"data-encoding",
|
"data-encoding",
|
||||||
|
"digest 0.10.7",
|
||||||
"directories",
|
"directories",
|
||||||
"ed25519-dalek",
|
"ed25519-dalek",
|
||||||
"enumset",
|
"enumset",
|
||||||
|
|
|
@ -45,8 +45,8 @@ rt-tokio = [
|
||||||
]
|
]
|
||||||
|
|
||||||
# Crypto support features
|
# Crypto support features
|
||||||
enable-crypto-vld0 = []
|
enable-crypto-vld0 = [ "ed25519-dalek", "x25519-dalek", "curve25519-dalek", "blake3", "chacha20poly1305", "chacha20", "argon2" ]
|
||||||
enable-crypto-none = []
|
enable-crypto-none = [ "ed25519-dalek", "curve25519-dalek", "blake3", "argon2", "digest" ]
|
||||||
|
|
||||||
# Debugging and testing features
|
# Debugging and testing features
|
||||||
verbose-tracing = []
|
verbose-tracing = []
|
||||||
|
@ -113,27 +113,28 @@ lock_api = "0.4.12"
|
||||||
stop-token = { version = "0.7.0", default-features = false }
|
stop-token = { version = "0.7.0", default-features = false }
|
||||||
|
|
||||||
# Crypto
|
# Crypto
|
||||||
ed25519-dalek = { version = "2.1.1", default-features = false, features = [
|
ed25519-dalek = { version = "2.1.1", optional = true, default-features = false, features = [
|
||||||
"alloc",
|
"alloc",
|
||||||
"rand_core",
|
"rand_core",
|
||||||
"digest",
|
"digest",
|
||||||
"zeroize",
|
"zeroize",
|
||||||
] }
|
] }
|
||||||
x25519-dalek = { version = "2.0.1", default-features = false, features = [
|
x25519-dalek = { version = "2.0.1", optional = true, default-features = false, features = [
|
||||||
"alloc",
|
"alloc",
|
||||||
"static_secrets",
|
"static_secrets",
|
||||||
"zeroize",
|
"zeroize",
|
||||||
"precomputed-tables",
|
"precomputed-tables",
|
||||||
] }
|
] }
|
||||||
curve25519-dalek = { version = "4.1.3", default-features = false, features = [
|
curve25519-dalek = { version = "4.1.3", optional = true, default-features = false, features = [
|
||||||
"alloc",
|
"alloc",
|
||||||
"zeroize",
|
"zeroize",
|
||||||
"precomputed-tables",
|
"precomputed-tables",
|
||||||
] }
|
] }
|
||||||
blake3 = { version = "1.8.2" }
|
blake3 = { version = "1.8.2", optional = true }
|
||||||
chacha20poly1305 = "0.10.1"
|
chacha20poly1305 = { version = "0.10.1", optional = true }
|
||||||
chacha20 = "0.9.1"
|
chacha20 = { version = "0.9.1", optional = true }
|
||||||
argon2 = "0.5.3"
|
argon2 = { version = "0.5.3", optional = true }
|
||||||
|
digest = { version = "0.10.7", optional = true, features = [ "rand_core" ]}
|
||||||
|
|
||||||
# Network
|
# Network
|
||||||
async-std-resolver = { version = "0.24.4", optional = true }
|
async-std-resolver = { version = "0.24.4", optional = true }
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
use super::*;
|
use super::*;
|
||||||
use argon2::password_hash::Salt;
|
use argon2::password_hash::Salt;
|
||||||
use data_encoding::BASE64URL_NOPAD;
|
use data_encoding::BASE64URL_NOPAD;
|
||||||
|
use digest::rand_core::RngCore;
|
||||||
use digest::Digest;
|
use digest::Digest;
|
||||||
use rand::RngCore;
|
|
||||||
const AEAD_OVERHEAD: usize = PUBLIC_KEY_LENGTH;
|
const AEAD_OVERHEAD: usize = PUBLIC_KEY_LENGTH;
|
||||||
pub const CRYPTO_KIND_NONE: CryptoKind = CryptoKind(*b"NONE");
|
pub const CRYPTO_KIND_NONE: CryptoKind = CryptoKind(*b"NONE");
|
||||||
|
|
||||||
|
@ -49,11 +49,12 @@ fn is_bytes_eq_32(a: &[u8], v: u8) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// None CryptoSystem
|
/// None CryptoSystem
|
||||||
pub struct CryptoSystemNONE {
|
pub(crate) struct CryptoSystemNONE {
|
||||||
registry: VeilidComponentRegistry,
|
registry: VeilidComponentRegistry,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CryptoSystemNONE {
|
impl CryptoSystemNONE {
|
||||||
|
#[must_use]
|
||||||
pub(crate) fn new(registry: VeilidComponentRegistry) -> Self {
|
pub(crate) fn new(registry: VeilidComponentRegistry) -> Self {
|
||||||
Self { registry }
|
Self { registry }
|
||||||
}
|
}
|
||||||
|
@ -66,7 +67,7 @@ impl CryptoSystem for CryptoSystemNONE {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn crypto(&self) -> VeilidComponentGuard<'_, Crypto> {
|
fn crypto(&self) -> VeilidComponentGuard<'_, Crypto> {
|
||||||
self.registry().lookup::<Crypto>().unwrap()
|
self.registry.lookup::<Crypto>().unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cached Operations
|
// Cached Operations
|
||||||
|
@ -115,12 +116,12 @@ impl CryptoSystem for CryptoSystemNONE {
|
||||||
|
|
||||||
fn random_nonce(&self) -> Nonce {
|
fn random_nonce(&self) -> Nonce {
|
||||||
let mut nonce = [0u8; NONCE_LENGTH];
|
let mut nonce = [0u8; NONCE_LENGTH];
|
||||||
random_bytes(&mut nonce).unwrap();
|
random_bytes(&mut nonce);
|
||||||
Nonce::new(nonce)
|
Nonce::new(nonce)
|
||||||
}
|
}
|
||||||
fn random_shared_secret(&self) -> SharedSecret {
|
fn random_shared_secret(&self) -> SharedSecret {
|
||||||
let mut s = [0u8; SHARED_SECRET_LENGTH];
|
let mut s = [0u8; SHARED_SECRET_LENGTH];
|
||||||
random_bytes(&mut s).unwrap();
|
random_bytes(&mut s);
|
||||||
SharedSecret::new(s)
|
SharedSecret::new(s)
|
||||||
}
|
}
|
||||||
fn compute_dh(&self, key: &PublicKey, secret: &SecretKey) -> VeilidAPIResult<SharedSecret> {
|
fn compute_dh(&self, key: &PublicKey, secret: &SecretKey) -> VeilidAPIResult<SharedSecret> {
|
||||||
|
@ -130,8 +131,8 @@ impl CryptoSystem for CryptoSystemNONE {
|
||||||
fn generate_keypair(&self) -> KeyPair {
|
fn generate_keypair(&self) -> KeyPair {
|
||||||
none_generate_keypair()
|
none_generate_keypair()
|
||||||
}
|
}
|
||||||
fn generate_hash(&self, data: &[u8]) -> PublicKey {
|
fn generate_hash(&self, data: &[u8]) -> HashDigest {
|
||||||
PublicKey::new(*blake3::hash(data).as_bytes())
|
HashDigest::new(*blake3::hash(data).as_bytes())
|
||||||
}
|
}
|
||||||
fn generate_hash_reader(&self, reader: &mut dyn std::io::Read) -> VeilidAPIResult<PublicKey> {
|
fn generate_hash_reader(&self, reader: &mut dyn std::io::Read) -> VeilidAPIResult<PublicKey> {
|
||||||
let mut hasher = blake3::Hasher::new();
|
let mut hasher = blake3::Hasher::new();
|
||||||
|
@ -150,14 +151,14 @@ impl CryptoSystem for CryptoSystemNONE {
|
||||||
};
|
};
|
||||||
v
|
v
|
||||||
}
|
}
|
||||||
fn validate_hash(&self, data: &[u8], dht_key: &PublicKey) -> bool {
|
fn validate_hash(&self, data: &[u8], dht_key: &HashDigest) -> bool {
|
||||||
let bytes = *blake3::hash(data).as_bytes();
|
let bytes = *blake3::hash(data).as_bytes();
|
||||||
bytes == dht_key.bytes
|
bytes == dht_key.bytes
|
||||||
}
|
}
|
||||||
fn validate_hash_reader(
|
fn validate_hash_reader(
|
||||||
&self,
|
&self,
|
||||||
reader: &mut dyn std::io::Read,
|
reader: &mut dyn std::io::Read,
|
||||||
dht_key: &PublicKey,
|
dht_key: &HashDigest,
|
||||||
) -> VeilidAPIResult<bool> {
|
) -> VeilidAPIResult<bool> {
|
||||||
let mut hasher = blake3::Hasher::new();
|
let mut hasher = blake3::Hasher::new();
|
||||||
std::io::copy(reader, &mut hasher).map_err(VeilidAPIError::generic)?;
|
std::io::copy(reader, &mut hasher).map_err(VeilidAPIError::generic)?;
|
||||||
|
@ -165,8 +166,8 @@ impl CryptoSystem for CryptoSystemNONE {
|
||||||
Ok(bytes == dht_key.bytes)
|
Ok(bytes == dht_key.bytes)
|
||||||
}
|
}
|
||||||
// Distance Metric
|
// Distance Metric
|
||||||
fn distance(&self, key1: &PublicKey, key2: &PublicKey) -> HashDistance {
|
fn distance(&self, key1: &HashDigest, key2: &HashDigest) -> HashDistance {
|
||||||
let mut bytes = [0u8; PUBLIC_KEY_LENGTH];
|
let mut bytes = [0u8; HASH_DIGEST_LENGTH];
|
||||||
|
|
||||||
for (n, byte) in bytes.iter_mut().enumerate() {
|
for (n, byte) in bytes.iter_mut().enumerate() {
|
||||||
*byte = key1.bytes[n] ^ key2.bytes[n];
|
*byte = key1.bytes[n] ^ key2.bytes[n];
|
||||||
|
@ -197,6 +198,7 @@ impl CryptoSystem for CryptoSystemNONE {
|
||||||
sig_bytes[0..32].copy_from_slice(&in_sig_bytes[0..32]);
|
sig_bytes[0..32].copy_from_slice(&in_sig_bytes[0..32]);
|
||||||
sig_bytes[32..64].copy_from_slice(&do_xor_32(&in_sig_bytes[32..64], &dht_key_secret.bytes));
|
sig_bytes[32..64].copy_from_slice(&do_xor_32(&in_sig_bytes[32..64], &dht_key_secret.bytes));
|
||||||
let dht_sig = Signature::new(sig_bytes.into());
|
let dht_sig = Signature::new(sig_bytes.into());
|
||||||
|
println!("DEBUG dht_sig: {:?}", dht_sig);
|
||||||
Ok(dht_sig)
|
Ok(dht_sig)
|
||||||
}
|
}
|
||||||
fn verify(
|
fn verify(
|
||||||
|
|
|
@ -64,8 +64,17 @@ pub async fn test_bootstrap_v1() {
|
||||||
let dial_info_converter = MockDialInfoConverter::default();
|
let dial_info_converter = MockDialInfoConverter::default();
|
||||||
|
|
||||||
let bsrec = make_mock_bootstrap_record(true);
|
let bsrec = make_mock_bootstrap_record(true);
|
||||||
let signing_key_pairs = [TypedKeyPair::from_str("VLD0:W7ENB-SUWpPA7usY8ORVQf_si5QmFbD1Uqa89Jg2Uc0:hbdjau5sr3rBNwN68XeWLg3rfXnXLaLqfbbqhELqV1E").expect("should parse keypair"),
|
let signing_key_pairs = [
|
||||||
TypedKeyPair::from_str("VLD0:v6XPfyOoCP_ZP-CWFNrf_pF_dpxsq74p2LW_Q5Q4yPQ:n-DhHtOU7KWQkdp5to8cpBa_u0RFt2IDZzXPqMTq4O0").expect("should parse keypair")];
|
#[cfg(feature = "enable-crypto-vld0")]
|
||||||
|
TypedKeyPair::from_str("VLD0:W7ENB-SUWpPA7usY8ORVQf_si5QmFbD1Uqa89Jg2Uc0:hbdjau5sr3rBNwN68XeWLg3rfXnXLaLqfbbqhELqV1E").expect("should parse keypair"),
|
||||||
|
#[cfg(feature = "enable-crypto-vld0")]
|
||||||
|
TypedKeyPair::from_str("VLD0:v6XPfyOoCP_ZP-CWFNrf_pF_dpxsq74p2LW_Q5Q4yPQ:n-DhHtOU7KWQkdp5to8cpBa_u0RFt2IDZzXPqMTq4O0").expect("should parse keypair"),
|
||||||
|
#[cfg(feature = "enable-crypto-none")]
|
||||||
|
TypedKeyPair::from_str("NONE:xMzvYmY1C0B-pUrB9V1pnUf6A1hSqNTOju39UaFxQoU:OzMQnZnK9L-BWrU-CqKWYrgF_KetVysxcRICrl6OvXo").expect("should parse keypair"),
|
||||||
|
#[cfg(feature = "enable-crypto-none")]
|
||||||
|
TypedKeyPair::from_str("NONE:xuYisL8R7-qoUQiJtHVpvemzd1x3mH246cMJSkMp6BQ:ORndT0DuEBVXrvd2S4qWQhZMiKOIZ4JHFjz2tbzWF-s").expect("should parse keypair"),
|
||||||
|
];
|
||||||
|
println!("signing_key_pairs: {:?}", signing_key_pairs);
|
||||||
let signing_keys = signing_key_pairs
|
let signing_keys = signing_key_pairs
|
||||||
.iter()
|
.iter()
|
||||||
.map(|skp| TypedPublicKey::new(skp.kind, skp.value.key))
|
.map(|skp| TypedPublicKey::new(skp.kind, skp.value.key))
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::{routing_table::*, RegisteredComponents};
|
use crate::{routing_table::*, RegisteredComponents, VALID_CRYPTO_KINDS};
|
||||||
|
|
||||||
fn make_mock_typed_node_id(kind: CryptoKind, idx: u8) -> TypedNodeId {
|
fn make_mock_typed_node_id(kind: CryptoKind, idx: u8) -> TypedNodeId {
|
||||||
TypedNodeId::new(
|
TypedNodeId::new(
|
||||||
|
@ -11,10 +11,12 @@ fn make_mock_typed_node_id(kind: CryptoKind, idx: u8) -> TypedNodeId {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_mock_typed_node_id_group(vld0: bool, unknown: bool) -> TypedNodeIdGroup {
|
fn make_mock_typed_node_id_group(valid_kinds: bool, unknown: bool) -> TypedNodeIdGroup {
|
||||||
let mut tks = TypedNodeIdGroup::new();
|
let mut tks = TypedNodeIdGroup::new();
|
||||||
if vld0 {
|
if valid_kinds {
|
||||||
tks.add(make_mock_typed_node_id(CRYPTO_KIND_VLD0, 0));
|
VALID_CRYPTO_KINDS.iter().for_each(|k| {
|
||||||
|
tks.add(make_mock_typed_node_id(*k, 0));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if unknown {
|
if unknown {
|
||||||
tks.add(make_mock_typed_node_id(CryptoKind([1, 2, 3, 4]), 0));
|
tks.add(make_mock_typed_node_id(CryptoKind([1, 2, 3, 4]), 0));
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
use super::test_veilid_config::*;
|
use super::test_veilid_config::*;
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|
||||||
|
const TEST_CRYPTO_KIND: CryptoKind = VALID_CRYPTO_KINDS[0];
|
||||||
|
|
||||||
use lazy_static::*;
|
use lazy_static::*;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref BOGUS_KEY: TypedRecordKey = TypedRecordKey::from(CryptoTyped::new(
|
static ref BOGUS_KEY: TypedRecordKey = TypedRecordKey::from(CryptoTyped::new(
|
||||||
CRYPTO_KIND_VLD0,
|
TEST_CRYPTO_KIND,
|
||||||
RecordKey::new([0u8; 32])
|
RecordKey::new([0u8; 32])
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -42,7 +44,7 @@ pub async fn test_create_delete_dht_record_simple(api: VeilidAPI) {
|
||||||
let rc = api.routing_context().unwrap();
|
let rc = api.routing_context().unwrap();
|
||||||
|
|
||||||
let rec = rc
|
let rec = rc
|
||||||
.create_dht_record(DHTSchema::dflt(1).unwrap(), None, Some(CRYPTO_KIND_VLD0))
|
.create_dht_record(DHTSchema::dflt(1).unwrap(), None, Some(TEST_CRYPTO_KIND))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -55,14 +57,14 @@ pub async fn test_create_dht_record_with_owner(api: VeilidAPI) {
|
||||||
let rc = api.routing_context().unwrap();
|
let rc = api.routing_context().unwrap();
|
||||||
|
|
||||||
let crypto = api.crypto().unwrap();
|
let crypto = api.crypto().unwrap();
|
||||||
let cs = crypto.get(CRYPTO_KIND_VLD0).unwrap();
|
let cs = crypto.get(TEST_CRYPTO_KIND).unwrap();
|
||||||
let owner_keypair = cs.generate_keypair();
|
let owner_keypair = cs.generate_keypair();
|
||||||
|
|
||||||
let rec = rc
|
let rec = rc
|
||||||
.create_dht_record(
|
.create_dht_record(
|
||||||
DHTSchema::dflt(1).unwrap(),
|
DHTSchema::dflt(1).unwrap(),
|
||||||
Some(owner_keypair),
|
Some(owner_keypair),
|
||||||
Some(CRYPTO_KIND_VLD0),
|
Some(TEST_CRYPTO_KIND),
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -78,19 +80,19 @@ pub async fn test_get_dht_record_key(api: VeilidAPI) {
|
||||||
let rc = api.routing_context().unwrap();
|
let rc = api.routing_context().unwrap();
|
||||||
|
|
||||||
let crypto = api.crypto().unwrap();
|
let crypto = api.crypto().unwrap();
|
||||||
let cs = crypto.get(CRYPTO_KIND_VLD0).unwrap();
|
let cs = crypto.get(TEST_CRYPTO_KIND).unwrap();
|
||||||
let owner_keypair = cs.generate_keypair();
|
let owner_keypair = cs.generate_keypair();
|
||||||
let schema = DHTSchema::dflt(1).unwrap();
|
let schema = DHTSchema::dflt(1).unwrap();
|
||||||
|
|
||||||
// create the record normally
|
// create the record normally
|
||||||
let rec = rc
|
let rec = rc
|
||||||
.create_dht_record(schema.clone(), Some(owner_keypair), Some(CRYPTO_KIND_VLD0))
|
.create_dht_record(schema.clone(), Some(owner_keypair), Some(TEST_CRYPTO_KIND))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
// recreate the record key from the metadata alone
|
// recreate the record key from the metadata alone
|
||||||
let key = rc
|
let key = rc
|
||||||
.get_dht_record_key(schema.clone(), &owner_keypair.key, Some(CRYPTO_KIND_VLD0))
|
.get_dht_record_key(schema.clone(), &owner_keypair.key, Some(TEST_CRYPTO_KIND))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
// keys should be the same
|
// keys should be the same
|
||||||
|
@ -105,7 +107,7 @@ pub async fn test_get_dht_value_nonexistent(api: VeilidAPI) {
|
||||||
let rc = api.routing_context().unwrap();
|
let rc = api.routing_context().unwrap();
|
||||||
|
|
||||||
let rec = rc
|
let rec = rc
|
||||||
.create_dht_record(DHTSchema::dflt(1).unwrap(), None, Some(CRYPTO_KIND_VLD0))
|
.create_dht_record(DHTSchema::dflt(1).unwrap(), None, Some(TEST_CRYPTO_KIND))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let dht_key = *rec.key();
|
let dht_key = *rec.key();
|
||||||
|
@ -120,7 +122,7 @@ pub async fn test_set_get_dht_value(api: VeilidAPI) {
|
||||||
let rc = api.routing_context().unwrap();
|
let rc = api.routing_context().unwrap();
|
||||||
|
|
||||||
let rec = rc
|
let rec = rc
|
||||||
.create_dht_record(DHTSchema::dflt(2).unwrap(), None, Some(CRYPTO_KIND_VLD0))
|
.create_dht_record(DHTSchema::dflt(2).unwrap(), None, Some(TEST_CRYPTO_KIND))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let dht_key = *rec.key();
|
let dht_key = *rec.key();
|
||||||
|
@ -168,7 +170,7 @@ pub async fn test_open_writer_dht_value(api: VeilidAPI) {
|
||||||
let rc = api.routing_context().unwrap();
|
let rc = api.routing_context().unwrap();
|
||||||
|
|
||||||
let rec = rc
|
let rec = rc
|
||||||
.create_dht_record(DHTSchema::dflt(2).unwrap(), None, Some(CRYPTO_KIND_VLD0))
|
.create_dht_record(DHTSchema::dflt(2).unwrap(), None, Some(TEST_CRYPTO_KIND))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let key = *rec.key();
|
let key = *rec.key();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue