Line 5:
Line 5:
<source lang=c>
<source lang=c>
#define SHA1_LENGTH 20
#define SHA1_LENGTH 20
+
#define RSA_BLOCK_LENGTH 256
+
#define PADDING_LENGTH RSA_BLOCK_LENGTH - SHA1_LENGTH
+
+
struct decrypted_signature {
+
u8 padding[PADDING_LENGTH]; // not verified
+
u8 sha1hash[SHA1_LENGTH];
+
};
struct rsa_cert {
struct rsa_cert {
u32 signature_type;
u32 signature_type;
−
char rsa_signature[256]; // 2048 bits
+
char rsa_signature[RSA_BLOCK_LENGTH]; // 256 bytes, 2048 bits
char unused[60];
char unused[60];
};
};
Line 25:
Line 32:
int verify_tmd (struct tmd stmd) {
int verify_tmd (struct tmd stmd) {
−
char decrypted_sig[256] = RSA_DecryptSig(CA_public_key, stmd.cert.rsa_signature);
+
struct decrypted_signature decrypted_sig = (struct decrypted_signature) RSA_DecryptSig(CA_public_key, stmd.cert.rsa_signature);
−
char sig_hash = decrypted_sig[256-SHA1_LENGTH:256];
+
char sig_hash[SHA1_LENGTH] = decrypted_sig.sha1hash;
char payload_hash[SHA1_LENGTH] = SHA1(stmd.view);
char payload_hash[SHA1_LENGTH] = SHA1(stmd.view);