Skip to content

Commit 33c52b2

Browse files
Expose Presentation methods in uniffi (#5)
1 parent b76649a commit 33c52b2

File tree

18 files changed

+1826
-621
lines changed

18 files changed

+1826
-621
lines changed

uniffi/output-frameworks/anoncreds-jvm/src/main/uniffi/anoncreds/anoncreds.kt

Lines changed: 1526 additions & 512 deletions
Large diffs are not rendered by default.

uniffi/src/anoncreds.udl

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ enum AnoncredsError {
2424
"CreateCredentialOffer",
2525
"CreateCredential",
2626
"ProcessCredential",
27+
"CreatePresentationError",
28+
"ProcessCredentialError",
2729
};
2830

2931
enum SignatureType {
@@ -296,15 +298,65 @@ interface Prover {
296298
);
297299

298300
[Throws=AnoncredsError]
299-
void process_credential(
300-
Credential credential,
301-
CredentialRequestMetadata cred_request_metadata,
302-
LinkSecret link_secret,
303-
CredentialDefinition cred_def,
304-
RevocationRegistryDefinition? rev_reg_def
305-
);
301+
void process_credential(
302+
Credential credential,
303+
CredentialRequestMetadata cred_request_metadata,
304+
LinkSecret link_secret,
305+
CredentialDefinition cred_def,
306+
RevocationRegistryDefinition? rev_reg_def
307+
);
308+
309+
[Throws=AnoncredsError]
310+
Presentation create_presentation(
311+
PresentationRequest presentation_request,
312+
sequence<CredentialRequests> credentials,
313+
record<string, string>? self_attested,
314+
LinkSecret link_secret,
315+
record<SchemaId, Schema> schemas,
316+
record<CredentialDefinitionId, CredentialDefinition> credential_definitions
317+
);
306318

307319
LinkSecret create_link_secret();
308320
};
309321

322+
dictionary RequestedAttribute {
323+
string referent;
324+
boolean revealed;
325+
};
326+
dictionary RequestedPredicate {
327+
string referent;
328+
};
329+
dictionary CredentialRequests {
330+
Credential credential;
331+
sequence<RequestedAttribute> requested_attribute;
332+
sequence<RequestedPredicate> requested_predicate;
333+
};
334+
335+
interface Presentation {
336+
[Throws=AnoncredsError]
337+
constructor(string json_string);
338+
[Throws=AnoncredsError]
339+
string get_json();
340+
};
341+
342+
interface PresentationRequest {
343+
[Throws=AnoncredsError]
344+
constructor(string json_string);
345+
[Throws=AnoncredsError]
346+
string get_json();
347+
};
348+
349+
interface Verifier {
350+
constructor();
351+
352+
[Throws=AnoncredsError]
353+
boolean verify_presentation(
354+
Presentation presentation,
355+
PresentationRequest presentation_request,
356+
record<SchemaId, Schema> schemas,
357+
record<CredentialDefinitionId, CredentialDefinition> credential_definitions
358+
);
359+
360+
};
361+
310362
namespace anoncreds {};

uniffi/src/issuer/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::types::error::AnoncredsError;
22
use crate::types::cred_def::{CredentialDefinition, CredentialDefinitionPrivate, CredentialKeyCorrectnessProof};
3-
use crate::types::cred_offer::{CredentialOffer};
4-
use crate::types::credential::{Credential};
3+
use crate::types::cred_offer::CredentialOffer;
4+
use crate::types::credential::Credential;
55
use crate::CredentialRequest;
66
use crate::types::rev_status_list::RevocationStatusList;
77
use crate::types::rev_reg_def::{RevocationRegistryDefinition, RevocationRegistryDefinitionPrivate};

uniffi/src/lib.rs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,41 @@
11
mod types;
22
// mod issuer;
3-
mod prover;
43
mod issuer;
4+
mod prover;
5+
mod verifier;
56

6-
pub use anoncreds_core::data_types::cred_def::CredentialDefinitionId;
7-
pub use anoncreds_core::data_types::issuer_id::IssuerId;
8-
pub use anoncreds_core::data_types::rev_reg::RevocationRegistryId;
9-
pub use anoncreds_core::data_types::rev_reg_def::RevocationRegistryDefinitionId;
10-
pub use anoncreds_core::data_types::schema::{Schema, SchemaId};
11-
pub use anoncreds_core::types::{AttributeNames, CredentialDefinitionConfig, SignatureType, RegistryType};
12-
pub use crate::types::cred_def::{CredentialDefinition, CredentialDefinitionData, CredentialKeyCorrectnessProof};
13-
pub use crate::types::link_secret::LinkSecret;
14-
pub use crate::types::nonce::Nonce;
15-
pub use crate::types::error::AnoncredsError;
7+
pub use crate::cred_def::CredentialDefinitionPrivate;
8+
pub use crate::custom_types::{AttributeValues, CredentialValues};
9+
pub use crate::types::cred_def::{
10+
CredentialDefinition, CredentialDefinitionData, CredentialKeyCorrectnessProof,
11+
};
1612
pub use crate::types::cred_offer::CredentialOffer;
1713
pub use crate::types::cred_req::{CredentialRequest, CredentialRequestMetadata};
1814
pub use crate::types::credential::Credential;
19-
pub use crate::types::rev_reg_def::RevocationRegistryDefinitionPrivate;
15+
pub use crate::types::error::AnoncredsError;
16+
pub use crate::types::link_secret::LinkSecret;
17+
pub use crate::types::nonce::Nonce;
18+
pub use crate::types::presentation::Presentation;
19+
pub use crate::types::presentation::PresentationRequest;
2020
pub use crate::types::rev_reg_def::RevocationRegistryDefinition;
21-
pub use crate::types::rev_reg_def::RevocationRegistryDefinitionValuePublicKeys;
21+
pub use crate::types::rev_reg_def::RevocationRegistryDefinitionPrivate;
2222
pub use crate::types::rev_reg_def::RevocationRegistryDefinitionValue;
23+
pub use crate::types::rev_reg_def::RevocationRegistryDefinitionValuePublicKeys;
2324
pub use crate::types::rev_status_list::RevocationStatusList;
24-
pub use crate::cred_def::CredentialDefinitionPrivate;
25-
pub use crate::custom_types::{AttributeValues, CredentialValues};
25+
pub use anoncreds_core::data_types::cred_def::CredentialDefinitionId;
26+
pub use anoncreds_core::data_types::issuer_id::IssuerId;
27+
pub use anoncreds_core::data_types::rev_reg::RevocationRegistryId;
28+
pub use anoncreds_core::data_types::rev_reg_def::RevocationRegistryDefinitionId;
29+
pub use anoncreds_core::data_types::schema::{Schema, SchemaId};
30+
pub use anoncreds_core::types::{
31+
AttributeNames, CredentialDefinitionConfig, RegistryType, SignatureType,
32+
};
2633

27-
pub use types::*;
2834
pub use issuer::CredentialRevocationConfig;
29-
pub use prover::*;
3035
pub use issuer::*;
36+
pub use prover::*;
37+
pub use types::*;
38+
pub use verifier::*;
3139

3240
// fn x() -> AttributeValues
3341

uniffi/src/prover/mod.rs

Lines changed: 88 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,37 @@
1-
use crate::types::link_secret::LinkSecret;
21
use crate::error::AnoncredsError;
3-
use crate::nonce::Nonce;
2+
use crate::types::cred_def::CredentialDefinition;
43
use crate::types::cred_offer::CredentialOffer;
54
use crate::types::cred_req::{CredentialRequest, CredentialRequestMetadata};
6-
use crate::types::cred_def::{CredentialDefinition, CredentialDefinitionData};
7-
use crate::Credential;
5+
use crate::types::link_secret::LinkSecret;
6+
use crate::PresentationRequest;
87
use crate::RevocationRegistryDefinition;
9-
use anoncreds_core::prover::*;
10-
use anoncreds_core::data_types::cred_request::{CredentialRequest as AnoncredsCredentialRequest, CredentialRequestMetadata as AnoncredsCredentialRequestMetadata};
11-
use anoncreds_core::types::Credential as AnoncredsCredential;
12-
use super::types::*;
13-
use std::sync::Arc;
8+
use crate::{Credential, Presentation};
9+
use anoncreds_core::data_types::cred_def::CredentialDefinitionId;
10+
use anoncreds_core::data_types::schema::{Schema, SchemaId};
11+
use anoncreds_core::prover;
12+
use anoncreds_core::types::PresentCredentials as AnoncredsPresentCredentials;
13+
use std::collections::HashMap;
1414
use std::convert::TryInto;
15+
use std::sync::Arc;
1516

1617
pub struct CreateCrendentialRequestResponse {
1718
pub request: Arc<CredentialRequest>,
1819
pub metadata: CredentialRequestMetadata,
1920
}
2021

22+
pub struct RequestedAttribute {
23+
pub referent: String,
24+
pub revealed: bool,
25+
}
26+
pub struct RequestedPredicate {
27+
pub referent: String,
28+
}
29+
pub struct CredentialRequests {
30+
pub credential: Arc<Credential>,
31+
pub requested_attribute: Vec<RequestedAttribute>,
32+
pub requested_predicate: Vec<RequestedPredicate>,
33+
}
34+
2135
pub struct Prover {}
2236

2337
impl Prover {
@@ -42,24 +56,23 @@ impl Prover {
4256
let cred_def_clone = Arc::clone(&cred_def);
4357
let cred_def_inner = cred_def_clone.as_ref();
4458
let cred_def_core = cred_def_inner.clone().try_into()?;
45-
let link_secret_core =(*link_secret).clone().secret;
59+
let link_secret_core = (*link_secret).clone().secret;
4660
let cred_offer_core = (*credential_offer).clone().core;
47-
61+
4862
let (request, metadata) = anoncreds_core::prover::create_credential_request(
4963
entropy.as_ref().map(|s| s.as_str()),
5064
prover_did.as_ref().map(|s| s.as_str()),
5165
&cred_def_core,
5266
&link_secret_core,
5367
link_secret_id.as_str(),
54-
&cred_offer_core
55-
).map_err(|err| {
56-
AnoncredsError::CreateCrentialRequestError(format!("Error: {}", err))
57-
})?;
68+
&cred_offer_core,
69+
)
70+
.map_err(|err| AnoncredsError::CreateCrentialRequestError(format!("Error: {}", err)))?;
5871

5972
return Ok(CreateCrendentialRequestResponse {
6073
request: Arc::new(CredentialRequest { core: request }),
61-
metadata: CredentialRequestMetadata::from(metadata)
62-
})
74+
metadata: CredentialRequestMetadata::from(metadata),
75+
});
6376
}
6477

