appium-ios-remotexpc 0.0.6 → 0.1.1

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 (31) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/build/src/lib/apple-tv/srp/crypto-utils.d.ts +53 -0
  3. package/build/src/lib/apple-tv/srp/crypto-utils.d.ts.map +1 -0
  4. package/build/src/lib/apple-tv/srp/crypto-utils.js +128 -0
  5. package/build/src/lib/apple-tv/srp/index.d.ts +3 -0
  6. package/build/src/lib/apple-tv/srp/index.d.ts.map +1 -0
  7. package/build/src/lib/apple-tv/srp/index.js +2 -0
  8. package/build/src/lib/apple-tv/srp/srp-client.d.ts +130 -0
  9. package/build/src/lib/apple-tv/srp/srp-client.d.ts.map +1 -0
  10. package/build/src/lib/apple-tv/srp/srp-client.js +288 -0
  11. package/build/src/lib/tunnel/index.d.ts +1 -1
  12. package/build/src/lib/tunnel/index.d.ts.map +1 -1
  13. package/build/src/lib/tunnel/index.js +1 -1
  14. package/build/src/lib/tunnel/packet-stream-client.d.ts +1 -1
  15. package/build/src/lib/tunnel/packet-stream-client.d.ts.map +1 -1
  16. package/build/src/lib/tunnel/packet-stream-server.d.ts +1 -1
  17. package/build/src/lib/tunnel/packet-stream-server.d.ts.map +1 -1
  18. package/build/src/lib/types.d.ts +1 -1
  19. package/build/src/lib/types.d.ts.map +1 -1
  20. package/build/src/lib/types.js +0 -3
  21. package/build/src/services/ios/syslog-service/index.d.ts +1 -1
  22. package/build/src/services/ios/syslog-service/index.d.ts.map +1 -1
  23. package/package.json +2 -2
  24. package/src/lib/apple-tv/srp/crypto-utils.ts +166 -0
  25. package/src/lib/apple-tv/srp/index.ts +8 -0
  26. package/src/lib/apple-tv/srp/srp-client.ts +387 -0
  27. package/src/lib/tunnel/index.ts +4 -1
  28. package/src/lib/tunnel/packet-stream-client.ts +1 -1
  29. package/src/lib/tunnel/packet-stream-server.ts +1 -1
  30. package/src/lib/types.ts +1 -1
  31. package/src/services/ios/syslog-service/index.ts +1 -1
@@ -1,5 +1,5 @@
1
+ import type { PacketConsumer } from 'appium-ios-tuntap';
1
2
  import { EventEmitter } from 'events';
2
- import type { PacketConsumer } from 'tuntap-bridge';
3
3
  /**
4
4
  * Server that exposes packet streaming from a tunnel over TCP
5
5
  * This allows cross-process access to tunnel packet streams
@@ -1 +1 @@
1
- {"version":3,"file":"packet-stream-server.d.ts","sourceRoot":"","sources":["../../../../src/lib/tunnel/packet-stream-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,eAAe,CAAC;AAYhE;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAKtC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,cAAc,CAA+B;gBAExB,IAAI,EAAE,MAAM;IAIzC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAI1C;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,aAAa;CAItB"}
1
+ {"version":3,"file":"packet-stream-server.d.ts","sourceRoot":"","sources":["../../../../src/lib/tunnel/packet-stream-server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAatC;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAKtC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,cAAc,CAA+B;gBAExB,IAAI,EAAE,MAAM;IAIzC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAI1C;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,aAAa;CAItB"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Common type definitions for the appium-ios-remotexpc library
3
3
  */
4
+ import type { PacketData } from 'appium-ios-tuntap';
4
5
  import { EventEmitter } from 'events';
5
- import type { PacketData } from 'tuntap-bridge';
6
6
  import type { BaseService, Service } from '../services/ios/base-service.js';
7
7
  import type { RemoteXpcConnection } from './remote-xpc/remote-xpc-connection.js';
8
8
  import type { Device } from './usbmux/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1 @@
