noosphere-ns 0.1.0

A P2P name system for Noosphere
Documentation
use crate::dht::errors::DHTError;
use libp2p;
use noosphere_core::authority::ed25519_key_to_bytes;
use ucan_key_support::ed25519::Ed25519KeyMaterial;

pub fn key_material_to_libp2p_keypair(
    key_material: &Ed25519KeyMaterial,
) -> Result<libp2p::identity::Keypair, DHTError> {
    let mut bytes = ed25519_key_to_bytes(key_material)?;
    let kp = libp2p::identity::ed25519::Keypair::decode(&mut bytes)
        .map_err(|_| DHTError::Error("Could not decode ED25519 key.".into()))?;
    Ok(libp2p::identity::Keypair::Ed25519(kp))
}

#[cfg(test)]
mod tests {
    use super::*;
    use noosphere_core::authority::generate_ed25519_key;

    #[test]
    fn test_key_material_to_libp2p_keypair() -> Result<(), DHTError> {
        let zebra_keys = generate_ed25519_key();
        let keypair: libp2p::identity::ed25519::Keypair =
            match key_material_to_libp2p_keypair(&zebra_keys) {
                Ok(kp) => match kp {
                    libp2p::identity::Keypair::Ed25519(keypair) => Ok(keypair),
                },
                Err(e) => Err(e),
            }?;
        let zebra_private_key = zebra_keys.1.expect("Has private key");
        let dalek_public_key = keypair.public().encode();
        let dalek_private_key = keypair.secret();

        let in_public_key = zebra_keys.0.as_ref();
        let in_private_key = zebra_private_key.as_ref();
        let out_public_key = dalek_public_key.as_ref();
        let out_private_key = dalek_private_key.as_ref();
        assert_eq!(in_public_key, out_public_key);
        assert_eq!(in_private_key, out_private_key);
        Ok(())
    }
}