6578
pub fn process_credential(
@@ -70,15 +83,66 @@ impl Prover {
7083
cred_def: Arc<CredentialDefinition>,
7184
rev_reg_def: Option<Arc<RevocationRegistryDefinition>>,
7285
) -> Result<(), AnoncredsError> {
73-
let mut mutable_credential = (*credential).core.try_clone().map_err(|_| AnoncredsError::ConversionError)?;
74-
process_credential(
86+
let mut mutable_credential = (*credential)
87+
.core
88+
.try_clone()
89+
.map_err(|_| AnoncredsError::ConversionError)?;
90+
prover::process_credential(
7591
&mut mutable_credential,
7692
&cred_request_metadata.into(),
7793
&(*link_secret).secret,
7894
&(*cred_def).core,
79-
rev_reg_def.as_ref().map(|def| &(*def).core)
80-
).map_err(|err| {
81-
AnoncredsError::ProcessCredential(format!("Error: {}", err))
82-
})
95+
rev_reg_def.as_ref().map(|def| &(*def).core),
96+
)
97+
.map_err(|err| AnoncredsError::ProcessCredential(format!("Error: {}", err)))
98+
}
99+
100+
pub fn create_presentation(
101+
&self,
102+
presentation_request: Arc<PresentationRequest>,
103+
credentials: Vec<CredentialRequests>,
104+
self_attested: Option<HashMap<String, String>>,
105+
link_secret: Arc<LinkSecret>,
106+
schemas: HashMap<SchemaId, Schema>,
107+
credential_definitions: HashMap<CredentialDefinitionId, Arc<CredentialDefinition>>,
108+
) -> Result<Arc<Presentation>, AnoncredsError> {
109+
let pres_req = &presentation_request.core;
110+
111+
let mut present_credentials = AnoncredsPresentCredentials::default();
112+
let timestamp = None; // TODO
113+
let rev_state = None; //TODO
114+
115+
credentials.iter().for_each(|c| {
116+
let cred = &c.credential.core;
117+
let mut tmp = present_credentials.add_credential(cred, timestamp, rev_state);
118+
119+
c.requested_attribute.iter().for_each(|attribute| {
120+
tmp.add_requested_attribute(attribute.referent.to_string(), attribute.revealed);
121+
});
122+
123+
c.requested_predicate.iter().for_each(|predicate| {
124+
tmp.add_requested_predicate(predicate.referent.to_string());
125+
});
126+
});
127+
128+
let schemas_anoncreds = schemas.iter().map(|(k, v)| (k, v)).collect();
129+
let cred_defs = credential_definitions
130+
.iter()
131+
.map(|(k, v)| {
132+
let tmp = &v.core;
133+
(k, tmp)
134+
})
135+
.collect();
136+
137+
return prover::create_presentation(
138+
pres_req,
139+
present_credentials,
140+
self_attested,
141+
&link_secret.secret,
142+
&schemas_anoncreds,
143+
&cred_defs,
144+
)
145+
.map_err(|err| AnoncredsError::CreatePresentationError(format!("Error: {}", err)))
146+
.map(|e| Arc::new(Presentation { core: e }));
83147
}
84-
}
148+
}

