Ver código fonte

Add tests

develop
Silvestr Predko 2 anos atrás
pai
commit
150287e1f5
3 arquivos alterados com 318 adições e 0 exclusões
  1. 5
    0
      common-api/Cargo.toml
  2. 22
    0
      common-api/src/crypto/mod.rs
  3. 291
    0
      common-api/tests/crypto.rs

+ 5
- 0
common-api/Cargo.toml Ver arquivo

@@ -18,3 +18,8 @@ serde = { version = "1", default-features = false, features = ["derive"] }
18 18
 serde_json = "1"
19 19
 thiserror = "1"
20 20
 x25519-dalek = { version = "1", features = ["serde"] }
21
+
22
+[dev-dependencies]
23
+anyhow = "1"
24
+rand = "0.8.5"
25
+rand_chacha = "0.3"

+ 22
- 0
common-api/src/crypto/mod.rs Ver arquivo

@@ -148,3 +148,25 @@ fn split_encoded_str(encoded: &str) -> Result<(&str, &str)> {
148 148
         _ => Err(Error::UnknownKeyType(encoded.to_owned())),
149 149
     }
150 150
 }
151
+
152
+#[cfg(test)]
153
+mod tests {
154
+
155
+    use super::{split_encoded_str, Error, ED25519, X25519};
156
+
157
+    #[test]
158
+    fn split_encoded() -> anyhow::Result<()> {
159
+        let bs58_str = bs58::encode(vec![0, 0, 0]).into_string();
160
+        assert!(matches!(
161
+                split_encoded_str(&format!("ed25519:{}", bs58_str)),
162
+                Ok((key_type, s)) if key_type == ED25519 && s == bs58_str));
163
+        assert!(matches!(
164
+                split_encoded_str(&format!("x25519:{}", bs58_str)),
165
+                Ok((key_type, s)) if key_type == X25519 && s == bs58_str));
166
+        assert!(matches!(
167
+            split_encoded_str(&bs58_str),
168
+            Err(Error::UnknownKeyType(..))
169
+        ));
170
+        Ok(())
171
+    }
172
+}

+ 291
- 0
common-api/tests/crypto.rs Ver arquivo

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

Carregando…
Cancelar
Salvar