@bharper/atv-js 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +80 -0
  3. package/dist/airplay/auth.d.ts +24 -0
  4. package/dist/airplay/auth.d.ts.map +1 -0
  5. package/dist/airplay/auth.js +195 -0
  6. package/dist/airplay/auth.js.map +1 -0
  7. package/dist/bplist.d.ts +19 -0
  8. package/dist/bplist.d.ts.map +1 -0
  9. package/dist/bplist.js +141 -0
  10. package/dist/bplist.js.map +1 -0
  11. package/dist/companion/auth.d.ts +34 -0
  12. package/dist/companion/auth.d.ts.map +1 -0
  13. package/dist/companion/auth.js +119 -0
  14. package/dist/companion/auth.js.map +1 -0
  15. package/dist/companion/connection.d.ts +50 -0
  16. package/dist/companion/connection.d.ts.map +1 -0
  17. package/dist/companion/connection.js +170 -0
  18. package/dist/companion/connection.js.map +1 -0
  19. package/dist/companion/keyboard.d.ts +39 -0
  20. package/dist/companion/keyboard.d.ts.map +1 -0
  21. package/dist/companion/keyboard.js +127 -0
  22. package/dist/companion/keyboard.js.map +1 -0
  23. package/dist/companion/pairing_keepalive.d.ts +4 -0
  24. package/dist/companion/pairing_keepalive.d.ts.map +1 -0
  25. package/dist/companion/pairing_keepalive.js +68 -0
  26. package/dist/companion/pairing_keepalive.js.map +1 -0
  27. package/dist/companion/protocol.d.ts +64 -0
  28. package/dist/companion/protocol.d.ts.map +1 -0
  29. package/dist/companion/protocol.js +246 -0
  30. package/dist/companion/protocol.js.map +1 -0
  31. package/dist/companion/remote.d.ts +75 -0
  32. package/dist/companion/remote.d.ts.map +1 -0
  33. package/dist/companion/remote.js +142 -0
  34. package/dist/companion/remote.js.map +1 -0
  35. package/dist/crypto/chacha20.d.ts +27 -0
  36. package/dist/crypto/chacha20.d.ts.map +1 -0
  37. package/dist/crypto/chacha20.js +88 -0
  38. package/dist/crypto/chacha20.js.map +1 -0
  39. package/dist/crypto/hkdf.d.ts +6 -0
  40. package/dist/crypto/hkdf.d.ts.map +1 -0
  41. package/dist/crypto/hkdf.js +45 -0
  42. package/dist/crypto/hkdf.js.map +1 -0
  43. package/dist/index.d.ts +85 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +191 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/mdns.d.ts +20 -0
  48. package/dist/mdns.d.ts.map +1 -0
  49. package/dist/mdns.js +165 -0
  50. package/dist/mdns.js.map +1 -0
  51. package/dist/opack.d.ts +21 -0
  52. package/dist/opack.d.ts.map +1 -0
  53. package/dist/opack.js +350 -0
  54. package/dist/opack.js.map +1 -0
  55. package/dist/pairing/credentials.d.ts +23 -0
  56. package/dist/pairing/credentials.d.ts.map +1 -0
  57. package/dist/pairing/credentials.js +31 -0
  58. package/dist/pairing/credentials.js.map +1 -0
  59. package/dist/pairing/srp.d.ts +54 -0
  60. package/dist/pairing/srp.d.ts.map +1 -0
  61. package/dist/pairing/srp.js +221 -0
  62. package/dist/pairing/srp.js.map +1 -0
  63. package/dist/pairing/tlv.d.ts +26 -0
  64. package/dist/pairing/tlv.d.ts.map +1 -0
  65. package/dist/pairing/tlv.js +68 -0
  66. package/dist/pairing/tlv.js.map +1 -0
  67. package/examples/pair.ts +103 -0
  68. package/examples/remote.ts +212 -0
  69. package/package.json +33 -0
  70. package/src/airplay/auth.ts +207 -0
  71. package/src/bplist.ts +136 -0
  72. package/src/companion/auth.ts +141 -0
  73. package/src/companion/connection.ts +161 -0
  74. package/src/companion/keyboard.ts +155 -0
  75. package/src/companion/pairing_keepalive.ts +75 -0
  76. package/src/companion/protocol.ts +253 -0
  77. package/src/companion/remote.ts +151 -0
  78. package/src/crypto/chacha20.ts +93 -0
  79. package/src/crypto/hkdf.ts +18 -0
  80. package/src/index.ts +248 -0
  81. package/src/mdns.ts +198 -0
  82. package/src/opack.ts +299 -0
  83. package/src/pairing/credentials.ts +44 -0
  84. package/src/pairing/srp.ts +234 -0
  85. package/src/pairing/tlv.ts +64 -0
  86. package/tsconfig.json +19 -0
