diff --git a/stratosphere/ams_mitm/source/amsmitm_prodinfo_utils.cpp b/stratosphere/ams_mitm/source/amsmitm_prodinfo_utils.cpp index 1e419f8f8..c56b3f47b 100644 --- a/stratosphere/ams_mitm/source/amsmitm_prodinfo_utils.cpp +++ b/stratosphere/ams_mitm/source/amsmitm_prodinfo_utils.cpp @@ -256,7 +256,6 @@ namespace ams::mitm { bool IsValid(const CalibrationInfo &cal) { return IsValidHeader(cal) && IsValid(cal.GetBlock()) && - IsValid(cal.GetBlock()) && IsValid(cal.GetBlock()) && IsValid(cal.GetBlock()) && cal.GetBlock().ssl_certificate_size <= sizeof(cal.GetBlock().ssl_certificate) && @@ -267,7 +266,8 @@ namespace ams::mitm { IsValidSerialNumber(cal); } - bool ContainsCorrectDeviceId(const EccB233DeviceCertificateBlock &block, u64 device_id) { + template + bool ContainsCorrectDeviceId(const Block &block, u64 device_id) { static constexpr size_t DeviceIdOffset = 0xC6; char found_device_id_str[sizeof("0011223344556677")] = {}; ON_SCOPE_EXIT { std::memset(found_device_id_str, 0, sizeof(found_device_id_str)); }; @@ -279,7 +279,14 @@ namespace ams::mitm { } bool ContainsCorrectDeviceId(const CalibrationInfo &cal) { - return ContainsCorrectDeviceId(cal.GetBlock(), exosphere::GetDeviceId()); + const auto &ecc = cal.GetBlock(); + if (!IsBlank(ecc)) { + return IsValid(ecc) && ContainsCorrectDeviceId(ecc, exosphere::GetDeviceId()); + } + + /* Newer consoles may leave the ECC certificate unprogrammed. */ + const auto &rsa = cal.GetBlock(); + return !IsBlank(rsa) && IsValid(rsa) && ContainsCorrectDeviceId(rsa, exosphere::GetDeviceId()); } bool IsValidForSecureBackup(const CalibrationInfo &cal) {