diff --git a/make_test_vectors.sh b/make_test_vectors.sh index ffb4194..4747bcb 100755 --- a/make_test_vectors.sh +++ b/make_test_vectors.sh @@ -4,7 +4,7 @@ TEST_VECTORS=test-vectors cd reference-implementation -for kind in header aes-ctr-hmac sframe; +for kind in header aes-ctr-hmac aes256-ctr-hmac sframe; do cargo run --example test_vectors md ${kind} >../test-vectors/${kind}.md done diff --git a/reference-implementation/examples/test_vectors.rs b/reference-implementation/examples/test_vectors.rs index d2d2f93..4836543 100644 --- a/reference-implementation/examples/test_vectors.rs +++ b/reference-implementation/examples/test_vectors.rs @@ -200,6 +200,150 @@ ct: {ct:4} } } +mod aes256_ctr_hmac { + use super::Hex; + use aead::{Aead, Key, KeyInit, KeySizeUser, Nonce, Payload}; + use aes::Aes256; + use cipher::{ + consts::{U10, U32, U4, U8}, + ArrayLength, + }; + use hex_literal::hex; + use serde::{Deserialize, Serialize}; + use sframe_reference::{aes_ctr_hmac::*, cipher::CipherSuite}; + use sha2::Sha512; + + #[derive(Serialize, Deserialize)] + pub struct TestVector { + cipher_suite: u16, + key: Hex, + enc_key: Hex, + auth_key: Hex, + nonce: Hex, + aad: Hex, + pt: Hex, + ct: Hex, + } + + impl TestVector { + fn new() -> Self + where + C: Cipher + KeySizeUser, + D: Digest, + T: ArrayLength, + AesCtrHmac: KeySizeUser + KeyInit, + { + let cipher_suite = match T::to_usize() { + 10 => CipherSuite::AES_256_CTR_HMAC_SHA_512_80, + 8 => CipherSuite::AES_256_CTR_HMAC_SHA_512_64, + 4 => CipherSuite::AES_256_CTR_HMAC_SHA_512_32, + _ => unreachable!(), + }; + + let key = hex!("000102030405060708090a0b0c0d0e0f" + "101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f" + "303132333435363738393a3b3c3d3e3f" + "404142434445464748494a4b4c4d4e4f" + "505152535455565758595a5b5c5d5e5f"); + let key = Key::>::clone_from_slice(&key); + let nonce: Nonce> = hex!("101112131415161718191a1b").into(); + let aad = b"IETF SFrame WG"; + let pt = b"draft-ietf-sframe-enc"; + + let cipher = AesCtrHmac::::new(&key); + let ct = cipher.encrypt(&nonce, Payload { msg: pt, aad }).unwrap(); + + Self { + cipher_suite: cipher_suite.0, + key: Hex::from(key), + enc_key: Hex::from(cipher.enc_key), + auth_key: Hex::from(cipher.auth_key), + nonce: Hex::from(nonce), + aad: Hex::from(aad), + pt: Hex::from(pt), + ct: Hex::from(ct), + } + } + + pub fn make_all() -> Vec { + vec![ + Self::new::(), + Self::new::(), + Self::new::(), + ] + } + + fn verify_one(&self) -> bool + where + C: Cipher + KeySizeUser, + D: Digest, + T: ArrayLength, + AesCtrHmac: KeySizeUser + KeyInit, + { + let key = Key::>::from_slice(&self.key); + let nonce = Nonce::>::from_slice(&self.nonce); + + let cipher = AesCtrHmac::::new(&key); + + let payload = Payload { + msg: &self.pt, + aad: &self.aad, + }; + let encrypted = cipher.encrypt(&nonce, payload).unwrap(); + let encrypt_pass = self.ct == encrypted; + + let payload = Payload { + msg: &self.ct, + aad: &self.aad, + }; + let decrypted = cipher.decrypt(&nonce, payload).unwrap(); + let decrypt_pass = self.pt == decrypted; + + encrypt_pass && decrypt_pass + } + + pub fn verify(&self) -> bool { + match CipherSuite(self.cipher_suite) { + CipherSuite::AES_256_CTR_HMAC_SHA_512_80 => { + self.verify_one::() + } + CipherSuite::AES_256_CTR_HMAC_SHA_512_64 => self.verify_one::(), + CipherSuite::AES_256_CTR_HMAC_SHA_512_32 => self.verify_one::(), + _ => unreachable!(), + } + } + } + + impl super::ToMarkdown for TestVector { + fn to_markdown(&self) -> String { + let TestVector { + cipher_suite, + key, + enc_key, + auth_key, + nonce, + aad, + pt, + ct, + } = self; + + format!( + "~~~ test-vectors +cipher_suite: 0x{cipher_suite:04x} +key: {key:5} +enc_key: {enc_key:9} +auth_key: {auth_key:10} +nonce: {nonce:7} +aad: {aad:5} +pt: {pt:4} +ct: {ct:4} +~~~" + ) + } + } +} + mod sframe { use super::Hex; use hex_literal::hex; @@ -393,6 +537,7 @@ impl> PartialEq for Hex { enum TestVectorType { Header, AesCtrHmac, + Aes256CtrHmac, Sframe, } @@ -404,6 +549,7 @@ trait ToMarkdown { struct TestVectors { header: Vec, aes_ctr_hmac: Vec, + aes256_ctr_hmac: Vec, sframe: Vec, } @@ -412,6 +558,7 @@ impl TestVectors { Self { header: header::TestVector::make_all(), aes_ctr_hmac: aes_ctr_hmac::TestVector::make_all(), + aes256_ctr_hmac: aes256_ctr_hmac::TestVector::make_all(), sframe: sframe::TestVector::make_all(), } } @@ -420,8 +567,9 @@ impl TestVectors { let header = self.header.iter().map(|tv| tv.verify()); let aes_ctr_hmac = self.aes_ctr_hmac.iter().map(|tv| tv.verify()); let sframe = self.sframe.iter().map(|tv| tv.verify()); + let aes256_ctr_hmac = self.aes256_ctr_hmac.iter().map(|tv| tv.verify()); - header.chain(aes_ctr_hmac).chain(sframe).all(|x| x) + header.chain(aes_ctr_hmac).chain(aes256_ctr_hmac).chain(sframe).all(|x| x) } fn print_md_all(vecs: &[T]) { @@ -434,6 +582,7 @@ impl TestVectors { match vec_type { TestVectorType::Header => Self::print_md_all(&self.header), TestVectorType::AesCtrHmac => Self::print_md_all(&self.aes_ctr_hmac), + TestVectorType::Aes256CtrHmac => Self::print_md_all(&self.aes256_ctr_hmac), TestVectorType::Sframe => Self::print_md_all(&self.sframe), } } diff --git a/reference-implementation/src/aes_ctr_hmac.rs b/reference-implementation/src/aes_ctr_hmac.rs index 413e1ed..dd38303 100644 --- a/reference-implementation/src/aes_ctr_hmac.rs +++ b/reference-implementation/src/aes_ctr_hmac.rs @@ -168,7 +168,7 @@ where #[cfg(test)] #[generic_tests::define] -mod test { +mod test_aes128 { use super::*; use aead::Aead; use aes::Aes128; @@ -233,3 +233,74 @@ mod test { #[instantiate_tests()] mod aes_128_ctr_sha_256_32 {} } + +#[cfg(test)] +#[generic_tests::define] +mod test_aes256 { + use super::*; + use aead::Aead; + use aes::Aes256; + use cipher::consts::{U10, U4, U8}; + use hex_literal::hex; + use sha2::Sha512; + + #[test] + fn round_trip() + where + C: Cipher + KeySizeUser, + D: Digest, + T: ArrayLength, + AesCtrHmac: KeySizeUser + KeyInit, + { + let key = hex!("000102030405060708090a0b0c0d0e0f" + "101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f" + "303132333435363738393a3b3c3d3e3f" + "404142434445464748494a4b4c4d4e4f" + "505152535455565758595a5b5c5d5e5f"); + let key = Key::>::clone_from_slice(&key); + let nonce: Nonce> = hex!("101112131415161718191a1b").into(); + let msg = b"Never gonna give you up"; + let aad = b"Never gonna let you down"; + + let cipher = AesCtrHmac::::new(&key); + + // Verify that an encrypt/decrypt round-trip works + let encrypt_payload = Payload { msg, aad }; + let encrypted = cipher.encrypt(&nonce, encrypt_payload).unwrap(); + assert_eq!(encrypted.len(), msg.len() + T::to_usize()); + + let decrypt_payload = Payload { + msg: &encrypted, + aad, + }; + let decrypted = cipher.decrypt(&nonce, decrypt_payload).unwrap(); + assert_eq!(&decrypted, msg); + + // Verify that trying to decrypt with different AAD fails + let different_aad = b"Never gonna run around and hurt you"; + let different_aad_payload = Payload { + msg: &encrypted, + aad: different_aad, + }; + assert!(cipher.decrypt(&nonce, different_aad_payload).is_err()); + + // Verify that trying to decrypt with corrupted ciphertext fails + let mut different_msg = encrypted.clone(); + different_msg[0] ^= 0xff; + let different_msg_payload = Payload { + msg: &different_msg, + aad, + }; + assert!(cipher.decrypt(&nonce, different_msg_payload).is_err()); + } + + #[instantiate_tests()] + mod aes_256_ctr_sha_512_80 {} + + #[instantiate_tests()] + mod aes_256_ctr_sha_256_64 {} + + #[instantiate_tests()] + mod aes_256_ctr_sha_512_32 {} +} diff --git a/reference-implementation/src/cipher.rs b/reference-implementation/src/cipher.rs index 3e4bf09..dae2553 100644 --- a/reference-implementation/src/cipher.rs +++ b/reference-implementation/src/cipher.rs @@ -3,7 +3,7 @@ use crate::header::{Header, KeyId}; use crate::{Error, Result}; use aead::{AeadCore, Key, KeyInit, KeySizeUser, Nonce, Payload}; -use aes::Aes128; +use aes::{Aes128, Aes256}; use aes_gcm::{Aes128Gcm, Aes256Gcm}; use cipher::consts::{U10, U4, U8}; use cipher::Unsigned; @@ -32,15 +32,27 @@ impl CipherSuite { /// AES-256-GCM, with a full 16-byte tag pub const AES_256_GCM_SHA_512: CipherSuite = CipherSuite(0x0005); + + /// AES-256-CTR with HMAC-SHA-512, with a 10-byte tag + pub const AES_256_CTR_HMAC_SHA_512_80: CipherSuite = CipherSuite(0x0006); + + /// AES-256-CTR with HMAC-SHA-512, with an 8-byte tag + pub const AES_256_CTR_HMAC_SHA_512_64: CipherSuite = CipherSuite(0x0007); + + /// AES-256-CTR with HMAC-SHA-512, with an 4-byte tag + pub const AES_256_CTR_HMAC_SHA_512_32: CipherSuite = CipherSuite(0x0008); } /// A list of all available ciphersuites -pub const ALL_CIPHER_SUITES: [CipherSuite; 5] = [ +pub const ALL_CIPHER_SUITES: [CipherSuite; 8] = [ CipherSuite::AES_128_CTR_HMAC_SHA_256_80, CipherSuite::AES_128_CTR_HMAC_SHA_256_64, CipherSuite::AES_128_CTR_HMAC_SHA_256_32, CipherSuite::AES_128_GCM_SHA_256, CipherSuite::AES_256_GCM_SHA_512, + CipherSuite::AES_256_CTR_HMAC_SHA_512_80, + CipherSuite::AES_256_CTR_HMAC_SHA_512_64, + CipherSuite::AES_256_CTR_HMAC_SHA_512_32, ]; /// A convenience trait summarizing all of the salient aspects of an AEAD cipher. @@ -246,6 +258,9 @@ type Aes128CtrHmacSha256_64 = CipherImpl>; type Aes128CtrHmacSha256_32 = CipherImpl>; type Aes128GcmSha256 = CipherImpl; type Aes256GcmSha512 = CipherImpl; +type Aes256CtrHmacSha512_80 = CipherImpl>; +type Aes256CtrHmacSha512_64 = CipherImpl>; +type Aes256CtrHmacSha512_32 = CipherImpl>; /// Construct a new cipher for the specified ciphersuite. The key and salt for the cipher are /// derived from the `base_key` and `kid`. @@ -266,6 +281,15 @@ pub fn new_cipher(cipher_suite: CipherSuite, kid: KeyId, base_key: &[u8]) -> Box CipherSuite::AES_256_GCM_SHA_512 => { Box::new(Aes256GcmSha512::new::(cipher_suite, kid, base_key)) } + CipherSuite::AES_256_CTR_HMAC_SHA_512_80 => Box::new( + Aes256CtrHmacSha512_80::new::(cipher_suite, kid, base_key), + ), + CipherSuite::AES_256_CTR_HMAC_SHA_512_64 => Box::new( + Aes256CtrHmacSha512_64::new::(cipher_suite, kid, base_key), + ), + CipherSuite::AES_256_CTR_HMAC_SHA_512_32 => Box::new( + Aes256CtrHmacSha512_32::new::(cipher_suite, kid, base_key), + ), _ => unreachable!(), } } diff --git a/test-vectors/aes256-ctr-hmac.md b/test-vectors/aes256-ctr-hmac.md new file mode 100644 index 0000000..353b264 --- /dev/null +++ b/test-vectors/aes256-ctr-hmac.md @@ -0,0 +1,66 @@ +~~~ test-vectors +cipher_suite: 0x0006 +key: 000102030405060708090a0b0c0d0e0f + 101112131415161718191a1b1c1d1e1f + 202122232425262728292a2b2c2d2e2f + 303132333435363738393a3b3c3d3e3f + 404142434445464748494a4b4c4d4e4f + 505152535455565758595a5b5c5d5e5f +enc_key: 000102030405060708090a0b0c0d0e0f + 101112131415161718191a1b1c1d1e1f +auth_key: 202122232425262728292a2b2c2d2e2f + 303132333435363738393a3b3c3d3e3f + 404142434445464748494a4b4c4d4e4f + 505152535455565758595a5b5c5d5e5f +nonce: 101112131415161718191a1b +aad: 4945544620534672616d65205747 +pt: 64726166742d696574662d736672616d + 652d656e63 +ct: f861831490fa37f8e284a19940215895 + 64a23bf3050eb0e0ace45930d53a7f +~~~ + +~~~ test-vectors +cipher_suite: 0x0007 +key: 000102030405060708090a0b0c0d0e0f + 101112131415161718191a1b1c1d1e1f + 202122232425262728292a2b2c2d2e2f + 303132333435363738393a3b3c3d3e3f + 404142434445464748494a4b4c4d4e4f + 505152535455565758595a5b5c5d5e5f +enc_key: 000102030405060708090a0b0c0d0e0f + 101112131415161718191a1b1c1d1e1f +auth_key: 202122232425262728292a2b2c2d2e2f + 303132333435363738393a3b3c3d3e3f + 404142434445464748494a4b4c4d4e4f + 505152535455565758595a5b5c5d5e5f +nonce: 101112131415161718191a1b +aad: 4945544620534672616d65205747 +pt: 64726166742d696574662d736672616d + 652d656e63 +ct: f861831490fa37f8e284a19940215895 + 64a23bf30508ee5fb61b88f889 +~~~ + +~~~ test-vectors +cipher_suite: 0x0008 +key: 000102030405060708090a0b0c0d0e0f + 101112131415161718191a1b1c1d1e1f + 202122232425262728292a2b2c2d2e2f + 303132333435363738393a3b3c3d3e3f + 404142434445464748494a4b4c4d4e4f + 505152535455565758595a5b5c5d5e5f +enc_key: 000102030405060708090a0b0c0d0e0f + 101112131415161718191a1b1c1d1e1f +auth_key: 202122232425262728292a2b2c2d2e2f + 303132333435363738393a3b3c3d3e3f + 404142434445464748494a4b4c4d4e4f + 505152535455565758595a5b5c5d5e5f +nonce: 101112131415161718191a1b +aad: 4945544620534672616d65205747 +pt: 64726166742d696574662d736672616d + 652d656e63 +ct: f861831490fa37f8e284a19940215895 + 64a23bf305131a979b +~~~ + diff --git a/test-vectors/sframe.md b/test-vectors/sframe.md index e9112e9..921a883 100644 --- a/test-vectors/sframe.md +++ b/test-vectors/sframe.md @@ -131,3 +131,98 @@ ct: 990123456794f509d36e9beacb0e261d 3c1cc24d56ceabced279 ~~~ +~~~ test-vectors +cipher_suite: 0x0006 +kid: 0x0000000000000123 +ctr: 0x0000000000004567 +base_key: 000102030405060708090a0b0c0d0e0f +sframe_key_label: 534672616d6520312e30205365637265 + 74206b65792000000000000001230006 +sframe_salt_label: 534672616d6520312e30205365637265 + 742073616c7420000000000000012300 + 06 +sframe_secret: 0fc3ea6de6aac97a35f194cf9bed94d4 + b5230f1cb45a785c9fe5dce9c188938a + b6ba005bc4c0a19181599e9d1bcf7b74 + aca48b60bf5e254e546d809313e083a3 +sframe_key: 3c343886ec1c79278836863e00fe934c + 8894460cfa367ebdc4856b0a9268a4f4 + fb99437876819394ef90b10ee12602d0 + 23f7128ee50f2314c2cc3cff4c56616d + 2fe03ad2a254cc2ed29b2a4d3f2534c0 + dda9e7c391ad1917ea07aa221dd4b224 +sframe_salt: e082f7ce012ad30c87c49e3f +metadata: 4945544620534672616d65205747 +nonce: e082f7ce012ad30c87c4db58 +aad: 99012345674945544620534672616d65 + 205747 +pt: 64726166742d696574662d736672616d + 652d656e63 +ct: 9901234567b369e03ec6467ad505ddc8 + 4914115069280c5c797555be6e32cde6 + ac25bc9e +~~~ + +~~~ test-vectors +cipher_suite: 0x0007 +kid: 0x0000000000000123 +ctr: 0x0000000000004567 +base_key: 000102030405060708090a0b0c0d0e0f +sframe_key_label: 534672616d6520312e30205365637265 + 74206b65792000000000000001230007 +sframe_salt_label: 534672616d6520312e30205365637265 + 742073616c7420000000000000012300 + 07 +sframe_secret: 0fc3ea6de6aac97a35f194cf9bed94d4 + b5230f1cb45a785c9fe5dce9c188938a + b6ba005bc4c0a19181599e9d1bcf7b74 + aca48b60bf5e254e546d809313e083a3 +sframe_key: 7271d6c6cbccd2e2343d480ebea65718 + a7bb379eefcf3f8d107c1e2a76e75529 + 3a497fd9e4e8291b965161987ef4ef24 + 983eabb06cb0a392defaab18654780a3 + 9c106ffa4a47d4183a6e593cd0c1bcab + 2b9c6dcf049215845bfb7580c4dea80e +sframe_salt: 46b4367993a314910d4d9f3d +metadata: 4945544620534672616d65205747 +nonce: 46b4367993a314910d4dda5a +aad: 99012345674945544620534672616d65 + 205747 +pt: 64726166742d696574662d736672616d + 652d656e63 +ct: 990123456797cb5644d8831ff8bdc080 + 249990b24b569144cab2a87be22c20d9 + 7976 +~~~ + +~~~ test-vectors +cipher_suite: 0x0008 +kid: 0x0000000000000123 +ctr: 0x0000000000004567 +base_key: 000102030405060708090a0b0c0d0e0f +sframe_key_label: 534672616d6520312e30205365637265 + 74206b65792000000000000001230008 +sframe_salt_label: 534672616d6520312e30205365637265 + 742073616c7420000000000000012300 + 08 +sframe_secret: 0fc3ea6de6aac97a35f194cf9bed94d4 + b5230f1cb45a785c9fe5dce9c188938a + b6ba005bc4c0a19181599e9d1bcf7b74 + aca48b60bf5e254e546d809313e083a3 +sframe_key: afe92c81e0df8c00fab619e0559fe5ae + efce1ef77789d4c728af1b1c1f2e3552 + c405d274415a5291ec075c2d9954c450 + fbd36682a4e978494808b703ce78b409 + f9fec29b91e6e703a75c4131377c80c9 + d51b8906088092452e2593eb142eea2d +sframe_salt: f6de647bac1263524cfb6533 +metadata: 4945544620534672616d65205747 +nonce: f6de647bac1263524cfb2054 +aad: 99012345674945544620534672616d65 + 205747 +pt: 64726166742d696574662d736672616d + 652d656e63 +ct: 9901234567112a94a288b85b49ffef1d + 279f2830165c39d76cac8884011c +~~~ + diff --git a/test-vectors/test-vectors.json b/test-vectors/test-vectors.json index 34c1948..64e1d9d 100644 --- a/test-vectors/test-vectors.json +++ b/test-vectors/test-vectors.json @@ -1478,6 +1478,38 @@ "ct": "6339af04ada1d064688a442b8dc69d5b6bfa40f4be09480509" } ], + "aes256_ctr_hmac": [ + { + "cipher_suite": 6, + "key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "enc_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", + "auth_key": "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "nonce": "101112131415161718191a1b", + "aad": "4945544620534672616d65205747", + "pt": "64726166742d696574662d736672616d652d656e63", + "ct": "f861831490fa37f8e284a1994021589564a23bf3050eb0e0ace45930d53a7f" + }, + { + "cipher_suite": 7, + "key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "enc_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", + "auth_key": "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "nonce": "101112131415161718191a1b", + "aad": "4945544620534672616d65205747", + "pt": "64726166742d696574662d736672616d652d656e63", + "ct": "f861831490fa37f8e284a1994021589564a23bf30508ee5fb61b88f889" + }, + { + "cipher_suite": 8, + "key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "enc_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", + "auth_key": "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "nonce": "101112131415161718191a1b", + "aad": "4945544620534672616d65205747", + "pt": "64726166742d696574662d736672616d652d656e63", + "ct": "f861831490fa37f8e284a1994021589564a23bf305131a979b" + } + ], "sframe": [ { "cipher_suite": 1, @@ -1558,6 +1590,54 @@ "aad": "99012345674945544620534672616d65205747", "pt": "64726166742d696574662d736672616d652d656e63", "ct": "990123456794f509d36e9beacb0e261d99c7d1e972f1fed787d4049f17ca21353c1cc24d56ceabced279" + }, + { + "cipher_suite": 6, + "kid": 291, + "ctr": 17767, + "base_key": "000102030405060708090a0b0c0d0e0f", + "sframe_key_label": "534672616d6520312e3020536563726574206b65792000000000000001230006", + "sframe_salt_label": "534672616d6520312e30205365637265742073616c742000000000000001230006", + "sframe_secret": "0fc3ea6de6aac97a35f194cf9bed94d4b5230f1cb45a785c9fe5dce9c188938ab6ba005bc4c0a19181599e9d1bcf7b74aca48b60bf5e254e546d809313e083a3", + "sframe_key": "3c343886ec1c79278836863e00fe934c8894460cfa367ebdc4856b0a9268a4f4fb99437876819394ef90b10ee12602d023f7128ee50f2314c2cc3cff4c56616d2fe03ad2a254cc2ed29b2a4d3f2534c0dda9e7c391ad1917ea07aa221dd4b224", + "sframe_salt": "e082f7ce012ad30c87c49e3f", + "metadata": "4945544620534672616d65205747", + "nonce": "e082f7ce012ad30c87c4db58", + "aad": "99012345674945544620534672616d65205747", + "pt": "64726166742d696574662d736672616d652d656e63", + "ct": "9901234567b369e03ec6467ad505ddc84914115069280c5c797555be6e32cde6ac25bc9e" + }, + { + "cipher_suite": 7, + "kid": 291, + "ctr": 17767, + "base_key": "000102030405060708090a0b0c0d0e0f", + "sframe_key_label": "534672616d6520312e3020536563726574206b65792000000000000001230007", + "sframe_salt_label": "534672616d6520312e30205365637265742073616c742000000000000001230007", + "sframe_secret": "0fc3ea6de6aac97a35f194cf9bed94d4b5230f1cb45a785c9fe5dce9c188938ab6ba005bc4c0a19181599e9d1bcf7b74aca48b60bf5e254e546d809313e083a3", + "sframe_key": "7271d6c6cbccd2e2343d480ebea65718a7bb379eefcf3f8d107c1e2a76e755293a497fd9e4e8291b965161987ef4ef24983eabb06cb0a392defaab18654780a39c106ffa4a47d4183a6e593cd0c1bcab2b9c6dcf049215845bfb7580c4dea80e", + "sframe_salt": "46b4367993a314910d4d9f3d", + "metadata": "4945544620534672616d65205747", + "nonce": "46b4367993a314910d4dda5a", + "aad": "99012345674945544620534672616d65205747", + "pt": "64726166742d696574662d736672616d652d656e63", + "ct": "990123456797cb5644d8831ff8bdc080249990b24b569144cab2a87be22c20d97976" + }, + { + "cipher_suite": 8, + "kid": 291, + "ctr": 17767, + "base_key": "000102030405060708090a0b0c0d0e0f", + "sframe_key_label": "534672616d6520312e3020536563726574206b65792000000000000001230008", + "sframe_salt_label": "534672616d6520312e30205365637265742073616c742000000000000001230008", + "sframe_secret": "0fc3ea6de6aac97a35f194cf9bed94d4b5230f1cb45a785c9fe5dce9c188938ab6ba005bc4c0a19181599e9d1bcf7b74aca48b60bf5e254e546d809313e083a3", + "sframe_key": "afe92c81e0df8c00fab619e0559fe5aeefce1ef77789d4c728af1b1c1f2e3552c405d274415a5291ec075c2d9954c450fbd36682a4e978494808b703ce78b409f9fec29b91e6e703a75c4131377c80c9d51b8906088092452e2593eb142eea2d", + "sframe_salt": "f6de647bac1263524cfb6533", + "metadata": "4945544620534672616d65205747", + "nonce": "f6de647bac1263524cfb2054", + "aad": "99012345674945544620534672616d65205747", + "pt": "64726166742d696574662d736672616d652d656e63", + "ct": "9901234567112a94a288b85b49ffef1d279f2830165c39d76cac8884011c" } ] }