Files
SnowLuma/packages/protocol/tests/oidb-services/flash-transfer/apply-upload-byteoracle.test.ts
T
TanTan fa9c73363d
Dev Build / cleanup (push) Waiting to run
Dev Build / typecheck (push) Waiting to run
Publish MCP to npm / Build, test, and publish MCP (push) Waiting to run
Publish SDK to npm / Build, test, and publish SDK (push) Waiting to run
Sync action catalog to docs / sync (push) Waiting to run
Publish UI to npm / Build and publish UI (push) Waiting to run
Build and Release / preflight (push) Waiting to run
SnowLuma v2.4.2 source snapshot
2026-11-13 09:02:00 +08:00

92 lines
4.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, expect, it } from 'vitest';
import { protobuf_encode, protobuf_decode } from '@snowluma/proton';
import type { FlashApplyUploadReq } from '@snowluma/proto-defs/oidb-actions/flash-transfer';
// ENC#8: 0x12a9 sub=103 apply-upload 真实客户端请求 body(frida 抓包,QQ 9.9.26-44343,
// 2026-06-19)。用 ENC#8 的精确值手工构造 req,encode 后必须 byte-for-byte 匹配 ENC#8 hex。
// 这是真正的 byte-oracle:字段号/wire type/0值显式编码任一错误都会 hex 不等。
const ENC8_HEX =
'0a190a0508ac011067120ca80602b00604b80616c00c051a020801629d030a81020a870108b4cdcc01122063396631303334663062303431653933353339653937663839356363333139621a28306636326234663763646463373965326662666431343065646531326431633434646462373937612222e5b18fe5b995e5bd95e588b620323032352d30312d3135203030323133302e6d70342a0808001000180020003000380040004801126745685150597254337a64783534767639464137654574484554647435656869307a637742494c56304b4b4b516938796a6b3555444d675277636d396b5549447153566f51496f38546b56454c72776f454c5746544c6a433268586f445947505f676745435a336f180120fae4d4d1062880ea493000120208021a0808001000180022005288010a2438363866633433312d336361372d346130632d383538322d666135656365613062666134122438363866633433312d336361372d346130632d383538322d6661356563656130626661341a2436656639316166322d363830302d373633632d313936642d38353231303537353536343020012800300138024200480150005800600068007000';
// ENC#8 抓包值(sub=103 mp4)。
const ENC8_REQ: FlashApplyUploadReq = {
head: {
sub: { seq: 172, sub: 103 },
config: { field101: 2, field102: 4, field103: 22, field200: 5 },
field3: { field1: 1 },
},
payload: {
wrapper: {
fileInfo: {
fileSize: 3352244,
md5: 'c9f1034f0b041e93539e97f895cc319b',
sha1: '0f62b4f7cddc79e2fbfd140ede12d1c44ddb797a',
fileName: '屏幕录制 2025-01-15 002130.mp4',
field5: { field1: 0, field2: 0, field3: 0, field4: 0 },
field6: 0,
field7: 0,
field8: 0,
field9: 1,
},
fileId: 'EhQPYrT3zdx54vv9FA7eEtHETdt5ehi0zcwBILV0KKKQi8yjk5UDMgRwcm9kUIDqSVoQIo8TkVELrwoELWFTLjC2hXoDYGP_ggECZ3o',
field3: 1,
field4: 1781871226,
field5: 1209600,
field6: 0,
},
flag2: { field1: 2 },
field3: { field1: 0, field2: 0, field3: 0, field4: {} },
filesetWrap: {
filesetUuid: '868fc431-3ca7-4a0c-8582-fa5ecea0bfa4',
uploadKey: '868fc431-3ca7-4a0c-8582-fa5ecea0bfa4',
fileUuid: '6ef91af2-6800-763c-196d-852105755640',
field4: 1,
field5: 0,
field6: 1,
field7: 2,
field8: {},
field9: 1,
field10: 0,
field11: 0,
field12: 0,
field13: 0,
field14: 0,
},
},
};
describe('ApplyUpload byte-oracle (0x12a9_103 encode == ENC#8)', () => {
it('encodes the ENC#8 field values to the exact frida-captured wire bytes', () => {
const out = Buffer.from(protobuf_encode<FlashApplyUploadReq>(ENC8_REQ)).toString('hex');
if (out !== ENC8_HEX) {
// 定位首个差异字节
const n = Math.min(out.length, ENC8_HEX.length);
let i = 0;
while (i < n && out[i] === ENC8_HEX[i]) {
i++;
}
throw new Error(
`hex mismatch at char ${i} (byte ${i >> 1}):\n` +
` bot: ...${out.slice(Math.max(0, i - 20), i + 20)}\n` +
` ENC#8: ...${ENC8_HEX.slice(Math.max(0, i - 20), i + 20)}\n` +
` bot len=${out.length / 2}B, ENC#8 len=${ENC8_HEX.length / 2}B`,
);
}
expect(out).toBe(ENC8_HEX);
});
it('round-trips: encode → decode preserves the field tree', () => {
const bytes = protobuf_encode<FlashApplyUploadReq>(ENC8_REQ);
const back = protobuf_decode<FlashApplyUploadReq>(bytes);
expect(back.head?.sub?.sub).toBe(103);
expect(back.head?.config?.field103).toBe(22);
expect(back.payload?.wrapper?.fileInfo?.field9).toBe(1);
expect(back.payload?.wrapper?.fileInfo?.field5?.field4).toBe(0);
expect(back.payload?.filesetWrap?.fileUuid).toBe('6ef91af2-6800-763c-196d-852105755640');
});
});