diff --git a/src/lib/rainbowutils.rs b/src/lib/rainbowutils.rs index fcb9e84..368be82 100644 --- a/src/lib/rainbowutils.rs +++ b/src/lib/rainbowutils.rs @@ -127,6 +127,46 @@ impl BinaryDictionaryFile { } } +impl GenericChunk { + pub fn data_entries( + &mut self, + lookup_table: &HashLookupTable, + ) -> Result, Error> { + let mut entries: Vec = Vec::new(); + let mut position = 0; + while self.data.len() > position { + let entry_length_raw = &self.data[position..position + 4]; + position += 4; + let entry_length = BigEndian::read_u32(entry_length_raw); + let entry_end = position + entry_length as usize; + let pw_length_raw = &self.data[position..position + 4]; + position += 4; + let pw_length = BigEndian::read_u32(pw_length_raw); + let pw_plain_raw = &self.data[position..position + pw_length as usize]; + position += pw_length as usize; + let pw_plain = String::from_utf8(pw_plain_raw.to_vec()) + .expect("failed to parse plain password string"); + let mut hash_values: HashMap> = HashMap::new(); + while position < entry_end { + let entry_id_raw = &self.data[position..position + 4]; + position += 4; + let entry_id = BigEndian::read_u32(entry_id_raw); + if let Some(hash_entry) = lookup_table.get_entry(entry_id) { + let hash = &self.data[position..position + hash_entry.output_length as usize]; + position += hash_entry.output_length as usize; + hash_values.insert(hash_entry.name.clone(), hash.to_vec()); + } + } + entries.push(DataEntry { + plain: pw_plain, + hashes: hash_values, + }) + } + + Ok(entries) + } +} + impl TryFrom for MetaChunk { type Error = Error;