tedious 1.12.3 → 1.14.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.
- package/README.md +1 -1
- package/appveyor.yml +9 -5
- package/benchmarks/README.md +33 -0
- package/benchmarks/common.js +82 -0
- package/benchmarks/index.js +34 -0
- package/benchmarks/query/many-result-rows.js +49 -0
- package/benchmarks/query/nvarchar-large.js +44 -0
- package/benchmarks/query/nvarchar-small.js +44 -0
- package/benchmarks/query/varbinary-4.js +42 -0
- package/benchmarks/query/varbinary-huge.js +46 -0
- package/benchmarks/query/varbinary-large.js +46 -0
- package/benchmarks/query/varbinary-small.js +42 -0
- package/benchmarks/token-parser/colmetadata-token.js +42 -0
- package/benchmarks/token-parser/done-token.js +42 -0
- package/benchmarks/token-parser/simple-tokens.js +366 -0
- package/lib/all-headers.js +9 -11
- package/lib/buffertools.js +17 -13
- package/lib/bulk-load.js +196 -169
- package/lib/collation.js +80 -2
- package/lib/connection.js +1086 -1060
- package/lib/data-type.js +450 -253
- package/lib/debug.js +57 -51
- package/lib/errors.js +40 -55
- package/lib/guid-parser.js +12 -36
- package/lib/instance-lookup.js +57 -54
- package/lib/library.js +3 -2
- package/lib/login7-payload.js +187 -180
- package/lib/message-io.js +169 -199
- package/lib/metadata-parser.js +169 -255
- package/lib/ntlm-payload.js +173 -160
- package/lib/packet.js +166 -152
- package/lib/prelogin-payload.js +170 -160
- package/lib/request.js +122 -122
- package/lib/rpcrequest-payload.js +64 -38
- package/lib/special-stored-procedure.js +3 -2
- package/lib/sqlbatch-payload.js +20 -16
- package/lib/stream-parser.js +116 -104
- package/lib/tds-versions.js +5 -8
- package/lib/tedious.js +8 -14
- package/lib/token/colmetadata-token-parser.js +79 -125
- package/lib/token/done-token-parser.js +47 -129
- package/lib/token/env-change-token-parser.js +90 -126
- package/lib/token/infoerror-token-parser.js +47 -125
- package/lib/token/loginack-token-parser.js +36 -74
- package/lib/token/nbcrow-token-parser.js +40 -64
- package/lib/token/order-token-parser.js +26 -43
- package/lib/token/returnstatus-token-parser.js +11 -23
- package/lib/token/returnvalue-token-parser.js +31 -54
- package/lib/token/row-token-parser.js +39 -52
- package/lib/token/sspi-token-parser.js +14 -32
- package/lib/token/stream-parser.js +424 -304
- package/lib/token/token-stream-parser.js +39 -34
- package/lib/token/token.js +3 -6
- package/lib/tracking-buffer/bigint.js +45 -48
- package/lib/tracking-buffer/readable-tracking-buffer.js +238 -223
- package/lib/tracking-buffer/tracking-buffer.js +3 -9
- package/lib/tracking-buffer/writable-tracking-buffer.js +272 -244
- package/lib/transaction.js +112 -102
- package/lib/value-parser.js +559 -1154
- package/package.json +10 -9
- package/benchmarks/benchmarks.coffee +0 -122
- package/benchmarks/query.coffee +0 -57
package/lib/ntlm-payload.js
CHANGED
|
@@ -1,177 +1,190 @@
|
|
|
1
|
-
|
|
2
|
-
var BigInteger, NTLMResponsePayload, WritableTrackingBuffer, crypto, hex;
|
|
1
|
+
'use strict';
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
var _createClass = require('babel-runtime/helpers/create-class')['default'];
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
var WritableTrackingBuffer = require('./tracking-buffer/writable-tracking-buffer');
|
|
8
|
+
var crypto = require('crypto');
|
|
9
|
+
var BigInteger = require('big-number').n;
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
var hex = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
module.exports = (function () {
|
|
13
14
|
function NTLMResponsePayload(loginData) {
|
|
15
|
+
_classCallCheck(this, NTLMResponsePayload);
|
|
16
|
+
|
|
14
17
|
this.data = this.createResponse(loginData);
|
|
15
18
|
}
|
|
16
19
|
|
|
17
|
-
NTLMResponsePayload
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
nidx
|
|
20
|
+
_createClass(NTLMResponsePayload, [{
|
|
21
|
+
key: 'toString',
|
|
22
|
+
value: function toString(indent) {
|
|
23
|
+
indent || (indent = '');
|
|
24
|
+
return indent + 'NTLM Auth';
|
|
25
|
+
}
|
|
26
|
+
}, {
|
|
27
|
+
key: 'createResponse',
|
|
28
|
+
value: function createResponse(challenge) {
|
|
29
|
+
var client_nonce = this.createClientNonce();
|
|
30
|
+
var lmv2len = 24;
|
|
31
|
+
var ntlmv2len = 16;
|
|
32
|
+
var domain = challenge.domain;
|
|
33
|
+
var username = challenge.userName;
|
|
34
|
+
var password = challenge.password;
|
|
35
|
+
var ntlmData = challenge.ntlmpacket;
|
|
36
|
+
var server_data = ntlmData.target;
|
|
37
|
+
var server_nonce = ntlmData.nonce;
|
|
38
|
+
var bufferLength = 64 + domain.length * 2 + username.length * 2 + lmv2len + ntlmv2len + 8 + 8 + 8 + 4 + server_data.length + 4;
|
|
39
|
+
var data = new WritableTrackingBuffer(bufferLength);
|
|
40
|
+
data.position = 0;
|
|
41
|
+
data.writeString('NTLMSSP\u0000', 'utf8');
|
|
42
|
+
data.writeUInt32LE(0x03);
|
|
43
|
+
var baseIdx = 64;
|
|
44
|
+
var dnIdx = baseIdx;
|
|
45
|
+
var unIdx = dnIdx + domain.length * 2;
|
|
46
|
+
var l2Idx = unIdx + username.length * 2;
|
|
47
|
+
var ntIdx = l2Idx + lmv2len;
|
|
48
|
+
data.writeUInt16LE(lmv2len);
|
|
49
|
+
data.writeUInt16LE(lmv2len);
|
|
50
|
+
data.writeUInt32LE(l2Idx);
|
|
51
|
+
data.writeUInt16LE(ntlmv2len);
|
|
52
|
+
data.writeUInt16LE(ntlmv2len);
|
|
53
|
+
data.writeUInt32LE(ntIdx);
|
|
54
|
+
data.writeUInt16LE(domain.length * 2);
|
|
55
|
+
data.writeUInt16LE(domain.length * 2);
|
|
56
|
+
data.writeUInt32LE(dnIdx);
|
|
57
|
+
data.writeUInt16LE(username.length * 2);
|
|
58
|
+
data.writeUInt16LE(username.length * 2);
|
|
59
|
+
data.writeUInt32LE(unIdx);
|
|
60
|
+
data.writeUInt16LE(0);
|
|
61
|
+
data.writeUInt16LE(0);
|
|
62
|
+
data.writeUInt32LE(baseIdx);
|
|
63
|
+
data.writeUInt16LE(0);
|
|
64
|
+
data.writeUInt16LE(0);
|
|
65
|
+
data.writeUInt32LE(baseIdx);
|
|
66
|
+
data.writeUInt16LE(0x8201);
|
|
67
|
+
data.writeUInt16LE(0x08);
|
|
68
|
+
data.writeString(domain, 'ucs2');
|
|
69
|
+
data.writeString(username, 'ucs2');
|
|
70
|
+
var lmv2Data = this.lmv2Response(domain, username, password, server_nonce, client_nonce);
|
|
71
|
+
data.copyFrom(lmv2Data);
|
|
72
|
+
var genTime = new Date().getTime();
|
|
73
|
+
ntlmData = this.ntlmv2Response(domain, username, password, server_nonce, server_data, client_nonce, genTime);
|
|
74
|
+
data.copyFrom(ntlmData);
|
|
75
|
+
data.writeUInt32LE(0x0101);
|
|
76
|
+
data.writeUInt32LE(0x0000);
|
|
77
|
+
var timestamp = this.createTimestamp(genTime);
|
|
78
|
+
data.copyFrom(timestamp);
|
|
79
|
+
data.copyFrom(client_nonce);
|
|
80
|
+
data.writeUInt32LE(0x0000);
|
|
81
|
+
data.copyFrom(server_data);
|
|
82
|
+
data.writeUInt32LE(0x0000);
|
|
83
|
+
return data.data;
|
|
84
|
+
}
|
|
85
|
+
}, {
|
|
86
|
+
key: 'createClientNonce',
|
|
87
|
+
value: function createClientNonce() {
|
|
88
|
+
var client_nonce = new Buffer(8);
|
|
89
|
+
var nidx = 0;
|
|
90
|
+
while (nidx < 8) {
|
|
91
|
+
client_nonce.writeUInt8(Math.ceil(Math.random() * 255), nidx);
|
|
92
|
+
nidx++;
|
|
93
|
+
}
|
|
94
|
+
return client_nonce;
|
|
88
95
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
96
|
+
}, {
|
|
97
|
+
key: 'ntlmv2Response',
|
|
98
|
+
value: function ntlmv2Response(domain, user, password, serverNonce, targetInfo, clientNonce, mytime) {
|
|
99
|
+
var timestamp = this.createTimestamp(mytime);
|
|
100
|
+
var hash = this.ntv2Hash(domain, user, password);
|
|
101
|
+
var dataLength = 40 + targetInfo.length;
|
|
102
|
+
var data = new Buffer(dataLength);
|
|
103
|
+
serverNonce.copy(data, 0, 0, 8);
|
|
104
|
+
data.writeUInt32LE(0x101, 8);
|
|
105
|
+
data.writeUInt32LE(0x0, 12);
|
|
106
|
+
timestamp.copy(data, 16, 0, 8);
|
|
107
|
+
clientNonce.copy(data, 24, 0, 8);
|
|
108
|
+
data.writeUInt32LE(0x0, 32);
|
|
109
|
+
targetInfo.copy(data, 36, 0, targetInfo.length);
|
|
110
|
+
data.writeUInt32LE(0x0, 36 + targetInfo.length);
|
|
111
|
+
return this.hmacMD5(data, hash);
|
|
112
|
+
}
|
|
113
|
+
}, {
|
|
114
|
+
key: 'createTimestamp',
|
|
115
|
+
value: function createTimestamp(time) {
|
|
116
|
+
var tenthsOfAMicrosecond = new BigInteger(time).plus(11644473600).multiply(10000000);
|
|
117
|
+
var hexArray = [];
|
|
118
|
+
|
|
119
|
+
var pair = [];
|
|
120
|
+
while (tenthsOfAMicrosecond.val() !== '0') {
|
|
121
|
+
var idx = tenthsOfAMicrosecond.mod(16);
|
|
122
|
+
pair.unshift(hex[idx]);
|
|
123
|
+
if (pair.length === 2) {
|
|
124
|
+
hexArray.push(pair.join(''));
|
|
125
|
+
pair = [];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (pair.length > 0) {
|
|
130
|
+
hexArray.push(pair[0] + '0');
|
|
120
131
|
}
|
|
132
|
+
|
|
133
|
+
return new Buffer(hexArray.join(''), 'hex');
|
|
121
134
|
}
|
|
122
|
-
|
|
123
|
-
|
|
135
|
+
}, {
|
|
136
|
+
key: 'lmv2Response',
|
|
137
|
+
value: function lmv2Response(domain, user, password, serverNonce, clientNonce) {
|
|
138
|
+
var hash = this.ntv2Hash(domain, user, password);
|
|
139
|
+
var data = new Buffer(serverNonce.length + clientNonce.length);
|
|
140
|
+
|
|
141
|
+
serverNonce.copy(data);
|
|
142
|
+
clientNonce.copy(data, serverNonce.length, 0, clientNonce.length);
|
|
143
|
+
|
|
144
|
+
var newhash = this.hmacMD5(data, hash);
|
|
145
|
+
var response = new Buffer(newhash.length + clientNonce.length);
|
|
146
|
+
|
|
147
|
+
newhash.copy(response);
|
|
148
|
+
clientNonce.copy(response, newhash.length, 0, clientNonce.length);
|
|
149
|
+
|
|
150
|
+
return response;
|
|
124
151
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
data = new Buffer(serverNonce.length + clientNonce.length);
|
|
132
|
-
serverNonce.copy(data);
|
|
133
|
-
clientNonce.copy(data, serverNonce.length, 0, clientNonce.length);
|
|
134
|
-
newhash = this.hmacMD5(data, hash);
|
|
135
|
-
response = new Buffer(newhash.length + clientNonce.length);
|
|
136
|
-
newhash.copy(response);
|
|
137
|
-
clientNonce.copy(response, newhash.length, 0, clientNonce.length);
|
|
138
|
-
return response;
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
NTLMResponsePayload.prototype.ntv2Hash = function (domain, user, password) {
|
|
142
|
-
var hash, identity;
|
|
143
|
-
hash = this.ntHash(password);
|
|
144
|
-
identity = new Buffer(user.toUpperCase() + domain.toUpperCase(), 'ucs2');
|
|
145
|
-
return this.hmacMD5(identity, hash);
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
NTLMResponsePayload.prototype.ntHash = function (text) {
|
|
149
|
-
var hash, md4, unicodeString;
|
|
150
|
-
hash = new Buffer(21);
|
|
151
|
-
hash.fill(0);
|
|
152
|
-
unicodeString = new Buffer(text, 'ucs2');
|
|
153
|
-
md4 = crypto.createHash('md4').update(unicodeString).digest();
|
|
154
|
-
if (md4.copy) {
|
|
155
|
-
md4.copy(hash);
|
|
156
|
-
} else {
|
|
157
|
-
new Buffer(md4, 'ascii').copy(hash);
|
|
152
|
+
}, {
|
|
153
|
+
key: 'ntv2Hash',
|
|
154
|
+
value: function ntv2Hash(domain, user, password) {
|
|
155
|
+
var hash = this.ntHash(password);
|
|
156
|
+
var identity = new Buffer(user.toUpperCase() + domain.toUpperCase(), 'ucs2');
|
|
157
|
+
return this.hmacMD5(identity, hash);
|
|
158
158
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
159
|
+
}, {
|
|
160
|
+
key: 'ntHash',
|
|
161
|
+
value: function ntHash(text) {
|
|
162
|
+
var hash = new Buffer(21);
|
|
163
|
+
hash.fill(0);
|
|
164
|
+
|
|
165
|
+
var unicodeString = new Buffer(text, 'ucs2');
|
|
166
|
+
var md4 = crypto.createHash('md4').update(unicodeString).digest();
|
|
167
|
+
if (md4.copy) {
|
|
168
|
+
md4.copy(hash);
|
|
169
|
+
} else {
|
|
170
|
+
new Buffer(md4, 'ascii').copy(hash);
|
|
171
|
+
}
|
|
172
|
+
return hash;
|
|
173
|
+
}
|
|
174
|
+
}, {
|
|
175
|
+
key: 'hmacMD5',
|
|
176
|
+
value: function hmacMD5(data, key) {
|
|
177
|
+
var hmac = crypto.createHmac('MD5', key);
|
|
178
|
+
hmac.update(data);
|
|
179
|
+
|
|
180
|
+
var result = hmac.digest();
|
|
181
|
+
if (result.copy) {
|
|
182
|
+
return result;
|
|
183
|
+
} else {
|
|
184
|
+
return new Buffer(result, 'ascii').slice(0, 16);
|
|
185
|
+
}
|
|
171
186
|
}
|
|
172
|
-
};
|
|
187
|
+
}]);
|
|
173
188
|
|
|
174
189
|
return NTLMResponsePayload;
|
|
175
|
-
})();
|
|
176
|
-
|
|
177
|
-
module.exports = NTLMResponsePayload;
|
|
190
|
+
})();
|