summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/MATH_dgt.s47
-rw-r--r--arm9/lib/include/MATH.h8
-rw-r--r--arm9/lib/include/MATH_crc.h38
-rw-r--r--arm9/lib/include/MATH_dgt.h45
-rw-r--r--arm9/lib/include/dgt.h30
-rw-r--r--arm9/lib/include/math.h8
-rw-r--r--arm9/lib/src/MATH.c12
-rw-r--r--arm9/lib/src/MATH_crc.c150
-rw-r--r--arm9/lib/src/MATH_dgt.c16
9 files changed, 307 insertions, 47 deletions
diff --git a/arm9/asm/MATH_dgt.s b/arm9/asm/MATH_dgt.s
deleted file mode 100644
index 12d05588..00000000
--- a/arm9/asm/MATH_dgt.s
+++ /dev/null
@@ -1,47 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start MATH_CalcSHA1
-MATH_CalcSHA1: ; 0x020DDCA0
- stmdb sp!, {r4-r6,lr}
- sub sp, sp, #0x68
- mov r6, r0
- add r0, sp, #0x0
- mov r5, r1
- mov r4, r2
- bl DGT_Hash2Reset
-_020DDCBC: ; 0x020DDCBC
- add r0, sp, #0x0
- mov r1, r5
- mov r2, r4
- bl DGT_Hash2SetSource
-_020DDCCC: ; 0x020DDCCC
- add r0, sp, #0x0
- mov r1, r6
- bl DGT_Hash2GetDigest
- add sp, sp, #0x68
- ldmia sp!, {r4-r6,lr}
- bx lr
-
- arm_func_start MATH_CalcMD5
-MATH_CalcMD5: ; 0x020DDCE4
- stmdb sp!, {r4-r6,lr}
- sub sp, sp, #0x58
- mov r6, r0
- add r0, sp, #0x0
- mov r5, r1
- mov r4, r2
- bl DGT_Hash1Reset
-_020DDD00: ; 0x020DDD00
- add r0, sp, #0x0
- mov r1, r5
- mov r2, r4
- bl DGT_Hash1SetSource
- add r1, sp, #0x0
- mov r0, r6
- bl DGT_Hash1GetDigest_R
- add sp, sp, #0x58
- ldmia sp!, {r4-r6,lr}
- bx lr
diff --git a/arm9/lib/include/MATH.h b/arm9/lib/include/MATH.h
new file mode 100644
index 00000000..037492f5
--- /dev/null
+++ b/arm9/lib/include/MATH.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_MATH_H
+#define GUARD_MATH_H
+
+#include "types.h"
+
+u8 MATH_CountPopulation(u32);
+
+#endif
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/dgt.h b/arm9/lib/include/dgt.h
new file mode 100644
index 00000000..5e63f3f7
--- /dev/null
+++ b/arm9/lib/include/dgt.h
@@ -0,0 +1,30 @@
+#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;
+};
+
+#endif
diff --git a/arm9/lib/include/math.h b/arm9/lib/include/math.h
new file mode 100644
index 00000000..80d7cc26
--- /dev/null
+++ b/arm9/lib/include/math.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_LIBMATH_H
+#define GUARD_LIBMATH_H
+
+#include "MATH.h"
+#include "MATH_crc.h"
+#include "MATH_dgt.h"
+
+#endif
diff --git a/arm9/lib/src/MATH.c b/arm9/lib/src/MATH.c
new file mode 100644
index 00000000..a14779ac
--- /dev/null
+++ b/arm9/lib/src/MATH.c
@@ -0,0 +1,12 @@
+#include "global.h"
+#include "MATH.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;
+}
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..f59d24e4
--- /dev/null
+++ b/arm9/lib/src/MATH_dgt.c
@@ -0,0 +1,16 @@
+#include "global.h"
+#include "MATH_dgt.h"
+
+void MATH_CalcMD5(void *digest, const void *data, u32 dataLength) {
+ MATHMD5Context context;
+ MATH_MD5Init(&context);
+ MATH_MD5Update(&context, data, dataLength);
+ MATH_MD5GetHash(&context, digest);
+}
+
+void MATH_CalcSHA1(void *digest, const void *data, u32 dataLength) {
+ MATHSHA1Context context;
+ MATH_SHA1Init(&context);
+ MATH_SHA1Update(&context, data, dataLength);
+ MATH_SHA1GetHash(&context, digest);
+}