Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
nanderstabel committed Oct 18, 2024
1 parent 1e24136 commit 25f7a96
Show file tree
Hide file tree
Showing 9 changed files with 688 additions and 184 deletions.
390 changes: 308 additions & 82 deletions Cargo.lock

Large diffs are not rendered by default.

6 changes: 4 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,12 @@ tauri-utils = { version = "=2.0.0-beta.19", features = [ "resources" ] }
tauri-winres = "=0.1"

agent_shared = { git = "https://[email protected]/impierce/ssi-agent.git", rev = "1823810" }
did_manager = { git = "https://[email protected]/impierce/did-manager.git", tag = "v1.0.0-beta.3" }
# did_manager = { git = "https://[email protected]/impierce/did-manager.git", tag = "v1.0.0-beta.3" }
did_manager = { git = "https://[email protected]/impierce/did-manager.git", rev = "c1cfda0" }
jsonwebtoken = "9.3"
log = "^0.4"
oid4vc = { git = "https://[email protected]/impierce/openid4vc.git", rev = "d095db0" }
oid4vc = { git = "https://[email protected]/impierce/openid4vc.git", rev = "bc4d6d2" }
# oid4vc = { path = "../openid4vc" }
rand = "0.8"
serde_json = "1.0"
serial_test = "2.0"
Expand Down
11 changes: 6 additions & 5 deletions identity-wallet/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,17 @@ downcast-rs = "1.2"
dyn-clone = "1.0"
futures = "0.3"
icu = "1.4.0"
identity_credential = { version = "1.3", default-features = false, features = [
identity_credential = { git = "https://github.com/impierce/identity.rs", branch = "fix/compile-fixes", default-features = false, features = [
"credential",
"domain-linkage",
"presentation",
"validator",
"sd-jwt-vc"
] }
identity_core = { version = "1.3" }
identity_eddsa_verifier = { version = "1.3" }
identity_iota = { version = "1.3" }
identity_jose = { version = "1.3" }
identity_core = { git = "https://github.com/impierce/identity.rs", branch = "fix/compile-fixes" }
identity_eddsa_verifier = { git = "https://github.com/impierce/identity.rs", branch = "fix/compile-fixes" }
identity_iota = { git = "https://github.com/impierce/identity.rs", branch = "fix/compile-fixes" }
identity_jose = { git = "https://github.com/impierce/identity.rs", branch = "fix/compile-fixes" }
iota_stronghold = { version = "2.1" }
itertools = "0.10.5"
jsonwebtoken.workspace = true
Expand Down
118 changes: 83 additions & 35 deletions identity-wallet/src/state/credentials/mod.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
pub mod actions;
pub mod reducers;

use std::str::FromStr;

use super::{core_utils::helpers::get_unverified_jwt_claims, FeatTrait};
use crate::{error::AppError, state::core_utils::DateUtils};

use derivative::Derivative;
use identity_credential::{sd_jwt_v2::Sha256Hasher, sd_jwt_vc::SdJwtVc};
use log::info;
use oid4vc::oid4vci::credential_format_profiles::CredentialFormats;
use serde::{Deserialize, Serialize};
use serde_json::json;
use ts_rs::TS;
Expand All @@ -16,6 +21,8 @@ use uuid::Uuid;
#[ts(export, export_to = "bindings/credentials/DisplayCredential.ts")]
pub struct DisplayCredential {
pub id: String,
#[ts(type = "string")]
pub format: CredentialFormats,
pub issuer_name: String,
#[ts(type = "any")]
pub data: serde_json::Value,
Expand Down Expand Up @@ -54,48 +61,89 @@ impl TryFrom<serde_json::Value> for VerifiableCredentialRecord {

fn try_from(verifiable_credential: serde_json::Value) -> Result<Self, AppError> {
let display_credential = {
let credential_display = get_unverified_jwt_claims(&verifiable_credential)?["vc"].clone();

// Derive the hash from the credential display.
let hash = {
let type_key = "type";
let type_value = credential_display[type_key].clone();
// FIX THIS
if let Ok(sd_jwt_vc) = SdJwtVc::from_str(verifiable_credential.as_str().unwrap()) {
info!("sd_jwt_vc: {:#?}", sd_jwt_vc);

let credential_subject_key = "credentialSubject";
let mut credential_subject_value = credential_display[credential_subject_key].clone();
let issuance_date = sd_jwt_vc.claims().iat.map(|iat| iat.to_rfc3339()).unwrap_or_default();
let credential_subject = sd_jwt_vc.clone().into_disclosed_object(&Sha256Hasher::new()).unwrap();

// TODO(ngdil): Remove this hard-coded logic.
// Remove the `Passport Number` and `Staff Number` from the credential subject if they exists.
credential_subject_value["Passport Number"].take();
credential_subject_value["Staff Number"].take();
credential_subject_value["achievement"]["id"].take();

sha256::digest(
let hash = sha256::digest(
json!(
{
"type": type_value,
"credentialSubject": credential_subject_value,
"type": ["VerifiableCredential"],
"credentialSubject": credential_subject
}
)
.to_string(),
)
};

let issuance_date = credential_display["issuanceDate"]
.as_str()
.map(ToString::to_string)
.unwrap_or_default();

DisplayCredential {
id: Uuid::from_slice(&hash.as_bytes()[..16]).unwrap().to_string(),
data: credential_display,
metadata: CredentialMetadata {
is_favorite: false,
date_added: DateUtils::new_date_string(),
date_issued: issuance_date.to_string(),
},
// The other fields will be filled in at a later stage.
..Default::default()
);

DisplayCredential {
id: Uuid::from_slice(&hash.as_bytes()[..16]).unwrap().to_string(),
format: CredentialFormats::VcSdJwt(()),
data: json!({
"type": ["VerifiableCredential"],
"issuer": sd_jwt_vc.claims().iss,
"credentialSubject": credential_subject

}),
metadata: CredentialMetadata {
is_favorite: false,
date_added: DateUtils::new_date_string(),
date_issued: issuance_date.to_string(),
},
// The other fields will be filled in at a later stage.
..Default::default()
}
} else {
let credential_display = get_unverified_jwt_claims(&verifiable_credential)?["vc"].clone();

info!(
"Credential Display: {:#?}",
serde_json::to_string_pretty(&credential_display).unwrap()
);

// Derive the hash from the credential display.
let hash = {
let type_value = credential_display["type"].clone();

let credential_subject_key = "credentialSubject";
let mut credential_subject_value = credential_display[credential_subject_key].clone();

// TODO(ngdil): Remove this hard-coded logic.
// Remove the `Passport Number` and `Staff Number` from the credential subject if they exists.
credential_subject_value["Passport Number"].take();
credential_subject_value["Staff Number"].take();
credential_subject_value["achievement"]["id"].take();

sha256::digest(
json!(
{
"type": type_value,
"credentialSubject": credential_subject_value,
}
)
.to_string(),
)
};

let issuance_date = credential_display["issuanceDate"]
.as_str()
.map(ToString::to_string)
.unwrap_or_default();

DisplayCredential {
id: Uuid::from_slice(&hash.as_bytes()[..16]).unwrap().to_string(),
format: CredentialFormats::JwtVcJson(()),
data: credential_display,
metadata: CredentialMetadata {
is_favorite: false,
date_added: DateUtils::new_date_string(),
date_issued: issuance_date.to_string(),
},
// The other fields will be filled in at a later stage.
..Default::default()
}
}
};

Expand Down
Loading

0 comments on commit 25f7a96

Please sign in to comment.