瀏覽代碼

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 年之前
父節點
當前提交
3574b39edb
沒有連結到貢獻者的電子郵件帳戶。
共有 3 個檔案被更改,包括 60 行新增4 行删除
  1. 1
    1
      common-api/Cargo.toml
  2. 39
    3
      common-api/src/crypto/key_exchange.rs
  3. 20
    0
      common-api/tests/crypto.rs

+ 1
- 1
common-api/Cargo.toml 查看文件

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

+ 39
- 3
common-api/src/crypto/key_exchange.rs 查看文件

@@ -2,14 +2,18 @@
2 2
 //! ---
3 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 9
 use std::{
7 10
     fmt::Display,
8 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 18
 pub const PUBLIC_KEY_LENGTH: usize = 32_usize;
15 19
 pub const SECRET_KEY_LENGTH: usize = 32_usize;
@@ -125,5 +129,37 @@ impl SecretKey {
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 164
 serde_impl!(SecretKey);
129 165
 serde_impl!(PublicKey);

+ 20
- 0
common-api/tests/crypto.rs 查看文件

@@ -297,6 +297,26 @@ fn keypair_to_string() {
297 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 320
 fn random_bits() -> [u8; ED25519_SECRET_KEY_LENGTH] {
301 321
     let mut chacha = ChaChaRng::from_entropy();
302 322
     let mut secret_bytes = [0_u8; ED25519_SECRET_KEY_LENGTH];

Loading…
取消
儲存