Skip to content

Commit

Permalink
Merge pull request #69 from sicpa-dlab/0.3.1
Browse files Browse the repository at this point in the history
0.3.1 Release
  • Loading branch information
dhh1128 committed May 12, 2022
2 parents 2c50a61 + 251d926 commit fdd605b
Show file tree
Hide file tree
Showing 16 changed files with 260 additions and 163 deletions.
5 changes: 5 additions & 0 deletions .github/workflows/verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,13 @@ jobs:
node-version: ${{ matrix.node }}

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

- name: Install wasm-pack Windows
if: runner.os == 'Windows'
run: npm install -g wasm-pack@0.10.1

- name: Build pkg (bundler)
run: make

Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ name = 'routing'

[package]
name = 'didcomm'
version = '0.3.0'
version = '0.3.1'
authors = ['Vyacheslav Gudkov <vyacheslav.gudkov@dsr-corporation.com>']
edition = '2018'
description = 'DIDComm for Rust'
Expand Down
26 changes: 6 additions & 20 deletions src/did/did_doc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,27 +50,13 @@ pub enum VerificationMethodType {

/// Represents verification material (https://www.w3.org/TR/did-core/#verification-material)
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(tag = "format")]
pub enum VerificationMaterial {
JWK {
#[serde(flatten)]
value: Value,
},
Multibase {
#[serde(flatten)]
value: String,
},
Base58 {
#[serde(flatten)]
value: String,
},
Hex {
#[serde(flatten)]
value: String,
},
Other {
#[serde(flatten)]
value: Value,
},
JWK { value: Value },
Multibase { value: String },
Base58 { value: String },
Hex { value: String },
Other { value: Value },
}

/// Represents service record in DID Document (https://www.w3.org/TR/did-core/#services).
Expand Down
26 changes: 6 additions & 20 deletions src/secrets/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,25 +94,11 @@ pub enum SecretType {

/// Represents secret crypto material.
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(tag = "format")]
pub enum SecretMaterial {
JWK {
#[serde(flatten)]
value: Value,
},
Multibase {
#[serde(flatten)]
value: String,
},
Base58 {
#[serde(flatten)]
value: String,
},
Hex {
#[serde(flatten)]
value: String,
},
Other {
#[serde(flatten)]
value: Value,
},
JWK { value: Value },
Multibase { value: String },
Base58 { value: String },
Hex { value: String },
Other { value: Value },
}
102 changes: 73 additions & 29 deletions src/utils/did.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
use askar_crypto::alg::{
ed25519::Ed25519KeyPair, k256::K256KeyPair, p256::P256KeyPair, x25519::X25519KeyPair,
};
use serde_json::json;
use askar_crypto::repr::{KeyPublicBytes, KeySecretBytes};
use serde_json::{json, Value};
use std::io::Cursor;
use varint::{VarintRead, VarintWrite};

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

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

let jwk = json!({
let mut jwk = json!({
"kty": "OKP",
"crv": "X25519",
"x": base64_url_x_value,
"d": base64_url_d_value
});

key_pair.with_public_bytes(|buf| {
jwk["x"] = Value::String(base64::encode_config(buf, base64::URL_SAFE_NO_PAD))
});

key_pair.with_secret_bytes(|buf| {
if let Some(sk) = buf {
jwk["d"] = Value::String(base64::encode_config(sk, base64::URL_SAFE_NO_PAD))
}
});

X25519KeyPair::from_jwk_value(&jwk)
Expand Down Expand Up @@ -355,16 +362,22 @@ impl AsKnownKeyPair for Secret {
))?
}

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

