diff options
| author | 2023-03-14 22:00:38 -0600 | |
|---|---|---|
| committer | 2023-03-14 23:42:41 -0600 | |
| commit | 026fe2e4f4128f4c81a07e25cb646620f7643a75 (patch) | |
| tree | f370c2ce9b622ce4571c37d5d0e16f6bd07a0984 | |
| parent | Merge pull request #9933 from vonchenplus/texture_format (diff) | |
| download | yuzu-026fe2e4f4128f4c81a07e25cb646620f7643a75.tar.gz yuzu-026fe2e4f4128f4c81a07e25cb646620f7643a75.tar.xz yuzu-026fe2e4f4128f4c81a07e25cb646620f7643a75.zip | |
service: nfp: Actually write correct crc
| -rw-r--r-- | src/core/hle/service/mii/mii_manager.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/mii/types.h | 3 | ||||
| -rw-r--r-- | src/core/hle/service/nfp/amiibo_crypto.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/service/nfp/nfp_device.cpp | 53 | ||||
| -rw-r--r-- | src/core/hle/service/nfp/nfp_device.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/nfp/nfp_types.h | 4 |
6 files changed, 44 insertions, 23 deletions
diff --git a/src/core/hle/service/mii/mii_manager.cpp b/src/core/hle/service/mii/mii_manager.cpp index 3a2fe938f..9d31a080c 100644 --- a/src/core/hle/service/mii/mii_manager.cpp +++ b/src/core/hle/service/mii/mii_manager.cpp | |||
| @@ -585,6 +585,8 @@ Ver3StoreData MiiManager::ConvertCharInfoToV3(const CharInfo& mii) const { | |||
| 585 | mii_v3.appearance_bits11.mole_x_position.Assign(mii.mole_x); | 585 | mii_v3.appearance_bits11.mole_x_position.Assign(mii.mole_x); |
| 586 | mii_v3.appearance_bits11.mole_y_position.Assign(mii.mole_y); | 586 | mii_v3.appearance_bits11.mole_y_position.Assign(mii.mole_y); |
| 587 | 587 | ||
| 588 | mii_v3.crc = GenerateCrc16(&mii_v3, sizeof(Ver3StoreData) - sizeof(u16)); | ||
| 589 | |||
| 588 | // TODO: Validate mii_v3 data | 590 | // TODO: Validate mii_v3 data |
| 589 | 591 | ||
| 590 | return mii_v3; | 592 | return mii_v3; |
diff --git a/src/core/hle/service/mii/types.h b/src/core/hle/service/mii/types.h index 9e3247397..1f53e6af3 100644 --- a/src/core/hle/service/mii/types.h +++ b/src/core/hle/service/mii/types.h | |||
| @@ -365,7 +365,8 @@ struct Ver3StoreData { | |||
| 365 | } appearance_bits11; | 365 | } appearance_bits11; |
| 366 | 366 | ||
| 367 | std::array<u16_le, 0xA> author_name; | 367 | std::array<u16_le, 0xA> author_name; |
| 368 | INSERT_PADDING_BYTES(0x4); | 368 | INSERT_PADDING_BYTES(0x2); |
| 369 | u16_be crc; | ||
| 369 | }; | 370 | }; |
| 370 | static_assert(sizeof(Ver3StoreData) == 0x60, "Ver3StoreData is an invalid size"); | 371 | static_assert(sizeof(Ver3StoreData) == 0x60, "Ver3StoreData is an invalid size"); |
| 371 | 372 | ||
diff --git a/src/core/hle/service/nfp/amiibo_crypto.cpp b/src/core/hle/service/nfp/amiibo_crypto.cpp index ad73edbda..66773d26c 100644 --- a/src/core/hle/service/nfp/amiibo_crypto.cpp +++ b/src/core/hle/service/nfp/amiibo_crypto.cpp | |||
| @@ -89,7 +89,7 @@ NTAG215File NfcDataToEncodedData(const EncryptedNTAG215File& nfc_data) { | |||
| 89 | encoded_data.application_id_byte = nfc_data.user_memory.application_id_byte; | 89 | encoded_data.application_id_byte = nfc_data.user_memory.application_id_byte; |
| 90 | encoded_data.unknown = nfc_data.user_memory.unknown; | 90 | encoded_data.unknown = nfc_data.user_memory.unknown; |
| 91 | encoded_data.unknown2 = nfc_data.user_memory.unknown2; | 91 | encoded_data.unknown2 = nfc_data.user_memory.unknown2; |
| 92 | encoded_data.application_area_crc = nfc_data.user_memory.application_area_crc; | 92 | encoded_data.register_info_crc = nfc_data.user_memory.register_info_crc; |
| 93 | encoded_data.application_area = nfc_data.user_memory.application_area; | 93 | encoded_data.application_area = nfc_data.user_memory.application_area; |
| 94 | encoded_data.hmac_tag = nfc_data.user_memory.hmac_tag; | 94 | encoded_data.hmac_tag = nfc_data.user_memory.hmac_tag; |
| 95 | encoded_data.lock_bytes = nfc_data.uuid.lock_bytes; | 95 | encoded_data.lock_bytes = nfc_data.uuid.lock_bytes; |
| @@ -123,7 +123,7 @@ EncryptedNTAG215File EncodedDataToNfcData(const NTAG215File& encoded_data) { | |||
| 123 | nfc_data.user_memory.application_id_byte = encoded_data.application_id_byte; | 123 | nfc_data.user_memory.application_id_byte = encoded_data.application_id_byte; |
| 124 | nfc_data.user_memory.unknown = encoded_data.unknown; | 124 | nfc_data.user_memory.unknown = encoded_data.unknown; |
| 125 | nfc_data.user_memory.unknown2 = encoded_data.unknown2; | 125 | nfc_data.user_memory.unknown2 = encoded_data.unknown2; |
| 126 | nfc_data.user_memory.application_area_crc = encoded_data.application_area_crc; | 126 | nfc_data.user_memory.register_info_crc = encoded_data.register_info_crc; |
| 127 | nfc_data.user_memory.application_area = encoded_data.application_area; | 127 | nfc_data.user_memory.application_area = encoded_data.application_area; |
| 128 | nfc_data.user_memory.hmac_tag = encoded_data.hmac_tag; | 128 | nfc_data.user_memory.hmac_tag = encoded_data.hmac_tag; |
| 129 | nfc_data.user_memory.model_info = encoded_data.model_info; | 129 | nfc_data.user_memory.model_info = encoded_data.model_info; |
diff --git a/src/core/hle/service/nfp/nfp_device.cpp b/src/core/hle/service/nfp/nfp_device.cpp index ddff90d6a..53bc56814 100644 --- a/src/core/hle/service/nfp/nfp_device.cpp +++ b/src/core/hle/service/nfp/nfp_device.cpp | |||
| @@ -448,7 +448,7 @@ Result NfpDevice::DeleteRegisterInfo() { | |||
| 448 | rng.GenerateRandomBytes(&tag_data.unknown, sizeof(u8)); | 448 | rng.GenerateRandomBytes(&tag_data.unknown, sizeof(u8)); |
| 449 | rng.GenerateRandomBytes(&tag_data.unknown2[0], sizeof(u32)); | 449 | rng.GenerateRandomBytes(&tag_data.unknown2[0], sizeof(u32)); |
| 450 | rng.GenerateRandomBytes(&tag_data.unknown2[1], sizeof(u32)); | 450 | rng.GenerateRandomBytes(&tag_data.unknown2[1], sizeof(u32)); |
| 451 | rng.GenerateRandomBytes(&tag_data.application_area_crc, sizeof(u32)); | 451 | rng.GenerateRandomBytes(&tag_data.register_info_crc, sizeof(u32)); |
| 452 | rng.GenerateRandomBytes(&tag_data.settings.init_date, sizeof(u32)); | 452 | rng.GenerateRandomBytes(&tag_data.settings.init_date, sizeof(u32)); |
| 453 | tag_data.settings.settings.font_region.Assign(0); | 453 | tag_data.settings.settings.font_region.Assign(0); |
| 454 | tag_data.settings.settings.amiibo_initialized.Assign(0); | 454 | tag_data.settings.settings.amiibo_initialized.Assign(0); |
| @@ -486,9 +486,7 @@ Result NfpDevice::SetRegisterInfoPrivate(const AmiiboName& amiibo_name) { | |||
| 486 | settings.settings.font_region.Assign(0); | 486 | settings.settings.font_region.Assign(0); |
| 487 | settings.settings.amiibo_initialized.Assign(1); | 487 | settings.settings.amiibo_initialized.Assign(1); |
| 488 | 488 | ||
| 489 | // TODO: this is a mix of tag.file input | 489 | UpdateRegisterInfoCrc(); |
| 490 | std::array<u8, 0x7e> unknown_input{}; | ||
| 491 | tag_data.application_area_crc = CalculateCrc(unknown_input); | ||
| 492 | 490 | ||
| 493 | return Flush(); | 491 | return Flush(); |
| 494 | } | 492 | } |
| @@ -716,9 +714,7 @@ Result NfpDevice::RecreateApplicationArea(u32 access_id, std::span<const u8> dat | |||
| 716 | tag_data.application_area_id = access_id; | 714 | tag_data.application_area_id = access_id; |
| 717 | tag_data.unknown = {}; | 715 | tag_data.unknown = {}; |
| 718 | 716 | ||
| 719 | // TODO: this is a mix of tag_data input | 717 | UpdateRegisterInfoCrc(); |
| 720 | std::array<u8, 0x7e> unknown_input{}; | ||
| 721 | tag_data.application_area_crc = CalculateCrc(unknown_input); | ||
| 722 | 718 | ||
| 723 | return Flush(); | 719 | return Flush(); |
| 724 | } | 720 | } |
| @@ -838,6 +834,29 @@ void NfpDevice::UpdateSettingsCrc() { | |||
| 838 | settings.crc = CalculateCrc(unknown_input); | 834 | settings.crc = CalculateCrc(unknown_input); |
| 839 | } | 835 | } |
| 840 | 836 | ||
| 837 | void NfpDevice::UpdateRegisterInfoCrc() { | ||
| 838 | #pragma pack(push, 1) | ||
| 839 | struct CrcData { | ||
| 840 | Mii::Ver3StoreData mii; | ||
| 841 | u8 application_id_byte; | ||
| 842 | u8 unknown; | ||
| 843 | std::array<u32, 0x7> unknown2; | ||
| 844 | }; | ||
| 845 | static_assert(sizeof(CrcData) == 0x7e, "CrcData is an invalid size"); | ||
| 846 | #pragma pack(pop) | ||
| 847 | |||
| 848 | const CrcData crc_data{ | ||
| 849 | .mii = tag_data.owner_mii, | ||
| 850 | .application_id_byte = tag_data.application_id_byte, | ||
| 851 | .unknown = tag_data.unknown, | ||
| 852 | .unknown2 = tag_data.unknown2, | ||
| 853 | }; | ||
| 854 | |||
| 855 | std::array<u8, sizeof(CrcData)> data{}; | ||
| 856 | memcpy(data.data(), &crc_data, sizeof(CrcData)); | ||
| 857 | tag_data.register_info_crc = CalculateCrc(data); | ||
| 858 | } | ||
| 859 | |||
| 841 | u32 NfpDevice::CalculateCrc(std::span<const u8> data) { | 860 | u32 NfpDevice::CalculateCrc(std::span<const u8> data) { |
| 842 | constexpr u32 magic = 0xedb88320; | 861 | constexpr u32 magic = 0xedb88320; |
| 843 | u32 crc = 0xffffffff; | 862 | u32 crc = 0xffffffff; |
| @@ -847,17 +866,15 @@ u32 NfpDevice::CalculateCrc(std::span<const u8> data) { | |||
| 847 | } | 866 | } |
| 848 | 867 | ||
| 849 | for (u8 input : data) { | 868 | for (u8 input : data) { |
| 850 | u32 temp = (crc ^ input) >> 1; | 869 | crc ^= input; |
| 851 | if (((crc ^ input) & 1) != 0) { | 870 | crc = crc >> 1 ^ ((crc & 1) ? magic : 0x0); |
| 852 | temp = temp ^ magic; | 871 | crc = crc >> 1 ^ ((crc & 1) ? magic : 0x0); |
| 853 | } | 872 | crc = crc >> 1 ^ ((crc & 1) ? magic : 0x0); |
| 854 | 873 | crc = crc >> 1 ^ ((crc & 1) ? magic : 0x0); | |
| 855 | for (std::size_t step = 0; step < 7; ++step) { | 874 | crc = crc >> 1 ^ ((crc & 1) ? magic : 0x0); |
| 856 | crc = temp >> 1; | 875 | crc = crc >> 1 ^ ((crc & 1) ? magic : 0x0); |
| 857 | if ((temp & 1) != 0) { | 876 | crc = crc >> 1 ^ ((crc & 1) ? magic : 0x0); |
| 858 | crc = temp >> 1 ^ magic; | 877 | crc = crc >> 1 ^ ((crc & 1) ? magic : 0x0); |
| 859 | } | ||
| 860 | } | ||
| 861 | } | 878 | } |
| 862 | 879 | ||
| 863 | return ~crc; | 880 | return ~crc; |
diff --git a/src/core/hle/service/nfp/nfp_device.h b/src/core/hle/service/nfp/nfp_device.h index 06386401d..fc7fbd578 100644 --- a/src/core/hle/service/nfp/nfp_device.h +++ b/src/core/hle/service/nfp/nfp_device.h | |||
| @@ -80,6 +80,7 @@ private: | |||
| 80 | AmiiboDate GetAmiiboDate(s64 posix_time) const; | 80 | AmiiboDate GetAmiiboDate(s64 posix_time) const; |
| 81 | u64 RemoveVersionByte(u64 application_id) const; | 81 | u64 RemoveVersionByte(u64 application_id) const; |
| 82 | void UpdateSettingsCrc(); | 82 | void UpdateSettingsCrc(); |
| 83 | void UpdateRegisterInfoCrc(); | ||
| 83 | u32 CalculateCrc(std::span<const u8>); | 84 | u32 CalculateCrc(std::span<const u8>); |
| 84 | 85 | ||
| 85 | bool is_controller_set{}; | 86 | bool is_controller_set{}; |
diff --git a/src/core/hle/service/nfp/nfp_types.h b/src/core/hle/service/nfp/nfp_types.h index 142343d6e..5f4a5d7f9 100644 --- a/src/core/hle/service/nfp/nfp_types.h +++ b/src/core/hle/service/nfp/nfp_types.h | |||
| @@ -260,7 +260,7 @@ struct EncryptedAmiiboFile { | |||
| 260 | u8 application_id_byte; | 260 | u8 application_id_byte; |
| 261 | u8 unknown; | 261 | u8 unknown; |
| 262 | std::array<u32, 0x7> unknown2; | 262 | std::array<u32, 0x7> unknown2; |
| 263 | u32_be application_area_crc; | 263 | u32_be register_info_crc; |
| 264 | ApplicationArea application_area; // Encrypted Game data | 264 | ApplicationArea application_area; // Encrypted Game data |
| 265 | }; | 265 | }; |
| 266 | static_assert(sizeof(EncryptedAmiiboFile) == 0x1F8, "AmiiboFile is an invalid size"); | 266 | static_assert(sizeof(EncryptedAmiiboFile) == 0x1F8, "AmiiboFile is an invalid size"); |
| @@ -281,7 +281,7 @@ struct NTAG215File { | |||
| 281 | u8 application_id_byte; | 281 | u8 application_id_byte; |
| 282 | u8 unknown; | 282 | u8 unknown; |
| 283 | std::array<u32, 0x7> unknown2; | 283 | std::array<u32, 0x7> unknown2; |
| 284 | u32_be application_area_crc; | 284 | u32_be register_info_crc; |
| 285 | ApplicationArea application_area; // Encrypted Game data | 285 | ApplicationArea application_area; // Encrypted Game data |
| 286 | HashData hmac_tag; // Hash | 286 | HashData hmac_tag; // Hash |
| 287 | UniqueSerialNumber uid; // Unique serial number | 287 | UniqueSerialNumber uid; // Unique serial number |