Rewrite VSS and VSS2 NVRAM variable parsers in KaitaiStruct

This commit is contained in:
Nikolaj Schlej 2025-02-22 11:19:41 +07:00
parent eec2a0bd7c
commit a027a8edae
11 changed files with 1430 additions and 40 deletions

View file

@ -8,6 +8,7 @@ edk2_vss_t::edk2_vss_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent, edk2_
m__root = this; (void)p__root;
m_body = nullptr;
m__io__raw_body = nullptr;
f_len_vss_store_header = false;
_read();
}
@ -19,11 +20,11 @@ void edk2_vss_t::_read() {
throw kaitai::validation_expr_error<uint32_t>(signature(), _io(), std::string("/seq/0"));
}
}
m_size = m__io->read_u4le();
m_vss_size = m__io->read_u4le();
{
uint32_t _ = size();
if (!(_ > (4 * 4))) {
throw kaitai::validation_expr_error<uint32_t>(size(), _io(), std::string("/seq/1"));
uint32_t _ = vss_size();
if (!( ((_ > len_vss_store_header()) && (_ < 4294967295UL)) )) {
throw kaitai::validation_expr_error<uint32_t>(vss_size(), _io(), std::string("/seq/1"));
}
}
m_format = m__io->read_u1();
@ -36,7 +37,7 @@ void edk2_vss_t::_read() {
m_state = m__io->read_u1();
m_reserved = m__io->read_u2le();
m_reserved1 = m__io->read_u4le();
m__raw_body = m__io->read_bytes((size() - (4 * 4)));
m__raw_body = m__io->read_bytes((vss_size() - len_vss_store_header()));
m__io__raw_body = std::unique_ptr<kaitai::kstream>(new kaitai::kstream(m__raw_body));
m_body = std::unique_ptr<vss_store_body_t>(new vss_store_body_t(m__io__raw_body.get(), this, m__root));
}
@ -104,6 +105,13 @@ edk2_vss_t::vss_variable_t::vss_variable_t(kaitai::kstream* p__io, edk2_vss_t::v
m__parent = p__parent;
m__root = p__root;
m_attributes = nullptr;
f_is_auth = false;
f_len_standard_header = false;
f_is_intel_legacy = false;
f_len_auth_header = false;
f_len_apple_header = false;
f_len_intel_legacy_header = false;
f_is_valid = false;
_read();
}
@ -135,35 +143,105 @@ void edk2_vss_t::vss_variable_t::_read() {
n_attributes = false;
m_attributes = std::unique_ptr<vss_variable_attributes_t>(new vss_variable_attributes_t(m__io, this, m__root));
}
n_len_total = true;
if ( ((signature_first() == 170) && (is_intel_legacy())) ) {
n_len_total = false;
m_len_total = m__io->read_u4le();
{
uint32_t _ = len_total();
if (!(_ >= ((len_intel_legacy_header() + 4) + 1))) {
throw kaitai::validation_expr_error<uint32_t>(len_total(), _io(), std::string("/types/vss_variable/seq/5"));
}
}
}
n_len_name = true;
if (signature_first() == 170) {
if ( ((signature_first() == 170) && (!(is_intel_legacy()))) ) {
n_len_name = false;
m_len_name = m__io->read_u4le();
}
n_len_data = true;
if (signature_first() == 170) {
if ( ((signature_first() == 170) && (!(is_intel_legacy()))) ) {
n_len_data = false;
m_len_data = m__io->read_u4le();
}
n_timestamp = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_timestamp = false;
m_timestamp = m__io->read_bytes(16);
}
n_pubkey_index = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_pubkey_index = false;
m_pubkey_index = m__io->read_u4le();
}
n_len_name_auth = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_len_name_auth = false;
m_len_name_auth = m__io->read_u4le();
{
uint32_t _ = len_name_auth();
if (!( ((_ >= 4) && (kaitai::kstream::mod(_, 2) == 0)) )) {
throw kaitai::validation_expr_error<uint32_t>(len_name_auth(), _io(), std::string("/types/vss_variable/seq/10"));
}
}
}
n_len_data_auth = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_len_data_auth = false;
m_len_data_auth = m__io->read_u4le();
{
uint32_t _ = len_data_auth();
if (!(_ > 0)) {
throw kaitai::validation_expr_error<uint32_t>(len_data_auth(), _io(), std::string("/types/vss_variable/seq/11"));
}
}
}
n_vendor_guid = true;
if (signature_first() == 170) {
n_vendor_guid = false;
m_vendor_guid = m__io->read_bytes(16);
}
n_name_auth = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_name_auth = false;
m_name_auth = m__io->read_bytes(len_name_auth());
}
n_data_auth = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_data_auth = false;
m_data_auth = m__io->read_bytes(len_data_auth());
}
n_apple_data_crc32 = true;
if ( ((signature_first() == 170) && (attributes()->apple_data_checksum())) ) {
if ( ((signature_first() == 170) && (!(is_intel_legacy())) && (!(is_auth())) && (attributes()->apple_data_checksum())) ) {
n_apple_data_crc32 = false;
m_apple_data_crc32 = m__io->read_u4le();
}
n_intel_legacy_data = true;
if ( ((signature_first() == 170) && (is_intel_legacy())) ) {
n_intel_legacy_data = false;
m_intel_legacy_data = m__io->read_bytes((len_total() - len_intel_legacy_header()));
}
n_name = true;
if (signature_first() == 170) {
if ( ((signature_first() == 170) && (!(is_intel_legacy())) && (!(is_auth()))) ) {
n_name = false;
m_name = m__io->read_bytes(len_name());
{
std::string _ = name();
if (!( ((len_name() >= 4) && (kaitai::kstream::mod(len_name(), 2) == 0)) )) {
throw kaitai::validation_expr_error<std::string>(name(), _io(), std::string("/types/vss_variable/seq/17"));
}
}
}
n_data = true;
if (signature_first() == 170) {
if ( ((signature_first() == 170) && (!(is_intel_legacy())) && (!(is_auth()))) ) {
n_data = false;
m_data = m__io->read_bytes(len_data());
{
std::string _ = data();
if (!(len_name() > 0)) {
throw kaitai::validation_expr_error<std::string>(data(), _io(), std::string("/types/vss_variable/seq/18"));
}
}
}
}
@ -180,16 +258,96 @@ void edk2_vss_t::vss_variable_t::_clean_up() {
}
if (!n_attributes) {
}
if (!n_len_total) {
}
if (!n_len_name) {
}
if (!n_len_data) {
}
if (!n_timestamp) {
}
if (!n_pubkey_index) {
}
if (!n_len_name_auth) {
}
if (!n_len_data_auth) {
}
if (!n_vendor_guid) {
}
if (!n_name_auth) {
}
if (!n_data_auth) {
}
if (!n_apple_data_crc32) {
}
if (!n_intel_legacy_data) {
}
if (!n_name) {
}
if (!n_data) {
}
}
bool edk2_vss_t::vss_variable_t::is_auth() {
if (f_is_auth)
return m_is_auth;
m_is_auth = ((state() != 248) && (state() != 252) && ( (( ((attributes()->auth_write()) || (attributes()->time_based_auth()) || (attributes()->append_write())) ) || ( ((len_name() == 0) || (len_data() == 0)) )) )) ;
f_is_auth = true;
return m_is_auth;
}
int8_t edk2_vss_t::vss_variable_t::len_standard_header() {
if (f_len_standard_header)
return m_len_standard_header;
m_len_standard_header = 32;
f_len_standard_header = true;
return m_len_standard_header;
}
bool edk2_vss_t::vss_variable_t::is_intel_legacy() {
if (f_is_intel_legacy)
return m_is_intel_legacy;
m_is_intel_legacy = ((state() == 248) || (state() == 252)) ;
f_is_intel_legacy = true;
return m_is_intel_legacy;
}
int8_t edk2_vss_t::vss_variable_t::len_auth_header() {
if (f_len_auth_header)
return m_len_auth_header;
m_len_auth_header = 60;
f_len_auth_header = true;
return m_len_auth_header;
}
int8_t edk2_vss_t::vss_variable_t::len_apple_header() {
if (f_len_apple_header)
return m_len_apple_header;
m_len_apple_header = 36;
f_len_apple_header = true;
return m_len_apple_header;
}
int8_t edk2_vss_t::vss_variable_t::len_intel_legacy_header() {
if (f_len_intel_legacy_header)
return m_len_intel_legacy_header;
m_len_intel_legacy_header = 28;
f_len_intel_legacy_header = true;
return m_len_intel_legacy_header;
}
bool edk2_vss_t::vss_variable_t::is_valid() {
if (f_is_valid)
return m_is_valid;
m_is_valid = ((state() == 252) || (state() == 127) || (state() == 63)) ;
f_is_valid = true;
return m_is_valid;
}
int8_t edk2_vss_t::len_vss_store_header() {
if (f_len_vss_store_header)
return m_len_vss_store_header;
m_len_vss_store_header = 16;
f_len_vss_store_header = true;
return m_len_vss_store_header;
}

View file

@ -104,6 +104,55 @@ public:
public:
~vss_variable_t();
private:
bool f_is_auth;
bool m_is_auth;
public:
bool is_auth();
private:
bool f_len_standard_header;
int8_t m_len_standard_header;
public:
int8_t len_standard_header();
private:
bool f_is_intel_legacy;
bool m_is_intel_legacy;
public:
bool is_intel_legacy();
private:
bool f_len_auth_header;
int8_t m_len_auth_header;
public:
int8_t len_auth_header();
private:
bool f_len_apple_header;
int8_t m_len_apple_header;
public:
int8_t len_apple_header();
private:
bool f_len_intel_legacy_header;
int8_t m_len_intel_legacy_header;
public:
int8_t len_intel_legacy_header();
private:
bool f_is_valid;
bool m_is_valid;
public:
bool is_valid();
private:
uint8_t m_signature_first;
uint8_t m_signature_last;
@ -133,6 +182,13 @@ public:
public:
bool _is_null_attributes() { attributes(); return n_attributes; };
private:
uint32_t m_len_total;
bool n_len_total;
public:
bool _is_null_len_total() { len_total(); return n_len_total; };
private:
uint32_t m_len_name;
bool n_len_name;
@ -147,6 +203,34 @@ public:
public:
bool _is_null_len_data() { len_data(); return n_len_data; };
private:
std::string m_timestamp;
bool n_timestamp;
public:
bool _is_null_timestamp() { timestamp(); return n_timestamp; };
private:
uint32_t m_pubkey_index;
bool n_pubkey_index;
public:
bool _is_null_pubkey_index() { pubkey_index(); return n_pubkey_index; };
private:
uint32_t m_len_name_auth;
bool n_len_name_auth;
public:
bool _is_null_len_name_auth() { len_name_auth(); return n_len_name_auth; };
private:
uint32_t m_len_data_auth;
bool n_len_data_auth;
public:
bool _is_null_len_data_auth() { len_data_auth(); return n_len_data_auth; };
private:
std::string m_vendor_guid;
bool n_vendor_guid;
@ -154,6 +238,20 @@ public:
public:
bool _is_null_vendor_guid() { vendor_guid(); return n_vendor_guid; };
private:
std::string m_name_auth;
bool n_name_auth;
public:
bool _is_null_name_auth() { name_auth(); return n_name_auth; };
private:
std::string m_data_auth;
bool n_data_auth;
public:
bool _is_null_data_auth() { data_auth(); return n_data_auth; };
private:
uint32_t m_apple_data_crc32;
bool n_apple_data_crc32;
@ -161,6 +259,13 @@ public:
public:
bool _is_null_apple_data_crc32() { apple_data_crc32(); return n_apple_data_crc32; };
private:
std::string m_intel_legacy_data;
bool n_intel_legacy_data;
public:
bool _is_null_intel_legacy_data() { intel_legacy_data(); return n_intel_legacy_data; };
private:
std::string m_name;
bool n_name;
@ -185,19 +290,34 @@ public:
uint8_t state() const { return m_state; }
uint8_t reserved() const { return m_reserved; }
vss_variable_attributes_t* attributes() const { return m_attributes.get(); }
uint32_t len_total() const { return m_len_total; }
uint32_t len_name() const { return m_len_name; }
uint32_t len_data() const { return m_len_data; }
std::string timestamp() const { return m_timestamp; }
uint32_t pubkey_index() const { return m_pubkey_index; }
uint32_t len_name_auth() const { return m_len_name_auth; }
uint32_t len_data_auth() const { return m_len_data_auth; }
std::string vendor_guid() const { return m_vendor_guid; }
std::string name_auth() const { return m_name_auth; }
std::string data_auth() const { return m_data_auth; }
uint32_t apple_data_crc32() const { return m_apple_data_crc32; }
std::string intel_legacy_data() const { return m_intel_legacy_data; }
std::string name() const { return m_name; }
std::string data() const { return m_data; }
edk2_vss_t* _root() const { return m__root; }
edk2_vss_t::vss_store_body_t* _parent() const { return m__parent; }
};
private:
bool f_len_vss_store_header;
int8_t m_len_vss_store_header;
public:
int8_t len_vss_store_header();
private:
uint32_t m_signature;
uint32_t m_size;
uint32_t m_vss_size;
uint8_t m_format;
uint8_t m_state;
uint16_t m_reserved;
@ -210,7 +330,7 @@ private:
public:
uint32_t signature() const { return m_signature; }
uint32_t size() const { return m_size; }
uint32_t vss_size() const { return m_vss_size; }
uint8_t format() const { return m_format; }
uint8_t state() const { return m_state; }
uint16_t reserved() const { return m_reserved; }

