diff options
author | Revo <projectrevotpp@hotmail.com> | 2020-05-23 07:23:16 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-23 07:23:16 -0400 |
commit | 0b01c7d1c57c4e21fdb0069b3ac4f9c7276b3cc1 (patch) | |
tree | 2f30c7bd3c7300bba75a1738b08faa16de57cea2 /arm9/lib | |
parent | 79a7e3dac84f719ca4d0131ac2e30e2c6a4bd73e (diff) | |
parent | 936ea8a0134ed8095f9496ebe1571866509530d7 (diff) |
Merge pull request #104 from Cleverking2003/master
Decompile libmath
Diffstat (limited to 'arm9/lib')
-rw-r--r-- | arm9/lib/include/MATH_crc.h | 38 | ||||
-rw-r--r-- | arm9/lib/include/MATH_dgt.h | 45 | ||||
-rw-r--r-- | arm9/lib/include/MATH_pop.h | 8 | ||||
-rw-r--r-- | arm9/lib/include/dgt.h | 37 | ||||
-rw-r--r-- | arm9/lib/include/math.h | 9 | ||||
-rw-r--r-- | arm9/lib/src/MATH_crc.c | 150 | ||||
-rw-r--r-- | arm9/lib/src/MATH_dgt.c | 16 | ||||
-rw-r--r-- | arm9/lib/src/MATH_pop.c | 12 |
8 files changed, 315 insertions, 0 deletions
diff --git a/arm9/lib/include/MATH_crc.h b/arm9/lib/include/MATH_crc.h new file mode 100644 index 00000000..800b738b --- /dev/null +++ b/arm9/lib/include/MATH_crc.h @@ -0,0 +1,38 @@ +#ifndef GUARD_MATH_CRC_H +#define GUARD_MATH_CRC_H + +#include "types.h" + +typedef u8 MATHCRC8Context; +typedef u16 MATHCRC16Context; +typedef u32 MATHCRC32Context; + +struct MATHCRC8Table { + u8 table[256]; +}; + +struct MATHCRC16Table { + u16 table[256]; +}; + +struct MATHCRC32Table { + u32 table[256]; +}; + +u32 MATH_CalcCRC32(const struct MATHCRC32Table *table, const void *data, u32 dataLength); +void MATHi_CRC32UpdateRev(const struct MATHCRC32Table *table, MATHCRC32Context *context, const void *input, u32 length); +u16 MATH_CalcCRC16CCITT(const struct MATHCRC16Table *table, const void *data, u32 dataLength); +void MATHi_CRC16Update(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length); +u16 MATH_CalcCRC16(const struct MATHCRC16Table *table, const void *data, u32 dataLength); +void MATHi_CRC16UpdateRev(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length); +u8 MATH_CalcCRC8(const struct MATHCRC8Table *table, const void *data, u32 dataLength); +void MATHi_CRC8Update(const struct MATHCRC8Table *table, MATHCRC8Context *context, const void *input, u32 length); +void MATHi_CRC32InitTableRev(struct MATHCRC32Table *table, u32 poly); +void MATHi_CRC16UpdateRev(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length); +void MATHi_CRC16Update(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length); +void MATHi_CRC16InitTableRev(struct MATHCRC16Table *table, u16 poly); +void MATHi_CRC16InitTable(struct MATHCRC16Table *table, u16 poly); +void MATHi_CRC8Update(const struct MATHCRC8Table *table, MATHCRC8Context *context, const void *input, u32 length); +void MATHi_CRC8InitTable(struct MATHCRC8Table *table, u8 poly); + +#endif diff --git a/arm9/lib/include/MATH_dgt.h b/arm9/lib/include/MATH_dgt.h new file mode 100644 index 00000000..9eb3d2ef --- /dev/null +++ b/arm9/lib/include/MATH_dgt.h @@ -0,0 +1,45 @@ +#ifndef GUARD_MATH_DGT_H +#define GUARD_MATH_DGT_H + +#include "dgt.h" +#include "types.h" + +typedef struct DGTHash1Context MATHMD5Context; +typedef struct DGTHash2Context MATHSHA1Context; + +static inline void MATH_MD5Init(MATHMD5Context *context) { + DGT_Hash1Reset(context); +} + +static inline void MATH_MD5Update(MATHMD5Context *context, const void *input, u32 length) { + DGT_Hash1SetSource(context, (u8*)input, length); +} + +static inline void MATH_MD5GetHash(MATHMD5Context *context, void *digest) { + DGT_Hash1GetDigest_R((u8*)digest, context); +} + +static inline void MATH_MD5GetDigest(MATHMD5Context *context, void *digest) { + MATH_MD5GetHash(context, digest); +} + +static inline void MATH_SHA1Init(MATHSHA1Context *context) { + DGT_Hash2Reset(context); +} + +static inline void MATH_SHA1Update(MATHSHA1Context *context, const void *input, u32 length) { + DGT_Hash2SetSource(context, (u8*)input, length); +} + +static inline void MATH_SHA1GetHash(MATHSHA1Context *context, void *digest) { + DGT_Hash2GetDigest(context, (u8*)digest); +} + +static inline void MATH_SHA1GetDigest(MATHSHA1Context *context, void *digest) { + MATH_SHA1GetHash(context, digest); +} + +void MATH_CalcMD5(void *digest, const void *data, u32 dataLength); +void MATH_CalcSHA1(void *digest, const void *data, u32 dataLength); + +#endif diff --git a/arm9/lib/include/MATH_pop.h b/arm9/lib/include/MATH_pop.h new file mode 100644 index 00000000..89dab0c0 --- /dev/null +++ b/arm9/lib/include/MATH_pop.h @@ -0,0 +1,8 @@ +#ifndef GUARD_MATH_POP_H +#define GUARD_MATH_POP_H + +#include "types.h" + +u8 MATH_CountPopulation(u32); + +#endif diff --git a/arm9/lib/include/dgt.h b/arm9/lib/include/dgt.h new file mode 100644 index 00000000..a764e85a --- /dev/null +++ b/arm9/lib/include/dgt.h @@ -0,0 +1,37 @@ +#ifndef GUARD_DGT_H +#define GUARD_DGT_H + +#include "types.h" + +struct DGTHash1Context { + union { + struct { + unsigned long a, b, c, d; + }; + unsigned long state[4]; + }; + unsigned long long length; + union { + unsigned long buffer32[16]; + unsigned char buffer8[64]; + }; +}; + +struct DGTHash2Context { + unsigned long Intermediate_Hash[5]; + unsigned long Length_Low; + unsigned long Length_High; + int Message_Block_Index; + unsigned char Message_Block[64]; + int Computed; + int Corrupted; +}; + +void DGT_Hash1Reset(struct DGTHash1Context *context); +void DGT_Hash1SetSource(struct DGTHash1Context *context, u8 *input, u32 length); +void DGT_Hash1GetDigest_R(u8 *digest, struct DGTHash1Context *context); +void DGT_Hash2Reset(struct DGTHash2Context *context); +void DGT_Hash2SetSource(struct DGTHash2Context *context, u8 *input, u32 length); +void DGT_Hash2GetDigest(struct DGTHash2Context *context, u8 *digest); + +#endif diff --git a/arm9/lib/include/math.h b/arm9/lib/include/math.h new file mode 100644 index 00000000..085aa24f --- /dev/null +++ b/arm9/lib/include/math.h @@ -0,0 +1,9 @@ +#ifndef GUARD_MATH_H +#define GUARD_MATH_H + +#include "dgt.h" +#include "MATH_pop.h" +#include "MATH_crc.h" +#include "MATH_dgt.h" + +#endif diff --git a/arm9/lib/src/MATH_crc.c b/arm9/lib/src/MATH_crc.c new file mode 100644 index 00000000..ec0ccad0 --- /dev/null +++ b/arm9/lib/src/MATH_crc.c @@ -0,0 +1,150 @@ +#include "global.h" +#include "MATH_crc.h" + +ARM_FUNC void MATHi_CRC8InitTable(struct MATHCRC8Table *table, u8 poly) { + u32 r, i, j; + u8 *t = table->table; + + for (i = 0; i < 256; i++) { + r = i; + for (j = 0; j < 8; j++) { + if (r & 0x80) { + r = (r << 1) ^ poly; + } + else { + r <<= 1; + } + } + t[i] = r; + } +} + +ARM_FUNC void MATHi_CRC8Update(const struct MATHCRC8Table *table, MATHCRC8Context *context, const void *input, u32 length) { + u32 r, i; + const u8* t = table->table; + u8* data = (u8*)input; + + r = *context; + for (i = 0; i < length; i++) { + r = t[(r ^ *data) & 0xff]; + data++; + } + *context = r; +} + +ARM_FUNC void MATHi_CRC16InitTable(struct MATHCRC16Table *table, u16 poly) { + u32 r, i, j; + u16 *t = table->table; + + for (i = 0; i < 256; i++) { + r = i << 8; + for (j = 0; j < 8; j++) { + if (r & 0x8000) { + r = (r << 1) ^ poly; + } + else { + r <<= 1; + } + } + t[i] = r; + } +} + +ARM_FUNC void MATHi_CRC16InitTableRev(struct MATHCRC16Table *table, u16 poly) { + u32 r, i, j; + u16 *t = table->table; + + for (i = 0; i < 256; i++) { + r = i; + for (j = 0; j < 8; j++) { + if (r & 1) { + r = (r >> 1) ^ poly; + } + else { + r >>= 1; + } + } + t[i] = r; + } +} + +ARM_FUNC void MATHi_CRC16Update(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length) { + u32 r, i; + const u16* t = table->table; + u8* data = (u8*)input; + + r = *context; + for (i = 0; i < length; i++) { + r = (r << 8) ^ t[((r >> 8) ^ *data) & 0xff]; + data++; + } + *context = r; +} + +ARM_FUNC void MATHi_CRC16UpdateRev(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length) { + u32 r, i; + const u16* t = table->table; + u8* data = (u8*)input; + + r = *context; + for (i = 0; i < length; i++) { + r = (r >> 8) ^ t[(r ^ *data) & 0xff]; + data++; + } + *context = r; +} + +ARM_FUNC void MATHi_CRC32InitTableRev(struct MATHCRC32Table *table, u32 poly) { + u32 r, i, j; + u32 *t = table->table; + + for (i = 0; i < 256; i++) { + r = i; + for (j = 0; j < 8; j++) { + if (r & 1) { + r = (r >> 1) ^ poly; + } + else { + r >>= 1; + } + } + t[i] = r; + } +} + +ARM_FUNC void MATHi_CRC32UpdateRev(const struct MATHCRC32Table *table, MATHCRC32Context *context, const void *input, u32 length) { + u32 r, i; + const u32* t = table->table; + u8* data = (u8*)input; + + r = *context; + for (i = 0; i < length; i++) { + r = (r >> 8) ^ t[(r ^ *data) & 0xff]; + data++; + } + *context = r; +} + +ARM_FUNC u8 MATH_CalcCRC8(const struct MATHCRC8Table *table, const void *data, u32 dataLength) { + MATHCRC8Context ctx = 0; + MATHi_CRC8Update(table, &ctx, data, dataLength); + return ctx; +} + +ARM_FUNC u16 MATH_CalcCRC16(const struct MATHCRC16Table *table, const void *data, u32 dataLength) { + MATHCRC16Context ctx = 0; + MATHi_CRC16UpdateRev(table, &ctx, data, dataLength); + return ctx; +} + +ARM_FUNC u16 MATH_CalcCRC16CCITT(const struct MATHCRC16Table *table, const void *data, u32 dataLength) { + MATHCRC16Context ctx = 0xffff; + MATHi_CRC16Update(table, &ctx, data, dataLength); + return ctx; +} + +ARM_FUNC u32 MATH_CalcCRC32(const struct MATHCRC32Table *table, const void *data, u32 dataLength) { + MATHCRC32Context ctx = ~0; + MATHi_CRC32UpdateRev(table, &ctx, data, dataLength); + return ~ctx; +} diff --git a/arm9/lib/src/MATH_dgt.c b/arm9/lib/src/MATH_dgt.c new file mode 100644 index 00000000..6bb90d99 --- /dev/null +++ b/arm9/lib/src/MATH_dgt.c @@ -0,0 +1,16 @@ +#include "global.h" +#include "MATH_dgt.h" + +ARM_FUNC void MATH_CalcMD5(void *digest, const void *data, u32 dataLength) { + MATHMD5Context context; + MATH_MD5Init(&context); + MATH_MD5Update(&context, data, dataLength); + MATH_MD5GetHash(&context, digest); +} + +ARM_FUNC void MATH_CalcSHA1(void *digest, const void *data, u32 dataLength) { + MATHSHA1Context context; + MATH_SHA1Init(&context); + MATH_SHA1Update(&context, data, dataLength); + MATH_SHA1GetHash(&context, digest); +} diff --git a/arm9/lib/src/MATH_pop.c b/arm9/lib/src/MATH_pop.c new file mode 100644 index 00000000..18582494 --- /dev/null +++ b/arm9/lib/src/MATH_pop.c @@ -0,0 +1,12 @@ +#include "global.h" +#include "MATH_pop.h" + +ARM_FUNC u8 MATH_CountPopulation(u32 x) { + x -= (x >> 1) & 0x55555555; + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x += x >> 4; + x &= 0x0f0f0f0f; + x += x >> 8; + x += x >> 16; + return (u8)x; +} |