1
- /**
2
- * Common type definitions for the appium-ios-remotexpc library
3
- */
4
1
  import { EventEmitter } from 'events';
@@ -1,5 +1,5 @@
1
+ import type { PacketData } from 'appium-ios-tuntap';
1
2
  import { EventEmitter } from 'events';
2
- import type { PacketData } from 'tuntap-bridge';
3
3
  import type { PacketSource, SyslogOptions, SyslogService as SyslogServiceInterface } from '../../../lib/types.js';
4
4
  import { type Service } from '../base-service.js';
5
5
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/services/ios/syslog-service/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhE,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,aAAa,IAAI,sBAAsB,EACxC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAqB/D;;;GAGG;AACH,cAAM,aAAc,SAAQ,YAAa,YAAW,sBAAsB;IACxE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,mBAAmB,CAA8B;IACzD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,oBAAoB,CAAS;IAErC;;;OAGG;gBACS,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAKrC;;;;;;OAMG;IACG,KAAK,CACT,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,EACtD,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAgChB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B;;;;OAIG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,cAAc;YASR,mBAAmB;IAejC,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,WAAW;IAOnB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAqCpB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CA2B1B;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/services/ios/syslog-service/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,aAAa,IAAI,sBAAsB,EACxC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAqB/D;;;GAGG;AACH,cAAM,aAAc,SAAQ,YAAa,YAAW,sBAAsB;IACxE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,mBAAmB,CAA8B;IACzD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,oBAAoB,CAAS;IAErC;;;OAGG;gBACS,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAKrC;;;;;;OAMG;IACG,KAAK,CACT,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,EACtD,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAgChB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B;;;;OAIG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,cAAc;YASR,mBAAmB;IAejC,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,WAAW;IAOnB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAqCpB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CA2B1B;AAED,eAAe,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-ios-remotexpc",
3
- "version": "0.0.6",
3
+ "version": "0.1.1",
4
4
  "main": "build/src/index.js",
5
5
  "types": "build/src/index.d.ts",
6
6
  "type": "module",
@@ -74,7 +74,7 @@
74
74
  "@types/node": "^24.0.10",
75
75
  "@xmldom/xmldom": "^0.9.8",
76
76
  "npm-run-all2": "^7.0.2",
77
- "tuntap-bridge": "^0.x"
77
+ "appium-ios-tuntap": "^0.x"
78
78
  },
