Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. use borsh::BorshDeserialize;
  2. use common_api::crypto::prelude::*;
  3. use ed25519_dalek::{ExpandedSecretKey, SecretKey};
  4. use rand::{RngCore, SeedableRng};
  5. use rand_chacha::ChaChaRng;
  6. #[test]
  7. fn try_from_bytes_ed25519() -> anyhow::Result<()> {
  8. let sk = Ed25519SecretKey::try_from_bytes(&random_bits())?;
  9. let pk = Ed25519PublicKey::from(&sk);
  10. let _ = Ed25519PublicKey::try_from_bytes(pk.as_bytes())?;
  11. assert!(matches!(
  12. Ed25519PublicKey::try_from_bytes(&[0, 0, 0]),
  13. Err(Error::ConvertFromBytes { .. })
  14. ));
  15. assert!(matches!(
  16. Ed25519SecretKey::try_from_bytes(&[0, 0, 0]),
  17. Err(Error::ConvertFromBytes { .. })
  18. ));
  19. Ok(())
  20. }
  21. #[test]
  22. fn to_string_ed25519() -> anyhow::Result<()> {
  23. let sk = Ed25519SecretKey::try_from_bytes(&random_bits())?;
  24. let pk = Ed25519PublicKey::from(&sk);
  25. assert_eq!(
  26. format!("ed25519:{}", bs58::encode(sk.as_bytes()).into_string()),
  27. sk.string()
  28. );
  29. assert_eq!(
  30. format!("ed25519:{}", bs58::encode(pk.as_bytes()).into_string()),
  31. pk.string()
  32. );
  33. Ok(())
  34. }
  35. #[test]
  36. fn from_string_ed25519() -> anyhow::Result<()> {
  37. let sk = Ed25519SecretKey::try_from_bytes(&random_bits())?;
  38. let pk = Ed25519PublicKey::from(&sk);
  39. let _ = Ed25519SecretKey::from_string(
  40. format!("ed25519:{}", bs58::encode(sk.as_bytes()).into_string()).as_str(),
  41. )?;
  42. let _ = Ed25519PublicKey::from_string(
  43. format!("ed25519:{}", bs58::encode(pk.as_bytes()).into_string()).as_str(),
  44. )?;
  45. assert!(matches!(
  46. Ed25519PublicKey::from_string(
  47. format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str()
  48. ),
  49. Err(Error::WrongKeyType { .. })
  50. ));
  51. assert!(matches!(
  52. Ed25519SecretKey::from_string(
  53. format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
  54. ),
  55. Err(Error::WrongKeyType { .. })
  56. ));
  57. assert!(matches!(
  58. Ed25519SecretKey::from_string(format!("ed25519:{}", "==1234%#").as_str(),),
  59. Err(Error::ConvertFromString { .. })
  60. ));
  61. assert!(matches!(
  62. Ed25519PublicKey::from_string(
  63. format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
  64. ),
  65. Err(Error::ConvertFromBytes { .. })
  66. ));
  67. assert!(matches!(
  68. Ed25519PublicKey::from_string(format!("ed25519:{}", "==1234%#").as_str(),),
  69. Err(Error::ConvertFromString { .. })
  70. ));
  71. Ok(())
  72. }
  73. #[test]
  74. fn from_expanded() -> anyhow::Result<()> {
  75. let dalek_sk = ExpandedSecretKey::from(&SecretKey::from_bytes(&random_bits())?);
  76. let exp_str = format!(
  77. "ed25519:{}",
  78. bs58::encode(dalek_sk.to_bytes()).into_string()
  79. );
  80. let sk = Ed25519SecretKey::from_expanded(&exp_str)?;
  81. assert_eq!(sk.as_bytes(), &dalek_sk.to_bytes()[..32]);
  82. Ok(())
  83. }
  84. #[test]
  85. fn from_expanded_fail() -> anyhow::Result<()> {
  86. let dalek_sk = ExpandedSecretKey::from(&SecretKey::from_bytes(&random_bits())?);
  87. let exp_str = bs58::encode(dalek_sk.to_bytes()).into_string();
  88. assert!(matches!(
  89. Ed25519SecretKey::from_expanded(&exp_str),
  90. Err(Error::UnknownKeyType { .. })
  91. ));
  92. let exp_str = format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string());
  93. assert!(matches!(
  94. Ed25519SecretKey::from_expanded(&exp_str),
  95. Err(Error::ConvertFromBytes { .. })
  96. ));
  97. let exp_str = format!("ed25519:{}", "===%123@@#31");
  98. assert!(matches!(
  99. Ed25519SecretKey::from_expanded(&exp_str),
  100. Err(Error::ConvertFromString { .. })
  101. ));
  102. Ok(())
  103. }
  104. #[test]
  105. fn try_from_bytes_x25519() -> anyhow::Result<()> {
  106. let sk = Secret::try_from_bytes(&random_bits())?;
  107. let pk = Public::from(&sk);
  108. let _ = Public::try_from_bytes(&pk.to_bytes())?;
  109. assert!(matches!(
  110. Public::try_from_bytes(&[0, 0, 0]),
  111. Err(Error::ConvertFromBytes { .. })
  112. ));
  113. assert!(matches!(
  114. Secret::try_from_bytes(&[0, 0, 0]),
  115. Err(Error::ConvertFromBytes { .. })
  116. ));
  117. Ok(())
  118. }
  119. #[test]
  120. fn to_string_x25519() -> anyhow::Result<()> {
  121. let sk = Secret::try_from_bytes(&random_bits())?;
  122. let pk = Public::from(&sk);
  123. assert_eq!(
  124. format!("x25519:{}", bs58::encode(&sk.to_bytes()).into_string()),
  125. sk.string()
  126. );
  127. assert_eq!(
  128. format!("x25519:{}", bs58::encode(&pk.to_bytes()).into_string()),
  129. pk.string()
  130. );
  131. Ok(())
  132. }
  133. #[test]
  134. fn from_string_x25519() -> anyhow::Result<()> {
  135. let sk = Secret::try_from_bytes(&random_bits())?;
  136. let pk = Public::from(&sk);
  137. let _ = Secret::from_string(
  138. format!("x25519:{}", bs58::encode(&sk.to_bytes()).into_string()).as_str(),
  139. )?;
  140. let _ = Public::from_string(
  141. format!("x25519:{}", bs58::encode(&pk.to_bytes()).into_string()).as_str(),
  142. )?;
  143. assert!(matches!(
  144. Public::from_string(
  145. format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str()
  146. ),
  147. Err(Error::WrongKeyType { .. })
  148. ));
  149. assert!(matches!(
  150. Secret::from_string(
  151. format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
  152. ),
  153. Err(Error::WrongKeyType { .. })
  154. ));
  155. assert!(matches!(
  156. Secret::from_string(
  157. format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
  158. ),
  159. Err(Error::ConvertFromBytes { .. })
  160. ));
  161. assert!(matches!(
  162. Secret::from_string(format!("x25519:{}", "==1234%#").as_str(),),
  163. Err(Error::ConvertFromString { .. })
  164. ));
  165. assert!(matches!(
  166. Public::from_string(
  167. format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
  168. ),
  169. Err(Error::ConvertFromBytes { .. })
  170. ));
  171. assert!(matches!(
  172. Public::from_string(format!("x25519:{}", "==1234%#").as_str(),),
  173. Err(Error::ConvertFromString { .. })
  174. ));
  175. Ok(())
  176. }
  177. #[test]
  178. fn public_key_verify() -> anyhow::Result<()> {
  179. let sk = Ed25519SecretKey::try_from_bytes(&random_bits())?;
  180. let pk = Ed25519PublicKey::from(&sk);
  181. let signature = sk.sign(b"message", &pk);
  182. pk.verify(b"message", &signature)?;
  183. Ok(())
  184. }
  185. #[test]
  186. fn keypair_verify() -> anyhow::Result<()> {
  187. let keypair = Keypair::new(Ed25519SecretKey::try_from_bytes(&random_bits())?);
  188. let signature = keypair.sign(b"message");
  189. keypair.verify(b"message", &signature)?;
  190. Ok(())
  191. }
  192. #[test]
  193. fn key_exchange() -> anyhow::Result<()> {
  194. let alice_sk = Secret::try_from_bytes(&random_bits())?;
  195. let alice_pk = Public::from(&alice_sk);
  196. let bob_sk = Secret::try_from_bytes(&random_bits())?;
  197. let bob_pk = Public::from(&bob_sk);
  198. assert_eq!(alice_sk.exchange(&bob_pk), bob_sk.exchange(&alice_pk));
  199. Ok(())
  200. }
  201. #[test]
  202. fn borsh_ed25519() -> anyhow::Result<()> {
  203. let sk = Ed25519SecretKey::try_from_bytes(&random_bits())?;
  204. let sk_bytes = borsh::to_vec(&sk)?;
  205. let pk = Ed25519PublicKey::from(&sk);
  206. let pk_bytes = borsh::to_vec(&pk)?;
  207. assert_eq!(pk_bytes.len(), pk.as_bytes().len() + 1);
  208. assert_eq!(pk_bytes[0], 0);
  209. assert_eq!(sk_bytes.len(), sk.as_bytes().len());
  210. let sk = Ed25519SecretKey::try_from_slice(&sk_bytes)?;
  211. let pk = Ed25519PublicKey::try_from_slice(&pk_bytes)?;
  212. let signature_bytes = borsh::to_vec(&sk.sign(b"message", &pk))?;
  213. pk.verify(
  214. b"message",
  215. &Ed25519Signature::try_from_slice(&signature_bytes)?,
  216. )?;
  217. Ok(())
  218. }
  219. #[test]
  220. fn borsh_x25519() -> anyhow::Result<()> {
  221. let sk = Secret::try_from_bytes(&random_bits())?;
  222. let sk_bytes = borsh::to_vec(&sk)?;
  223. let pk = Public::from(&sk);
  224. let pk_bytes = borsh::to_vec(&pk)?;
  225. let _ = Secret::try_from_slice(&sk_bytes)?;
  226. let _ = Public::try_from_slice(&pk_bytes)?;
  227. Ok(())
  228. }
  229. fn random_bits() -> [u8; 32] {
  230. let mut chacha = ChaChaRng::from_entropy();
  231. let mut secret_bytes = [0_u8; 32];
  232. chacha.fill_bytes(&mut secret_bytes);
  233. secret_bytes
  234. }