No more acid sigchecks

This commit is contained in:
bristleroot 2020-05-01 16:53:22 +05:30 committed by GitHub
parent 14287d833b
commit eefa783f12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -61,40 +61,37 @@ namespace ams::ldr {
} }
R_UNLESS(!(npdm->flags & mask), ResultInvalidMeta()); R_UNLESS(!(npdm->flags & mask), ResultInvalidMeta());
/* Validate Acid extents. */ /* Validate Acid extents go brrr */
R_TRY(ValidateSubregion(sizeof(Npdm), size, npdm->acid_offset, npdm->acid_size, sizeof(Acid)));
/* Validate Aci extends. */ /* Validate Aci extends. */
R_TRY(ValidateSubregion(sizeof(Npdm), size, npdm->aci_offset, npdm->aci_size, sizeof(Aci))); // R_TRY(ValidateSubregion(sizeof(Npdm), size, npdm->aci_offset, npdm->aci_size, sizeof(Aci)));
return ResultSuccess(); return ResultSuccess();
} }
Result ValidateAcid(const Acid *acid, size_t size) { Result ValidateAcid(const Acid *acid, size_t size) {
/* Validate magic. */ /* Validate magic. */
R_UNLESS(acid->magic == Acid::Magic, ResultInvalidMeta()); // R_UNLESS(acid->magic == Acid::Magic, ResultInvalidMeta());
/* Validate that the acid is for production if not development. */ /* Validate that the acid is for production if not development. */
if (!IsDevelopmentForAcidProductionCheck()) { // if (!IsDevelopmentForAcidProductionCheck()) {
R_UNLESS((acid->flags & Acid::AcidFlag_Production) != 0, ResultInvalidMeta()); // R_UNLESS((acid->flags & Acid::AcidFlag_Production) != 0, Resul
}
/* Validate Fac, Sac, Kac. */ /* Validate Fac, Sac, Kac. */
R_TRY(ValidateSubregion(sizeof(Acid), size, acid->fac_offset, acid->fac_size)); // R_TRY(ValidateSubregion(sizeof(Acid), size, acid->fac_offset, acid->fac_size));
R_TRY(ValidateSubregion(sizeof(Acid), size, acid->sac_offset, acid->sac_size)); // R_TRY(ValidateSubregion(sizeof(Acid), size, acid->sac_offset, acid->sac_size));
R_TRY(ValidateSubregion(sizeof(Acid), size, acid->kac_offset, acid->kac_size)); // R_TRY(ValidateSubregion(sizeof(Acid), size, acid->kac_offset, acid->kac_size));
return ResultSuccess(); return ResultSuccess();
} }
Result ValidateAci(const Aci *aci, size_t size) { Result ValidateAci(const Aci *aci, size_t size) {
/* Validate magic. */ /* Validate magic. */
R_UNLESS(aci->magic == Aci::Magic, ResultInvalidMeta()); // R_UNLESS(aci->magic == Aci::Magic, ResultInvalidMeta());
/* Validate Fah, Sac, Kac. */ /* Validate Fah, Sac, Kac. */
R_TRY(ValidateSubregion(sizeof(Aci), size, aci->fah_offset, aci->fah_size)); // R_TRY(ValidateSubregion(sizeof(Aci), size, aci->fah_offset, aci->fah_size));
R_TRY(ValidateSubregion(sizeof(Aci), size, aci->sac_offset, aci->sac_size)); // R_TRY(ValidateSubregion(sizeof(Aci), size, aci->sac_offset, aci->sac_size));
R_TRY(ValidateSubregion(sizeof(Aci), size, aci->kac_offset, aci->kac_size)); // R_TRY(ValidateSubregion(sizeof(Aci), size, aci->kac_offset, aci->kac_size));
return ResultSuccess(); return ResultSuccess();
} }
@ -117,16 +114,16 @@ namespace ams::ldr {
} }
/* Verify the signature. */ /* Verify the signature. */
const u8 *sig = meta->acid->signature; // const u8 *sig = meta->acid->signature;
const size_t sig_size = sizeof(meta->acid->signature); // const size_t sig_size = sizeof(meta->acid->signature);
const u8 *mod = GetAcidSignatureModulus(meta->npdm->signature_key_generation); // const u8 *mod = GetAcidSignatureModulus(meta->npdm->signature_key_generation);
const size_t mod_size = fssystem::AcidSignatureKeyModulusSize; // const size_t mod_size = fssystem::AcidSignatureKeyModulusSize;
const u8 *exp = fssystem::AcidSignatureKeyExponent; // const u8 *exp = fssystem::AcidSignatureKeyExponent;
const size_t exp_size = fssystem::AcidSignatureKeyExponentSize; // const size_t exp_size = fssystem::AcidSignatureKeyExponentSize;
const u8 *msg = meta->acid->modulus; // const u8 *msg = meta->acid->modulus;
const size_t msg_size = meta->acid->size; // const size_t msg_size = meta->acid->size;
const bool is_signature_valid = crypto::VerifyRsa2048PssSha256(sig, sig_size, mod, mod_size, exp, exp_size, msg, msg_size); const bool is_signature_valid = 1; // Note: signature should always be valid for piracy sake
R_UNLESS(is_signature_valid || !IsEnabledProgramVerification(), ResultInvalidAcidSignature()); // R_UNLESS(is_signature_valid || !IsEnabledProgramVerification(), ResultInvalidAcidSignature());
meta->is_signed = is_signature_valid; meta->is_signed = is_signature_valid;
return ResultSuccess(); return ResultSuccess();