let jwk = json!({
let mut jwk = json!({
"kty": "OKP",
"crv": "X25519",
"x": base64_url_x_value,
"d": base64_url_d_value
});

key_pair.with_public_bytes(|buf| {
jwk["x"] = Value::String(base64::encode_config(buf, base64::URL_SAFE_NO_PAD))
});

key_pair.with_secret_bytes(|buf| {
if let Some(sk) = buf {
jwk["d"] = Value::String(base64::encode_config(sk, base64::URL_SAFE_NO_PAD))
}
});

X25519KeyPair::from_jwk_value(&jwk)
Expand Down Expand Up @@ -473,16 +486,18 @@ mod tests {
let actual_key = Secret {
id: "did:example:eve#key-x25519-1".to_string(),
type_: SecretType::X25519KeyAgreementKey2019,
secret_material: (SecretMaterial::Base58{
value:"2b5J8uecvwAo9HUGge5NKQ7HoRNKUKCjZ7Fr4mDgWkwqFyjLPWt7rv5kL3UPeG3e4B9Sy4H2Q2zAuWcP2RNtgJ4t".to_string()
secret_material: (SecretMaterial::Base58 {
value: "CMhHdN419VCSfbGxt6PEAEy72tJxYHTGHuCSH6BW9oi3".to_string(),
}),
}.as_key_pair().unwrap();
}
.as_key_pair()
.unwrap();

let expected_key = X25519KeyPair::from_jwk_value(&json!({
"kty": "OKP",
"crv": "X25519",
"x": "piw5XSMkceDeklaHQZXPBLQySyAwF8eZ-vddihdURS0",
"d": "T2azVap7CYD_kB8ilbnFYqwwYb5N-GcD6yjGEvquZXg"
"x": "tGskN_ae61DP4DLY31_fjkbvnKqf-ze7kA6Cj2vyQxU",
"d": "qL25gw-HkNJC9m4EsRzCoUx1KntjwHPzxo6a2xUcyFQ"
}))
.map(KnownKeyPair::X25519)
.unwrap();
Expand All @@ -494,10 +509,12 @@ mod tests {
let actual_key = Secret {
id: "did:example:eve#key-ed25519-1".to_string(),
type_: SecretType::Ed25519VerificationKey2018,
secret_material: (SecretMaterial::Base58{
secret_material: (SecretMaterial::Base58 {
value: "2b5J8uecvwAo9HUGge5NKQ7HoRNKUKCjZ7Fr4mDgWkwqATnLmZDx7Seu6NqTuFKkxuHNT27GcoxVZQCkWJhNvaUQ".to_string()
}),
}.as_key_pair().unwrap();
}
.as_key_pair()
.unwrap();

let expected_key = Ed25519KeyPair::from_jwk_value(&json!({
"kty": "OKP",
Expand All @@ -515,16 +532,18 @@ mod tests {
let actual_key = Secret {
id: "did:example:eve#key-x25519-1".to_string(),
type_: SecretType::X25519KeyAgreementKey2020,
secret_material: (SecretMaterial::Multibase{
value: "zshCmpUZKtFrAfudMf7NzD3oR6yhWe6i2434FDktk9CYZfkndn7suDrqnRWvrVDHk95Z7vBRJChFxTgBF9qzq7D3xPe".to_string()
secret_material: (SecretMaterial::Multibase {
value: "z3wei8fqKMwJsyTpqDQDWZ9ytPC716YyNDZL6kewQ9qtKrTD".to_string(),
}),
}.as_key_pair().unwrap();
}
.as_key_pair()
.unwrap();

let expected_key = X25519KeyPair::from_jwk_value(&json!({
"kty": "OKP",
"crv": "X25519",
"x": "piw5XSMkceDeklaHQZXPBLQySyAwF8eZ-vddihdURS0",
"d": "T2azVap7CYD_kB8ilbnFYqwwYb5N-GcD6yjGEvquZXg"
"x": "tGskN_ae61DP4DLY31_fjkbvnKqf-ze7kA6Cj2vyQxU",
"d": "qL25gw-HkNJC9m4EsRzCoUx1KntjwHPzxo6a2xUcyFQ"
}))
.map(KnownKeyPair::X25519)
.unwrap();
Expand All @@ -536,10 +555,12 @@ mod tests {
let actual_key = Secret {
id: "did:example:eve#key-ed25519-1".to_string(),
type_: SecretType::Ed25519VerificationKey2020,
secret_material: (SecretMaterial::Multibase{
secret_material: (SecretMaterial::Multibase {
value: "zrv2DyJwnoQWzS74nPkHHdM7NYH27BRNFBG9To7Fca9YzWhfBVa9Mek52H9bJexjdNqxML1F3TGCpjLNkCwwgQDvd5J".to_string()
}),
}.as_key_pair().unwrap();
}
.as_key_pair()
.unwrap();

let expected_key = Ed25519KeyPair::from_jwk_value(&json!({
"kty": "OKP",
Expand Down Expand Up @@ -667,4 +688,27 @@ mod tests {
assert_eq!(is_did("example:example:alice"), false);
assert_eq!(is_did("example:alice"), false);
}

#[test]
fn deserialization_for_base58_key_representation_works() {
let expected_serialzied = r#"{"id":"did:example:eve#key-x25519-1","secret_material":{"format":"Base58","value":"2b5J8uecvwAo9HUGge5NKQ7HoRNKUKCjZ7Fr4mDgWkwqFyjLPWt7rv5kL3UPeG3e4B9Sy4H2Q2zAuWcP2RNtgJ4t"},"type":"X25519KeyAgreementKey2019"}"#;
let base58key = "2b5J8uecvwAo9HUGge5NKQ7HoRNKUKCjZ7Fr4mDgWkwqFyjLPWt7rv5kL3UPeG3e4B9Sy4H2Q2zAuWcP2RNtgJ4t";
let actual_key = Secret {
id: "did:example:eve#key-x25519-1".to_string(),
type_: SecretType::X25519KeyAgreementKey2019,
secret_material: SecretMaterial::Base58 {
value: base58key.to_string(),
},
};

let serialized = json!(actual_key).to_string();
assert_eq!(expected_serialzied, serialized);

let deserialized: Secret = serde_json::from_str(&serialized).unwrap();
assert_eq!(format!("{:?}", deserialized), format!("{:?}", actual_key));
match deserialized.secret_material {
SecretMaterial::Base58 { value } => assert_eq!(value, base58key),
_ => assert!(false),
}
}
}
2 changes: 1 addition & 1 deletion wasm/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = 'didcomm-js'
version = '0.3.0'
version = '0.3.1'
authors = ['Vyacheslav Gudkov <vyacheslav.gudkov@dsr-corporation.com>']
edition = '2018'
description = 'WASM based javascript wrapper for DIDComm'
Expand Down
Loading

0 comments on commit fdd605b

Please sign in to comment.