diff --git a/package-lock.json b/package-lock.json index c286ad07..ef297ce0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dezog", - "version": "1.3.3", + "version": "1.3.4", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -36,6 +36,16 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" + }, + "@types/http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==" + }, "@types/mocha": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", @@ -45,8 +55,28 @@ "@types/node": { "version": "13.9.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.5.tgz", - "integrity": "sha512-hkzMMD3xu6BrJpGVLeQ3htQQNAcOrJjX7WFmtK8zWQpz2UJf13LCFF2ALA7c9OVdvc2vQJeDdjfR35M0sBCxvw==", - "dev": true + "integrity": "sha512-hkzMMD3xu6BrJpGVLeQ3htQQNAcOrJjX7WFmtK8zWQpz2UJf13LCFF2ALA7c9OVdvc2vQJeDdjfR35M0sBCxvw==" + }, + "@types/node-fetch": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", + "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } }, "@types/xml2js": { "version": "0.4.5", @@ -158,8 +188,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "await-notify": { "version": "1.0.1", @@ -195,6 +224,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "base64-arraybuffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", + "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -417,7 +451,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -476,7 +509,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, "requires": { "ms": "^2.1.1" } @@ -506,8 +538,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { "version": "1.0.0", @@ -520,6 +551,11 @@ "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=" }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -918,6 +954,18 @@ } } }, + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, "http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -1188,14 +1236,12 @@ "mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" }, "mime-types": { "version": "2.1.27", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, "requires": { "mime-db": "1.44.0" } @@ -1378,8 +1424,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mute-stream": { "version": "0.0.8", @@ -1387,6 +1432,11 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "network-byte-order": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/network-byte-order/-/network-byte-order-0.2.0.tgz", + "integrity": "sha1-asEb9Ev2ENrt2+kKCaXIF8bg0rM=" + }, "node-abi": { "version": "2.18.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.18.0.tgz", @@ -1405,6 +1455,22 @@ "semver": "^5.7.0" } }, + "node-expose-sspi-strict": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/node-expose-sspi-strict/-/node-expose-sspi-strict-0.1.1.tgz", + "integrity": "sha512-Sn4IFkyvvK4XDSs+Y9VUNXD9w813MTXXI9ldGIyV3V6T4+C0uo2lO9Rv4Gqqmuc00V5/CBnkSVQnrxU49ERSKg==", + "requires": { + "base64-arraybuffer": "^0.2.0", + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "node-fetch": "^2.6.0" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, "node-gyp": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-6.1.0.tgz", @@ -1823,6 +1889,11 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -1893,6 +1964,11 @@ "tweetnacl": "~0.14.0" } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -1983,6 +2059,11 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -2228,9 +2309,9 @@ }, "dependencies": { "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } diff --git a/package.json b/package.json index 6706ea14..65ceddd8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dezog", "displayName": "DeZog", - "version": "1.3.4", + "version": "1.3.5", "publisher": "S0urceror", "description": "Visual Studio Code Debug Adapter for the Z80/ZX Spectrum.", "author": { @@ -42,12 +42,17 @@ }, "files": [], "dependencies": { + "@types/debug": "^4.1.5", + "@types/http-errors": "^1.8.0", + "@types/node-fetch": "^2.5.7", "await-notify": "1.0.1", "binary-file": "^0.2.3", "gif-writer": "^0.9.3", "glob": "^7.1.6", "jsonc-parser": "^2.3.0", "mocha": "^7.2.0", + "network-byte-order": "^0.2.0", + "node-expose-sspi-strict": "^0.1.1", "node-gzip": "^1.1.2", "rng": "^0.2.2", "ts-node": "^8.10.2", diff --git a/src/remotes/openmsx/openmsxremote.ts b/src/remotes/openmsx/openmsxremote.ts index e6685f63..60235d5f 100644 --- a/src/remotes/openmsx/openmsxremote.ts +++ b/src/remotes/openmsx/openmsxremote.ts @@ -11,6 +11,14 @@ import {DecodeOpenMSXRegisters} from './decodeopenmsxdata'; import {Utility} from '../../misc/utility'; import {GenericWatchpoint, GenericBreakpoint} from '../../genericwatchpoint'; import {RemoteBase, RemoteBreakpoint, MemoryBank } from '../remotebase'; +import {htonl,ntohl} from 'network-byte-order'; + +import * as NES from 'node-expose-sspi-strict'; + +let nes: typeof NES; +if (os.platform()=="win32") { + nes = require ('node-expose-sspi-strict'); +} export class OpenMSXRemote extends RemoteBase { openmsx:net.Socket; @@ -140,6 +148,91 @@ export class OpenMSXRemote extends RemoteBase { }); }); } + async waitResponse () : Promise { + return new Promise ( async (resolve,reject) => { + this.openmsx.once ('readable', () => { + let buflen:Buffer; + while (null == (buflen = this.openmsx.read(4))) {}; + let len:number = ntohl (buflen,0); + let chunk:Buffer; + while (null == (chunk = this.openmsx.read(len))) {}; + if (len!=chunk.byteLength) + reject (new Error (`Not the expected length ${len}:${chunk.byteLength}`)); + resolve (chunk.buffer.slice (chunk.byteOffset,chunk.byteOffset+chunk.byteLength)); + }); + }) + } + async perform_auth () : Promise { + return new Promise ( async (resolve,reject) => { + + const credInput = { + packageName: 'Negotiate', + credentialUse: 'SECPKG_CRED_OUTBOUND' as NES.CredentialUseFlag, + } as NES.AcquireCredHandleInput; + + const clientCred = nes.sspi.AcquireCredentialsHandle(credInput); + const packageInfo = nes.sspi.QuerySecurityPackageInfo("Negotiate"); + + /////////////////////////////////////////////// + // CHALLENGE + var input:NES.InitializeSecurityContextInput = { + credential: clientCred.credential, + targetName: "", + cbMaxToken: packageInfo.cbMaxToken + }; + let clientSecurityContext = nes.sspi.InitializeSecurityContext(input); + if (clientSecurityContext.SECURITY_STATUS !== 'SEC_I_CONTINUE_NEEDED') { + throw new Error ("Authentication error"); + } + let len:number = clientSecurityContext.SecBufferDesc.buffers[0].byteLength; + var blen:Uint8Array = new Uint8Array (4); + htonl (blen,0,len); + let buffer:Uint8Array = new Uint8Array (clientSecurityContext.SecBufferDesc.buffers[0]); + + this.openmsx.write (blen); + this.openmsx.write (buffer); + let response:ArrayBuffer; + try { + response = await this.waitResponse (); + } catch (error) { + reject (error); + return; + } + + //////////////////////////////////////////////// + // RESPONSE + input = { + credential: clientCred.credential, + targetName: "", + serverSecurityContext: { + SecBufferDesc: { + ulVersion: 0, + buffers: [response], + }, + }, + cbMaxToken: packageInfo.cbMaxToken, + contextHandle: clientSecurityContext.contextHandle, + targetDataRep: 'SECURITY_NETWORK_DREP', + }; + clientSecurityContext = nes.sspi.InitializeSecurityContext(input); + + len = clientSecurityContext.SecBufferDesc.buffers[0].byteLength; + var blen:Uint8Array = new Uint8Array (4); + htonl (blen,0,len); + buffer = new Uint8Array (clientSecurityContext.SecBufferDesc.buffers[0]); + + this.openmsx.write (blen); + this.openmsx.write (buffer); + try { + response = await this.waitResponse (); + } catch (error) { + reject (error); + return; + } + + resolve (true); + }); + } /// Initializes the machine. public async doInitialization(): Promise { @@ -165,10 +258,14 @@ export class OpenMSXRemote extends RemoteBase { this.emit('log', "Closed the connection to OpenMSX"); }) this.openmsx.on ('data', data => { - console.log (data.toString()); + //console.log (data.toString()); this.handleOpenMSXResponse (data); }); + if (os.platform()=="win32") { + await this.perform_auth (); + } + await this.perform_awake (""); //await this.receive_response ();