diff --git a/lib/crypto/src/bases/b58.rs b/lib/crypto/src/bases/b58.rs index f2193964c4989b40c9d3def9b936a9a1a8c7d682..0d49f232bab6fe6abdd41db7d49bcb733bae3e34 100644 --- a/lib/crypto/src/bases/b58.rs +++ b/lib/crypto/src/bases/b58.rs @@ -28,22 +28,17 @@ pub fn str_base58_to_32bytes(base58_data: &str) -> Result<([u8; 32], usize), Bas debug!("str_base58_to_32bytes({});", base58_data); match bs58::decode(base58_data).into_vec() { Ok(result) => { - if result.len() == 32 { + let len = result.len(); + if len <= 32 { let mut u8_array = [0; 32]; - u8_array[..32].clone_from_slice(&result[..32]); + u8_array[..len].clone_from_slice(&result[..len]); - Ok((u8_array, 32)) - } else if result.len() == 31 { - let mut u8_array = [0; 32]; - - u8_array[..31].clone_from_slice(&result[..31]); - - Ok((u8_array, 31)) + Ok((u8_array, len)) } else { Err(BaseConvertionError::InvalidLength { expected: 32, - found: result.len(), + found: len, }) } } diff --git a/lib/crypto/src/keys/ed25519.rs b/lib/crypto/src/keys/ed25519.rs index a2ae5942a2e935000e4d4131a20941e88f9824dd..bfb8cc9ced64bdb704323b53fd9f8a878300c613 100644 --- a/lib/crypto/src/keys/ed25519.rs +++ b/lib/crypto/src/keys/ed25519.rs @@ -214,7 +214,14 @@ impl super::PublicKey for PublicKey { #[inline] fn from_base58(base58_data: &str) -> Result<Self, BaseConvertionError> { let (datas, len) = b58::str_base58_to_32bytes(base58_data)?; - Ok(PublicKey { datas, len }) + if len < *PUBKEY_MIN_SIZE_IN_BYTES { + Err(BaseConvertionError::InvalidLength { + expected: *PUBKEY_SIZE_IN_BYTES, + found: len, + }) + } else { + Ok(PublicKey { datas, len }) + } } fn to_bytes_vector(&self) -> Vec<u8> { @@ -222,7 +229,7 @@ impl super::PublicKey for PublicKey { } fn verify(&self, message: &[u8], signature: &Self::Signature) -> Result<(), SigError> { - Ok(UnparsedPublicKey::new(&ED25519, self) + Ok(UnparsedPublicKey::new(&ED25519, self.as_ref()) .verify(message, &signature.0) .map_err(|_| SigError::InvalidSig)?) }