Skip to content

Commit

Permalink
Minor changes in MD2
Browse files Browse the repository at this point in the history
  • Loading branch information
felipeamp committed Jan 9, 2017
1 parent 3c2e36a commit c10b569
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 49 deletions.
5 changes: 2 additions & 3 deletions md2/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "md2"
version = "0.4.0"
version = "0.1.0"
authors = ["The Rust-Crypto Project Developers"]
license = "MIT/Apache-2.0"
description = "MD2 hash function"
Expand All @@ -9,11 +9,10 @@ repository = "https://github.com/RustCrypto/hashes"
keywords = ["crypto", "md2", "hash", "digest"]

[dependencies]
byte-tools = "0.1"
digest = "0.4"
digest-buffer = "0.2"
generic-array = "0.6"
byte-tools = "0.1"
fake-simd = "0.1"

[dev-dependencies]
crypto-tests = "0.3"
2 changes: 1 addition & 1 deletion md2/LICENSE-MIT
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Copyright (c) 2016 bacher09, Artyom Pavlov
Copyright (c) 2016 felipeamp

Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
Expand Down
18 changes: 5 additions & 13 deletions md2/examples/md2sum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,10 @@ use std::io::{self, Read};

const BUFFER_SIZE: usize = 1024;

/// Print digest result as hex string and name pair
fn print_result(sum: &[u8], name: &str) {
for byte in sum {
print!("{:02x}", byte);
}
println!("\t{}", name);
}

