Skip to content

Commit c9c5606

Browse files
committed
Adds a tests against a inoutbuf with two backing buffers
1 parent cd1acaa commit c9c5606

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed

deoxys/src/lib.rs

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,3 +324,114 @@ where
324324
B: DeoxysBcType,
325325
{
326326
}
327+
328+
#[cfg(test)]
329+
mod tests {
330+
//! this module is here to test the inout behavior which is not currently exposed.
331+
//! it will be once we port over to the API made in RustCrypto/traits#1793.
332+
//!
333+
//! This is to drop once https://github.com/RustCrypto/traits/pull/1797 is made available.
334+
//!
335+
//! It duplicates test vectors from `tests/deoxys_i_128.rs` and provides a mock buffer backing
336+
//! for InOut.
337+
338+
use hex_literal::hex;
339+
340+
use super::*;
341+
342+
struct MockBuffer {
343+
in_buf: [u8; 33],
344+
out_buf: [u8; 33],
345+
}
346+
347+
impl From<&[u8]> for MockBuffer {
348+
fn from(buf: &[u8]) -> Self {
349+
let mut in_buf = [0u8; 33];
350+
in_buf.copy_from_slice(buf);
351+
Self {
352+
in_buf,
353+
out_buf: [0u8; 33],
354+
}
355+
}
356+
}
357+
358+
impl MockBuffer {
359+
/// Get an [`InOutBuf`] from a [`MockBuffer`]
360+
pub fn to_in_out_buf(&mut self) -> InOutBuf<'_, '_, u8> {
361+
InOutBuf::new(self.in_buf.as_slice(), self.out_buf.as_mut_slice())
362+
.expect("Invariant violation")
363+
}
364+
}
365+
366+
impl AsRef<[u8]> for MockBuffer {
367+
fn as_ref(&self) -> &[u8] {
368+
&self.out_buf
369+
}
370+
}
371+
372+
#[test]
373+
fn test_deoxys_i_128_5() {
374+
let plaintext = hex!("5a4c652cb880808707230679224b11799b5883431292973215e9bd03cf3bc32fe4");
375+
let mut buffer = MockBuffer::from(&plaintext[..]);
376+
377+
let aad = [];
378+
379+
let key = hex!("101112131415161718191a1b1c1d1e1f");
380+
let key = Array(key);
381+
382+
let nonce = hex!("202122232425262728292a2b2c2d2e2f");
383+
let nonce = Array::try_from(&nonce[..8]).unwrap();
384+
385+
let ciphertext_expected =
386+
hex!("cded5a43d3c76e942277c2a1517530ad66037897c985305ede345903ed7585a626");
387+
388+
let tag_expected: [u8; 16] = hex!("cbf5faa6b8398c47f4278d2019161776");
389+
390+
type M = modes::DeoxysI<deoxys_bc::DeoxysBc256>;
391+
let cipher = DeoxysI128::new(&key);
392+
let tag: Tag = M::encrypt_inout(&nonce, &aad, buffer.to_in_out_buf(), &cipher.subkeys);
393+
394+
let ciphertext = buffer.as_ref();
395+
assert_eq!(ciphertext, ciphertext_expected);
396+
assert_eq!(tag, tag_expected);
397+
398+
let mut buffer = MockBuffer::from(buffer.as_ref());
399+
M::decrypt_inout(&nonce, &aad, buffer.to_in_out_buf(), &tag, &cipher.subkeys)
400+
.expect("decryption failed");
401+
402+
assert_eq!(&plaintext[..], buffer.as_ref());
403+
}
404+
405+
#[test]
406+
fn test_deoxys_ii_128_5() {
407+
let plaintext = hex!("06ac1756eccece62bd743fa80c299f7baa3872b556130f52265919494bdc136db3");
408+
let mut buffer = MockBuffer::from(&plaintext[..]);
409+
410+
let aad = [];
411+
412+
let key = hex!("101112131415161718191a1b1c1d1e1f");
413+
let key = Array(key);
414+
415+
let nonce = hex!("202122232425262728292a2b2c2d2e2f");
416+
let nonce = Array::try_from(&nonce[..15]).unwrap();
417+
418+
let ciphertext_expected =
419+
hex!("82bf241958b324ed053555d23315d3cc20935527fc970ff34a9f521a95e302136d");
420+
421+
let tag_expected: [u8; 16] = hex!("0eadc8612d5208c491e93005195e9769");
422+
423+
type M = modes::DeoxysII<deoxys_bc::DeoxysBc256>;
424+
let cipher = DeoxysII128::new(&key);
425+
let tag: Tag = M::encrypt_inout(&nonce, &aad, buffer.to_in_out_buf(), &cipher.subkeys);
426+
427+
let ciphertext = buffer.as_ref();
428+
assert_eq!(ciphertext, ciphertext_expected);
429+
assert_eq!(tag, tag_expected);
430+
431+
let mut buffer = MockBuffer::from(buffer.as_ref());
432+
M::decrypt_inout(&nonce, &aad, buffer.to_in_out_buf(), &tag, &cipher.subkeys)
433+
.expect("decryption failed");
434+
435+
assert_eq!(&plaintext[..], buffer.as_ref());
436+
}
437+
}

0 commit comments

Comments
 (0)