uniffi/src/types/cred_def.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ use anoncreds_core::data_types::cred_def::{
1010
};
1111
use std::convert::TryFrom;
1212
use std::convert::TryInto;
13-
use serde::{Deserialize, Serialize};
14-
use serde_json::Result as SerdeResult;
15-
use std::sync::Arc;
1613

1714
#[derive(Clone)]
1815
pub struct CredentialDefinitionData {

uniffi/src/types/cred_offer.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
use crate::types::error::AnoncredsError;
22
use crate::types::nonce::Nonce;
33
use anoncreds_core::data_types::schema::SchemaId;
4-
use anoncreds_core::data_types::cred_def::{
5-
CredentialDefinitionId,
6-
SignatureType
7-
};
8-
use anoncreds_core::data_types::cred_offer::{CredentialOffer as AnoncredsCredentialOffer};
4+
use anoncreds_core::data_types::cred_def::CredentialDefinitionId;
5+
use anoncreds_core::data_types::cred_offer::CredentialOffer as AnoncredsCredentialOffer;
96
use std::convert::TryFrom;
10-
use std::convert::TryInto;
11-
use serde::{Deserialize, Serialize};
12-
use serde_json::Result as SerdeResult;
137
use std::sync::Arc;
148

159
pub struct CredentialOffer {
1610
pub core: AnoncredsCredentialOffer,
1711
}
1812

1913
impl CredentialOffer {
20-
pub fn new(jsonString: String) -> Result<Self, AnoncredsError> {
21-
let core_def: AnoncredsCredentialOffer = serde_json::from_str(&jsonString).map_err(|_| AnoncredsError::ConversionError)?;
14+
pub fn new(json_string: String) -> Result<Self, AnoncredsError> {
15+
let core_def: AnoncredsCredentialOffer = serde_json::from_str(&json_string).map_err(|_| AnoncredsError::ConversionError)?;
2216
return Ok(CredentialOffer { core: core_def })
2317
}
2418

uniffi/src/types/cred_req.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
use crate::types::error::AnoncredsError;
22
use crate::types::nonce::Nonce;
33
use anoncreds_core::data_types::cred_request::{CredentialRequest as AnoncredsCredentialRequest, CredentialRequestMetadata as AnoncredsCredentialRequestMetadata};
4-
use std::convert::TryFrom;
5-
use std::convert::TryInto;
6-
use serde::{Deserialize, Serialize};
7-
use serde_json::Result as SerdeResult;
84
use std::sync::Arc;
95

106
pub struct CredentialRequest {
117
pub core: AnoncredsCredentialRequest
128
}
139

1410
impl CredentialRequest {
15-
pub fn new(jsonString: String) -> Result<Self, AnoncredsError> {
11+
pub fn new(json_string: String) -> Result<Self, AnoncredsError> {
1612
let core_def: AnoncredsCredentialRequest =
17-
serde_json::from_str(&jsonString).map_err(|_| AnoncredsError::ConversionError)?;
13+
serde_json::from_str(&json_string).map_err(|_| AnoncredsError::ConversionError)?;
1814
return Ok(CredentialRequest { core: core_def });
1915
}
2016

@@ -42,9 +38,9 @@ pub struct CredentialRequestMetadata {
4238
}
4339

4440
// impl CredentialRequestMetadata {
45-
// pub fn new(jsonString: String) -> Result<Self, AnoncredsError> {
41+
// pub fn new(json_string: String) -> Result<Self, AnoncredsError> {
4642
// let core_def: AnoncredsCredentialRequest =
47-
// serde_json::from_str(&jsonString).map_err(|_| AnoncredsError::ConversionError)?;
43+
// serde_json::from_str(&json_string).map_err(|_| AnoncredsError::ConversionError)?;
4844
// return Ok(CredentialRequestMetadata { core: core_def });
4945
// }
5046

0 commit comments

Comments
 (0)