/// Compute digest value for given `Reader` and print it
/// On any error simply return without doing anything
fn process<D: Digest + Default, R: Read>(reader: &mut R, name: &str) {
let mut sh: D = Default::default();
fn process<R: Read>(reader: &mut R, name: &str) {
let mut sh = Md2::new();
let mut buffer = [0u8; BUFFER_SIZE];
loop {
let n = match reader.read(&mut buffer) {
Expand All @@ -30,7 +22,7 @@ fn process<D: Digest + Default, R: Read>(reader: &mut R, name: &str) {
break;
}
}
print_result(&sh.result(), name);
println!("{:x}\t{}", &sh.result(), name);
}

fn main() {
Expand All @@ -40,10 +32,10 @@ fn main() {
if args.len() > 1 {
for path in args.skip(1) {
if let Ok(mut file) = fs::File::open(&path) {
process::<Md2, _>(&mut file, &path);
process(&mut file, &path);
}
}
} else {
process::<Md2, _>(&mut io::stdin(), "-");
process(&mut io::stdin(), "-");
}
}
35 changes: 10 additions & 25 deletions md2/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
//! [1]: https://en.wikipedia.org/wiki/MD2_(cryptography)
#![no_std]
extern crate generic_array;
extern crate byte_tools;
extern crate digest;
extern crate digest_buffer;
extern crate generic_array;

pub use digest::Digest;
use byte_tools::copy_memory;
use digest_buffer::DigestBuffer;
use generic_array::GenericArray;
use generic_array::typenum::{U16, U48};
Expand All @@ -32,37 +33,30 @@ const S: [u8; 256] =
type BlockSize = U16;
type Block = GenericArray<u8, U16>;

#[derive(Copy, Clone)]
#[derive(Copy, Clone, Default)]
struct Md2State {
x: GenericArray<u8, U48>,
checksum: GenericArray<u8, U16>,
}

#[derive(Copy, Clone)]
#[derive(Copy, Clone, Default)]
pub struct Md2 {
buffer: DigestBuffer<BlockSize>,
state: Md2State,
}


impl Md2State {
fn new() -> Md2State {
Md2State {
x: Default::default(),
checksum: Default::default(),
}
}

fn process_block(&mut self, input: &Block) {
// Update state
for j in 0..16usize {
for j in 0..16 {
self.x[16 + j] = input[j];
self.x[32 + j] = self.x[16 + j] ^ self.x[j];
}

let mut t = 0u8;
for j in 0..18u8 {
for k in 0..48usize {
for k in 0..48 {
self.x[k] ^= S[t as usize];
t = self.x[k];
}
Expand All @@ -71,7 +65,7 @@ impl Md2State {

// Update checksum
let mut l = self.checksum[15];
for j in 0..16usize {
for j in 0..16 {
self.checksum[j] ^= S[(input[j] ^ l) as usize];
l = self.checksum[j];
}
Expand All @@ -82,7 +76,7 @@ impl Md2 {
pub fn new() -> Md2 {
Md2 {
buffer: Default::default(),
state: Md2State::new(),
state: Default::default(),
}
}

Expand All @@ -97,18 +91,11 @@ impl Md2 {
}
}
self_state.process_block(self.buffer.full_buffer());

let checksum = self_state.checksum.clone();
let checksum = self_state.checksum;
self_state.process_block(&checksum);
}
}

impl Default for Md2 {
fn default() -> Self {
Self::new()
}
}

impl Digest for Md2 {
type OutputSize = U16;
type BlockSize = BlockSize;
Expand All @@ -124,9 +111,7 @@ impl Digest for Md2 {
self.finalize();

let mut out = GenericArray::default();
for (x, y) in self.state.x[0..16].iter().zip(out.iter_mut()) {
*y = *x;
}
copy_memory(&self.state.x[0..16], &mut out);
out
}
}
117 changes: 117 additions & 0 deletions md2/src/lib.rs.bk
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
//! The [MD2][1] hash function.
//!
//! [1]: https://en.wikipedia.org/wiki/MD2_(cryptography)

#![no_std]
extern crate byte_tools;
extern crate digest;
extern crate digest_buffer;
extern crate generic_array;

pub use digest::Digest;
use byte_tools::copy_memory;
use digest_buffer::DigestBuffer;
use generic_array::GenericArray;
use generic_array::typenum::{U16, U48};

// values for the S-table
const S: [u8; 256] =
[41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, 19, 98, 167, 5, 243, 192,
199, 115, 140, 152, 147, 43, 217, 188, 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103,
66, 111, 24, 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, 245, 142, 187,
47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, 148, 194, 16, 137, 11, 34, 95, 33, 128,
127, 93, 154, 90, 144, 50, 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, 150, 164, 125, 182, 118,
252, 107, 226, 156, 116, 4, 241, 69, 157, 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230,
45, 168, 2, 27, 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, 85, 71,
163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, 234, 38, 44, 83, 13, 110, 133, 40,
132, 9, 211, 223, 205, 244, 65, 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225,
123, 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, 203, 213, 254, 59, 0,
29, 57, 242, 239, 183, 14, 102, 88, 208, 228, 166, 119, 114, 248, 235, 117, 75, 10, 49, 68,
80, 180, 143, 237, 31, 26, 219, 153, 141, 51, 159, 17, 131, 20];

type BlockSize = U16;
type Block = GenericArray<u8, U16>;

#[derive(Copy, Clone, Default)]
struct Md2State {
x: GenericArray<u8, U48>,
checksum: GenericArray<u8, U16>,
}

#[derive(Copy, Clone, Default)]
pub struct Md2 {
buffer: DigestBuffer<BlockSize>,
state: Md2State,
}


impl Md2State {
fn process_block(&mut self, input: &Block) {
// Update state
for j in 0..16 {
self.x[16 + j] = input[j];
self.x[32 + j] = self.x[16 + j] ^ self.x[j];
}

let mut t = 0u8;
for j in 0..18u8 {
for k in 0..48 {
self.x[k] ^= S[t as usize];
t = self.x[k];
}
t = t.wrapping_add(j);
}

// Update checksum
let mut l = self.checksum[15];
for j in 0..16 {
self.checksum[j] ^= S[(input[j] ^ l) as usize];
l = self.checksum[j];
}
}
}

impl Md2 {
pub fn new() -> Md2 {
Md2 {
buffer: Default::default(),
state: Default::default(),
}
}

fn finalize(&mut self) {
let self_state = &mut self.state;
{
// Padding
let rem = self.buffer.remaining();
let mut buffer_end = self.buffer.next(rem);
for idx in 0..rem {
buffer_end[idx] = rem as u8;
}
}
self_state.process_block(self.buffer.full_buffer());
let checksum = self_state.checksum;
self_state.process_block(&checksum);
}
}

impl Digest for Md2 {
type OutputSize = U16;
type BlockSize = BlockSize;

fn input(&mut self, input: &[u8]) {
let self_state = &mut self.state;
self.buffer.input(input, |d: &Block| {
self_state.process_block(d);
});
}

fn result(mut self) -> GenericArray<u8, Self::OutputSize> {
self.finalize();

let mut out = GenericArray::default();
copy_memory(&self.state.x[0..16], & mut out);
out
}
}
8 changes: 1 addition & 7 deletions md2/tests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,11 @@
extern crate crypto_tests;
extern crate md2;

use crypto_tests::hash::{Test, main_test};//, one_million_a};
use crypto_tests::hash::{Test, main_test};

#[test]
fn md2_main() {
// Examples from wikipedia
let tests = new_tests!("test1", "test2", "test3");
main_test::<md2::Md2>(&tests);
}

// #[test]
// fn md2_1million_a() {
// let output = include_bytes!("data/one_million_a.output.bin");
// one_million_a::<md2::Md2>(output);
// }

0 comments on commit c10b569

Please sign in to comment.