* Fixed WiiSaveReader/Writer

This commit is contained in:
Antidote 2013-09-28 08:14:13 -07:00
parent e1f4bd2367
commit c8b382f754
10 changed files with 189 additions and 97 deletions

View File

@ -7,7 +7,9 @@ namespace zelda
{ {
namespace Checksums namespace Checksums
{ {
Uint32 crc32(Uint8* data, Uint64 length); Uint32 crc32(const Uint8* data, Uint64 length, Uint32 seed = 0xFFFFFFFF);
Uint16 crc16CCITT(const Uint8* data, Uint64 length, Uint16 seed = 0xFFFF, Uint16 final = 0);
Uint16 crc16(const Uint8* data, Uint64 length);
} }
} }
#endif // CHECKSUMS_HPP #endif // CHECKSUMS_HPP

View File

@ -57,7 +57,7 @@ public:
* \param file * \param file
*/ */
void addFile(const std::string& filename, WiiFile* file); void addFile(const std::string& filename, WiiFile* file);
void setFiles(std::unordered_map<std::string, WiiFile*> files);
/*! /*!
* \brief file * \brief file
* \param filename * \param filename

View File

@ -3,11 +3,6 @@
#ifndef __DOXYGEN_IGNORE__ #ifndef __DOXYGEN_IGNORE__
#ifdef __cplusplus
extern "C"
{
#endif
/* ========================================================================== ** /* ========================================================================== **
* *
* MD5.h * MD5.h
@ -88,6 +83,9 @@ extern "C"
* Typedefs: * Typedefs:
*/ */
namespace MD5Hash
{
typedef struct auth_md5Ctx_ typedef struct auth_md5Ctx_
{ {
unsigned int len; unsigned int len;
@ -237,8 +235,6 @@ unsigned char * StringToMD5(const char * hash, unsigned char * dst);
/* ========================================================================== */ /* ========================================================================== */
#ifdef __cplusplus } // MD5Hash
}
#endif
#endif // __DOXYGEN_IGNORE__ #endif // __DOXYGEN_IGNORE__
#endif /* AUTH_MD5_H */ #endif /* AUTH_MD5_H */

View File

@ -83,7 +83,7 @@ SOURCES += \
src/aes.c \ src/aes.c \
src/bn.cpp \ src/bn.cpp \
src/ec.cpp \ src/ec.cpp \
src/md5.c \ src/md5.cpp \
src/sha1.cpp \ src/sha1.cpp \
src/ALTTPQuest.cpp \ src/ALTTPQuest.cpp \
src/ALTTPFileWriter.cpp \ src/ALTTPFileWriter.cpp \
@ -102,7 +102,3 @@ SOURCES += \
src/SSFileReader.cpp \ src/SSFileReader.cpp \
src/SSFile.cpp \ src/SSFile.cpp \
src/Checksums.cpp src/Checksums.cpp
system("exec doxygen libzelda.conf")
#system("cd doc/latex && make")
system("cd ../../")

View File

@ -1,84 +1,151 @@
#include "Checksums.hpp" #include "Checksums.hpp"
#include <iostream>
#include <iomanip>
static const Uint32 crc32Table[256] = namespace zelda
{ {
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, namespace Checksums
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
Uint32 zelda::Checksums::crc32(Uint8* data, Uint64 length)
{ {
Uint32 crc32(const Uint8* data, Uint64 length, Uint32 seed)
{
static const Uint32 crc32Table[256] =
{
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
if (!data) if (!data)
return 0; return 0;
Uint32 checksum = 0xFFFFFFFF; Uint32 checksum = seed;
int pos = 0; int pos = 0;
while (length--) while (length--)
checksum = (checksum >> 8) ^ crc32Table[(checksum & 0xFF) ^ data[pos++]]; checksum = (checksum >> 8) ^ crc32Table[(checksum & 0xFF) ^ data[pos++]];
return checksum ^ 0xFFFFFFFF; return checksum ^ seed;
} }
Uint16 crc16CCITT(const Uint8* data, Uint64 length, Uint16 seed, Uint16 final)
{
static const Uint16 crc16CCITTTable [256] =
{
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108,
0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,
0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,
0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,
0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee,
0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,
0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,
0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,
0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,
0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4,
0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,
0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13,
0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,
0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e,
0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1,
0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,
0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,
0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,
0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657,
0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,
0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,
0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e,
0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,
0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d,
0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,
0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};
Uint16 checksum = seed;
int pos = 0;
while (length--)
checksum = crc16CCITTTable[(data[pos++] ^ (checksum >> 8)) & 0xFF] ^ (checksum << 8);
return checksum ^ final;
}
Uint16 crc16(const Uint8* data, Uint64 length)
{
static const Uint16 crc16Table[256] =
{
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
};
Int32 pos = 0;
Uint16 checksum = 0;
while (length--)
checksum = (crc16Table[(checksum ^ data[pos++]) & 0xFF] ^ (checksum >> 8));
return checksum;
}
} // Checksums
} // zelda

View File

@ -54,6 +54,29 @@ void WiiSave::addFile(const std::string& filepath, WiiFile* file)
m_files[filepath] = file; m_files[filepath] = file;
} }
void WiiSave::setFiles(std::unordered_map<std::string, WiiFile*> files)
{
if (files.size() <= 0)
return;
std::cout << "Setting file map...";
if (m_files.size() > 0)
{
std::unordered_map<std::string, WiiFile*>::iterator iter = m_files.begin();
for (;iter != m_files.end(); ++iter)
{
if (iter->second)
delete iter->second;
}
m_files.clear();
}
m_files = files;
std::cout << "done" << std::endl;
}
WiiFile* WiiSave::file(const std::string& filepath) const WiiFile* WiiSave::file(const std::string& filepath) const
{ {
std::unordered_map<std::string, WiiFile*>::const_iterator iter = m_files.begin(); std::unordered_map<std::string, WiiFile*>::const_iterator iter = m_files.begin();

View File

@ -87,21 +87,23 @@ WiiSave* WiiSaveReader::readSave()
base::seek(2); base::seek(2);
base::seek(0x10); base::seek(0x10);
WiiFile* file; std::unordered_map<std::string, WiiFile*> files;
for (Uint32 i = 0; i < numFiles; ++i) for (Uint32 i = 0; i < numFiles; ++i)
{ {
file = readFile(); WiiFile* file = readFile();
if (file) if (file)
ret->addFile("/" + file->filename(), file); files["/"+file->filename()] = file;
} }
ret->setFiles(files);
readCerts(totalSize); readCerts(totalSize);
return ret; return ret;
} }
WiiBanner* WiiSaveReader::readBanner() WiiBanner* WiiSaveReader::readBanner()
{ {
Uint8* dec = new Uint8[0xf0c0]; Uint8* dec = new Uint8[0xF0C0];
memset(dec, 0, 0xF0C0); memset(dec, 0, 0xF0C0);
Uint8* data = (Uint8*)base::readBytes(0xF0C0); Uint8* data = (Uint8*)base::readBytes(0xF0C0);
Uint8* oldData = base::data(); Uint8* oldData = base::data();
@ -115,15 +117,17 @@ WiiBanner* WiiSaveReader::readBanner()
Uint8 tmpIV[26]; Uint8 tmpIV[26];
memcpy(tmpIV, SD_IV, 16); memcpy(tmpIV, SD_IV, 16);
std::cout << "Decrypting: banner.bin...";
aes_set_key(SD_KEY); aes_set_key(SD_KEY);
aes_decrypt(tmpIV, data, dec, 0xF0C0); aes_decrypt(tmpIV, data, dec, 0xF0C0);
std::cout << "done" << std::endl;
memset(md5, 0, 16); memset(md5, 0, 16);
memset(md5Calc, 0, 16); memset(md5Calc, 0, 16);
// Read in the MD5 sum // Read in the MD5 sum
memcpy(md5, (dec + 0x0E), 0x10); memcpy(md5, (dec + 0x0E), 0x10);
// Write the blanker to the buffer // Write the blanker to the buffer
memcpy((dec + 0x0E), MD5_BLANKER, 0x10); memcpy((dec + 0x0E), MD5_BLANKER, 0x10);
MD5(md5Calc, dec, 0xF0C0); MD5Hash::MD5(md5Calc, dec, 0xF0C0);
// Compare the Calculated MD5 to the one from the file. // Compare the Calculated MD5 to the one from the file.
// This needs to be done incase the file is corrupted. // This needs to be done incase the file is corrupted.
@ -268,12 +272,14 @@ WiiFile* WiiSaveReader::readFile()
filedata = (Uint8*)base::readBytes(roundedLen); filedata = (Uint8*)base::readBytes(roundedLen);
// Decrypt file // Decrypt file
std::cout << "Decrypting: " << ret->filename() << "...";
Uint8* decData = new Uint8[roundedLen]; Uint8* decData = new Uint8[roundedLen];
aes_set_key(SD_KEY); aes_set_key(SD_KEY);
aes_decrypt(iv, filedata, decData, roundedLen); aes_decrypt(iv, filedata, decData, roundedLen);
delete filedata; delete filedata;
ret->setData(decData); ret->setData(decData);
ret->setLength(fileLen); ret->setLength(fileLen);
std::cout << "done" << std::endl;
} }
return ret; return ret;
@ -282,6 +288,7 @@ WiiFile* WiiSaveReader::readFile()
void WiiSaveReader::readCerts(Uint32 totalSize) void WiiSaveReader::readCerts(Uint32 totalSize)
{ {
std::cout << "Reading certs..." << std::endl;
Uint32 dataSize = totalSize - 0x340; Uint32 dataSize = totalSize - 0x340;
Uint8* sig = (Uint8*)base::readBytes(0x40); Uint8* sig = (Uint8*)base::readBytes(0x40);
Uint8* ngCert = (Uint8*)base::readBytes(0x180); Uint8* ngCert = (Uint8*)base::readBytes(0x180);
@ -293,7 +300,9 @@ void WiiSaveReader::readCerts(Uint32 totalSize)
hash = getSha1(data, dataSize); hash = getSha1(data, dataSize);
Uint8* hash2 = getSha1(hash, 20); Uint8* hash2 = getSha1(hash, 20);
check_ec(ngCert, apCert, sig, hash2); std::cout << "validating..." << std::endl;
std::cout << (check_ec(ngCert, apCert, sig, hash2) ? "ok" : "invalid") << "...";
std::cout << "done" << std::endl;
} }
} // io } // io

View File

@ -139,7 +139,7 @@ void WiiSaveWriter::writeBanner(WiiBanner *banner)
delete[] tmpIcon; // delete tmp buffer; delete[] tmpIcon; // delete tmp buffer;
Uint8* hash = new Uint8[0x10]; Uint8* hash = new Uint8[0x10];
MD5(hash, (Uint8*)base::data(), 0xF0C0); MD5Hash::MD5(hash, (Uint8*)base::data(), 0xF0C0);
base::seek(0x0E, Stream::Beginning); base::seek(0x0E, Stream::Beginning);
base::writeBytes((Int8*)hash, 0x10); base::writeBytes((Int8*)hash, 0x10);

View File

@ -8,9 +8,6 @@
// Not all of these headers are necessary, figure out which ones are actually used and prune those that are irrelevant. // Not all of these headers are necessary, figure out which ones are actually used and prune those that are irrelevant.
#include <string.h> #include <string.h>
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <utility.hpp> #include <utility.hpp>
#include "bn.h" #include "bn.h"

View File

@ -86,6 +86,8 @@
#include "md5.h" #include "md5.h"
namespace MD5Hash
{
/* -------------------------------------------------------------------------- ** /* -------------------------------------------------------------------------- **
* Static Constants: * Static Constants:
* *
@ -547,7 +549,7 @@ unsigned char * MD5fromFile(unsigned char *dst, const char *src)
blksize = filesize; blksize = filesize;
else blksize = 1048576; else blksize = 1048576;
buffer = malloc(blksize); buffer = (unsigned char*)malloc(blksize);
if (buffer == NULL) if (buffer == NULL)
{ {
@ -606,5 +608,5 @@ unsigned char * StringToMD5(const char * hash, unsigned char * dst)
return dst; return dst;
} }
} // MD5Hash
/* ========================================================================== */ /* ========================================================================== */