1use std::mem::size_of;
2
3use crate::{
4 byte_read::{ByteRead, ByteReader},
5 error::ParseError,
6};
7
8#[repr(transparent)]
12#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
13pub struct QtiFlagsV6(pub u32);
14
15#[repr(transparent)]
17#[derive(Clone, Copy, Debug, Default)]
18pub struct QtiFlagsV6Builder(u32);
19
20#[repr(transparent)]
27#[derive(Clone, Copy, Debug, PartialEq, Eq)]
28pub struct QtiFlagsV7(pub u32);
29
30#[repr(transparent)]
32#[derive(Clone, Copy, Debug, Default)]
33pub struct QtiFlagsV7Builder(u32);
34
35#[repr(packed)]
40#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
41pub struct CommonMetadata {
42 pub major_version: u32,
44 pub minor_version: u32,
46 pub software_id: u32,
48 pub app_id: u32,
50 pub hash_table_algorithm: u32,
55 pub measurement_register: u32,
65}
66
67#[repr(packed)]
72#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
73pub struct MetadataLen120 {
74 pub major_version: u32,
76 pub minor_version: u32,
78 pub software_id: u32,
80 pub hardware_id: u32,
82 pub oem_id: u32,
84 pub model_id: u32,
86 pub app_id: u32,
88 pub flags: QtiFlagsV6,
90 pub soc_version: [u32; 12],
92 pub multi_serial_numbers: [u32; 8],
94 pub root_cert_index: u32,
96 pub anti_rollback_version: u32,
98}
99
100#[repr(packed)]
105#[derive(Clone, Copy, Debug, PartialEq, Eq)]
106pub struct MetadataLen224 {
107 pub major_version: u32,
109 pub minor_version: u32,
111 pub anti_rollback_version: u32,
113 pub root_cert_index: u32,
115 pub soc_version: [u32; 12],
117 pub feature_id: u32,
119 pub hardware_id: u32,
121 pub multi_serial_numbers: [u64; 8],
123 pub oem_id: u32,
125 pub model_id: u32,
127 pub oem_lifecycle_state: u64,
132 pub oem_root_cert_hash_algorithm: u32,
138 pub oem_root_cert_hash: [u8; 64],
143 pub flags: QtiFlagsV7,
145}
146
147#[derive(Clone, Copy, Debug, PartialEq, Eq)]
152pub enum Metadata {
153 Len120(MetadataLen120),
154 Len224(MetadataLen224),
155}
156
157impl QtiFlagsV6 {
158 pub fn rot_en(&self) -> bool {
160 self.0 & 1 != 0
161 }
162
163 pub fn use_soc_hw_version(&self) -> bool {
165 self.0 & (1 << 1) != 0
166 }
167
168 pub fn use_serial_number(&self) -> bool {
170 self.0 & (1 << 2) != 0
171 }
172
173 pub fn oem_id_independent(&self) -> bool {
175 self.0 & (1 << 3) != 0
176 }
177
178 pub fn root_revoke_activate_enable(&self) -> u8 {
184 ((self.0 >> 4) & 0b11) as u8
185 }
186
187 pub fn uie_key_switch_enable(&self) -> u8 {
193 ((self.0 >> 6) & 0b11) as u8
194 }
195
196 pub fn debug(&self) -> u8 {
202 ((self.0 >> 8) & 0b11) as u8
203 }
204
205 pub fn use_hw_id(&self) -> bool {
209 self.0 & (1 << 10) != 0
210 }
211
212 pub fn model_id_independent(&self) -> bool {
216 self.0 & (1 << 11) != 0
217 }
218}
219
220impl QtiFlagsV6Builder {
221 fn set_bit(&mut self, bit: u8) {
222 self.0 |= 1 << bit;
223 }
224
225 fn clear_bit(&mut self, bit: u8) {
226 self.0 &= !(1 << bit);
227 }
228
229 fn set_value(&mut self, start: u8, end: u8, value: u8) {
230 (start..end).for_each(|x| self.clear_bit(x));
231 let mask = (1 << (end - start)) - 1;
232 self.0 |= (value as u32 & mask) << start;
233 }
234
235 pub fn new() -> Self {
237 Default::default()
238 }
239
240 pub fn with(flags: QtiFlagsV6) -> Self {
242 Self(flags.0)
243 }
244
245 pub fn build(self) -> QtiFlagsV6 {
247 QtiFlagsV6(self.0)
248 }
249
250 pub fn rot_en(&mut self) {
252 self.set_bit(0);
253 }
254
255 pub fn use_soc_hw_version(&mut self) {
257 self.set_bit(1);
258 }
259
260 pub fn use_use_serial_number(&mut self) {
262 self.set_bit(2);
263 }
264
265 pub fn oem_id_independent(&mut self) {
267 self.set_bit(3);
268 }
269
270 pub fn root_revoke_activate_enable(&mut self, value: u8) {
272 self.set_value(4, 6, value);
273 }
274
275 pub fn uie_key_switch_enable(&mut self, value: u8) {
277 self.set_value(6, 8, value);
278 }
279
280 pub fn debug(&mut self, value: u8) {
282 self.set_value(8, 10, value);
283 }
284
285 pub fn use_hw_id(&mut self) {
287 self.set_bit(10);
288 }
289
290 pub fn model_id_independent(&mut self) {
292 self.set_bit(11);
293 }
294}
295
296impl QtiFlagsV7 {
297 pub fn use_soc_hw_version(&self) -> Result<bool, u8> {
299 match self.0 & 0b11 {
300 0b01 => Ok(false),
301 0b10 => Ok(true),
302 unknown => Err(unknown as u8),
303 }
304 }
305
306 pub fn use_feature_id(&self) -> Result<bool, u8> {
308 match (self.0 >> 2) & 0b11 {
309 0b01 => Ok(false),
310 0b10 => Ok(true),
311 unknown => Err(unknown as u8),
312 }
313 }
314
315 pub fn use_hw_id(&self) -> Result<bool, u8> {
317 match (self.0 >> 4) & 0b11 {
318 0b01 => Ok(false),
319 0b10 => Ok(true),
320 unknown => Err(unknown as u8),
321 }
322 }
323
324 pub fn use_serial_number(&self) -> Result<bool, u8> {
326 match (self.0 >> 6) & 0b11 {
327 0b01 => Ok(false),
328 0b10 => Ok(true),
329 unknown => Err(unknown as u8),
330 }
331 }
332
333 pub fn use_oem_id(&self) -> Result<bool, u8> {
335 match (self.0 >> 8) & 0b11 {
336 0b01 => Ok(false),
337 0b10 => Ok(true),
338 unknown => Err(unknown as u8),
339 }
340 }
341
342 pub fn use_model_id(&self) -> Result<bool, u8> {
344 match (self.0 >> 10) & 0b11 {
345 0b01 => Ok(false),
346 0b10 => Ok(true),
347 unknown => Err(unknown as u8),
348 }
349 }
350
351 pub fn use_soc_lifecycle_state(&self) -> Result<bool, u8> {
353 match (self.0 >> 12) & 0b11 {
354 0b01 => Ok(false),
355 0b10 => Ok(true),
356 unknown => Err(unknown as u8),
357 }
358 }
359
360 pub fn use_oem_lifecycle_state(&self) -> Result<bool, u8> {
362 match (self.0 >> 14) & 0b11 {
363 0b01 => Ok(false),
364 0b10 => Ok(true),
365 unknown => Err(unknown as u8),
366 }
367 }
368
369 pub fn use_oem_root_cert_hash(&self) -> Result<bool, u8> {
371 match (self.0 >> 16) & 0b11 {
372 0b01 => Ok(false),
373 0b10 => Ok(true),
374 unknown => Err(unknown as u8),
375 }
376 }
377
378 pub fn debug(&self) -> Result<bool, u8> {
385 match (self.0 >> 18) & 0b11 {
386 0b01 => Ok(false),
387 0b10 => Ok(true),
388 unknown => Err(unknown as u8),
389 }
390 }
391
392 pub fn rot_en(&self) -> Result<bool, u8> {
394 match (self.0 >> 20) & 0b11 {
395 0b01 => Ok(false),
396 0b10 => Ok(true),
397 unknown => Err(unknown as u8),
398 }
399 }
400}
401
402impl QtiFlagsV7Builder {
403 fn clear_bit(&mut self, bit: u8) {
404 self.0 &= !(1 << bit);
405 }
406
407 fn set_true(&mut self, start: u8) {
408 (start..start + 2).for_each(|x| self.clear_bit(x));
409 self.0 |= 0b10 << start;
410 }
411
412 pub fn new() -> Self {
414 Self(0b0101010101010101010101)
415 }
416
417 pub fn with(flags: QtiFlagsV7) -> Self {
419 Self(flags.0)
420 }
421
422 pub fn build(self) -> QtiFlagsV7 {
424 QtiFlagsV7(self.0)
425 }
426
427 pub fn use_soc_hw_version(&mut self) {
429 self.set_true(0);
430 }
431
432 pub fn use_feature_id(&mut self) {
434 self.set_true(2);
435 }
436
437 pub fn use_hw_id(&mut self) {
439 self.set_true(4);
440 }
441
442 pub fn use_serial_number(&mut self) {
444 self.set_true(6);
445 }
446
447 pub fn use_oem_id(&mut self) {
449 self.set_true(8);
450 }
451
452 pub fn use_model_id(&mut self) {
454 self.set_true(10);
455 }
456
457 pub fn use_soc_lifecycle_state(&mut self) {
459 self.set_true(12);
460 }
461
462 pub fn use_oem_lifecycle_state(&mut self) {
464 self.set_true(14);
465 }
466
467 pub fn use_oem_root_cert_hash(&mut self) {
469 self.set_true(16);
470 }
471
472 pub fn debug(&mut self) {
474 self.set_true(18);
475 }
476
477 pub fn rot_en(&mut self) {
479 self.set_true(20);
480 }
481}
482
483impl CommonMetadata {
484 pub fn as_bytes(&self) -> &[u8; size_of::<Self>()] {
486 unsafe { &*(self as *const _ as *const _) }
487 }
488}
489
490impl MetadataLen120 {
491 pub fn as_bytes(&self) -> &[u8; size_of::<Self>()] {
493 unsafe { &*(self as *const _ as *const _) }
494 }
495}
496
497impl MetadataLen224 {
498 pub fn as_bytes(&self) -> &[u8; size_of::<Self>()] {
500 unsafe { &*(self as *const _ as *const _) }
501 }
502}
503
504impl Metadata {
505 pub fn as_bytes(&self) -> &[u8] {
507 match self {
508 Metadata::Len120(metadata) => metadata.as_bytes(),
509 Metadata::Len224(metadata) => metadata.as_bytes(),
510 }
511 }
512}
513
514impl Default for MetadataLen224 {
515 fn default() -> Self {
516 unsafe { std::mem::zeroed() }
517 }
518}
519
520impl Default for QtiFlagsV7 {
521 fn default() -> Self {
522 Self(0b0101010101010101010101)
523 }
524}
525
526impl std::fmt::Display for CommonMetadata {
527 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
528 writeln!(f, "Major Version: {}", { self.major_version })?;
529 writeln!(f, "Minor Version: {}", { self.minor_version })?;
530 writeln!(f, "Software ID: {:#010x}", { self.software_id })?;
531 writeln!(f, "Application ID: {:#010x}", { self.app_id })?;
532 writeln!(
533 f,
534 "Hash Table Algorithm: {} ({:#x})",
535 match self.hash_table_algorithm {
536 2 => "SHA256",
537 3 => "SHA384",
538 _ => "/* Unknown */",
539 },
540 { self.hash_table_algorithm }
541 )?;
542 write!(
543 f,
544 "Measurement Register: {} ({:#x})",
545 match self.measurement_register {
546 0 => "None",
547 1 => "Hardware Measurement Register #1",
548 2 => "Hardware Measurement Register #2",
549 3 => "Firmware Measurement Register #1",
550 4 => "Firmware Measurement Register #2",
551 5 => "Firmware Measurement Register #3",
552 6 => "Firmware Measurement Register #4",
553 _ => "/* Unknown */",
554 },
555 { self.measurement_register }
556 )
557 }
558}
559
560impl std::fmt::Display for MetadataLen120 {
561 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
562 writeln!(f, "Major Version: {}", { self.major_version })?;
563 writeln!(f, "Minor Version: {}", { self.minor_version })?;
564 writeln!(f, "Software ID: {:#010x}", { self.software_id })?;
565 writeln!(f, "JTAG ID: {:#010x}", { self.hardware_id })?;
566 writeln!(f, "OEM ID: {:#010x}", { self.oem_id })?;
567 writeln!(f, "Product ID: {:#010x}", { self.model_id })?;
568 writeln!(f, "Application ID: {:#010x}", { self.app_id })?;
569 writeln!(f, "Flags: {:#034b}", { self.flags.0 })?;
570 writeln!(f, " RoT (Root of Trust): {}", ({ self.flags }).rot_en())?;
571 writeln!(
572 f,
573 " Use SoC Hardware Versions: {}",
574 ({ self.flags }).use_soc_hw_version()
575 )?;
576 writeln!(
577 f,
578 " Use Serial Numbers: {}",
579 ({ self.flags }).use_serial_number()
580 )?;
581 writeln!(
582 f,
583 " Use OEM ID: {}",
584 !({ self.flags }).oem_id_independent()
585 )?;
586 writeln!(
587 f,
588 " Revocation and Activation in MRC (Multiple Root Certificate): {} ({:#x})",
589 ({ self.flags }).root_revoke_activate_enable() > 0,
590 ({ self.flags }).root_revoke_activate_enable()
591 )?;
592 writeln!(
593 f,
594 " UIE (Unified Image Encryption) Key Switch: {} ({:#x})",
595 ({ self.flags }).uie_key_switch_enable() > 0,
596 ({ self.flags }).uie_key_switch_enable()
597 )?;
598 writeln!(
599 f,
600 " JTAG Debug: {} ({:#x})",
601 match ({ self.flags }).debug() {
602 0 => "Nop",
603 1 => "Disabled",
604 2 => "Enabled",
605 _ => "/* Unknown */",
606 },
607 ({ self.flags }).debug()
608 )?;
609 writeln!(f, " Use JTAG ID: {}", ({ self.flags }).use_hw_id())?;
610 if self.major_version > 0 {
611 writeln!(
612 f,
613 " Use Product ID: {}",
614 !({ self.flags }).model_id_independent()
615 )?;
616 }
617 writeln!(
618 f,
619 "SoC Hardware Versions: [\n{}",
620 self.soc_version
621 .into_iter()
622 .filter(|v| *v != 0)
623 .map(|v| format!(" {:#010x},", v))
624 .chain(std::iter::once(" ]".to_string()))
625 .collect::<Vec<String>>()
626 .join("\n")
627 )?;
628 writeln!(
629 f,
630 "Serial Numbers: [\n{}",
631 self.multi_serial_numbers
632 .into_iter()
633 .filter(|v| *v != 0)
634 .map(|v| format!(" {:#010x},", v))
635 .chain(std::iter::once(" ]".to_string()))
636 .collect::<Vec<String>>()
637 .join("\n")
638 )?;
639 writeln!(
640 f,
641 "Root Certificate Index in MRC (Multiple Root Certificate): {}",
642 { self.root_cert_index }
643 )?;
644 write!(f, "Anti-Rollback Version: {:#x}", {
645 self.anti_rollback_version
646 })
647 }
648}
649
650impl std::fmt::Display for MetadataLen224 {
651 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
652 writeln!(f, "Major Version: {}", { self.major_version })?;
653 writeln!(f, "Minor Version: {}", { self.minor_version })?;
654 writeln!(f, "Anti-Rollback Version: {:#x}", {
655 self.anti_rollback_version
656 })?;
657 writeln!(
658 f,
659 "Root Certificate Index in MRC (Multiple Root Certificate): {}",
660 { self.root_cert_index }
661 )?;
662 writeln!(
663 f,
664 "SoC Hardware Versions: [\n{}",
665 self.soc_version
666 .into_iter()
667 .filter(|v| *v != 0)
668 .map(|v| format!(" {:#010x},", v))
669 .chain(std::iter::once(" ]".to_string()))
670 .collect::<Vec<String>>()
671 .join("\n")
672 )?;
673 writeln!(f, "SoC Feature ID: {:#010x}", { self.feature_id })?;
674 writeln!(f, "JTAG ID: {:#010x}", { self.hardware_id })?;
675 writeln!(
676 f,
677 "Serial Numbers: [\n{}",
678 self.multi_serial_numbers
679 .into_iter()
680 .filter(|v| *v != 0)
681 .map(|v| format!(" {:#018x},", v))
682 .chain(std::iter::once(" ]".to_string()))
683 .collect::<Vec<String>>()
684 .join("\n")
685 )?;
686 writeln!(f, "OEM ID: {:#010x}", { self.oem_id })?;
687 writeln!(f, "Product ID: {:#010x}", { self.model_id })?;
688 writeln!(
689 f,
690 "OEM Lifecycle State: {} ({:#018x})",
691 match self.oem_lifecycle_state {
692 0x200000000 => "Development",
693 0xD00000000 => "Production",
694 _ => "/* Unknown */",
695 },
696 { self.oem_lifecycle_state }
697 )?;
698 writeln!(
699 f,
700 "OEM Root Certificate Hash Algorithm: {} ({:#x})",
701 match self.oem_root_cert_hash_algorithm {
702 0 => "N/A",
703 2 => "SHA256",
704 3 => "SHA384",
705 _ => "/* Unknown */",
706 },
707 { self.oem_root_cert_hash_algorithm }
708 )?;
709 if self.oem_root_cert_hash_algorithm != 0 {
710 writeln!(
711 f,
712 "OEM Root Certificate Hash: {}",
713 match self.oem_root_cert_hash_algorithm {
714 2 => &self.oem_root_cert_hash[32..],
715 3 => &self.oem_root_cert_hash[24..],
716 _ => &self.oem_root_cert_hash,
717 }
718 .iter()
719 .fold(String::from("0x"), |s, byte| s + &format!("{:02x}", byte)),
720 )?;
721 }
722 writeln!(f, "Flags: {:#034b}", { self.flags.0 })?;
723 writeln!(
724 f,
725 " Use SoC Hardware Versions: {}",
726 match ({ self.flags }).use_soc_hw_version() {
727 Ok(v) => format!("{}", v),
728 Err(v) => format!("/* Unknown */ ({:#04b})", v),
729 }
730 )?;
731 writeln!(
732 f,
733 " Use Feature ID: {}",
734 match ({ self.flags }).use_feature_id() {
735 Ok(v) => format!("{}", v),
736 Err(v) => format!("/* Unknown */ ({:#04b})", v),
737 }
738 )?;
739 writeln!(
740 f,
741 " Use JTAG ID: {}",
742 match ({ self.flags }).use_hw_id() {
743 Ok(v) => format!("{}", v),
744 Err(v) => format!("/* Unknown */ ({:#04b})", v),
745 }
746 )?;
747 writeln!(
748 f,
749 " Use Serial Numbers: {}",
750 match ({ self.flags }).use_serial_number() {
751 Ok(v) => format!("{}", v),
752 Err(v) => format!("/* Unknown */ ({:#04b})", v),
753 }
754 )?;
755 writeln!(
756 f,
757 " Use OEM ID: {}",
758 match ({ self.flags }).use_oem_id() {
759 Ok(v) => format!("{}", v),
760 Err(v) => format!("/* Unknown */ ({:#04b})", v),
761 }
762 )?;
763 writeln!(
764 f,
765 " Use Product ID: {}",
766 match ({ self.flags }).use_model_id() {
767 Ok(v) => format!("{}", v),
768 Err(v) => format!("/* Unknown */ ({:#04b})", v),
769 }
770 )?;
771 writeln!(
772 f,
773 " Use SoC Lifecycle State: {}",
774 match ({ self.flags }).use_soc_lifecycle_state() {
775 Ok(v) => format!("{}", v),
776 Err(v) => format!("/* Unknown */ ({:#04b})", v),
777 }
778 )?;
779 writeln!(
780 f,
781 " Use OEM Lifecycle State: {}",
782 match ({ self.flags }).use_oem_lifecycle_state() {
783 Ok(v) => format!("{}", v),
784 Err(v) => format!("/* Unknown */ ({:#04b})", v),
785 }
786 )?;
787 writeln!(
788 f,
789 " Use OEM Root Certificate Hash: {}",
790 match ({ self.flags }).use_oem_root_cert_hash() {
791 Ok(v) => format!("{}", v),
792 Err(v) => format!("/* Unknown */ ({:#04b})", v),
793 }
794 )?;
795 writeln!(
796 f,
797 " JTAG Debug: {}",
798 match ({ self.flags }).debug() {
799 Ok(false) => "Nop (0b01)".to_string(),
800 Ok(true) => "Disabled (0b10)".to_string(),
801 Err(v) => format!("/* Unknown */ ({:#04b})", v),
802 }
803 )?;
804 write!(
805 f,
806 " RoT (Root of Trust): {}",
807 match ({ self.flags }).rot_en() {
808 Ok(v) => format!("{}", v),
809 Err(v) => format!("/* Unknown */ ({:#04b})", v),
810 }
811 )
812 }
813}
814
815impl std::fmt::Display for Metadata {
816 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
817 match self {
818 Metadata::Len120(metadata) => metadata.fmt(f),
819 Metadata::Len224(metadata) => metadata.fmt(f),
820 }
821 }
822}
823
824impl From<u32> for QtiFlagsV6 {
825 fn from(value: u32) -> Self {
826 Self(value)
827 }
828}
829
830impl From<QtiFlagsV6> for u32 {
831 fn from(value: QtiFlagsV6) -> Self {
832 value.0
833 }
834}
835
836impl From<u32> for QtiFlagsV7 {
837 fn from(value: u32) -> Self {
838 Self(value)
839 }
840}
841
842impl From<QtiFlagsV7> for u32 {
843 fn from(value: QtiFlagsV7) -> Self {
844 value.0
845 }
846}
847
848impl From<[u8; size_of::<Self>()]> for CommonMetadata {
849 fn from(value: [u8; size_of::<Self>()]) -> Self {
850 unsafe { std::mem::transmute(value) }
851 }
852}
853
854impl From<CommonMetadata> for [u8; 24] {
855 fn from(value: CommonMetadata) -> Self {
856 unsafe { std::mem::transmute(value) }
857 }
858}
859
860impl ByteRead for CommonMetadata {
861 fn read(buffer: &ByteReader<'_>) -> crate::Result<(Self, usize)> {
862 Ok((
863 From::<[u8; std::mem::size_of::<Self>()]>::from(
864 buffer
865 .current()
866 .get(0..std::mem::size_of::<Self>())
867 .ok_or(ParseError::InputUnexpectedTermination)?
868 .try_into()
869 .unwrap(),
870 ),
871 std::mem::size_of::<Self>(),
872 ))
873 }
874}
875
876impl From<[u8; size_of::<Self>()]> for MetadataLen120 {
877 fn from(value: [u8; size_of::<Self>()]) -> Self {
878 unsafe { std::mem::transmute(value) }
879 }
880}
881
882impl From<MetadataLen120> for [u8; 120] {
883 fn from(value: MetadataLen120) -> Self {
884 unsafe { std::mem::transmute(value) }
885 }
886}
887
888impl ByteRead for MetadataLen120 {
889 fn read(buffer: &ByteReader<'_>) -> crate::Result<(Self, usize)> {
890 Ok((
891 From::<[u8; std::mem::size_of::<Self>()]>::from(
892 buffer
893 .current()
894 .get(0..std::mem::size_of::<Self>())
895 .ok_or(ParseError::InputUnexpectedTermination)?
896 .try_into()
897 .unwrap(),
898 ),
899 std::mem::size_of::<Self>(),
900 ))
901 }
902}
903
904impl From<[u8; size_of::<Self>()]> for MetadataLen224 {
905 fn from(value: [u8; size_of::<Self>()]) -> Self {
906 unsafe { std::mem::transmute(value) }
907 }
908}
909
910impl From<MetadataLen224> for [u8; 224] {
911 fn from(value: MetadataLen224) -> Self {
912 unsafe { std::mem::transmute(value) }
913 }
914}
915
916impl ByteRead for MetadataLen224 {
917 fn read(buffer: &ByteReader<'_>) -> crate::Result<(Self, usize)> {
918 Ok((
919 From::<[u8; std::mem::size_of::<Self>()]>::from(
920 buffer
921 .current()
922 .get(0..std::mem::size_of::<Self>())
923 .ok_or(ParseError::InputUnexpectedTermination)?
924 .try_into()
925 .unwrap(),
926 ),
927 std::mem::size_of::<Self>(),
928 ))
929 }
930}