| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- use borsh::BorshDeserialize;
- use common_api::crypto::prelude::*;
- use ed25519_dalek::{ExpandedSecretKey, SecretKey};
- use rand::{RngCore, SeedableRng};
- use rand_chacha::ChaChaRng;
-
- #[test]
- fn try_from_bytes_ed25519() -> anyhow::Result<()> {
- let sk = Ed25519SecretKey::try_from_bytes(&random_bits())?;
- let pk = Ed25519PublicKey::from(&sk);
- let _ = Ed25519PublicKey::try_from_bytes(pk.as_bytes())?;
-
- assert!(matches!(
- Ed25519PublicKey::try_from_bytes(&[0, 0, 0]),
- Err(Error::ConvertFromBytes { .. })
- ));
-
- assert!(matches!(
- Ed25519SecretKey::try_from_bytes(&[0, 0, 0]),
- Err(Error::ConvertFromBytes { .. })
- ));
-
- Ok(())
- }
-
- #[test]
- fn to_string_ed25519() -> anyhow::Result<()> {
- let sk = Ed25519SecretKey::try_from_bytes(&random_bits())?;
- let pk = Ed25519PublicKey::from(&sk);
-
- assert_eq!(
- format!("ed25519:{}", bs58::encode(sk.as_bytes()).into_string()),
- sk.string()
- );
- assert_eq!(
- format!("ed25519:{}", bs58::encode(pk.as_bytes()).into_string()),
- pk.string()
- );
-
- Ok(())
- }
-
- #[test]
- fn from_string_ed25519() -> anyhow::Result<()> {
- let sk = Ed25519SecretKey::try_from_bytes(&random_bits())?;
- let pk = Ed25519PublicKey::from(&sk);
-
- let _ = Ed25519SecretKey::from_string(
- format!("ed25519:{}", bs58::encode(sk.as_bytes()).into_string()).as_str(),
- )?;
-
- let _ = Ed25519PublicKey::from_string(
- format!("ed25519:{}", bs58::encode(pk.as_bytes()).into_string()).as_str(),
- )?;
-
- assert!(matches!(
- Ed25519PublicKey::from_string(
- format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str()
- ),
- Err(Error::WrongKeyType { .. })
- ));
-
- assert!(matches!(
- Ed25519SecretKey::from_string(
- format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
- ),
- Err(Error::WrongKeyType { .. })
- ));
-
- assert!(matches!(
- Ed25519SecretKey::from_string(format!("ed25519:{}", "==1234%#").as_str(),),
- Err(Error::ConvertFromString { .. })
- ));
-
- assert!(matches!(
- Ed25519PublicKey::from_string(
- format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
- ),
- Err(Error::ConvertFromBytes { .. })
- ));
-
- assert!(matches!(
- Ed25519PublicKey::from_string(format!("ed25519:{}", "==1234%#").as_str(),),
- Err(Error::ConvertFromString { .. })
- ));
-
- Ok(())
- }
-
- #[test]
- fn from_expanded() -> anyhow::Result<()> {
- let dalek_sk = ExpandedSecretKey::from(&SecretKey::from_bytes(&random_bits())?);
- let exp_str = format!(
- "ed25519:{}",
- bs58::encode(dalek_sk.to_bytes()).into_string()
- );
- let sk = Ed25519SecretKey::from_expanded(&exp_str)?;
-
- assert_eq!(sk.as_bytes(), &dalek_sk.to_bytes()[..32]);
- Ok(())
- }
-
- #[test]
- fn from_expanded_fail() -> anyhow::Result<()> {
- let dalek_sk = ExpandedSecretKey::from(&SecretKey::from_bytes(&random_bits())?);
-
- let exp_str = bs58::encode(dalek_sk.to_bytes()).into_string();
- assert!(matches!(
- Ed25519SecretKey::from_expanded(&exp_str),
- Err(Error::UnknownKeyType { .. })
- ));
-
- let exp_str = format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string());
- assert!(matches!(
- Ed25519SecretKey::from_expanded(&exp_str),
- Err(Error::ConvertFromBytes { .. })
- ));
-
- let exp_str = format!("ed25519:{}", "===%123@@#31");
- assert!(matches!(
- Ed25519SecretKey::from_expanded(&exp_str),
- Err(Error::ConvertFromString { .. })
- ));
-
- Ok(())
- }
-
- #[test]
- fn try_from_bytes_x25519() -> anyhow::Result<()> {
- let sk = Secret::try_from_bytes(&random_bits())?;
- let pk = Public::from(&sk);
- let _ = Public::try_from_bytes(&pk.to_bytes())?;
-
- assert!(matches!(
- Public::try_from_bytes(&[0, 0, 0]),
- Err(Error::ConvertFromBytes { .. })
- ));
-
- assert!(matches!(
- Secret::try_from_bytes(&[0, 0, 0]),
- Err(Error::ConvertFromBytes { .. })
- ));
-
- Ok(())
- }
-
- #[test]
- fn to_string_x25519() -> anyhow::Result<()> {
- let sk = Secret::try_from_bytes(&random_bits())?;
- let pk = Public::from(&sk);
-
- assert_eq!(
- format!("x25519:{}", bs58::encode(&sk.to_bytes()).into_string()),
- sk.string()
- );
- assert_eq!(
- format!("x25519:{}", bs58::encode(&pk.to_bytes()).into_string()),
- pk.string()
- );
-
- Ok(())
- }
-
- #[test]
- fn from_string_x25519() -> anyhow::Result<()> {
- let sk = Secret::try_from_bytes(&random_bits())?;
- let pk = Public::from(&sk);
-
- let _ = Secret::from_string(
- format!("x25519:{}", bs58::encode(&sk.to_bytes()).into_string()).as_str(),
- )?;
-
- let _ = Public::from_string(
- format!("x25519:{}", bs58::encode(&pk.to_bytes()).into_string()).as_str(),
- )?;
-
- assert!(matches!(
- Public::from_string(
- format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str()
- ),
- Err(Error::WrongKeyType { .. })
- ));
-
- assert!(matches!(
- Secret::from_string(
- format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
- ),
- Err(Error::WrongKeyType { .. })
- ));
-
- assert!(matches!(
- Secret::from_string(
- format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
- ),
- Err(Error::ConvertFromBytes { .. })
- ));
-
- assert!(matches!(
- Secret::from_string(format!("x25519:{}", "==1234%#").as_str(),),
- Err(Error::ConvertFromString { .. })
- ));
-
- assert!(matches!(
- Public::from_string(
- format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
- ),
- Err(Error::ConvertFromBytes { .. })
- ));
-
- assert!(matches!(
- Public::from_string(format!("x25519:{}", "==1234%#").as_str(),),
- Err(Error::ConvertFromString { .. })
- ));
-
- Ok(())
- }
-
- #[test]
- fn public_key_verify() -> anyhow::Result<()> {
- let sk = Ed25519SecretKey::try_from_bytes(&random_bits())?;
- let pk = Ed25519PublicKey::from(&sk);
-
- let signature = sk.sign(b"message", &pk);
- pk.verify(b"message", &signature)?;
-
- Ok(())
- }
-
- #[test]
- fn keypair_verify() -> anyhow::Result<()> {
- let keypair = Keypair::new(Ed25519SecretKey::try_from_bytes(&random_bits())?);
- let signature = keypair.sign(b"message");
- keypair.verify(b"message", &signature)?;
-
- Ok(())
- }
-
- #[test]
- fn key_exchange() -> anyhow::Result<()> {
- let alice_sk = Secret::try_from_bytes(&random_bits())?;
- let alice_pk = Public::from(&alice_sk);
-
- let bob_sk = Secret::try_from_bytes(&random_bits())?;
- let bob_pk = Public::from(&bob_sk);
-
- assert_eq!(alice_sk.exchange(&bob_pk), bob_sk.exchange(&alice_pk));
- Ok(())
- }
-
- #[test]
- fn borsh_ed25519() -> anyhow::Result<()> {
- let sk = Ed25519SecretKey::try_from_bytes(&random_bits())?;
- let sk_bytes = borsh::to_vec(&sk)?;
- let pk = Ed25519PublicKey::from(&sk);
- let pk_bytes = borsh::to_vec(&pk)?;
-
- assert_eq!(pk_bytes.len(), pk.as_bytes().len() + 1);
- assert_eq!(pk_bytes[0], 0);
- assert_eq!(sk_bytes.len(), sk.as_bytes().len());
-
- let sk = Ed25519SecretKey::try_from_slice(&sk_bytes)?;
- let pk = Ed25519PublicKey::try_from_slice(&pk_bytes)?;
-
- let signature_bytes = borsh::to_vec(&sk.sign(b"message", &pk))?;
- pk.verify(
- b"message",
- &Ed25519Signature::try_from_slice(&signature_bytes)?,
- )?;
-
- Ok(())
- }
-
- #[test]
- fn borsh_x25519() -> anyhow::Result<()> {
- let sk = Secret::try_from_bytes(&random_bits())?;
- let sk_bytes = borsh::to_vec(&sk)?;
- let pk = Public::from(&sk);
- let pk_bytes = borsh::to_vec(&pk)?;
-
- let _ = Secret::try_from_slice(&sk_bytes)?;
- let _ = Public::try_from_slice(&pk_bytes)?;
-
- Ok(())
- }
-
- fn random_bits() -> [u8; 32] {
- let mut chacha = ChaChaRng::from_entropy();
- let mut secret_bytes = [0_u8; 32];
- chacha.fill_bytes(&mut secret_bytes);
- secret_bytes
- }
|