diff -r -u source/tools.c wbfs_file_2.9_no_openssl//source/tools.c --- source/tools.c 2010-01-12 13:52:20.000000000 +0100 +++ wbfs_file_2.9_no_openssl//source/tools.c 2012-03-06 23:14:55.000000000 +0100 @@ -5,9 +5,6 @@ #include "tools.h" #include // to accommodate certain broken versions of openssl -#include -#include -#include #include #include #include @@ -61,16 +58,6 @@ // crypto // -void md5(u8 *data, u32 len, u8 *hash) -{ - MD5(data, len, hash); -} - -void sha(u8 *data, u32 len, u8 *hash) -{ - SHA1(data, len, hash); -} - void get_key(const char *name, u8 *key, u32 len) { char path[256]; @@ -90,35 +77,6 @@ fclose(fp); } -void aes_cbc_dec(u8 *key, u8 *iv, u8 *in, u32 len, u8 *out) -{ - AES_KEY aes_key; - - AES_set_decrypt_key(key, 128, &aes_key); - AES_cbc_encrypt(in, out, len, &aes_key, iv, AES_DECRYPT); -} - -void aes_cbc_enc(u8 *key, u8 *iv, u8 *in, u32 len, u8 *out) -{ - AES_KEY aes_key; - - AES_set_encrypt_key(key, 128, &aes_key); - AES_cbc_encrypt(in, out, len, &aes_key, iv, AES_ENCRYPT); -} - -void decrypt_title_key(u8 *tik, u8 *title_key) -{ - u8 common_key[16]; - u8 iv[16]; - - get_key("common-key", common_key, 16); - - memset(iv, 0, sizeof iv); - memcpy(iv, tik + 0x01dc, 8); - aes_cbc_dec(common_key, iv, tik + 0x01bf, 16, title_key); - printf("title key: %02x %02x %02x\n",title_key[0],title_key[1],title_key[2]); -} - static u8 root_key[0x204]; static u8 *get_root_key(void) { @@ -166,26 +124,6 @@ return 0; } -int check_ec(u8 *ng, u8 *ap, u8 *sig, u8 *sig_hash) -{ - u8 ap_hash[20]; - u8 *ng_Q, *ap_R, *ap_S; - u8 *ap_Q, *sig_R, *sig_S; - - ng_Q = ng + 0x0108; - ap_R = ap + 0x04; - ap_S = ap + 0x22; - - SHA1(ap + 0x80, 0x100, ap_hash); - - ap_Q = ap + 0x0108; - sig_R = sig; - sig_S = sig + 30; - - return check_ecdsa(ng_Q, ap_R, ap_S, ap_hash) - && check_ecdsa(ap_Q, sig_R, sig_S, sig_hash); -} - static int check_rsa(u8 *h, u8 *sig, u8 *key, u32 n) { u8 correct[0x200]; @@ -268,57 +206,6 @@ return 0; } -int check_cert_chain(u8 *data, u32 data_len, u8 *cert, u32 cert_len) -{ - u8 *sig; - u8 *sub; - u32 sig_len; - u32 sub_len; - u8 h[20]; - u8 *key_cert; - u8 *key; - int ret; - sig = data; - sig_len = get_sig_len(sig); - if (sig_len == 0) - return -1; - sub = data + sig_len; - sub_len = data_len - sig_len; - if (sub_len == 0) - return -2; - - for (;;) { - printf(">>>>>> checking sig by %s...\n", sub); - if (strcmp((char*)sub, "Root") == 0) { - key = get_root_key(); - sha(sub, sub_len, h); - if (be32(sig) != 0x10000) - return -8; - return check_rsa(h, sig + 4, key, 0x200); - } - - key_cert = find_cert_in_chain(sub, cert, cert_len); - if (key_cert == 0) - return -3; - - key = key_cert + get_sig_len(key_cert); - - sha(sub, sub_len, h); - ret = check_hash(h, sig, key); - if (ret) - return ret; - - sig = key_cert; - sig_len = get_sig_len(sig); - if (sig_len == 0) - return -4; - sub = sig + sig_len; - sub_len = get_sub_len(sub); - if (sub_len == 0) - return -5; - } -} - // // compression // diff -r -u source/tools.h wbfs_file_2.9_no_openssl//source/tools.h --- source/tools.h 2009-03-18 17:17:38.000000000 +0100 +++ wbfs_file_2.9_no_openssl//source/tools.h 2012-03-06 23:15:03.000000000 +0100 @@ -32,14 +32,7 @@ void bn_exp(u8 *d, u8 *a, u8 *N, u32 n, u8 *e, u32 en); // crypto -void md5(u8 *data, u32 len, u8 *hash); -void sha(u8 *data, u32 len, u8 *hash); void get_key(const char *name, u8 *key, u32 len); -void aes_cbc_dec(u8 *key, u8 *iv, u8 *in, u32 len, u8 *out); -void aes_cbc_enc(u8 *key, u8 *iv, u8 *in, u32 len, u8 *out); -void decrypt_title_key(u8 *tik, u8 *title_key); -int check_cert_chain(u8 *data, u32 data_len, u8 *cert, u32 cert_len); -int check_ec(u8 *ng, u8 *ap, u8 *sig, u8 *sig_hash); void generate_ecdsa(u8 *R, u8 *S, u8 *k, u8 *hash); int check_ecdsa(u8 *Q, u8 *R, u8 *S, u8 *hash); void ec_priv_to_pub(u8 *k, u8 *Q);