mp4_atom/moov/trak/
senc.rs

1use crate::{ext, AtomExt, Buf, BufMut, Encode, Error, Ext, FourCC, Result};
2
3// SampleEncryptionBox (`senc`).
4// From ISO/IEC 23007-7:2023 (Common Encryption), Section 7.2.1
5
6// This can't really be parsed here, because it requires Per_sample_IV_Size,
7// so unfortunately you just get a vector to work out yourself.
8
9#[derive(Debug, Clone, PartialEq, Eq, Default)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub enum SencBoxVersion {
12    #[default]
13    V0,
14    V1,
15    V2,
16}
17
18ext! {
19    name: Senc,
20    versions: [0, 1, 2],
21    flags: {senc_use_subsamples = 1,}
22}
23
24#[derive(Debug, Clone, PartialEq, Eq, Default)]
25#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
26pub struct Senc {
27    pub version: SencBoxVersion,
28    pub use_subsamples: bool,
29    pub data: Vec<u8>,
30}
31
32impl AtomExt for Senc {
33    const KIND_EXT: FourCC = FourCC::new(b"senc");
34
35    type Ext = SencExt;
36
37    fn decode_body_ext<B: Buf>(buf: &mut B, ext: SencExt) -> Result<Self> {
38        let bytes_remaining = buf.remaining();
39        let bytes = buf.slice(bytes_remaining).to_vec();
40        buf.advance(bytes_remaining);
41        Ok(Senc {
42            version: match ext.version {
43                SencVersion::V0 => SencBoxVersion::V0,
44                SencVersion::V1 => SencBoxVersion::V1,
45                SencVersion::V2 => SencBoxVersion::V2,
46            },
47            use_subsamples: ext.senc_use_subsamples,
48            data: bytes,
49        })
50    }
51
52    fn encode_body_ext<B: BufMut>(&self, buf: &mut B) -> Result<SencExt> {
53        self.data.encode(buf)?;
54        Ok(SencExt {
55            version: match self.version {
56                SencBoxVersion::V0 => SencVersion::V0,
57                SencBoxVersion::V1 => SencVersion::V1,
58                SencBoxVersion::V2 => SencVersion::V2,
59            },
60            senc_use_subsamples: self.use_subsamples,
61        })
62    }
63}
64
65#[cfg(test)]
66mod tests {
67
68    use super::*;
69    use crate::Decode;
70
71    // From the audio_cbcs.mp4 sample in MPEG's file format conformance set
72    const ENCODED_SENC: &[u8] = &[
73        0x00, 0x00, 0x05, 0x80, 0x73, 0x65, 0x6e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74        0x57, 0x0a, 0x61, 0x06, 0x76, 0xcb, 0x88, 0xf3, 0x02, 0xd1, 0x0a, 0xc8, 0xbc, 0x66, 0xe0,
75        0x39, 0xed, 0xf9, 0xe3, 0x83, 0xca, 0x83, 0xd4, 0xa5, 0xe1, 0xe2, 0x74, 0xc5, 0x38, 0x9e,
76        0xd9, 0xa1, 0x0a, 0xf4, 0x79, 0xbc, 0xb4, 0x97, 0xe5, 0xa6, 0xeb, 0x06, 0xf8, 0x85, 0xa3,
77        0xe8, 0xf5, 0xa6, 0x2c, 0xe7, 0xd8, 0xdd, 0x62, 0x75, 0x6a, 0x71, 0x89, 0xb8, 0x82, 0xe6,
78        0xd6, 0x23, 0x3d, 0x40, 0x95, 0x1a, 0x50, 0x2b, 0x5f, 0xa4, 0xb1, 0x15, 0x6d, 0xa2, 0x48,
79        0xbe, 0x3f, 0x8b, 0xfb, 0x71, 0x8a, 0x85, 0xe6, 0xd6, 0x27, 0x02, 0xca, 0xee, 0xd0, 0x23,
80        0x6f, 0x72, 0x30, 0x62, 0x42, 0xdd, 0x9c, 0xb0, 0x03, 0xb0, 0x0f, 0xf6, 0x9c, 0x99, 0x6b,
81        0x56, 0x53, 0xf4, 0x02, 0xad, 0x89, 0x50, 0x61, 0xd0, 0xac, 0x12, 0x52, 0xa6, 0xc3, 0x88,
82        0xd9, 0xc2, 0x3a, 0x5b, 0x4b, 0x2d, 0xa5, 0x32, 0xa0, 0x31, 0x20, 0x03, 0x00, 0x9c, 0x6b,
83        0xf3, 0xa4, 0x6e, 0xee, 0x81, 0x18, 0xfe, 0x78, 0xce, 0xf0, 0x9e, 0x96, 0xde, 0x07, 0x90,
84        0xa6, 0x6c, 0xac, 0x84, 0x34, 0x26, 0x62, 0x0d, 0xa2, 0xc1, 0xdd, 0xdd, 0xf0, 0x01, 0x72,
85        0x68, 0x6b, 0x29, 0x4f, 0xc3, 0xaa, 0xc0, 0xaa, 0x08, 0xf5, 0x3b, 0x83, 0x04, 0xa5, 0x4d,
86        0x1d, 0x15, 0xa2, 0x64, 0x5e, 0xfa, 0xe0, 0xbc, 0x17, 0x31, 0x31, 0x8e, 0xa0, 0x9f, 0xc2,
87        0xcb, 0x15, 0x66, 0x30, 0xea, 0xa1, 0x31, 0x2d, 0xac, 0xbe, 0x5f, 0x3f, 0xcf, 0xa4, 0x8c,
88        0x7b, 0x21, 0x1a, 0xe4, 0xb4, 0x11, 0xf7, 0xeb, 0x25, 0xdf, 0xf8, 0x85, 0xcd, 0xd1, 0xe6,
89        0x3c, 0xaa, 0x5d, 0xa1, 0x72, 0x39, 0x93, 0x26, 0xb0, 0xfd, 0x63, 0x15, 0xca, 0xea, 0xbd,
90        0xd3, 0x8a, 0x02, 0x99, 0x23, 0x5e, 0x3c, 0xe6, 0x24, 0x52, 0x2a, 0x81, 0xe4, 0xc8, 0x65,
91        0x49, 0x1d, 0x50, 0x23, 0x66, 0x3e, 0x7e, 0x94, 0x9f, 0x53, 0xa5, 0x66, 0xde, 0x6a, 0x2f,
92        0x18, 0x48, 0x45, 0x0d, 0x7d, 0x87, 0xb8, 0xa6, 0x00, 0x5d, 0x66, 0xd5, 0x7f, 0x8e, 0x9c,
93        0x12, 0x87, 0x3a, 0x72, 0x98, 0xb8, 0x9e, 0x05, 0x2e, 0x10, 0x6c, 0xf7, 0x13, 0x0e, 0xf5,
94        0xcc, 0x32, 0x9f, 0x8e, 0x5e, 0xb3, 0xa9, 0xb5, 0x6b, 0xa0, 0xef, 0xd8, 0xb5, 0x22, 0x94,
95        0xb8, 0x48, 0x8c, 0x7f, 0xdb, 0x9d, 0xb1, 0x57, 0x05, 0x7a, 0x6e, 0x4b, 0x46, 0x89, 0x01,
96        0x75, 0xae, 0xc8, 0x9c, 0xaf, 0x29, 0x7e, 0xfb, 0x3c, 0xc7, 0xa0, 0x76, 0xe8, 0x9f, 0xcd,
97        0xe0, 0xce, 0xb6, 0x5b, 0x57, 0xb9, 0xa9, 0x4a, 0xa4, 0x21, 0xd6, 0x3e, 0x99, 0x5a, 0xf1,
98        0x74, 0xa5, 0xf7, 0xa5, 0xb2, 0xb8, 0x79, 0x81, 0x06, 0x79, 0xdb, 0x30, 0x71, 0x06, 0x9d,
99        0xfc, 0xdb, 0x09, 0x40, 0x29, 0x8e, 0x89, 0x3d, 0xe6, 0x88, 0x01, 0x43, 0x8e, 0xf8, 0x4e,
100        0xa0, 0x1b, 0xd8, 0xd8, 0x7e, 0xc4, 0xce, 0x1f, 0x1e, 0x81, 0x4a, 0xb2, 0x7f, 0x43, 0x7b,
101        0xf5, 0x19, 0x23, 0xe9, 0x46, 0xfd, 0x7a, 0x14, 0x25, 0xb9, 0xaa, 0x14, 0x78, 0x16, 0x38,
102        0x55, 0xdb, 0x12, 0xea, 0xc3, 0xc3, 0xb0, 0x21, 0x37, 0x86, 0x9a, 0xe9, 0xd7, 0xd6, 0x53,
103        0x3c, 0x4e, 0xf1, 0xee, 0xb8, 0xbd, 0xda, 0xc5, 0xaf, 0x80, 0x77, 0x8d, 0xf1, 0x7d, 0x7f,
104        0x3f, 0xdc, 0x07, 0xdc, 0xc9, 0x29, 0xc1, 0x9d, 0x38, 0x23, 0x8d, 0x85, 0x3a, 0x53, 0xef,
105        0xd0, 0xd5, 0xb8, 0x2e, 0xe6, 0x28, 0xae, 0x2a, 0x26, 0x8e, 0x9d, 0x64, 0x86, 0xb3, 0x0f,
106        0xe9, 0xb0, 0xc1, 0x99, 0x56, 0x9b, 0x19, 0xe1, 0x9e, 0x26, 0xfa, 0x51, 0x60, 0xda, 0x04,
107        0x2f, 0x4f, 0x7b, 0x68, 0xbf, 0xe5, 0x66, 0x11, 0x3b, 0xbf, 0xfd, 0x2d, 0x61, 0x92, 0x7b,
108        0x19, 0x92, 0x94, 0x06, 0xde, 0xa3, 0xea, 0xc3, 0x25, 0x27, 0x17, 0x9b, 0x3b, 0xcc, 0xfe,
109        0x7e, 0x28, 0x39, 0x0e, 0x0d, 0x2e, 0x64, 0xc0, 0x32, 0xa2, 0x6d, 0x3a, 0x69, 0x46, 0xf8,
110        0x9a, 0x6f, 0x87, 0x9b, 0xbf, 0x7a, 0xd7, 0x02, 0x15, 0xa8, 0x3b, 0x17, 0x22, 0x87, 0xdc,
111        0xf6, 0xb8, 0x9b, 0x5e, 0xd3, 0xdd, 0xf3, 0x61, 0x7a, 0x7b, 0x16, 0x0c, 0x5f, 0x6f, 0xf6,
112        0x01, 0xe6, 0x90, 0xbe, 0x2d, 0x94, 0x55, 0xb0, 0x7d, 0x08, 0xf8, 0x67, 0x1f, 0x22, 0x57,
113        0x75, 0xeb, 0xa3, 0x98, 0x9d, 0x3a, 0x0f, 0xce, 0x3f, 0x64, 0x83, 0x2d, 0x9c, 0x27, 0xbc,
114        0x3e, 0xe4, 0xf4, 0x25, 0xd7, 0xc6, 0xba, 0xaa, 0xe9, 0xf0, 0xb1, 0xeb, 0xcc, 0x8f, 0xaf,
115        0x10, 0x26, 0xa3, 0x2c, 0x6c, 0xfe, 0x2d, 0xd3, 0x4b, 0xfb, 0x0d, 0x4f, 0x01, 0x4a, 0x34,
116        0x94, 0x7a, 0x5e, 0xca, 0xcf, 0x31, 0x8e, 0x4c, 0x18, 0x64, 0xeb, 0x8c, 0x05, 0x21, 0x5f,
117        0xdb, 0xe4, 0x95, 0xe5, 0x93, 0xb6, 0x32, 0xd7, 0x09, 0x61, 0x4f, 0x26, 0x88, 0x93, 0x2d,
118        0x16, 0xa3, 0xbf, 0x1c, 0x12, 0xb2, 0x6f, 0xfc, 0x03, 0x73, 0x46, 0xb8, 0xe1, 0x54, 0x45,
119        0xbc, 0x34, 0x79, 0x14, 0xd9, 0x6d, 0xf4, 0xa0, 0x22, 0x06, 0x30, 0x45, 0x14, 0xe3, 0xe7,
120        0x2a, 0xae, 0xa4, 0xc2, 0xab, 0x4f, 0x82, 0x02, 0x52, 0xe5, 0x28, 0x18, 0x9b, 0x1c, 0x71,
121        0x66, 0x80, 0x0b, 0x01, 0xc8, 0x55, 0x4b, 0x9c, 0xe7, 0xa3, 0xad, 0x87, 0xd2, 0x23, 0x17,
122        0x0f, 0x85, 0x8d, 0x79, 0x0e, 0x59, 0x24, 0xa1, 0xbb, 0x39, 0x88, 0x8f, 0xeb, 0x3c, 0xce,
123        0x47, 0x98, 0x6d, 0xc2, 0xeb, 0xb8, 0xd0, 0x9c, 0x12, 0x63, 0x68, 0x91, 0xa0, 0x03, 0x63,
124        0x64, 0xe9, 0x3a, 0x59, 0x44, 0x2d, 0xe5, 0xdf, 0x7d, 0xd9, 0xad, 0x60, 0x63, 0x7c, 0xd4,
125        0xca, 0x94, 0x94, 0xcd, 0x2d, 0x1e, 0x9c, 0xa6, 0x4b, 0x09, 0xee, 0x87, 0x81, 0xfe, 0xa7,
126        0x27, 0x27, 0xb0, 0xcf, 0xb7, 0x3e, 0x14, 0x62, 0x87, 0xba, 0x35, 0x75, 0xe0, 0xf6, 0x33,
127        0x88, 0x26, 0x15, 0x5f, 0xab, 0x10, 0xb7, 0xd2, 0x98, 0x8c, 0xf0, 0x9e, 0x39, 0xd7, 0x73,
128        0x9e, 0x22, 0x92, 0x56, 0x0a, 0x3b, 0x53, 0xa4, 0x18, 0xe8, 0x5f, 0x25, 0x5c, 0x12, 0xa0,
129        0x54, 0xe3, 0xfb, 0x89, 0xad, 0x27, 0xef, 0xd4, 0x56, 0xf4, 0xfc, 0xb5, 0x27, 0xec, 0x99,
130        0xe3, 0x4b, 0xbe, 0x33, 0xea, 0x9a, 0xdc, 0xa2, 0x3a, 0x1a, 0x85, 0xb8, 0xc0, 0x4e, 0xc0,
131        0x0d, 0x44, 0x92, 0xe3, 0xe6, 0x45, 0x0e, 0xe9, 0xbd, 0x19, 0x91, 0xc9, 0x07, 0xf3, 0x55,
132        0xe6, 0x83, 0xb2, 0x42, 0x2f, 0x2c, 0x53, 0xb0, 0x2c, 0xc1, 0x78, 0x2c, 0x80, 0xda, 0xfe,
133        0x5c, 0x46, 0x2a, 0xc1, 0xaa, 0xa8, 0xd8, 0xd2, 0x5c, 0x3a, 0x6d, 0xdd, 0xe9, 0x0a, 0xf1,
134        0xa4, 0x36, 0xec, 0x74, 0xf8, 0xee, 0x28, 0x73, 0xf2, 0x01, 0xc9, 0xf2, 0xcd, 0x2a, 0x7b,
135        0x57, 0x6a, 0x9f, 0x8d, 0xeb, 0x74, 0xac, 0xd2, 0x49, 0x88, 0xa8, 0xeb, 0x44, 0x1b, 0xc9,
136        0x2f, 0xb4, 0x1b, 0x62, 0x5c, 0x01, 0xa8, 0x46, 0x96, 0xf4, 0x7c, 0x46, 0x1b, 0x2d, 0xc2,
137        0x34, 0x93, 0x3e, 0x72, 0x03, 0xbe, 0xeb, 0x61, 0x84, 0x65, 0x3d, 0x02, 0x12, 0x90, 0x3d,
138        0xbb, 0x1d, 0xa4, 0x7e, 0xbd, 0x2e, 0x39, 0x4d, 0x6d, 0xe2, 0x5b, 0xf7, 0x36, 0x33, 0x85,
139        0xe8, 0x45, 0xee, 0x42, 0x1f, 0x02, 0x44, 0x66, 0x5d, 0x69, 0x60, 0xaf, 0x9f, 0x63, 0xe0,
140        0x47, 0xd9, 0xfe, 0xff, 0x3d, 0xa0, 0x83, 0xab, 0x96, 0x7e, 0xcd, 0xbd, 0x6f, 0x76, 0x7e,
141        0x65, 0x3a, 0x22, 0x0d, 0x1f, 0xc4, 0x10, 0xbc, 0xab, 0x67, 0xd2, 0x27, 0x31, 0xa2, 0x6b,
142        0x89, 0x75, 0xf5, 0xab, 0xaa, 0x32, 0x57, 0x64, 0x9d, 0xc5, 0xd7, 0x0f, 0x76, 0x5c, 0x20,
143        0x9c, 0x51, 0xb4, 0x2e, 0x81, 0x00, 0xd9, 0x41, 0x6f, 0x33, 0xba, 0x0b, 0x14, 0x25, 0xd0,
144        0xc4, 0x00, 0x63, 0x4e, 0x9b, 0xc8, 0x8b, 0x09, 0x93, 0xab, 0x8b, 0x61, 0x50, 0x91, 0x6b,
145        0x59, 0x94, 0xbf, 0xb7, 0x70, 0xc1, 0xd1, 0x5d, 0xff, 0xfc, 0xae, 0xe7, 0x59, 0x22, 0x72,
146        0x3b, 0x2f, 0x4d, 0xc2, 0x47, 0xdf, 0xaa, 0xd0, 0x38, 0xf4, 0x99, 0xe7, 0xed, 0x1c, 0x01,
147        0xb0, 0x51, 0xdd, 0xf1, 0xbc, 0x45, 0xd7, 0x01, 0x74, 0x68, 0xb7, 0x50, 0x66, 0x8b, 0xcf,
148        0xe5, 0x21, 0xa4, 0xb0, 0x06, 0x7c, 0x21, 0x33, 0xc4, 0xa3, 0xce, 0xe0, 0xd8, 0x4a, 0x09,
149        0xd5, 0xb6, 0x0a, 0x60, 0xdc, 0x5c, 0x3e, 0x22, 0x3a, 0x94, 0x63, 0x5c, 0x30, 0x54, 0x78,
150        0x31, 0xd2, 0x9b, 0x06, 0x43, 0x58, 0x85, 0x42, 0xdf, 0xab, 0x97, 0x9f, 0x98, 0x66, 0x70,
151        0xc1, 0x43, 0x76, 0xda, 0xf7, 0x73, 0xe9, 0x5d, 0xfe, 0xb3, 0x09, 0x95, 0x45, 0xca, 0x9f,
152        0xbf, 0x3b, 0xa3, 0x0c, 0x0e, 0xae, 0xb4, 0x32, 0x73, 0xdb, 0x13, 0x34, 0x88, 0x42, 0xaf,
153        0x6e, 0xe8, 0x55, 0xbc, 0xb7, 0x8d, 0x64, 0xbb, 0xa0, 0xb2, 0x28, 0x3f, 0x17, 0xf0, 0x65,
154        0x4f, 0x98, 0x3b, 0x9f, 0x20, 0xcd, 0xfb, 0x06, 0xeb, 0xe5, 0x95, 0x8d, 0x17, 0x57, 0xc1,
155        0x09, 0x4b, 0xbf, 0x90, 0xbb, 0x04, 0xce, 0xd1, 0xd3, 0x31, 0xeb, 0xff, 0x20, 0xf9, 0xcb,
156        0xaf, 0x76, 0x58, 0x6a, 0x5a, 0x84, 0xaf, 0xc6, 0xed, 0x2d, 0x1b, 0x67, 0xbd, 0xe1, 0x91,
157        0xd3, 0xde, 0x07, 0x56, 0x24, 0xa5, 0xca, 0xbf, 0x23, 0x55, 0x66, 0xe1, 0x98, 0x80, 0xec,
158        0xa7, 0x5f, 0x4a, 0x9d, 0x7a, 0x4e, 0x93, 0x14, 0x3e, 0x44, 0xb2, 0xbd, 0x33, 0x35, 0xef,
159        0x35, 0x17, 0x7f, 0xc7, 0x91, 0xb7, 0x42, 0x39, 0x33, 0x51, 0x72, 0xee, 0x0f, 0x2c, 0xf5,
160        0xc9, 0xed, 0xec, 0x16, 0x89, 0xd7, 0xa4, 0x36, 0x1f, 0xe5, 0xb9, 0xf5, 0xe8, 0xba, 0x60,
161        0x85, 0xf4, 0x2c, 0x25, 0xe7, 0x7b, 0x76, 0x20, 0x5a, 0xea, 0x59, 0x86, 0xd1, 0x55, 0x41,
162        0x20, 0x74, 0xfe, 0x7f, 0xda, 0xb2, 0xf3, 0xc2, 0x16, 0xb3, 0xd8, 0xa2, 0xf4, 0x45, 0x18,
163        0x11, 0xfc, 0xc1, 0xc5, 0x32, 0xa5, 0x95, 0x1e, 0x25, 0xcc, 0xdd, 0xf4, 0xc2, 0xe6, 0x04,
164        0xbd, 0x11, 0xee, 0x99, 0x91, 0x59, 0xde, 0x71, 0x7d, 0x9a, 0xac, 0x2c, 0xa3, 0x39, 0xe1,
165        0x81, 0x8f, 0x0a, 0x9c, 0x24, 0x74, 0x2b, 0xb3, 0x94, 0x95, 0x72, 0xb9, 0xef, 0xf3, 0x7b,
166        0xc7, 0xc4, 0x55, 0xd3, 0x2c, 0xf8, 0x6b, 0x31, 0x75, 0xbf, 0x2e, 0x36, 0xe0,
167    ];
168
169    #[test]
170    fn test_senc_v0() {
171        let inbuf: &mut std::io::Cursor<&&[u8]> = &mut std::io::Cursor::new(&ENCODED_SENC);
172        let parse_result = Senc::decode(inbuf);
173        assert!(parse_result.is_ok());
174        let senc = parse_result.unwrap();
175        assert_eq!(
176            senc,
177            Senc {
178                version: SencBoxVersion::V0,
179                use_subsamples: false,
180                data: vec![
181                    0x00, 0x00, 0x00, 0x57, 0x0a, 0x61, 0x06, 0x76, 0xcb, 0x88, 0xf3, 0x02, 0xd1,
182                    0x0a, 0xc8, 0xbc, 0x66, 0xe0, 0x39, 0xed, 0xf9, 0xe3, 0x83, 0xca, 0x83, 0xd4,
183                    0xa5, 0xe1, 0xe2, 0x74, 0xc5, 0x38, 0x9e, 0xd9, 0xa1, 0x0a, 0xf4, 0x79, 0xbc,
184                    0xb4, 0x97, 0xe5, 0xa6, 0xeb, 0x06, 0xf8, 0x85, 0xa3, 0xe8, 0xf5, 0xa6, 0x2c,
185                    0xe7, 0xd8, 0xdd, 0x62, 0x75, 0x6a, 0x71, 0x89, 0xb8, 0x82, 0xe6, 0xd6, 0x23,
186                    0x3d, 0x40, 0x95, 0x1a, 0x50, 0x2b, 0x5f, 0xa4, 0xb1, 0x15, 0x6d, 0xa2, 0x48,
187                    0xbe, 0x3f, 0x8b, 0xfb, 0x71, 0x8a, 0x85, 0xe6, 0xd6, 0x27, 0x02, 0xca, 0xee,
188                    0xd0, 0x23, 0x6f, 0x72, 0x30, 0x62, 0x42, 0xdd, 0x9c, 0xb0, 0x03, 0xb0, 0x0f,
189                    0xf6, 0x9c, 0x99, 0x6b, 0x56, 0x53, 0xf4, 0x02, 0xad, 0x89, 0x50, 0x61, 0xd0,
190                    0xac, 0x12, 0x52, 0xa6, 0xc3, 0x88, 0xd9, 0xc2, 0x3a, 0x5b, 0x4b, 0x2d, 0xa5,
191                    0x32, 0xa0, 0x31, 0x20, 0x03, 0x00, 0x9c, 0x6b, 0xf3, 0xa4, 0x6e, 0xee, 0x81,
192                    0x18, 0xfe, 0x78, 0xce, 0xf0, 0x9e, 0x96, 0xde, 0x07, 0x90, 0xa6, 0x6c, 0xac,
193                    0x84, 0x34, 0x26, 0x62, 0x0d, 0xa2, 0xc1, 0xdd, 0xdd, 0xf0, 0x01, 0x72, 0x68,
194                    0x6b, 0x29, 0x4f, 0xc3, 0xaa, 0xc0, 0xaa, 0x08, 0xf5, 0x3b, 0x83, 0x04, 0xa5,
195                    0x4d, 0x1d, 0x15, 0xa2, 0x64, 0x5e, 0xfa, 0xe0, 0xbc, 0x17, 0x31, 0x31, 0x8e,
196                    0xa0, 0x9f, 0xc2, 0xcb, 0x15, 0x66, 0x30, 0xea, 0xa1, 0x31, 0x2d, 0xac, 0xbe,
197                    0x5f, 0x3f, 0xcf, 0xa4, 0x8c, 0x7b, 0x21, 0x1a, 0xe4, 0xb4, 0x11, 0xf7, 0xeb,
198                    0x25, 0xdf, 0xf8, 0x85, 0xcd, 0xd1, 0xe6, 0x3c, 0xaa, 0x5d, 0xa1, 0x72, 0x39,
199                    0x93, 0x26, 0xb0, 0xfd, 0x63, 0x15, 0xca, 0xea, 0xbd, 0xd3, 0x8a, 0x02, 0x99,
200                    0x23, 0x5e, 0x3c, 0xe6, 0x24, 0x52, 0x2a, 0x81, 0xe4, 0xc8, 0x65, 0x49, 0x1d,
201                    0x50, 0x23, 0x66, 0x3e, 0x7e, 0x94, 0x9f, 0x53, 0xa5, 0x66, 0xde, 0x6a, 0x2f,
202                    0x18, 0x48, 0x45, 0x0d, 0x7d, 0x87, 0xb8, 0xa6, 0x00, 0x5d, 0x66, 0xd5, 0x7f,
203                    0x8e, 0x9c, 0x12, 0x87, 0x3a, 0x72, 0x98, 0xb8, 0x9e, 0x05, 0x2e, 0x10, 0x6c,
204                    0xf7, 0x13, 0x0e, 0xf5, 0xcc, 0x32, 0x9f, 0x8e, 0x5e, 0xb3, 0xa9, 0xb5, 0x6b,
205                    0xa0, 0xef, 0xd8, 0xb5, 0x22, 0x94, 0xb8, 0x48, 0x8c, 0x7f, 0xdb, 0x9d, 0xb1,
206                    0x57, 0x05, 0x7a, 0x6e, 0x4b, 0x46, 0x89, 0x01, 0x75, 0xae, 0xc8, 0x9c, 0xaf,
207                    0x29, 0x7e, 0xfb, 0x3c, 0xc7, 0xa0, 0x76, 0xe8, 0x9f, 0xcd, 0xe0, 0xce, 0xb6,
208                    0x5b, 0x57, 0xb9, 0xa9, 0x4a, 0xa4, 0x21, 0xd6, 0x3e, 0x99, 0x5a, 0xf1, 0x74,
209                    0xa5, 0xf7, 0xa5, 0xb2, 0xb8, 0x79, 0x81, 0x06, 0x79, 0xdb, 0x30, 0x71, 0x06,
210                    0x9d, 0xfc, 0xdb, 0x09, 0x40, 0x29, 0x8e, 0x89, 0x3d, 0xe6, 0x88, 0x01, 0x43,
211                    0x8e, 0xf8, 0x4e, 0xa0, 0x1b, 0xd8, 0xd8, 0x7e, 0xc4, 0xce, 0x1f, 0x1e, 0x81,
212                    0x4a, 0xb2, 0x7f, 0x43, 0x7b, 0xf5, 0x19, 0x23, 0xe9, 0x46, 0xfd, 0x7a, 0x14,
213                    0x25, 0xb9, 0xaa, 0x14, 0x78, 0x16, 0x38, 0x55, 0xdb, 0x12, 0xea, 0xc3, 0xc3,
214                    0xb0, 0x21, 0x37, 0x86, 0x9a, 0xe9, 0xd7, 0xd6, 0x53, 0x3c, 0x4e, 0xf1, 0xee,
215                    0xb8, 0xbd, 0xda, 0xc5, 0xaf, 0x80, 0x77, 0x8d, 0xf1, 0x7d, 0x7f, 0x3f, 0xdc,
216                    0x07, 0xdc, 0xc9, 0x29, 0xc1, 0x9d, 0x38, 0x23, 0x8d, 0x85, 0x3a, 0x53, 0xef,
217                    0xd0, 0xd5, 0xb8, 0x2e, 0xe6, 0x28, 0xae, 0x2a, 0x26, 0x8e, 0x9d, 0x64, 0x86,
218                    0xb3, 0x0f, 0xe9, 0xb0, 0xc1, 0x99, 0x56, 0x9b, 0x19, 0xe1, 0x9e, 0x26, 0xfa,
219                    0x51, 0x60, 0xda, 0x04, 0x2f, 0x4f, 0x7b, 0x68, 0xbf, 0xe5, 0x66, 0x11, 0x3b,
220                    0xbf, 0xfd, 0x2d, 0x61, 0x92, 0x7b, 0x19, 0x92, 0x94, 0x06, 0xde, 0xa3, 0xea,
221                    0xc3, 0x25, 0x27, 0x17, 0x9b, 0x3b, 0xcc, 0xfe, 0x7e, 0x28, 0x39, 0x0e, 0x0d,
222                    0x2e, 0x64, 0xc0, 0x32, 0xa2, 0x6d, 0x3a, 0x69, 0x46, 0xf8, 0x9a, 0x6f, 0x87,
223                    0x9b, 0xbf, 0x7a, 0xd7, 0x02, 0x15, 0xa8, 0x3b, 0x17, 0x22, 0x87, 0xdc, 0xf6,
224                    0xb8, 0x9b, 0x5e, 0xd3, 0xdd, 0xf3, 0x61, 0x7a, 0x7b, 0x16, 0x0c, 0x5f, 0x6f,
225                    0xf6, 0x01, 0xe6, 0x90, 0xbe, 0x2d, 0x94, 0x55, 0xb0, 0x7d, 0x08, 0xf8, 0x67,
226                    0x1f, 0x22, 0x57, 0x75, 0xeb, 0xa3, 0x98, 0x9d, 0x3a, 0x0f, 0xce, 0x3f, 0x64,
227                    0x83, 0x2d, 0x9c, 0x27, 0xbc, 0x3e, 0xe4, 0xf4, 0x25, 0xd7, 0xc6, 0xba, 0xaa,
228                    0xe9, 0xf0, 0xb1, 0xeb, 0xcc, 0x8f, 0xaf, 0x10, 0x26, 0xa3, 0x2c, 0x6c, 0xfe,
229                    0x2d, 0xd3, 0x4b, 0xfb, 0x0d, 0x4f, 0x01, 0x4a, 0x34, 0x94, 0x7a, 0x5e, 0xca,
230                    0xcf, 0x31, 0x8e, 0x4c, 0x18, 0x64, 0xeb, 0x8c, 0x05, 0x21, 0x5f, 0xdb, 0xe4,
231                    0x95, 0xe5, 0x93, 0xb6, 0x32, 0xd7, 0x09, 0x61, 0x4f, 0x26, 0x88, 0x93, 0x2d,
232                    0x16, 0xa3, 0xbf, 0x1c, 0x12, 0xb2, 0x6f, 0xfc, 0x03, 0x73, 0x46, 0xb8, 0xe1,
233                    0x54, 0x45, 0xbc, 0x34, 0x79, 0x14, 0xd9, 0x6d, 0xf4, 0xa0, 0x22, 0x06, 0x30,
234                    0x45, 0x14, 0xe3, 0xe7, 0x2a, 0xae, 0xa4, 0xc2, 0xab, 0x4f, 0x82, 0x02, 0x52,
235                    0xe5, 0x28, 0x18, 0x9b, 0x1c, 0x71, 0x66, 0x80, 0x0b, 0x01, 0xc8, 0x55, 0x4b,
236                    0x9c, 0xe7, 0xa3, 0xad, 0x87, 0xd2, 0x23, 0x17, 0x0f, 0x85, 0x8d, 0x79, 0x0e,
237                    0x59, 0x24, 0xa1, 0xbb, 0x39, 0x88, 0x8f, 0xeb, 0x3c, 0xce, 0x47, 0x98, 0x6d,
238                    0xc2, 0xeb, 0xb8, 0xd0, 0x9c, 0x12, 0x63, 0x68, 0x91, 0xa0, 0x03, 0x63, 0x64,
239                    0xe9, 0x3a, 0x59, 0x44, 0x2d, 0xe5, 0xdf, 0x7d, 0xd9, 0xad, 0x60, 0x63, 0x7c,
240                    0xd4, 0xca, 0x94, 0x94, 0xcd, 0x2d, 0x1e, 0x9c, 0xa6, 0x4b, 0x09, 0xee, 0x87,
241                    0x81, 0xfe, 0xa7, 0x27, 0x27, 0xb0, 0xcf, 0xb7, 0x3e, 0x14, 0x62, 0x87, 0xba,
242                    0x35, 0x75, 0xe0, 0xf6, 0x33, 0x88, 0x26, 0x15, 0x5f, 0xab, 0x10, 0xb7, 0xd2,
243                    0x98, 0x8c, 0xf0, 0x9e, 0x39, 0xd7, 0x73, 0x9e, 0x22, 0x92, 0x56, 0x0a, 0x3b,
244                    0x53, 0xa4, 0x18, 0xe8, 0x5f, 0x25, 0x5c, 0x12, 0xa0, 0x54, 0xe3, 0xfb, 0x89,
245                    0xad, 0x27, 0xef, 0xd4, 0x56, 0xf4, 0xfc, 0xb5, 0x27, 0xec, 0x99, 0xe3, 0x4b,
246                    0xbe, 0x33, 0xea, 0x9a, 0xdc, 0xa2, 0x3a, 0x1a, 0x85, 0xb8, 0xc0, 0x4e, 0xc0,
247                    0x0d, 0x44, 0x92, 0xe3, 0xe6, 0x45, 0x0e, 0xe9, 0xbd, 0x19, 0x91, 0xc9, 0x07,
248                    0xf3, 0x55, 0xe6, 0x83, 0xb2, 0x42, 0x2f, 0x2c, 0x53, 0xb0, 0x2c, 0xc1, 0x78,
249                    0x2c, 0x80, 0xda, 0xfe, 0x5c, 0x46, 0x2a, 0xc1, 0xaa, 0xa8, 0xd8, 0xd2, 0x5c,
250                    0x3a, 0x6d, 0xdd, 0xe9, 0x0a, 0xf1, 0xa4, 0x36, 0xec, 0x74, 0xf8, 0xee, 0x28,
251                    0x73, 0xf2, 0x01, 0xc9, 0xf2, 0xcd, 0x2a, 0x7b, 0x57, 0x6a, 0x9f, 0x8d, 0xeb,
252                    0x74, 0xac, 0xd2, 0x49, 0x88, 0xa8, 0xeb, 0x44, 0x1b, 0xc9, 0x2f, 0xb4, 0x1b,
253                    0x62, 0x5c, 0x01, 0xa8, 0x46, 0x96, 0xf4, 0x7c, 0x46, 0x1b, 0x2d, 0xc2, 0x34,
254                    0x93, 0x3e, 0x72, 0x03, 0xbe, 0xeb, 0x61, 0x84, 0x65, 0x3d, 0x02, 0x12, 0x90,
255                    0x3d, 0xbb, 0x1d, 0xa4, 0x7e, 0xbd, 0x2e, 0x39, 0x4d, 0x6d, 0xe2, 0x5b, 0xf7,
256                    0x36, 0x33, 0x85, 0xe8, 0x45, 0xee, 0x42, 0x1f, 0x02, 0x44, 0x66, 0x5d, 0x69,
257                    0x60, 0xaf, 0x9f, 0x63, 0xe0, 0x47, 0xd9, 0xfe, 0xff, 0x3d, 0xa0, 0x83, 0xab,
258                    0x96, 0x7e, 0xcd, 0xbd, 0x6f, 0x76, 0x7e, 0x65, 0x3a, 0x22, 0x0d, 0x1f, 0xc4,
259                    0x10, 0xbc, 0xab, 0x67, 0xd2, 0x27, 0x31, 0xa2, 0x6b, 0x89, 0x75, 0xf5, 0xab,
260                    0xaa, 0x32, 0x57, 0x64, 0x9d, 0xc5, 0xd7, 0x0f, 0x76, 0x5c, 0x20, 0x9c, 0x51,
261                    0xb4, 0x2e, 0x81, 0x00, 0xd9, 0x41, 0x6f, 0x33, 0xba, 0x0b, 0x14, 0x25, 0xd0,
262                    0xc4, 0x00, 0x63, 0x4e, 0x9b, 0xc8, 0x8b, 0x09, 0x93, 0xab, 0x8b, 0x61, 0x50,
263                    0x91, 0x6b, 0x59, 0x94, 0xbf, 0xb7, 0x70, 0xc1, 0xd1, 0x5d, 0xff, 0xfc, 0xae,
264                    0xe7, 0x59, 0x22, 0x72, 0x3b, 0x2f, 0x4d, 0xc2, 0x47, 0xdf, 0xaa, 0xd0, 0x38,
265                    0xf4, 0x99, 0xe7, 0xed, 0x1c, 0x01, 0xb0, 0x51, 0xdd, 0xf1, 0xbc, 0x45, 0xd7,
266                    0x01, 0x74, 0x68, 0xb7, 0x50, 0x66, 0x8b, 0xcf, 0xe5, 0x21, 0xa4, 0xb0, 0x06,
267                    0x7c, 0x21, 0x33, 0xc4, 0xa3, 0xce, 0xe0, 0xd8, 0x4a, 0x09, 0xd5, 0xb6, 0x0a,
268                    0x60, 0xdc, 0x5c, 0x3e, 0x22, 0x3a, 0x94, 0x63, 0x5c, 0x30, 0x54, 0x78, 0x31,
269                    0xd2, 0x9b, 0x06, 0x43, 0x58, 0x85, 0x42, 0xdf, 0xab, 0x97, 0x9f, 0x98, 0x66,
270                    0x70, 0xc1, 0x43, 0x76, 0xda, 0xf7, 0x73, 0xe9, 0x5d, 0xfe, 0xb3, 0x09, 0x95,
271                    0x45, 0xca, 0x9f, 0xbf, 0x3b, 0xa3, 0x0c, 0x0e, 0xae, 0xb4, 0x32, 0x73, 0xdb,
272                    0x13, 0x34, 0x88, 0x42, 0xaf, 0x6e, 0xe8, 0x55, 0xbc, 0xb7, 0x8d, 0x64, 0xbb,
273                    0xa0, 0xb2, 0x28, 0x3f, 0x17, 0xf0, 0x65, 0x4f, 0x98, 0x3b, 0x9f, 0x20, 0xcd,
274                    0xfb, 0x06, 0xeb, 0xe5, 0x95, 0x8d, 0x17, 0x57, 0xc1, 0x09, 0x4b, 0xbf, 0x90,
275                    0xbb, 0x04, 0xce, 0xd1, 0xd3, 0x31, 0xeb, 0xff, 0x20, 0xf9, 0xcb, 0xaf, 0x76,
276                    0x58, 0x6a, 0x5a, 0x84, 0xaf, 0xc6, 0xed, 0x2d, 0x1b, 0x67, 0xbd, 0xe1, 0x91,
277                    0xd3, 0xde, 0x07, 0x56, 0x24, 0xa5, 0xca, 0xbf, 0x23, 0x55, 0x66, 0xe1, 0x98,
278                    0x80, 0xec, 0xa7, 0x5f, 0x4a, 0x9d, 0x7a, 0x4e, 0x93, 0x14, 0x3e, 0x44, 0xb2,
279                    0xbd, 0x33, 0x35, 0xef, 0x35, 0x17, 0x7f, 0xc7, 0x91, 0xb7, 0x42, 0x39, 0x33,
280                    0x51, 0x72, 0xee, 0x0f, 0x2c, 0xf5, 0xc9, 0xed, 0xec, 0x16, 0x89, 0xd7, 0xa4,
281                    0x36, 0x1f, 0xe5, 0xb9, 0xf5, 0xe8, 0xba, 0x60, 0x85, 0xf4, 0x2c, 0x25, 0xe7,
282                    0x7b, 0x76, 0x20, 0x5a, 0xea, 0x59, 0x86, 0xd1, 0x55, 0x41, 0x20, 0x74, 0xfe,
283                    0x7f, 0xda, 0xb2, 0xf3, 0xc2, 0x16, 0xb3, 0xd8, 0xa2, 0xf4, 0x45, 0x18, 0x11,
284                    0xfc, 0xc1, 0xc5, 0x32, 0xa5, 0x95, 0x1e, 0x25, 0xcc, 0xdd, 0xf4, 0xc2, 0xe6,
285                    0x04, 0xbd, 0x11, 0xee, 0x99, 0x91, 0x59, 0xde, 0x71, 0x7d, 0x9a, 0xac, 0x2c,
286                    0xa3, 0x39, 0xe1, 0x81, 0x8f, 0x0a, 0x9c, 0x24, 0x74, 0x2b, 0xb3, 0x94, 0x95,
287                    0x72, 0xb9, 0xef, 0xf3, 0x7b, 0xc7, 0xc4, 0x55, 0xd3, 0x2c, 0xf8, 0x6b, 0x31,
288                    0x75, 0xbf, 0x2e, 0x36, 0xe0,
289                ]
290            }
291        );
292
293        let mut outbuf = Vec::new();
294        senc.encode(&mut outbuf).unwrap();
295        assert_eq!(outbuf, ENCODED_SENC);
296    }
297
298    #[test]
299    fn test_senc_v1() {
300        // Probably not useful for real encryption. Like CENC.
301        let senc = Senc {
302            version: SencBoxVersion::V1,
303            use_subsamples: false,
304            data: vec![0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
305        };
306        let mut buf = Vec::new();
307        senc.encode(&mut buf).unwrap();
308        assert_eq!(
309            buf,
310            vec![
311                0x00, 0x00, 0x00, 0x12, 0x73, 0x65, 0x6e, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
312                0x00, 0x00, 0x00, 0x00
313            ]
314        );
315
316        let decoded = Senc::decode(&mut buf.as_ref()).unwrap();
317        assert_eq!(decoded, senc);
318    }
319
320    #[test]
321    fn test_senc_v2() {
322        let senc = Senc {
323            version: SencBoxVersion::V2,
324            use_subsamples: false,
325            data: vec![0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08],
326        };
327        let mut buf = Vec::new();
328        senc.encode(&mut buf).unwrap();
329        assert_eq!(
330            buf,
331            vec![
332                0x00, 0x00, 0x00, 0x14, 0x73, 0x65, 0x6e, 0x63, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02,
333                0x03, 0x04, 0x05, 0x06, 0x07, 0x08
334            ]
335        );
336
337        let decoded = Senc::decode(&mut buf.as_ref()).unwrap();
338        assert_eq!(decoded, senc);
339    }
340}