From 72ab3d7f6c4d4def2398f6bf4ed2678d98f1002b Mon Sep 17 00:00:00 2001 From: Juchan Roh Date: Sat, 4 Feb 2023 23:06:01 +0900 Subject: [PATCH] refactor: type CardConv module --- .../app/src/main/java/tk/nulldori/eamemu/A.kt | 176 +++++++++++++++++ .../app/src/main/java/tk/nulldori/eamemu/B.kt | 185 ++++++++++++++++++ .../app/src/main/java/tk/nulldori/eamemu/E.kt | 52 +++++ src/module/CardConv.js | 3 - src/module/CardConv.ts | 9 + 5 files changed, 422 insertions(+), 3 deletions(-) create mode 100644 android/app/src/main/java/tk/nulldori/eamemu/A.kt create mode 100644 android/app/src/main/java/tk/nulldori/eamemu/B.kt create mode 100644 android/app/src/main/java/tk/nulldori/eamemu/E.kt delete mode 100644 src/module/CardConv.js create mode 100644 src/module/CardConv.ts diff --git a/android/app/src/main/java/tk/nulldori/eamemu/A.kt b/android/app/src/main/java/tk/nulldori/eamemu/A.kt new file mode 100644 index 0000000..84675d3 --- /dev/null +++ b/android/app/src/main/java/tk/nulldori/eamemu/A.kt @@ -0,0 +1,176 @@ +package tk.nulldori.eamemu + +import java.io.UnsupportedEncodingException +import kotlin.experimental.xor + +class A { + private var a: B? = null + + init { + try { + this.a = B("?I\'llB2c.YouXXXeMeHaYpy!".toByteArray(charset("US-ASCII"))) + } catch (v0: UnsupportedEncodingException) { + throw RuntimeException(v0) + } + + } + private val validCharacters = "0123456789ABCDEFGHJKLMNPRSTUWXYZ" + + fun toKonamiID(arg11: String): String { + if (arg11.length != 16) { + throw RuntimeException("Invalid UID length") + } + return when { + arg11.toUpperCase().startsWith("E004") -> toKonamiID(arg11, 1.toByte()) + arg11.toUpperCase().startsWith("0") -> toKonamiID(arg11, 2.toByte()) + else -> throw RuntimeException("Invalid UID prefix") + } + } + + fun toKonamiID(arg11: String, card_type: Byte): String { + var v3: ByteArray + val v9 = 13 + val v8 = 16 + val v7 = 8 + var v0 = 0 + try { + v3 = E.a(arg11 as CharSequence) + } catch (v0_1: Exception) { + throw IllegalArgumentException(v0_1 as Throwable) + } + + if (v3.size != v7) { + throw IllegalArgumentException("KONAMI ID should be 8 bytes, not " + v3.size) + } + + var v4 = ByteArray(v7) + var v1: Int + v1 = 0 + while (v1 < v7) { + v4[7 - v1] = v3[v1] + ++v1 + } + + v3 = this.a!!.a(v4) + v4 = ByteArray(65) + v1 = 0 + while (v1 < 64) { + v4[v1] = (v3[v1 shr 3].toInt() shr (v1 xor -1 and 7) and 1).toByte() + ++v1 + } + + v3 = ByteArray(v8) + v1 = 0 + while (v1 < v9) { + v3[v1] = (v4[v1 * 5].toInt() shl 4 and 255 or (v4[v1 * 5 + 1].toInt() shl 3 and 255) or (v4[v1 * 5 + 2].toInt() shl 2 and 255) or (v4[v1 * 5 + 3].toInt() shl 1 and 255) or (v4[v1 * 5 + 4].toInt() and 255)).toByte() + ++v1 + } + + v3[v9] = 1 + v3[0] = (v3[0].toInt() xor card_type.toInt()).toByte() + v1 = 1 + while (v1 < 14) { + v3[v1] = v3[v1] xor v3[v1 - 1] + ++v1 + } + + v3[14] = card_type + v3[15] = calculate_checksum(v3).toByte() + val v1_1 = CharArray(v8) + while (v0 < v8) { + v1_1[v0] = "0123456789ABCDEFGHJKLMNPRSTUWXYZ".get(v3[v0].toInt()) + ++v0 + } + + return String(v1_1) + } + + fun toUID(str: String): String { + return when(str[14]) { + '1' -> toUID(str, 1.toByte()) + '2' -> toUID(str, 2.toByte()) + else -> throw RuntimeException("Invalid Konami ID") + } + } + + fun toUID(str: String, card_type: Byte): String { + if (str.length != 16) { + throw RuntimeException("KONAMI ID should be 16 characters, not ${str.length}") + } + val bArr = ByteArray(16) + for (i in 0 until 16) { + val index = validCharacters.indexOf(str[i]) + if (index >= 0) { + bArr[i] = index.toByte() + } + else { + throw RuntimeException("KONAMI ID entered is not Upper Alpha Numeric. See character $i") + } + } + return toUID(bArr, card_type) + } + + fun toUID(bArr: ByteArray) = toUID(bArr.copyOf(), bArr[14]) + + private fun toUID(bArr: ByteArray, card_type: Byte): String { + + if (bArr[11] % 2 != bArr[12] % 2) { + throw RuntimeException("Wrong parity") + } + if (bArr[13] != bArr[12] xor 1) { + throw RuntimeException("14th character must be 13th character xor 1") + } + if (bArr[14] == card_type && bArr[15].toInt() == calculate_checksum(bArr)) { + var i2 = 13 + while (i2 > 0) { + bArr[i2] = (bArr[i2].toInt() xor bArr[i2 - 1].toInt()).toByte() + i2-- + } + bArr[0] = (bArr[0].toInt() xor card_type.toInt()).toByte() + var bArr2 = ByteArray(64) + i2 = 0 + while (i2 < 64) { + bArr2[i2] = (bArr[i2 / 5].toInt() shr 4 - i2 % 5 and 1).toByte() + i2++ + } + var bArr3 = ByteArray(8) + i2 = 0 + while (i2 < 64) { + val i3 = i2 / 8 + bArr3[i3] = (bArr3[i3].toInt() or (bArr2[i2].toInt() shl (i2 xor -1 and 7)).toByte().toInt()).toByte() + i2++ + } + bArr2 = this.a!!.b(bArr3) + bArr3 = ByteArray(8) + i2 = 0 + while (i2 < 8) { + bArr3[i2] = bArr2[7 - i2] + i2++ + } + val prefix = bArr3[0].toInt() and 0xFF shl 8 or (bArr3[1].toInt() and 0xFF) + if (card_type.toInt() == 1 && prefix == 0xE004 || card_type.toInt() == 2 && (prefix and 0xF000 == 0)) { + return E.a(bArr3) + } + //throw RuntimeException("Decoding failed: Prefix ${prefix.toString(16)} does not match card type.") + return "" // Exceptions are slow, so return an empty string here instead + //throw new RuntimeException("Sanity check error, KONAMI ID does not decode to ICODE with NXP chip"); + } + throw RuntimeException("Invalid Checksum") + } + fun calculate_checksum(arg4: ByteArray): Int { + var v0 = 0 + var v1 = 0 + while (v1 < 15) { + val v2 = (v1 % 3 + 1) * arg4[v1] + v0 + ++v1 + v0 = v2 + } + + while (v0 >= 32) { + v0 = v0.ushr(5) + (v0 and 31) + } + + return v0 + } +} + diff --git a/android/app/src/main/java/tk/nulldori/eamemu/B.kt b/android/app/src/main/java/tk/nulldori/eamemu/B.kt new file mode 100644 index 0000000..3260bfc --- /dev/null +++ b/android/app/src/main/java/tk/nulldori/eamemu/B.kt @@ -0,0 +1,185 @@ +package tk.nulldori.eamemu + +class B(arg4: ByteArray) { + private val k: IntArray + + init { + this.k = IntArray(96) + if (arg4.size != 24) { + throw IllegalArgumentException("Key was not 24 bytes, instead was " + arg4.size) + } + + this.a(arg4, 0, 0) + this.a(arg4, 8, 32) + this.a(arg4, 16, 64) + } + + fun a(arg5: ByteArray): ByteArray { + val v1 = 8 + if (arg5.size != v1) { + throw IllegalArgumentException("Input was not 8 bytes long, instead was " + arg5.size) + } + + val v0 = ByteArray(v1) + a(v0, this.a(0, c(arg5))) + a(v0, this.b(32, c(v0))) + a(v0, this.a(64, c(v0))) + return v0 + } + + private fun a(arg9: ByteArray, arg10: Int, arg11: Int) { + val v4 = ByteArray(56) + var v2: Int + v2 = 0 + while (v2 < 8) { + var v0: Int + v0 = 0 + while (v0 < 7) { + v4[55 - v2 * 7 - v0] = (arg9[arg10 + v2].toInt()ushr(v0) and 1).toByte() + ++v0 + } + ++v2 + } + var v0: Int + + v0 = 0 + while (v0 < 32) { + v2 = 0 + var v3: Int + v3 = 0 + while (v3 < 24) { + v2 = v2 or (v4[a!![v0 * 24 + v3].toInt()].toInt() shl b!![(v0 and 1) * 24 + v3].toInt()) + ++v3 + } + + this.k[arg11 + v0] = v2 + ++v0 + } + } + + private fun a(arg10: Int, arg11: Long): Long { + val v8 = 28 + val v7 = 32 + var v0 = arg11.ushr(v7).toInt() + var v2 = arg11.toInt() + var v1: Int + v1 = 0 + while (v1 < v7) { + var v3 = a(this.k[arg10 + v1 + 1] xor v0, v8) + v2 = v2 xor (j[v3.ushr(2) and 63] xor (g[v3.ushr(26) and 63] xor h[v3.ushr(18) and 63] xor i[v3.ushr(10) and 63]) xor c[(this.k[arg10 + v1] xor v0).ushr(26) and 63] xor d[(this.k[arg10 + v1] xor v0).ushr(18) and 63] xor e[(this.k[arg10 + v1] xor v0).ushr(10) and 63] xor f[(this.k[arg10 + v1] xor v0).ushr(2) and 63]) + v3 = a(this.k[arg10 + v1 + 3] xor v2, v8) + v0 = v0 xor (j[v3.ushr(2) and 63] xor (g[v3.ushr(26) and 63] xor h[v3.ushr(18) and 63] xor i[v3.ushr(10) and 63]) xor c[(this.k[arg10 + v1 + 2] xor v2).ushr(26) and 63] xor d[(this.k[arg10 + v1 + 2] xor v2).ushr(18) and 63] xor e[(this.k[arg10 + v1 + 2] xor v2).ushr(10) and 63] xor f[(this.k[arg10 + v1 + 2] xor v2).ushr(2) and 63]) + v1 += 4 + } + + return v0.toLong() shl v7 or (v2.toLong() and 4294967295L) + } + + fun b(arg5: ByteArray): ByteArray { + val v1 = 8 + if (arg5.size != v1) { + throw IllegalArgumentException("Input was not 8 bytes long, instead was " + arg5.size) + } + + val v0 = ByteArray(v1) + a(v0, this.b(64, c(arg5))) + a(v0, this.a(32, c(v0))) + a(v0, this.b(0, c(v0))) + return v0 + } + + private fun b(arg11: Int, arg12: Long): Long { + val v9 = 28 + val v8 = 32 + var v0 = arg12.ushr(v8).toInt() + var v2 = arg12.toInt() + var v1: Int + v1 = 0 + while (v1 < v8) { + var v3 = a(this.k[arg11 + 31 - v1] xor v0, v9) + v2 = v2 xor (j[v3.ushr(2) and 63] xor (c[(this.k[arg11 + 30 - v1] xor v0).ushr(26) and 63] xor d[(this.k[arg11 + 30 - v1] xor v0).ushr(18) and 63] xor e[(this.k[arg11 + 30 - v1] xor v0).ushr(10) and 63] xor f[(this.k[arg11 + 30 - v1] xor v0).ushr(2) and 63] xor g[v3.ushr(26) and 63] xor h[v3.ushr(18) and 63] xor i[v3.ushr(10) and 63])) + v3 = a(this.k[arg11 + 29 - v1] xor v2, v9) + v0 = v0 xor (j[v3.ushr(2) and 63] xor (c[(this.k[arg11 + 28 - v1] xor v2).ushr(26) and 63] xor d[(this.k[arg11 + 28 - v1] xor v2).ushr(18) and 63] xor e[(this.k[arg11 + 28 - v1] xor v2).ushr(10) and 63] xor f[(this.k[arg11 + 28 - v1] xor v2).ushr(2) and 63] xor g[v3.ushr(26) and 63] xor h[v3.ushr(18) and 63] xor i[v3.ushr(10) and 63])) + v1 += 4 + } + + return v0.toLong() shl v8 or (v2.toLong() and 4294967295L) + } + + companion object { + private var a: ByteArray? = null + private var b: ByteArray? = null + private val c: IntArray + private val d: IntArray + private val e: IntArray + private val f: IntArray + private val g: IntArray + private val h: IntArray + private val i: IntArray + private val j: IntArray + + init { + a = byteArrayOf(0x22, 0xd, 0x5, 0x2e, 0x2f, 0x12, 0x20, 0x29, 0xb, 0x35, 0x21, 0x14, 0xe, 0x24, 0x1e, 0x18, 0x31, 0x2, 0xf, 0x25, 0x2a, 0x32, 0x0, 0x15, 0x26, 0x30, 0x6, 0x1a, 0x27, 0x4, 0x34, 0x19, 0xc, 0x1b, 0x1f, 0x28, 0x1, 0x11, 0x1c, 0x1d, 0x17, 0x33, 0x23, 0x7, 0x3, 0x16, 0x9, 0x2b, 0x29, 0x14, 0xc, 0x35, 0x36, 0x19, 0x27, 0x30, 0x12, 0x1f, 0x28, 0x1b, 0x15, 0x2b, 0x25, 0x0, 0x1, 0x9, 0x16, 0x2c, 0x31, 0x2, 0x7, 0x1c, 0x2d, 0x37, 0xd, 0x21, 0x2e, 0xb, 0x6, 0x20, 0x13, 0x22, 0x26, 0x2f, 0x8, 0x18, 0x23, 0x24, 0x1e, 0x3, 0x2a, 0xe, 0xa, 0x1d, 0x10, 0x32, 0x37, 0x22, 0x1a, 0x26, 0xb, 0x27, 0x35, 0x5, 0x20, 0x2d, 0x36, 0x29, 0x23, 0x2, 0x33, 0xe, 0xf, 0x17, 0x24, 0x3, 0x8, 0x10, 0x15, 0x2a, 0x6, 0xc, 0x1b, 0x2f, 0x1f, 0x19, 0x14, 0x2e, 0x21, 0x30, 0x34, 0x4, 0x16, 0x7, 0x31, 0x32, 0x2c, 0x11, 0x1, 0x1c, 0x18, 0x2b, 0x1e, 0x9, 0xc, 0x30, 0x28, 0x34, 0x19, 0x35, 0x26, 0x13, 0x2e, 0x6, 0xb, 0x37, 0x31, 0x10, 0xa, 0x1c, 0x1d, 0x25, 0x32, 0x11, 0x16, 0x1e, 0x23, 0x1, 0x14, 0x1a, 0x29, 0x4, 0x2d, 0x27, 0x22, 0x1f, 0x2f, 0x5, 0xd, 0x12, 0x24, 0x15, 0x8, 0x9, 0x3, 0x0, 0xf, 0x2a, 0x7, 0x2, 0x2c, 0x17, 0x1a, 0x5, 0x36, 0xd, 0x27, 0x26, 0x34, 0x21, 0x1f, 0x14, 0x19, 0xc, 0x8, 0x1e, 0x18, 0x2a, 0x2b, 0x33, 0x9, 0x0, 0x24, 0x2c, 0x31, 0xf, 0x22, 0x28, 0x37, 0x12, 0x6, 0x35, 0x30, 0x2d, 0x4, 0x13, 0x1b, 0x20, 0x32, 0x23, 0x16, 0x17, 0x11, 0xe, 0x1d, 0x1, 0x15, 0x10, 0x3, 0x25, 0x28, 0x13, 0xb, 0x1b, 0x35, 0x34, 0xd, 0x2f, 0x2d, 0x22, 0x27, 0x1a, 0x16, 0x2c, 0x7, 0x1, 0x2, 0xa, 0x17, 0xe, 0x32, 0x3, 0x8, 0x1d, 0x30, 0x36, 0xc, 0x20, 0x14, 0x26, 0x5, 0x6, 0x12, 0x21, 0x29, 0x2e, 0x9, 0x31, 0x24, 0x25, 0x0, 0x1c, 0x2b, 0xf, 0x23, 0x1e, 0x11, 0x33, 0x36, 0x21, 0x19, 0x29, 0x26, 0xd, 0x1b, 0x4, 0x6, 0x30, 0x35, 0x28, 0x24, 0x3, 0x15, 0xf, 0x10, 0x18, 0x25, 0x1c, 0x9, 0x11, 0x16, 0x2b, 0x5, 0xb, 0x1a, 0x2e, 0x22, 0x34, 0x13, 0x14, 0x20, 0x2f, 0x37, 0x1f, 0x17, 0x8, 0x32, 0x33, 0xe, 0x2a, 0x2, 0x1d, 0x31, 0x2c, 0x0, 0xa, 0xb, 0x2f, 0x27, 0x37, 0x34, 0x1b, 0x29, 0x12, 0x14, 0x5, 0x26, 0x36, 0x32, 0x11, 0x23, 0x1d, 0x1e, 0x7, 0x33, 0x2a, 0x17, 0x0, 0x24, 0x2, 0x13, 0x19, 0x28, 0x1f, 0x30, 0xd, 0x21, 0x22, 0x2e, 0x4, 0xc, 0x2d, 0x25, 0x16, 0x9, 0xa, 0x1c, 0x1, 0x10, 0x2b, 0x8, 0x3, 0xe, 0x18, 0x12, 0x36, 0x2e, 0x5, 0x6, 0x22, 0x30, 0x19, 0x1b, 0xc, 0x2d, 0x4, 0x2, 0x18, 0x2a, 0x24, 0x25, 0xe, 0x3, 0x31, 0x1e, 0x7, 0x2b, 0x9, 0x1a, 0x20, 0x2f, 0x26, 0x37, 0x14, 0x28, 0x29, 0x35, 0xb, 0x13, 0x34, 0x2c, 0x1d, 0x10, 0x11, 0x23, 0x8, 0x17, 0x32, 0xf, 0xa, 0x15, 0x0, 0x20, 0xb, 0x1f, 0x13, 0x14, 0x30, 0x5, 0x27, 0x29, 0x1a, 0x6, 0x12, 0x10, 0x7, 0x1, 0x32, 0x33, 0x1c, 0x11, 0x8, 0x2c, 0x15, 0x2, 0x17, 0x28, 0x2e, 0x4, 0x34, 0xc, 0x22, 0x36, 0x37, 0x26, 0x19, 0x21, 0xd, 0x3, 0x2b, 0x1e, 0x0, 0x31, 0x16, 0x25, 0x9, 0x1d, 0x18, 0x23, 0xe, 0x2e, 0x19, 0x2d, 0x21, 0x22, 0x5, 0x13, 0x35, 0x37, 0x28, 0x14, 0x20, 0x1e, 0x15, 0xf, 0x9, 0xa, 0x2a, 0x0, 0x16, 0x3, 0x23, 0x10, 0x25, 0x36, 0x1f, 0x12, 0xd, 0x1a, 0x30, 0xb, 0xc, 0x34, 0x27, 0x2f, 0x1b, 0x11, 0x2, 0x2c, 0xe, 0x8, 0x24, 0x33, 0x17, 0x2b, 0x7, 0x31, 0x1c, 0x1f, 0x27, 0x6, 0x2f, 0x30, 0x13, 0x21, 0x26, 0xc, 0x36, 0x22, 0x2e, 0x2c, 0x23, 0x1d, 0x17, 0x18, 0x1, 0xe, 0x24, 0x11, 0x31, 0x1e, 0x33, 0xb, 0x2d, 0x20, 0x1b, 0x28, 0x5, 0x19, 0x1a, 0xd, 0x35, 0x4, 0x29, 0x0, 0x10, 0x3, 0x1c, 0x16, 0x32, 0xa, 0x25, 0x2, 0x15, 0x8, 0x2a, 0x2d, 0x35, 0x14, 0x4, 0x5, 0x21, 0x2f, 0x34, 0x1a, 0xb, 0x30, 0x1f, 0x3, 0x31, 0x2b, 0x25, 0x7, 0xf, 0x1c, 0x32, 0x0, 0x8, 0x2c, 0xa, 0x19, 0x6, 0x2e, 0x29, 0x36, 0x13, 0x27, 0x28, 0x1b, 0x26, 0x12, 0x37, 0xe, 0x1e, 0x11, 0x2a, 0x24, 0x9, 0x18, 0x33, 0x10, 0x23, 0x16, 0x1, 0x6, 0x26, 0x22, 0x12, 0x13, 0x2f, 0x4, 0xd, 0x28, 0x19, 0x5, 0x2d, 0x11, 0x8, 0x2, 0x33, 0x15, 0x1d, 0x2a, 0x9, 0xe, 0x16, 0x3, 0x18, 0x27, 0x14, 0x1f, 0x37, 0xb, 0x21, 0x35, 0x36, 0x29, 0x34, 0x20, 0xc, 0x1c, 0x2c, 0x0, 0x1, 0x32, 0x17, 0x7, 0xa, 0x1e, 0x31, 0x24, 0xf, 0x14, 0x34, 0x30, 0x20, 0x21, 0x4, 0x12, 0x1b, 0x36, 0x27, 0x13, 0x6, 0x0, 0x16, 0x10, 0xa, 0x23, 0x2b, 0x1, 0x17, 0x1c, 0x24, 0x11, 0x7, 0x35, 0x22, 0x2d, 0xc, 0x19, 0x2f, 0x26, 0xb, 0x37, 0xd, 0x2e, 0x1a, 0x2a, 0x3, 0xe, 0xf, 0x9, 0x25, 0x15, 0x18, 0x2c, 0x8, 0x32, 0x1d, 0x1b, 0x6, 0x37, 0x27, 0x28, 0xb, 0x19, 0x22, 0x4, 0x2e, 0x1a, 0xd, 0x7, 0x1d, 0x17, 0x11, 0x2a, 0x32, 0x8, 0x1e, 0x23, 0x2b, 0x18, 0xe, 0x1f, 0x29, 0x34, 0x13, 0x20, 0x36, 0x2d, 0x12, 0x5, 0x14, 0x35, 0x21, 0x31, 0xa, 0x15, 0x16, 0x10, 0x2c, 0x1c, 0x0, 0x33, 0xf, 0x2, 0x24) + b = byteArrayOf(0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x13, 0x12, 0x11, 0x10, 0xf, 0xe, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x3, 0x2, 0x1, 0x0, 0x1f, 0x1e) + c = intArrayOf(0x2080008, 0x2082000, 0x2008, 0x0, 0x2002000, 0x80008, 0x2080000, 0x2082008, 0x8, 0x2000000, 0x82000, 0x2008, 0x82008, 0x2002008, 0x2000008, 0x2080000, 0x2000, 0x82008, 0x80008, 0x2002000, 0x2082008, 0x2000008, 0x0, 0x82000, 0x2000000, 0x80000, 0x2002008, 0x2080008, 0x80000, 0x2000, 0x2082000, 0x8, 0x80000, 0x2000, 0x2000008, 0x2082008, 0x2008, 0x2000000, 0x0, 0x82000, 0x2080008, 0x2002008, 0x2002000, 0x80008, 0x2082000, 0x8, 0x80008, 0x2002000, 0x2082008, 0x80000, 0x2080000, 0x2000008, 0x82000, 0x2008, 0x2002008, 0x2080000, 0x8, 0x2082000, 0x82008, 0x0, 0x2000000, 0x2080008, 0x2000, 0x82008) + d = intArrayOf(0x8000004, 0x20004, 0x0, 0x8020200, 0x20004, 0x200, 0x8000204, 0x20000, 0x204, 0x8020204, 0x20200, 0x8000000, 0x8000200, 0x8000004, 0x8020000, 0x20204, 0x20000, 0x8000204, 0x8020004, 0x0, 0x200, 0x4, 0x8020200, 0x8020004, 0x8020204, 0x8020000, 0x8000000, 0x204, 0x4, 0x20200, 0x20204, 0x8000200, 0x204, 0x8000000, 0x8000200, 0x20204, 0x8020200, 0x20004, 0x0, 0x8000200, 0x8000000, 0x200, 0x8020004, 0x20000, 0x20004, 0x8020204, 0x20200, 0x4, 0x8020204, 0x20200, 0x20000, 0x8000204, 0x8000004, 0x8020000, 0x20204, 0x0, 0x200, 0x8000004, 0x8000204, 0x8020200, 0x8020000, 0x204, 0x4, 0x8020004) + e = intArrayOf(-0x7ffbff00, 0x1000100, -0x80000000, -0x7efbff00, 0x0, 0x1040000, -0x7effff00, -0x7ffc0000, 0x1040100, -0x7f000000, 0x1000000, -0x7fffff00, -0x7f000000, -0x7ffbff00, 0x40000, 0x1000000, -0x7efc0000, 0x40100, 0x100, -0x80000000, 0x40100, -0x7effff00, 0x1040000, 0x100, -0x7fffff00, -0x0, -0x7ffc0000, 0x1040100, 0x1000100, -0x7efc0000, -0x7efbff00, 0x40000, -0x7efc0000, -0x7fffff00, 0x40000, -0x7f000000, 0x40100, 0x1000100, -0x80000000, 0x1040000, -0x7effff00, -0x0, 0x100, -0x7ffc0000, -0x0, -0x7efc0000, 0x1040100, 0x100, 0x1000000, -0x7efbff00, -0x7ffbff00, 0x40000, -0x7efbff00, -0x80000000, 0x1000100, -0x7ffbff00, -0x7ffc0000, 0x40100, 0x1040000, -0x7effff00, -0x7fffff00, 0x1000000, -0x7f000000, 0x1040100) + f = intArrayOf(0x4010801, 0x0, 0x10800, 0x4010000, 0x4000001, 0x801, 0x4000800, 0x10800, 0x800, 0x4010001, 0x1, 0x4000800, 0x10001, 0x4010800, 0x4010000, 0x1, 0x10000, 0x4000801, 0x4010001, 0x800, 0x10801, 0x4000000, 0x0, 0x10001, 0x4000801, 0x10801, 0x4010800, 0x4000001, 0x4000000, 0x10000, 0x801, 0x4010801, 0x10001, 0x4010800, 0x4000800, 0x10801, 0x4010801, 0x10001, 0x4000001, 0x0, 0x4000000, 0x801, 0x10000, 0x4010001, 0x800, 0x4000000, 0x10801, 0x4000801, 0x4010800, 0x800, 0x0, 0x4000001, 0x1, 0x4010801, 0x10800, 0x4010000, 0x4010001, 0x10000, 0x801, 0x4000800, 0x4000801, 0x1, 0x4010000, 0x10800) + g = intArrayOf(0x400, 0x20, 0x100020, 0x40100000, 0x40100420, 0x40000400, 0x420, 0x0, 0x100000, 0x40100020, 0x40000020, 0x100400, 0x40000000, 0x100420, 0x100400, 0x40000020, 0x40100020, 0x400, 0x40000400, 0x40100420, 0x0, 0x100020, 0x40100000, 0x420, 0x40100400, 0x40000420, 0x100420, 0x40000000, 0x40000420, 0x40100400, 0x20, 0x100000, 0x40000420, 0x100400, 0x40100400, 0x40000020, 0x400, 0x20, 0x100000, 0x40100400, 0x40100020, 0x40000420, 0x420, 0x0, 0x20, 0x40100000, 0x40000000, 0x100020, 0x0, 0x40100020, 0x100020, 0x420, 0x40000020, 0x400, 0x40100420, 0x100000, 0x100420, 0x40000000, 0x40000400, 0x40100420, 0x40100000, 0x100420, 0x100400, 0x40000400) + h = intArrayOf(0x800000, 0x1000, 0x40, 0x801042, 0x801002, 0x800040, 0x1042, 0x801000, 0x1000, 0x2, 0x800002, 0x1040, 0x800042, 0x801002, 0x801040, 0x0, 0x1040, 0x800000, 0x1002, 0x42, 0x800040, 0x1042, 0x0, 0x800002, 0x2, 0x800042, 0x801042, 0x1002, 0x801000, 0x40, 0x42, 0x801040, 0x801040, 0x800042, 0x1002, 0x801000, 0x1000, 0x2, 0x800002, 0x800040, 0x800000, 0x1040, 0x801042, 0x0, 0x1042, 0x800000, 0x40, 0x1002, 0x800042, 0x40, 0x0, 0x801042, 0x801002, 0x801040, 0x42, 0x1000, 0x1040, 0x801002, 0x800040, 0x42, 0x2, 0x1042, 0x801000, 0x800002) + i = intArrayOf(0x10400000, 0x404010, 0x10, 0x10400010, 0x10004000, 0x400000, 0x10400010, 0x4010, 0x400010, 0x4000, 0x404000, 0x10000000, 0x10404010, 0x10000010, 0x10000000, 0x10404000, 0x0, 0x10004000, 0x404010, 0x10, 0x10000010, 0x10404010, 0x4000, 0x10400000, 0x10404000, 0x400010, 0x10004010, 0x404000, 0x4010, 0x0, 0x400000, 0x10004010, 0x404010, 0x10, 0x10000000, 0x4000, 0x10000010, 0x10004000, 0x404000, 0x10400010, 0x0, 0x404010, 0x4010, 0x10404000, 0x10004000, 0x400000, 0x10404010, 0x10000000, 0x10004010, 0x10400000, 0x400000, 0x10404010, 0x4000, 0x400010, 0x10400010, 0x4010, 0x400010, 0x0, 0x10404000, 0x10000010, 0x10400000, 0x10004010, 0x10, 0x404000) + j = intArrayOf(0x208080, 0x8000, 0x20200000, 0x20208080, 0x200000, 0x20008080, 0x20008000, 0x20200000, 0x20008080, 0x208080, 0x208000, 0x20000080, 0x20200080, 0x200000, 0x0, 0x20008000, 0x8000, 0x20000000, 0x200080, 0x8080, 0x20208080, 0x208000, 0x20000080, 0x200080, 0x20000000, 0x80, 0x8080, 0x20208000, 0x80, 0x20200080, 0x20208000, 0x0, 0x0, 0x20208080, 0x200080, 0x20008000, 0x208080, 0x8000, 0x20000080, 0x200080, 0x20208000, 0x80, 0x8080, 0x20200000, 0x20008080, 0x20000000, 0x20200000, 0x208000, 0x20208080, 0x8080, 0x208000, 0x20200080, 0x200000, 0x20000080, 0x20008000, 0x0, 0x8000, 0x200000, 0x20200080, 0x208080, 0x20000000, 0x20208000, 0x80, 0x20008080) + } + + private fun a(arg2: Int, arg3: Int): Int { + return arg2 shl 32 - arg3 or arg2.ushr(arg3) + } + + private fun a(arg5: ByteArray, arg6: Long) { + var v0 = arg6.ushr(32).toInt() + var v1 = a(arg6.toInt(), 31) + var v2 = v0 xor v1 and 1431655765 + v1 = v1 xor v2 + v0 = a(v0 xor v2, 31) + v2 = v1.ushr(8) xor v0 and 16711935 + v1 = v1 xor (v2 shl 8) + v0 = v0 xor v2 + v2 = v0.ushr(2) xor v1 and 858993459 + v0 = v0 xor (v2 shl 2) + v1 = v1 xor v2 + v2 = v1.ushr(16) xor v0 and 65535 + v1 = v1 xor (v2 shl 16) + v0 = v0 xor v2 + v2 = v0.ushr(4) xor v1 and 252645135 + v0 = v0 xor (v2 shl 4) + v1 = v1 xor v2 + arg5[0] = v1.toByte() + arg5[1] = v1.ushr(8).toByte() + arg5[2] = v1.ushr(16).toByte() + arg5[3] = (v1 shr 24).toByte() + arg5[4] = v0.toByte() + arg5[5] = v0.ushr(8).toByte() + arg5[6] = v0.ushr(16).toByte() + arg5[7] = (v0 shr 24).toByte() + } + + private fun c(arg6: ByteArray): Long { + var v0 = arg6[0].toInt() and 255 or (arg6[1].toInt() and 255 shl 8) or (arg6[2].toInt() and 255 shl 16) or (arg6[3].toInt() and 255 shl 24) + var v1 = arg6[4].toInt() and 255 or (arg6[5].toInt() and 255 shl 8) or (arg6[6].toInt() and 255 shl 16) or (arg6[7].toInt() and 255 shl 24) + var v2 = v1.ushr(4) xor v0 and 252645135 shl 4 xor v1 + v0 = v0 xor (v1.ushr(4) xor v0 and 252645135) + v1 = v0.ushr(16) xor v2 and 65535 + v0 = v0 xor (v0.ushr(16) xor v2 shl 16) + v1 = v1 xor v2 + v2 = v1.ushr(2) xor v0 and 858993459 + v1 = v1 xor (v2 shl 2) + v0 = v0 xor v2 + v2 = v0.ushr(8) xor v1 and 16711935 + v0 = v0 xor (v2 shl 8) + v1 = a(v1 xor v2, 1) + v2 = v0 xor v1 and 1431655765 + return (v1 xor v2).toLong() and 4294967295L or (a(v0 xor v2, 1).toLong() shl 32) + } + } +} + diff --git a/android/app/src/main/java/tk/nulldori/eamemu/E.kt b/android/app/src/main/java/tk/nulldori/eamemu/E.kt new file mode 100644 index 0000000..70a68db --- /dev/null +++ b/android/app/src/main/java/tk/nulldori/eamemu/E.kt @@ -0,0 +1,52 @@ +package tk.nulldori.eamemu + +object E { + fun a(arg4: CharSequence): ByteArray { + if (arg4.length % 2 != 0) { + //throw new d("Trailing nibble detected"); + } + + val v1 = ByteArray(arg4.length / 2) + var v0: Int + v0 = 0 + while (v0 < v1.size) { + v1[v0] = (E.a(arg4[v0 * 2]).toInt() shl 4 or E.a(arg4[v0 * 2 + 1]).toInt()).toByte() + ++v0 + } + + return v1 + } + + fun a(arg5: ByteArray): String { + val v1 = "0123456789ABCDEF" + val v2 = CharArray(arg5.size shl 1) + var v0: Int + v0 = 0 + while (v0 < arg5.size) { + v2[v0 * 2] = v1[(arg5[v0].toInt() and 255).ushr(4)] + v2[v0 * 2 + 1] = v1[arg5[v0].toInt() and 15] + ++v0 + } + + return String(v2) + } + + private fun a(arg3: Char): Byte { + val v0: Byte + if (arg3.toInt() < 48 || arg3.toInt() > 57) { + if (arg3.toInt() >= 65 && arg3.toInt() <= 70) { + return (arg3.toInt() - 55).toByte() + } + + return if (arg3.toInt() >= 97 && arg3.toInt() <= 102) { + (arg3.toInt() - 87).toByte() + } else 0x00 + + } else { + v0 = (arg3.toInt() - 48).toByte() + } + + return v0 + } +} + diff --git a/src/module/CardConv.js b/src/module/CardConv.js deleted file mode 100644 index 3a060da..0000000 --- a/src/module/CardConv.js +++ /dev/null @@ -1,3 +0,0 @@ -import {NativeModules} from 'react-native'; - -module.exports = NativeModules.CardConv; diff --git a/src/module/CardConv.ts b/src/module/CardConv.ts new file mode 100644 index 0000000..5dbdb96 --- /dev/null +++ b/src/module/CardConv.ts @@ -0,0 +1,9 @@ +import { NativeModules } from 'react-native'; + +const { CardConv } = NativeModules; + +interface CardConvModule { + convertSID: (sid: string) => Promise; +} + +export default CardConv as CardConvModule;