#define SHA1_LENGTH 20
struct rsa_cert {
u32 signature_type;
char rsa_signature[256]; // 2048 bits
char unused[60];
};
struct tmd {
char issuer[0x40];
// more metadata...
char content_hash[SHA1_LENGTH];
// more content records and hashes...
}
struct signed_tmd {
struct rsa_cert cert;
struct tmd tmd;
}
int verify_tmd (struct signed_tmd stmd) {
char decrypted_sig[256] = RSA_DecryptSig(CA_public_key, stmd.cert.rsa_signature);
char sig_hash = decrypted_sig[256-SHA1_LENGTH:256];
char payload_hash[SHA1_LENGTH] = SHA1(stmd.tmd);
if (strncmp(payload_hash, sig_hash, SHA1_LENGTH) == 0) {
return SIG_OK;
} else {
return SIG_BAD;
}
}
int is_a_valid_disc(struct signed_tmd tmd, char *disc_hash) {
if(verify_tmd(stmd) == SIG_BAD) {
return DISC_BAD;
}
if(memcmp(stmd.tmd.content_hash, disc_hash, SHA1_LENGTH) != 0) {
return DISC_BAD;
}
return DISC_OK;
}