Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(feat) Implement AnoncredsLedgerRead for cheqd #1306 #1308

Merged
Merged
Changes from 1 commit
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
e070717
try permissions in CI
gmulhearn-anonyome Aug 15, 2024
1693dd5
new crate
gmulhearn-anonyome Nov 24, 2024
d40d9c7
resolution working
gmulhearn-anonyome Nov 25, 2024
b39bc4c
check in the proto types and have a standalone generator helper (rath…
gmulhearn-anonyome Nov 25, 2024
65b1e9b
Merge branch 'main' into gm/1300-did-cheqd-resolver
gmulhearn-anonyome Nov 25, 2024
8d0fd4f
regen lock
gmulhearn-anonyome Nov 25, 2024
d0bf0af
cheqd did parser
gmulhearn-anonyome Nov 26, 2024
881410e
cheqd did url tests
gmulhearn-anonyome Nov 26, 2024
96d74e9
re-gen lock
gmulhearn-anonyome Nov 26, 2024
a98803a
resolver system tests are working
gmulhearn-anonyome Nov 26, 2024
accc65d
run int tests in CI
gmulhearn-anonyome Nov 26, 2024
dcbb8a5
clippy
gmulhearn-anonyome Nov 26, 2024
8ae721c
resolution with contexts
gmulhearn-anonyome Nov 26, 2024
c9464cb
finish some TODOs, and add doc metadata
gmulhearn-anonyome Nov 26, 2024
0353b02
update readme
gmulhearn-anonyome Nov 26, 2024
d1692e1
try bumping rust ver on vdrproxy
gmulhearn-anonyome Nov 26, 2024
d4550d5
Merge branch 'main' into gm/1300-did-cheqd-resolver
gmulhearn-anonyome Nov 26, 2024
8d46987
lock auto update
gmulhearn-anonyome Nov 26, 2024
f0908aa
readme updates
gmulhearn-anonyome Nov 27, 2024
cb57bc9
remove some debugs
gmulhearn-anonyome Nov 27, 2024
e722982
more error info
gmulhearn-anonyome Nov 27, 2024
fd2c009
updated hyper in did:web. fixes clients
gmulhearn-anonyome Nov 27, 2024
25c10ee
fix up tls. works on android
gmulhearn-anonyome Dec 1, 2024
b3e183e
some cleaning
gmulhearn-anonyome Dec 2, 2024
ecb736c
begin. schema & cred def working in edge agent test
gmulhearn-anonyome Dec 3, 2024
25e766c
temporarily include new format vers
gmulhearn-anonyome Dec 3, 2024
a68446f
Merge branch 'main' into gm/1300-did-cheqd-resolver
gmulhearn-anonyome Dec 3, 2024
d3d1a97
Merge branch 'gm/1300-did-cheqd-resolver' into gm/1306-cheqd-anoncred…
gmulhearn-anonyome Dec 3, 2024
ab7becb
issuer id
gmulhearn-anonyome Dec 4, 2024
6c82328
move delta -> status list conversion as a ledger responsibility
gmulhearn-anonyome Dec 4, 2024
c08b2c1
cheqd get rev status list
gmulhearn-anonyome Dec 4, 2024
19d4e21
return metadata
gmulhearn-anonyome Dec 4, 2024
e786571
rev status list and resource query working
gmulhearn-anonyome Dec 5, 2024
3461fc0
some bounds and comments
gmulhearn-anonyome Dec 5, 2024
10695cd
fmt typing
gmulhearn-anonyome Dec 5, 2024
b9111aa
optimize with metadata
gmulhearn-anonyome Dec 9, 2024
fbe3054
multi ledger aggregation
gmulhearn-anonyome Dec 9, 2024
c48f329
some more testing and todos
gmulhearn-anonyome Dec 9, 2024
7c31d58
rm aliases
gmulhearn-anonyome Dec 9, 2024
56c282f
test and CI fixing
gmulhearn-anonyome Dec 9, 2024
9b13ff7
fmt
gmulhearn-anonyome Dec 9, 2024
269df99
clippys and fmts
gmulhearn-anonyome Dec 9, 2024
0a50ddc
Merge branch 'main' into gm/1306-cheqd-anoncreds-read
gmulhearn-anonyome Dec 9, 2024
a123936
wrap sys tests in cheqd feature
gmulhearn-anonyome Dec 9, 2024
3e4f1a2
refine did-url handling (percent encoding queries)
gmulhearn-anonyome Dec 10, 2024
e48f23b
add deprecated flag for rev reg delta
gmulhearn-anonyome Dec 11, 2024
3cd9e86
dev note on multi ledger
gmulhearn-anonyome Dec 11, 2024
47cccec
fmt
gmulhearn-anonyome Dec 11, 2024
4af894c
try arc wrapper
gmulhearn-anonyome Dec 11, 2024
f0d93dd
more generic trait
gmulhearn-anonyome Dec 11, 2024
ecc7c81
whoops!
gmulhearn-anonyome Dec 11, 2024
06f9afd
pipe thru schema to prover store credential
gmulhearn-anonyome Dec 12, 2024
e5bee98
Merge branch 'hyperledger-main' into gm/1306-cheqd-anoncreds-read
gmulhearn-anonyome Dec 12, 2024
a4eb40b
type the schema id to avoid parsing issues with legacy identifiers
gmulhearn-anonyome Dec 12, 2024
7f69365
move around schema id a bit
gmulhearn-anonyome Dec 12, 2024
08c557b
Merge branch 'hyperledger-main' into gm/1306-cheqd-anoncreds-read
gmulhearn-anonyome Dec 15, 2024
19d0430
comment on weird typing
gmulhearn-anonyome Dec 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
pipe thru schema to prover store credential
Signed-off-by: George Mulhearn <[email protected]>
gmulhearn-anonyome committed Dec 12, 2024
commit 06f9afd40f86523a10754d675555c6c44d1a5c44
39 changes: 26 additions & 13 deletions aries/aries_vcx/src/protocols/issuance/holder/state_machine.rs
Original file line number Diff line number Diff line change
@@ -224,11 +224,12 @@ impl HolderSM {
)
.await
{
Ok((msg_credential_request, req_meta, cred_def_json)) => {
Ok((msg_credential_request, req_meta, cred_def_json, schema_id)) => {
HolderFullState::RequestSet(RequestSetState {
msg_credential_request,
req_meta,
cred_def_json,
schema_id,
})
}
Err(err) => {
@@ -276,13 +277,18 @@ impl HolderSM {
trace!("HolderSM::receive_credential >>");
let state = match self.state {
HolderFullState::RequestSet(state_data) => {
let schema = ledger
.get_schema(&state_data.schema_id.clone().try_into()?, None)
.await?;
let schema_json = serde_json::to_string(&schema)?;
match _store_credential(
wallet,
ledger,
anoncreds,
&credential,
&state_data.req_meta,
&state_data.cred_def_json,
&schema_json,
)
.await
{
@@ -549,6 +555,7 @@ async fn _store_credential(
credential: &IssueCredentialV1,
req_meta: &str,
cred_def_json: &str,
schema_json: &str,
) -> VcxResult<(String, Option<String>)> {
trace!(
"Holder::_store_credential >>> credential: {:?}, req_meta: {}, cred_def_json: {}",
@@ -572,6 +579,7 @@ async fn _store_credential(
wallet,
serde_json::from_str(req_meta)?,
serde_json::from_str(&credential_json)?,
serde_json::from_str(schema_json)?,
serde_json::from_str(cred_def_json)?,
rev_reg_def_json.clone(),
)
@@ -585,14 +593,15 @@ async fn _store_credential(
))
}

/// On success, returns: credential request, request metadata, cred_def_id, cred def, schema_id
pub async fn create_anoncreds_credential_request(
wallet: &impl BaseWallet,
ledger: &impl AnoncredsLedgerRead,
anoncreds: &impl BaseAnonCreds,
cred_def_id: &str,
prover_did: &Did,
cred_offer: &str,
) -> VcxResult<(String, String, String, String)> {
) -> VcxResult<(String, String, String, String, String)> {
let cred_def_json = ledger
.get_cred_def(&cred_def_id.to_string().try_into()?, None)
.await?;
@@ -619,18 +628,21 @@ pub async fn create_anoncreds_credential_request(
serde_json::to_string(&s2).unwrap(),
cred_def_id.to_string(),
serde_json::to_string(&cred_def_json).unwrap(),
cred_def_json.schema_id.to_string(),
)
})
}

/// On success, returns: message with cred request, request metadata, cred def (for caching),
/// schema_id
async fn build_credential_request_msg(
wallet: &impl BaseWallet,
ledger: &impl AnoncredsLedgerRead,
anoncreds: &impl BaseAnonCreds,
thread_id: String,
my_pw_did: Did,
offer: &OfferCredentialV1,
) -> VcxResult<(RequestCredentialV1, String, String)> {
) -> VcxResult<(RequestCredentialV1, String, String, String)> {
trace!(
"Holder::_make_credential_request >>> my_pw_did: {:?}, offer: {:?}",
my_pw_did,
@@ -641,16 +653,17 @@ async fn build_credential_request_msg(

trace!("Parsed cred offer attachment: {}", cred_offer);
let cred_def_id = parse_cred_def_id_from_cred_offer(&cred_offer)?;
let (req, req_meta, _cred_def_id, cred_def_json) = create_anoncreds_credential_request(
wallet,
ledger,
anoncreds,
&cred_def_id,
&my_pw_did,
&cred_offer,
)
.await?;
let (req, req_meta, _cred_def_id, cred_def_json, schema_id) =
create_anoncreds_credential_request(
wallet,
ledger,
anoncreds,
&cred_def_id,
&my_pw_did,
&cred_offer,
)
.await?;
trace!("Created cred def json: {}", cred_def_json);
let credential_request_msg = _build_credential_request_msg(req, &thread_id);
Ok((credential_request_msg, req_meta, cred_def_json))
Ok((credential_request_msg, req_meta, cred_def_json, schema_id))
}
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@ use crate::{
pub struct RequestSetState {
pub req_meta: String,
pub cred_def_json: String,
pub schema_id: String,
pub msg_credential_request: RequestCredentialV1,
}

1 change: 1 addition & 0 deletions aries/aries_vcx/tests/test_anoncreds.rs
Original file line number Diff line number Diff line change
@@ -110,6 +110,7 @@ async fn test_pool_revoke_credential() -> Result<(), Box<dyn Error>> {
&setup.anoncreds,
&setup.anoncreds,
&setup.institution_did,
&schema,
&cred_def,
Some(&rev_reg),
)
1 change: 1 addition & 0 deletions aries/aries_vcx/tests/test_credential_retrieval.rs
Original file line number Diff line number Diff line change
@@ -147,6 +147,7 @@ async fn test_agency_pool_case_for_proof_req_doesnt_matter_for_retrieve_creds(
&setup.anoncreds,
&setup.anoncreds,
&setup.institution_did,
&schema,
&cred_def,
None,
)
2 changes: 2 additions & 0 deletions aries/aries_vcx/tests/test_credentials.rs
Original file line number Diff line number Diff line change
@@ -48,6 +48,7 @@ async fn test_pool_prover_get_credential() -> Result<(), Box<dyn Error>> {
&setup.anoncreds,
&setup.anoncreds,
&setup.institution_did,
&schema,
&cred_def,
Some(&rev_reg),
)
@@ -102,6 +103,7 @@ async fn test_pool_is_cred_revoked() -> Result<(), Box<dyn Error>> {
&setup.anoncreds,
&setup.anoncreds,
&setup.institution_did,
&schema,
&cred_def,
Some(&rev_reg),
)
1 change: 1 addition & 0 deletions aries/aries_vcx/tests/test_proof_presentation.rs
Original file line number Diff line number Diff line change
@@ -71,6 +71,7 @@ async fn test_agency_pool_generate_proof_with_predicates() -> Result<(), Box<dyn
&setup.anoncreds,
&setup.anoncreds,
&setup.institution_did,
&schema,
&cred_def,
Some(&rev_reg),
)
1 change: 1 addition & 0 deletions aries/aries_vcx/tests/test_verifier.rs
Original file line number Diff line number Diff line change
@@ -319,6 +319,7 @@ async fn create_and_store_nonrevocable_credential(
anoncreds_issuer,
anoncreds_holder,
issuer_did,
&schema,
&cred_def,
None,
)
2 changes: 2 additions & 0 deletions aries/aries_vcx/tests/utils/mod.rs
Original file line number Diff line number Diff line change
@@ -107,6 +107,7 @@ pub async fn create_and_write_credential(
anoncreds_issuer: &impl BaseAnonCreds,
anoncreds_holder: &impl BaseAnonCreds,
institution_did: &Did,
schema: &Schema,
cred_def: &CredentialDef,
rev_reg: Option<&RevocationRegistry>,
) -> String {
@@ -159,6 +160,7 @@ pub async fn create_and_write_credential(
wallet_holder,
req_meta,
cred,
schema.schema_json.clone(),
cred_def.get_cred_def_json().try_clone().unwrap(),
rev_reg_def_json
.as_deref()
119 changes: 17 additions & 102 deletions aries/aries_vcx_anoncreds/src/anoncreds/anoncreds/mod.rs
Original file line number Diff line number Diff line change
@@ -966,26 +966,21 @@ impl BaseAnonCreds for Anoncreds {
async fn prover_store_credential(
&self,
wallet: &impl BaseWallet,
cred_req_metadata_json: CredentialRequestMetadata,
cred_json: Credential,
cred_def_json: CredentialDefinition,
rev_reg_def_json: Option<RevocationRegistryDefinition>,
cred_req_metadata: CredentialRequestMetadata,
unprocessed_cred: Credential,
schema: Schema,
cred_def: CredentialDefinition,
rev_reg_def: Option<RevocationRegistryDefinition>,
) -> VcxAnoncredsResult<CredentialId> {
let mut credential: AnoncredsCredential = cred_json.convert(())?;

let cred_def_id = credential.cred_def_id.to_string();
let (_cred_def_method, issuer_did, _signature_type, _schema_num, _tag) =
cred_def_parts(&cred_def_id).ok_or(VcxAnoncredsError::InvalidSchema(
"Could not process credential.cred_def_id as parts.".into(),
))?;
let mut credential: AnoncredsCredential = unprocessed_cred.convert(())?;

let cred_request_metadata: AnoncredsCredentialRequestMetadata =
cred_req_metadata_json.convert(())?;
cred_req_metadata.convert(())?;
let link_secret_id = &cred_request_metadata.link_secret_name;
let link_secret = self.get_link_secret(wallet, link_secret_id).await?;
let cred_def: AnoncredsCredentialDefinition = cred_def_json.convert(())?;
let cred_def: AnoncredsCredentialDefinition = cred_def.convert(())?;
let rev_reg_def: Option<AnoncredsRevocationRegistryDefinition> =
if let Some(rev_reg_def_json) = rev_reg_def_json {
if let Some(rev_reg_def_json) = rev_reg_def {
Some(rev_reg_def_json.convert(())?)
} else {
None
@@ -1000,19 +995,20 @@ impl BaseAnonCreds for Anoncreds {
)?;

let schema_id = &credential.schema_id;
let cred_def_id = &credential.cred_def_id;
let issuer_did = &cred_def.issuer_id;

let (_schema_method, schema_issuer_did, schema_name, schema_version) =
schema_parts(schema_id.0.as_str()).ok_or(VcxAnoncredsError::InvalidSchema(format!(
"Could not process credential.schema_id {schema_id} as parts."
)))?;
let schema_issuer_did = schema.issuer_id;
let schema_name = schema.name;
let schema_version = schema.version;

let mut tags = RecordTags::new(vec![
RecordTag::new("schema_id", &schema_id.0),
RecordTag::new("schema_issuer_did", schema_issuer_did.did()),
RecordTag::new("schema_issuer_did", &schema_issuer_did.0),
RecordTag::new("schema_name", &schema_name),
RecordTag::new("schema_version", &schema_version),
RecordTag::new("issuer_did", issuer_did.did()),
RecordTag::new("cred_def_id", &cred_def_id),
RecordTag::new("issuer_did", &issuer_did.0),
RecordTag::new("cred_def_id", &cred_def_id.0),
]);

if let Some(rev_reg_id) = &credential.rev_reg_id {
@@ -1403,84 +1399,3 @@ pub fn schema_parts(id: &str) -> Option<(Option<&str>, Did, String, String)> {

None
}

pub fn cred_def_parts(id: &str) -> Option<(Option<&str>, Did, String, SchemaId, String)> {
let parts = id.split_terminator(':').collect::<Vec<&str>>();

if parts.len() == 4 {
// Th7MpTaRZVRYnPiabds81Y:3:CL:1
let did = parts[0].to_string();
let Ok(did) = Did::parse(did) else {
return None;
};
let signature_type = parts[2].to_string();
let schema_id = parts[3].to_string();
let tag = String::new();
return Some((None, did, signature_type, SchemaId(schema_id), tag));
}

if parts.len() == 5 {
// Th7MpTaRZVRYnPiabds81Y:3:CL:1:tag
let did = parts[0].to_string();
let Ok(did) = Did::parse(did) else {
return None;
};
let signature_type = parts[2].to_string();
let schema_id = parts[3].to_string();
let tag = parts[4].to_string();
return Some((None, did, signature_type, SchemaId(schema_id), tag));
}

if parts.len() == 7 {
// NcYxiDXkpYi6ov5FcYDi1e:3:CL:NcYxiDXkpYi6ov5FcYDi1e:2:gvt:1.0
let did = parts[0].to_string();
let Ok(did) = Did::parse(did) else {
return None;
};
let signature_type = parts[2].to_string();
let schema_id = parts[3..7].join(":");
let tag = String::new();
return Some((None, did, signature_type, SchemaId(schema_id), tag));
}

if parts.len() == 8 {
// NcYxiDXkpYi6ov5FcYDi1e:3:CL:NcYxiDXkpYi6ov5FcYDi1e:2:gvt:1.0:tag
let did = parts[0].to_string();
let Ok(did) = Did::parse(did) else {
return None;
};
let signature_type = parts[2].to_string();
let schema_id = parts[3..7].join(":");
let tag = parts[7].to_string();
return Some((None, did, signature_type, SchemaId(schema_id), tag));
}

if parts.len() == 9 {
// creddef:sov:did:sov:NcYxiDXkpYi6ov5FcYDi1e:3:CL:3:tag
let method = parts[1];
let did = parts[2..5].join(":");
let Ok(did) = Did::parse(did) else {
return None;
};
let signature_type = parts[6].to_string();
let schema_id = parts[7].to_string();
let tag = parts[8].to_string();
return Some((Some(method), did, signature_type, SchemaId(schema_id), tag));
}

if parts.len() == 16 {
// creddef:sov:did:sov:NcYxiDXkpYi6ov5FcYDi1e:3:CL:schema:sov:did:sov:
// NcYxiDXkpYi6ov5FcYDi1e:2:gvt:1.0:tag
let method = parts[1];
let did = parts[2..5].join(":");
let Ok(did) = Did::parse(did) else {
return None;
};
let signature_type = parts[6].to_string();
let schema_id = parts[7..15].join(":");
let tag = parts[15].to_string();
return Some((Some(method), did, signature_type, SchemaId(schema_id), tag));
}

None
}
9 changes: 5 additions & 4 deletions aries/aries_vcx_anoncreds/src/anoncreds/base_anoncreds.rs
Original file line number Diff line number Diff line change
@@ -146,10 +146,11 @@ pub trait BaseAnonCreds: std::fmt::Debug + Send + Sync {
async fn prover_store_credential(
&self,
wallet: &impl BaseWallet,
cred_req_metadata_json: CredentialRequestMetadata,
cred_json: Credential,
cred_def_json: CredentialDefinition,
rev_reg_def_json: Option<RevocationRegistryDefinition>,
cred_req_metadata: CredentialRequestMetadata,
unprocessed_cred: Credential,
schema: Schema,
cred_def: CredentialDefinition,
rev_reg_def: Option<RevocationRegistryDefinition>,
) -> VcxAnoncredsResult<CredentialId>;

async fn prover_delete_credential(
9 changes: 5 additions & 4 deletions aries/misc/test_utils/src/mockdata/mock_anoncreds.rs
Original file line number Diff line number Diff line change
@@ -188,10 +188,11 @@ impl BaseAnonCreds for MockAnoncreds {
async fn prover_store_credential(
&self,
_wallet: &impl BaseWallet,
_cred_req_metadata_json: CredentialRequestMetadata,
_cred_json: Credential,
_cred_def_json: CredentialDefinition,
_rev_reg_def_json: Option<RevocationRegistryDefinition>,
_cred_req_metadata: CredentialRequestMetadata,
_cred: Credential,
_schema: Schema,
_cred_def: CredentialDefinition,
_rev_reg_def: Option<RevocationRegistryDefinition>,
) -> VcxAnoncredsResult<CredentialId> {
Ok("cred_id".to_string())
}