79
79
  "files": [
80
80
  "src",
@@ -0,0 +1,166 @@
1
+ import { createHash } from 'node:crypto';
2
+
3
+ import { SRP_HASH_ALGORITHM } from '../constants.js';
4
+ import {
5
+ bigIntToBuffer,
6
+ bigIntToMinimalBuffer,
7
+ bufferToBigInt,
8
+ } from '../utils/buffer-utils.js';
9
+
10
+ /**
11
+ * Computes a cryptographic hash of the provided input buffers.
12
+ *
13
+ * @param inputs - Variable number of Buffer objects to hash
14
+ * @returns The computed hash as a Buffer
15
+ * @throws {Error} If no inputs provided
16
+ */
17
+ export function hash(...inputs: Buffer[]): Buffer {
18
+ if (inputs.length === 0) {
19
+ throw new Error('At least one input buffer is required for hashing');
20
+ }
21
+
22
+ const hasher = createHash(SRP_HASH_ALGORITHM);
23
+
24
+ for (const input of inputs) {
25
+ if (!Buffer.isBuffer(input)) {
26
+ throw new Error('All inputs must be Buffer objects');
27
+ }
28
+ hasher.update(input);
29
+ }
30
+
31
+ return hasher.digest();
32
+ }
33
+
34
+ /**
35
+ * Calculates the SRP multiplier parameter k = H(N, g).
36
+ *
37
+ * @param N - The large safe prime modulus
38
+ * @param g - The generator
39
+ * @param keyLength - The key length in bytes
40
+ * @returns The calculated k value as a bigint
41
+ * @throws {Error} If parameters are invalid
42
+ */
43
+ export function calculateK(N: bigint, g: bigint, keyLength: number): bigint {
44
+ if (N <= BigInt(0) || g <= BigInt(0)) {
45
+ throw new Error('N and g must be positive');
46
+ }
47
+ if (keyLength <= 0) {
48
+ throw new Error('Key length must be positive');
49
+ }
50
+
51
+ const NBuffer = bigIntToBuffer(N, keyLength);
52
+ const gBuffer = bigIntToBuffer(g, keyLength);
53
+ const kHash = hash(NBuffer, gBuffer);
54
+
55
+ return bufferToBigInt(kHash);
56
+ }
57
+
58
+ /**
59
+ * Calculates the private key x = H(salt, H(username:password)).
60
+ *
61
+ * @param salt - The salt buffer
62
+ * @param username - The username string
63
+ * @param password - The password string
64
+ * @returns The calculated x value as a bigint
65
+ * @throws {Error} If parameters are invalid
66
+ */
67
+ export function calculateX(
68
+ salt: Buffer,
69
+ username: string,
70
+ password: string,
71
+ ): bigint {
72
+ if (!Buffer.isBuffer(salt) || salt.length === 0) {
73
+ throw new Error('Salt must be a non-empty Buffer');
74
+ }
75
+ if (!username || !password) {
76
+ throw new Error('Username and password must be non-empty strings');
77
+ }
78
+
79
+ const usernamePasswordHash = hash(
80
+ Buffer.from(`${username}:${password}`, 'utf8'),
81
+ );
82
+ const xHash = hash(salt, usernamePasswordHash);
83
+
84
+ return bufferToBigInt(xHash);
85
+ }
86
+
87
+ /**
88
+ * Calculates the random scrambling parameter u = H(A, B).
89
+ *
90
+ * @param A - The client's public key
91
+ * @param B - The server's public key
92
+ * @param keyLength - The key length in bytes
93
+ * @returns The calculated u value as a bigint
94
+ * @throws {Error} If parameters are invalid
95
+ */
96
+ export function calculateU(A: bigint, B: bigint, keyLength: number): bigint {
97
+ if (A <= BigInt(0) || B <= BigInt(0)) {
98
+ throw new Error('Public keys A and B must be positive');
99
+ }
100
+ if (keyLength <= 0) {
101
+ throw new Error('Key length must be positive');
102
+ }
103
+
104
+ const ABuffer = bigIntToBuffer(A, keyLength);
105
+ const BBuffer = bigIntToBuffer(B, keyLength);
106
+ const uHash = hash(ABuffer, BBuffer);
107
+
108
+ const u = bufferToBigInt(uHash);
109
+ if (u === BigInt(0)) {
110
+ throw new Error('Calculated u value cannot be zero (hash collision)');
111
+ }
112
+
113
+ return u;
114
+ }
115
+
116
+ /**
117
+ * Calculates the client evidence M1 = H(H(N) xor H(g), H(username), salt, A, B, K).
118
+ *
119
+ * @param N - The large safe prime modulus
120
+ * @param g - The generator
121
+ * @param username - The username string
122
+ * @param salt - The salt buffer
123
+ * @param A - The client's public key
124
+ * @param B - The server's public key
125
+ * @param K - The session key
126
+ * @returns The calculated M1 evidence as a Buffer
127
+ * @throws {Error} If parameters are invalid
128
+ */
129
+ export function calculateM1(
130
+ N: bigint,
131
+ g: bigint,
132
+ username: string,
133
+ salt: Buffer,
134
+ A: bigint,
135
+ B: bigint,
136
+ K: Buffer,
137
+ ): Buffer {
138
+ if (N <= BigInt(0) || g <= BigInt(0) || A <= BigInt(0) || B <= BigInt(0)) {
139
+ throw new Error('All bigint parameters must be positive');
140
+ }
141
+ if (!username) {
142
+ throw new Error('Username must be non-empty');
143
+ }
144
+ if (!Buffer.isBuffer(salt) || salt.length === 0) {
145
+ throw new Error('Salt must be a non-empty Buffer');
146
+ }
147
+ if (!Buffer.isBuffer(K) || K.length === 0) {
148
+ throw new Error('Session key K must be a non-empty Buffer');
149
+ }
150
+
151
+ const NBytes = bigIntToMinimalBuffer(N);
152
+ const gBytes = bigIntToMinimalBuffer(g);
153
+ const NHash = hash(NBytes);
154
+ const gHash = hash(gBytes);
155
+
156
+ const NgXorBytes = Buffer.alloc(NHash.length);
157
+ for (let i = 0; i < NHash.length; i++) {
158
+ NgXorBytes[i] = NHash[i] ^ gHash[i];
159
+ }
160
+
161
+ const usernameHash = hash(Buffer.from(username, 'utf8'));
162
+ const ABytes = bigIntToMinimalBuffer(A);
163
+ const BBytes = bigIntToMinimalBuffer(B);
164
+
165
+ return hash(NgXorBytes, usernameHash, salt, ABytes, BBytes, K);
166
+ }
@@ -0,0 +1,8 @@
1
+ export { SRPClient } from './srp-client.js';
2
+ export {
3
+ hash,
4
+ calculateK,
5
+ calculateX,
6
+ calculateU,
7
+ calculateM1,
8
+ } from './crypto-utils.js';
@@ -0,0 +1,387 @@
1
+ import { logger } from '@appium/support';
2
+ import { randomBytes } from 'node:crypto';
3
+
4
+ import {
5
+ SRP_GENERATOR,
6
+ SRP_KEY_LENGTH_BYTES,
7
+ SRP_PRIME_3072,
8
+ SRP_PRIVATE_KEY_BITS,
9
+ SRP_USERNAME,
10
+ } from '../constants.js';
11
+ import { SRPError } from '../errors.js';
12
+ import {
13
+ bigIntToBuffer,
14
+ bufferToBigInt,
15
+ modPow,
16
+ } from '../utils/buffer-utils.js';
17
+ import {
18
+ calculateK,
19
+ calculateM1,
20
+ calculateU,
21
+ calculateX,
22
+ hash,
23
+ } from './crypto-utils.js';
24
+
25
+ const log = logger.getLogger('SRPClient');
26
+
27
+ /**
28
+ * SRP (Secure Remote Password) client implementation following RFC 5054.
29
+ *
30
+ * This class handles the client-side operations of the SRP protocol,
31
+ * including key generation, authentication proof computation, and
32
+ * session key derivation.
33
+ */
34
+ export class SRPClient {
35
+ // Constants
36
+ private static readonly ZERO = BigInt(0);
37
+ private static readonly ONE = BigInt(1);
38
+ private static readonly MAX_KEY_GENERATION_ATTEMPTS = 100;
39
+
40
+ private readonly N = SRP_PRIME_3072;
41
+ private readonly g = SRP_GENERATOR;
42
+ private readonly k: bigint;
43
+ private readonly N_MINUS_ONE: bigint;
44
+
45
+ private username: string;
46
+ private password: string;
47
+ private _salt: Buffer | null = null;
48
+ private _a: bigint = SRPClient.ZERO;
49
+ private _A: bigint = SRPClient.ZERO;
50
+ private _B: bigint | null = null;
51
+ private _S: bigint | null = null;
52
+ private _K: Buffer | null = null;
53
+
54
+ // State tracking
55
+ private keysGenerated = false;
56
+ private disposed = false;
57
+
58
+ constructor() {
59
+ this.k = calculateK(this.N, this.g, SRP_KEY_LENGTH_BYTES);
60
+ this.N_MINUS_ONE = this.N - SRPClient.ONE;
61
+ this.username = SRP_USERNAME;
62
+ this.password = '';
63
+
64
+ log.debug('Initialized SRP client with k value');
65
+ }
66
+
67
+ /**
68
+ * Sets the user identity credentials.
69
+ * Note: Username is set to SRP_USERNAME constant, but can be overridden.
70
+ *
71
+ * @param username - The username for authentication
72
+ * @param password - The password for authentication
73
+ * @throws {SRPError} If username or password is empty
74
+ */
75
+ public setIdentity(username: string, password: string): void {
76
+ this.throwIfDisposed();
77
+
78
+ if (!username?.trim()) {
79
+ throw new SRPError('Username cannot be empty');
80
+ }
81
+ if (!password) {
82
+ throw new SRPError('Password cannot be empty');
83
+ }
84
+
85
+ this.username = username.trim();
86
+ this.password = password;
87
+
88
+ log.debug('Identity set successfully');
89
+ }
90
+
91
+ /**
92
+ * Gets the salt value received from the server.
93
+ *
94
+ * @returns The salt buffer or null if not set
95
+ */
96
+ get salt(): Buffer | null {
97
+ return this._salt;
98
+ }
99
+
100
+ /**
101
+ * Sets the salt value received from the server.
102
+ *
103
+ * @param value - The salt buffer from the server
104
+ * @throws {SRPError} If salt is empty or client is disposed
105
+ */
106
+ set salt(value: Buffer) {
107
+ this.throwIfDisposed();
108
+
109
+ if (!value || value.length === 0) {
110
+ throw new SRPError('Salt cannot be empty');
111
+ }
112
+
113
+ this._salt = value;
114
+ this.generateClientKeysIfReady();
115
+
116
+ log.debug('Salt set successfully');
117
+ }
118
+
119
+ /**
120
+ * Gets the server's public key B.
121
+ *
122
+ * @returns The server's public key as a Buffer or null if not set
123
+ */
124
+ get serverPublicKey(): Buffer | null {
125
+ return this._B ? bigIntToBuffer(this._B, SRP_KEY_LENGTH_BYTES) : null;
126
+ }
127
+
128
+ /**
129
+ * Sets the server's public key B.
130
+ *
131
+ * @param value - The server's public key as a Buffer
132
+ * @throws {SRPError} If the server public key is invalid or client is disposed
133
+ */
134
+ set serverPublicKey(value: Buffer) {
135
+ this.throwIfDisposed();
136
+
137
+ if (!value || value.length !== SRP_KEY_LENGTH_BYTES) {
138
+ throw new SRPError(
139
+ `Server public key must be ${SRP_KEY_LENGTH_BYTES} bytes, got ${value?.length || 0}`,
140
+ );
141
+ }
142
+
143
+ this._B = bufferToBigInt(value);
144
+
145
+ if (this._B <= SRPClient.ONE || this._B >= this.N_MINUS_ONE) {
146
+ throw new SRPError(
147
+ 'Invalid server public key B: must be in range (1, N-1)',
148
+ );
149
+ }
150
+
151
+ // Additional security check
152
+ if (this._B % this.N === SRPClient.ZERO) {
153
+ throw new SRPError('Invalid server public key B: divisible by N');
154
+ }
155
+
156
+ this.generateClientKeysIfReady();
157
+ log.debug('Server public key set successfully');
158
+ }
159
+
160
+ /**
161
+ * Gets the client's public key A.
162
+ *
163
+ * @returns The client's public key as a Buffer
164
+ * @throws {SRPError} If keys are not generated yet or client is disposed
165
+ */
166
+ get publicKey(): Buffer {
167
+ this.throwIfDisposed();
168
+
169
+ if (this._A === SRPClient.ZERO) {
170
+ throw new SRPError(
171
+ 'Client keys not generated yet. Set salt and serverPublicKey properties first.',
172
+ );
173
+ }
174
+
175
+ return bigIntToBuffer(this._A, SRP_KEY_LENGTH_BYTES);
176
+ }
177
+
178
+ /**
179
+ * Computes the authentication proof M1.
180
+ *
181
+ * @returns The authentication proof as a Buffer
182
+ * @throws {SRPError} If required parameters are not set or client is disposed
183
+ */
184
+ public computeProof(): Buffer {
185
+ this.throwIfDisposed();
186
+ this.validateIdentitySet();
187
+
188
+ if (!this._K) {
189
+ this.computeSharedSecret();
190
+ }
191
+
192
+ if (!this._salt || !this._K || !this._B) {
193
+ throw new SRPError(
194
+ 'Cannot compute proof: salt, session key, and server public key must be set',
195
+ );
196
+ }
197
+
198
+ return calculateM1(
199
+ this.N,
200
+ this.g,
201
+ this.username,
202
+ this._salt,
203
+ this._A,
204
+ this._B,
205
+ this._K,
206
+ );
207
+ }
208
+
209
+ /**
210
+ * Gets the computed session key K.
211
+ *
212
+ * @returns The session key as a Buffer
213
+ * @throws {SRPError} If session key is not computed or client is disposed
214
+ */
215
+ get sessionKey(): Buffer {
216
+ this.throwIfDisposed();
217
+ this.validateIdentitySet();
218
+
219
+ if (!this._K) {
220
+ this.computeSharedSecret();
221
+ }
222
+
223
+ if (!this._K) {
224
+ throw new SRPError('Session key not computed');
225
+ }
226
+
227
+ return this._K;
228
+ }
229
+
230
+ /**
231
+ * Checks if the client is ready to perform operations.
232
+ *
233
+ * @returns True if salt and server public key are set
234
+ */
235
+ public isReady(): boolean {
236
+ return !this.disposed && !!(this._salt && this._B && this.keysGenerated);
237
+ }
238
+
239
+ /**
240
+ * Checks if session key has been computed.
241
+ *
242
+ * @returns True if a session key is available
243
+ */
244
+ public hasSessionKey(): boolean {
245
+ return !this.disposed && !!this._K;
246
+ }
247
+
248
+ /**
249
+ * Clears sensitive data and disposes the client.
250
+ * After calling this method, the client instance should not be used.
251
+ */
252
+ public dispose(): void {
253
+ if (this.disposed) {
254
+ return;
255
+ }
256
+
257
+ // Clear sensitive data
258
+ this.password = '';
259
+ this._a = SRPClient.ZERO;
260
+
261
+ if (this._K) {
262
+ this._K.fill(0);
263
+ }
264
+
265
+ this._salt = null;
266
+ this._S = null;
267
+ this._B = null;
268
+ this.disposed = true;
269
+
270
+ log.debug('SRP client disposed and sensitive data cleared');
271
+ }
272
+
273
+ /**
274
+ * Generates client keys if both salt and server public key are available.
275
+ * This method ensures keys are generated only once.
276
+ */
277
+ private generateClientKeysIfReady(): void {
278
+ if (this._salt && this._B && !this.keysGenerated) {
279
+ this.generateClientKeys();
280
+ this.keysGenerated = true;
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Generates the client's private and public keys using cryptographically secure methods.
286
+ *
287
+ * @throws {SRPError} If generated public key is invalid or key generation fails
288
+ */
289
+ private generateClientKeys(): void {
290
+ this.validateIdentitySet();
291
+
292
+ let attempts = 0;
293
+
294
+ while (attempts < SRPClient.MAX_KEY_GENERATION_ATTEMPTS) {
295
+ const randomBits = randomBytes(SRP_PRIVATE_KEY_BITS / 8);
296
+ this._a = bufferToBigInt(randomBits);
297
+
298
+ // Ensure key is in valid range without introducing bias
299
+ if (this._a >= this.N) {
300
+ attempts++;
301
+ continue;
302
+ }
303
+
304
+ if (this._a === SRPClient.ZERO) {
305
+ attempts++;
306
+ continue;
307
+ }
308
+
309
+ this._A = modPow(this.g, this._a, this.N);
310
+
311
+ if (this._A <= SRPClient.ONE || this._A >= this.N_MINUS_ONE) {
312
+ attempts++;
313
+ continue;
314
+ }
315
+
316
+ // Successfully generated valid keys
317
+ log.debug('Generated client keys successfully');
318
+ return;
319
+ }
320
+
321
+ throw new SRPError(
322
+ `Failed to generate secure client keys after ${SRPClient.MAX_KEY_GENERATION_ATTEMPTS} attempts`,
323
+ );
324
+ }
325
+
326
+ /**
327
+ * Computes the shared secret S and derives the session key K.
328
+ *
329
+ * @throws {SRPError} If required parameters are not set
330
+ */
331
+ private computeSharedSecret(): void {
332
+ this.validateIdentitySet();
333
+
334
+ if (!this._salt || !this._B) {
335
+ throw new SRPError('Salt and server public key must be set first');
336
+ }
337
+
338
+ if (this._A === SRPClient.ZERO) {
339
+ throw new SRPError('Client keys not generated');
340
+ }
341
+
342
+ const u = calculateU(this._A, this._B, SRP_KEY_LENGTH_BYTES);
343
+ log.debug('Calculated u value');
344
+
345
+ const x = calculateX(this._salt, this.username, this.password);
346
+ log.debug('Calculated x value');
347
+
348
+ const gx = modPow(this.g, x, this.N);
349
+ const kgx = (this.k * gx) % this.N;
350
+
351
+ // Fix negative modulo operation
352
+ let base = this._B - kgx;
353
+ base = ((base % this.N) + this.N) % this.N;
354
+
355
+ const exponent = this._a + u * x;
356
+ this._S = modPow(base, exponent, this.N);
357
+ log.debug('Calculated shared secret S');
358
+
359
+ const SBuffer = bigIntToBuffer(this._S, SRP_KEY_LENGTH_BYTES);
360
+ this._K = hash(SBuffer);
361
+ log.debug('Calculated session key K');
362
+ }
363
+
364
+ /**
365
+ * Validates that identity has been set.
366
+ *
367
+ * @throws {SRPError} If password is not set (username is set by default)
368
+ */
369
+ private validateIdentitySet(): void {
370
+ if (!this.password) {
371
+ throw new SRPError(
372
+ 'Password must be set before performing operations. Call setIdentity() first.',
373
+ );
374
+ }
375
+ }
376
+
377
+ /**
378
+ * Throws an error if the client has been disposed.
379
+ *
380
+ * @throws {SRPError} If client is disposed
381
+ */
382
+ private throwIfDisposed(): void {
383
+ if (this.disposed) {
384
+ throw new SRPError('SRP client has been disposed');
385
+ }
386
+ }
387
+ }
@@ -1,6 +1,9 @@
1
1
  import { logger } from '@appium/support';
2
+ import {
3
+ type TunnelConnection,
4
+ connectToTunnelLockdown,
5
+ } from 'appium-ios-tuntap';
2
6
  import type { TLSSocket } from 'tls';
3
- import { type TunnelConnection, connectToTunnelLockdown } from 'tuntap-bridge';
4
7
 
5
8
  import { RemoteXpcConnection } from '../remote-xpc/remote-xpc-connection.js';
6
9
 
@@ -1,7 +1,7 @@
1
1
  import { logger } from '@appium/support';
2
+ import type { PacketConsumer, PacketData } from 'appium-ios-tuntap';
2
3
  import { EventEmitter } from 'events';
3
4
  import { type Socket, createConnection } from 'net';
4
- import type { PacketConsumer, PacketData } from 'tuntap-bridge';
5
5
 
6
6
  const log = logger.getLogger('PacketStreamClient');
7
7
 
@@ -1,7 +1,7 @@
1
1
  import { logger } from '@appium/support';
2
+ import type { PacketConsumer, PacketData } from 'appium-ios-tuntap';
2
3
  import { EventEmitter } from 'events';
3
4
  import { type Server, type Socket, createServer } from 'net';
4
- import type { PacketConsumer, PacketData } from 'tuntap-bridge';
5
5
 
6
6
  const log = logger.getLogger('PacketStreamServer');
7
7
 
package/src/lib/types.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Common type definitions for the appium-ios-remotexpc library
3
3
  */
4
+ import type { PacketData } from 'appium-ios-tuntap';
4
5
  import { EventEmitter } from 'events';
5
- import type { PacketData } from 'tuntap-bridge';
6
6
 
7
7
  import type { BaseService, Service } from '../services/ios/base-service.js';
8
8
  import type { RemoteXpcConnection } from './remote-xpc/remote-xpc-connection.js';