let mut hmac = HMAC(SHA256, KEY_A);
hmac.update(data);
let mut result = [0u8, ..10];
- copy_memory(&mut result, hmac.finalize().slice(0, 9));
+ copy_memory(&mut result, hmac.finalize().slice(0, 10));
result
}
-pub fn encrypt(plaindata: &[u8], iv: &[u8]) -> Vec<u8> {
- symm::encrypt(symm::AES_256_CBC, KEY_C, iv.to_vec(), plaindata)
+pub fn encrypt(plaindata: &[u8], iv: &[u8]) -> Option<Vec<u8>> {
+ let c = symm::Crypter::new(symm::AES_256_CBC);
+ c.init(symm::Encrypt, KEY_C, iv.to_vec());
+ c.pad(false); // Padding disabled!
+ let mut r = c.update(plaindata);
+ let rest = c.finalize();
+ if rest.is_empty() {
+ Some(r)
+ } else {
+ None
+ }
}
-pub fn decrypt(cypherdata: &[u8], iv: &[u8]) -> Vec<u8> {
- symm::decrypt(symm::AES_256_CBC, KEY_C, iv.to_vec(), cypherdata)
+pub fn decrypt(cypherdata: &[u8], iv: &[u8]) -> Option<Vec<u8>> {
+ let c = symm::Crypter::new(symm::AES_256_CBC);
+ c.init(symm::Decrypt, KEY_C, iv.to_vec());
+ c.pad(false); // Padding disabled!
+ let mut r = c.update(cypherdata);
+ let rest = c.finalize();
+ if rest.is_empty() {
+ Some(r)
+ } else {
+ None
+ }
}
pub fn generate_key(size_byte: uint) -> IoResult<Vec<u8>> {
- let mut bytes = Vec:: from_elem(size_byte, 0u8);
+ let mut bytes = Vec::from_elem(size_byte, 0u8);
let mut generator = try!(OsRng::new()); // Uses '/dev/urandom' on Unix-like systems.
generator.fill_bytes(bytes.as_mut_slice_());
Ok(bytes)