diff --git a/Cargo.toml b/Cargo.toml index 85e23de..ee844c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "multikey" -version = "0.8.7" +version = "0.8.8" edition = "2021" -authors = ["Dave Huseby "] +authors = ["Dave Grantham "] description = "Multikey self-describing cryptographic key data" repository = "https://github.com/cryptidtech/multikey.git" readme = "README.md" diff --git a/src/mk.rs b/src/mk.rs index 56501d6..bdb7a56 100644 --- a/src/mk.rs +++ b/src/mk.rs @@ -7,7 +7,7 @@ use crate::{ use multibase::Base; use multicodec::Codec; -use multitrait::TryDecodeFrom; +use multitrait::{Null, TryDecodeFrom}; use multiutil::{BaseEncoded, CodecInfo, EncodingInfo, Varbytes, Varuint}; use rand::{CryptoRng, RngCore}; use ssh_key::{ @@ -135,6 +135,16 @@ impl<'a> TryDecodeFrom<'a> for Multikey { } } +impl Null for Multikey { + fn null() -> Self { + Self::default() + } + + fn is_null(&self) -> bool { + *self == Self::null() + } +} + impl fmt::Debug for Multikey { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // get an attributes view on the key @@ -854,6 +864,7 @@ impl Builder { mod tests { use super::*; use crate::{cipher, kdf, views}; + use multisig::EncodedMultisig; #[test] fn test_ed25519_random() { @@ -877,7 +888,7 @@ mod tests { .try_build_encoded() .unwrap(); let s = mk.to_string(); - //println!("ed25519: {}", s); + println!("ed25519: {}", s); assert_eq!(mk, EncodedMultikey::try_from(s.as_str()).unwrap()); } @@ -903,7 +914,7 @@ mod tests { .try_build_encoded() .unwrap(); let s = mk.to_string(); - //println!("secp256k1: {}", s); + println!("secp256k1: {}", s); assert_eq!(mk, EncodedMultikey::try_from(s.as_str()).unwrap()); } @@ -929,7 +940,7 @@ mod tests { .try_build_encoded() .unwrap(); let s = mk.to_string(); - //println!("bls12381g2: {}", s); + println!("bls12381g2: {}", s); assert_eq!(mk, EncodedMultikey::try_from(s.as_str()).unwrap()); } @@ -1141,12 +1152,16 @@ mod tests { let kd = mk.data_view().unwrap(); assert!(kd.key_bytes().is_ok()); assert!(kd.secret_bytes().is_ok()); + let conv = mk.conv_view().unwrap(); + let pk = EncodedMultikey::new(Base::Base16Lower, conv.to_public_key().unwrap()); + println!("ed25519 pubkey: {}", pk.to_string()); - let msg = hex::decode("8bb78be51ac7cc98f44e38947ff8a128764ec039b89687a790dfa8444ba97682") - .unwrap(); + let msg = b"for great justice, move every zig!".to_vec(); let signmk = mk.sign_view().unwrap(); let signature = signmk.sign(msg.as_slice(), false, None).unwrap(); + let sig = EncodedMultisig::new(Base::Base16Lower, signature.clone()); + println!("signaure: {}", sig.to_string()); let verifymk = mk.verify_view().unwrap(); assert!(verifymk.verify(&signature, Some(&msg)).is_ok()); @@ -1566,4 +1581,13 @@ mod tests { assert!(kd.key_bytes().is_ok()); assert!(kd.secret_bytes().is_ok()); } + + #[test] + fn test_null() { + let mk1 = Multikey::null(); + assert!(mk1.is_null()); + let mk2 = Multikey::default(); + assert_eq!(mk1, mk2); + assert!(mk2.is_null()); + } } diff --git a/src/nonce.rs b/src/nonce.rs index 117eb03..d1962ad 100644 --- a/src/nonce.rs +++ b/src/nonce.rs @@ -2,7 +2,7 @@ use crate::{error::NonceError, Error}; use core::fmt; use multibase::Base; use multicodec::Codec; -use multitrait::TryDecodeFrom; +use multitrait::{Null, TryDecodeFrom}; use multiutil::{BaseEncoded, CodecInfo, EncodingInfo, Varbytes}; use rand::{CryptoRng, RngCore}; @@ -94,6 +94,16 @@ impl<'a> TryDecodeFrom<'a> for Nonce { } } +impl Null for Nonce { + fn null() -> Self { + Self::default() + } + + fn is_null(&self) -> bool { + *self == Self::null() + } +} + impl fmt::Debug for Nonce { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{:?} - {}", SIGIL, hex::encode(&self.nonce)) @@ -209,4 +219,13 @@ mod tests { let s = n.to_string(); assert_eq!(n, EncodedNonce::try_from(s.as_str()).unwrap()); } + + #[test] + fn test_null() { + let n1 = Nonce::null(); + assert!(n1.is_null()); + let n2 = Nonce::default(); + assert_eq!(n1, n2); + assert!(n2.is_null()); + } }