summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgerman77 <juangerman-13@hotmail.com>2022-02-13 18:59:47 +0100
committergerman77 <juangerman-13@hotmail.com>2022-02-13 20:52:34 +0100
commitb57d61010f347e74875f0c8a1003b4f84fa7b062 (patch)
treedd80e607949efe0f545803a9db95444c5a1f6c6b
parentnfp: Separate nfc tag from amiibo data (diff)
downloadyuzu-b57d61010f347e74875f0c8a1003b4f84fa7b062.tar
yuzu-b57d61010f347e74875f0c8a1003b4f84fa7b062.tar.gz
yuzu-b57d61010f347e74875f0c8a1003b4f84fa7b062.tar.bz2
yuzu-b57d61010f347e74875f0c8a1003b4f84fa7b062.tar.lz
yuzu-b57d61010f347e74875f0c8a1003b4f84fa7b062.tar.xz
yuzu-b57d61010f347e74875f0c8a1003b4f84fa7b062.tar.zst
yuzu-b57d61010f347e74875f0c8a1003b4f84fa7b062.zip
-rw-r--r--src/core/hle/service/nfp/nfp.cpp22
-rw-r--r--src/core/hle/service/nfp/nfp.h11
2 files changed, 24 insertions, 9 deletions
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp
index 63e257975..513107715 100644
--- a/src/core/hle/service/nfp/nfp.cpp
+++ b/src/core/hle/service/nfp/nfp.cpp
@@ -479,25 +479,35 @@ void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) {
}
bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) {
- if (buffer.size() < sizeof(NTAG215File)) {
- LOG_ERROR(Service_NFP, "Wrong file size");
+ if (device_state != DeviceState::SearchingForTag) {
+ LOG_ERROR(Service_NFP, "Game is not looking for amiibos, current state {}", device_state);
return false;
}
- if (device_state != DeviceState::SearchingForTag) {
- LOG_ERROR(Service_NFP, "Game is not looking for amiibos, current state {}", device_state);
+ constexpr auto tag_size = sizeof(NTAG215File);
+ constexpr auto tag_size_without_password = sizeof(NTAG215File) - sizeof(NTAG215Password);
+
+ std::vector<u8> amiibo_buffer = buffer;
+
+ if (amiibo_buffer.size() < tag_size_without_password) {
+ LOG_ERROR(Service_NFP, "Wrong file size {}", buffer.size());
return false;
}
+ // Ensure it has the correct size
+ if (amiibo_buffer.size() != tag_size) {
+ amiibo_buffer.resize(tag_size, 0);
+ }
+
LOG_INFO(Service_NFP, "Amiibo detected");
- std::memcpy(&tag_data, buffer.data(), sizeof(tag_data));
+ std::memcpy(&tag_data, buffer.data(), tag_size);
if (!IsAmiiboValid()) {
return false;
}
// This value can't be dumped from a tag. Generate it
- tag_data.PWD = GetTagPassword(tag_data.uuid);
+ tag_data.password.PWD = GetTagPassword(tag_data.uuid);
device_state = DeviceState::TagFound;
activate_event->GetWritableEvent().Signal();
diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h
index bc3b1967f..022f13b29 100644
--- a/src/core/hle/service/nfp/nfp.h
+++ b/src/core/hle/service/nfp/nfp.h
@@ -153,6 +153,13 @@ public:
};
static_assert(sizeof(EncryptedAmiiboFile) == 0x1F8, "AmiiboFile is an invalid size");
+ struct NTAG215Password {
+ u32 PWD; // Password to allow write access
+ u16 PACK; // Password acknowledge reply
+ u16 RFUI; // Reserved for future use
+ };
+ static_assert(sizeof(NTAG215Password) == 0x8, "NTAG215Password is an invalid size");
+
struct NTAG215File {
TagUuid uuid; // Unique serial number
u16 lock_bytes; // Set defined pages as read only
@@ -161,9 +168,7 @@ public:
u32 dynamic_lock; // Dynamic lock
u32 CFG0; // Defines memory protected by password
u32 CFG1; // Defines number of verification attempts
- u32 PWD; // Password to allow write access
- u16 PACK; // Password acknowledge reply
- u16 RFUI; // Reserved for future use
+ NTAG215Password password; // Password data
};
static_assert(sizeof(NTAG215File) == 0x21C, "NTAG215File is an invalid size");