6 // #include "hash_wrappers.h"
11 #define TC_HIDDEN_VOLUME_OFFSET 1536
13 #define TC_HEADER_SZ 448
18 fprintf(stderr
,"trueCRACK v%f\m",VERSION
);
19 fprintf(stderr
,"usage:\n\t%s tc_volume wordlist starting_word",name
);
23 int main (int argc
, char ** argv
) {
28 FILE * tc_volume_file
= fopen(argv
[1], "rb");
29 FILE * wordlist_file
= fopen(argv
[2], "r" );
31 uint8_t salt
[TC_SALT_SZ
+4];
32 uint8_t header
[TC_HEADER_SZ
];
34 uint8_t header_hidden
[TC_HEADER_SZ
];
37 size_t s
= fread(tc_volume_file
,1,TC_SALT_SZ
,salt
);
39 printf("[%s:%d] volume salt read failed");
43 s
= fread(tc_volume_file
,1,TC_HEADER_SZ
,header
);
44 if (s
< TC_HEADER_SZ
) {
49 fseek ( tc_volume_file
, TC_HIDDEN_VOLUME_OFFSET
, SEEK_SET
);
50 s
= fread(tc_volume_file
,1,TC_HEADER_SZ
,header_hidden
);
51 if (s
< TC_HEADER_SZ
) {
56 fclose(tc_volume_file
);
58 char password
[TC_PASSWORD_MAX
];
59 uint8_t dec_buff
[TC_HEADER_SZ
];
61 //TODO: seek to starting_word
62 // check words until worklist ends.
63 while ( !feof(wordlist_file
) ) {
66 read_line(wordlist_file
, password
);
67 PBKDF2(hmac_ctx
, password
, sizeof(password
), salt
, sizeof(salt
), iterations
, derived_key
, derived_key_len
);
69 decrypt(enc_ctx
, derived_key
, derived_key_len
, header
, TC_HEADER_SZ
, dec_buff
, TC_HEADER_SZ
);
70 bool valid_pass
= check_tc_header(dec_buff
);
73 decrypt(enc_ctx
, derived_key
, derived_key_len
, header_hidden
, TC_HEADER_SZ
, dec_buff
, TC_HEADER_SZ
);
74 valid_pass
|= check_tc_header(dec_buff
);
78 printf("possible password: %s\n",(char *)password
);