Finish challenge 28 by implementing sha-1
This commit is contained in:
51
src/set4.rs
51
src/set4.rs
@@ -1,4 +1,6 @@
|
||||
use crate::{bytes::Bytes, cbc, ctr, parser, utils};
|
||||
#![allow(arithmetic_overflow)]
|
||||
|
||||
use crate::{bytes::Bytes, cbc, ctr, parser, sha1, utils};
|
||||
|
||||
pub fn challenge25() {
|
||||
let cipher = utils::read_base64("data/25.txt");
|
||||
@@ -138,5 +140,50 @@ pub fn challenge27() {
|
||||
}
|
||||
|
||||
pub fn challenge28() {
|
||||
println!("[xxxx] Challenge 28: TBD");
|
||||
let i1 = Bytes(vec![b'a'; 64]);
|
||||
let e1 = Bytes::from_hex("0098ba824b5c16427bd7a1122a5a442a25ec644d");
|
||||
let o1 = sha1::hash(&i1);
|
||||
assert_eq!(e1, o1);
|
||||
|
||||
let i2 = Bytes(vec![b'a'; 128]);
|
||||
let e2 = Bytes::from_hex("ad5b3fdbcb526778c2839d2f151ea753995e26a0");
|
||||
let o2 = sha1::hash(&i2);
|
||||
assert_eq!(e2, o2);
|
||||
|
||||
let i3 = Bytes(vec![b'a'; 3]);
|
||||
let e3 = Bytes::from_hex("7e240de74fb1ed08fa08d38063f6a6a91462a815");
|
||||
let o3 = sha1::hash(&i3);
|
||||
assert_eq!(e3, o3);
|
||||
|
||||
let i4 = Bytes(vec![]);
|
||||
let e4 = Bytes::from_hex("da39a3ee5e6b4b0d3255bfef95601890afd80709");
|
||||
let o4 = sha1::hash(&i4);
|
||||
assert_eq!(e4, o4);
|
||||
|
||||
fn authenticate(message: &Bytes, key: &Bytes) -> Bytes {
|
||||
// Write a function to authenticate a message under a secret key by using a
|
||||
// secret-prefix MAC, which is simply:
|
||||
// SHA1(key || message)
|
||||
let mut c = vec![];
|
||||
c.append(&mut key.0.to_vec());
|
||||
c.append(&mut message.0.to_vec());
|
||||
// how to concatenate better: https://stackoverflow.com/a/56490417
|
||||
sha1::hash(&Bytes(c))
|
||||
}
|
||||
|
||||
// Verify that you cannot tamper with the message without breaking the MAC
|
||||
// you've produced, and that you can't produce a new MAC without knowing the
|
||||
// secret key.
|
||||
let mut message = Bytes::from_utf8("love, love, love");
|
||||
let key = Bytes::from_utf8("kisses!");
|
||||
let auth = authenticate(&message, &key);
|
||||
message.flip_bit(2, 3);
|
||||
let auth_tempered = authenticate(&message, &key);
|
||||
assert!(auth != auth_tempered);
|
||||
|
||||
println!("[okay] Challenge 28: implemented SHA-1");
|
||||
}
|
||||
|
||||
pub fn challenge29() {
|
||||
println!("[xxxx] Challenge 29: TBD");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user