i0 0.1.5

thei.rs/i0 reference implementation written in rust
Documentation
//! implementation of [i0:2](https://thei.rs/i0:2)

#[cfg(feature = "v3")]
pub use crate::v3::Metadata;

#[cfg(not(feature = "v3"))]
#[path = "../v3/metadata.rs"]
mod metadata;

#[cfg(not(feature = "v3"))]
pub use metadata::Metadata;

#[cfg(feature = "dig")]
mod dig;
#[cfg(feature = "dig")]
pub use dig::dig;

use ed25519_dalek::{Signer, SigningKey};

/// Builds the short and long versions of an [i0:2](https://thei.rs/i0:2) from `Metadata`
pub fn generate(metadata: &Metadata) -> (String, String) {
    // make determinant from ts and desig
    let unhashed_det: &[u8] = &[
        metadata.designation.as_bytes(),
        b"-",
        &metadata.timestamp.to_bytes(),
    ]
    .concat();
    let det = blake3::hash(unhashed_det);
    let keypair = SigningKey::from_bytes(metadata.seed);

    let sig = keypair.sign(det.as_bytes());
    let short = &format!("{sig:x}")[..7];
    let long = z32::encode(&sig.to_bytes()[..10]);

    (short.to_string(), long)
}