View file

@ -0,0 +1,347 @@
// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
#include "phoenix_vss2.h"
#include "../kaitai/exceptions.h"
phoenix_vss2_t::phoenix_vss2_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent, phoenix_vss2_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = this; (void)p__root;
m_body = nullptr;
m__io__raw_body = nullptr;
f_header_size = false;
_read();
}
void phoenix_vss2_t::_read() {
m_signature = m__io->read_u4le();
{
uint32_t _ = signature();
if (!( ((_ == 3721344535UL) || (_ == 2868063352UL)) )) {
throw kaitai::validation_expr_error<uint32_t>(signature(), _io(), std::string("/seq/0"));
}
}
n_signature_auth_var_key_db = true;
if (signature() == 2868063352UL) {
n_signature_auth_var_key_db = false;
m_signature_auth_var_key_db = m__io->read_bytes(12);
if (!(signature_auth_var_key_db() == std::string("\x7B\x94\x9A\x43\xA1\x80\x2E\x14\x4E\xC3\x77\x92", 12))) {
throw kaitai::validation_not_equal_error<std::string>(std::string("\x7B\x94\x9A\x43\xA1\x80\x2E\x14\x4E\xC3\x77\x92", 12), signature_auth_var_key_db(), _io(), std::string("/seq/1"));
}
}
n_signature_vss2_store = true;
if (signature() == 3721344535UL) {
n_signature_vss2_store = false;
m_signature_vss2_store = m__io->read_bytes(12);
if (!(signature_vss2_store() == std::string("\x75\x32\x64\x41\x98\xB6\xFE\x85\x70\x7F\xFE\x7D", 12))) {
throw kaitai::validation_not_equal_error<std::string>(std::string("\x75\x32\x64\x41\x98\xB6\xFE\x85\x70\x7F\xFE\x7D", 12), signature_vss2_store(), _io(), std::string("/seq/2"));
}
}
m_vss2_size = m__io->read_u4le();
{
uint32_t _ = vss2_size();
if (!( ((_ > header_size()) && (_ < 4294967295UL)) )) {
throw kaitai::validation_expr_error<uint32_t>(vss2_size(), _io(), std::string("/seq/3"));
}
}
m_format = m__io->read_u1();
{
uint8_t _ = format();
if (!(_ == 90)) {
throw kaitai::validation_expr_error<uint8_t>(format(), _io(), std::string("/seq/4"));
}
}
m_state = m__io->read_u1();
m_reserved = m__io->read_u2le();
m_reserved1 = m__io->read_u4le();
m__raw_body = m__io->read_bytes((vss2_size() - header_size()));
m__io__raw_body = std::unique_ptr<kaitai::kstream>(new kaitai::kstream(m__raw_body));
m_body = std::unique_ptr<vss2_store_body_t>(new vss2_store_body_t(m__io__raw_body.get(), this, m__root));
}
phoenix_vss2_t::~phoenix_vss2_t() {
_clean_up();
}
void phoenix_vss2_t::_clean_up() {
if (!n_signature_auth_var_key_db) {
}
if (!n_signature_vss2_store) {
}
}
phoenix_vss2_t::vss2_store_body_t::vss2_store_body_t(kaitai::kstream* p__io, phoenix_vss2_t* p__parent, phoenix_vss2_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_variables = nullptr;
_read();
}
void phoenix_vss2_t::vss2_store_body_t::_read() {
m_variables = std::unique_ptr<std::vector<std::unique_ptr<vss2_variable_t>>>(new std::vector<std::unique_ptr<vss2_variable_t>>());
{
int i = 0;
vss2_variable_t* _;
do {
_ = new vss2_variable_t(m__io, this, m__root);
m_variables->push_back(std::move(std::unique_ptr<vss2_variable_t>(_)));
i++;
} while (!( ((_->signature_first() != 170) || (_io()->is_eof())) ));
}
}
phoenix_vss2_t::vss2_store_body_t::~vss2_store_body_t() {
_clean_up();
}
void phoenix_vss2_t::vss2_store_body_t::_clean_up() {
}
phoenix_vss2_t::vss2_variable_attributes_t::vss2_variable_attributes_t(kaitai::kstream* p__io, phoenix_vss2_t::vss2_variable_t* p__parent, phoenix_vss2_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
_read();
}
void phoenix_vss2_t::vss2_variable_attributes_t::_read() {
m_non_volatile = m__io->read_bits_int_le(1);
m_boot_service = m__io->read_bits_int_le(1);
m_runtime = m__io->read_bits_int_le(1);
m_hw_error_record = m__io->read_bits_int_le(1);
m_auth_write = m__io->read_bits_int_le(1);
m_time_based_auth = m__io->read_bits_int_le(1);
m_append_write = m__io->read_bits_int_le(1);
m_reserved = m__io->read_bits_int_le(25);
}
phoenix_vss2_t::vss2_variable_attributes_t::~vss2_variable_attributes_t() {
_clean_up();
}
void phoenix_vss2_t::vss2_variable_attributes_t::_clean_up() {
}
phoenix_vss2_t::vss2_variable_t::vss2_variable_t(kaitai::kstream* p__io, phoenix_vss2_t::vss2_store_body_t* p__parent, phoenix_vss2_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_attributes = nullptr;
f_is_auth = false;
f_end_offset_auth = false;
f_len_alignment_padding = false;
f_end_offset = false;
f_len_alignment_padding_auth = false;
f_offset = false;
_read();
}
void phoenix_vss2_t::vss2_variable_t::_read() {
n_invoke_offset = true;
if (offset() >= 0) {
n_invoke_offset = false;
m_invoke_offset = m__io->read_bytes(0);
}
m_signature_first = m__io->read_u1();
n_signature_last = true;
if (signature_first() == 170) {
n_signature_last = false;
m_signature_last = m__io->read_u1();
{
uint8_t _ = signature_last();
if (!(_ == 85)) {
throw kaitai::validation_expr_error<uint8_t>(signature_last(), _io(), std::string("/types/vss2_variable/seq/2"));
}
}
}
n_state = true;
if (signature_first() == 170) {
n_state = false;
m_state = m__io->read_u1();
}
n_reserved = true;
if (signature_first() == 170) {
n_reserved = false;
m_reserved = m__io->read_u1();
}
n_attributes = true;
if (signature_first() == 170) {
n_attributes = false;
m_attributes = std::unique_ptr<vss2_variable_attributes_t>(new vss2_variable_attributes_t(m__io, this, m__root));
}
n_len_name = true;
if (signature_first() == 170) {
n_len_name = false;
m_len_name = m__io->read_u4le();
}
n_len_data = true;
if (signature_first() == 170) {
n_len_data = false;
m_len_data = m__io->read_u4le();
}
n_timestamp = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_timestamp = false;
m_timestamp = m__io->read_bytes(16);
}
n_pubkey_index = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_pubkey_index = false;
m_pubkey_index = m__io->read_u4le();
}
n_len_name_auth = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_len_name_auth = false;
m_len_name_auth = m__io->read_u4le();
}
n_len_data_auth = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_len_data_auth = false;
m_len_data_auth = m__io->read_u4le();
}
n_vendor_guid = true;
if (signature_first() == 170) {
n_vendor_guid = false;
m_vendor_guid = m__io->read_bytes(16);
}
n_name_auth = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_name_auth = false;
m_name_auth = m__io->read_bytes(len_name_auth());
}
n_data_auth = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_data_auth = false;
m_data_auth = m__io->read_bytes(len_data_auth());
}
n_invoke_end_offset_auth = true;
if ( ((signature_first() == 170) && (is_auth()) && (end_offset_auth() >= 0)) ) {
n_invoke_end_offset_auth = false;
m_invoke_end_offset_auth = m__io->read_bytes(0);
}
n_alignment_padding_auth = true;
if ( ((signature_first() == 170) && (is_auth())) ) {
n_alignment_padding_auth = false;
m_alignment_padding_auth = m__io->read_bytes(len_alignment_padding_auth());
}
n_name = true;
if ( ((signature_first() == 170) && (!(is_auth()))) ) {
n_name = false;
m_name = m__io->read_bytes(len_name());
}
n_data = true;
if ( ((signature_first() == 170) && (!(is_auth()))) ) {
n_data = false;
m_data = m__io->read_bytes(len_data());
}
n_invoke_end_offset = true;
if ( ((signature_first() == 170) && (!(is_auth())) && (end_offset() >= 0)) ) {
n_invoke_end_offset = false;
m_invoke_end_offset = m__io->read_bytes(0);
}
n_alignment_padding = true;
if ( ((signature_first() == 170) && (!(is_auth()))) ) {
n_alignment_padding = false;
m_alignment_padding = m__io->read_bytes(len_alignment_padding());
}
}
phoenix_vss2_t::vss2_variable_t::~vss2_variable_t() {
_clean_up();
}
void phoenix_vss2_t::vss2_variable_t::_clean_up() {
if (!n_invoke_offset) {
}
if (!n_signature_last) {
}
if (!n_state) {
}
if (!n_reserved) {
}
if (!n_attributes) {
}
if (!n_len_name) {
}
if (!n_len_data) {
}
if (!n_timestamp) {
}
if (!n_pubkey_index) {
}
if (!n_len_name_auth) {
}
if (!n_len_data_auth) {
}
if (!n_vendor_guid) {
}
if (!n_name_auth) {
}
if (!n_data_auth) {
}
if (!n_invoke_end_offset_auth) {
}
if (!n_alignment_padding_auth) {
}
if (!n_name) {
}
if (!n_data) {
}
if (!n_invoke_end_offset) {
}
if (!n_alignment_padding) {
}
}
bool phoenix_vss2_t::vss2_variable_t::is_auth() {
if (f_is_auth)
return m_is_auth;
m_is_auth = (( ((attributes()->auth_write()) || (attributes()->time_based_auth()) || (attributes()->append_write())) ) || ( ((len_name() == 0) || (len_data() == 0)) )) ;
f_is_auth = true;
return m_is_auth;
}
int32_t phoenix_vss2_t::vss2_variable_t::end_offset_auth() {
if (f_end_offset_auth)
return m_end_offset_auth;
m_end_offset_auth = _io()->pos();
f_end_offset_auth = true;
return m_end_offset_auth;
}
int32_t phoenix_vss2_t::vss2_variable_t::len_alignment_padding() {
if (f_len_alignment_padding)
return m_len_alignment_padding;
m_len_alignment_padding = ((((end_offset() - offset()) + 3) & ~3) - (end_offset() - offset()));
f_len_alignment_padding = true;
return m_len_alignment_padding;
}
int32_t phoenix_vss2_t::vss2_variable_t::end_offset() {
if (f_end_offset)
return m_end_offset;
m_end_offset = _io()->pos();
f_end_offset = true;
return m_end_offset;
}
int32_t phoenix_vss2_t::vss2_variable_t::len_alignment_padding_auth() {
if (f_len_alignment_padding_auth)
return m_len_alignment_padding_auth;
m_len_alignment_padding_auth = ((((end_offset_auth() - offset()) + 3) & ~3) - (end_offset() - offset()));
f_len_alignment_padding_auth = true;
return m_len_alignment_padding_auth;
}
int32_t phoenix_vss2_t::vss2_variable_t::offset() {
if (f_offset)
return m_offset;
m_offset = _io()->pos();
f_offset = true;
return m_offset;
}
int32_t phoenix_vss2_t::header_size() {
if (f_header_size)
return m_header_size;
m_header_size = (7 * 4);
f_header_size = true;
return m_header_size;
}

