diff --git a/atrium-libs/src/crypto.rs b/atrium-libs/src/crypto.rs deleted file mode 100644 index 3fa764bf..00000000 --- a/atrium-libs/src/crypto.rs +++ /dev/null @@ -1,7 +0,0 @@ -mod algorithm; -pub mod did; -pub mod error; - -pub use algorithm::Algorithm; - -const DID_KEY_PREFIX: &str = "did:key:"; diff --git a/atrium-libs/src/crypto/algorithm.rs b/atrium-libs/src/crypto/algorithm.rs deleted file mode 100644 index 34ef6a54..00000000 --- a/atrium-libs/src/crypto/algorithm.rs +++ /dev/null @@ -1,49 +0,0 @@ -use super::error::Result; -use ecdsa::VerifyingKey; -use k256::Secp256k1; -use multibase::Base; -use p256::NistP256; - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum Algorithm { - P256, - Secp256k1, -} - -impl Algorithm { - const MULTICODE_PREFIX_P256: [u8; 2] = [0x80, 0x24]; - const MULTICODE_PREFIX_SECP256K1: [u8; 2] = [0xe7, 0x01]; - - pub fn from_prefix(prefix: [u8; 2]) -> Option { - match prefix { - Self::MULTICODE_PREFIX_P256 => Some(Self::P256), - Self::MULTICODE_PREFIX_SECP256K1 => Some(Self::Secp256k1), - _ => None, - } - } - pub fn format_multikey(&self, key: &[u8]) -> Result { - let mut bytes = match self { - Algorithm::P256 => Self::MULTICODE_PREFIX_P256, - Algorithm::Secp256k1 => Self::MULTICODE_PREFIX_SECP256K1, - } - .to_vec(); - bytes.extend(self.pubkey_bytes(key, true)?); - Ok(multibase::encode(Base::Base58Btc, bytes)) - } - pub fn decompress_pubkey(&self, key: &[u8]) -> Result> { - self.pubkey_bytes(key, false) - } - fn pubkey_bytes(&self, key: &[u8], compress: bool) -> Result> { - Ok(match self { - Algorithm::P256 => VerifyingKey::::from_sec1_bytes(key)? - .to_encoded_point(compress) - .as_bytes() - .to_vec(), - - Algorithm::Secp256k1 => VerifyingKey::::from_sec1_bytes(key)? - .to_encoded_point(compress) - .as_bytes() - .to_vec(), - }) - } -} diff --git a/atrium-libs/src/crypto/did.rs b/atrium-libs/src/crypto/did.rs deleted file mode 100644 index fee7ac9b..00000000 --- a/atrium-libs/src/crypto/did.rs +++ /dev/null @@ -1,115 +0,0 @@ -use super::error::{Error, Result}; -use super::{Algorithm, DID_KEY_PREFIX}; - -pub fn parse_multikey(multikey: &str) -> Result<(Algorithm, Vec)> { - let (_, decoded) = multibase::decode(multikey)?; - if let Ok(prefix) = decoded[..2].try_into() { - if let Some(alg) = Algorithm::from_prefix(prefix) { - return Ok((alg, alg.decompress_pubkey(&decoded[2..])?)); - } - } - Err(Error::UnsupportedMultikeyType) -} - -pub fn format_did_key_str(alg: Algorithm, s: &str) -> Result { - let (_, key) = multibase::decode(s)?; - format_did_key(alg, &key) -} - -pub fn parse_did_key(did: &str) -> Result<(Algorithm, Vec)> { - if let Some(multikey) = did.strip_prefix(DID_KEY_PREFIX) { - parse_multikey(multikey) - } else { - Err(Error::IncorrectDIDKeyPrefix(did.to_string())) - } -} - -pub fn format_did_key(alg: Algorithm, key: &[u8]) -> Result { - Ok(DID_KEY_PREFIX.to_string() + &alg.format_multikey(key)?) -} - -#[cfg(test)] -mod tests { - use super::*; - use ecdsa::SigningKey; - use k256::Secp256k1; - use multibase::Base; - use p256::NistP256; - - // did:key secp256k1 test vectors from W3C - // https://github.com/w3c-ccg/did-method-key/blob/main/test-vectors/secp256k1.json - fn secp256k1_vectors() -> Vec<(&'static str, &'static str)> { - vec![ - ( - "9085d2bef69286a6cbb51623c8fa258629945cd55ca705cc4e66700396894e0c", - "did:key:zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme", - ), - ( - "f0f4df55a2b3ff13051ea814a8f24ad00f2e469af73c363ac7e9fb999a9072ed", - "did:key:zQ3shtxV1FrJfhqE1dvxYRcCknWNjHc3c5X1y3ZSoPDi2aur2", - ), - ( - "6b0b91287ae3348f8c2f2552d766f30e3604867e34adc37ccbb74a8e6b893e02", - "did:key:zQ3shZc2QzApp2oymGvQbzP8eKheVshBHbU4ZYjeXqwSKEn6N", - ), - ( - "c0a6a7c560d37d7ba81ecee9543721ff48fea3e0fb827d42c1868226540fac15", - "did:key:zQ3shadCps5JLAHcZiuX5YUtWHHL8ysBJqFLWvjZDKAWUBGzy", - ), - ( - "175a232d440be1e0788f25488a73d9416c04b6f924bea6354bf05dd2f1a75133", - "did:key:zQ3shptjE6JwdkeKN4fcpnYQY3m9Cet3NiHdAfpvSUZBFoKBj", - ), - ] - } - - // did:key p-256 test vectors from W3C - // https://github.com/w3c-ccg/did-method-key/blob/main/test-vectors/nist-curves.json - fn p256_vectors() -> Vec<(&'static str, &'static str)> { - vec![( - "9p4VRzdmhsnq869vQjVCTrRry7u4TtfRxhvBFJTGU2Cp", - "did:key:zDnaeTiq1PdzvZXUaMdezchcMJQpBdH2VN4pgrrEhMCCbmwSb", - )] - } - - #[test] - fn secp256k1() { - for (seed, id) in secp256k1_vectors() { - let bytes = hex::decode(seed).expect("hex decoding should succeed"); - let sign = SigningKey::::from_slice(&bytes) - .expect("initializing signing key should succeed"); - let did_key = - format_did_key(Algorithm::Secp256k1, &sign.verifying_key().to_sec1_bytes()) - .expect("formatting DID key should succeed"); - assert_eq!(did_key, id); - - let (alg, key) = parse_did_key(&did_key).expect("parsing DID key should succeed"); - assert_eq!(alg, Algorithm::Secp256k1); - assert_eq!( - &key, - sign.verifying_key().to_encoded_point(false).as_bytes() - ); - } - } - - #[test] - fn p256() { - for (private_key_base58, id) in p256_vectors() { - let bytes = Base::Base58Btc - .decode(private_key_base58) - .expect("multibase decoding should succeed"); - let sign = SigningKey::::from_slice(&bytes) - .expect("initializing signing key should succeed"); - let did_key = format_did_key(Algorithm::P256, &sign.verifying_key().to_sec1_bytes()) - .expect("formatting DID key should succeed"); - assert_eq!(did_key, id); - - let (alg, key) = parse_did_key(&did_key).expect("parsing DID key should succeed"); - assert_eq!(alg, Algorithm::P256); - assert_eq!( - &key, - sign.verifying_key().to_encoded_point(false).as_bytes() - ); - } - } -} diff --git a/atrium-libs/src/crypto/error.rs b/atrium-libs/src/crypto/error.rs deleted file mode 100644 index fdcbbf51..00000000 --- a/atrium-libs/src/crypto/error.rs +++ /dev/null @@ -1,15 +0,0 @@ -use thiserror::Error; - -#[derive(Error, Debug)] -pub enum Error { - #[error("Unsupported key type")] - UnsupportedMultikeyType, - #[error("Incorrect prefix for did:key: {0}")] - IncorrectDIDKeyPrefix(String), - #[error(transparent)] - Multibase(#[from] multibase::Error), - #[error(transparent)] - Signature(#[from] ecdsa::signature::Error), -} - -pub type Result = std::result::Result;