Crates.io | bdflib |
lib.rs | bdflib |
version | 0.4.4 |
source | src |
created_at | 2020-03-13 13:41:59.60789 |
updated_at | 2020-03-15 17:04:58.521207 |
description | A library to parse bdf files. |
homepage | https://github.com/parallel-programming-hwr/bdflib-rs |
repository | |
max_upload_size | |
id | 218143 |
size | 73,086 |
This library provides methods to read and write Binary Dictionary Format files that can be used to represent rainbow tables.
use bdf::io::BDFReader;
use std::fs::File;
use std::io::BufReader;
fn main() {
let f = File::open("dictionary.bdf").unwrap();
let mut bdf_reader = BDFReader::new(f);
bdf_reader.read_metadata().unwrap();
let lookup_table = bdf_reader.read_lookup_table().unwrap();
let lookup_table = lookup_table.clone();
while let Ok(next_chunk) = &mut bdf_reader.next_chunk() {
if let Ok(entries) = next_chunk.data_entries(&lookup_table) {
println!("{:?}", entries);
}
}
}
use bdf::chunks::{DataEntry, HashEntry};
use bdf::io::BDFWriter;
use std::fs::File;
use std::io::BufWriter;
use std::convert::Into;
fn main() {
let f = File::create("dictionary.bdf").unwrap();
let entry_count = 1;
let mut bdf_writer = BDFWriter::new(f, entry_count, false);
bdf_writer.add_lookup_entry(HashEntry::new("fakehash".into(), 3)).unwrap();
let mut entry = DataEntry::new("foo".into());
entry.add_hash_value("fakehash".into(), vec![0, 2, 3]);
bdf_writer.add_data_entry(entry).unwrap();
bdf_writer.finish().unwrap();
println!("Finished writing!");
}
<BDF> = <Header><Chunk(META)><Chunk(HTBL)>[<Chunk(DTBL)>]
All u8
format are unsigned BigEndian numbers.
Raw (hex) 42 44 46 01 52 41 49 4e 42 4f 57
Position | Name | Value | Meaning |
---|---|---|---|
0-2 | Format | BDF |
Indicates the bdf Format |
3-4 | Version | u32 | The revision of the format (0x01) |
4-10 | to be fancy | RAINBOW |
The word "Rainbow" because why not |
Position | Name | Value | Meaning |
---|---|---|---|
0-3 | length (l) | u32 | the length of the data chunk |
4-7 | name | ASCII | the name of the chunk |
8-l | data | any | the data of the chunk |
l + 1 - l + 5 | crc | crc | the crc sum value of the chunk |
The format of the data inside the META
chunk.
The data is mandatory for the file to be interpreted and the chunk should be the first chunk in the file.
Position | Name | Value | Meaning |
---|---|---|---|
0-3 | chunk count | u32 | The number of DTBL chunks in the file |
4-7 | entries per chunk | u32 | The maximum number of Data Rows in each chunk |
8-15 | total number of entries | u64 | The total number Data Rows in the file |
16-19 | compression method | ASCII/0x00000000 | The name of the compression method or null bytes if none is used |
The format inside the DTBL
chunk.
A chunk contains multiple data rows.
Position | Name | Value | Meaning |
---|---|---|---|
0-3 | length(lt) | u32 | the total length of the data row |
4-7 | length (l) | u32 | the length of the password string |
8-l | password | UTF-8 | The password string |
1: l+1 - l+5 | type | u32 | the id of the hash function |
l+6 - l+x | hash | any | the value of the hash function. The length has to be looked up by the hash functions ID |
goto 1 |
The format inside the HTBL
chunk.
Just like the DataRow the HashEntry is contained in the chunk multiple times.
Position | Name | Value | Meaning |
---|---|---|---|
0-3 | ID | u32 | the id of the entry that is used in the data tables |
4-7 | output length | u32 | the length of the output of the hash function |
8-11 | length | u32 | the length of the hash functions name |
12-length | name | ASCII | the name of the hash function |