package/dist/opack.js ADDED
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ /**
3
+ * OPACK serialization format - Apple's binary encoding (similar to MessagePack).
4
+ * Direct port of pyatv/support/opack.py.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.OpackFloat = void 0;
8
+ exports.opackFloat = opackFloat;
9
+ exports.pack = pack;
10
+ exports.unpack = unpack;
11
+ /**
12
+ * Wrapper to force a number to be encoded as float64.
13
+ * In JavaScript, 1000.0 === 1000, so we can't distinguish floats from integers.
14
+ * Use opackFloat(1000) to ensure encoding as float64.
15
+ */
16
+ class OpackFloat {
17
+ value;
18
+ constructor(value) {
19
+ this.value = value;
20
+ }
21
+ }
22
+ exports.OpackFloat = OpackFloat;
23
+ function opackFloat(value) {
24
+ return new OpackFloat(value);
25
+ }
26
+ function pack(data) {
27
+ return Buffer.from(_pack(data, []));
28
+ }
29
+ function _pack(data, objectList) {
30
+ let packed;
31
+ if (data === null || data === undefined) {
32
+ packed = new Uint8Array([0x04]);
33
+ }
34
+ else if (typeof data === 'boolean') {
35
+ packed = new Uint8Array([data ? 0x01 : 0x02]);
36
+ }
37
+ else if (data instanceof OpackFloat) {
38
+ // Force float64 encoding
39
+ const buf = Buffer.alloc(9);
40
+ buf[0] = 0x36;
41
+ buf.writeDoubleLE(data.value, 1);
42
+ packed = buf;
43
+ }
44
+ else if (typeof data === 'number') {
45
+ if (Number.isInteger(data)) {
46
+ packed = packInteger(data);
47
+ }
48
+ else {
49
+ // float64
50
+ const buf = Buffer.alloc(9);
51
+ buf[0] = 0x36;
52
+ buf.writeDoubleLE(data, 1);
53
+ packed = buf;
54
+ }
55
+ }
56
+ else if (typeof data === 'string') {
57
+ packed = packString(data);
58
+ }
59
+ else if (Buffer.isBuffer(data) || data instanceof Uint8Array) {
60
+ packed = packBytes(data instanceof Uint8Array ? Buffer.from(data) : data);
61
+ }
62
+ else if (Array.isArray(data)) {
63
+ const parts = [new Uint8Array([0xd0 + Math.min(data.length, 0xf)])];
64
+ for (const item of data) {
65
+ parts.push(_pack(item, objectList));
66
+ }
67
+ if (data.length >= 0xf) {
68
+ parts.push(new Uint8Array([0x03]));
69
+ }
70
+ packed = concatBytes(parts);
71
+ }
72
+ else if (typeof data === 'object') {
73
+ const entries = Object.entries(data);
74
+ const parts = [new Uint8Array([0xe0 + Math.min(entries.length, 0xf)])];
75
+ for (const [key, value] of entries) {
76
+ parts.push(_pack(key, objectList));
77
+ parts.push(_pack(value, objectList));
78
+ }
79
+ if (entries.length >= 0xf) {
80
+ parts.push(new Uint8Array([0x03]));
81
+ }
82
+ packed = concatBytes(parts);
83
+ }
84
+ else {
85
+ throw new TypeError(`Unsupported type: ${typeof data}`);
86
+ }
87
+ // Object deduplication
88
+ const idx = findInObjectList(objectList, packed);
89
+ if (idx >= 0) {
90
+ if (idx < 0x21) {
91
+ packed = new Uint8Array([0xa0 + idx]);
92
+ }
93
+ else if (idx <= 0xff) {
94
+ packed = new Uint8Array([0xc1, idx]);
95
+ }
96
+ else if (idx <= 0xffff) {
97
+ const buf = Buffer.alloc(3);
98
+ buf[0] = 0xc2;
99
+ buf.writeUInt16LE(idx, 1);
100
+ packed = buf;
101
+ }
102
+ }
103
+ else if (packed.length > 1) {
104
+ objectList.push(packed);
105
+ }
106
+ return packed;
107
+ }
108
+ function packInteger(data) {
109
+ if (data >= 0 && data < 0x28) {
110
+ return new Uint8Array([data + 8]);
111
+ }
112
+ else if (data >= 0 && data <= 0xff) {
113
+ return new Uint8Array([0x30, data]);
114
+ }
115
+ else if (data >= 0 && data <= 0xffff) {
116
+ const buf = Buffer.alloc(3);
117
+ buf[0] = 0x31;
118
+ buf.writeUInt16LE(data, 1);
119
+ return buf;
120
+ }
121
+ else if (data >= 0 && data <= 0xffffffff) {
122
+ const buf = Buffer.alloc(5);
123
+ buf[0] = 0x32;
124
+ buf.writeUInt32LE(data, 1);
125
+ return buf;
126
+ }
127
+ else {
128
+ const buf = Buffer.alloc(9);
129
+ buf[0] = 0x33;
130
+ buf.writeBigUInt64LE(BigInt(data), 1);
131
+ return buf;
132
+ }
133
+ }
134
+ function packString(data) {
135
+ const encoded = Buffer.from(data, 'utf-8');
136
+ if (encoded.length <= 0x20) {
137
+ return Buffer.concat([Buffer.from([0x40 + encoded.length]), encoded]);
138
+ }
139
+ else if (encoded.length <= 0xff) {
140
+ return Buffer.concat([Buffer.from([0x61, encoded.length]), encoded]);
141
+ }
142
+ else if (encoded.length <= 0xffff) {
143
+ const hdr = Buffer.alloc(3);
144
+ hdr[0] = 0x62;
145
+ hdr.writeUInt16LE(encoded.length, 1);
146
+ return Buffer.concat([hdr, encoded]);
147
+ }
148
+ else if (encoded.length <= 0xffffff) {
149
+ const hdr = Buffer.alloc(4);
150
+ hdr[0] = 0x63;
151
+ hdr.writeUIntLE(encoded.length, 1, 3);
152
+ return Buffer.concat([hdr, encoded]);
153
+ }
154
+ else {
155
+ const hdr = Buffer.alloc(5);
156
+ hdr[0] = 0x64;
157
+ hdr.writeUInt32LE(encoded.length, 1);
158
+ return Buffer.concat([hdr, encoded]);
159
+ }
160
+ }
161
+ function packBytes(data) {
162
+ if (data.length <= 0x20) {
163
+ return Buffer.concat([Buffer.from([0x70 + data.length]), data]);
164
+ }
165
+ else if (data.length <= 0xff) {
166
+ return Buffer.concat([Buffer.from([0x91, data.length]), data]);
167
+ }
168
+ else if (data.length <= 0xffff) {
169
+ const hdr = Buffer.alloc(3);
170
+ hdr[0] = 0x92;
171
+ hdr.writeUInt16LE(data.length, 1);
172
+ return Buffer.concat([hdr, data]);
173
+ }
174
+ else if (data.length <= 0xffffffff) {
175
+ const hdr = Buffer.alloc(5);
176
+ hdr[0] = 0x93;
177
+ hdr.writeUInt32LE(data.length, 1);
178
+ return Buffer.concat([hdr, data]);
179
+ }
180
+ else {
181
+ const hdr = Buffer.alloc(9);
182
+ hdr[0] = 0x94;
183
+ hdr.writeBigUInt64LE(BigInt(data.length), 1);
184
+ return Buffer.concat([hdr, data]);
185
+ }
186
+ }
187
+ function concatBytes(parts) {
188
+ return Buffer.concat(parts.map(p => Buffer.from(p)));
189
+ }
190
+ function findInObjectList(list, item) {
191
+ for (let i = 0; i < list.length; i++) {
192
+ if (Buffer.from(list[i]).equals(Buffer.from(item)))
193
+ return i;
194
+ }
195
+ return -1;
196
+ }
197
+ function unpack(data) {
198
+ const [value, remaining] = _unpack(data, []);
199
+ return { value, remaining: Buffer.from(remaining) };
200
+ }
201
+ function _unpack(data, objectList) {
202
+ const byte0 = data[0];
203
+ let value;
204
+ let remaining;
205
+ let addToObjectList = true;
206
+ if (byte0 === 0x01) {
207
+ value = true;
208
+ remaining = data.subarray(1);
209
+ addToObjectList = false;
210
+ }
211
+ else if (byte0 === 0x02) {
212
+ value = false;
213
+ remaining = data.subarray(1);
214
+ addToObjectList = false;
215
+ }
216
+ else if (byte0 === 0x04) {
217
+ value = null;
218
+ remaining = data.subarray(1);
219
+ addToObjectList = false;
220
+ }
221
+ else if (byte0 === 0x05) {
222
+ // UUID - 16 bytes
223
+ value = data.subarray(1, 17);
224
+ remaining = data.subarray(17);
225
+ }
226
+ else if (byte0 === 0x06) {
227
+ // Absolute time as integer
228
+ value = Number(data.readBigUInt64LE(1));
229
+ remaining = data.subarray(9);
230
+ }
231
+ else if (byte0 >= 0x08 && byte0 <= 0x2f) {
232
+ value = byte0 - 8;
233
+ remaining = data.subarray(1);
234
+ addToObjectList = false;
235
+ }
236
+ else if (byte0 === 0x35) {
237
+ value = data.readFloatLE(1);
238
+ remaining = data.subarray(5);
239
+ }
240
+ else if (byte0 === 0x36) {
241
+ value = data.readDoubleLE(1);
242
+ remaining = data.subarray(9);
243
+ }
244
+ else if ((byte0 & 0xf0) === 0x30) {
245
+ const numBytes = 1 << (byte0 & 0xf);
246
+ value = readUIntLE(data, 1, numBytes);
247
+ remaining = data.subarray(1 + numBytes);
248
+ }
249
+ else if (byte0 >= 0x40 && byte0 <= 0x60) {
250
+ const length = byte0 - 0x40;
251
+ value = data.subarray(1, 1 + length).toString('utf-8');
252
+ remaining = data.subarray(1 + length);
253
+ }
254
+ else if (byte0 > 0x60 && byte0 <= 0x64) {
255
+ const numBytes = byte0 & 0xf;
256
+ const length = readUIntLE(data, 1, numBytes);
257
+ value = data.subarray(1 + numBytes, 1 + numBytes + length).toString('utf-8');
258
+ remaining = data.subarray(1 + numBytes + length);
259
+ }
260
+ else if (byte0 >= 0x70 && byte0 <= 0x90) {
261
+ const length = byte0 - 0x70;
262
+ value = Buffer.from(data.subarray(1, 1 + length));
263
+ remaining = data.subarray(1 + length);
264
+ }
265
+ else if (byte0 >= 0x91 && byte0 <= 0x94) {
266
+ const numBytes = 1 << ((byte0 & 0xf) - 1);
267
+ const length = readUIntLE(data, 1, numBytes);
268
+ value = Buffer.from(data.subarray(1 + numBytes, 1 + numBytes + length));
269
+ remaining = data.subarray(1 + numBytes + length);
270
+ }
271
+ else if ((byte0 & 0xf0) === 0xd0) {
272
+ const count = byte0 & 0xf;
273
+ const output = [];
274
+ let ptr = data.subarray(1);
275
+ if (count === 0xf) {
276
+ while (ptr[0] !== 0x03) {
277
+ const [v, rest] = _unpack(Buffer.from(ptr), objectList);
278
+ output.push(v);
279
+ ptr = rest;
280
+ }
281
+ ptr = ptr.subarray(1);
282
+ }
283
+ else {
284
+ for (let i = 0; i < count; i++) {
285
+ const [v, rest] = _unpack(Buffer.from(ptr), objectList);
286
+ output.push(v);
287
+ ptr = rest;
288
+ }
289
+ }
290
+ value = output;
291
+ remaining = Buffer.from(ptr);
292
+ addToObjectList = false;
293
+ }
294
+ else if ((byte0 & 0xe0) === 0xe0) {
295
+ const count = byte0 & 0xf;
296
+ const output = {};
297
+ let ptr = data.subarray(1);
298
+ if (count === 0xf) {
299
+ while (ptr[0] !== 0x03) {
300
+ const [k, rest1] = _unpack(Buffer.from(ptr), objectList);
301
+ const [v, rest2] = _unpack(Buffer.from(rest1), objectList);
302
+ output[String(k)] = v;
303
+ ptr = rest2;
304
+ }
305
+ ptr = ptr.subarray(1);
306
+ }
307
+ else {
308
+ for (let i = 0; i < count; i++) {
309
+ const [k, rest1] = _unpack(Buffer.from(ptr), objectList);
310
+ const [v, rest2] = _unpack(Buffer.from(rest1), objectList);
311
+ output[String(k)] = v;
312
+ ptr = rest2;
313
+ }
314
+ }
315
+ value = output;
316
+ remaining = Buffer.from(ptr);
317
+ addToObjectList = false;
318
+ }
319
+ else if (byte0 >= 0xa0 && byte0 <= 0xc0) {
320
+ value = objectList[byte0 - 0xa0];
321
+ remaining = data.subarray(1);
322
+ addToObjectList = false;
323
+ }
324
+ else if (byte0 >= 0xc1 && byte0 <= 0xc4) {
325
+ const length = byte0 - 0xc0;
326
+ const uid = readUIntLE(data, 1, length);
327
+ value = objectList[uid];
328
+ remaining = data.subarray(1 + length);
329
+ addToObjectList = false;
330
+ }
331
+ else {
332
+ throw new TypeError(`Unknown OPACK type: 0x${byte0.toString(16)}`);
333
+ }
334
+ if (addToObjectList && !objectList.includes(value)) {
335
+ objectList.push(value);
336
+ }
337
+ return [value, remaining];
338
+ }
339
+ function readUIntLE(buf, offset, numBytes) {
340
+ if (numBytes === 1)
341
+ return buf[offset];
342
+ if (numBytes === 2)
343
+ return buf.readUInt16LE(offset);
344
+ if (numBytes === 4)
345
+ return buf.readUInt32LE(offset);
346
+ if (numBytes === 8)
347
+ return Number(buf.readBigUInt64LE(offset));
348
+ throw new Error(`Unsupported integer size: ${numBytes}`);
349
+ }
350
+ //# sourceMappingURL=opack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opack.js","sourceRoot":"","sources":["../src/opack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * HAP credentials storage and parsing.
3
+ * Port of pyatv/auth/hap_pairing.py HapCredentials + parse_credentials().
4
+ *
5
+ * Format: "LTPK:LTSK:ATV_ID:CLIENT_ID" (all hex-encoded)
6
+ */
7
+ export interface HapCredentials {
8
+ /** Apple TV's Ed25519 public key */
9
+ ltpk: Buffer;
10
+ /** Client's Ed25519 private key */
11
+ ltsk: Buffer;
12
+ /** Device identifier */
13
+ atvId: Buffer;
14
+ /** Client identifier (UUID) */
15
+ clientId: Buffer;
16
+ }
17
+ export interface Credentials {
18
+ airplay: string;
19
+ companion: string;
20
+ }
21
+ export declare function serializeCredentials(creds: HapCredentials): string;
22
+ export declare function parseCredentials(credString: string): HapCredentials;
23
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/pairing/credentials.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAOlE;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAWnE"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * HAP credentials storage and parsing.
4
+ * Port of pyatv/auth/hap_pairing.py HapCredentials + parse_credentials().
5
+ *
6
+ * Format: "LTPK:LTSK:ATV_ID:CLIENT_ID" (all hex-encoded)
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.serializeCredentials = serializeCredentials;
10
+ exports.parseCredentials = parseCredentials;
11
+ function serializeCredentials(creds) {
12
+ return [
13
+ creds.ltpk.toString('hex'),
14
+ creds.ltsk.toString('hex'),
15
+ creds.atvId.toString('hex'),
16
+ creds.clientId.toString('hex'),
17
+ ].join(':');
18
+ }
19
+ function parseCredentials(credString) {
20
+ const parts = credString.split(':');
21
+ if (parts.length === 4) {
22
+ return {
23
+ ltpk: Buffer.from(parts[0], 'hex'),
24
+ ltsk: Buffer.from(parts[1], 'hex'),
25
+ atvId: Buffer.from(parts[2], 'hex'),
26
+ clientId: Buffer.from(parts[3], 'hex'),
27
+ };
28
+ }
29
+ throw new Error(`Invalid credentials format: expected 4 hex parts separated by ':'`);
30
+ }
31
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/pairing/credentials.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAkBH,oDAOC;AAED,4CAWC;AApBD,SAAgB,oBAAoB,CAAC,KAAqB;IACxD,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC1B,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;KAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,SAAgB,gBAAgB,CAAC,UAAkB;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;YAClC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;YAClC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;YACnC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;SACvC,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * SRP authentication handler for HAP pair-setup and pair-verify.
3
+ * Port of pyatv/auth/hap_srp.py SRPAuthHandler.
4
+ *
5
+ * Uses fast-srp-hap for SRP 3072-bit with SHA-512,
6
+ * and Node.js crypto for Ed25519 and X25519.
7
+ */
8
+ import { HapCredentials } from './credentials';
9
+ export declare class SRPAuthHandler {
10
+ pairingId: Buffer;
11
+ private signingKey;
12
+ private authPrivate;
13
+ private authPublic;
14
+ private verifyPrivate;
15
+ private verifyPublic;
16
+ private srpClient;
17
+ private shared;
18
+ private sessionKey;
19
+ private pin;
20
+ private clientSecret;
21
+ constructor();
22
+ /**
23
+ * Initialize by generating new Ed25519 signing keys and X25519 verify keys.
24
+ * Returns [authPublic, verifyPublic].
25
+ */
26
+ initialize(): [Buffer, Buffer];
27
+ /**
28
+ * Pair-Verify step 1: X25519 shared secret + decrypt server identity + sign our identity.
29
+ */
30
+ verify1(credentials: HapCredentials, sessionPubKey: Buffer, encrypted: Buffer): Buffer;
31
+ /**
32
+ * Pair-Verify step 2: derive final encryption keys.
33
+ */
34
+ verify2(salt: string, outputInfo: string, inputInfo: string): [Buffer, Buffer];
35
+ /**
36
+ * Pair-Setup step 1: store PIN for later use with salt.
37
+ */
38
+ step1(pin: string): void;
39
+ /**
40
+ * Pair-Setup step 2: process server's public key and salt, compute SRP proof.
41
+ * Returns [clientPublicKey, clientProof].
42
+ */
43
+ step2(atvPubKey: Buffer, atvSalt: Buffer): [Buffer, Buffer];
44
+ /**
45
+ * Pair-Setup step 3: sign identity and encrypt with session key.
46
+ * Returns encrypted data to send as SeqNo 0x05.
47
+ */
48
+ step3(name?: string): Buffer;
49
+ /**
50
+ * Pair-Setup step 4: decrypt device response and extract credentials.
51
+ */
52
+ step4(encryptedData: Buffer): HapCredentials;
53
+ }
54
+ //# sourceMappingURL=srp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"srp.d.ts","sourceRoot":"","sources":["../../src/pairing/srp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAU/C,qBAAa,cAAc;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,YAAY,CAAuB;;IAM3C;;;OAGG;IACH,UAAU,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;IAmC9B;;OAEG;IACH,OAAO,CAAC,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAoDtF;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAS9E;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIxB;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAmB3D;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAgC5B;;OAEG;IACH,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc;CAmB7C"}