liboxyd 0.1.4

Coldwire's cryptographic library
Documentation
use bip0039::Mnemonic;
use libsecp256k1::{PublicKey, SecretKey};
use rand::thread_rng;

pub fn generate_keypair() -> (SecretKey, PublicKey) {
    let sk = SecretKey::random(&mut thread_rng());
    (sk, PublicKey::from_secret_key(&sk))
}

// Export to Mnemonic phrase
pub fn to_phrase(sk: SecretKey) -> Result<String, String> {
    match Mnemonic::from_entropy(sk.serialize()) {
        Ok(res) => Ok(res.to_string()),
        Err(err) => return Err(err.to_string()),
    }
}

// Import from mnemonic phrase
pub fn from_phrase(phrase: String) -> Result<SecretKey, String> {
    let sk = match Mnemonic::from_phrase(phrase) {
        Ok(res) => res.into_entropy(),
        Err(err) => return Err(err.to_string()),
    };

    match SecretKey::parse_slice(&sk) {
        Ok(s) => Ok(s),
        Err(err) => return Err(err.to_string()),
    }
}

#[cfg(test)]
mod tests {
    use super::{from_phrase, generate_keypair, to_phrase};

    #[test]
    fn mnemomic() -> Result<(), String> {
        let (sk, _) = generate_keypair();

        // Generate phrase
        let phrase = match to_phrase(sk) {
            Ok(res) => res,
            Err(err) => return Err(err.to_string()),
        };

        let recovered_sk = match from_phrase(phrase) {
            Ok(res) => res,
            Err(err) => return Err(err.to_string()),
        };

        assert_eq!(sk, recovered_sk);

        Ok(())
    }
}