From 03e8d39e17bb56fe42666026020e61608863a292 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 28 Jul 2018 12:33:27 +0200 Subject: [PATCH] ADD: amiboo stuff --- client/libluamiibo.so | Bin 0 -> 23648 bytes client/lualibs/amiibolib.lua | 90 +++++++++++++++++++++++++++++++++++ client/lualibs/emulator.lua | 84 ++++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 client/libluamiibo.so create mode 100644 client/lualibs/amiibolib.lua create mode 100644 client/lualibs/emulator.lua diff --git a/client/libluamiibo.so b/client/libluamiibo.so new file mode 100644 index 0000000000000000000000000000000000000000..2cd716aa08e79dba46e064f833fcfa2facce5fac GIT binary patch literal 23648 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 dVC5$$e`B*>!WV1|!%S', string.sub(self.plain, 49, 50)) + self.appdata_counter = appdatacounter + + self.figure_id = string.sub(self.plain, 477, 477 + 8) + + -- UTF-16 nickname string + self.nickname = string.sub(self.plain, 57, 76) +end + + +function Amiibo:export_tag () + return luamiibo.pack(self.plain) +end + + +function Amiibo:check_flag (power) + local flag = math.pow(2, power) + return flag == bit32.band(self.setting_flags, flag) +end + + +function Amiibo:get_pwd () + local xorkey = "\xaa\x55\xaa\x55" + + local result = '' + for i = 1, 4 do + result = result .. + bin.pack('C', + bit32.bxor(self.uid:byte(i+1), + self.uid:byte(i+3), + xorkey:byte(i))) + end + + return result +end + +-- Hack to make UTF-16 nicknames into regular char string +-- Only works for ASCII nicknames +function Amiibo:display_nickname() + local nickname_tmp = self.nickname + + local nickname = '' + for i = 1, nickname_tmp:len() do + if i % 2 == 0 then + nickname = nickname .. nickname_tmp:sub(i, i) + end + end + + return nickname +end + +return Amiibo diff --git a/client/lualibs/emulator.lua b/client/lualibs/emulator.lua new file mode 100644 index 000000000..36ef38ac1 --- /dev/null +++ b/client/lualibs/emulator.lua @@ -0,0 +1,84 @@ +local cmds = require('commands') +local utils = require('utils') +local reader = require('read14a') + +local Emulator = { + _VERSION = 'emulator.lua 0.1.0', + _DESCRIPTION = 'emulator memory interface', + BLOCK_SZ = 512, + BLOCK_COUNT = 512 / 16 +} + +function Emulator:set_mem (data, clear_first) + if clear_first then + -- Clear out the emulator memory first + local emuMemclearCmd = Command:new{cmd = cmds.CMD_MIFARE_EML_MEMCLR, arg1 = 0, arg2 = 0, arg3 = 0} + + local _, err = reader.sendToDevice(emuMemclearCmd) + if err then + print('Failed to clear emulator memory:', err) + return false + else + print('Cleared emulator memory') + end + end + + -- Can fit 32 16 byte blocks per command (512 total bytes max) + for i = 0, (data:len() / self.BLOCK_SZ) do + local cur_out_block = data:sub((i*self.BLOCK_SZ) + 1, (i*self.BLOCK_SZ) + self.BLOCK_SZ) + print(string.format('Transmission #%u: %u bytes', i, cur_out_block:len())) + + -- arg1: start block number + -- arg2: block count + local emuMemsetCmd = Command:new{cmd = cmds.CMD_MIFARE_EML_MEMSET, + data = utils.hexlify(cur_out_block), + arg1 = i * self.BLOCK_COUNT, + arg2 = self.BLOCK_COUNT} + + -- Send command and wait for response + local _, err = reader.sendToDevice(emuMemsetCmd) + if err then + print('Failed setting memory', err) + return false + end + end + + print('Emulator memory set') + return true +end + +-- Read bytes from emulator memory +function Emulator:get_mem (size) + local MAX_BLOCKS = 4 + local result = '' + + -- We can request a maximum of 4 blocks (16 bytes each) per command, + -- according to mifarecmd.c + for i = 0, (size / (MAX_BLOCKS * 16)) do + -- arg1: start block number + -- arg2: block count (max 4) + local emuMemGetCmd = Command:new{cmd = cmds.CMD_MIFARE_EML_MEMGET, + arg1 = i * MAX_BLOCKS, + arg2 = MAX_BLOCKS, + arg3 = 0} + + local response, err = reader.sendToDevice(emuMemGetCmd) + if err then + print('Failed getting memory:', err) + return false + end + + -- USB data begins after four 64-bit values + local data_begin = ((64/8) * 4) + 1 + response = string.sub(response, data_begin) + + -- Truncate to the received 16 byte blocks + response = string.sub(response, 1, 16 * MAX_BLOCKS) + + result = result .. response + end + + return string.sub(result, 1, size) +end + +return Emulator