fidl_fuchsia_drm/
fidl_fuchsia_drm.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::client::QueryResponseFut;
8use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
9use fidl::endpoints::{ControlHandle as _, Responder as _};
10use futures::future::{self, MaybeDone, TryFutureExt};
11use zx_status;
12
13pub type EncryptionInitVector = Vec<u8>;
14
15pub type EncryptionKeyId = Vec<u8>;
16
17/// Identifies an encryption scheme.
18pub type EncryptionScheme = String;
19
20pub const ENCRYPTION_SCHEME_CBC1: &str = "cbc1";
21
22pub const ENCRYPTION_SCHEME_CBCS: &str = "cbcs";
23
24pub const ENCRYPTION_SCHEME_CENC: &str = "cenc";
25
26pub const ENCRYPTION_SCHEME_CENS: &str = "cens";
27
28/// The maximum size of an `EncryptionScheme` string.
29pub const MAX_ENCRYPTION_SCHEME_SIZE: u32 = 4;
30
31/// The maximum size of a `EncryptionInitVector` blob.
32pub const MAX_INIT_VECTOR_SIZE: u32 = 16;
33
34/// The maximum size of a `EncryptionKeyId` blob.
35pub const MAX_KEY_ID_SIZE: u32 = 16;
36
37/// The maximum number of `EncryptionSubsampleEntry`s allowed.
38pub const MAX_SUBSAMPLE_ENTRIES: u32 = 16;
39
40/// Pattern encryption utilizes a pattern of encrypted and clear 16 byte blocks
41/// over the protected range of a subsample (the encrypted_bytes of a
42/// `SubsampleEntry`). This structure specifies the number of encrypted data
43/// blocks followed by the number of clear data blocks.
44#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
45#[repr(C)]
46pub struct EncryptionPattern {
47    pub clear_blocks: u32,
48    pub encrypted_blocks: u32,
49}
50
51impl fidl::Persistable for EncryptionPattern {}
52
53/// A byte range within a sample consisting of a clear byte range
54/// followed by an encrypted byte range. This structure specifies the size of
55/// each range in the subsample.
56#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
57#[repr(C)]
58pub struct EncryptionSubsampleEntry {
59    pub clear_bytes: u32,
60    pub encrypted_bytes: u32,
61}
62
63impl fidl::Persistable for EncryptionSubsampleEntry {}
64
65/// The stream format details payload of a decrypting stream processor. This is
66/// a sparsely populated table to specify parameters necessary for decryption
67/// other than the data stream. It is only necessary to update fields if they
68/// changed, but not an error if the same value is repeated.
69#[derive(Clone, Debug, Default, PartialEq)]
70pub struct Encryption {
71    /// Specifies which encryption scheme to use, such as `ENCRYPTION_SCHEME_CENC`.
72    /// Usage:
73    ///  - It is required to be set prior to delivery of input packets.
74    ///  - Changing the scheme mid-stream is only permitted in some scenarios.
75    ///    Once an encrypted scheme is selected for a stream, the scheme may
76    ///    only be set to `ENCRYPTION_SCHEME_UNENCRYPTED` or that
77    ///    same initial encrypted scheme. The scheme may be set to
78    ///    `ENCRYPTION_SCHEME_UNENCRYPTED` at any point.
79    pub scheme: Option<String>,
80    /// Identifies the key that should be used for decrypting subsequent data.
81    /// Usage:
82    ///  - It is required to be set prior to delivery of input packets to a
83    ///    decryptor.
84    ///  - This may be changed multiple times during a data stream.
85    pub default_key_id: Option<Vec<u8>>,
86    /// Used in combination with a key and a block of content
87    /// to create the first cipher block in a chain and derive subsequent cipher
88    /// blocks in a cipher block chain.
89    /// Usage:
90    ///  - It is required to be set prior to the delivery of input packets to a
91    ///    decryptor.
92    ///  - This may be changed multiple times during a data stream.
93    pub default_init_vector: Option<Vec<u8>>,
94    /// Used to identify the clear and encrypted blocks for pattern based encryption.
95    /// Usage:
96    /// - This is not allowed for CENC and CBC1 and required for CENS and CBCS.
97    /// - If required, it must be set prior to the delivery of input packets to
98    ///   a decryptor.
99    /// - This may be changed multiple times during a data stream.
100    pub default_pattern: Option<EncryptionPattern>,
101    #[doc(hidden)]
102    pub __source_breaking: fidl::marker::SourceBreaking,
103}
104
105impl fidl::Persistable for Encryption {}
106
107/// Properties accompanying a packet in an encrypted stream.
108#[derive(Clone, Debug, Default, PartialEq)]
109pub struct PacketEncryptionProperties {
110    /// Indicates whether the packet is encrypted.
111    pub is_encrypted: Option<bool>,
112    /// If specified, overrides the previous key id.
113    pub key_id: Option<Vec<u8>>,
114    /// If specified, overrides the previous initialization vector.
115    pub init_vector: Option<Vec<u8>>,
116    /// If specified, overrides the previous encryption pattern.
117    pub pattern: Option<EncryptionPattern>,
118    /// Subsamples to decrypt. An absent or empty list indicates whole sample
119    /// decryption.
120    pub subsamples: Option<Vec<EncryptionSubsampleEntry>>,
121    #[doc(hidden)]
122    pub __source_breaking: fidl::marker::SourceBreaking,
123}
124
125impl fidl::Persistable for PacketEncryptionProperties {}
126
127mod internal {
128    use super::*;
129
130    impl fidl::encoding::ValueTypeMarker for EncryptionPattern {
131        type Borrowed<'a> = &'a Self;
132        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
133            value
134        }
135    }
136
137    unsafe impl fidl::encoding::TypeMarker for EncryptionPattern {
138        type Owned = Self;
139
140        #[inline(always)]
141        fn inline_align(_context: fidl::encoding::Context) -> usize {
142            4
143        }
144
145        #[inline(always)]
146        fn inline_size(_context: fidl::encoding::Context) -> usize {
147            8
148        }
149        #[inline(always)]
150        fn encode_is_copy() -> bool {
151            true
152        }
153
154        #[inline(always)]
155        fn decode_is_copy() -> bool {
156            true
157        }
158    }
159
160    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<EncryptionPattern, D>
161        for &EncryptionPattern
162    {
163        #[inline]
164        unsafe fn encode(
165            self,
166            encoder: &mut fidl::encoding::Encoder<'_, D>,
167            offset: usize,
168            _depth: fidl::encoding::Depth,
169        ) -> fidl::Result<()> {
170            encoder.debug_check_bounds::<EncryptionPattern>(offset);
171            unsafe {
172                // Copy the object into the buffer.
173                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
174                (buf_ptr as *mut EncryptionPattern)
175                    .write_unaligned((self as *const EncryptionPattern).read());
176                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
177                // done second because the memcpy will write garbage to these bytes.
178            }
179            Ok(())
180        }
181    }
182    unsafe impl<
183            D: fidl::encoding::ResourceDialect,
184            T0: fidl::encoding::Encode<u32, D>,
185            T1: fidl::encoding::Encode<u32, D>,
186        > fidl::encoding::Encode<EncryptionPattern, D> for (T0, T1)
187    {
188        #[inline]
189        unsafe fn encode(
190            self,
191            encoder: &mut fidl::encoding::Encoder<'_, D>,
192            offset: usize,
193            depth: fidl::encoding::Depth,
194        ) -> fidl::Result<()> {
195            encoder.debug_check_bounds::<EncryptionPattern>(offset);
196            // Zero out padding regions. There's no need to apply masks
197            // because the unmasked parts will be overwritten by fields.
198            // Write the fields.
199            self.0.encode(encoder, offset + 0, depth)?;
200            self.1.encode(encoder, offset + 4, depth)?;
201            Ok(())
202        }
203    }
204
205    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for EncryptionPattern {
206        #[inline(always)]
207        fn new_empty() -> Self {
208            Self {
209                clear_blocks: fidl::new_empty!(u32, D),
210                encrypted_blocks: fidl::new_empty!(u32, D),
211            }
212        }
213
214        #[inline]
215        unsafe fn decode(
216            &mut self,
217            decoder: &mut fidl::encoding::Decoder<'_, D>,
218            offset: usize,
219            _depth: fidl::encoding::Depth,
220        ) -> fidl::Result<()> {
221            decoder.debug_check_bounds::<Self>(offset);
222            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
223            // Verify that padding bytes are zero.
224            // Copy from the buffer into the object.
225            unsafe {
226                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
227            }
228            Ok(())
229        }
230    }
231
232    impl fidl::encoding::ValueTypeMarker for EncryptionSubsampleEntry {
233        type Borrowed<'a> = &'a Self;
234        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
235            value
236        }
237    }
238
239    unsafe impl fidl::encoding::TypeMarker for EncryptionSubsampleEntry {
240        type Owned = Self;
241
242        #[inline(always)]
243        fn inline_align(_context: fidl::encoding::Context) -> usize {
244            4
245        }
246
247        #[inline(always)]
248        fn inline_size(_context: fidl::encoding::Context) -> usize {
249            8
250        }
251        #[inline(always)]
252        fn encode_is_copy() -> bool {
253            true
254        }
255
256        #[inline(always)]
257        fn decode_is_copy() -> bool {
258            true
259        }
260    }
261
262    unsafe impl<D: fidl::encoding::ResourceDialect>
263        fidl::encoding::Encode<EncryptionSubsampleEntry, D> for &EncryptionSubsampleEntry
264    {
265        #[inline]
266        unsafe fn encode(
267            self,
268            encoder: &mut fidl::encoding::Encoder<'_, D>,
269            offset: usize,
270            _depth: fidl::encoding::Depth,
271        ) -> fidl::Result<()> {
272            encoder.debug_check_bounds::<EncryptionSubsampleEntry>(offset);
273            unsafe {
274                // Copy the object into the buffer.
275                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
276                (buf_ptr as *mut EncryptionSubsampleEntry)
277                    .write_unaligned((self as *const EncryptionSubsampleEntry).read());
278                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
279                // done second because the memcpy will write garbage to these bytes.
280            }
281            Ok(())
282        }
283    }
284    unsafe impl<
285            D: fidl::encoding::ResourceDialect,
286            T0: fidl::encoding::Encode<u32, D>,
287            T1: fidl::encoding::Encode<u32, D>,
288        > fidl::encoding::Encode<EncryptionSubsampleEntry, D> for (T0, T1)
289    {
290        #[inline]
291        unsafe fn encode(
292            self,
293            encoder: &mut fidl::encoding::Encoder<'_, D>,
294            offset: usize,
295            depth: fidl::encoding::Depth,
296        ) -> fidl::Result<()> {
297            encoder.debug_check_bounds::<EncryptionSubsampleEntry>(offset);
298            // Zero out padding regions. There's no need to apply masks
299            // because the unmasked parts will be overwritten by fields.
300            // Write the fields.
301            self.0.encode(encoder, offset + 0, depth)?;
302            self.1.encode(encoder, offset + 4, depth)?;
303            Ok(())
304        }
305    }
306
307    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
308        for EncryptionSubsampleEntry
309    {
310        #[inline(always)]
311        fn new_empty() -> Self {
312            Self {
313                clear_bytes: fidl::new_empty!(u32, D),
314                encrypted_bytes: fidl::new_empty!(u32, D),
315            }
316        }
317
318        #[inline]
319        unsafe fn decode(
320            &mut self,
321            decoder: &mut fidl::encoding::Decoder<'_, D>,
322            offset: usize,
323            _depth: fidl::encoding::Depth,
324        ) -> fidl::Result<()> {
325            decoder.debug_check_bounds::<Self>(offset);
326            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
327            // Verify that padding bytes are zero.
328            // Copy from the buffer into the object.
329            unsafe {
330                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
331            }
332            Ok(())
333        }
334    }
335
336    impl Encryption {
337        #[inline(always)]
338        fn max_ordinal_present(&self) -> u64 {
339            if let Some(_) = self.default_pattern {
340                return 4;
341            }
342            if let Some(_) = self.default_init_vector {
343                return 3;
344            }
345            if let Some(_) = self.default_key_id {
346                return 2;
347            }
348            if let Some(_) = self.scheme {
349                return 1;
350            }
351            0
352        }
353    }
354
355    impl fidl::encoding::ValueTypeMarker for Encryption {
356        type Borrowed<'a> = &'a Self;
357        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
358            value
359        }
360    }
361
362    unsafe impl fidl::encoding::TypeMarker for Encryption {
363        type Owned = Self;
364
365        #[inline(always)]
366        fn inline_align(_context: fidl::encoding::Context) -> usize {
367            8
368        }
369
370        #[inline(always)]
371        fn inline_size(_context: fidl::encoding::Context) -> usize {
372            16
373        }
374    }
375
376    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Encryption, D>
377        for &Encryption
378    {
379        unsafe fn encode(
380            self,
381            encoder: &mut fidl::encoding::Encoder<'_, D>,
382            offset: usize,
383            mut depth: fidl::encoding::Depth,
384        ) -> fidl::Result<()> {
385            encoder.debug_check_bounds::<Encryption>(offset);
386            // Vector header
387            let max_ordinal: u64 = self.max_ordinal_present();
388            encoder.write_num(max_ordinal, offset);
389            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
390            // Calling encoder.out_of_line_offset(0) is not allowed.
391            if max_ordinal == 0 {
392                return Ok(());
393            }
394            depth.increment()?;
395            let envelope_size = 8;
396            let bytes_len = max_ordinal as usize * envelope_size;
397            #[allow(unused_variables)]
398            let offset = encoder.out_of_line_offset(bytes_len);
399            let mut _prev_end_offset: usize = 0;
400            if 1 > max_ordinal {
401                return Ok(());
402            }
403
404            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
405            // are envelope_size bytes.
406            let cur_offset: usize = (1 - 1) * envelope_size;
407
408            // Zero reserved fields.
409            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
410
411            // Safety:
412            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
413            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
414            //   envelope_size bytes, there is always sufficient room.
415            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<4>, D>(
416                self.scheme.as_ref().map(
417                    <fidl::encoding::BoundedString<4> as fidl::encoding::ValueTypeMarker>::borrow,
418                ),
419                encoder,
420                offset + cur_offset,
421                depth,
422            )?;
423
424            _prev_end_offset = cur_offset + envelope_size;
425            if 2 > max_ordinal {
426                return Ok(());
427            }
428
429            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
430            // are envelope_size bytes.
431            let cur_offset: usize = (2 - 1) * envelope_size;
432
433            // Zero reserved fields.
434            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
435
436            // Safety:
437            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
438            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
439            //   envelope_size bytes, there is always sufficient room.
440            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<u8, 16>, D>(
441                self.default_key_id.as_ref().map(
442                    <fidl::encoding::Vector<u8, 16> as fidl::encoding::ValueTypeMarker>::borrow,
443                ),
444                encoder,
445                offset + cur_offset,
446                depth,
447            )?;
448
449            _prev_end_offset = cur_offset + envelope_size;
450            if 3 > max_ordinal {
451                return Ok(());
452            }
453
454            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
455            // are envelope_size bytes.
456            let cur_offset: usize = (3 - 1) * envelope_size;
457
458            // Zero reserved fields.
459            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
460
461            // Safety:
462            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
463            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
464            //   envelope_size bytes, there is always sufficient room.
465            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<u8, 16>, D>(
466                self.default_init_vector.as_ref().map(
467                    <fidl::encoding::Vector<u8, 16> as fidl::encoding::ValueTypeMarker>::borrow,
468                ),
469                encoder,
470                offset + cur_offset,
471                depth,
472            )?;
473
474            _prev_end_offset = cur_offset + envelope_size;
475            if 4 > max_ordinal {
476                return Ok(());
477            }
478
479            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
480            // are envelope_size bytes.
481            let cur_offset: usize = (4 - 1) * envelope_size;
482
483            // Zero reserved fields.
484            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
485
486            // Safety:
487            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
488            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
489            //   envelope_size bytes, there is always sufficient room.
490            fidl::encoding::encode_in_envelope_optional::<EncryptionPattern, D>(
491                self.default_pattern
492                    .as_ref()
493                    .map(<EncryptionPattern as fidl::encoding::ValueTypeMarker>::borrow),
494                encoder,
495                offset + cur_offset,
496                depth,
497            )?;
498
499            _prev_end_offset = cur_offset + envelope_size;
500
501            Ok(())
502        }
503    }
504
505    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Encryption {
506        #[inline(always)]
507        fn new_empty() -> Self {
508            Self::default()
509        }
510
511        unsafe fn decode(
512            &mut self,
513            decoder: &mut fidl::encoding::Decoder<'_, D>,
514            offset: usize,
515            mut depth: fidl::encoding::Depth,
516        ) -> fidl::Result<()> {
517            decoder.debug_check_bounds::<Self>(offset);
518            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
519                None => return Err(fidl::Error::NotNullable),
520                Some(len) => len,
521            };
522            // Calling decoder.out_of_line_offset(0) is not allowed.
523            if len == 0 {
524                return Ok(());
525            };
526            depth.increment()?;
527            let envelope_size = 8;
528            let bytes_len = len * envelope_size;
529            let offset = decoder.out_of_line_offset(bytes_len)?;
530            // Decode the envelope for each type.
531            let mut _next_ordinal_to_read = 0;
532            let mut next_offset = offset;
533            let end_offset = offset + bytes_len;
534            _next_ordinal_to_read += 1;
535            if next_offset >= end_offset {
536                return Ok(());
537            }
538
539            // Decode unknown envelopes for gaps in ordinals.
540            while _next_ordinal_to_read < 1 {
541                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
542                _next_ordinal_to_read += 1;
543                next_offset += envelope_size;
544            }
545
546            let next_out_of_line = decoder.next_out_of_line();
547            let handles_before = decoder.remaining_handles();
548            if let Some((inlined, num_bytes, num_handles)) =
549                fidl::encoding::decode_envelope_header(decoder, next_offset)?
550            {
551                let member_inline_size =
552                    <fidl::encoding::BoundedString<4> as fidl::encoding::TypeMarker>::inline_size(
553                        decoder.context,
554                    );
555                if inlined != (member_inline_size <= 4) {
556                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
557                }
558                let inner_offset;
559                let mut inner_depth = depth.clone();
560                if inlined {
561                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
562                    inner_offset = next_offset;
563                } else {
564                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
565                    inner_depth.increment()?;
566                }
567                let val_ref = self
568                    .scheme
569                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<4>, D));
570                fidl::decode!(
571                    fidl::encoding::BoundedString<4>,
572                    D,
573                    val_ref,
574                    decoder,
575                    inner_offset,
576                    inner_depth
577                )?;
578                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
579                {
580                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
581                }
582                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
583                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
584                }
585            }
586
587            next_offset += envelope_size;
588            _next_ordinal_to_read += 1;
589            if next_offset >= end_offset {
590                return Ok(());
591            }
592
593            // Decode unknown envelopes for gaps in ordinals.
594            while _next_ordinal_to_read < 2 {
595                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
596                _next_ordinal_to_read += 1;
597                next_offset += envelope_size;
598            }
599
600            let next_out_of_line = decoder.next_out_of_line();
601            let handles_before = decoder.remaining_handles();
602            if let Some((inlined, num_bytes, num_handles)) =
603                fidl::encoding::decode_envelope_header(decoder, next_offset)?
604            {
605                let member_inline_size =
606                    <fidl::encoding::Vector<u8, 16> as fidl::encoding::TypeMarker>::inline_size(
607                        decoder.context,
608                    );
609                if inlined != (member_inline_size <= 4) {
610                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
611                }
612                let inner_offset;
613                let mut inner_depth = depth.clone();
614                if inlined {
615                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
616                    inner_offset = next_offset;
617                } else {
618                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
619                    inner_depth.increment()?;
620                }
621                let val_ref = self
622                    .default_key_id
623                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<u8, 16>, D));
624                fidl::decode!(fidl::encoding::Vector<u8, 16>, D, val_ref, decoder, inner_offset, inner_depth)?;
625                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
626                {
627                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
628                }
629                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
630                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
631                }
632            }
633
634            next_offset += envelope_size;
635            _next_ordinal_to_read += 1;
636            if next_offset >= end_offset {
637                return Ok(());
638            }
639
640            // Decode unknown envelopes for gaps in ordinals.
641            while _next_ordinal_to_read < 3 {
642                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
643                _next_ordinal_to_read += 1;
644                next_offset += envelope_size;
645            }
646
647            let next_out_of_line = decoder.next_out_of_line();
648            let handles_before = decoder.remaining_handles();
649            if let Some((inlined, num_bytes, num_handles)) =
650                fidl::encoding::decode_envelope_header(decoder, next_offset)?
651            {
652                let member_inline_size =
653                    <fidl::encoding::Vector<u8, 16> as fidl::encoding::TypeMarker>::inline_size(
654                        decoder.context,
655                    );
656                if inlined != (member_inline_size <= 4) {
657                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
658                }
659                let inner_offset;
660                let mut inner_depth = depth.clone();
661                if inlined {
662                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
663                    inner_offset = next_offset;
664                } else {
665                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
666                    inner_depth.increment()?;
667                }
668                let val_ref = self
669                    .default_init_vector
670                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<u8, 16>, D));
671                fidl::decode!(fidl::encoding::Vector<u8, 16>, D, val_ref, decoder, inner_offset, inner_depth)?;
672                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
673                {
674                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
675                }
676                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
677                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
678                }
679            }
680
681            next_offset += envelope_size;
682            _next_ordinal_to_read += 1;
683            if next_offset >= end_offset {
684                return Ok(());
685            }
686
687            // Decode unknown envelopes for gaps in ordinals.
688            while _next_ordinal_to_read < 4 {
689                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
690                _next_ordinal_to_read += 1;
691                next_offset += envelope_size;
692            }
693
694            let next_out_of_line = decoder.next_out_of_line();
695            let handles_before = decoder.remaining_handles();
696            if let Some((inlined, num_bytes, num_handles)) =
697                fidl::encoding::decode_envelope_header(decoder, next_offset)?
698            {
699                let member_inline_size =
700                    <EncryptionPattern as fidl::encoding::TypeMarker>::inline_size(decoder.context);
701                if inlined != (member_inline_size <= 4) {
702                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
703                }
704                let inner_offset;
705                let mut inner_depth = depth.clone();
706                if inlined {
707                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
708                    inner_offset = next_offset;
709                } else {
710                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
711                    inner_depth.increment()?;
712                }
713                let val_ref = self
714                    .default_pattern
715                    .get_or_insert_with(|| fidl::new_empty!(EncryptionPattern, D));
716                fidl::decode!(EncryptionPattern, D, val_ref, decoder, inner_offset, inner_depth)?;
717                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
718                {
719                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
720                }
721                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
722                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
723                }
724            }
725
726            next_offset += envelope_size;
727
728            // Decode the remaining unknown envelopes.
729            while next_offset < end_offset {
730                _next_ordinal_to_read += 1;
731                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
732                next_offset += envelope_size;
733            }
734
735            Ok(())
736        }
737    }
738
739    impl PacketEncryptionProperties {
740        #[inline(always)]
741        fn max_ordinal_present(&self) -> u64 {
742            if let Some(_) = self.subsamples {
743                return 5;
744            }
745            if let Some(_) = self.pattern {
746                return 4;
747            }
748            if let Some(_) = self.init_vector {
749                return 3;
750            }
751            if let Some(_) = self.key_id {
752                return 2;
753            }
754            if let Some(_) = self.is_encrypted {
755                return 1;
756            }
757            0
758        }
759    }
760
761    impl fidl::encoding::ValueTypeMarker for PacketEncryptionProperties {
762        type Borrowed<'a> = &'a Self;
763        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
764            value
765        }
766    }
767
768    unsafe impl fidl::encoding::TypeMarker for PacketEncryptionProperties {
769        type Owned = Self;
770
771        #[inline(always)]
772        fn inline_align(_context: fidl::encoding::Context) -> usize {
773            8
774        }
775
776        #[inline(always)]
777        fn inline_size(_context: fidl::encoding::Context) -> usize {
778            16
779        }
780    }
781
782    unsafe impl<D: fidl::encoding::ResourceDialect>
783        fidl::encoding::Encode<PacketEncryptionProperties, D> for &PacketEncryptionProperties
784    {
785        unsafe fn encode(
786            self,
787            encoder: &mut fidl::encoding::Encoder<'_, D>,
788            offset: usize,
789            mut depth: fidl::encoding::Depth,
790        ) -> fidl::Result<()> {
791            encoder.debug_check_bounds::<PacketEncryptionProperties>(offset);
792            // Vector header
793            let max_ordinal: u64 = self.max_ordinal_present();
794            encoder.write_num(max_ordinal, offset);
795            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
796            // Calling encoder.out_of_line_offset(0) is not allowed.
797            if max_ordinal == 0 {
798                return Ok(());
799            }
800            depth.increment()?;
801            let envelope_size = 8;
802            let bytes_len = max_ordinal as usize * envelope_size;
803            #[allow(unused_variables)]
804            let offset = encoder.out_of_line_offset(bytes_len);
805            let mut _prev_end_offset: usize = 0;
806            if 1 > max_ordinal {
807                return Ok(());
808            }
809
810            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
811            // are envelope_size bytes.
812            let cur_offset: usize = (1 - 1) * envelope_size;
813
814            // Zero reserved fields.
815            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
816
817            // Safety:
818            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
819            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
820            //   envelope_size bytes, there is always sufficient room.
821            fidl::encoding::encode_in_envelope_optional::<bool, D>(
822                self.is_encrypted.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
823                encoder,
824                offset + cur_offset,
825                depth,
826            )?;
827
828            _prev_end_offset = cur_offset + envelope_size;
829            if 2 > max_ordinal {
830                return Ok(());
831            }
832
833            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
834            // are envelope_size bytes.
835            let cur_offset: usize = (2 - 1) * envelope_size;
836
837            // Zero reserved fields.
838            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
839
840            // Safety:
841            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
842            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
843            //   envelope_size bytes, there is always sufficient room.
844            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<u8, 16>, D>(
845                self.key_id.as_ref().map(
846                    <fidl::encoding::Vector<u8, 16> as fidl::encoding::ValueTypeMarker>::borrow,
847                ),
848                encoder,
849                offset + cur_offset,
850                depth,
851            )?;
852
853            _prev_end_offset = cur_offset + envelope_size;
854            if 3 > max_ordinal {
855                return Ok(());
856            }
857
858            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
859            // are envelope_size bytes.
860            let cur_offset: usize = (3 - 1) * envelope_size;
861
862            // Zero reserved fields.
863            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
864
865            // Safety:
866            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
867            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
868            //   envelope_size bytes, there is always sufficient room.
869            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<u8, 16>, D>(
870                self.init_vector.as_ref().map(
871                    <fidl::encoding::Vector<u8, 16> as fidl::encoding::ValueTypeMarker>::borrow,
872                ),
873                encoder,
874                offset + cur_offset,
875                depth,
876            )?;
877
878            _prev_end_offset = cur_offset + envelope_size;
879            if 4 > max_ordinal {
880                return Ok(());
881            }
882
883            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
884            // are envelope_size bytes.
885            let cur_offset: usize = (4 - 1) * envelope_size;
886
887            // Zero reserved fields.
888            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
889
890            // Safety:
891            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
892            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
893            //   envelope_size bytes, there is always sufficient room.
894            fidl::encoding::encode_in_envelope_optional::<EncryptionPattern, D>(
895                self.pattern
896                    .as_ref()
897                    .map(<EncryptionPattern as fidl::encoding::ValueTypeMarker>::borrow),
898                encoder,
899                offset + cur_offset,
900                depth,
901            )?;
902
903            _prev_end_offset = cur_offset + envelope_size;
904            if 5 > max_ordinal {
905                return Ok(());
906            }
907
908            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
909            // are envelope_size bytes.
910            let cur_offset: usize = (5 - 1) * envelope_size;
911
912            // Zero reserved fields.
913            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
914
915            // Safety:
916            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
917            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
918            //   envelope_size bytes, there is always sufficient room.
919            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<EncryptionSubsampleEntry, 16>, D>(
920            self.subsamples.as_ref().map(<fidl::encoding::Vector<EncryptionSubsampleEntry, 16> as fidl::encoding::ValueTypeMarker>::borrow),
921            encoder, offset + cur_offset, depth
922        )?;
923
924            _prev_end_offset = cur_offset + envelope_size;
925
926            Ok(())
927        }
928    }
929
930    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
931        for PacketEncryptionProperties
932    {
933        #[inline(always)]
934        fn new_empty() -> Self {
935            Self::default()
936        }
937
938        unsafe fn decode(
939            &mut self,
940            decoder: &mut fidl::encoding::Decoder<'_, D>,
941            offset: usize,
942            mut depth: fidl::encoding::Depth,
943        ) -> fidl::Result<()> {
944            decoder.debug_check_bounds::<Self>(offset);
945            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
946                None => return Err(fidl::Error::NotNullable),
947                Some(len) => len,
948            };
949            // Calling decoder.out_of_line_offset(0) is not allowed.
950            if len == 0 {
951                return Ok(());
952            };
953            depth.increment()?;
954            let envelope_size = 8;
955            let bytes_len = len * envelope_size;
956            let offset = decoder.out_of_line_offset(bytes_len)?;
957            // Decode the envelope for each type.
958            let mut _next_ordinal_to_read = 0;
959            let mut next_offset = offset;
960            let end_offset = offset + bytes_len;
961            _next_ordinal_to_read += 1;
962            if next_offset >= end_offset {
963                return Ok(());
964            }
965
966            // Decode unknown envelopes for gaps in ordinals.
967            while _next_ordinal_to_read < 1 {
968                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
969                _next_ordinal_to_read += 1;
970                next_offset += envelope_size;
971            }
972
973            let next_out_of_line = decoder.next_out_of_line();
974            let handles_before = decoder.remaining_handles();
975            if let Some((inlined, num_bytes, num_handles)) =
976                fidl::encoding::decode_envelope_header(decoder, next_offset)?
977            {
978                let member_inline_size =
979                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
980                if inlined != (member_inline_size <= 4) {
981                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
982                }
983                let inner_offset;
984                let mut inner_depth = depth.clone();
985                if inlined {
986                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
987                    inner_offset = next_offset;
988                } else {
989                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
990                    inner_depth.increment()?;
991                }
992                let val_ref = self.is_encrypted.get_or_insert_with(|| fidl::new_empty!(bool, D));
993                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
994                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
995                {
996                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
997                }
998                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
999                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1000                }
1001            }
1002
1003            next_offset += envelope_size;
1004            _next_ordinal_to_read += 1;
1005            if next_offset >= end_offset {
1006                return Ok(());
1007            }
1008
1009            // Decode unknown envelopes for gaps in ordinals.
1010            while _next_ordinal_to_read < 2 {
1011                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1012                _next_ordinal_to_read += 1;
1013                next_offset += envelope_size;
1014            }
1015
1016            let next_out_of_line = decoder.next_out_of_line();
1017            let handles_before = decoder.remaining_handles();
1018            if let Some((inlined, num_bytes, num_handles)) =
1019                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1020            {
1021                let member_inline_size =
1022                    <fidl::encoding::Vector<u8, 16> as fidl::encoding::TypeMarker>::inline_size(
1023                        decoder.context,
1024                    );
1025                if inlined != (member_inline_size <= 4) {
1026                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1027                }
1028                let inner_offset;
1029                let mut inner_depth = depth.clone();
1030                if inlined {
1031                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1032                    inner_offset = next_offset;
1033                } else {
1034                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1035                    inner_depth.increment()?;
1036                }
1037                let val_ref = self
1038                    .key_id
1039                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<u8, 16>, D));
1040                fidl::decode!(fidl::encoding::Vector<u8, 16>, D, val_ref, decoder, inner_offset, inner_depth)?;
1041                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1042                {
1043                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1044                }
1045                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1046                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1047                }
1048            }
1049
1050            next_offset += envelope_size;
1051            _next_ordinal_to_read += 1;
1052            if next_offset >= end_offset {
1053                return Ok(());
1054            }
1055
1056            // Decode unknown envelopes for gaps in ordinals.
1057            while _next_ordinal_to_read < 3 {
1058                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1059                _next_ordinal_to_read += 1;
1060                next_offset += envelope_size;
1061            }
1062
1063            let next_out_of_line = decoder.next_out_of_line();
1064            let handles_before = decoder.remaining_handles();
1065            if let Some((inlined, num_bytes, num_handles)) =
1066                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1067            {
1068                let member_inline_size =
1069                    <fidl::encoding::Vector<u8, 16> as fidl::encoding::TypeMarker>::inline_size(
1070                        decoder.context,
1071                    );
1072                if inlined != (member_inline_size <= 4) {
1073                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1074                }
1075                let inner_offset;
1076                let mut inner_depth = depth.clone();
1077                if inlined {
1078                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1079                    inner_offset = next_offset;
1080                } else {
1081                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1082                    inner_depth.increment()?;
1083                }
1084                let val_ref = self
1085                    .init_vector
1086                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<u8, 16>, D));
1087                fidl::decode!(fidl::encoding::Vector<u8, 16>, D, val_ref, decoder, inner_offset, inner_depth)?;
1088                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1089                {
1090                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1091                }
1092                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1093                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1094                }
1095            }
1096
1097            next_offset += envelope_size;
1098            _next_ordinal_to_read += 1;
1099            if next_offset >= end_offset {
1100                return Ok(());
1101            }
1102
1103            // Decode unknown envelopes for gaps in ordinals.
1104            while _next_ordinal_to_read < 4 {
1105                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1106                _next_ordinal_to_read += 1;
1107                next_offset += envelope_size;
1108            }
1109
1110            let next_out_of_line = decoder.next_out_of_line();
1111            let handles_before = decoder.remaining_handles();
1112            if let Some((inlined, num_bytes, num_handles)) =
1113                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1114            {
1115                let member_inline_size =
1116                    <EncryptionPattern as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1117                if inlined != (member_inline_size <= 4) {
1118                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1119                }
1120                let inner_offset;
1121                let mut inner_depth = depth.clone();
1122                if inlined {
1123                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1124                    inner_offset = next_offset;
1125                } else {
1126                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1127                    inner_depth.increment()?;
1128                }
1129                let val_ref =
1130                    self.pattern.get_or_insert_with(|| fidl::new_empty!(EncryptionPattern, D));
1131                fidl::decode!(EncryptionPattern, D, val_ref, decoder, inner_offset, inner_depth)?;
1132                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1133                {
1134                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1135                }
1136                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1137                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1138                }
1139            }
1140
1141            next_offset += envelope_size;
1142            _next_ordinal_to_read += 1;
1143            if next_offset >= end_offset {
1144                return Ok(());
1145            }
1146
1147            // Decode unknown envelopes for gaps in ordinals.
1148            while _next_ordinal_to_read < 5 {
1149                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1150                _next_ordinal_to_read += 1;
1151                next_offset += envelope_size;
1152            }
1153
1154            let next_out_of_line = decoder.next_out_of_line();
1155            let handles_before = decoder.remaining_handles();
1156            if let Some((inlined, num_bytes, num_handles)) =
1157                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1158            {
1159                let member_inline_size = <fidl::encoding::Vector<EncryptionSubsampleEntry, 16> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1160                if inlined != (member_inline_size <= 4) {
1161                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1162                }
1163                let inner_offset;
1164                let mut inner_depth = depth.clone();
1165                if inlined {
1166                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1167                    inner_offset = next_offset;
1168                } else {
1169                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1170                    inner_depth.increment()?;
1171                }
1172                let val_ref = self.subsamples.get_or_insert_with(
1173                    || fidl::new_empty!(fidl::encoding::Vector<EncryptionSubsampleEntry, 16>, D),
1174                );
1175                fidl::decode!(fidl::encoding::Vector<EncryptionSubsampleEntry, 16>, D, val_ref, decoder, inner_offset, inner_depth)?;
1176                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1177                {
1178                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1179                }
1180                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1181                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1182                }
1183            }
1184
1185            next_offset += envelope_size;
1186
1187            // Decode the remaining unknown envelopes.
1188            while next_offset < end_offset {
1189                _next_ordinal_to_read += 1;
1190                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1191                next_offset += envelope_size;
1192            }
1193
1194            Ok(())
1195        }
1196    }
1197}