Skip to content

Commit 5fa7add

Browse files
Merge pull request #239 from andrewwhitehead/upd/rev-reg-id
Simplify create_credential parameters and remove RevocationRegistryId
2 parents f2e165c + 326aafb commit 5fa7add

31 files changed

+209
-296
lines changed

include/libanoncreds.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ typedef struct FfiList_FfiStr FfiStrList;
176176
typedef struct FfiCredRevInfo {
177177
ObjectHandle reg_def;
178178
ObjectHandle reg_def_private;
179+
ObjectHandle status_list;
179180
int64_t reg_idx;
180181
} FfiCredRevInfo;
181182

@@ -263,8 +264,6 @@ ErrorCode anoncreds_create_credential(ObjectHandle cred_def,
263264
FfiStrList attr_names,
264265
FfiStrList attr_raw_values,
265266
FfiStrList attr_enc_values,
266-
FfiStr rev_reg_id,
267-
ObjectHandle rev_status_list,
268267
const struct FfiCredRevInfo *revocation,
269268
ObjectHandle *cred_p);
270269

src/data_types/credential.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ use crate::cl::{CredentialSignature, RevocationRegistry, SignatureCorrectnessPro
77
use crate::error::{ConversionError, ValidationError};
88
use crate::utils::validation::Validatable;
99

10-
use super::{cred_def::CredentialDefinitionId, rev_reg::RevocationRegistryId, schema::SchemaId};
10+
use super::rev_reg_def::RevocationRegistryDefinitionId;
11+
use super::{cred_def::CredentialDefinitionId, schema::SchemaId};
1112

1213
#[derive(Debug, Deserialize, Serialize)]
1314
pub struct Credential {
1415
pub schema_id: SchemaId,
1516
pub cred_def_id: CredentialDefinitionId,
16-
pub rev_reg_id: Option<RevocationRegistryId>,
17+
pub rev_reg_id: Option<RevocationRegistryDefinitionId>,
1718
pub values: CredentialValues,
1819
pub signature: CredentialSignature,
1920
pub signature_correctness_proof: SignatureCorrectnessProof,
@@ -75,7 +76,7 @@ pub struct CredentialInfo {
7576
pub attrs: ShortCredentialValues,
7677
pub schema_id: SchemaId,
7778
pub cred_def_id: CredentialDefinitionId,
78-
pub rev_reg_id: Option<RevocationRegistryId>,
79+
pub rev_reg_id: Option<RevocationRegistryDefinitionId>,
7980
pub cred_rev_id: Option<String>,
8081
}
8182

src/data_types/macros.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ macro_rules! impl_anoncreds_object_identifier {
4444
"IssuerId" => &LEGACY_DID_IDENTIFIER,
4545
"CredentialDefinitionId" => &LEGACY_CRED_DEF_IDENTIFIER,
4646
"SchemaId" => &LEGACY_SCHEMA_IDENTIFIER,
47-
// TODO: we do not have correct validation for a revocation registry and definition id
48-
"RevocationRegistryId" => &LEGACY_DID_IDENTIFIER,
47+
// TODO: we do not have correct validation for a revocation registry definition id
4948
"RevocationRegistryDefinitionId" => &LEGACY_DID_IDENTIFIER,
5049
invalid_name => {
5150
return Err($crate::invalid!(

src/data_types/pres_request.rs

-3
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,6 @@ impl Serialize for PresentationRequest {
118118
}
119119
}
120120

121-
#[allow(unused)]
122-
pub type PresentationRequestExtraQuery = HashMap<String, Query>;
123-
124121
#[derive(Clone, Default, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)]
125122
pub struct NonRevokedInterval {
126123
pub from: Option<u64>,

src/data_types/presentation.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use crate::cl::Proof;
44
use crate::error::ValidationError;
55
use crate::utils::validation::Validatable;
66

7-
use super::{cred_def::CredentialDefinitionId, rev_reg::RevocationRegistryId, schema::SchemaId};
7+
use super::{
8+
cred_def::CredentialDefinitionId, rev_reg_def::RevocationRegistryDefinitionId, schema::SchemaId,
9+
};
810

911
#[derive(Debug, Deserialize, Serialize)]
1012
pub struct Presentation {
@@ -55,7 +57,7 @@ pub struct AttributeValue {
5557
pub struct Identifier {
5658
pub schema_id: SchemaId,
5759
pub cred_def_id: CredentialDefinitionId,
58-
pub rev_reg_id: Option<RevocationRegistryId>,
60+
pub rev_reg_id: Option<RevocationRegistryDefinitionId>,
5961
pub timestamp: Option<u64>,
6062
}
6163

src/data_types/rev_reg.rs

-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
use crate::cl::RevocationRegistry as CryptoRevocationRegistry;
2-
use crate::impl_anoncreds_object_identifier;
3-
4-
impl_anoncreds_object_identifier!(RevocationRegistryId);
52

63
#[derive(Clone, Debug, Serialize, Deserialize)]
74
pub struct RevocationRegistry {

src/ffi/credential.rs

+29-27
Original file line numberDiff line numberDiff line change
@@ -7,35 +7,56 @@ use super::error::{catch_error, ErrorCode};
77
use super::object::{AnoncredsObject, ObjectHandle};
88
use super::util::FfiStrList;
99
use crate::data_types::link_secret::LinkSecret;
10-
use crate::data_types::rev_reg::RevocationRegistryId;
1110
use crate::error::Result;
1211
use crate::services::{
1312
issuer::create_credential,
1413
prover::process_credential,
1514
types::{Credential, CredentialRevocationConfig, MakeCredentialValues},
1615
utils::encode_credential_attribute,
1716
};
17+
use crate::Error;
1818

1919
#[derive(Debug)]
2020
#[repr(C)]
2121
pub struct FfiCredRevInfo {
2222
reg_def: ObjectHandle,
2323
reg_def_private: ObjectHandle,
24+
status_list: ObjectHandle,
2425
reg_idx: i64,
2526
}
2627

2728
struct RevocationConfig {
2829
reg_def: AnoncredsObject,
2930
reg_def_private: AnoncredsObject,
31+
status_list: AnoncredsObject,
3032
reg_idx: u32,
3133
}
3234

33-
impl RevocationConfig {
34-
pub fn as_ref_config(&self) -> Result<CredentialRevocationConfig> {
35+
impl TryFrom<&FfiCredRevInfo> for RevocationConfig {
36+
type Error = Error;
37+
38+
fn try_from(value: &FfiCredRevInfo) -> Result<Self> {
39+
Ok(Self {
40+
reg_def: value.reg_def.load()?,
41+
reg_def_private: value.reg_def_private.load()?,
42+
reg_idx: value
43+
.reg_idx
44+
.try_into()
45+
.map_err(|_| err_msg!("Invalid revocation index"))?,
46+
status_list: value.status_list.load()?,
47+
})
48+
}
49+
}
50+
51+
impl<'a> TryFrom<&'a RevocationConfig> for CredentialRevocationConfig<'a> {
52+
type Error = Error;
53+
54+
fn try_from(value: &'a RevocationConfig) -> Result<Self> {
3555
Ok(CredentialRevocationConfig {
36-
reg_def: self.reg_def.cast_ref()?,
37-
reg_def_private: self.reg_def_private.cast_ref()?,
38-
registry_idx: self.reg_idx,
56+
reg_def: value.reg_def.cast_ref()?,
57+
reg_def_private: value.reg_def_private.cast_ref()?,
58+
registry_idx: value.reg_idx,
59+
status_list: value.status_list.cast_ref()?,
3960
})
4061
}
4162
}
@@ -49,8 +70,6 @@ pub extern "C" fn anoncreds_create_credential(
4970
attr_names: FfiStrList,
5071
attr_raw_values: FfiStrList,
5172
attr_enc_values: FfiStrList,
52-
rev_reg_id: FfiStr,
53-
rev_status_list: ObjectHandle,
5473
revocation: *const FfiCredRevInfo,
5574
cred_p: *mut ObjectHandle,
5675
) -> ErrorCode {
@@ -64,10 +83,6 @@ pub extern "C" fn anoncreds_create_credential(
6483
"Mismatch between length of attribute names and raw values"
6584
));
6685
}
67-
let rev_reg_id = rev_reg_id
68-
.as_opt_str()
69-
.map(RevocationRegistryId::new)
70-
.transpose()?;
7186
let enc_values = attr_enc_values.as_slice();
7287
let mut cred_values = MakeCredentialValues::default();
7388
for (attr_idx, (name, raw)) in attr_names
@@ -99,14 +114,7 @@ pub extern "C" fn anoncreds_create_credential(
99114
None
100115
} else {
101116
let revocation = unsafe { &*revocation };
102-
Some(RevocationConfig {
103-
reg_def: revocation.reg_def.load()?,
104-
reg_def_private: revocation.reg_def_private.load()?,
105-
reg_idx: revocation
106-
.reg_idx
107-
.try_into()
108-
.map_err(|_| err_msg!("Invalid revocation index"))?,
109-
})
117+
Some(RevocationConfig::try_from(revocation)?)
110118
};
111119

112120
let cred = create_credential(
@@ -115,15 +123,9 @@ pub extern "C" fn anoncreds_create_credential(
115123
cred_offer.load()?.cast_ref()?,
116124
cred_request.load()?.cast_ref()?,
117125
cred_values.into(),
118-
rev_reg_id,
119-
rev_status_list
120-
.opt_load()?
121-
.as_ref()
122-
.map(AnoncredsObject::cast_ref)
123-
.transpose()?,
124126
revocation_config
125127
.as_ref()
126-
.map(RevocationConfig::as_ref_config)
128+
.map(TryInto::try_into)
127129
.transpose()?,
128130
)?;
129131
let cred = ObjectHandle::create(cred)?;

src/ffi/object.rs

-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,6 @@ impl AnoncredsObjectList {
202202
Ok(Self(loaded))
203203
}
204204

205-
#[allow(unused)]
206205
pub fn refs<T>(&self) -> Result<Vec<&T>>
207206
where
208207
T: AnyAnoncredsObject + 'static,

src/services/issuer.rs

+12-17
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use crate::cl::{Issuer, RevocationRegistry as CryptoRevocationRegistry};
22
use crate::data_types::cred_def::CredentialDefinitionId;
33
use crate::data_types::issuer_id::IssuerId;
4-
use crate::data_types::rev_reg::RevocationRegistryId;
54
use crate::data_types::rev_reg_def::RevocationRegistryDefinitionId;
65
use crate::data_types::schema::SchemaId;
76
use crate::data_types::{
@@ -696,8 +695,6 @@ pub fn create_credential_offer(
696695
/// &credential_offer,
697696
/// &credential_request,
698697
/// credential_values.into(),
699-
/// None,
700-
/// None,
701698
/// None
702699
/// ).expect("Unable to create credential");
703700
/// ```
@@ -708,8 +705,6 @@ pub fn create_credential(
708705
cred_offer: &CredentialOffer,
709706
cred_request: &CredentialRequest,
710707
cred_values: CredentialValues,
711-
rev_reg_id: Option<RevocationRegistryId>,
712-
rev_status_list: Option<&RevocationStatusList>,
713708
revocation_config: Option<CredentialRevocationConfig>,
714709
) -> Result<Credential> {
715710
trace!("create_credential >>> cred_def: {:?}, cred_def_private: {:?}, cred_offer.nonce: {:?}, cred_request: {:?},\
@@ -724,25 +719,24 @@ pub fn create_credential(
724719
))?;
725720
let credential_values = build_credential_values(&cred_values.0, None)?;
726721

727-
let (credential_signature, signature_correctness_proof, rev_reg, witness) =
728-
if let (Some(revocation_config), Some(rev_status_list)) =
729-
(revocation_config, rev_status_list)
730-
{
731-
let rev_reg_def = &revocation_config.reg_def.value;
732-
let rev_reg: Option<CryptoRevocationRegistry> = rev_status_list.into();
722+
let (credential_signature, signature_correctness_proof, rev_reg_id, rev_reg, witness) =
723+
if let Some(rev_config) = revocation_config {
724+
let rev_reg_def: &RevocationRegistryDefinitionValue = &rev_config.reg_def.value;
725+
let rev_reg: Option<CryptoRevocationRegistry> = rev_config.status_list.into();
733726
let mut rev_reg = rev_reg.ok_or_else(|| {
734727
err_msg!(
735728
Unexpected,
736729
"RevocationStatusList should have accumulator value"
737730
)
738731
})?;
739732

740-
let status = rev_status_list
741-
.get(revocation_config.registry_idx as usize)
733+
let status = rev_config
734+
.status_list
735+
.get(rev_config.registry_idx as usize)
742736
.ok_or_else(|| {
743737
err_msg!(
744738
"Revocation status list does not have the index {}",
745-
revocation_config.registry_idx
739+
rev_config.registry_idx
746740
)
747741
})?;
748742

@@ -770,15 +764,16 @@ pub fn create_credential(
770764
&credential_values,
771765
&cred_public_key,
772766
&cred_def_private.value,
773-
revocation_config.registry_idx,
767+
rev_config.registry_idx,
774768
rev_reg_def.max_cred_num,
775769
issuance_by_default,
776770
&mut rev_reg,
777-
&revocation_config.reg_def_private.value,
771+
&rev_config.reg_def_private.value,
778772
)?;
779773
(
780774
credential_signature,
781775
signature_correctness_proof,
776+
rev_config.status_list.id(),
782777
Some(rev_reg),
783778
Some(witness),
784779
)
@@ -793,7 +788,7 @@ pub fn create_credential(
793788
&cred_public_key,
794789
&cred_def_private.value,
795790
)?;
796-
(signature, correctness_proof, None, None)
791+
(signature, correctness_proof, None, None, None)
797792
};
798793

799794
let credential = Credential {

src/services/prover.rs

-4
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,6 @@ pub fn create_credential_request(
228228
/// &credential_offer,
229229
/// &credential_request,
230230
/// credential_values.into(),
231-
/// None,
232-
/// None,
233231
/// None
234232
/// ).expect("Unable to create credential");
235233
///
@@ -340,8 +338,6 @@ pub fn process_credential(
340338
/// &credential_offer,
341339
/// &credential_request,
342340
/// credential_values.into(),
343-
/// None,
344-
/// None,
345341
/// None
346342
/// ).expect("Unable to create credential");
347343
///

src/services/types.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -217,16 +217,18 @@ impl Validatable for CredentialRevocationState {
217217
pub struct CredentialRevocationConfig<'a> {
218218
pub reg_def: &'a RevocationRegistryDefinition,
219219
pub reg_def_private: &'a RevocationRegistryDefinitionPrivate,
220+
pub status_list: &'a RevocationStatusList,
220221
pub registry_idx: u32,
221222
}
222223

223224
impl<'a> std::fmt::Debug for CredentialRevocationConfig<'a> {
224225
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
225226
write!(
226227
f,
227-
"CredentialRevocationConfig {{ reg_def: {:?}, private: {:?}, idx: {} }}",
228+
"CredentialRevocationConfig {{ reg_def: {:?}, private: {:?}, status_list: {:?}, idx: {} }}",
228229
self.reg_def,
229230
secret!(self.reg_def_private),
231+
self.status_list,
230232
secret!(self.registry_idx),
231233
)
232234
}

src/services/verifier.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,6 @@ fn is_attr_operator(key: &str) -> bool {
863863
#[cfg(test)]
864864
mod tests {
865865
use super::*;
866-
use crate::data_types::rev_reg::RevocationRegistryId;
867866

868867
pub const SCHEMA_ID: &str = "123";
869868
pub const SCHEMA_NAME: &str = "Schema Name";
@@ -1180,7 +1179,7 @@ mod tests {
11801179
timestamp: Some(1234),
11811180
schema_id: SchemaId::default(),
11821181
cred_def_id: CredentialDefinitionId::default(),
1183-
rev_reg_id: Some(RevocationRegistryId::default()),
1182+
rev_reg_id: Some(RevocationRegistryDefinitionId::default()),
11841183
},
11851184
);
11861185
res.insert(
@@ -1189,7 +1188,7 @@ mod tests {
11891188
timestamp: None,
11901189
schema_id: SchemaId::default(),
11911190
cred_def_id: CredentialDefinitionId::default(),
1192-
rev_reg_id: Some(RevocationRegistryId::default()),
1191+
rev_reg_id: Some(RevocationRegistryDefinitionId::default()),
11931192
},
11941193
);
11951194
res

0 commit comments

Comments
 (0)