Skip to content

Commit fdd605b

Browse files
authored
Merge pull request #69 from sicpa-dlab/0.3.1
0.3.1 Release
2 parents 2c50a61 + 251d926 commit fdd605b

File tree

16 files changed

+260
-163
lines changed

16 files changed

+260
-163
lines changed

Diff for: .github/workflows/verify.yml

+5
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,13 @@ jobs:
165165
node-version: ${{ matrix.node }}
166166

167167
- name: Install wasm-pack
168+
if: runner.os != 'Windows'
168169
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
169170

171+
- name: Install wasm-pack Windows
172+
if: runner.os == 'Windows'
173+
run: npm install -g [email protected]
174+
170175
- name: Build pkg (bundler)
171176
run: make
172177

Diff for: Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ name = 'routing'
2323

2424
[package]
2525
name = 'didcomm'
26-
version = '0.3.0'
26+
version = '0.3.1'
2727
authors = ['Vyacheslav Gudkov <[email protected]>']
2828
edition = '2018'
2929
description = 'DIDComm for Rust'

Diff for: src/did/did_doc.rs

+6-20
Original file line numberDiff line numberDiff line change
@@ -50,27 +50,13 @@ pub enum VerificationMethodType {
5050

5151
/// Represents verification material (https://www.w3.org/TR/did-core/#verification-material)
5252
#[derive(Debug, Clone, Deserialize, Serialize)]
53+
#[serde(tag = "format")]
5354
pub enum VerificationMaterial {
54-
JWK {
55-
#[serde(flatten)]
56-
value: Value,
57-
},
58-
Multibase {
59-
#[serde(flatten)]
60-
value: String,
61-
},
62-
Base58 {
63-
#[serde(flatten)]
64-
value: String,
65-
},
66-
Hex {
67-
#[serde(flatten)]
68-
value: String,
69-
},
70-
Other {
71-
#[serde(flatten)]
72-
value: Value,
73-
},
55+
JWK { value: Value },
56+
Multibase { value: String },
57+
Base58 { value: String },
58+
Hex { value: String },
59+
Other { value: Value },
7460
}
7561

7662
/// Represents service record in DID Document (https://www.w3.org/TR/did-core/#services).

Diff for: src/secrets/mod.rs

+6-20
Original file line numberDiff line numberDiff line change
@@ -94,25 +94,11 @@ pub enum SecretType {
9494

9595
/// Represents secret crypto material.
9696
#[derive(Debug, Clone, Deserialize, Serialize)]
97+
#[serde(tag = "format")]
9798
pub enum SecretMaterial {
98-
JWK {
99-
#[serde(flatten)]
100-
value: Value,
101-
},
102-
Multibase {
103-
#[serde(flatten)]
104-
value: String,
105-
},
106-
Base58 {
107-
#[serde(flatten)]
108-
value: String,
109-
},
110-
Hex {
111-
#[serde(flatten)]
112-
value: String,
113-
},
114-
Other {
115-
#[serde(flatten)]
116-
value: Value,
117-
},
99+
JWK { value: Value },
100+
Multibase { value: String },
101+
Base58 { value: String },
102+
Hex { value: String },
103+
Other { value: Value },
118104
}

Diff for: src/utils/did.rs

+73-29
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use askar_crypto::alg::{
22
ed25519::Ed25519KeyPair, k256::K256KeyPair, p256::P256KeyPair, x25519::X25519KeyPair,
33
};
4-
use serde_json::json;
4+
use askar_crypto::repr::{KeyPublicBytes, KeySecretBytes};
5+
use serde_json::{json, Value};
56
use std::io::Cursor;
67
use varint::{VarintRead, VarintWrite};
78

@@ -298,16 +299,22 @@ impl AsKnownKeyPair for Secret {
298299
.into_vec()
299300
.to_didcomm("Wrong base58 value in secret material")?;
300301

301-
let curve25519_point_size = 32;
302-
let (d_value, x_value) = decoded_value.split_at(curve25519_point_size);
303-
let base64_url_d_value = base64::encode_config(&d_value, base64::URL_SAFE_NO_PAD);
304-
let base64_url_x_value = base64::encode_config(&x_value, base64::URL_SAFE_NO_PAD);
302+
let key_pair = X25519KeyPair::from_secret_bytes(&decoded_value)
303+
.kind(ErrorKind::Malformed, "Unable parse x25519 secret material")?;
305304

306-
let jwk = json!({
305+
let mut jwk = json!({
307306
"kty": "OKP",
308307
"crv": "X25519",
309-
"x": base64_url_x_value,
310-
"d": base64_url_d_value
308+
});
309+
310+
key_pair.with_public_bytes(|buf| {
311+
jwk["x"] = Value::String(base64::encode_config(buf, base64::URL_SAFE_NO_PAD))
312+
});
313+
314+
key_pair.with_secret_bytes(|buf| {
315+
if let Some(sk) = buf {
316+
jwk["d"] = Value::String(base64::encode_config(sk, base64::URL_SAFE_NO_PAD))
317+
}
311318
});
312319

313320
X25519KeyPair::from_jwk_value(&jwk)
@@ -355,16 +362,22 @@ impl AsKnownKeyPair for Secret {
355362
))?
356363
}
357364

358-
let curve25519_point_size = 32;
359-
let (d_value, x_value) = decoded_value.split_at(curve25519_point_size);
360-
let base64_url_d_value = base64::encode_config(&d_value, base64::URL_SAFE_NO_PAD);
361-
let base64_url_x_value = base64::encode_config(&x_value, base64::URL_SAFE_NO_PAD);
365+
let key_pair = X25519KeyPair::from_secret_bytes(&decoded_value)
366+
.kind(ErrorKind::Malformed, "Unable parse x25519 secret material")?;
362367

363-
let jwk = json!({
368+
let mut jwk = json!({
364369
"kty": "OKP",
365370
"crv": "X25519",
366-
"x": base64_url_x_value,
367-
"d": base64_url_d_value
371+
});
372+
373+
key_pair.with_public_bytes(|buf| {
374+
jwk["x"] = Value::String(base64::encode_config(buf, base64::URL_SAFE_NO_PAD))
375+
});
376+
377+
key_pair.with_secret_bytes(|buf| {
378+
if let Some(sk) = buf {
379+
jwk["d"] = Value::String(base64::encode_config(sk, base64::URL_SAFE_NO_PAD))
380+
}
368381
});
369382

370383
X25519KeyPair::from_jwk_value(&jwk)
@@ -473,16 +486,18 @@ mod tests {
473486
let actual_key = Secret {
474487
id: "did:example:eve#key-x25519-1".to_string(),
475488
type_: SecretType::X25519KeyAgreementKey2019,
476-
secret_material: (SecretMaterial::Base58{
477-
value:"2b5J8uecvwAo9HUGge5NKQ7HoRNKUKCjZ7Fr4mDgWkwqFyjLPWt7rv5kL3UPeG3e4B9Sy4H2Q2zAuWcP2RNtgJ4t".to_string()
489+
secret_material: (SecretMaterial::Base58 {
490+
value: "CMhHdN419VCSfbGxt6PEAEy72tJxYHTGHuCSH6BW9oi3".to_string(),
478491
}),
479-
}.as_key_pair().unwrap();
492+
}
493+
.as_key_pair()
494+
.unwrap();
480495

481496
let expected_key = X25519KeyPair::from_jwk_value(&json!({
482497
"kty": "OKP",
483498
"crv": "X25519",
484-
"x": "piw5XSMkceDeklaHQZXPBLQySyAwF8eZ-vddihdURS0",
485-
"d": "T2azVap7CYD_kB8ilbnFYqwwYb5N-GcD6yjGEvquZXg"
499+
"x": "tGskN_ae61DP4DLY31_fjkbvnKqf-ze7kA6Cj2vyQxU",
500+
"d": "qL25gw-HkNJC9m4EsRzCoUx1KntjwHPzxo6a2xUcyFQ"
486501
}))
487502
.map(KnownKeyPair::X25519)
488503
.unwrap();
@@ -494,10 +509,12 @@ mod tests {
494509
let actual_key = Secret {
495510
id: "did:example:eve#key-ed25519-1".to_string(),
496511
type_: SecretType::Ed25519VerificationKey2018,
497-
secret_material: (SecretMaterial::Base58{
512+
secret_material: (SecretMaterial::Base58 {
498513
value: "2b5J8uecvwAo9HUGge5NKQ7HoRNKUKCjZ7Fr4mDgWkwqATnLmZDx7Seu6NqTuFKkxuHNT27GcoxVZQCkWJhNvaUQ".to_string()
499514
}),
500-
}.as_key_pair().unwrap();
515+
}
516+
.as_key_pair()
517+
.unwrap();
501518

502519
let expected_key = Ed25519KeyPair::from_jwk_value(&json!({
503520
"kty": "OKP",
@@ -515,16 +532,18 @@ mod tests {
515532
let actual_key = Secret {
516533
id: "did:example:eve#key-x25519-1".to_string(),
517534
type_: SecretType::X25519KeyAgreementKey2020,
518-
secret_material: (SecretMaterial::Multibase{
519-
value: "zshCmpUZKtFrAfudMf7NzD3oR6yhWe6i2434FDktk9CYZfkndn7suDrqnRWvrVDHk95Z7vBRJChFxTgBF9qzq7D3xPe".to_string()
535+
secret_material: (SecretMaterial::Multibase {
536+
value: "z3wei8fqKMwJsyTpqDQDWZ9ytPC716YyNDZL6kewQ9qtKrTD".to_string(),
520537
}),
521-
}.as_key_pair().unwrap();
538+
}
539+
.as_key_pair()
540+
.unwrap();
522541

523542
let expected_key = X25519KeyPair::from_jwk_value(&json!({
524543
"kty": "OKP",
525544
"crv": "X25519",
526-
"x": "piw5XSMkceDeklaHQZXPBLQySyAwF8eZ-vddihdURS0",
527-
"d": "T2azVap7CYD_kB8ilbnFYqwwYb5N-GcD6yjGEvquZXg"
545+
"x": "tGskN_ae61DP4DLY31_fjkbvnKqf-ze7kA6Cj2vyQxU",
546+
"d": "qL25gw-HkNJC9m4EsRzCoUx1KntjwHPzxo6a2xUcyFQ"
528547
}))
529548
.map(KnownKeyPair::X25519)
530549
.unwrap();
@@ -536,10 +555,12 @@ mod tests {
536555
let actual_key = Secret {
537556
id: "did:example:eve#key-ed25519-1".to_string(),
538557
type_: SecretType::Ed25519VerificationKey2020,
539-
secret_material: (SecretMaterial::Multibase{
558+
secret_material: (SecretMaterial::Multibase {
540559
value: "zrv2DyJwnoQWzS74nPkHHdM7NYH27BRNFBG9To7Fca9YzWhfBVa9Mek52H9bJexjdNqxML1F3TGCpjLNkCwwgQDvd5J".to_string()
541560
}),
542-
}.as_key_pair().unwrap();
561+
}
562+
.as_key_pair()
563+
.unwrap();
543564

544565
let expected_key = Ed25519KeyPair::from_jwk_value(&json!({
545566
"kty": "OKP",
@@ -667,4 +688,27 @@ mod tests {
667688
assert_eq!(is_did("example:example:alice"), false);
668689
assert_eq!(is_did("example:alice"), false);
669690
}
691+
692+
#[test]
693+
fn deserialization_for_base58_key_representation_works() {
694+
let expected_serialzied = r#"{"id":"did:example:eve#key-x25519-1","secret_material":{"format":"Base58","value":"2b5J8uecvwAo9HUGge5NKQ7HoRNKUKCjZ7Fr4mDgWkwqFyjLPWt7rv5kL3UPeG3e4B9Sy4H2Q2zAuWcP2RNtgJ4t"},"type":"X25519KeyAgreementKey2019"}"#;
695+
let base58key = "2b5J8uecvwAo9HUGge5NKQ7HoRNKUKCjZ7Fr4mDgWkwqFyjLPWt7rv5kL3UPeG3e4B9Sy4H2Q2zAuWcP2RNtgJ4t";
696+
let actual_key = Secret {
697+
id: "did:example:eve#key-x25519-1".to_string(),
698+
type_: SecretType::X25519KeyAgreementKey2019,
699+
secret_material: SecretMaterial::Base58 {
700+
value: base58key.to_string(),
701+
},
702+
};
703+
704+
let serialized = json!(actual_key).to_string();
705+
assert_eq!(expected_serialzied, serialized);
706+
707+
let deserialized: Secret = serde_json::from_str(&serialized).unwrap();
708+
assert_eq!(format!("{:?}", deserialized), format!("{:?}", actual_key));
709+
match deserialized.secret_material {
710+
SecretMaterial::Base58 { value } => assert_eq!(value, base58key),
711+
_ => assert!(false),
712+
}
713+
}
670714
}

Diff for: wasm/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = 'didcomm-js'
3-
version = '0.3.0'
3+
version = '0.3.1'
44
authors = ['Vyacheslav Gudkov <[email protected]>']
55
edition = '2018'
66
description = 'WASM based javascript wrapper for DIDComm'

0 commit comments

Comments
 (0)