Sfoglia il codice sorgente

Merge pull request #79 from Relayz-io/silvestr/impl-try-from-for-ed25519

Implemented TryFrom for PublicKey and SecretKey in dhx
develop
Predko Silvestr 2 anni fa
parent
commit
3574b39edb
Nessun account collegato all'indirizzo email del committer

+ 1
- 1
common-api/Cargo.toml Vedi File

17
 [dependencies]
17
 [dependencies]
18
 bs58 = "0.4"
18
 bs58 = "0.4"
19
 borsh = "0.9"
19
 borsh = "0.9"
20
+curve25519-dalek = "3"
20
 ed25519-dalek = "1"
21
 ed25519-dalek = "1"
21
 itertools = "0.10"
22
 itertools = "0.10"
22
 near-account-id = { version = "0.15", optional = true }
23
 near-account-id = { version = "0.15", optional = true }
23
 serde = { version = "1", default-features = false, features = ["derive"] }
24
 serde = { version = "1", default-features = false, features = ["derive"] }
24
-serde_json = "1"
25
 thiserror = "1"
25
 thiserror = "1"
26
 uuid = { version = "1", optional = true }
26
 uuid = { version = "1", optional = true }
27
 x25519-dalek = { version = "1", features = ["serde"] }
27
 x25519-dalek = { version = "1", features = ["serde"] }

+ 39
- 3
common-api/src/crypto/key_exchange.rs Vedi File

2
 //! ---
2
 //! ---
3
 //! Used Dalek cryptography, and implemented [`Borsh`](https://borsh.io/) serialization for it
3
 //! Used Dalek cryptography, and implemented [`Borsh`](https://borsh.io/) serialization for it
4
 
4
 
5
-use borsh::{BorshDeserialize, BorshSerialize};
5
+use super::{
6
+    ed25519::{Ed25519PublicKey, Ed25519SecretKey},
7
+    Error, Key, Result, X25519,
8
+};
6
 use std::{
9
 use std::{
7
     fmt::Display,
10
     fmt::Display,
8
     io::{Error as IoError, ErrorKind},
11
     io::{Error as IoError, ErrorKind},
9
 };
12
 };
10
-use x25519_dalek::{PublicKey as DalekPublicKey, StaticSecret};
11
 
13
 
12
-use super::{Error, Key, Result, X25519};
14
+use borsh::{BorshDeserialize, BorshSerialize};
15
+use curve25519_dalek::edwards::CompressedEdwardsY;
16
+use x25519_dalek::{PublicKey as DalekPublicKey, StaticSecret};
13
 
17
 
14
 pub const PUBLIC_KEY_LENGTH: usize = 32_usize;
18
 pub const PUBLIC_KEY_LENGTH: usize = 32_usize;
15
 pub const SECRET_KEY_LENGTH: usize = 32_usize;
19
 pub const SECRET_KEY_LENGTH: usize = 32_usize;
125
     }
129
     }
126
 }
130
 }
127
 
131
 
132
+impl TryFrom<Ed25519PublicKey> for PublicKey {
133
+    type Error = Error;
134
+
135
+    fn try_from(key: Ed25519PublicKey) -> Result<Self> {
136
+        let edwards_point = CompressedEdwardsY::from_slice(key.as_bytes())
137
+            .decompress()
138
+            .ok_or_else(|| {
139
+                Error::from_bytes::<Ed25519PublicKey>(
140
+                    key.as_bytes(),
141
+                    "Couldn't decompress an Edwards point".to_owned(),
142
+                )
143
+            })?;
144
+
145
+        PublicKey::try_from_bytes(edwards_point.to_montgomery().as_bytes())
146
+    }
147
+}
148
+
149
+impl TryFrom<Ed25519SecretKey> for SecretKey {
150
+    type Error = Error;
151
+
152
+    fn try_from(key: Ed25519SecretKey) -> Result<Self> {
153
+        use ed25519_dalek::{ExpandedSecretKey, SecretKey as S};
154
+
155
+        let expanded_key =
156
+            ExpandedSecretKey::from(&S::from_bytes(key.as_bytes()).map_err(|err| {
157
+                Error::from_bytes::<Ed25519SecretKey>(key.as_bytes(), err.to_string())
158
+            })?);
159
+
160
+        Self::try_from_bytes(&expanded_key.to_bytes()[..32])
161
+    }
162
+}
163
+
128
 serde_impl!(SecretKey);
164
 serde_impl!(SecretKey);
129
 serde_impl!(PublicKey);
165
 serde_impl!(PublicKey);

+ 20
- 0
common-api/tests/crypto.rs Vedi File

297
     assert_eq!(keypair_bs58, keypair.to_string());
297
     assert_eq!(keypair_bs58, keypair.to_string());
298
 }
298
 }
299
 
299
 
300
+#[test]
301
+fn convert_from_edwards_to_montgomery() {
302
+    let alice_sk = Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap();
303
+    let bob_sk = Ed25519SecretKey::try_from_bytes(&random_bits()).unwrap();
304
+
305
+    let alice_pk = Ed25519PublicKey::from(&alice_sk);
306
+    let bob_pk = Ed25519PublicKey::from(&bob_sk);
307
+
308
+    let alice_sk_dhx = SecretKey::try_from(alice_sk).unwrap();
309
+    let bob_sk_dhx = SecretKey::try_from(bob_sk).unwrap();
310
+
311
+    let alice_pk_dhx = PublicKey::try_from(alice_pk).unwrap();
312
+    let bob_pk_dhx = PublicKey::try_from(bob_pk).unwrap();
313
+
314
+    assert_eq!(
315
+        alice_sk_dhx.exchange(&bob_pk_dhx),
316
+        bob_sk_dhx.exchange(&alice_pk_dhx)
317
+    );
318
+}
319
+
300
 fn random_bits() -> [u8; ED25519_SECRET_KEY_LENGTH] {
320
 fn random_bits() -> [u8; ED25519_SECRET_KEY_LENGTH] {
301
     let mut chacha = ChaChaRng::from_entropy();
321
     let mut chacha = ChaChaRng::from_entropy();
302
     let mut secret_bytes = [0_u8; ED25519_SECRET_KEY_LENGTH];
322
     let mut secret_bytes = [0_u8; ED25519_SECRET_KEY_LENGTH];

Loading…
Annulla
Salva