1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
/**
* crypto.c
*/
#include <stddef.h>
#include <openssl/md5.h>
#include <openssl/sha.h>
#include <openssl/aes.h>
#include <stdlib.h>
#include <string.h>
#include "crypto.h"
#include "wii_tik.h"
void get_common_key(u8 *key) {
u8 i;
u8 table[16] = {
0xC1, 0xce, 0x00, 0x08,
0x74, 0xaf, 0xb9, 0xce,
0x62, 0xf3, 0xef, 0x6f,
0x59, 0xab, 0x80, 0xdd
};
u8 v = 42;
for (i = 0; i < 16; i++)
{
key[i] = v ^ table[i];
}
}
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 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(wii_tik *tik, u8 *title_key) {
u8 common_key[16];
u8 iv[16];
u64 title_id_le;
get_common_key(common_key);
title_id_le = ((u64)tik->title_id << 32);
title_id_le += be32((u8*)&tik->title_category);
memset(iv, 0, sizeof(iv));
memcpy(iv, &title_id_le, 8);
aes_cbc_dec(common_key, iv, (u8*)tik->title_key_enc, 16, title_key);
}
|