public bool VerifyIntegrity(bool verbose, bool green) { bool valid = true; byte[] decryptedSignature; if (green) { decryptedSignature = PublicKey.Decrypt(ImageHeader.DigitalSignature); } else { decryptedSignature = PublicKey.DecryptRed(ImageHeader.DigitalSignature); } if (verbose) { Console.WriteLine("Checking digital signature..."); } // Check the digital signature // TODO: We must also check the padding. The Xbox checks this too! if (decryptedSignature.Take(20).ToArray().SequenceEqual(MetaHash)) { if (verbose) { Console.WriteLine("\n\tValid\n"); } } else { valid = false; if (verbose) { Console.WriteLine("\n\tInvalid\n"); } } // Verify that the section hashes in the section header table match the data in the xbe // The section header table hashes can not be modified because they have already been validated with the digital signature // As far as I can tell, this is the order in which the xbox validates the xbe, contrary to what is found here: http://xboxdevwiki.net/Kernel/XboxSignatureKey if (verbose) { Console.WriteLine("Checking section hashes..."); } foreach (SectionHeader section in SectionHeaders) { if (section.VerifyDigest()) { if (verbose) { Console.WriteLine(section.SectionName + ":\n\tValid\n"); } } else { valid = false; if (verbose) { Console.WriteLine(section.SectionName + ":\n\tInvalid\n"); } } } if (verbose) { if (valid) { Console.WriteLine("\nXBE is NOT valid"); } else { Console.WriteLine("\nXBE is valid"); } } return(valid); }