Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. use std::str::FromStr;
  2. use borsh::BorshDeserialize;
  3. use common_api::crypto::prelude::*;
  4. use ed25519_dalek::{ExpandedSecretKey, SecretKey as DalekSecretKey};
  5. use rand::{RngCore, SeedableRng};
  6. use rand_chacha::ChaChaRng;
  7. #[test]
  8. fn try_from_bytes_ed25519() {
  9. let sk = Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap();
  10. let pk = Ed25519PublicKey::from(&sk);
  11. let _ = Ed25519PublicKey::try_from_bytes(pk.as_bytes()).unwrap();
  12. assert!(matches!(
  13. Ed25519PublicKey::try_from_bytes(&[0, 0, 0]),
  14. Err(Error::ConvertFromBytes { .. })
  15. ));
  16. assert!(matches!(
  17. Ed25519SecretKey::try_from_bytes(&[0, 0, 0]),
  18. Err(Error::ConvertFromBytes { .. })
  19. ));
  20. }
  21. #[test]
  22. fn to_string_ed25519() {
  23. let sk = Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap();
  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. }
  34. #[test]
  35. fn from_string_ed25519() {
  36. let sk = Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap();
  37. let pk = Ed25519PublicKey::from(&sk);
  38. let _ = Ed25519SecretKey::from_string(
  39. format!("ed25519:{}", bs58::encode(sk.as_bytes()).into_string()).as_str(),
  40. )
  41. .unwrap();
  42. let _ = Ed25519PublicKey::from_string(
  43. format!("ed25519:{}", bs58::encode(pk.as_bytes()).into_string()).as_str(),
  44. )
  45. .unwrap();
  46. assert!(matches!(
  47. Ed25519PublicKey::from_string(
  48. format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str()
  49. ),
  50. Err(Error::WrongKeyType { .. })
  51. ));
  52. assert!(matches!(
  53. Ed25519SecretKey::from_string(
  54. format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
  55. ),
  56. Err(Error::WrongKeyType { .. })
  57. ));
  58. assert!(matches!(
  59. Ed25519SecretKey::from_string(format!("ed25519:{}", "==1234%#").as_str(),),
  60. Err(Error::ConvertFromString { .. })
  61. ));
  62. assert!(matches!(
  63. Ed25519PublicKey::from_string(
  64. format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
  65. ),
  66. Err(Error::ConvertFromBytes { .. })
  67. ));
  68. assert!(matches!(
  69. Ed25519PublicKey::from_string(format!("ed25519:{}", "==1234%#").as_str(),),
  70. Err(Error::ConvertFromString { .. })
  71. ));
  72. }
  73. #[test]
  74. fn from_expanded() {
  75. let dalek_sk = ExpandedSecretKey::from(&DalekSecretKey::from_bytes(&random_bits()).unwrap());
  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).unwrap();
  81. assert_eq!(sk.as_bytes(), &dalek_sk.to_bytes()[..32]);
  82. }
  83. #[test]
  84. fn from_expanded_fail() {
  85. let dalek_sk = ExpandedSecretKey::from(&DalekSecretKey::from_bytes(&random_bits()).unwrap());
  86. let exp_str = bs58::encode(dalek_sk.to_bytes()).into_string();
  87. assert!(matches!(
  88. Ed25519SecretKey::from_expanded(&exp_str),
  89. Err(Error::UnknownKeyType { .. })
  90. ));
  91. let exp_str = format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string());
  92. assert!(matches!(
  93. Ed25519SecretKey::from_expanded(&exp_str),
  94. Err(Error::ConvertFromBytes { .. })
  95. ));
  96. let exp_str = format!("ed25519:{}", "===%123@@#31");
  97. assert!(matches!(
  98. Ed25519SecretKey::from_expanded(&exp_str),
  99. Err(Error::ConvertFromString { .. })
  100. ));
  101. }
  102. #[test]
  103. fn try_from_bytes_x25519() {
  104. let sk = SecretKey::try_from_bytes(&random_bits()).unwrap();
  105. let pk = PublicKey::from(&sk);
  106. let _ = PublicKey::try_from_bytes(&pk.to_bytes()).unwrap();
  107. assert!(matches!(
  108. PublicKey::try_from_bytes(&[0, 0, 0]),
  109. Err(Error::ConvertFromBytes { .. })
  110. ));
  111. assert!(matches!(
  112. SecretKey::try_from_bytes(&[0, 0, 0]),
  113. Err(Error::ConvertFromBytes { .. })
  114. ));
  115. }
  116. #[test]
  117. fn to_string_x25519() {
  118. let sk = SecretKey::try_from_bytes(&random_bits()).unwrap();
  119. let pk = PublicKey::from(&sk);
  120. assert_eq!(
  121. format!("x25519:{}", bs58::encode(&sk.to_bytes()).into_string()),
  122. sk.string()
  123. );
  124. assert_eq!(
  125. format!("x25519:{}", bs58::encode(&pk.to_bytes()).into_string()),
  126. pk.string()
  127. );
  128. }
  129. #[test]
  130. fn from_string_x25519() {
  131. let sk = SecretKey::try_from_bytes(&random_bits()).unwrap();
  132. let pk = PublicKey::from(&sk);
  133. let _ = SecretKey::from_string(
  134. format!("x25519:{}", bs58::encode(&sk.to_bytes()).into_string()).as_str(),
  135. )
  136. .unwrap();
  137. let _ = PublicKey::from_string(
  138. format!("x25519:{}", bs58::encode(&pk.to_bytes()).into_string()).as_str(),
  139. )
  140. .unwrap();
  141. assert!(matches!(
  142. PublicKey::from_string(
  143. format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str()
  144. ),
  145. Err(Error::WrongKeyType { .. })
  146. ));
  147. assert!(matches!(
  148. SecretKey::from_string(
  149. format!("ed25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
  150. ),
  151. Err(Error::WrongKeyType { .. })
  152. ));
  153. assert!(matches!(
  154. SecretKey::from_string(
  155. format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
  156. ),
  157. Err(Error::ConvertFromBytes { .. })
  158. ));
  159. assert!(matches!(
  160. SecretKey::from_string(format!("x25519:{}", "==1234%#").as_str(),),
  161. Err(Error::ConvertFromString { .. })
  162. ));
  163. assert!(matches!(
  164. PublicKey::from_string(
  165. format!("x25519:{}", bs58::encode(vec![0, 0, 0]).into_string()).as_str(),
  166. ),
  167. Err(Error::ConvertFromBytes { .. })
  168. ));
  169. assert!(matches!(
  170. PublicKey::from_string(format!("x25519:{}", "==1234%#").as_str(),),
  171. Err(Error::ConvertFromString { .. })
  172. ));
  173. }
  174. #[test]
  175. fn public_key_verify() {
  176. let sk = Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap();
  177. let pk = Ed25519PublicKey::from(&sk);
  178. let signature = sk.sign(b"message", &pk);
  179. pk.verify(b"message", &signature).unwrap();
  180. }
  181. #[test]
  182. fn keypair_verify() {
  183. let keypair = Keypair::new(Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap());
  184. let signature = keypair.sign(b"message");
  185. keypair.verify(b"message", &signature).unwrap();
  186. }
  187. #[test]
  188. fn key_exchange() {
  189. let alice_sk = SecretKey::try_from_bytes(&random_bits()).unwrap();
  190. let alice_pk = PublicKey::from(&alice_sk);
  191. let bob_sk = SecretKey::try_from_bytes(&random_bits()).unwrap();
  192. let bob_pk = PublicKey::from(&bob_sk);
  193. assert_eq!(alice_sk.exchange(&bob_pk), bob_sk.exchange(&alice_pk));
  194. }
  195. #[test]
  196. fn borsh_ed25519() {
  197. let sk = Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap();
  198. let sk_bytes = borsh::to_vec(&sk).unwrap();
  199. let pk = Ed25519PublicKey::from(&sk);
  200. let pk_bytes = borsh::to_vec(&pk).unwrap();
  201. assert_eq!(pk_bytes.len(), pk.as_bytes().len() + 1);
  202. assert_eq!(pk_bytes[0], 0);
  203. assert_eq!(sk_bytes.len(), sk.as_bytes().len());
  204. let sk = Ed25519SecretKey::try_from_slice(&sk_bytes).unwrap();
  205. let pk = Ed25519PublicKey::try_from_slice(&pk_bytes).unwrap();
  206. let signature_bytes = borsh::to_vec(&sk.sign(b"message", &pk)).unwrap();
  207. pk.verify(
  208. b"message",
  209. &Ed25519Signature::try_from_slice(&signature_bytes).unwrap(),
  210. )
  211. .unwrap();
  212. }
  213. #[test]
  214. fn borsh_x25519() {
  215. let sk = SecretKey::try_from_bytes(&random_bits()).unwrap();
  216. let sk_bytes = borsh::to_vec(&sk).unwrap();
  217. let pk = PublicKey::from(&sk);
  218. let pk_bytes = borsh::to_vec(&pk).unwrap();
  219. // just try to serialize and deserialize. We doesn't support key-exchange for now
  220. let _ = SecretKey::try_from_slice(&sk_bytes).unwrap();
  221. let _ = PublicKey::try_from_slice(&pk_bytes).unwrap();
  222. }
  223. #[test]
  224. fn keypair_from_str() {
  225. let sk = Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap();
  226. let pk = Ed25519PublicKey::from(&sk);
  227. let mut sk_bytes = sk.to_bytes().to_vec();
  228. sk_bytes.extend_from_slice(&pk.to_bytes());
  229. let keypair_bs58 = format!("ed25519:{}", bs58::encode(sk_bytes).into_string());
  230. let keypair = Keypair::from_str(&keypair_bs58).unwrap();
  231. assert_eq!(keypair.secret_key().to_bytes(), sk.to_bytes());
  232. assert_eq!(keypair.public_key().to_bytes(), pk.to_bytes());
  233. }
  234. #[test]
  235. fn keypair_to_string() {
  236. let sk = Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap();
  237. let pk = Ed25519PublicKey::from(&sk);
  238. let mut sk_bytes = sk.to_bytes().to_vec();
  239. sk_bytes.extend_from_slice(&pk.to_bytes());
  240. let keypair_bs58 = format!("ed25519:{}", bs58::encode(sk_bytes).into_string());
  241. let keypair = Keypair::new(sk);
  242. assert_eq!(keypair_bs58, keypair.to_string());
  243. }
  244. #[test]
  245. fn convert_from_edwards_to_montgomery() {
  246. let alice_sk = Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap();
  247. let bob_sk = Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap();
  248. let alice_pk = Ed25519PublicKey::from(&alice_sk);
  249. let bob_pk = Ed25519PublicKey::from(&bob_sk);
  250. let alice_sk_dhx = SecretKey::try_from(alice_sk).unwrap();
  251. let bob_sk_dhx = SecretKey::try_from(bob_sk).unwrap();
  252. let alice_pk_dhx = PublicKey::try_from(alice_pk).unwrap();
  253. let bob_pk_dhx = PublicKey::try_from(bob_pk).unwrap();
  254. assert_eq!(
  255. alice_sk_dhx.exchange(&bob_pk_dhx),
  256. bob_sk_dhx.exchange(&alice_pk_dhx)
  257. );
  258. }
  259. fn random_bits() -> [u8; ED25519_SECRET_KEY_LENGTH] {
  260. let mut chacha = ChaChaRng::from_entropy();
  261. let mut secret_bytes = [0_u8; ED25519_SECRET_KEY_LENGTH];
  262. chacha.fill_bytes(&mut secret_bytes);
  263. secret_bytes
  264. }