ai-remote 0.1.0

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 (114) hide show
  1. package/README.md +50 -0
  2. package/dist/index.js +7 -0
  3. package/dist/index.js.map +7 -0
  4. package/dist/protocols/index.js +35 -0
  5. package/dist/protocols/index.js.map +7 -0
  6. package/dist/protocols/rdp/buffer.js +170 -0
  7. package/dist/protocols/rdp/buffer.js.map +7 -0
  8. package/dist/protocols/rdp/caps.js +260 -0
  9. package/dist/protocols/rdp/caps.js.map +7 -0
  10. package/dist/protocols/rdp/cert.js +135 -0
  11. package/dist/protocols/rdp/cert.js.map +7 -0
  12. package/dist/protocols/rdp/client.js +1068 -0
  13. package/dist/protocols/rdp/client.js.map +7 -0
  14. package/dist/protocols/rdp/cliprdr.js +240 -0
  15. package/dist/protocols/rdp/cliprdr.js.map +7 -0
  16. package/dist/protocols/rdp/credssp.js +254 -0
  17. package/dist/protocols/rdp/credssp.js.map +7 -0
  18. package/dist/protocols/rdp/crypto.js +369 -0
  19. package/dist/protocols/rdp/crypto.js.map +7 -0
  20. package/dist/protocols/rdp/display.js +589 -0
  21. package/dist/protocols/rdp/display.js.map +7 -0
  22. package/dist/protocols/rdp/gcc.js +132 -0
  23. package/dist/protocols/rdp/gcc.js.map +7 -0
  24. package/dist/protocols/rdp/keymap.js +132 -0
  25. package/dist/protocols/rdp/keymap.js.map +7 -0
  26. package/dist/protocols/rdp/mcs.js +223 -0
  27. package/dist/protocols/rdp/mcs.js.map +7 -0
  28. package/dist/protocols/rdp/ntlm.js +305 -0
  29. package/dist/protocols/rdp/ntlm.js.map +7 -0
  30. package/dist/protocols/rdp/pdu.js +444 -0
  31. package/dist/protocols/rdp/pdu.js.map +7 -0
  32. package/dist/protocols/rdp/rail.js +383 -0
  33. package/dist/protocols/rdp/rail.js.map +7 -0
  34. package/dist/protocols/rdp/rle.js +276 -0
  35. package/dist/protocols/rdp/rle.js.map +7 -0
  36. package/dist/protocols/rdp/sec.js +156 -0
  37. package/dist/protocols/rdp/sec.js.map +7 -0
  38. package/dist/protocols/rdp/session.js +307 -0
  39. package/dist/protocols/rdp/session.js.map +7 -0
  40. package/dist/protocols/rdp/tls.js +354 -0
  41. package/dist/protocols/rdp/tls.js.map +7 -0
  42. package/dist/protocols/rdp/vchannel.js +59 -0
  43. package/dist/protocols/rdp/vchannel.js.map +7 -0
  44. package/dist/protocols/rdp/x224.js +110 -0
  45. package/dist/protocols/rdp/x224.js.map +7 -0
  46. package/dist/protocols/ssh/kex.js +177 -0
  47. package/dist/protocols/ssh/kex.js.map +7 -0
  48. package/dist/protocols/ssh/messages.js +55 -0
  49. package/dist/protocols/ssh/messages.js.map +7 -0
  50. package/dist/protocols/ssh/session.js +608 -0
  51. package/dist/protocols/ssh/session.js.map +7 -0
  52. package/dist/protocols/ssh/terminal.js +191 -0
  53. package/dist/protocols/ssh/terminal.js.map +7 -0
  54. package/dist/protocols/ssh/transport.js +611 -0
  55. package/dist/protocols/ssh/transport.js.map +7 -0
  56. package/dist/protocols/ssh/wire.js +189 -0
  57. package/dist/protocols/ssh/wire.js.map +7 -0
  58. package/dist/protocols/types.js +1 -0
  59. package/dist/protocols/types.js.map +7 -0
  60. package/dist/protocols/vnc/input.js +16 -0
  61. package/dist/protocols/vnc/input.js.map +7 -0
  62. package/dist/protocols/vnc/session.js +259 -0
  63. package/dist/protocols/vnc/session.js.map +7 -0
  64. package/dist/shared/connection.js +114 -0
  65. package/dist/shared/connection.js.map +7 -0
  66. package/dist/shared/device.js +1 -0
  67. package/dist/shared/device.js.map +7 -0
  68. package/dist/shared/hosts.js +133 -0
  69. package/dist/shared/hosts.js.map +7 -0
  70. package/dist/shared/icons.js +42 -0
  71. package/dist/shared/icons.js.map +7 -0
  72. package/dist/shared/protocol.js +40 -0
  73. package/dist/shared/protocol.js.map +7 -0
  74. package/dist/shared/signals.js +42 -0
  75. package/dist/shared/signals.js.map +7 -0
  76. package/package.json +82 -0
  77. package/src/index.ts +14 -0
  78. package/src/protocols/index.ts +72 -0
  79. package/src/protocols/rdp/buffer.ts +204 -0
  80. package/src/protocols/rdp/caps.ts +304 -0
  81. package/src/protocols/rdp/cert.ts +190 -0
  82. package/src/protocols/rdp/client.ts +1363 -0
  83. package/src/protocols/rdp/cliprdr.ts +344 -0
  84. package/src/protocols/rdp/credssp.ts +319 -0
  85. package/src/protocols/rdp/crypto.ts +416 -0
  86. package/src/protocols/rdp/display.ts +750 -0
  87. package/src/protocols/rdp/gcc.ts +162 -0
  88. package/src/protocols/rdp/keymap.ts +68 -0
  89. package/src/protocols/rdp/mcs.ts +283 -0
  90. package/src/protocols/rdp/ntlm.ts +380 -0
  91. package/src/protocols/rdp/pdu.ts +497 -0
  92. package/src/protocols/rdp/rail.ts +480 -0
  93. package/src/protocols/rdp/rle.ts +343 -0
  94. package/src/protocols/rdp/sec.ts +184 -0
  95. package/src/protocols/rdp/session.ts +393 -0
  96. package/src/protocols/rdp/tls.ts +452 -0
  97. package/src/protocols/rdp/vchannel.ts +89 -0
  98. package/src/protocols/rdp/x224.ts +139 -0
  99. package/src/protocols/ssh/kex.ts +227 -0
  100. package/src/protocols/ssh/messages.ts +54 -0
  101. package/src/protocols/ssh/session.ts +878 -0
  102. package/src/protocols/ssh/terminal.ts +242 -0
  103. package/src/protocols/ssh/transport.ts +732 -0
  104. package/src/protocols/ssh/wire.ts +220 -0
  105. package/src/protocols/types.ts +146 -0
  106. package/src/protocols/vnc/input.ts +13 -0
  107. package/src/protocols/vnc/novnc.d.ts +75 -0
  108. package/src/protocols/vnc/session.ts +367 -0
  109. package/src/shared/connection.ts +206 -0
  110. package/src/shared/device.ts +28 -0
  111. package/src/shared/hosts.ts +240 -0
  112. package/src/shared/icons.ts +49 -0
  113. package/src/shared/protocol.ts +55 -0
  114. package/src/shared/signals.ts +67 -0
