yuzu-emu
/
yuzu
Archived
1
0
Fork 0

Merge pull request #9113 from german77/peer_pressure

service: nfp: Allow amiibos without keys
This commit is contained in:
liamwhite 2022-10-25 12:13:31 -04:00 committed by GitHub
commit e59bd6c335
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 26 additions and 12 deletions

View File

@ -1025,6 +1025,7 @@ bool EmulatedController::HasNfc() const {
case NpadStyleIndex::JoyconRight: case NpadStyleIndex::JoyconRight:
case NpadStyleIndex::JoyconDual: case NpadStyleIndex::JoyconDual:
case NpadStyleIndex::ProController: case NpadStyleIndex::ProController:
case NpadStyleIndex::Handheld:
break; break;
default: default:
return false; return false;

View File

@ -9,6 +9,7 @@
#include <mbedtls/hmac_drbg.h> #include <mbedtls/hmac_drbg.h>
#include "common/fs/file.h" #include "common/fs/file.h"
#include "common/fs/fs.h"
#include "common/fs/path_util.h" #include "common/fs/path_util.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/hle/service/mii/mii_manager.h" #include "core/hle/service/mii/mii_manager.h"
@ -279,7 +280,7 @@ bool LoadKeys(InternalKey& locked_secret, InternalKey& unfixed_info) {
Common::FS::FileType::BinaryFile}; Common::FS::FileType::BinaryFile};
if (!keys_file.IsOpen()) { if (!keys_file.IsOpen()) {
LOG_ERROR(Service_NFP, "No keys detected"); LOG_ERROR(Service_NFP, "Failed to open key file");
return false; return false;
} }
@ -295,6 +296,11 @@ bool LoadKeys(InternalKey& locked_secret, InternalKey& unfixed_info) {
return true; return true;
} }
bool IsKeyAvailable() {
const auto yuzu_keys_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::KeysDir);
return Common::FS::Exists(yuzu_keys_dir / "key_retail.bin");
}
bool DecodeAmiibo(const EncryptedNTAG215File& encrypted_tag_data, NTAG215File& tag_data) { bool DecodeAmiibo(const EncryptedNTAG215File& encrypted_tag_data, NTAG215File& tag_data) {
InternalKey locked_secret{}; InternalKey locked_secret{};
InternalKey unfixed_info{}; InternalKey unfixed_info{};

View File

@ -91,6 +91,9 @@ void Cipher(const DerivedKeys& keys, const NTAG215File& in_data, NTAG215File& ou
/// Loads both amiibo keys from key_retail.bin /// Loads both amiibo keys from key_retail.bin
bool LoadKeys(InternalKey& locked_secret, InternalKey& unfixed_info); bool LoadKeys(InternalKey& locked_secret, InternalKey& unfixed_info);
/// Returns true if key_retail.bin exist
bool IsKeyAvailable();
/// Decodes encripted amiibo data returns true if output is valid /// Decodes encripted amiibo data returns true if output is valid
bool DecodeAmiibo(const EncryptedNTAG215File& encrypted_tag_data, NTAG215File& tag_data); bool DecodeAmiibo(const EncryptedNTAG215File& encrypted_tag_data, NTAG215File& tag_data);

View File

@ -17,6 +17,7 @@
#include "core/hle/ipc_helpers.h" #include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h" #include "core/hle/kernel/k_event.h"
#include "core/hle/service/mii/mii_manager.h" #include "core/hle/service/mii/mii_manager.h"
#include "core/hle/service/mii/types.h"
#include "core/hle/service/nfp/amiibo_crypto.h" #include "core/hle/service/nfp/amiibo_crypto.h"
#include "core/hle/service/nfp/nfp.h" #include "core/hle/service/nfp/nfp.h"
#include "core/hle/service/nfp/nfp_device.h" #include "core/hle/service/nfp/nfp_device.h"
@ -233,6 +234,14 @@ Result NfpDevice::Mount(MountTarget mount_target_) {
return NotAnAmiibo; return NotAnAmiibo;
} }
// Mark amiibos as read only when keys are missing
if (!AmiiboCrypto::IsKeyAvailable()) {
LOG_ERROR(Service_NFP, "No keys detected");
device_state = DeviceState::TagMounted;
mount_target = MountTarget::Rom;
return ResultSuccess;
}
if (!AmiiboCrypto::DecodeAmiibo(encrypted_tag_data, tag_data)) { if (!AmiiboCrypto::DecodeAmiibo(encrypted_tag_data, tag_data)) {
LOG_ERROR(Service_NFP, "Can't decode amiibo {}", device_state); LOG_ERROR(Service_NFP, "Can't decode amiibo {}", device_state);
return CorruptedData; return CorruptedData;

View File

@ -8,7 +8,6 @@
#include "common/common_funcs.h" #include "common/common_funcs.h"
#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/kernel_helpers.h"
#include "core/hle/service/mii/types.h"
#include "core/hle/service/nfp/nfp_types.h" #include "core/hle/service/nfp/nfp_types.h"
#include "core/hle/service/service.h" #include "core/hle/service/service.h"

View File

@ -17,11 +17,6 @@ enum class ServiceType : u32 {
System, System,
}; };
enum class State : u32 {
NonInitialized,
Initialized,
};
enum class DeviceState : u32 { enum class DeviceState : u32 {
Initialized, Initialized,
SearchingForTag, SearchingForTag,

View File

@ -6,12 +6,9 @@
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/core.h" #include "core/core.h"
#include "core/hid/emulated_controller.h"
#include "core/hid/hid_core.h"
#include "core/hid/hid_types.h" #include "core/hid/hid_types.h"
#include "core/hle/ipc_helpers.h" #include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h" #include "core/hle/kernel/k_event.h"
#include "core/hle/service/mii/mii_manager.h"
#include "core/hle/service/nfp/nfp_device.h" #include "core/hle/service/nfp/nfp_device.h"
#include "core/hle/service/nfp/nfp_result.h" #include "core/hle/service/nfp/nfp_result.h"
#include "core/hle/service/nfp/nfp_user.h" #include "core/hle/service/nfp/nfp_user.h"

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/kernel_helpers.h"
#include "core/hle/service/nfp/nfp.h" #include "core/hle/service/service.h"
#include "core/hle/service/nfp/nfp_types.h"
namespace Service::NFP { namespace Service::NFP {
class NfpDevice; class NfpDevice;
@ -15,6 +14,11 @@ public:
explicit IUser(Core::System& system_); explicit IUser(Core::System& system_);
private: private:
enum class State : u32 {
NonInitialized,
Initialized,
};
void Initialize(Kernel::HLERequestContext& ctx); void Initialize(Kernel::HLERequestContext& ctx);
void Finalize(Kernel::HLERequestContext& ctx); void Finalize(Kernel::HLERequestContext& ctx);
void ListDevices(Kernel::HLERequestContext& ctx); void ListDevices(Kernel::HLERequestContext& ctx);