From e90068f32510dc4e14eef62d099272ffb6ce8ec3 Mon Sep 17 00:00:00 2001 From: cxm Date: Wed, 10 Jun 2020 15:38:33 +0800 Subject: [PATCH] chuni: add new felica lookup mode --- src/aimedb/decoder.ts | 10 ++++++++++ src/aimedb/encoder.ts | 14 +++++++++++++- src/aimedb/handler.ts | 25 +++++++++++++++++++++++++ src/aimedb/request.ts | 7 +++++++ src/aimedb/response.ts | 7 +++++++ 5 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/aimedb/decoder.ts b/src/aimedb/decoder.ts index 16af3af..7df6271 100644 --- a/src/aimedb/decoder.ts +++ b/src/aimedb/decoder.ts @@ -31,6 +31,15 @@ function readFeliCaLookupRequest(msg: Buffer): Request.FeliCaLookupRequest { }; } +function readFeliCaLookupRequest2(msg: Buffer): Request.FeliCaLookup2Request { + return { + ...begin(msg), + type: "felica_lookup2", + idm: msg.slice(0x0030, 0x0038).toString("hex"), + pmm: msg.slice(0x0038, 0x0040).toString("hex"), + }; +} + function readLogRequest(msg: Buffer): Request.LogRequest { // idk what any of this stuff means yet // field20 and field28 appear to be an aime id but that is all. @@ -98,6 +107,7 @@ readers.set(0x0009, readLogRequest); readers.set(0x000b, readCampaignRequest); readers.set(0x000d, readRegisterRequest); readers.set(0x000f, readLookupRequest2); +readers.set(0x0011, readFeliCaLookupRequest2); readers.set(0x0064, readHelloRequest); readers.set(0x0066, readGoodbyeRequest); diff --git a/src/aimedb/encoder.ts b/src/aimedb/encoder.ts index 3c5929c..30bedd7 100644 --- a/src/aimedb/encoder.ts +++ b/src/aimedb/encoder.ts @@ -14,7 +14,7 @@ registerLevels.set("segaid", 2); function begin(length: number) { const buf = Buffer.alloc(length); - buf.writeUInt16LE(0xa13e, 0x0000); // Magic? + buf.writeUInt16LE(0xa13e, 0x0000); // Magic: aime buf.writeUInt16LE(0x3087, 0x0002); // ??? buf.writeUInt16LE(length, 0x0006); @@ -43,6 +43,18 @@ export class Encoder extends Transform { break; + case "felica_lookup2": + buf = begin(0x0140); + buf.writeUInt16LE(0x0012, 0x0004); // cmd code + buf.writeUInt16LE(msg.status, 0x0008); + buf.writeInt32LE(msg.aimeId || -1, 0x0020); + buf.writeUInt32LE(0xffffffff, 0x0024); // FF + buf.writeUInt32LE(0xffffffff, 0x0028); // FF + buf.write(msg.accessCode, 0x002c, "hex"); + buf.writeUInt16LE(0x0001, 0x0037); // 00 01 + + break; + case "hello": buf = begin(0x0020); buf.writeUInt16LE(0x0065, 0x0004); // cmd code diff --git a/src/aimedb/handler.ts b/src/aimedb/handler.ts index 85ed430..c35ed10 100644 --- a/src/aimedb/handler.ts +++ b/src/aimedb/handler.ts @@ -46,6 +46,28 @@ function feliCaLookup( return { type: req.type, status: 1, accessCode }; } +async function feliCaLookup2( + rep: Repositories, + req: Req.FeliCaLookup2Request, + now: Date +): Promise { + debug("FeliCa access code lookup"); + + const num = BigInt("0x" + req.idm); + let accessCode = num.toString(); + + while (accessCode.length < 20) { + accessCode = "0" + accessCode; + } + + return { + type: req.type, + status: 1, + accessCode, + aimeId: await rep.cards().lookup(accessCode, now), + }; +} + async function lookup( rep: Repositories, req: Req.LookupRequest, @@ -115,6 +137,9 @@ export async function dispatch( case "felica_lookup": return feliCaLookup(rep, req, now); + case "felica_lookup2": + return feliCaLookup2(rep, req, now); + case "lookup": return lookup(rep, req, now); diff --git a/src/aimedb/request.ts b/src/aimedb/request.ts index 8d2072d..0ea5b68 100644 --- a/src/aimedb/request.ts +++ b/src/aimedb/request.ts @@ -9,6 +9,12 @@ export interface FeliCaLookupRequest extends AimeRequestBase { pmm: string; } +export interface FeliCaLookup2Request extends AimeRequestBase { + type: "felica_lookup2"; + idm: string; + pmm: string; +} + export interface RegisterRequest extends AimeRequestBase { type: "register"; luid: string; @@ -50,6 +56,7 @@ export interface GoodbyeRequest { export type AimeRequest = | FeliCaLookupRequest + | FeliCaLookup2Request | CampaignRequest | GoodbyeRequest | HelloRequest diff --git a/src/aimedb/response.ts b/src/aimedb/response.ts index 9863cb5..129bdb7 100644 --- a/src/aimedb/response.ts +++ b/src/aimedb/response.ts @@ -11,6 +11,12 @@ export interface FeliCaLookupResponse extends AimeResponseBase { accessCode: string; } +export interface FeliCaLookup2Response extends AimeResponseBase { + type: "felica_lookup2"; + accessCode: string; + aimeId?: AimeId; +} + export interface CampaignResponse extends AimeResponseBase { type: "campaign"; } @@ -44,6 +50,7 @@ export interface RegisterResponse extends AimeResponseBase { export type AimeResponse = | FeliCaLookupResponse + | FeliCaLookup2Response | CampaignResponse | HelloResponse | LogResponse