mirror of
https://github.com/PabloMK7/citra.git
synced 2025-09-11 13:20:04 +00:00
Move MiiData to its own namespace and add ChecksummedMiiData (#6824)
* Move mii to own namespace and add checksummed mii data * Fix compile issues * Make mii classes trivial and add cast operator * Fix Android side * Add new line at the end of files. * Make miidata a struct and crc16 a u32_be as per switch code. * Apply suggestions * Change back crc to u16 and set padding to 0.
This commit is contained in:
parent
f8b8b6e53c
commit
35e208b447
13 changed files with 308 additions and 133 deletions
|
@ -86,8 +86,6 @@ NTAG215File NfcDataToEncodedData(const EncryptedNTAG215File& nfc_data) {
|
|||
encoded_data.amiibo_version = nfc_data.user_memory.amiibo_version;
|
||||
encoded_data.settings = nfc_data.user_memory.settings;
|
||||
encoded_data.owner_mii = nfc_data.user_memory.owner_mii;
|
||||
encoded_data.padding = nfc_data.user_memory.padding;
|
||||
encoded_data.owner_mii_aes_ccm = nfc_data.user_memory.owner_mii_aes_ccm;
|
||||
encoded_data.application_id = nfc_data.user_memory.application_id;
|
||||
encoded_data.application_write_counter = nfc_data.user_memory.application_write_counter;
|
||||
encoded_data.application_area_id = nfc_data.user_memory.application_area_id;
|
||||
|
@ -123,8 +121,6 @@ EncryptedNTAG215File EncodedDataToNfcData(const NTAG215File& encoded_data) {
|
|||
nfc_data.user_memory.amiibo_version = encoded_data.amiibo_version;
|
||||
nfc_data.user_memory.settings = encoded_data.settings;
|
||||
nfc_data.user_memory.owner_mii = encoded_data.owner_mii;
|
||||
nfc_data.user_memory.padding = encoded_data.padding;
|
||||
nfc_data.user_memory.owner_mii_aes_ccm = encoded_data.owner_mii_aes_ccm;
|
||||
nfc_data.user_memory.application_id = encoded_data.application_id;
|
||||
nfc_data.user_memory.application_write_counter = encoded_data.application_write_counter;
|
||||
nfc_data.user_memory.application_area_id = encoded_data.application_area_id;
|
||||
|
|
|
@ -539,7 +539,6 @@ ResultCode NfcDevice::GetRegisterInfo(RegisterInfo& register_info) const {
|
|||
// TODO: Validate this data
|
||||
register_info = {
|
||||
.mii_data = tag.file.owner_mii,
|
||||
.owner_mii_aes_ccm = tag.file.owner_mii_aes_ccm,
|
||||
.amiibo_name = settings.amiibo_name,
|
||||
.flags = static_cast<u8>(settings.settings.raw & 0xf),
|
||||
.font_region = settings.country_code_id,
|
||||
|
@ -628,8 +627,7 @@ ResultCode NfcDevice::DeleteRegisterInfo() {
|
|||
}
|
||||
|
||||
CryptoPP::AutoSeededRandomPool rng;
|
||||
const std::size_t mii_data_size =
|
||||
sizeof(tag.file.owner_mii) + sizeof(tag.file.padding) + sizeof(tag.file.owner_mii_aes_ccm);
|
||||
const std::size_t mii_data_size = sizeof(tag.file.owner_mii);
|
||||
std::array<CryptoPP::byte, mii_data_size> buffer{};
|
||||
rng.GenerateBlock(buffer.data(), mii_data_size);
|
||||
|
||||
|
@ -664,12 +662,9 @@ ResultCode NfcDevice::SetRegisterInfoPrivate(const RegisterInfoPrivate& register
|
|||
settings.write_date = GetAmiiboDate();
|
||||
}
|
||||
|
||||
// Calculate mii CRC with the padding
|
||||
tag.file.owner_mii_aes_ccm = boost::crc<16, 0x1021, 0, 0, false, false>(
|
||||
®ister_info.mii_data, sizeof(HLE::Applets::MiiData) + sizeof(u16));
|
||||
|
||||
settings.amiibo_name = register_info.amiibo_name;
|
||||
tag.file.owner_mii = register_info.mii_data;
|
||||
tag.file.owner_mii.FixChecksum();
|
||||
tag.file.mii_extension = {};
|
||||
tag.file.unknown = 0;
|
||||
tag.file.unknown2 = {};
|
||||
|
@ -1061,9 +1056,7 @@ void NfcDevice::UpdateSettingsCrc() {
|
|||
void NfcDevice::UpdateRegisterInfoCrc() {
|
||||
#pragma pack(push, 1)
|
||||
struct CrcData {
|
||||
HLE::Applets::MiiData mii;
|
||||
INSERT_PADDING_BYTES(0x2);
|
||||
u16 mii_crc;
|
||||
Mii::ChecksummedMiiData mii;
|
||||
u8 application_id_byte;
|
||||
u8 unknown;
|
||||
u64 mii_extension;
|
||||
|
@ -1074,7 +1067,6 @@ void NfcDevice::UpdateRegisterInfoCrc() {
|
|||
|
||||
const CrcData crc_data{
|
||||
.mii = tag.file.owner_mii,
|
||||
.mii_crc = tag.file.owner_mii_aes_ccm,
|
||||
.application_id_byte = tag.file.application_id_byte,
|
||||
.unknown = tag.file.unknown,
|
||||
.mii_extension = tag.file.mii_extension,
|
||||
|
@ -1102,8 +1094,6 @@ void NfcDevice::BuildAmiiboWithoutKeys() {
|
|||
settings.settings.font_region.Assign(0);
|
||||
settings.init_date = GetAmiiboDate();
|
||||
tag.file.owner_mii = default_mii.selected_mii_data;
|
||||
tag.file.padding = default_mii.unknown1;
|
||||
tag.file.owner_mii_aes_ccm = default_mii.mii_data_checksum;
|
||||
|
||||
// Admin info
|
||||
settings.settings.amiibo_initialized.Assign(1);
|
||||
|
|
|
@ -269,20 +269,18 @@ static_assert(sizeof(NTAG215Password) == 0x8, "NTAG215Password is an invalid siz
|
|||
|
||||
#pragma pack(1)
|
||||
struct EncryptedAmiiboFile {
|
||||
u8 constant_value; // Must be A5
|
||||
u16_be write_counter; // Number of times the amiibo has been written?
|
||||
u8 amiibo_version; // Amiibo file version
|
||||
AmiiboSettings settings; // Encrypted amiibo settings
|
||||
HashData hmac_tag; // Hash
|
||||
AmiiboModelInfo model_info; // Encrypted amiibo model info
|
||||
HashData keygen_salt; // Salt
|
||||
HashData hmac_data; // Hash
|
||||
HLE::Applets::MiiData owner_mii; // Encrypted Mii data
|
||||
u16 padding; // Mii Padding
|
||||
u16_be owner_mii_aes_ccm; // Mii data AES-CCM MAC
|
||||
u64_be application_id; // Encrypted Game id
|
||||
u16_be application_write_counter; // Encrypted Counter
|
||||
u32_be application_area_id; // Encrypted Game id
|
||||
u8 constant_value; // Must be A5
|
||||
u16_be write_counter; // Number of times the amiibo has been written?
|
||||
u8 amiibo_version; // Amiibo file version
|
||||
AmiiboSettings settings; // Encrypted amiibo settings
|
||||
HashData hmac_tag; // Hash
|
||||
AmiiboModelInfo model_info; // Encrypted amiibo model info
|
||||
HashData keygen_salt; // Salt
|
||||
HashData hmac_data; // Hash
|
||||
Mii::ChecksummedMiiData owner_mii; // Encrypted Mii data
|
||||
u64_be application_id; // Encrypted Game id
|
||||
u16_be application_write_counter; // Encrypted Counter
|
||||
u32_be application_area_id; // Encrypted Game id
|
||||
u8 application_id_byte;
|
||||
u8 unknown;
|
||||
u64 mii_extension;
|
||||
|
@ -301,11 +299,9 @@ struct NTAG215File {
|
|||
u16_be write_counter; // Number of times the amiibo has been written?
|
||||
u8 amiibo_version; // Amiibo file version
|
||||
AmiiboSettings settings;
|
||||
HLE::Applets::MiiData owner_mii; // Mii data
|
||||
u16 padding; // Mii Padding
|
||||
u16_be owner_mii_aes_ccm; // Mii data AES-CCM MAC
|
||||
u64_be application_id; // Game id
|
||||
u16_be application_write_counter; // Counter
|
||||
Mii::ChecksummedMiiData owner_mii; // Mii data
|
||||
u64_be application_id; // Game id
|
||||
u16_be application_write_counter; // Counter
|
||||
u32_be application_area_id;
|
||||
u8 application_id_byte;
|
||||
u8 unknown;
|
||||
|
@ -417,9 +413,7 @@ struct ModelInfo {
|
|||
static_assert(sizeof(ModelInfo) == 0x36, "ModelInfo is an invalid size");
|
||||
|
||||
struct RegisterInfo {
|
||||
HLE::Applets::MiiData mii_data;
|
||||
INSERT_PADDING_BYTES(0x2);
|
||||
u16_be owner_mii_aes_ccm; // Mii data AES-CCM MAC
|
||||
Mii::ChecksummedMiiData mii_data;
|
||||
AmiiboName amiibo_name;
|
||||
INSERT_PADDING_BYTES(0x2); // Zero string terminator
|
||||
u8 flags;
|
||||
|
@ -430,9 +424,7 @@ struct RegisterInfo {
|
|||
static_assert(sizeof(RegisterInfo) == 0xA8, "RegisterInfo is an invalid size");
|
||||
|
||||
struct RegisterInfoPrivate {
|
||||
HLE::Applets::MiiData mii_data;
|
||||
INSERT_PADDING_BYTES(0x2);
|
||||
u16_be owner_mii_aes_ccm; // Mii data AES-CCM MAC
|
||||
Mii::ChecksummedMiiData mii_data;
|
||||
AmiiboName amiibo_name;
|
||||
INSERT_PADDING_BYTES(0x2); // Zero string terminator
|
||||
u8 flags;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue