Skip to content

Commit 58880b3

Browse files
Merge pull request #232 from bobozaur/refactor/hashmap_uniformization
Hashmap uniformization
2 parents bbd6b88 + 9a3a79f commit 58880b3

File tree

10 files changed

+153
-143
lines changed

10 files changed

+153
-143
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: 'Anoncreds'
22

33
env:
4-
RUST_VERSION: '1.64.0'
4+
RUST_VERSION: '1.65.0'
55
CROSS_VERSION: '0.2.4'
66

77
on:

src/data_types/cred_def.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,21 @@ impl CredentialDefinition {
5656
.map_err(|e| e.to_string())?;
5757
Ok(key)
5858
}
59+
60+
pub fn try_clone(&self) -> Result<Self, crate::Error> {
61+
let cred_data = CredentialDefinitionData {
62+
primary: self.value.primary.try_clone()?,
63+
revocation: self.value.revocation.clone(),
64+
};
65+
66+
Ok(Self {
67+
schema_id: self.schema_id.clone(),
68+
signature_type: self.signature_type,
69+
tag: self.tag.clone(),
70+
value: cred_data,
71+
issuer_id: self.issuer_id.clone(),
72+
})
73+
}
5974
}
6075

6176
impl Validatable for CredentialDefinition {

src/ffi/presentation.rs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,11 +177,18 @@ pub extern "C" fn anoncreds_create_presentation(
177177
}
178178

179179
let schemas = AnoncredsObjectList::load(schemas.as_slice())?;
180-
let schemas = schemas.refs_map::<SchemaId, Schema>(&schema_identifiers)?;
180+
let schemas = schemas
181+
.refs_map::<SchemaId, Schema>(&schema_identifiers)?
182+
.into_iter()
183+
.map(|(k, v)| (k.clone(), v.clone()))
184+
.collect();
181185

182186
let cred_defs = AnoncredsObjectList::load(cred_defs.as_slice())?;
183187
let cred_defs = cred_defs
184-
.refs_map::<CredentialDefinitionId, CredentialDefinition>(&cred_def_identifiers)?;
188+
.refs_map::<CredentialDefinitionId, CredentialDefinition>(&cred_def_identifiers)?
189+
.into_iter()
190+
.map(|(k, v)| v.try_clone().map(|v| (k.clone(), v)))
191+
.collect::<Result<_>>()?;
185192

186193
let presentation = create_presentation(
187194
pres_req.load()?.cast_ref()?,
@@ -292,17 +299,27 @@ pub extern "C" fn anoncreds_verify_presentation(
292299
}
293300

294301
let schemas = AnoncredsObjectList::load(schemas.as_slice())?;
295-
let schemas = schemas.refs_map::<SchemaId, Schema>(&schema_identifiers)?;
302+
let schemas = schemas
303+
.refs_map::<SchemaId, Schema>(&schema_identifiers)?
304+
.into_iter()
305+
.map(|(k, v)| (k.clone(), v.clone()))
306+
.collect();
296307

297308
let cred_defs = AnoncredsObjectList::load(cred_defs.as_slice())?;
298309
let cred_defs = cred_defs
299-
.refs_map::<CredentialDefinitionId, CredentialDefinition>(&cred_def_identifiers)?;
310+
.refs_map::<CredentialDefinitionId, CredentialDefinition>(&cred_def_identifiers)?
311+
.into_iter()
312+
.map(|(k, v)| v.try_clone().map(|v| (k.clone(), v)))
313+
.collect::<Result<_>>()?;
300314

301315
let rev_reg_defs = AnoncredsObjectList::load(rev_reg_defs.as_slice())?;
302316
let rev_reg_defs = rev_reg_defs
303317
.refs_map::<RevocationRegistryDefinitionId, RevocationRegistryDefinition>(
304318
&rev_reg_def_identifiers,
305-
)?;
319+
)?
320+
.into_iter()
321+
.map(|(k, v)| (k.clone(), v.clone()))
322+
.collect::<HashMap<_, _>>();
306323

307324
let rev_reg_defs = if rev_reg_defs.is_empty() {
308325
None
@@ -328,18 +345,22 @@ pub extern "C" fn anoncreds_verify_presentation(
328345
let mut map_nonrevoked_interval_override = HashMap::new();
329346
for (id, req_timestamp, override_timestamp) in &override_entries {
330347
map_nonrevoked_interval_override
331-
.entry(id)
348+
.entry(id.clone())
332349
.or_insert_with(HashMap::new)
333350
.insert(*req_timestamp, *override_timestamp);
334351
}
335352

353+
let rev_status_lists = rev_status_list
354+
.as_ref()
355+
.map(|v| v.iter().copied().cloned().collect());
356+
336357
let verify = verify_presentation(
337358
presentation.load()?.cast_ref()?,
338359
pres_req.load()?.cast_ref()?,
339360
&schemas,
340361
&cred_defs,
341362
rev_reg_defs,
342-
rev_status_list,
363+
rev_status_lists,
343364
Some(&map_nonrevoked_interval_override),
344365
)?;
345366
unsafe { *result_p = i8::from(verify) };

src/services/prover.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -374,11 +374,11 @@ pub fn process_credential(
374374
///
375375
/// let mut schemas = HashMap::new();
376376
/// let schema_id = SchemaId::new_unchecked("did:web:xyz/resource/schema");
377-
/// schemas.insert(&schema_id, &schema);
377+
/// schemas.insert(schema_id, schema);
378378
///
379379
/// let mut cred_defs = HashMap::new();
380380
/// let cred_def_id = CredentialDefinitionId::new_unchecked("did:web:xyz/resource/cred-def");
381-
/// cred_defs.insert(&cred_def_id, &cred_def);
381+
/// cred_defs.insert(cred_def_id, cred_def);
382382
///
383383
/// let mut present = PresentCredentials::default();
384384
/// let mut cred1 = present.add_credential(
@@ -403,8 +403,8 @@ pub fn create_presentation(
403403
credentials: PresentCredentials,
404404
self_attested: Option<HashMap<String, String>>,
405405
link_secret: &LinkSecret,
406-
schemas: &HashMap<&SchemaId, &Schema>,
407-
cred_defs: &HashMap<&CredentialDefinitionId, &CredentialDefinition>,
406+
schemas: &HashMap<SchemaId, Schema>,
407+
cred_defs: &HashMap<CredentialDefinitionId, CredentialDefinition>,
408408
) -> Result<Presentation> {
409409
trace!("create_proof >>> credentials: {:?}, pres_req: {:?}, credentials: {:?}, self_attested: {:?}, link_secret: {:?}, schemas: {:?}, cred_defs: {:?}",
410410
credentials, pres_req, credentials, &self_attested, secret!(&link_secret), schemas, cred_defs);
@@ -436,12 +436,12 @@ pub fn create_presentation(
436436
}
437437
let credential = present.cred;
438438

439-
let schema = *schemas
439+
let schema = schemas
440440
.get(&credential.schema_id)
441441
.ok_or_else(|| err_msg!("Schema not provided for ID: {}", credential.schema_id))?;
442442

443443
let cred_def_id = CredentialDefinitionId::new(credential.cred_def_id.clone())?;
444-
let cred_def = *cred_defs.get(&cred_def_id).ok_or_else(|| {
444+
let cred_def = cred_defs.get(&cred_def_id).ok_or_else(|| {
445445
err_msg!(
446446
"Credential Definition not provided for ID: {}",
447447
credential.cred_def_id
@@ -665,7 +665,7 @@ pub fn create_or_update_revocation_state(
665665

666666
let mut issued = HashSet::<u32>::new();
667667
let mut revoked = HashSet::<u32>::new();
668-
let tails_reader = TailsFileReader::new(tails_path);
668+
let tails_reader = TailsFileReader::new(tails_path)?;
669669
let witness = if let (Some(source_rev_state), Some(source_rev_list)) =
670670
(rev_state, old_rev_status_list)
671671
{

src/services/tails.rs

Lines changed: 29 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::cell::RefCell;
22
use std::fmt::Debug;
33
use std::fs::File;
4-
use std::io::{BufRead, BufReader, BufWriter, Read, Seek, SeekFrom, Write};
4+
use std::io::{BufReader, BufWriter, Read, Seek, SeekFrom, Write};
55
use std::path::{Path, PathBuf};
66

77
use rand::random;
@@ -13,29 +13,42 @@ use crate::cl::{
1313
};
1414
use crate::error::Error;
1515
use crate::utils::base58;
16+
use crate::ErrorKind;
1617

1718
const TAILS_BLOB_TAG_SZ: u8 = 2;
1819
const TAIL_SIZE: usize = Tail::BYTES_REPR_SIZE;
1920

2021
#[derive(Debug)]
21-
pub struct TailsReader {
22-
inner: Box<RefCell<dyn TailsReaderImpl>>,
22+
pub struct TailsFileReader {
23+
file: RefCell<BufReader<File>>,
2324
}
2425

25-
impl TailsReader {
26-
pub(crate) fn new<TR: TailsReaderImpl + 'static>(inner: TR) -> Self {
27-
Self {
28-
inner: Box::new(RefCell::new(inner)),
29-
}
26+
impl TailsFileReader {
27+
pub fn new<P>(path: P) -> Result<Self, Error>
28+
where
29+
P: AsRef<Path>,
30+
{
31+
let file = RefCell::new(BufReader::new(File::open(path)?));
32+
let reader = Self { file };
33+
Ok(reader)
3034
}
31-
}
3235

33-
pub trait TailsReaderImpl: Debug + Send {
34-
fn hash(&mut self) -> Result<Vec<u8>, Error>;
35-
fn read(&mut self, size: usize, offset: usize) -> Result<Vec<u8>, Error>;
36+
fn read(&self, size: usize, offset: usize) -> Result<Vec<u8>, Error> {
37+
let mut buf = vec![0u8; size];
38+
39+
let mut file = self
40+
.file
41+
.try_borrow_mut()
42+
.map_err(|err| Error::from(ErrorKind::IOError).with_cause(err))?;
43+
44+
file.seek(SeekFrom::Start(offset as u64))?;
45+
file.read_exact(buf.as_mut_slice())?;
46+
47+
Ok(buf)
48+
}
3649
}
3750

38-
impl RevocationTailsAccessor for TailsReader {
51+
impl RevocationTailsAccessor for TailsFileReader {
3952
fn access_tail(
4053
&self,
4154
tail_id: u32,
@@ -44,8 +57,6 @@ impl RevocationTailsAccessor for TailsReader {
4457
trace!("access_tail >>> tail_id: {:?}", tail_id);
4558

4659
let tail_bytes = self
47-
.inner
48-
.borrow_mut()
4960
.read(
5061
TAIL_SIZE,
5162
TAIL_SIZE * tail_id as usize + TAILS_BLOB_TAG_SZ as usize,
@@ -63,70 +74,6 @@ impl RevocationTailsAccessor for TailsReader {
6374
}
6475
}
6576

66-
#[derive(Debug)]
67-
pub struct TailsFileReader {
68-
path: String,
69-
file: Option<BufReader<File>>,
70-
hash: Option<Vec<u8>>,
71-
}
72-
73-
impl TailsFileReader {
74-
pub fn new(path: &str) -> TailsReader {
75-
TailsReader::new(Self {
76-
path: path.to_owned(),
77-
file: None,
78-
hash: None,
79-
})
80-
}
81-
82-
pub fn open(&mut self) -> Result<&mut BufReader<File>, Error> {
83-
if self.file.is_none() {
84-
let file = File::open(self.path.clone())?;
85-
self.file.replace(BufReader::new(file));
86-
}
87-
Ok(self.file.as_mut().unwrap())
88-
}
89-
90-
pub fn close(&mut self) {
91-
self.file.take();
92-
}
93-
}
94-
95-
impl TailsReaderImpl for TailsFileReader {
96-
fn hash(&mut self) -> Result<Vec<u8>, Error> {
97-
if let Some(hash) = self.hash.as_ref() {
98-
return Ok(hash.clone());
99-
}
100-
101-
let file = self.open()?;
102-
file.seek(SeekFrom::Start(0))?;
103-
let mut hasher = Sha256::default();
104-
105-
loop {
106-
let buf = file.fill_buf()?;
107-
let len = buf.len();
108-
if len == 0 {
109-
break;
110-
}
111-
hasher.update(&buf);
112-
file.consume(len);
113-
}
114-
let hash = hasher.finalize().to_vec();
115-
self.hash.replace(hash.clone());
116-
Ok(hash)
117-
}
118-
119-
fn read(&mut self, size: usize, offset: usize) -> Result<Vec<u8>, Error> {
120-
let mut buf = vec![0u8; size];
121-
122-
let file = self.open()?;
123-
file.seek(SeekFrom::Start(offset as u64))?;
124-
file.read_exact(buf.as_mut_slice())?;
125-
126-
Ok(buf)
127-
}
128-
}
129-
13077
pub trait TailsWriter: std::fmt::Debug {
13178
fn write(
13279
&mut self,
@@ -182,17 +129,17 @@ impl TailsWriter for TailsFileWriter {
182129
let mut buf = BufWriter::new(file);
183130
let mut hasher = Sha256::default();
184131
let version = &[0u8, 2u8];
185-
buf.write(version)?;
132+
buf.write_all(version)?;
186133
hasher.update(version);
187134
while let Some(tail) = generator.try_next()? {
188135
let tail_bytes = tail.to_bytes()?;
189-
buf.write(&tail_bytes)?;
136+
buf.write_all(&tail_bytes)?;
190137
hasher.update(&tail_bytes);
191138
}
192139
let mut file = buf
193140
.into_inner()
194141
.map_err(|e| err_msg!("Error flushing output file: {e}"))?;
195-
let tails_size = file.seek(SeekFrom::Current(0))?;
142+
let tails_size = file.stream_position()?;
196143
let hash = base58::encode(hasher.finalize());
197144
let target_path = self.root_path.join(&hash);
198145
drop(file);

src/services/verifier.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,12 @@ static INTERNAL_TAG_MATCHER: Lazy<Regex> =
4646
pub fn verify_presentation(
4747
presentation: &Presentation,
4848
pres_req: &PresentationRequest,
49-
schemas: &HashMap<&SchemaId, &Schema>,
50-
cred_defs: &HashMap<&CredentialDefinitionId, &CredentialDefinition>,
51-
rev_reg_defs: Option<&HashMap<&RevocationRegistryDefinitionId, &RevocationRegistryDefinition>>,
52-
rev_status_lists: Option<Vec<&RevocationStatusList>>,
49+
schemas: &HashMap<SchemaId, Schema>,
50+
cred_defs: &HashMap<CredentialDefinitionId, CredentialDefinition>,
51+
rev_reg_defs: Option<&HashMap<RevocationRegistryDefinitionId, RevocationRegistryDefinition>>,
52+
rev_status_lists: Option<Vec<RevocationStatusList>>,
5353
nonrevoke_interval_override: Option<
54-
&HashMap<&RevocationRegistryDefinitionId, HashMap<u64, u64>>,
54+
&HashMap<RevocationRegistryDefinitionId, HashMap<u64, u64>>,
5555
>,
5656
) -> Result<bool> {
5757
trace!("verify >>> presentation: {:?}, pres_req: {:?}, schemas: {:?}, cred_defs: {:?}, rev_reg_defs: {:?} rev_status_lists: {:?}",
@@ -109,7 +109,7 @@ pub fn verify_presentation(
109109
)
110110
})?;
111111

112-
let rev_reg_map = if let Some(ref lists) = rev_status_lists {
112+
let rev_reg_map = if let Some(lists) = rev_status_lists.clone() {
113113
let mut map: HashMap<RevocationRegistryDefinitionId, HashMap<u64, RevocationRegistry>> =
114114
HashMap::new();
115115

@@ -122,7 +122,7 @@ pub fn verify_presentation(
122122
.timestamp()
123123
.ok_or_else(|| err_msg!(Unexpected, "RevStatusList missing timestamp"))?;
124124

125-
let rev_reg: Option<RevocationRegistry> = (*list).into();
125+
let rev_reg: Option<RevocationRegistry> = (&list).into();
126126
let rev_reg = rev_reg.ok_or_else(|| {
127127
err_msg!(Unexpected, "Revocation status list missing accumulator")
128128
})?;
@@ -217,7 +217,6 @@ pub fn verify_presentation(
217217

218218
let rev_reg_def = Some(
219219
rev_reg_defs
220-
.as_ref()
221220
.ok_or_else(|| err_msg!("Could not load the Revocation Registry Definition"))?
222221
.get(&rev_reg_def_id)
223222
.ok_or_else(|| {
@@ -496,8 +495,8 @@ fn verify_revealed_attribute_value(
496495
#[allow(clippy::too_many_arguments)]
497496
fn verify_requested_restrictions(
498497
pres_req: &PresentationRequestPayload,
499-
schemas: &HashMap<&SchemaId, &Schema>,
500-
cred_defs: &HashMap<&CredentialDefinitionId, &CredentialDefinition>,
498+
schemas: &HashMap<SchemaId, Schema>,
499+
cred_defs: &HashMap<CredentialDefinitionId, CredentialDefinition>,
501500
requested_proof: &RequestedProof,
502501
received_revealed_attrs: &HashMap<String, Identifier>,
503502
received_unrevealed_attrs: &HashMap<String, Identifier>,
@@ -664,8 +663,8 @@ fn is_self_attested(
664663
fn gather_filter_info(
665664
referent: &str,
666665
identifiers: &HashMap<String, Identifier>,
667-
schemas: &HashMap<&SchemaId, &Schema>,
668-
cred_defs: &HashMap<&CredentialDefinitionId, &CredentialDefinition>,
666+
schemas: &HashMap<SchemaId, Schema>,
667+
cred_defs: &HashMap<CredentialDefinitionId, CredentialDefinition>,
669668
) -> Result<Filter> {
670669
let identifier = identifiers.get(referent).ok_or_else(|| {
671670
err_msg!(

0 commit comments

Comments
 (0)