View file

@ -0,0 +1,366 @@
#pragma once
// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
#include "../kaitai/kaitaistruct.h"
#include <stdint.h>
#include <memory>
#include <vector>
#if KAITAI_STRUCT_VERSION < 9000L
#error "Incompatible Kaitai Struct C++/STL API: version 0.9 or later is required"
#endif
class phoenix_vss2_t : public kaitai::kstruct {
public:
class vss2_store_body_t;
class vss2_variable_attributes_t;
class vss2_variable_t;
phoenix_vss2_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent = nullptr, phoenix_vss2_t* p__root = nullptr);
private:
void _read();
void _clean_up();
public:
~phoenix_vss2_t();
class vss2_store_body_t : public kaitai::kstruct {
public:
vss2_store_body_t(kaitai::kstream* p__io, phoenix_vss2_t* p__parent = nullptr, phoenix_vss2_t* p__root = nullptr);
private:
void _read();
void _clean_up();
public:
~vss2_store_body_t();
private:
std::unique_ptr<std::vector<std::unique_ptr<vss2_variable_t>>> m_variables;
phoenix_vss2_t* m__root;
phoenix_vss2_t* m__parent;
public:
std::vector<std::unique_ptr<vss2_variable_t>>* variables() const { return m_variables.get(); }
phoenix_vss2_t* _root() const { return m__root; }
phoenix_vss2_t* _parent() const { return m__parent; }
};
class vss2_variable_attributes_t : public kaitai::kstruct {
public:
vss2_variable_attributes_t(kaitai::kstream* p__io, phoenix_vss2_t::vss2_variable_t* p__parent = nullptr, phoenix_vss2_t* p__root = nullptr);
private:
void _read();
void _clean_up();
public:
~vss2_variable_attributes_t();
private:
bool m_non_volatile;
bool m_boot_service;
bool m_runtime;
bool m_hw_error_record;
bool m_auth_write;
bool m_time_based_auth;
bool m_append_write;
uint64_t m_reserved;
phoenix_vss2_t* m__root;
phoenix_vss2_t::vss2_variable_t* m__parent;
public:
bool non_volatile() const { return m_non_volatile; }
bool boot_service() const { return m_boot_service; }
bool runtime() const { return m_runtime; }
bool hw_error_record() const { return m_hw_error_record; }
bool auth_write() const { return m_auth_write; }
bool time_based_auth() const { return m_time_based_auth; }
bool append_write() const { return m_append_write; }
uint64_t reserved() const { return m_reserved; }
phoenix_vss2_t* _root() const { return m__root; }
phoenix_vss2_t::vss2_variable_t* _parent() const { return m__parent; }
};
class vss2_variable_t : public kaitai::kstruct {
public:
vss2_variable_t(kaitai::kstream* p__io, phoenix_vss2_t::vss2_store_body_t* p__parent = nullptr, phoenix_vss2_t* p__root = nullptr);
private:
void _read();
void _clean_up();
public:
~vss2_variable_t();
private:
bool f_is_auth;
bool m_is_auth;
public:
bool is_auth();
private:
bool f_end_offset_auth;
int32_t m_end_offset_auth;
public:
int32_t end_offset_auth();
private:
bool f_len_alignment_padding;
int32_t m_len_alignment_padding;
public:
int32_t len_alignment_padding();
private:
bool f_end_offset;
int32_t m_end_offset;
public:
int32_t end_offset();
private:
bool f_len_alignment_padding_auth;
int32_t m_len_alignment_padding_auth;
public:
int32_t len_alignment_padding_auth();
private:
bool f_offset;
int32_t m_offset;
public:
int32_t offset();
private:
std::string m_invoke_offset;
bool n_invoke_offset;
public:
bool _is_null_invoke_offset() { invoke_offset(); return n_invoke_offset; };
private:
uint8_t m_signature_first;
uint8_t m_signature_last;
bool n_signature_last;
public:
bool _is_null_signature_last() { signature_last(); return n_signature_last; };
private:
uint8_t m_state;
bool n_state;
public:
bool _is_null_state() { state(); return n_state; };
private:
uint8_t m_reserved;
bool n_reserved;
public:
bool _is_null_reserved() { reserved(); return n_reserved; };
private:
std::unique_ptr<vss2_variable_attributes_t> m_attributes;
bool n_attributes;
public:
bool _is_null_attributes() { attributes(); return n_attributes; };
private:
uint32_t m_len_name;
bool n_len_name;
public:
bool _is_null_len_name() { len_name(); return n_len_name; };
private:
uint32_t m_len_data;
bool n_len_data;
public:
bool _is_null_len_data() { len_data(); return n_len_data; };
private:
std::string m_timestamp;
bool n_timestamp;
public:
bool _is_null_timestamp() { timestamp(); return n_timestamp; };
private:
uint32_t m_pubkey_index;
bool n_pubkey_index;
public:
bool _is_null_pubkey_index() { pubkey_index(); return n_pubkey_index; };
private:
uint32_t m_len_name_auth;
bool n_len_name_auth;
public:
bool _is_null_len_name_auth() { len_name_auth(); return n_len_name_auth; };
private:
uint32_t m_len_data_auth;
bool n_len_data_auth;
public:
bool _is_null_len_data_auth() { len_data_auth(); return n_len_data_auth; };
private:
std::string m_vendor_guid;
bool n_vendor_guid;
public:
bool _is_null_vendor_guid() { vendor_guid(); return n_vendor_guid; };
private:
std::string m_name_auth;
bool n_name_auth;
public:
bool _is_null_name_auth() { name_auth(); return n_name_auth; };
private:
std::string m_data_auth;
bool n_data_auth;
public:
bool _is_null_data_auth() { data_auth(); return n_data_auth; };
private:
std::string m_invoke_end_offset_auth;
bool n_invoke_end_offset_auth;
public:
bool _is_null_invoke_end_offset_auth() { invoke_end_offset_auth(); return n_invoke_end_offset_auth; };
private:
std::string m_alignment_padding_auth;
bool n_alignment_padding_auth;
public:
bool _is_null_alignment_padding_auth() { alignment_padding_auth(); return n_alignment_padding_auth; };
private:
std::string m_name;
bool n_name;
public:
bool _is_null_name() { name(); return n_name; };
private:
std::string m_data;
bool n_data;
public:
bool _is_null_data() { data(); return n_data; };
private:
std::string m_invoke_end_offset;
bool n_invoke_end_offset;
public:
bool _is_null_invoke_end_offset() { invoke_end_offset(); return n_invoke_end_offset; };
private:
std::string m_alignment_padding;
bool n_alignment_padding;
public:
bool _is_null_alignment_padding() { alignment_padding(); return n_alignment_padding; };
private:
phoenix_vss2_t* m__root;
phoenix_vss2_t::vss2_store_body_t* m__parent;
public:
std::string invoke_offset() const { return m_invoke_offset; }
uint8_t signature_first() const { return m_signature_first; }
uint8_t signature_last() const { return m_signature_last; }
uint8_t state() const { return m_state; }
uint8_t reserved() const { return m_reserved; }
vss2_variable_attributes_t* attributes() const { return m_attributes.get(); }
uint32_t len_name() const { return m_len_name; }
uint32_t len_data() const { return m_len_data; }
std::string timestamp() const { return m_timestamp; }
uint32_t pubkey_index() const { return m_pubkey_index; }
uint32_t len_name_auth() const { return m_len_name_auth; }
uint32_t len_data_auth() const { return m_len_data_auth; }
std::string vendor_guid() const { return m_vendor_guid; }
std::string name_auth() const { return m_name_auth; }
std::string data_auth() const { return m_data_auth; }
std::string invoke_end_offset_auth() const { return m_invoke_end_offset_auth; }
std::string alignment_padding_auth() const { return m_alignment_padding_auth; }
std::string name() const { return m_name; }
std::string data() const { return m_data; }
std::string invoke_end_offset() const { return m_invoke_end_offset; }
std::string alignment_padding() const { return m_alignment_padding; }
phoenix_vss2_t* _root() const { return m__root; }
phoenix_vss2_t::vss2_store_body_t* _parent() const { return m__parent; }
};
private:
bool f_header_size;
int32_t m_header_size;
public:
int32_t header_size();
private:
uint32_t m_signature;
std::string m_signature_auth_var_key_db;
bool n_signature_auth_var_key_db;
public:
bool _is_null_signature_auth_var_key_db() { signature_auth_var_key_db(); return n_signature_auth_var_key_db; };
private:
std::string m_signature_vss2_store;
bool n_signature_vss2_store;
public:
bool _is_null_signature_vss2_store() { signature_vss2_store(); return n_signature_vss2_store; };
private:
uint32_t m_vss2_size;
uint8_t m_format;
uint8_t m_state;
uint16_t m_reserved;
uint32_t m_reserved1;
std::unique_ptr<vss2_store_body_t> m_body;
phoenix_vss2_t* m__root;
kaitai::kstruct* m__parent;
std::string m__raw_body;
std::unique_ptr<kaitai::kstream> m__io__raw_body;
public:
uint32_t signature() const { return m_signature; }
std::string signature_auth_var_key_db() const { return m_signature_auth_var_key_db; }
std::string signature_vss2_store() const { return m_signature_vss2_store; }
uint32_t vss2_size() const { return m_vss2_size; }
uint8_t format() const { return m_format; }
uint8_t state() const { return m_state; }
uint16_t reserved() const { return m_reserved; }
uint32_t reserved1() const { return m_reserved1; }
vss2_store_body_t* body() const { return m_body.get(); }
phoenix_vss2_t* _root() const { return m__root; }
kaitai::kstruct* _parent() const { return m__parent; }
std::string _raw_body() const { return m__raw_body; }
kaitai::kstream* _io__raw_body() const { return m__io__raw_body.get(); }
};