@@ -0,0 +1,135 @@
1
+ import { Reader } from "./buffer";
2
+ const CERT_PROPRIETARY = 1;
3
+ const CERT_X509 = 2;
4
+ const RSA1_MAGIC = 826364754;
5
+ const BB_RSA_KEY_BLOB = 6;
6
+ const OID_RSA_ENCRYPTION = [42, 134, 72, 134, 247, 13, 1, 1, 1];
7
+ function derRead(bytes, offset) {
8
+ let cursor = offset;
9
+ const tag = bytes[cursor++];
10
+ let length = bytes[cursor++];
11
+ if (length & 128) {
12
+ const byteCount = length & 127;
13
+ length = 0;
14
+ for (let i = 0; i < byteCount; i++) length = length << 8 | bytes[cursor++];
15
+ }
16
+ return {
17
+ tag,
18
+ contentStart: cursor,
19
+ contentEnd: cursor + length,
20
+ next: cursor + length,
21
+ content: bytes.subarray(cursor, cursor + length)
22
+ };
23
+ }
24
+ function derChildren(bytes) {
25
+ const children = [];
26
+ let offset = 0;
27
+ while (offset < bytes.length) {
28
+ const node = derRead(bytes, offset);
29
+ children.push(node);
30
+ if (node.next <= offset) break;
31
+ offset = node.next;
32
+ }
33
+ return children;
34
+ }
35
+ function containsOid(bytes, oid) {
36
+ outer: for (let i = 0; i + oid.length <= bytes.length; i++) {
37
+ for (let j = 0; j < oid.length; j++) {
38
+ if (bytes[i + j] !== oid[j]) continue outer;
39
+ }
40
+ return true;
41
+ }
42
+ return false;
43
+ }
44
+ function derIntegerToLe(content) {
45
+ let start = 0;
46
+ while (start < content.length - 1 && content[start] === 0) start++;
47
+ return content.subarray(start).slice().reverse();
48
+ }
49
+ function rsaKeyFromX509(der) {
50
+ const certificate = derRead(der, 0);
51
+ const tbsCertificate = derRead(der, certificate.contentStart);
52
+ for (const child of derChildren(tbsCertificate.content)) {
53
+ if (child.tag !== 48) continue;
54
+ const parts = derChildren(child.content);
55
+ if (parts.length < 2) continue;
56
+ if (parts[0].tag !== 48 || !containsOid(parts[0].content, OID_RSA_ENCRYPTION)) continue;
57
+ if (parts[1].tag !== 3) continue;
58
+ const publicKey = derRead(parts[1].content.subarray(1), 0);
59
+ const [modulus, exponent] = derChildren(publicKey.content);
60
+ if (!modulus || !exponent) break;
61
+ return {
62
+ modulus: derIntegerToLe(modulus.content),
63
+ exponent: derIntegerToLe(exponent.content),
64
+ source: "x509"
65
+ };
66
+ }
67
+ throw new Error("RDP: no RSA public key found in the host X.509 certificate");
68
+ }
69
+ function rsaKeyFromProprietary(reader) {
70
+ reader.u32le();
71
+ reader.u32le();
72
+ const publicKeyBlobType = reader.u16le();
73
+ const publicKeyBlobLength = reader.u16le();
74
+ if (publicKeyBlobType !== BB_RSA_KEY_BLOB) {
75
+ throw new Error(`RDP: unsupported public key blob type 0x${publicKeyBlobType.toString(16)}`);
76
+ }
77
+ const blob = new Reader(reader.raw(publicKeyBlobLength));
78
+ if (blob.u32le() !== RSA1_MAGIC) {
79
+ throw new Error("RDP: the host RSA public key blob is not in RSA1 format");
80
+ }
81
+ const keyLength = blob.u32le();
82
+ blob.u32le();
83
+ blob.u32le();
84
+ const exponent = blob.raw(4).slice();
85
+ if (keyLength < 9) throw new Error("RDP: the host RSA modulus is too short");
86
+ const modulus = blob.raw(keyLength - 8).slice();
87
+ return { modulus, exponent, source: "proprietary" };
88
+ }
89
+ function parseX509PublicKey(der) {
90
+ const certificate = derRead(der, 0);
91
+ const tbsCertificate = derRead(der, certificate.contentStart);
92
+ for (const child of derChildren(tbsCertificate.content)) {
93
+ if (child.tag !== 48) continue;
94
+ const parts = derChildren(child.content);
95
+ if (parts.length < 2) continue;
96
+ if (parts[0].tag !== 48 || !containsOid(parts[0].content, OID_RSA_ENCRYPTION)) continue;
97
+ if (parts[1].tag !== 3) continue;
98
+ const subjectPublicKey = parts[1].content.subarray(1);
99
+ const publicKey = derRead(subjectPublicKey, 0);
100
+ const [modulus, exponent] = derChildren(publicKey.content);
101
+ if (!modulus || !exponent) break;
102
+ const stripLeadingZero = (bytes) => {
103
+ let start = 0;
104
+ while (start < bytes.length - 1 && bytes[start] === 0) start++;
105
+ return bytes.subarray(start);
106
+ };
107
+ return {
108
+ modulus: stripLeadingZero(modulus.content),
109
+ exponent: stripLeadingZero(exponent.content),
110
+ subjectPublicKey
111
+ };
112
+ }
113
+ throw new Error("TLS: no RSA public key found in the host certificate");
114
+ }
115
+ function parseServerCertificate(certificateBytes) {
116
+ const reader = new Reader(certificateBytes);
117
+ const version = reader.u32le() & 2147483647;
118
+ if (version === CERT_PROPRIETARY) return rsaKeyFromProprietary(reader);
119
+ if (version === CERT_X509) {
120
+ const certificateCount = reader.u32le();
121
+ let leaf = null;
122
+ for (let i = 0; i < certificateCount; i++) {
123
+ const length = reader.u32le();
124
+ leaf = reader.raw(length);
125
+ }
126
+ if (!leaf) throw new Error("RDP: the host sent an empty X.509 certificate chain");
127
+ return rsaKeyFromX509(leaf);
128
+ }
129
+ throw new Error(`RDP: unsupported server certificate version ${version}`);
130
+ }
131
+ export {
132
+ parseServerCertificate,
133
+ parseX509PublicKey
134
+ };
135
+ //# sourceMappingURL=cert.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/protocols/rdp/cert.ts"],
4
+ "sourcesContent": ["// Server public key extraction for the RDP Standard Security layer.\n//\n// A host either hands out a \"proprietary\" certificate -- little more than a\n// wrapper around an RSA public key -- or an X.509 chain whose leaf holds the\n// key (MS-RDPBCGR 2.2.1.4.3.1). Either way the client random is encrypted with\n// that key, so all we need out of it is a modulus and an exponent.\n//\n// Note the proprietary certificate is signed with a private key Microsoft\n// published, so it authenticates nothing: RDP Standard Security gives\n// confidentiality on the wire, not proof of the host's identity.\n\nimport { Reader } from './buffer';\n\nconst CERT_PROPRIETARY = 1;\nconst CERT_X509 = 2;\nconst RSA1_MAGIC = 0x31415352;\nconst BB_RSA_KEY_BLOB = 0x0006;\n\nconst OID_RSA_ENCRYPTION = [0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01];\n\n// --- DER --------------------------------------------------------------------\n\nfunction derRead(bytes: Uint8Array, offset: number) {\n let cursor = offset;\n const tag = bytes[cursor++];\n\n let length = bytes[cursor++];\n if (length & 0x80) {\n const byteCount = length & 0x7f;\n length = 0;\n for (let i = 0; i < byteCount; i++) length = (length << 8) | bytes[cursor++];\n }\n\n return {\n tag,\n contentStart: cursor,\n contentEnd: cursor + length,\n next: cursor + length,\n content: bytes.subarray(cursor, cursor + length),\n };\n}\n\nfunction derChildren(bytes: Uint8Array) {\n const children = [];\n let offset = 0;\n while (offset < bytes.length) {\n const node = derRead(bytes, offset);\n children.push(node);\n if (node.next <= offset) break;\n offset = node.next;\n }\n return children;\n}\n\nfunction containsOid(bytes: Uint8Array, oid: string) {\n outer: for (let i = 0; i + oid.length <= bytes.length; i++) {\n for (let j = 0; j < oid.length; j++) {\n if (bytes[i + j] !== oid[j]) continue outer;\n }\n return true;\n }\n return false;\n}\n\n/** Big-endian DER integer -> little-endian bytes with the sign byte removed. */\nfunction derIntegerToLe(content: Uint8Array) {\n let start = 0;\n while (start < content.length - 1 && content[start] === 0x00) start++;\n return content.subarray(start).slice().reverse();\n}\n\n/**\n * Find SubjectPublicKeyInfo in an X.509 certificate and return the RSA key.\n * The structure is walked rather than indexed by position: optional fields in\n * TBSCertificate make fixed offsets wrong for many real certificates.\n */\nfunction rsaKeyFromX509(der: Uint8Array) {\n const certificate = derRead(der, 0);\n const tbsCertificate = derRead(der, certificate.contentStart);\n\n for (const child of derChildren(tbsCertificate.content)) {\n if (child.tag !== 0x30) continue;\n\n const parts = derChildren(child.content);\n if (parts.length < 2) continue;\n if (parts[0].tag !== 0x30 || !containsOid(parts[0].content, OID_RSA_ENCRYPTION)) continue;\n if (parts[1].tag !== 0x03) continue;\n\n // BIT STRING content starts with an \"unused bits\" count.\n const publicKey = derRead(parts[1].content.subarray(1), 0);\n const [modulus, exponent] = derChildren(publicKey.content);\n if (!modulus || !exponent) break;\n\n return {\n modulus: derIntegerToLe(modulus.content),\n exponent: derIntegerToLe(exponent.content),\n source: 'x509',\n };\n }\n\n throw new Error('RDP: no RSA public key found in the host X.509 certificate');\n}\n\nfunction rsaKeyFromProprietary(reader: Reader) {\n reader.u32le(); // dwSigAlgId\n reader.u32le(); // dwKeyAlgId\n\n const publicKeyBlobType = reader.u16le();\n const publicKeyBlobLength = reader.u16le();\n if (publicKeyBlobType !== BB_RSA_KEY_BLOB) {\n throw new Error(`RDP: unsupported public key blob type 0x${publicKeyBlobType.toString(16)}`);\n }\n\n const blob = new Reader(reader.raw(publicKeyBlobLength));\n if (blob.u32le() !== RSA1_MAGIC) {\n throw new Error('RDP: the host RSA public key blob is not in RSA1 format');\n }\n\n const keyLength = blob.u32le();\n blob.u32le(); // bitlen\n blob.u32le(); // datalen\n const exponent = blob.raw(4).slice();\n\n // The blob reserves 8 trailing bytes of padding after the modulus.\n if (keyLength < 9) throw new Error('RDP: the host RSA modulus is too short');\n const modulus = blob.raw(keyLength - 8).slice();\n\n return { modulus, exponent, source: 'proprietary' };\n}\n\n/**\n * Pull the RSA public key out of a DER X.509 certificate, for the TLS layer.\n *\n * CredSSP needs the exact bytes of the certificate's subjectPublicKey BIT\n * STRING contents -- the DER RSAPublicKey -- because that is what both ends\n * hash to bind the authentication to this TLS channel (MS-CSSP 3.1.5).\n */\nexport function parseX509PublicKey(der: Uint8Array) {\n const certificate = derRead(der, 0);\n const tbsCertificate = derRead(der, certificate.contentStart);\n\n for (const child of derChildren(tbsCertificate.content)) {\n if (child.tag !== 0x30) continue;\n\n const parts = derChildren(child.content);\n if (parts.length < 2) continue;\n if (parts[0].tag !== 0x30 || !containsOid(parts[0].content, OID_RSA_ENCRYPTION)) continue;\n if (parts[1].tag !== 0x03) continue;\n\n const subjectPublicKey = parts[1].content.subarray(1); // drop the unused-bit count\n const publicKey = derRead(subjectPublicKey, 0);\n const [modulus, exponent] = derChildren(publicKey.content);\n if (!modulus || !exponent) break;\n\n const stripLeadingZero = (bytes: Uint8Array) => {\n let start = 0;\n while (start < bytes.length - 1 && bytes[start] === 0x00) start++;\n return bytes.subarray(start);\n };\n\n return {\n modulus: stripLeadingZero(modulus.content),\n exponent: stripLeadingZero(exponent.content),\n subjectPublicKey,\n };\n }\n\n throw new Error('TLS: no RSA public key found in the host certificate');\n}\n\n/** Parse a server certificate blob into an RSA public key. */\nexport function parseServerCertificate(certificateBytes: Uint8Array) {\n const reader = new Reader(certificateBytes);\n const version = reader.u32le() & 0x7fffffff;\n\n if (version === CERT_PROPRIETARY) return rsaKeyFromProprietary(reader);\n\n if (version === CERT_X509) {\n const certificateCount = reader.u32le();\n let leaf = null;\n for (let i = 0; i < certificateCount; i++) {\n const length = reader.u32le();\n leaf = reader.raw(length);\n }\n if (!leaf) throw new Error('RDP: the host sent an empty X.509 certificate chain');\n return rsaKeyFromX509(leaf);\n }\n\n throw new Error(`RDP: unsupported server certificate version ${version}`);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }