universal-doh 0.0.3 → 0.0.4
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/dist/universal-doh.d.ts +0 -4
- package/dist/universal-doh.js +313 -370
- package/dist/universal-doh.js.map +1 -1
- package/dist/universal-doh.umd.cjs +1 -1
- package/dist/universal-doh.umd.cjs.map +1 -1
- package/package.json +14 -12
package/dist/universal-doh.d.ts
CHANGED
package/dist/universal-doh.js
CHANGED
|
@@ -1,399 +1,342 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//#region lib/dns-message.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
return e.map((e) => String.fromCharCode(...e)).join(".");
|
|
3
4
|
}
|
|
4
|
-
function
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
c === 45)
|
|
19
|
-
a.push(c);
|
|
20
|
-
else
|
|
21
|
-
throw new Error(`Invalid character '${o}' in label "${i}"`);
|
|
22
|
-
}
|
|
23
|
-
t.push(a);
|
|
24
|
-
}
|
|
25
|
-
return t;
|
|
5
|
+
function t(e) {
|
|
6
|
+
let t = e.split(".").filter((e) => e.length > 0), n = [];
|
|
7
|
+
for (let e of t) {
|
|
8
|
+
if (e.length < 1 || e.length > 63) throw Error(`Label "${e}" must be between 1 and 63 characters long`);
|
|
9
|
+
if (e.startsWith("-") || e.endsWith("-")) throw Error(`Label "${e}" cannot start or end with a hyphen`);
|
|
10
|
+
let t = [];
|
|
11
|
+
for (let n of e) {
|
|
12
|
+
let r = n.charCodeAt(0);
|
|
13
|
+
if (r >= 48 && r <= 57 || r >= 97 && r <= 122 || r === 45) t.push(r);
|
|
14
|
+
else throw Error(`Invalid character '${n}' in label "${e}"`);
|
|
15
|
+
}
|
|
16
|
+
n.push(t);
|
|
17
|
+
}
|
|
18
|
+
return n;
|
|
26
19
|
}
|
|
27
|
-
function
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
20
|
+
function n() {
|
|
21
|
+
return {
|
|
22
|
+
id: 0,
|
|
23
|
+
qr: 0,
|
|
24
|
+
opcode: 0,
|
|
25
|
+
aa: 0,
|
|
26
|
+
tc: 0,
|
|
27
|
+
rd: 0,
|
|
28
|
+
ra: 0,
|
|
29
|
+
z: 0,
|
|
30
|
+
rcode: 0,
|
|
31
|
+
qdcount: 0,
|
|
32
|
+
ancount: 0,
|
|
33
|
+
nscount: 0,
|
|
34
|
+
arcount: 0,
|
|
35
|
+
questions: [],
|
|
36
|
+
answers: [],
|
|
37
|
+
authorityRecords: [],
|
|
38
|
+
additionalRecords: []
|
|
39
|
+
};
|
|
47
40
|
}
|
|
48
|
-
function
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
41
|
+
function r(e) {
|
|
42
|
+
let t = n();
|
|
43
|
+
return t.rd = 1, t.qdcount += e.length, t.questions.push(...e), t.arcount += 1, t.additionalRecords.push({
|
|
44
|
+
name: [],
|
|
45
|
+
type: 41,
|
|
46
|
+
maxPayloadSize: 65535,
|
|
47
|
+
extendedRcode: 0,
|
|
48
|
+
version: 0,
|
|
49
|
+
do: 0,
|
|
50
|
+
z: 0,
|
|
51
|
+
rdlength: 0,
|
|
52
|
+
rdata: []
|
|
53
|
+
}), t.arcount += 1, t;
|
|
61
54
|
}
|
|
62
|
-
function
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
throw new Error("Cannot serialize answers or authority records for query");
|
|
70
|
-
for (const a of e.additionalRecords)
|
|
71
|
-
i = A(t, i, a);
|
|
72
|
-
return i = $(t, i), n.slice(0, i);
|
|
55
|
+
function i(e) {
|
|
56
|
+
let t = /* @__PURE__ */ new ArrayBuffer(1024), n = new DataView(t), r = 0;
|
|
57
|
+
r = l(n, r, e);
|
|
58
|
+
for (let t of e.questions) r = c(n, r, t);
|
|
59
|
+
if (e.answers.length > 0 || e.authorityRecords.length > 0) throw Error("Cannot serialize answers or authority records for query");
|
|
60
|
+
for (let t of e.additionalRecords) r = o(n, r, t);
|
|
61
|
+
return r = s(n, r), t.slice(0, r);
|
|
73
62
|
}
|
|
74
|
-
function
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
return e.setUint8(n++, 0), n;
|
|
63
|
+
function a(e, t, n) {
|
|
64
|
+
for (let r of n) {
|
|
65
|
+
e.setUint8(t++, r.length);
|
|
66
|
+
for (let n of r) e.setUint8(t++, n);
|
|
67
|
+
}
|
|
68
|
+
return e.setUint8(t++, 0), t;
|
|
81
69
|
}
|
|
82
|
-
function
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
else
|
|
92
|
-
for (const a of t.rdata)
|
|
93
|
-
e.setUint8(n++, a);
|
|
94
|
-
return n;
|
|
70
|
+
function o(e, t, n) {
|
|
71
|
+
t = a(e, t, n.name), e.setUint16(t, n.type), t += 2, n.type === 41 ? e.setUint16(t, n.maxPayloadSize) : e.setUint16(t, n.class), t += 2;
|
|
72
|
+
let r;
|
|
73
|
+
if (n.type === 41 ? (r = n.extendedRcode << 24, r |= n.version << 16, r |= n.do << 15, r |= n.z) : r = n.ttl, e.setUint32(t, r), t += 4, e.setUint16(t, n.rdlength), t += 2, n.type === 41) for (let r of n.rdata) {
|
|
74
|
+
e.setUint16(t, r.optionCode), t += 2, e.setUint16(t, r.optionLength), t += 2;
|
|
75
|
+
for (let n of r.optionData) e.setUint8(t++, n);
|
|
76
|
+
}
|
|
77
|
+
else for (let r of n.rdata) e.setUint8(t++, r);
|
|
78
|
+
return t;
|
|
95
79
|
}
|
|
96
|
-
function
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
return n = A(e, n, o), n;
|
|
80
|
+
function s(e, t) {
|
|
81
|
+
let n = t + 4, r = Math.ceil(n / 128) * 128 - n, i = Array.from({ length: r }, () => Math.floor(Math.random() * 255)), a = {
|
|
82
|
+
name: [],
|
|
83
|
+
type: 41,
|
|
84
|
+
maxPayloadSize: 0,
|
|
85
|
+
extendedRcode: 0,
|
|
86
|
+
version: 0,
|
|
87
|
+
do: 0,
|
|
88
|
+
z: 0,
|
|
89
|
+
rdlength: i.length + 4,
|
|
90
|
+
rdata: [{
|
|
91
|
+
optionCode: 12,
|
|
92
|
+
optionLength: i.length,
|
|
93
|
+
optionData: i
|
|
94
|
+
}]
|
|
95
|
+
};
|
|
96
|
+
return t = o(e, t, a), t;
|
|
114
97
|
}
|
|
115
|
-
function
|
|
116
|
-
|
|
98
|
+
function c(e, t, n) {
|
|
99
|
+
return t = a(e, t, n.qname), e.setUint16(t, n.qtype), t += 2, e.setUint16(t, n.qclass), t += 2, t;
|
|
117
100
|
}
|
|
118
|
-
function
|
|
119
|
-
|
|
120
|
-
n,
|
|
121
|
-
(t.qr & 1) << 15 | (t.opcode & 15) << 11 | (t.aa & 1) << 10 | (t.tc & 1) << 9 | (t.rd & 1) << 8 | (t.ra & 1) << 7 | (t.z & 7) << 4 | t.rcode & 15
|
|
122
|
-
), n += 2, e.setUint16(4, t.qdcount), n += 2, e.setUint16(6, t.ancount), n += 2, e.setUint16(8, t.nscount), n += 2, e.setUint16(10, t.arcount), n += 2, n;
|
|
101
|
+
function l(e, t, n) {
|
|
102
|
+
return e.setUint16(t, n.id), t += 2, e.setUint16(t, (n.qr & 1) << 15 | (n.opcode & 15) << 11 | (n.aa & 1) << 10 | (n.tc & 1) << 9 | (n.rd & 1) << 8 | (n.ra & 1) << 7 | (n.z & 7) << 4 | n.rcode & 15), t += 2, e.setUint16(4, n.qdcount), t += 2, e.setUint16(6, n.ancount), t += 2, e.setUint16(8, n.nscount), t += 2, e.setUint16(10, n.arcount), t += 2, t;
|
|
123
103
|
}
|
|
124
|
-
function
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
n,
|
|
129
|
-
i.ancount,
|
|
130
|
-
i.answers
|
|
131
|
-
), n = x(
|
|
132
|
-
t,
|
|
133
|
-
n,
|
|
134
|
-
i.nscount,
|
|
135
|
-
i.authorityRecords
|
|
136
|
-
), n = F(
|
|
137
|
-
t,
|
|
138
|
-
n,
|
|
139
|
-
i.arcount,
|
|
140
|
-
i.additionalRecords
|
|
141
|
-
), n !== e.byteLength)
|
|
142
|
-
throw new Error(
|
|
143
|
-
`Unexpected end of message (offset: ${n}, length: ${e.byteLength})`
|
|
144
|
-
);
|
|
145
|
-
return i;
|
|
104
|
+
function u(e, t = 0) {
|
|
105
|
+
let r = new DataView(e), i = n();
|
|
106
|
+
if (t = _(r, t, i), t = d(r, t, i.qdcount, i.questions), t = h(r, t, i.ancount, i.answers), t = h(r, t, i.nscount, i.authorityRecords), t = f(r, t, i.arcount, i.additionalRecords), t !== e.byteLength) throw Error(`Unexpected end of message (offset: ${t}, length: ${e.byteLength})`);
|
|
107
|
+
return i;
|
|
146
108
|
}
|
|
147
|
-
function
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
109
|
+
function d(e, t, n, r) {
|
|
110
|
+
for (let i = 0; i < n; i++) {
|
|
111
|
+
let n = [];
|
|
112
|
+
t = g(e, t, n, 0);
|
|
113
|
+
let i = e.getUint16(t);
|
|
114
|
+
t += 2;
|
|
115
|
+
let a = e.getUint16(t);
|
|
116
|
+
t += 2, r.push({
|
|
117
|
+
qname: n,
|
|
118
|
+
qtype: i,
|
|
119
|
+
qclass: a
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return t;
|
|
157
123
|
}
|
|
158
|
-
function
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
124
|
+
function f(e, t, n, r) {
|
|
125
|
+
for (let i = 0; i < n; i++) {
|
|
126
|
+
let n = [];
|
|
127
|
+
t = g(e, t, n, 0);
|
|
128
|
+
let i = e.getUint16(t);
|
|
129
|
+
if (t += 2, i === 41) {
|
|
130
|
+
let a = {
|
|
131
|
+
name: n,
|
|
132
|
+
type: i,
|
|
133
|
+
maxPayloadSize: 0,
|
|
134
|
+
extendedRcode: 0,
|
|
135
|
+
version: 0,
|
|
136
|
+
do: 0,
|
|
137
|
+
z: 0,
|
|
138
|
+
rdlength: 0,
|
|
139
|
+
rdata: []
|
|
140
|
+
};
|
|
141
|
+
t = p(e, t, a), r.push(a);
|
|
142
|
+
} else {
|
|
143
|
+
let a = {
|
|
144
|
+
name: n,
|
|
145
|
+
type: i,
|
|
146
|
+
class: 0,
|
|
147
|
+
ttl: 0,
|
|
148
|
+
rdlength: 0,
|
|
149
|
+
rdata: []
|
|
150
|
+
};
|
|
151
|
+
t = m(e, t, a), r.push(a);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return t;
|
|
189
155
|
}
|
|
190
|
-
function
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
return n;
|
|
156
|
+
function p(e, t, n) {
|
|
157
|
+
n.maxPayloadSize = e.getUint16(t), t += 2;
|
|
158
|
+
let r = e.getUint32(t);
|
|
159
|
+
t += 4, n.extendedRcode = (r & 4278190080) >> 24, n.version = (r & 16711680) >> 16, n.do = (r & 32768) >> 15, n.z = r & 32767, n.rdlength = e.getUint16(t), t += 2;
|
|
160
|
+
let i = t + n.rdlength;
|
|
161
|
+
for (; t < i;) {
|
|
162
|
+
let r = e.getUint16(t);
|
|
163
|
+
t += 2;
|
|
164
|
+
let i = {
|
|
165
|
+
optionCode: r,
|
|
166
|
+
optionLength: e.getUint16(t),
|
|
167
|
+
optionData: []
|
|
168
|
+
};
|
|
169
|
+
t += 2;
|
|
170
|
+
for (let n = 0; n < i.optionLength; n++) i.optionData.push(e.getUint8(t++));
|
|
171
|
+
n.rdata.push(i);
|
|
172
|
+
}
|
|
173
|
+
return t;
|
|
209
174
|
}
|
|
210
|
-
function
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
return n;
|
|
175
|
+
function m(e, t, n) {
|
|
176
|
+
n.class = e.getUint16(t), t += 2, n.ttl = e.getUint32(t), t += 4, n.rdlength = e.getUint16(t), t += 2;
|
|
177
|
+
for (let r = 0; r < n.rdlength; r++) n.rdata.push(e.getUint8(t++));
|
|
178
|
+
return t;
|
|
215
179
|
}
|
|
216
|
-
function
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
180
|
+
function h(e, t, n, r) {
|
|
181
|
+
for (let i = 0; i < n; i++) {
|
|
182
|
+
let n = [];
|
|
183
|
+
t = g(e, t, n, 0);
|
|
184
|
+
let i = e.getUint16(t);
|
|
185
|
+
t += 2;
|
|
186
|
+
let a = {
|
|
187
|
+
name: n,
|
|
188
|
+
type: i,
|
|
189
|
+
class: 0,
|
|
190
|
+
ttl: 0,
|
|
191
|
+
rdlength: 0,
|
|
192
|
+
rdata: []
|
|
193
|
+
};
|
|
194
|
+
t = m(e, t, a), r.push(a);
|
|
195
|
+
}
|
|
196
|
+
return t;
|
|
233
197
|
}
|
|
234
|
-
function
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
} else
|
|
250
|
-
throw new Error(`Invalid label type: ${o.toString(2)}`);
|
|
251
|
-
}
|
|
252
|
-
return n;
|
|
198
|
+
function g(e, t, n, r = 0) {
|
|
199
|
+
if (r > 20) throw Error("Too many nested labels");
|
|
200
|
+
let i = e.getUint8(t++);
|
|
201
|
+
for (; i !== 0;) {
|
|
202
|
+
let a = i >> 6;
|
|
203
|
+
if (a === 0) {
|
|
204
|
+
let r = [];
|
|
205
|
+
for (let n = 0; n < i; n++) r.push(e.getUint8(t++));
|
|
206
|
+
n.push(r), i = e.getUint8(t++);
|
|
207
|
+
} else if (a === 3) {
|
|
208
|
+
g(e, (i & 63) << 8 | e.getUint8(t++), n, r + 1);
|
|
209
|
+
break;
|
|
210
|
+
} else throw Error(`Invalid label type: ${a.toString(2)}`);
|
|
211
|
+
}
|
|
212
|
+
return t;
|
|
253
213
|
}
|
|
254
|
-
function
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
214
|
+
function _(e, t, n) {
|
|
215
|
+
n.id = e.getUint16(t), t += 2;
|
|
216
|
+
let r = e.getUint16(t);
|
|
217
|
+
return t += 2, n.qr = (r & 32768) >> 15, n.opcode = (r & 30720) >> 11, n.aa = (r & 1024) >> 10, n.tc = (r & 512) >> 9, n.rd = (r & 256) >> 8, n.ra = (r & 128) >> 7, n.z = (r & 112) >> 4, n.rcode = r & 15, n.qdcount = e.getUint16(t), t += 2, n.ancount = e.getUint16(t), t += 2, n.nscount = e.getUint16(t), t += 2, n.arcount = e.getUint16(t), t += 2, t;
|
|
258
218
|
}
|
|
259
|
-
|
|
260
|
-
|
|
219
|
+
//#endregion
|
|
220
|
+
//#region lib/punycode.ts
|
|
221
|
+
function v(e) {
|
|
222
|
+
return y(e).split(".").map((e) => b(e) ? e : "xn--" + k(e)).join(".").toLowerCase();
|
|
261
223
|
}
|
|
262
|
-
function
|
|
263
|
-
|
|
224
|
+
function y(e) {
|
|
225
|
+
return e.replace(/[.。。]/gu, ".").replace(/ẞ/gu, "ß").normalize("NFKC").toLowerCase().replace(/[\uFE00-\uFE0F]/gu, "");
|
|
264
226
|
}
|
|
265
|
-
function
|
|
266
|
-
|
|
227
|
+
function b(e) {
|
|
228
|
+
return Array.from(e).every(x);
|
|
267
229
|
}
|
|
268
|
-
function
|
|
269
|
-
|
|
230
|
+
function x(e) {
|
|
231
|
+
return e.charCodeAt(0) < 128;
|
|
270
232
|
}
|
|
271
|
-
|
|
272
|
-
function
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
a.push(C(y)), i = Y(
|
|
295
|
-
t,
|
|
296
|
-
l + 1,
|
|
297
|
-
l === r
|
|
298
|
-
), t = 0, l++;
|
|
299
|
-
}
|
|
300
|
-
t++, n++;
|
|
301
|
-
}
|
|
302
|
-
return a.join("");
|
|
233
|
+
var S = 36, C = 1, w = 26, T = 38, E = 700, D = 72, O = 128;
|
|
234
|
+
function k(e) {
|
|
235
|
+
let t = O, n = 0, r = D, i = [], a = Array.from(e), o = a.filter(x), s = o.length, c = s;
|
|
236
|
+
i.push(...o), s > 0 && i.push("-");
|
|
237
|
+
let l = a.map((e) => e.codePointAt(0)), u = l.length;
|
|
238
|
+
for (; c < u;) {
|
|
239
|
+
let e = 2 ** 53 - 1;
|
|
240
|
+
for (let n of l) n >= t && n < e && (e = n);
|
|
241
|
+
n += (e - t) * (c + 1), t = e;
|
|
242
|
+
for (let e of l) if (e < t) n++;
|
|
243
|
+
else if (e === t) {
|
|
244
|
+
let e = n, t = S;
|
|
245
|
+
for (;;) {
|
|
246
|
+
let n;
|
|
247
|
+
if (n = t <= r ? C : t >= r + w ? w : t - r, e < n) break;
|
|
248
|
+
let a = n + (e - n) % (S - n);
|
|
249
|
+
i.push(A(a)), e = j(e - n, S - n), t += S;
|
|
250
|
+
}
|
|
251
|
+
i.push(A(e)), r = M(n, c + 1, c === s), n = 0, c++;
|
|
252
|
+
}
|
|
253
|
+
n++, t++;
|
|
254
|
+
}
|
|
255
|
+
return i.join("");
|
|
303
256
|
}
|
|
304
|
-
function
|
|
305
|
-
|
|
257
|
+
function A(e) {
|
|
258
|
+
return String.fromCharCode(e + 22 + 75 * Number(e < 26));
|
|
306
259
|
}
|
|
307
|
-
function
|
|
308
|
-
|
|
260
|
+
function j(e, t) {
|
|
261
|
+
return Math.floor(e / t);
|
|
309
262
|
}
|
|
310
|
-
function
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
return i + u(36 * e, e + K);
|
|
263
|
+
function M(e, t, n) {
|
|
264
|
+
e = n ? j(e, E) : j(e, 2), e += j(e, t);
|
|
265
|
+
let r = 0;
|
|
266
|
+
for (; e > j((S - C) * w, 2);) e = j(e, S - C), r += 36;
|
|
267
|
+
return r + j(36 * e, e + T);
|
|
316
268
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
return Z(l);
|
|
340
|
-
}).catch((r) => {
|
|
341
|
-
throw console.error(r), r;
|
|
342
|
-
});
|
|
269
|
+
//#endregion
|
|
270
|
+
//#region lib/index.ts
|
|
271
|
+
var N = "0.0.4";
|
|
272
|
+
function P(e, n, a) {
|
|
273
|
+
let o = i(r([{
|
|
274
|
+
qname: t(v(n)),
|
|
275
|
+
qtype: parseInt(a, 10),
|
|
276
|
+
qclass: 1
|
|
277
|
+
}])), s = new URL(e);
|
|
278
|
+
return s.pathname = "/dns-query", fetch(s, {
|
|
279
|
+
method: "POST",
|
|
280
|
+
mode: "cors",
|
|
281
|
+
headers: {
|
|
282
|
+
Accept: "application/dns-message",
|
|
283
|
+
"Content-Type": "application/dns-message"
|
|
284
|
+
},
|
|
285
|
+
body: o
|
|
286
|
+
}).then((e) => e.ok ? e.arrayBuffer() : e.text().then((t) => {
|
|
287
|
+
throw Error(`HTTP ${e.status}: ${t}`);
|
|
288
|
+
})).then((e) => F(u(e))).catch((e) => {
|
|
289
|
+
throw console.error(e), e;
|
|
290
|
+
});
|
|
343
291
|
}
|
|
344
|
-
function
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
292
|
+
function F(t) {
|
|
293
|
+
let n = {
|
|
294
|
+
id: t.id,
|
|
295
|
+
authoritativeAnswer: t.aa === 1,
|
|
296
|
+
truncated: t.tc === 1,
|
|
297
|
+
recursionAvailable: t.ra === 1,
|
|
298
|
+
responseCode: t.rcode === 0 ? "OK" : "ERROR",
|
|
299
|
+
questions: t.questions.map((t) => ({
|
|
300
|
+
name: e(t.qname),
|
|
301
|
+
type: t.qtype
|
|
302
|
+
})),
|
|
303
|
+
answers: t.answers.map((t) => ({
|
|
304
|
+
name: e(t.name),
|
|
305
|
+
type: t.type,
|
|
306
|
+
ttl: t.ttl,
|
|
307
|
+
value: I(t.type, t.rdata)
|
|
308
|
+
})),
|
|
309
|
+
authorityRecords: t.authorityRecords.map((t) => ({
|
|
310
|
+
name: e(t.name),
|
|
311
|
+
type: t.type,
|
|
312
|
+
ttl: t.ttl,
|
|
313
|
+
value: I(t.type, t.rdata)
|
|
314
|
+
})),
|
|
315
|
+
additionalRecords: t.additionalRecords.map((t) => t.type === 41 ? {
|
|
316
|
+
name: e(t.name),
|
|
317
|
+
type: t.type,
|
|
318
|
+
maxPayloadSize: t.maxPayloadSize,
|
|
319
|
+
extendedRcode: t.extendedRcode,
|
|
320
|
+
version: t.version,
|
|
321
|
+
do: t.do,
|
|
322
|
+
z: t.z,
|
|
323
|
+
value: t.rdata
|
|
324
|
+
} : {
|
|
325
|
+
name: e(t.name),
|
|
326
|
+
type: t.type,
|
|
327
|
+
class: t.class,
|
|
328
|
+
ttl: t.ttl,
|
|
329
|
+
value: I(t.type, t.rdata)
|
|
330
|
+
})
|
|
331
|
+
};
|
|
332
|
+
return JSON.stringify(n, null, 2);
|
|
385
333
|
}
|
|
386
|
-
function
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
default:
|
|
393
|
-
return n;
|
|
394
|
-
}
|
|
334
|
+
function I(e, t) {
|
|
335
|
+
switch (e) {
|
|
336
|
+
case 1: return t.join(".");
|
|
337
|
+
case 28: return t.map((e) => e.toString(16)).join(":");
|
|
338
|
+
default: return t;
|
|
339
|
+
}
|
|
395
340
|
}
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
V as version
|
|
399
|
-
};
|
|
341
|
+
//#endregion
|
|
342
|
+
export { P as resolve, N as version };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"universal-doh.js","sources":["../lib/dns-message.ts","../lib/punycode.ts","../lib/index.ts"],"sourcesContent":["type RawDnsMessage = ArrayBuffer;\n\ninterface DnsMessage {\n id: number;\n // query (0), response (1)\n qr: BinaryFlag;\n /*\n 0 a standard query (QUERY)\n 1 an inverse query (IQUERY)\n 2 a server status request (STATUS)\n 3-15 reserved for future use\n */\n opcode: FourBitNumber;\n // Authoritative Answer\n aa: BinaryFlag;\n // TrunCation\n tc: BinaryFlag;\n // Recursion Desired\n rd: BinaryFlag;\n // Recursion Available\n ra: BinaryFlag;\n // reserved for future use - must be 0\n z: ThreeBitNumber;\n /*\n Response code\n 0 No error condition\n 1 Format error\n 2 Server failure\n 3 Name Error\n 4 Not Implemented\n 5 Refused\n 6-15 Reserved for future use.\n */\n rcode: FourBitNumber;\n // number of entries in the question section (0-65535)\n qdcount: number;\n // number of resource records in the answer section (0-65535)\n ancount: number;\n // number of name server resource records in the authority records section (0-65535)\n nscount: number;\n // number of resource records in the additional records section (0-65535)\n arcount: number;\n\n questions: DnsQuestion[];\n answers: DnsResourceRecord[];\n authorityRecords: DnsResourceRecord[];\n additionalRecords: Array<DnsOptRecord | DnsResourceRecord>;\n}\n\ntype Bytes = number[];\ntype Label = Bytes;\ntype DNSName = Label[];\n\ninterface DnsQuestion {\n qname: DNSName;\n // 16 bit unsigned integer\n qtype: number;\n // 16 bit unsigned integer\n qclass: number;\n}\n\ninterface Opt {\n optionCode: number;\n optionLength: number;\n optionData: Bytes;\n}\n\nexport interface DnsOptRecord {\n name: DNSName;\n type: 41;\n // 16 bit unsigned integer\n maxPayloadSize: number;\n // TTL field is used as the extended RCODE and flags\n // https://datatracker.ietf.org/doc/html/rfc6891#section-6.1.3\n extendedRcode: number;\n version: number;\n do: BinaryFlag;\n z: number;\n // 16 bit unsigned integer\n rdlength: number;\n // RDATA field is used for EDNS0 options\n rdata: Opt[];\n}\n\nexport interface DnsResourceRecord {\n name: DNSName;\n // 16 bit unsigned integer\n type: number;\n // 16 bit unsigned integer\n class: number;\n // 32 bit unsigned integer\n ttl: number;\n // 16 bit unsigned integer\n rdlength: number;\n rdata: Bytes;\n}\n\ntype BinaryFlag = 0 | 1;\ntype ThreeBitNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;\ntype FourBitNumber =\n | 0\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9\n | 10\n | 11\n | 12\n | 13\n | 14\n | 15;\n\nexport function dnsNameToString(name: DNSName): string {\n return name.map((label) => String.fromCharCode(...label)).join(\".\");\n}\n\nexport function stringToDNSName(name: string): DNSName {\n // we can assume string is ascii but it may not be a valid domain name\n const labels = name.split(\".\").filter((label) => label.length > 0);\n const dnsName: DNSName = [];\n for (const label of labels) {\n if (label.length < 1 || label.length > 63) {\n throw new Error(\n `Label \"${label}\" must be between 1 and 63 characters long`,\n );\n }\n\n if (label.startsWith(\"-\") || label.endsWith(\"-\")) {\n throw new Error(`Label \"${label}\" cannot start or end with a hyphen`);\n }\n\n const bytes: Bytes = [];\n\n for (const char of label) {\n const code = char.charCodeAt(0);\n if (\n (code >= 48 && code <= 57) || // '0'-'9'\n (code >= 97 && code <= 122) || // 'a'-'z'\n code === 45 // '-'\n ) {\n bytes.push(code);\n } else {\n throw new Error(`Invalid character '${char}' in label \"${label}\"`);\n }\n }\n dnsName.push(bytes);\n }\n return dnsName;\n}\n\nfunction createDnsMessage() {\n return {\n id: 0,\n qr: 0,\n opcode: 0,\n aa: 0,\n tc: 0,\n rd: 0,\n ra: 0,\n z: 0,\n rcode: 0,\n qdcount: 0,\n ancount: 0,\n nscount: 0,\n arcount: 0,\n questions: [],\n answers: [],\n authorityRecords: [],\n additionalRecords: [],\n } as DnsMessage;\n}\n\nexport function createDnsQuery(questions: DnsQuestion[]): DnsMessage {\n const message = createDnsMessage();\n message.rd = 1;\n message.qdcount += questions.length;\n message.questions.push(...questions);\n\n // notify the server that we support EDNS0 by adding an OPT record\n message.arcount += 1;\n message.additionalRecords.push({\n name: [],\n type: 41,\n maxPayloadSize: 0xffff,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: 0,\n rdata: [],\n } as DnsOptRecord);\n\n // leave space for EDNS0 padding\n message.arcount += 1;\n\n return message;\n}\n\nexport function serializeDnsQuery(query: DnsMessage): RawDnsMessage {\n const buffer = new ArrayBuffer(1024);\n const message = new DataView(buffer);\n\n let offset = 0;\n offset = serializeHeader(message, offset, query);\n\n for (const question of query.questions) {\n offset = serializeQuestion(message, offset, question);\n }\n\n // we ignore the answers and authority records for queries,\n // but we include the additional records for EDNS0 support\n if (query.answers.length > 0 || query.authorityRecords.length > 0) {\n throw new Error(\"Cannot serialize answers or authority records for query\");\n }\n\n for (const record of query.additionalRecords) {\n offset = serializeResourceRecord(message, offset, record);\n }\n\n // add padding to the message for privacy\n offset = serializeEDNS0Padding(message, offset);\n\n return buffer.slice(0, offset);\n}\n\nfunction serializeName(message: DataView, offset: number, name: DNSName) {\n // TODO: consider implementing compression\n for (const label of name) {\n message.setUint8(offset++, label.length);\n for (const byte of label) {\n message.setUint8(offset++, byte);\n }\n }\n\n // empty label to terminate the domain name\n message.setUint8(offset++, 0);\n\n return offset;\n}\n\nfunction serializeResourceRecord(\n message: DataView,\n offset: number,\n record: DnsResourceRecord | DnsOptRecord,\n) {\n offset = serializeName(message, offset, record.name);\n message.setUint16(offset, record.type);\n offset += 2;\n\n if (record.type === 41) {\n message.setUint16(offset, (<DnsOptRecord>record).maxPayloadSize);\n } else {\n message.setUint16(offset, (<DnsResourceRecord>record).class);\n }\n offset += 2;\n\n let ttl;\n if (record.type === 41) {\n ttl = (<DnsOptRecord>record).extendedRcode << 24;\n ttl |= (<DnsOptRecord>record).version << 16;\n ttl |= (<DnsOptRecord>record).do << 15;\n ttl |= (<DnsOptRecord>record).z;\n } else {\n ttl = (<DnsResourceRecord>record).ttl;\n }\n\n message.setUint32(offset, ttl);\n offset += 4;\n message.setUint16(offset, record.rdlength);\n offset += 2;\n\n if (record.type === 41) {\n // OPT record\n for (const opt of (<DnsOptRecord>record).rdata) {\n message.setUint16(offset, opt.optionCode);\n offset += 2;\n message.setUint16(offset, opt.optionLength);\n offset += 2;\n for (const byte of opt.optionData) {\n message.setUint8(offset++, byte);\n }\n }\n } else {\n for (const byte of (<DnsResourceRecord>record).rdata) {\n message.setUint8(offset++, byte);\n }\n }\n\n return offset;\n}\n\nfunction serializeEDNS0Padding(message: DataView, offset: number) {\n // RFC 8467 - Recommended Strategy: Block-Length Padding\n\n // padding header of 4 bytes must be included\n const length = offset + 4;\n const paddingLength = Math.ceil(length / 128) * 128 - length;\n\n const padding = Array.from({ length: paddingLength }, () =>\n Math.floor(Math.random() * 0xff),\n );\n\n // RFC 7830\n const paddingRecord: DnsOptRecord = {\n name: [],\n type: 41,\n maxPayloadSize: 0,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: padding.length + 4,\n rdata: [\n { optionCode: 12, optionLength: padding.length, optionData: padding },\n ],\n };\n offset = serializeResourceRecord(message, offset, paddingRecord);\n\n return offset;\n}\n\nfunction serializeQuestion(\n message: DataView,\n offset: number,\n question: DnsQuestion,\n) {\n offset = serializeName(message, offset, question.qname);\n\n message.setUint16(offset, question.qtype);\n offset += 2;\n message.setUint16(offset, question.qclass);\n offset += 2;\n\n return offset;\n}\n\nfunction serializeHeader(\n message: DataView,\n offset: number,\n header: DnsMessage,\n) {\n // message id\n message.setUint16(offset, header.id);\n offset += 2;\n\n // flags\n message.setUint16(\n offset,\n ((header.qr & 0b1) << 15) |\n ((header.opcode & 0b1111) << 11) |\n ((header.aa & 0b1) << 10) |\n ((header.tc & 0b1) << 9) |\n ((header.rd & 0b1) << 8) |\n ((header.ra & 0b1) << 7) |\n ((header.z & 0b111) << 4) |\n (header.rcode & 0b1111),\n );\n offset += 2;\n\n // question records count\n message.setUint16(4, header.qdcount);\n offset += 2;\n\n // answer records count\n message.setUint16(6, header.ancount);\n offset += 2;\n\n // authority records count\n message.setUint16(8, header.nscount);\n offset += 2;\n\n // additional records count\n message.setUint16(10, header.arcount);\n offset += 2;\n\n return offset;\n}\n\nexport function parseDnsMessage(\n raw: RawDnsMessage,\n offset: number = 0,\n): DnsMessage {\n const rawView = new DataView(raw);\n const message = createDnsMessage();\n\n offset = parseHeader(rawView, offset, message);\n\n offset = parseQuestion(rawView, offset, message.qdcount, message.questions);\n\n offset = parseResourceRecords(\n rawView,\n offset,\n message.ancount,\n message.answers,\n );\n offset = parseResourceRecords(\n rawView,\n offset,\n message.nscount,\n message.authorityRecords,\n );\n offset = parseAdditionalRecords(\n rawView,\n offset,\n message.arcount,\n message.additionalRecords,\n );\n\n if (offset !== raw.byteLength) {\n // TODO: implement support for parsing padding and replace the warning with error\n throw new Error(\n `Unexpected end of message (offset: ${offset}, length: ${raw.byteLength})`,\n );\n }\n\n return message;\n}\n\nfunction parseQuestion(\n rawView: DataView,\n offset: number,\n number: number,\n records: DnsQuestion[],\n) {\n for (let i = 0; i < number; i++) {\n const qname: DNSName = [];\n offset = parseName(rawView, offset, qname, 0);\n\n const qtype = rawView.getUint16(offset);\n offset += 2;\n const qclass = rawView.getUint16(offset);\n offset += 2;\n\n records.push({ qname, qtype, qclass });\n }\n return offset;\n}\n\nfunction parseAdditionalRecords(\n rawView: DataView,\n offset: number,\n number: number,\n records: Array<DnsResourceRecord | DnsOptRecord>,\n) {\n for (let i = 0; i < number; i++) {\n const name: DNSName = [];\n offset = parseName(rawView, offset, name, 0);\n\n const type = rawView.getUint16(offset);\n offset += 2;\n\n if (type === 41) {\n const record: DnsOptRecord = {\n name,\n type,\n maxPayloadSize: 0,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseOptRecordBody(rawView, offset, record);\n\n records.push(record);\n } else {\n const record: DnsResourceRecord = {\n name,\n type,\n class: 0,\n ttl: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseResourceRecordBody(rawView, offset, record);\n\n records.push(record);\n }\n }\n\n return offset;\n}\n\nfunction parseOptRecordBody(\n rawView: DataView,\n offset: number,\n record: DnsOptRecord,\n) {\n record.maxPayloadSize = rawView.getUint16(offset);\n offset += 2;\n\n // TTL field is used as the extended RCODE and flags\n const ttl = rawView.getUint32(offset);\n offset += 4;\n\n record.extendedRcode = (ttl & 0xff000000) >> 24;\n record.version = (ttl & 0x00ff0000) >> 16;\n record.do = ((ttl & 0x00008000) >> 15) as BinaryFlag;\n record.z = ttl & 0x00007fff;\n\n record.rdlength = rawView.getUint16(offset);\n offset += 2;\n\n const rdEnd = offset + record.rdlength;\n\n while (offset < rdEnd) {\n const optionCode = rawView.getUint16(offset);\n offset += 2;\n const optionLength = rawView.getUint16(offset);\n const opt = {\n optionCode,\n optionLength,\n optionData: [],\n } as Opt;\n offset += 2;\n for (let k = 0; k < opt.optionLength; k++) {\n opt.optionData.push(rawView.getUint8(offset++));\n }\n record.rdata.push(opt);\n }\n return offset;\n}\n\nfunction parseResourceRecordBody(\n rawView: DataView,\n offset: number,\n record: DnsResourceRecord,\n) {\n record.class = rawView.getUint16(offset);\n offset += 2;\n record.ttl = rawView.getUint32(offset);\n offset += 4;\n record.rdlength = rawView.getUint16(offset);\n offset += 2;\n for (let j = 0; j < record.rdlength; j++) {\n record.rdata.push(rawView.getUint8(offset++));\n }\n return offset;\n}\n\nfunction parseResourceRecords(\n rawView: DataView,\n offset: number,\n number: number,\n records: DnsResourceRecord[],\n) {\n for (let i = 0; i < number; i++) {\n const name: DNSName = [];\n offset = parseName(rawView, offset, name, 0);\n\n const type = rawView.getUint16(offset);\n offset += 2;\n\n const record: DnsResourceRecord = {\n name,\n type,\n class: 0,\n ttl: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseResourceRecordBody(rawView, offset, record);\n\n records.push(record);\n }\n\n return offset;\n}\n\nfunction parseName(\n view: DataView,\n offset: number,\n output: DNSName,\n recursionDepth = 0,\n) {\n if (recursionDepth > 20) {\n throw new Error(\"Too many nested labels\");\n }\n\n let length = view.getUint8(offset++);\n while (length !== 0) {\n const labelType = length >> 6;\n if (labelType === 0b00) {\n // standard label\n const label = [];\n for (let i = 0; i < length; i++) {\n label.push(view.getUint8(offset++));\n }\n output.push(label);\n length = view.getUint8(offset++);\n } else if (labelType === 0b11) {\n // compressed label\n const pointer = ((length & 0b00111111) << 8) | view.getUint8(offset++);\n // ignore the offset as we returning from a \"jump\"\n parseName(view, pointer, output, recursionDepth + 1);\n break;\n } else {\n // we do not (yet) support extended label types (RFC2671)\n throw new Error(`Invalid label type: ${labelType.toString(2)}`);\n }\n }\n return offset;\n}\n\nfunction parseHeader(raw: DataView, offset: number, output: DnsMessage) {\n output.id = raw.getUint16(offset);\n offset += 2;\n\n const flags = raw.getUint16(offset);\n offset += 2;\n\n output.qr = ((flags & 0b1000000000000000) >> 15) as BinaryFlag;\n output.opcode = ((flags & 0b0111100000000000) >> 11) as FourBitNumber;\n output.aa = ((flags & 0b0000010000000000) >> 10) as BinaryFlag;\n output.tc = ((flags & 0b0000001000000000) >> 9) as BinaryFlag;\n output.rd = ((flags & 0b0000000100000000) >> 8) as BinaryFlag;\n output.ra = ((flags & 0b0000000010000000) >> 7) as BinaryFlag;\n output.z = ((flags & 0b0000000001110000) >> 4) as ThreeBitNumber;\n output.rcode = (flags & 0b0000000000001111) as FourBitNumber;\n\n output.qdcount = raw.getUint16(offset);\n offset += 2;\n\n output.ancount = raw.getUint16(offset);\n offset += 2;\n\n output.nscount = raw.getUint16(offset);\n offset += 2;\n\n output.arcount = raw.getUint16(offset);\n offset += 2;\n\n return offset;\n}\n","export function domainToAscii(domain: string) {\n const preprocessed = preprocessDomain(domain);\n const labels = preprocessed.split(\".\");\n\n const asciiLabels = labels.map((label) => {\n if (stringIsAscii(label)) {\n return label;\n } else {\n return \"xn--\" + punycodeEncode(label);\n }\n });\n\n return asciiLabels.join(\".\").toLowerCase();\n}\n\nfunction preprocessDomain(domain: string) {\n // https://unicode.org/reports/tr46/#TableDerivationStep1\n const exceptionalMapped = domain\n .replace(/[.。。]/gu, \".\")\n .replace(/ẞ/gu, \"ß\");\n\n // we normalize the input to Unicode Normalization Form KC\n const normalized = exceptionalMapped.normalize(\"NFKC\");\n\n // TODO: we deviate from the spec here to simplify the implementation\n // this may need to be revisited in the future\n\n // we should perform case folding here (NFKC_Casefold)\n // but we simplify this step to just lowercase the input instead\n const lowercased = normalized.toLowerCase();\n\n // remove all code points in the range U+FE00 to U+FE0F\n // (Unicode variation selectors) from the input\n // as they break emoji domains handling\n const filtered = lowercased.replace(/[\\uFE00-\\uFE0F]/gu, \"\");\n\n return filtered;\n}\n\nfunction stringIsAscii(str: string): boolean {\n return Array.from(str).every(charIsAscii);\n}\n\nfunction charIsAscii(char: string): boolean {\n return char.charCodeAt(0) < 128;\n}\n\nconst base = 36;\nconst tmin = 1;\nconst tmax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initial_bias = 72;\nconst initial_n = 0x80;\n\nexport function punycodeEncode(str: string) {\n let n = initial_n;\n let delta = 0;\n let bias = initial_bias;\n const output: string[] = [];\n\n const inputChars = Array.from(str);\n\n // copy ascii chars to output\n const asciiChars = inputChars.filter(charIsAscii);\n const basicCodePoints = asciiChars.length;\n let handledCodePoints = basicCodePoints;\n output.push(...asciiChars);\n\n // append delimiter if we consumed any ascii chars\n if (basicCodePoints > 0) {\n output.push(\"-\");\n }\n\n const inputCodePoints = inputChars.map((char) => char.codePointAt(0)!);\n const inputLength = inputCodePoints.length;\n\n while (handledCodePoints < inputLength) {\n // Find the minimum code point >= n\n let m = Number.MAX_SAFE_INTEGER;\n for (const c of inputCodePoints) {\n if (c >= n && c < m) {\n m = c;\n }\n }\n\n delta += (m - n) * (handledCodePoints + 1);\n n = m;\n\n for (const c of inputCodePoints) {\n if (c < n) {\n delta++;\n } else if (c === n) {\n let q = delta;\n let k = base;\n\n while (true) {\n let t: number;\n if (k <= bias) {\n t = tmin;\n } else if (k >= bias + tmax) {\n t = tmax;\n } else {\n t = k - bias;\n }\n if (q < t) break;\n const code = t + ((q - t) % (base - t));\n output.push(encodeDigit(code));\n q = div(q - t, base - t);\n k += base;\n }\n\n output.push(encodeDigit(q));\n bias = adaptBias(\n delta,\n handledCodePoints + 1,\n handledCodePoints === basicCodePoints,\n );\n delta = 0;\n handledCodePoints++;\n }\n }\n\n delta++;\n n++;\n }\n\n return output.join(\"\");\n}\n\nfunction encodeDigit(d: number): string {\n return String.fromCharCode(d + 22 + 75 * Number(d < 26));\n}\n\nfunction div(n: number, d: number) {\n return Math.floor(n / d);\n}\n\nfunction adaptBias(delta: number, numPoints: number, firstTime: boolean) {\n if (firstTime) {\n delta = div(delta, damp);\n } else {\n delta = div(delta, 2);\n }\n\n delta += div(delta, numPoints);\n\n let k = 0;\n while (delta > div((base - tmin) * tmax, 2)) {\n delta = div(delta, base - tmin);\n\n k += 36;\n }\n\n return k + div((36 - 1 + 1) * delta, delta + skew);\n}\n","export const version = __LIB_VERSION__;\nimport type { DnsResourceRecord, DnsOptRecord } from \"./dns-message\";\nimport {\n serializeDnsQuery,\n createDnsQuery,\n parseDnsMessage,\n stringToDNSName,\n dnsNameToString,\n} from \"./dns-message\";\nimport { domainToAscii } from \"./punycode\";\n\nexport function resolve(server: string, name: string, type: string) {\n const qualifiedName = domainToAscii(name);\n\n const query = createDnsQuery([\n {\n qname: stringToDNSName(qualifiedName),\n qtype: parseInt(type, 10),\n qclass: 1, // INTERNET\n },\n ]);\n\n const buffer = serializeDnsQuery(query);\n\n const url = new URL(server);\n url.pathname = \"/dns-query\";\n\n return fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n headers: {\n Accept: \"application/dns-message\",\n \"Content-Type\": \"application/dns-message\",\n },\n body: buffer,\n })\n .then((response) => {\n if (!response.ok) {\n return response.text().then((text) => {\n throw new Error(`HTTP ${response.status}: ${text}`);\n });\n }\n return response.arrayBuffer();\n })\n .then((buffer) => {\n const message = parseDnsMessage(buffer);\n return formatDnsMessage(message);\n })\n .catch((error) => {\n console.error(error);\n throw error;\n });\n}\n\nfunction formatDnsMessage(message: ReturnType<typeof parseDnsMessage>) {\n const formatted = {\n id: message.id,\n authoritativeAnswer: message.aa === 1,\n truncated: message.tc === 1,\n recursionAvailable: message.ra === 1,\n responseCode: message.rcode === 0 ? \"OK\" : \"ERROR\",\n questions: message.questions.map((question) => ({\n name: dnsNameToString(question.qname),\n type: question.qtype,\n })),\n answers: message.answers.map((record) => ({\n name: dnsNameToString(record.name),\n type: record.type,\n ttl: record.ttl,\n value: formatRData(record.type, record.rdata),\n })),\n authorityRecords: message.authorityRecords.map((record) => ({\n name: dnsNameToString(record.name),\n type: record.type,\n ttl: record.ttl,\n value: formatRData(record.type, record.rdata),\n })),\n additionalRecords: message.additionalRecords.map((record) => {\n if (record.type === 41) {\n return {\n name: dnsNameToString(record.name),\n type: record.type,\n maxPayloadSize: (<DnsOptRecord>record).maxPayloadSize,\n extendedRcode: (<DnsOptRecord>record).extendedRcode,\n version: (<DnsOptRecord>record).version,\n do: (<DnsOptRecord>record).do,\n z: (<DnsOptRecord>record).z,\n value: (<DnsOptRecord>record).rdata,\n };\n } else {\n return {\n name: dnsNameToString(record.name),\n type: record.type,\n class: (<DnsResourceRecord>record).class,\n ttl: (<DnsResourceRecord>record).ttl,\n value: formatRData(record.type, (<DnsResourceRecord>record).rdata),\n };\n }\n }),\n };\n return JSON.stringify(formatted, null, 2);\n}\n\nfunction formatRData(recordType: number, rdata: number[]) {\n // TODO: this has to be implemented in the parser as the data\n // may include dns names and labels like for CNAMEs\n // or TXT (where there are labels but merged into a single string)\n switch (recordType) {\n case 1:\n return rdata.join(\".\");\n case 28:\n return rdata.map((c) => c.toString(16)).join(\":\");\n default:\n return rdata;\n }\n}\n"],"names":["dnsNameToString","name","label","stringToDNSName","labels","dnsName","bytes","char","code","createDnsMessage","createDnsQuery","questions","message","serializeDnsQuery","query","buffer","offset","serializeHeader","question","serializeQuestion","record","serializeResourceRecord","serializeEDNS0Padding","serializeName","byte","ttl","opt","length","paddingLength","padding","paddingRecord","header","parseDnsMessage","raw","rawView","parseHeader","parseQuestion","parseResourceRecords","parseAdditionalRecords","number","records","i","qname","parseName","qtype","qclass","type","parseOptRecordBody","parseResourceRecordBody","rdEnd","optionCode","optionLength","k","j","view","output","recursionDepth","labelType","pointer","flags","domainToAscii","domain","preprocessDomain","stringIsAscii","punycodeEncode","str","charIsAscii","base","tmin","tmax","skew","damp","initial_bias","initial_n","delta","bias","inputChars","asciiChars","basicCodePoints","handledCodePoints","inputCodePoints","inputLength","m","c","q","t","encodeDigit","div","adaptBias","d","n","numPoints","firstTime","version","resolve","server","qualifiedName","url","response","text","formatDnsMessage","error","formatted","formatRData","recordType","rdata"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"universal-doh.js","names":[],"sources":["../lib/dns-message.ts","../lib/punycode.ts","../lib/index.ts"],"sourcesContent":["type RawDnsMessage = ArrayBuffer;\n\ninterface DnsMessage {\n id: number;\n // query (0), response (1)\n qr: BinaryFlag;\n /*\n 0 a standard query (QUERY)\n 1 an inverse query (IQUERY)\n 2 a server status request (STATUS)\n 3-15 reserved for future use\n */\n opcode: FourBitNumber;\n // Authoritative Answer\n aa: BinaryFlag;\n // TrunCation\n tc: BinaryFlag;\n // Recursion Desired\n rd: BinaryFlag;\n // Recursion Available\n ra: BinaryFlag;\n // reserved for future use - must be 0\n z: ThreeBitNumber;\n /*\n Response code\n 0 No error condition\n 1 Format error\n 2 Server failure\n 3 Name Error\n 4 Not Implemented\n 5 Refused\n 6-15 Reserved for future use.\n */\n rcode: FourBitNumber;\n // number of entries in the question section (0-65535)\n qdcount: number;\n // number of resource records in the answer section (0-65535)\n ancount: number;\n // number of name server resource records in the authority records section (0-65535)\n nscount: number;\n // number of resource records in the additional records section (0-65535)\n arcount: number;\n\n questions: DnsQuestion[];\n answers: DnsResourceRecord[];\n authorityRecords: DnsResourceRecord[];\n additionalRecords: Array<DnsOptRecord | DnsResourceRecord>;\n}\n\ntype Bytes = number[];\ntype Label = Bytes;\ntype DNSName = Label[];\n\ninterface DnsQuestion {\n qname: DNSName;\n // 16 bit unsigned integer\n qtype: number;\n // 16 bit unsigned integer\n qclass: number;\n}\n\ninterface Opt {\n optionCode: number;\n optionLength: number;\n optionData: Bytes;\n}\n\nexport interface DnsOptRecord {\n name: DNSName;\n type: 41;\n // 16 bit unsigned integer\n maxPayloadSize: number;\n // TTL field is used as the extended RCODE and flags\n // https://datatracker.ietf.org/doc/html/rfc6891#section-6.1.3\n extendedRcode: number;\n version: number;\n do: BinaryFlag;\n z: number;\n // 16 bit unsigned integer\n rdlength: number;\n // RDATA field is used for EDNS0 options\n rdata: Opt[];\n}\n\nexport interface DnsResourceRecord {\n name: DNSName;\n // 16 bit unsigned integer\n type: number;\n // 16 bit unsigned integer\n class: number;\n // 32 bit unsigned integer\n ttl: number;\n // 16 bit unsigned integer\n rdlength: number;\n rdata: Bytes;\n}\n\ntype BinaryFlag = 0 | 1;\ntype ThreeBitNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;\ntype FourBitNumber =\n | 0\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9\n | 10\n | 11\n | 12\n | 13\n | 14\n | 15;\n\nexport function dnsNameToString(name: DNSName): string {\n return name.map((label) => String.fromCharCode(...label)).join(\".\");\n}\n\nexport function stringToDNSName(name: string): DNSName {\n // we can assume string is ascii but it may not be a valid domain name\n const labels = name.split(\".\").filter((label) => label.length > 0);\n const dnsName: DNSName = [];\n for (const label of labels) {\n if (label.length < 1 || label.length > 63) {\n throw new Error(\n `Label \"${label}\" must be between 1 and 63 characters long`,\n );\n }\n\n if (label.startsWith(\"-\") || label.endsWith(\"-\")) {\n throw new Error(`Label \"${label}\" cannot start or end with a hyphen`);\n }\n\n const bytes: Bytes = [];\n\n for (const char of label) {\n const code = char.charCodeAt(0);\n if (\n (code >= 48 && code <= 57) || // '0'-'9'\n (code >= 97 && code <= 122) || // 'a'-'z'\n code === 45 // '-'\n ) {\n bytes.push(code);\n } else {\n throw new Error(`Invalid character '${char}' in label \"${label}\"`);\n }\n }\n dnsName.push(bytes);\n }\n return dnsName;\n}\n\nfunction createDnsMessage() {\n return {\n id: 0,\n qr: 0,\n opcode: 0,\n aa: 0,\n tc: 0,\n rd: 0,\n ra: 0,\n z: 0,\n rcode: 0,\n qdcount: 0,\n ancount: 0,\n nscount: 0,\n arcount: 0,\n questions: [],\n answers: [],\n authorityRecords: [],\n additionalRecords: [],\n } as DnsMessage;\n}\n\nexport function createDnsQuery(questions: DnsQuestion[]): DnsMessage {\n const message = createDnsMessage();\n message.rd = 1;\n message.qdcount += questions.length;\n message.questions.push(...questions);\n\n // notify the server that we support EDNS0 by adding an OPT record\n message.arcount += 1;\n message.additionalRecords.push({\n name: [],\n type: 41,\n maxPayloadSize: 0xffff,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: 0,\n rdata: [],\n } as DnsOptRecord);\n\n // leave space for EDNS0 padding\n message.arcount += 1;\n\n return message;\n}\n\nexport function serializeDnsQuery(query: DnsMessage): RawDnsMessage {\n const buffer = new ArrayBuffer(1024);\n const message = new DataView(buffer);\n\n let offset = 0;\n offset = serializeHeader(message, offset, query);\n\n for (const question of query.questions) {\n offset = serializeQuestion(message, offset, question);\n }\n\n // we ignore the answers and authority records for queries,\n // but we include the additional records for EDNS0 support\n if (query.answers.length > 0 || query.authorityRecords.length > 0) {\n throw new Error(\"Cannot serialize answers or authority records for query\");\n }\n\n for (const record of query.additionalRecords) {\n offset = serializeResourceRecord(message, offset, record);\n }\n\n // add padding to the message for privacy\n offset = serializeEDNS0Padding(message, offset);\n\n return buffer.slice(0, offset);\n}\n\nfunction serializeName(message: DataView, offset: number, name: DNSName) {\n // TODO: consider implementing compression\n for (const label of name) {\n message.setUint8(offset++, label.length);\n for (const byte of label) {\n message.setUint8(offset++, byte);\n }\n }\n\n // empty label to terminate the domain name\n message.setUint8(offset++, 0);\n\n return offset;\n}\n\nfunction serializeResourceRecord(\n message: DataView,\n offset: number,\n record: DnsResourceRecord | DnsOptRecord,\n) {\n offset = serializeName(message, offset, record.name);\n message.setUint16(offset, record.type);\n offset += 2;\n\n if (record.type === 41) {\n message.setUint16(offset, (<DnsOptRecord>record).maxPayloadSize);\n } else {\n message.setUint16(offset, (<DnsResourceRecord>record).class);\n }\n offset += 2;\n\n let ttl;\n if (record.type === 41) {\n ttl = (<DnsOptRecord>record).extendedRcode << 24;\n ttl |= (<DnsOptRecord>record).version << 16;\n ttl |= (<DnsOptRecord>record).do << 15;\n ttl |= (<DnsOptRecord>record).z;\n } else {\n ttl = (<DnsResourceRecord>record).ttl;\n }\n\n message.setUint32(offset, ttl);\n offset += 4;\n message.setUint16(offset, record.rdlength);\n offset += 2;\n\n if (record.type === 41) {\n // OPT record\n for (const opt of (<DnsOptRecord>record).rdata) {\n message.setUint16(offset, opt.optionCode);\n offset += 2;\n message.setUint16(offset, opt.optionLength);\n offset += 2;\n for (const byte of opt.optionData) {\n message.setUint8(offset++, byte);\n }\n }\n } else {\n for (const byte of (<DnsResourceRecord>record).rdata) {\n message.setUint8(offset++, byte);\n }\n }\n\n return offset;\n}\n\nfunction serializeEDNS0Padding(message: DataView, offset: number) {\n // RFC 8467 - Recommended Strategy: Block-Length Padding\n\n // padding header of 4 bytes must be included\n const length = offset + 4;\n const paddingLength = Math.ceil(length / 128) * 128 - length;\n\n const padding = Array.from({ length: paddingLength }, () =>\n Math.floor(Math.random() * 0xff),\n );\n\n // RFC 7830\n const paddingRecord: DnsOptRecord = {\n name: [],\n type: 41,\n maxPayloadSize: 0,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: padding.length + 4,\n rdata: [\n { optionCode: 12, optionLength: padding.length, optionData: padding },\n ],\n };\n offset = serializeResourceRecord(message, offset, paddingRecord);\n\n return offset;\n}\n\nfunction serializeQuestion(\n message: DataView,\n offset: number,\n question: DnsQuestion,\n) {\n offset = serializeName(message, offset, question.qname);\n\n message.setUint16(offset, question.qtype);\n offset += 2;\n message.setUint16(offset, question.qclass);\n offset += 2;\n\n return offset;\n}\n\nfunction serializeHeader(\n message: DataView,\n offset: number,\n header: DnsMessage,\n) {\n // message id\n message.setUint16(offset, header.id);\n offset += 2;\n\n // flags\n message.setUint16(\n offset,\n ((header.qr & 0b1) << 15) |\n ((header.opcode & 0b1111) << 11) |\n ((header.aa & 0b1) << 10) |\n ((header.tc & 0b1) << 9) |\n ((header.rd & 0b1) << 8) |\n ((header.ra & 0b1) << 7) |\n ((header.z & 0b111) << 4) |\n (header.rcode & 0b1111),\n );\n offset += 2;\n\n // question records count\n message.setUint16(4, header.qdcount);\n offset += 2;\n\n // answer records count\n message.setUint16(6, header.ancount);\n offset += 2;\n\n // authority records count\n message.setUint16(8, header.nscount);\n offset += 2;\n\n // additional records count\n message.setUint16(10, header.arcount);\n offset += 2;\n\n return offset;\n}\n\nexport function parseDnsMessage(\n raw: RawDnsMessage,\n offset: number = 0,\n): DnsMessage {\n const rawView = new DataView(raw);\n const message = createDnsMessage();\n\n offset = parseHeader(rawView, offset, message);\n\n offset = parseQuestion(rawView, offset, message.qdcount, message.questions);\n\n offset = parseResourceRecords(\n rawView,\n offset,\n message.ancount,\n message.answers,\n );\n offset = parseResourceRecords(\n rawView,\n offset,\n message.nscount,\n message.authorityRecords,\n );\n offset = parseAdditionalRecords(\n rawView,\n offset,\n message.arcount,\n message.additionalRecords,\n );\n\n if (offset !== raw.byteLength) {\n // TODO: implement support for parsing padding and replace the warning with error\n throw new Error(\n `Unexpected end of message (offset: ${offset}, length: ${raw.byteLength})`,\n );\n }\n\n return message;\n}\n\nfunction parseQuestion(\n rawView: DataView,\n offset: number,\n number: number,\n records: DnsQuestion[],\n) {\n for (let i = 0; i < number; i++) {\n const qname: DNSName = [];\n offset = parseName(rawView, offset, qname, 0);\n\n const qtype = rawView.getUint16(offset);\n offset += 2;\n const qclass = rawView.getUint16(offset);\n offset += 2;\n\n records.push({ qname, qtype, qclass });\n }\n return offset;\n}\n\nfunction parseAdditionalRecords(\n rawView: DataView,\n offset: number,\n number: number,\n records: Array<DnsResourceRecord | DnsOptRecord>,\n) {\n for (let i = 0; i < number; i++) {\n const name: DNSName = [];\n offset = parseName(rawView, offset, name, 0);\n\n const type = rawView.getUint16(offset);\n offset += 2;\n\n if (type === 41) {\n const record: DnsOptRecord = {\n name,\n type,\n maxPayloadSize: 0,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseOptRecordBody(rawView, offset, record);\n\n records.push(record);\n } else {\n const record: DnsResourceRecord = {\n name,\n type,\n class: 0,\n ttl: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseResourceRecordBody(rawView, offset, record);\n\n records.push(record);\n }\n }\n\n return offset;\n}\n\nfunction parseOptRecordBody(\n rawView: DataView,\n offset: number,\n record: DnsOptRecord,\n) {\n record.maxPayloadSize = rawView.getUint16(offset);\n offset += 2;\n\n // TTL field is used as the extended RCODE and flags\n const ttl = rawView.getUint32(offset);\n offset += 4;\n\n record.extendedRcode = (ttl & 0xff000000) >> 24;\n record.version = (ttl & 0x00ff0000) >> 16;\n record.do = ((ttl & 0x00008000) >> 15) as BinaryFlag;\n record.z = ttl & 0x00007fff;\n\n record.rdlength = rawView.getUint16(offset);\n offset += 2;\n\n const rdEnd = offset + record.rdlength;\n\n while (offset < rdEnd) {\n const optionCode = rawView.getUint16(offset);\n offset += 2;\n const optionLength = rawView.getUint16(offset);\n const opt = {\n optionCode,\n optionLength,\n optionData: [],\n } as Opt;\n offset += 2;\n for (let k = 0; k < opt.optionLength; k++) {\n opt.optionData.push(rawView.getUint8(offset++));\n }\n record.rdata.push(opt);\n }\n return offset;\n}\n\nfunction parseResourceRecordBody(\n rawView: DataView,\n offset: number,\n record: DnsResourceRecord,\n) {\n record.class = rawView.getUint16(offset);\n offset += 2;\n record.ttl = rawView.getUint32(offset);\n offset += 4;\n record.rdlength = rawView.getUint16(offset);\n offset += 2;\n for (let j = 0; j < record.rdlength; j++) {\n record.rdata.push(rawView.getUint8(offset++));\n }\n return offset;\n}\n\nfunction parseResourceRecords(\n rawView: DataView,\n offset: number,\n number: number,\n records: DnsResourceRecord[],\n) {\n for (let i = 0; i < number; i++) {\n const name: DNSName = [];\n offset = parseName(rawView, offset, name, 0);\n\n const type = rawView.getUint16(offset);\n offset += 2;\n\n const record: DnsResourceRecord = {\n name,\n type,\n class: 0,\n ttl: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseResourceRecordBody(rawView, offset, record);\n\n records.push(record);\n }\n\n return offset;\n}\n\nfunction parseName(\n view: DataView,\n offset: number,\n output: DNSName,\n recursionDepth = 0,\n) {\n if (recursionDepth > 20) {\n throw new Error(\"Too many nested labels\");\n }\n\n let length = view.getUint8(offset++);\n while (length !== 0) {\n const labelType = length >> 6;\n if (labelType === 0b00) {\n // standard label\n const label = [];\n for (let i = 0; i < length; i++) {\n label.push(view.getUint8(offset++));\n }\n output.push(label);\n length = view.getUint8(offset++);\n } else if (labelType === 0b11) {\n // compressed label\n const pointer = ((length & 0b00111111) << 8) | view.getUint8(offset++);\n // ignore the offset as we returning from a \"jump\"\n parseName(view, pointer, output, recursionDepth + 1);\n break;\n } else {\n // we do not (yet) support extended label types (RFC2671)\n throw new Error(`Invalid label type: ${labelType.toString(2)}`);\n }\n }\n return offset;\n}\n\nfunction parseHeader(raw: DataView, offset: number, output: DnsMessage) {\n output.id = raw.getUint16(offset);\n offset += 2;\n\n const flags = raw.getUint16(offset);\n offset += 2;\n\n output.qr = ((flags & 0b1000000000000000) >> 15) as BinaryFlag;\n output.opcode = ((flags & 0b0111100000000000) >> 11) as FourBitNumber;\n output.aa = ((flags & 0b0000010000000000) >> 10) as BinaryFlag;\n output.tc = ((flags & 0b0000001000000000) >> 9) as BinaryFlag;\n output.rd = ((flags & 0b0000000100000000) >> 8) as BinaryFlag;\n output.ra = ((flags & 0b0000000010000000) >> 7) as BinaryFlag;\n output.z = ((flags & 0b0000000001110000) >> 4) as ThreeBitNumber;\n output.rcode = (flags & 0b0000000000001111) as FourBitNumber;\n\n output.qdcount = raw.getUint16(offset);\n offset += 2;\n\n output.ancount = raw.getUint16(offset);\n offset += 2;\n\n output.nscount = raw.getUint16(offset);\n offset += 2;\n\n output.arcount = raw.getUint16(offset);\n offset += 2;\n\n return offset;\n}\n","export function domainToAscii(domain: string) {\n const preprocessed = preprocessDomain(domain);\n const labels = preprocessed.split(\".\");\n\n const asciiLabels = labels.map((label) => {\n if (stringIsAscii(label)) {\n return label;\n } else {\n return \"xn--\" + punycodeEncode(label);\n }\n });\n\n return asciiLabels.join(\".\").toLowerCase();\n}\n\nfunction preprocessDomain(domain: string) {\n // https://unicode.org/reports/tr46/#TableDerivationStep1\n const exceptionalMapped = domain\n .replace(/[.。。]/gu, \".\")\n .replace(/ẞ/gu, \"ß\");\n\n // we normalize the input to Unicode Normalization Form KC\n const normalized = exceptionalMapped.normalize(\"NFKC\");\n\n // TODO: we deviate from the spec here to simplify the implementation\n // this may need to be revisited in the future\n\n // we should perform case folding here (NFKC_Casefold)\n // but we simplify this step to just lowercase the input instead\n const lowercased = normalized.toLowerCase();\n\n // remove all code points in the range U+FE00 to U+FE0F\n // (Unicode variation selectors) from the input\n // as they break emoji domains handling\n const filtered = lowercased.replace(/[\\uFE00-\\uFE0F]/gu, \"\");\n\n return filtered;\n}\n\nfunction stringIsAscii(str: string): boolean {\n return Array.from(str).every(charIsAscii);\n}\n\nfunction charIsAscii(char: string): boolean {\n return char.charCodeAt(0) < 128;\n}\n\nconst base = 36;\nconst tmin = 1;\nconst tmax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initial_bias = 72;\nconst initial_n = 0x80;\n\nexport function punycodeEncode(str: string) {\n let n = initial_n;\n let delta = 0;\n let bias = initial_bias;\n const output: string[] = [];\n\n const inputChars = Array.from(str);\n\n // copy ascii chars to output\n const asciiChars = inputChars.filter(charIsAscii);\n const basicCodePoints = asciiChars.length;\n let handledCodePoints = basicCodePoints;\n output.push(...asciiChars);\n\n // append delimiter if we consumed any ascii chars\n if (basicCodePoints > 0) {\n output.push(\"-\");\n }\n\n const inputCodePoints = inputChars.map((char) => char.codePointAt(0)!);\n const inputLength = inputCodePoints.length;\n\n while (handledCodePoints < inputLength) {\n // Find the minimum code point >= n\n let m = Number.MAX_SAFE_INTEGER;\n for (const c of inputCodePoints) {\n if (c >= n && c < m) {\n m = c;\n }\n }\n\n delta += (m - n) * (handledCodePoints + 1);\n n = m;\n\n for (const c of inputCodePoints) {\n if (c < n) {\n delta++;\n } else if (c === n) {\n let q = delta;\n let k = base;\n\n while (true) {\n let t: number;\n if (k <= bias) {\n t = tmin;\n } else if (k >= bias + tmax) {\n t = tmax;\n } else {\n t = k - bias;\n }\n if (q < t) break;\n const code = t + ((q - t) % (base - t));\n output.push(encodeDigit(code));\n q = div(q - t, base - t);\n k += base;\n }\n\n output.push(encodeDigit(q));\n bias = adaptBias(\n delta,\n handledCodePoints + 1,\n handledCodePoints === basicCodePoints,\n );\n delta = 0;\n handledCodePoints++;\n }\n }\n\n delta++;\n n++;\n }\n\n return output.join(\"\");\n}\n\nfunction encodeDigit(d: number): string {\n return String.fromCharCode(d + 22 + 75 * Number(d < 26));\n}\n\nfunction div(n: number, d: number) {\n return Math.floor(n / d);\n}\n\nfunction adaptBias(delta: number, numPoints: number, firstTime: boolean) {\n if (firstTime) {\n delta = div(delta, damp);\n } else {\n delta = div(delta, 2);\n }\n\n delta += div(delta, numPoints);\n\n let k = 0;\n while (delta > div((base - tmin) * tmax, 2)) {\n delta = div(delta, base - tmin);\n\n k += 36;\n }\n\n return k + div((36 - 1 + 1) * delta, delta + skew);\n}\n","export const version = __LIB_VERSION__;\nimport type { DnsResourceRecord, DnsOptRecord } from \"./dns-message\";\nimport {\n serializeDnsQuery,\n createDnsQuery,\n parseDnsMessage,\n stringToDNSName,\n dnsNameToString,\n} from \"./dns-message\";\nimport { domainToAscii } from \"./punycode\";\n\nexport function resolve(server: string, name: string, type: string) {\n const qualifiedName = domainToAscii(name);\n\n const query = createDnsQuery([\n {\n qname: stringToDNSName(qualifiedName),\n qtype: parseInt(type, 10),\n qclass: 1, // INTERNET\n },\n ]);\n\n const buffer = serializeDnsQuery(query);\n\n const url = new URL(server);\n url.pathname = \"/dns-query\";\n\n return fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n headers: {\n Accept: \"application/dns-message\",\n \"Content-Type\": \"application/dns-message\",\n },\n body: buffer,\n })\n .then((response) => {\n if (!response.ok) {\n return response.text().then((text) => {\n throw new Error(`HTTP ${response.status}: ${text}`);\n });\n }\n return response.arrayBuffer();\n })\n .then((buffer) => {\n const message = parseDnsMessage(buffer);\n return formatDnsMessage(message);\n })\n .catch((error) => {\n console.error(error);\n throw error;\n });\n}\n\nfunction formatDnsMessage(message: ReturnType<typeof parseDnsMessage>) {\n const formatted = {\n id: message.id,\n authoritativeAnswer: message.aa === 1,\n truncated: message.tc === 1,\n recursionAvailable: message.ra === 1,\n responseCode: message.rcode === 0 ? \"OK\" : \"ERROR\",\n questions: message.questions.map((question) => ({\n name: dnsNameToString(question.qname),\n type: question.qtype,\n })),\n answers: message.answers.map((record) => ({\n name: dnsNameToString(record.name),\n type: record.type,\n ttl: record.ttl,\n value: formatRData(record.type, record.rdata),\n })),\n authorityRecords: message.authorityRecords.map((record) => ({\n name: dnsNameToString(record.name),\n type: record.type,\n ttl: record.ttl,\n value: formatRData(record.type, record.rdata),\n })),\n additionalRecords: message.additionalRecords.map((record) => {\n if (record.type === 41) {\n return {\n name: dnsNameToString(record.name),\n type: record.type,\n maxPayloadSize: (<DnsOptRecord>record).maxPayloadSize,\n extendedRcode: (<DnsOptRecord>record).extendedRcode,\n version: (<DnsOptRecord>record).version,\n do: (<DnsOptRecord>record).do,\n z: (<DnsOptRecord>record).z,\n value: (<DnsOptRecord>record).rdata,\n };\n } else {\n return {\n name: dnsNameToString(record.name),\n type: record.type,\n class: (<DnsResourceRecord>record).class,\n ttl: (<DnsResourceRecord>record).ttl,\n value: formatRData(record.type, (<DnsResourceRecord>record).rdata),\n };\n }\n }),\n };\n return JSON.stringify(formatted, null, 2);\n}\n\nfunction formatRData(recordType: number, rdata: number[]) {\n // TODO: this has to be implemented in the parser as the data\n // may include dns names and labels like for CNAMEs\n // or TXT (where there are labels but merged into a single string)\n switch (recordType) {\n case 1:\n return rdata.join(\".\");\n case 28:\n return rdata.map((c) => c.toString(16)).join(\":\");\n default:\n return rdata;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e[`universal-doh`]={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(e){return e.map(e=>String.fromCharCode(...e)).join(`.`)}function n(e){let t=e.split(`.`).filter(e=>e.length>0),n=[];for(let e of t){if(e.length<1||e.length>63)throw Error(`Label "${e}" must be between 1 and 63 characters long`);if(e.startsWith(`-`)||e.endsWith(`-`))throw Error(`Label "${e}" cannot start or end with a hyphen`);let t=[];for(let n of e){let r=n.charCodeAt(0);if(r>=48&&r<=57||r>=97&&r<=122||r===45)t.push(r);else throw Error(`Invalid character '${n}' in label "${e}"`)}n.push(t)}return n}function r(){return{id:0,qr:0,opcode:0,aa:0,tc:0,rd:0,ra:0,z:0,rcode:0,qdcount:0,ancount:0,nscount:0,arcount:0,questions:[],answers:[],authorityRecords:[],additionalRecords:[]}}function i(e){let t=r();return t.rd=1,t.qdcount+=e.length,t.questions.push(...e),t.arcount+=1,t.additionalRecords.push({name:[],type:41,maxPayloadSize:65535,extendedRcode:0,version:0,do:0,z:0,rdlength:0,rdata:[]}),t.arcount+=1,t}function a(e){let t=new ArrayBuffer(1024),n=new DataView(t),r=0;r=u(n,r,e);for(let t of e.questions)r=l(n,r,t);if(e.answers.length>0||e.authorityRecords.length>0)throw Error(`Cannot serialize answers or authority records for query`);for(let t of e.additionalRecords)r=s(n,r,t);return r=c(n,r),t.slice(0,r)}function o(e,t,n){for(let r of n){e.setUint8(t++,r.length);for(let n of r)e.setUint8(t++,n)}return e.setUint8(t++,0),t}function s(e,t,n){t=o(e,t,n.name),e.setUint16(t,n.type),t+=2,n.type===41?e.setUint16(t,n.maxPayloadSize):e.setUint16(t,n.class),t+=2;let r;if(n.type===41?(r=n.extendedRcode<<24,r|=n.version<<16,r|=n.do<<15,r|=n.z):r=n.ttl,e.setUint32(t,r),t+=4,e.setUint16(t,n.rdlength),t+=2,n.type===41)for(let r of n.rdata){e.setUint16(t,r.optionCode),t+=2,e.setUint16(t,r.optionLength),t+=2;for(let n of r.optionData)e.setUint8(t++,n)}else for(let r of n.rdata)e.setUint8(t++,r);return t}function c(e,t){let n=t+4,r=Math.ceil(n/128)*128-n,i=Array.from({length:r},()=>Math.floor(Math.random()*255)),a={name:[],type:41,maxPayloadSize:0,extendedRcode:0,version:0,do:0,z:0,rdlength:i.length+4,rdata:[{optionCode:12,optionLength:i.length,optionData:i}]};return t=s(e,t,a),t}function l(e,t,n){return t=o(e,t,n.qname),e.setUint16(t,n.qtype),t+=2,e.setUint16(t,n.qclass),t+=2,t}function u(e,t,n){return e.setUint16(t,n.id),t+=2,e.setUint16(t,(n.qr&1)<<15|(n.opcode&15)<<11|(n.aa&1)<<10|(n.tc&1)<<9|(n.rd&1)<<8|(n.ra&1)<<7|(n.z&7)<<4|n.rcode&15),t+=2,e.setUint16(4,n.qdcount),t+=2,e.setUint16(6,n.ancount),t+=2,e.setUint16(8,n.nscount),t+=2,e.setUint16(10,n.arcount),t+=2,t}function d(e,t=0){let n=new DataView(e),i=r();if(t=v(n,t,i),t=f(n,t,i.qdcount,i.questions),t=g(n,t,i.ancount,i.answers),t=g(n,t,i.nscount,i.authorityRecords),t=p(n,t,i.arcount,i.additionalRecords),t!==e.byteLength)throw Error(`Unexpected end of message (offset: ${t}, length: ${e.byteLength})`);return i}function f(e,t,n,r){for(let i=0;i<n;i++){let n=[];t=_(e,t,n,0);let i=e.getUint16(t);t+=2;let a=e.getUint16(t);t+=2,r.push({qname:n,qtype:i,qclass:a})}return t}function p(e,t,n,r){for(let i=0;i<n;i++){let n=[];t=_(e,t,n,0);let i=e.getUint16(t);if(t+=2,i===41){let a={name:n,type:i,maxPayloadSize:0,extendedRcode:0,version:0,do:0,z:0,rdlength:0,rdata:[]};t=m(e,t,a),r.push(a)}else{let a={name:n,type:i,class:0,ttl:0,rdlength:0,rdata:[]};t=h(e,t,a),r.push(a)}}return t}function m(e,t,n){n.maxPayloadSize=e.getUint16(t),t+=2;let r=e.getUint32(t);t+=4,n.extendedRcode=(r&4278190080)>>24,n.version=(r&16711680)>>16,n.do=(r&32768)>>15,n.z=r&32767,n.rdlength=e.getUint16(t),t+=2;let i=t+n.rdlength;for(;t<i;){let r=e.getUint16(t);t+=2;let i={optionCode:r,optionLength:e.getUint16(t),optionData:[]};t+=2;for(let n=0;n<i.optionLength;n++)i.optionData.push(e.getUint8(t++));n.rdata.push(i)}return t}function h(e,t,n){n.class=e.getUint16(t),t+=2,n.ttl=e.getUint32(t),t+=4,n.rdlength=e.getUint16(t),t+=2;for(let r=0;r<n.rdlength;r++)n.rdata.push(e.getUint8(t++));return t}function g(e,t,n,r){for(let i=0;i<n;i++){let n=[];t=_(e,t,n,0);let i=e.getUint16(t);t+=2;let a={name:n,type:i,class:0,ttl:0,rdlength:0,rdata:[]};t=h(e,t,a),r.push(a)}return t}function _(e,t,n,r=0){if(r>20)throw Error(`Too many nested labels`);let i=e.getUint8(t++);for(;i!==0;){let a=i>>6;if(a===0){let r=[];for(let n=0;n<i;n++)r.push(e.getUint8(t++));n.push(r),i=e.getUint8(t++)}else if(a===3){_(e,(i&63)<<8|e.getUint8(t++),n,r+1);break}else throw Error(`Invalid label type: ${a.toString(2)}`)}return t}function v(e,t,n){n.id=e.getUint16(t),t+=2;let r=e.getUint16(t);return t+=2,n.qr=(r&32768)>>15,n.opcode=(r&30720)>>11,n.aa=(r&1024)>>10,n.tc=(r&512)>>9,n.rd=(r&256)>>8,n.ra=(r&128)>>7,n.z=(r&112)>>4,n.rcode=r&15,n.qdcount=e.getUint16(t),t+=2,n.ancount=e.getUint16(t),t+=2,n.nscount=e.getUint16(t),t+=2,n.arcount=e.getUint16(t),t+=2,t}function y(e){return b(e).split(`.`).map(e=>x(e)?e:`xn--`+A(e)).join(`.`).toLowerCase()}function b(e){return e.replace(/[.。。]/gu,`.`).replace(/ẞ/gu,`ß`).normalize(`NFKC`).toLowerCase().replace(/[\uFE00-\uFE0F]/gu,``)}function x(e){return Array.from(e).every(S)}function S(e){return e.charCodeAt(0)<128}var C=36,w=1,T=26,E=38,D=700,O=72,k=128;function A(e){let t=k,n=0,r=O,i=[],a=Array.from(e),o=a.filter(S),s=o.length,c=s;i.push(...o),s>0&&i.push(`-`);let l=a.map(e=>e.codePointAt(0)),u=l.length;for(;c<u;){let e=2**53-1;for(let n of l)n>=t&&n<e&&(e=n);n+=(e-t)*(c+1),t=e;for(let e of l)if(e<t)n++;else if(e===t){let e=n,t=C;for(;;){let n;if(n=t<=r?w:t>=r+T?T:t-r,e<n)break;let a=n+(e-n)%(C-n);i.push(j(a)),e=M(e-n,C-n),t+=C}i.push(j(e)),r=N(n,c+1,c===s),n=0,c++}n++,t++}return i.join(``)}function j(e){return String.fromCharCode(e+22+75*Number(e<26))}function M(e,t){return Math.floor(e/t)}function N(e,t,n){e=n?M(e,D):M(e,2),e+=M(e,t);let r=0;for(;e>M((C-w)*T,2);)e=M(e,C-w),r+=36;return r+M(36*e,e+E)}var P=`0.0.4`;function F(e,t,r){let o=a(i([{qname:n(y(t)),qtype:parseInt(r,10),qclass:1}])),s=new URL(e);return s.pathname=`/dns-query`,fetch(s,{method:`POST`,mode:`cors`,headers:{Accept:`application/dns-message`,"Content-Type":`application/dns-message`},body:o}).then(e=>e.ok?e.arrayBuffer():e.text().then(t=>{throw Error(`HTTP ${e.status}: ${t}`)})).then(e=>I(d(e))).catch(e=>{throw console.error(e),e})}function I(e){let n={id:e.id,authoritativeAnswer:e.aa===1,truncated:e.tc===1,recursionAvailable:e.ra===1,responseCode:e.rcode===0?`OK`:`ERROR`,questions:e.questions.map(e=>({name:t(e.qname),type:e.qtype})),answers:e.answers.map(e=>({name:t(e.name),type:e.type,ttl:e.ttl,value:L(e.type,e.rdata)})),authorityRecords:e.authorityRecords.map(e=>({name:t(e.name),type:e.type,ttl:e.ttl,value:L(e.type,e.rdata)})),additionalRecords:e.additionalRecords.map(e=>e.type===41?{name:t(e.name),type:e.type,maxPayloadSize:e.maxPayloadSize,extendedRcode:e.extendedRcode,version:e.version,do:e.do,z:e.z,value:e.rdata}:{name:t(e.name),type:e.type,class:e.class,ttl:e.ttl,value:L(e.type,e.rdata)})};return JSON.stringify(n,null,2)}function L(e,t){switch(e){case 1:return t.join(`.`);case 28:return t.map(e=>e.toString(16)).join(`:`);default:return t}}e.resolve=F,e.version=P});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"universal-doh.umd.cjs","sources":["../lib/dns-message.ts","../lib/punycode.ts","../lib/index.ts"],"sourcesContent":["type RawDnsMessage = ArrayBuffer;\n\ninterface DnsMessage {\n id: number;\n // query (0), response (1)\n qr: BinaryFlag;\n /*\n 0 a standard query (QUERY)\n 1 an inverse query (IQUERY)\n 2 a server status request (STATUS)\n 3-15 reserved for future use\n */\n opcode: FourBitNumber;\n // Authoritative Answer\n aa: BinaryFlag;\n // TrunCation\n tc: BinaryFlag;\n // Recursion Desired\n rd: BinaryFlag;\n // Recursion Available\n ra: BinaryFlag;\n // reserved for future use - must be 0\n z: ThreeBitNumber;\n /*\n Response code\n 0 No error condition\n 1 Format error\n 2 Server failure\n 3 Name Error\n 4 Not Implemented\n 5 Refused\n 6-15 Reserved for future use.\n */\n rcode: FourBitNumber;\n // number of entries in the question section (0-65535)\n qdcount: number;\n // number of resource records in the answer section (0-65535)\n ancount: number;\n // number of name server resource records in the authority records section (0-65535)\n nscount: number;\n // number of resource records in the additional records section (0-65535)\n arcount: number;\n\n questions: DnsQuestion[];\n answers: DnsResourceRecord[];\n authorityRecords: DnsResourceRecord[];\n additionalRecords: Array<DnsOptRecord | DnsResourceRecord>;\n}\n\ntype Bytes = number[];\ntype Label = Bytes;\ntype DNSName = Label[];\n\ninterface DnsQuestion {\n qname: DNSName;\n // 16 bit unsigned integer\n qtype: number;\n // 16 bit unsigned integer\n qclass: number;\n}\n\ninterface Opt {\n optionCode: number;\n optionLength: number;\n optionData: Bytes;\n}\n\nexport interface DnsOptRecord {\n name: DNSName;\n type: 41;\n // 16 bit unsigned integer\n maxPayloadSize: number;\n // TTL field is used as the extended RCODE and flags\n // https://datatracker.ietf.org/doc/html/rfc6891#section-6.1.3\n extendedRcode: number;\n version: number;\n do: BinaryFlag;\n z: number;\n // 16 bit unsigned integer\n rdlength: number;\n // RDATA field is used for EDNS0 options\n rdata: Opt[];\n}\n\nexport interface DnsResourceRecord {\n name: DNSName;\n // 16 bit unsigned integer\n type: number;\n // 16 bit unsigned integer\n class: number;\n // 32 bit unsigned integer\n ttl: number;\n // 16 bit unsigned integer\n rdlength: number;\n rdata: Bytes;\n}\n\ntype BinaryFlag = 0 | 1;\ntype ThreeBitNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;\ntype FourBitNumber =\n | 0\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9\n | 10\n | 11\n | 12\n | 13\n | 14\n | 15;\n\nexport function dnsNameToString(name: DNSName): string {\n return name.map((label) => String.fromCharCode(...label)).join(\".\");\n}\n\nexport function stringToDNSName(name: string): DNSName {\n // we can assume string is ascii but it may not be a valid domain name\n const labels = name.split(\".\").filter((label) => label.length > 0);\n const dnsName: DNSName = [];\n for (const label of labels) {\n if (label.length < 1 || label.length > 63) {\n throw new Error(\n `Label \"${label}\" must be between 1 and 63 characters long`,\n );\n }\n\n if (label.startsWith(\"-\") || label.endsWith(\"-\")) {\n throw new Error(`Label \"${label}\" cannot start or end with a hyphen`);\n }\n\n const bytes: Bytes = [];\n\n for (const char of label) {\n const code = char.charCodeAt(0);\n if (\n (code >= 48 && code <= 57) || // '0'-'9'\n (code >= 97 && code <= 122) || // 'a'-'z'\n code === 45 // '-'\n ) {\n bytes.push(code);\n } else {\n throw new Error(`Invalid character '${char}' in label \"${label}\"`);\n }\n }\n dnsName.push(bytes);\n }\n return dnsName;\n}\n\nfunction createDnsMessage() {\n return {\n id: 0,\n qr: 0,\n opcode: 0,\n aa: 0,\n tc: 0,\n rd: 0,\n ra: 0,\n z: 0,\n rcode: 0,\n qdcount: 0,\n ancount: 0,\n nscount: 0,\n arcount: 0,\n questions: [],\n answers: [],\n authorityRecords: [],\n additionalRecords: [],\n } as DnsMessage;\n}\n\nexport function createDnsQuery(questions: DnsQuestion[]): DnsMessage {\n const message = createDnsMessage();\n message.rd = 1;\n message.qdcount += questions.length;\n message.questions.push(...questions);\n\n // notify the server that we support EDNS0 by adding an OPT record\n message.arcount += 1;\n message.additionalRecords.push({\n name: [],\n type: 41,\n maxPayloadSize: 0xffff,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: 0,\n rdata: [],\n } as DnsOptRecord);\n\n // leave space for EDNS0 padding\n message.arcount += 1;\n\n return message;\n}\n\nexport function serializeDnsQuery(query: DnsMessage): RawDnsMessage {\n const buffer = new ArrayBuffer(1024);\n const message = new DataView(buffer);\n\n let offset = 0;\n offset = serializeHeader(message, offset, query);\n\n for (const question of query.questions) {\n offset = serializeQuestion(message, offset, question);\n }\n\n // we ignore the answers and authority records for queries,\n // but we include the additional records for EDNS0 support\n if (query.answers.length > 0 || query.authorityRecords.length > 0) {\n throw new Error(\"Cannot serialize answers or authority records for query\");\n }\n\n for (const record of query.additionalRecords) {\n offset = serializeResourceRecord(message, offset, record);\n }\n\n // add padding to the message for privacy\n offset = serializeEDNS0Padding(message, offset);\n\n return buffer.slice(0, offset);\n}\n\nfunction serializeName(message: DataView, offset: number, name: DNSName) {\n // TODO: consider implementing compression\n for (const label of name) {\n message.setUint8(offset++, label.length);\n for (const byte of label) {\n message.setUint8(offset++, byte);\n }\n }\n\n // empty label to terminate the domain name\n message.setUint8(offset++, 0);\n\n return offset;\n}\n\nfunction serializeResourceRecord(\n message: DataView,\n offset: number,\n record: DnsResourceRecord | DnsOptRecord,\n) {\n offset = serializeName(message, offset, record.name);\n message.setUint16(offset, record.type);\n offset += 2;\n\n if (record.type === 41) {\n message.setUint16(offset, (<DnsOptRecord>record).maxPayloadSize);\n } else {\n message.setUint16(offset, (<DnsResourceRecord>record).class);\n }\n offset += 2;\n\n let ttl;\n if (record.type === 41) {\n ttl = (<DnsOptRecord>record).extendedRcode << 24;\n ttl |= (<DnsOptRecord>record).version << 16;\n ttl |= (<DnsOptRecord>record).do << 15;\n ttl |= (<DnsOptRecord>record).z;\n } else {\n ttl = (<DnsResourceRecord>record).ttl;\n }\n\n message.setUint32(offset, ttl);\n offset += 4;\n message.setUint16(offset, record.rdlength);\n offset += 2;\n\n if (record.type === 41) {\n // OPT record\n for (const opt of (<DnsOptRecord>record).rdata) {\n message.setUint16(offset, opt.optionCode);\n offset += 2;\n message.setUint16(offset, opt.optionLength);\n offset += 2;\n for (const byte of opt.optionData) {\n message.setUint8(offset++, byte);\n }\n }\n } else {\n for (const byte of (<DnsResourceRecord>record).rdata) {\n message.setUint8(offset++, byte);\n }\n }\n\n return offset;\n}\n\nfunction serializeEDNS0Padding(message: DataView, offset: number) {\n // RFC 8467 - Recommended Strategy: Block-Length Padding\n\n // padding header of 4 bytes must be included\n const length = offset + 4;\n const paddingLength = Math.ceil(length / 128) * 128 - length;\n\n const padding = Array.from({ length: paddingLength }, () =>\n Math.floor(Math.random() * 0xff),\n );\n\n // RFC 7830\n const paddingRecord: DnsOptRecord = {\n name: [],\n type: 41,\n maxPayloadSize: 0,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: padding.length + 4,\n rdata: [\n { optionCode: 12, optionLength: padding.length, optionData: padding },\n ],\n };\n offset = serializeResourceRecord(message, offset, paddingRecord);\n\n return offset;\n}\n\nfunction serializeQuestion(\n message: DataView,\n offset: number,\n question: DnsQuestion,\n) {\n offset = serializeName(message, offset, question.qname);\n\n message.setUint16(offset, question.qtype);\n offset += 2;\n message.setUint16(offset, question.qclass);\n offset += 2;\n\n return offset;\n}\n\nfunction serializeHeader(\n message: DataView,\n offset: number,\n header: DnsMessage,\n) {\n // message id\n message.setUint16(offset, header.id);\n offset += 2;\n\n // flags\n message.setUint16(\n offset,\n ((header.qr & 0b1) << 15) |\n ((header.opcode & 0b1111) << 11) |\n ((header.aa & 0b1) << 10) |\n ((header.tc & 0b1) << 9) |\n ((header.rd & 0b1) << 8) |\n ((header.ra & 0b1) << 7) |\n ((header.z & 0b111) << 4) |\n (header.rcode & 0b1111),\n );\n offset += 2;\n\n // question records count\n message.setUint16(4, header.qdcount);\n offset += 2;\n\n // answer records count\n message.setUint16(6, header.ancount);\n offset += 2;\n\n // authority records count\n message.setUint16(8, header.nscount);\n offset += 2;\n\n // additional records count\n message.setUint16(10, header.arcount);\n offset += 2;\n\n return offset;\n}\n\nexport function parseDnsMessage(\n raw: RawDnsMessage,\n offset: number = 0,\n): DnsMessage {\n const rawView = new DataView(raw);\n const message = createDnsMessage();\n\n offset = parseHeader(rawView, offset, message);\n\n offset = parseQuestion(rawView, offset, message.qdcount, message.questions);\n\n offset = parseResourceRecords(\n rawView,\n offset,\n message.ancount,\n message.answers,\n );\n offset = parseResourceRecords(\n rawView,\n offset,\n message.nscount,\n message.authorityRecords,\n );\n offset = parseAdditionalRecords(\n rawView,\n offset,\n message.arcount,\n message.additionalRecords,\n );\n\n if (offset !== raw.byteLength) {\n // TODO: implement support for parsing padding and replace the warning with error\n throw new Error(\n `Unexpected end of message (offset: ${offset}, length: ${raw.byteLength})`,\n );\n }\n\n return message;\n}\n\nfunction parseQuestion(\n rawView: DataView,\n offset: number,\n number: number,\n records: DnsQuestion[],\n) {\n for (let i = 0; i < number; i++) {\n const qname: DNSName = [];\n offset = parseName(rawView, offset, qname, 0);\n\n const qtype = rawView.getUint16(offset);\n offset += 2;\n const qclass = rawView.getUint16(offset);\n offset += 2;\n\n records.push({ qname, qtype, qclass });\n }\n return offset;\n}\n\nfunction parseAdditionalRecords(\n rawView: DataView,\n offset: number,\n number: number,\n records: Array<DnsResourceRecord | DnsOptRecord>,\n) {\n for (let i = 0; i < number; i++) {\n const name: DNSName = [];\n offset = parseName(rawView, offset, name, 0);\n\n const type = rawView.getUint16(offset);\n offset += 2;\n\n if (type === 41) {\n const record: DnsOptRecord = {\n name,\n type,\n maxPayloadSize: 0,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseOptRecordBody(rawView, offset, record);\n\n records.push(record);\n } else {\n const record: DnsResourceRecord = {\n name,\n type,\n class: 0,\n ttl: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseResourceRecordBody(rawView, offset, record);\n\n records.push(record);\n }\n }\n\n return offset;\n}\n\nfunction parseOptRecordBody(\n rawView: DataView,\n offset: number,\n record: DnsOptRecord,\n) {\n record.maxPayloadSize = rawView.getUint16(offset);\n offset += 2;\n\n // TTL field is used as the extended RCODE and flags\n const ttl = rawView.getUint32(offset);\n offset += 4;\n\n record.extendedRcode = (ttl & 0xff000000) >> 24;\n record.version = (ttl & 0x00ff0000) >> 16;\n record.do = ((ttl & 0x00008000) >> 15) as BinaryFlag;\n record.z = ttl & 0x00007fff;\n\n record.rdlength = rawView.getUint16(offset);\n offset += 2;\n\n const rdEnd = offset + record.rdlength;\n\n while (offset < rdEnd) {\n const optionCode = rawView.getUint16(offset);\n offset += 2;\n const optionLength = rawView.getUint16(offset);\n const opt = {\n optionCode,\n optionLength,\n optionData: [],\n } as Opt;\n offset += 2;\n for (let k = 0; k < opt.optionLength; k++) {\n opt.optionData.push(rawView.getUint8(offset++));\n }\n record.rdata.push(opt);\n }\n return offset;\n}\n\nfunction parseResourceRecordBody(\n rawView: DataView,\n offset: number,\n record: DnsResourceRecord,\n) {\n record.class = rawView.getUint16(offset);\n offset += 2;\n record.ttl = rawView.getUint32(offset);\n offset += 4;\n record.rdlength = rawView.getUint16(offset);\n offset += 2;\n for (let j = 0; j < record.rdlength; j++) {\n record.rdata.push(rawView.getUint8(offset++));\n }\n return offset;\n}\n\nfunction parseResourceRecords(\n rawView: DataView,\n offset: number,\n number: number,\n records: DnsResourceRecord[],\n) {\n for (let i = 0; i < number; i++) {\n const name: DNSName = [];\n offset = parseName(rawView, offset, name, 0);\n\n const type = rawView.getUint16(offset);\n offset += 2;\n\n const record: DnsResourceRecord = {\n name,\n type,\n class: 0,\n ttl: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseResourceRecordBody(rawView, offset, record);\n\n records.push(record);\n }\n\n return offset;\n}\n\nfunction parseName(\n view: DataView,\n offset: number,\n output: DNSName,\n recursionDepth = 0,\n) {\n if (recursionDepth > 20) {\n throw new Error(\"Too many nested labels\");\n }\n\n let length = view.getUint8(offset++);\n while (length !== 0) {\n const labelType = length >> 6;\n if (labelType === 0b00) {\n // standard label\n const label = [];\n for (let i = 0; i < length; i++) {\n label.push(view.getUint8(offset++));\n }\n output.push(label);\n length = view.getUint8(offset++);\n } else if (labelType === 0b11) {\n // compressed label\n const pointer = ((length & 0b00111111) << 8) | view.getUint8(offset++);\n // ignore the offset as we returning from a \"jump\"\n parseName(view, pointer, output, recursionDepth + 1);\n break;\n } else {\n // we do not (yet) support extended label types (RFC2671)\n throw new Error(`Invalid label type: ${labelType.toString(2)}`);\n }\n }\n return offset;\n}\n\nfunction parseHeader(raw: DataView, offset: number, output: DnsMessage) {\n output.id = raw.getUint16(offset);\n offset += 2;\n\n const flags = raw.getUint16(offset);\n offset += 2;\n\n output.qr = ((flags & 0b1000000000000000) >> 15) as BinaryFlag;\n output.opcode = ((flags & 0b0111100000000000) >> 11) as FourBitNumber;\n output.aa = ((flags & 0b0000010000000000) >> 10) as BinaryFlag;\n output.tc = ((flags & 0b0000001000000000) >> 9) as BinaryFlag;\n output.rd = ((flags & 0b0000000100000000) >> 8) as BinaryFlag;\n output.ra = ((flags & 0b0000000010000000) >> 7) as BinaryFlag;\n output.z = ((flags & 0b0000000001110000) >> 4) as ThreeBitNumber;\n output.rcode = (flags & 0b0000000000001111) as FourBitNumber;\n\n output.qdcount = raw.getUint16(offset);\n offset += 2;\n\n output.ancount = raw.getUint16(offset);\n offset += 2;\n\n output.nscount = raw.getUint16(offset);\n offset += 2;\n\n output.arcount = raw.getUint16(offset);\n offset += 2;\n\n return offset;\n}\n","export function domainToAscii(domain: string) {\n const preprocessed = preprocessDomain(domain);\n const labels = preprocessed.split(\".\");\n\n const asciiLabels = labels.map((label) => {\n if (stringIsAscii(label)) {\n return label;\n } else {\n return \"xn--\" + punycodeEncode(label);\n }\n });\n\n return asciiLabels.join(\".\").toLowerCase();\n}\n\nfunction preprocessDomain(domain: string) {\n // https://unicode.org/reports/tr46/#TableDerivationStep1\n const exceptionalMapped = domain\n .replace(/[.。。]/gu, \".\")\n .replace(/ẞ/gu, \"ß\");\n\n // we normalize the input to Unicode Normalization Form KC\n const normalized = exceptionalMapped.normalize(\"NFKC\");\n\n // TODO: we deviate from the spec here to simplify the implementation\n // this may need to be revisited in the future\n\n // we should perform case folding here (NFKC_Casefold)\n // but we simplify this step to just lowercase the input instead\n const lowercased = normalized.toLowerCase();\n\n // remove all code points in the range U+FE00 to U+FE0F\n // (Unicode variation selectors) from the input\n // as they break emoji domains handling\n const filtered = lowercased.replace(/[\\uFE00-\\uFE0F]/gu, \"\");\n\n return filtered;\n}\n\nfunction stringIsAscii(str: string): boolean {\n return Array.from(str).every(charIsAscii);\n}\n\nfunction charIsAscii(char: string): boolean {\n return char.charCodeAt(0) < 128;\n}\n\nconst base = 36;\nconst tmin = 1;\nconst tmax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initial_bias = 72;\nconst initial_n = 0x80;\n\nexport function punycodeEncode(str: string) {\n let n = initial_n;\n let delta = 0;\n let bias = initial_bias;\n const output: string[] = [];\n\n const inputChars = Array.from(str);\n\n // copy ascii chars to output\n const asciiChars = inputChars.filter(charIsAscii);\n const basicCodePoints = asciiChars.length;\n let handledCodePoints = basicCodePoints;\n output.push(...asciiChars);\n\n // append delimiter if we consumed any ascii chars\n if (basicCodePoints > 0) {\n output.push(\"-\");\n }\n\n const inputCodePoints = inputChars.map((char) => char.codePointAt(0)!);\n const inputLength = inputCodePoints.length;\n\n while (handledCodePoints < inputLength) {\n // Find the minimum code point >= n\n let m = Number.MAX_SAFE_INTEGER;\n for (const c of inputCodePoints) {\n if (c >= n && c < m) {\n m = c;\n }\n }\n\n delta += (m - n) * (handledCodePoints + 1);\n n = m;\n\n for (const c of inputCodePoints) {\n if (c < n) {\n delta++;\n } else if (c === n) {\n let q = delta;\n let k = base;\n\n while (true) {\n let t: number;\n if (k <= bias) {\n t = tmin;\n } else if (k >= bias + tmax) {\n t = tmax;\n } else {\n t = k - bias;\n }\n if (q < t) break;\n const code = t + ((q - t) % (base - t));\n output.push(encodeDigit(code));\n q = div(q - t, base - t);\n k += base;\n }\n\n output.push(encodeDigit(q));\n bias = adaptBias(\n delta,\n handledCodePoints + 1,\n handledCodePoints === basicCodePoints,\n );\n delta = 0;\n handledCodePoints++;\n }\n }\n\n delta++;\n n++;\n }\n\n return output.join(\"\");\n}\n\nfunction encodeDigit(d: number): string {\n return String.fromCharCode(d + 22 + 75 * Number(d < 26));\n}\n\nfunction div(n: number, d: number) {\n return Math.floor(n / d);\n}\n\nfunction adaptBias(delta: number, numPoints: number, firstTime: boolean) {\n if (firstTime) {\n delta = div(delta, damp);\n } else {\n delta = div(delta, 2);\n }\n\n delta += div(delta, numPoints);\n\n let k = 0;\n while (delta > div((base - tmin) * tmax, 2)) {\n delta = div(delta, base - tmin);\n\n k += 36;\n }\n\n return k + div((36 - 1 + 1) * delta, delta + skew);\n}\n","export const version = __LIB_VERSION__;\nimport type { DnsResourceRecord, DnsOptRecord } from \"./dns-message\";\nimport {\n serializeDnsQuery,\n createDnsQuery,\n parseDnsMessage,\n stringToDNSName,\n dnsNameToString,\n} from \"./dns-message\";\nimport { domainToAscii } from \"./punycode\";\n\nexport function resolve(server: string, name: string, type: string) {\n const qualifiedName = domainToAscii(name);\n\n const query = createDnsQuery([\n {\n qname: stringToDNSName(qualifiedName),\n qtype: parseInt(type, 10),\n qclass: 1, // INTERNET\n },\n ]);\n\n const buffer = serializeDnsQuery(query);\n\n const url = new URL(server);\n url.pathname = \"/dns-query\";\n\n return fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n headers: {\n Accept: \"application/dns-message\",\n \"Content-Type\": \"application/dns-message\",\n },\n body: buffer,\n })\n .then((response) => {\n if (!response.ok) {\n return response.text().then((text) => {\n throw new Error(`HTTP ${response.status}: ${text}`);\n });\n }\n return response.arrayBuffer();\n })\n .then((buffer) => {\n const message = parseDnsMessage(buffer);\n return formatDnsMessage(message);\n })\n .catch((error) => {\n console.error(error);\n throw error;\n });\n}\n\nfunction formatDnsMessage(message: ReturnType<typeof parseDnsMessage>) {\n const formatted = {\n id: message.id,\n authoritativeAnswer: message.aa === 1,\n truncated: message.tc === 1,\n recursionAvailable: message.ra === 1,\n responseCode: message.rcode === 0 ? \"OK\" : \"ERROR\",\n questions: message.questions.map((question) => ({\n name: dnsNameToString(question.qname),\n type: question.qtype,\n })),\n answers: message.answers.map((record) => ({\n name: dnsNameToString(record.name),\n type: record.type,\n ttl: record.ttl,\n value: formatRData(record.type, record.rdata),\n })),\n authorityRecords: message.authorityRecords.map((record) => ({\n name: dnsNameToString(record.name),\n type: record.type,\n ttl: record.ttl,\n value: formatRData(record.type, record.rdata),\n })),\n additionalRecords: message.additionalRecords.map((record) => {\n if (record.type === 41) {\n return {\n name: dnsNameToString(record.name),\n type: record.type,\n maxPayloadSize: (<DnsOptRecord>record).maxPayloadSize,\n extendedRcode: (<DnsOptRecord>record).extendedRcode,\n version: (<DnsOptRecord>record).version,\n do: (<DnsOptRecord>record).do,\n z: (<DnsOptRecord>record).z,\n value: (<DnsOptRecord>record).rdata,\n };\n } else {\n return {\n name: dnsNameToString(record.name),\n type: record.type,\n class: (<DnsResourceRecord>record).class,\n ttl: (<DnsResourceRecord>record).ttl,\n value: formatRData(record.type, (<DnsResourceRecord>record).rdata),\n };\n }\n }),\n };\n return JSON.stringify(formatted, null, 2);\n}\n\nfunction formatRData(recordType: number, rdata: number[]) {\n // TODO: this has to be implemented in the parser as the data\n // may include dns names and labels like for CNAMEs\n // or TXT (where there are labels but merged into a single string)\n switch (recordType) {\n case 1:\n return rdata.join(\".\");\n case 28:\n return rdata.map((c) => c.toString(16)).join(\":\");\n default:\n return rdata;\n }\n}\n"],"names":["dnsNameToString","name","label","stringToDNSName","labels","dnsName","bytes","char","code","createDnsMessage","createDnsQuery","questions","message","serializeDnsQuery","query","buffer","offset","serializeHeader","question","serializeQuestion","record","serializeResourceRecord","serializeEDNS0Padding","serializeName","byte","ttl","opt","length","paddingLength","padding","paddingRecord","header","parseDnsMessage","raw","rawView","parseHeader","parseQuestion","parseResourceRecords","parseAdditionalRecords","number","records","i","qname","parseName","qtype","qclass","type","parseOptRecordBody","parseResourceRecordBody","rdEnd","optionCode","optionLength","k","j","view","output","recursionDepth","labelType","pointer","flags","domainToAscii","domain","preprocessDomain","stringIsAscii","punycodeEncode","str","charIsAscii","base","tmin","tmax","skew","damp","initial_bias","initial_n","delta","bias","inputChars","asciiChars","basicCodePoints","handledCodePoints","inputCodePoints","inputLength","m","c","q","t","encodeDigit","div","adaptBias","d","n","numPoints","firstTime","version","resolve","server","qualifiedName","url","response","text","formatDnsMessage","error","formatted","formatRData","recordType","rdata"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"universal-doh.umd.cjs","names":[],"sources":["../lib/dns-message.ts","../lib/punycode.ts","../lib/index.ts"],"sourcesContent":["type RawDnsMessage = ArrayBuffer;\n\ninterface DnsMessage {\n id: number;\n // query (0), response (1)\n qr: BinaryFlag;\n /*\n 0 a standard query (QUERY)\n 1 an inverse query (IQUERY)\n 2 a server status request (STATUS)\n 3-15 reserved for future use\n */\n opcode: FourBitNumber;\n // Authoritative Answer\n aa: BinaryFlag;\n // TrunCation\n tc: BinaryFlag;\n // Recursion Desired\n rd: BinaryFlag;\n // Recursion Available\n ra: BinaryFlag;\n // reserved for future use - must be 0\n z: ThreeBitNumber;\n /*\n Response code\n 0 No error condition\n 1 Format error\n 2 Server failure\n 3 Name Error\n 4 Not Implemented\n 5 Refused\n 6-15 Reserved for future use.\n */\n rcode: FourBitNumber;\n // number of entries in the question section (0-65535)\n qdcount: number;\n // number of resource records in the answer section (0-65535)\n ancount: number;\n // number of name server resource records in the authority records section (0-65535)\n nscount: number;\n // number of resource records in the additional records section (0-65535)\n arcount: number;\n\n questions: DnsQuestion[];\n answers: DnsResourceRecord[];\n authorityRecords: DnsResourceRecord[];\n additionalRecords: Array<DnsOptRecord | DnsResourceRecord>;\n}\n\ntype Bytes = number[];\ntype Label = Bytes;\ntype DNSName = Label[];\n\ninterface DnsQuestion {\n qname: DNSName;\n // 16 bit unsigned integer\n qtype: number;\n // 16 bit unsigned integer\n qclass: number;\n}\n\ninterface Opt {\n optionCode: number;\n optionLength: number;\n optionData: Bytes;\n}\n\nexport interface DnsOptRecord {\n name: DNSName;\n type: 41;\n // 16 bit unsigned integer\n maxPayloadSize: number;\n // TTL field is used as the extended RCODE and flags\n // https://datatracker.ietf.org/doc/html/rfc6891#section-6.1.3\n extendedRcode: number;\n version: number;\n do: BinaryFlag;\n z: number;\n // 16 bit unsigned integer\n rdlength: number;\n // RDATA field is used for EDNS0 options\n rdata: Opt[];\n}\n\nexport interface DnsResourceRecord {\n name: DNSName;\n // 16 bit unsigned integer\n type: number;\n // 16 bit unsigned integer\n class: number;\n // 32 bit unsigned integer\n ttl: number;\n // 16 bit unsigned integer\n rdlength: number;\n rdata: Bytes;\n}\n\ntype BinaryFlag = 0 | 1;\ntype ThreeBitNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;\ntype FourBitNumber =\n | 0\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9\n | 10\n | 11\n | 12\n | 13\n | 14\n | 15;\n\nexport function dnsNameToString(name: DNSName): string {\n return name.map((label) => String.fromCharCode(...label)).join(\".\");\n}\n\nexport function stringToDNSName(name: string): DNSName {\n // we can assume string is ascii but it may not be a valid domain name\n const labels = name.split(\".\").filter((label) => label.length > 0);\n const dnsName: DNSName = [];\n for (const label of labels) {\n if (label.length < 1 || label.length > 63) {\n throw new Error(\n `Label \"${label}\" must be between 1 and 63 characters long`,\n );\n }\n\n if (label.startsWith(\"-\") || label.endsWith(\"-\")) {\n throw new Error(`Label \"${label}\" cannot start or end with a hyphen`);\n }\n\n const bytes: Bytes = [];\n\n for (const char of label) {\n const code = char.charCodeAt(0);\n if (\n (code >= 48 && code <= 57) || // '0'-'9'\n (code >= 97 && code <= 122) || // 'a'-'z'\n code === 45 // '-'\n ) {\n bytes.push(code);\n } else {\n throw new Error(`Invalid character '${char}' in label \"${label}\"`);\n }\n }\n dnsName.push(bytes);\n }\n return dnsName;\n}\n\nfunction createDnsMessage() {\n return {\n id: 0,\n qr: 0,\n opcode: 0,\n aa: 0,\n tc: 0,\n rd: 0,\n ra: 0,\n z: 0,\n rcode: 0,\n qdcount: 0,\n ancount: 0,\n nscount: 0,\n arcount: 0,\n questions: [],\n answers: [],\n authorityRecords: [],\n additionalRecords: [],\n } as DnsMessage;\n}\n\nexport function createDnsQuery(questions: DnsQuestion[]): DnsMessage {\n const message = createDnsMessage();\n message.rd = 1;\n message.qdcount += questions.length;\n message.questions.push(...questions);\n\n // notify the server that we support EDNS0 by adding an OPT record\n message.arcount += 1;\n message.additionalRecords.push({\n name: [],\n type: 41,\n maxPayloadSize: 0xffff,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: 0,\n rdata: [],\n } as DnsOptRecord);\n\n // leave space for EDNS0 padding\n message.arcount += 1;\n\n return message;\n}\n\nexport function serializeDnsQuery(query: DnsMessage): RawDnsMessage {\n const buffer = new ArrayBuffer(1024);\n const message = new DataView(buffer);\n\n let offset = 0;\n offset = serializeHeader(message, offset, query);\n\n for (const question of query.questions) {\n offset = serializeQuestion(message, offset, question);\n }\n\n // we ignore the answers and authority records for queries,\n // but we include the additional records for EDNS0 support\n if (query.answers.length > 0 || query.authorityRecords.length > 0) {\n throw new Error(\"Cannot serialize answers or authority records for query\");\n }\n\n for (const record of query.additionalRecords) {\n offset = serializeResourceRecord(message, offset, record);\n }\n\n // add padding to the message for privacy\n offset = serializeEDNS0Padding(message, offset);\n\n return buffer.slice(0, offset);\n}\n\nfunction serializeName(message: DataView, offset: number, name: DNSName) {\n // TODO: consider implementing compression\n for (const label of name) {\n message.setUint8(offset++, label.length);\n for (const byte of label) {\n message.setUint8(offset++, byte);\n }\n }\n\n // empty label to terminate the domain name\n message.setUint8(offset++, 0);\n\n return offset;\n}\n\nfunction serializeResourceRecord(\n message: DataView,\n offset: number,\n record: DnsResourceRecord | DnsOptRecord,\n) {\n offset = serializeName(message, offset, record.name);\n message.setUint16(offset, record.type);\n offset += 2;\n\n if (record.type === 41) {\n message.setUint16(offset, (<DnsOptRecord>record).maxPayloadSize);\n } else {\n message.setUint16(offset, (<DnsResourceRecord>record).class);\n }\n offset += 2;\n\n let ttl;\n if (record.type === 41) {\n ttl = (<DnsOptRecord>record).extendedRcode << 24;\n ttl |= (<DnsOptRecord>record).version << 16;\n ttl |= (<DnsOptRecord>record).do << 15;\n ttl |= (<DnsOptRecord>record).z;\n } else {\n ttl = (<DnsResourceRecord>record).ttl;\n }\n\n message.setUint32(offset, ttl);\n offset += 4;\n message.setUint16(offset, record.rdlength);\n offset += 2;\n\n if (record.type === 41) {\n // OPT record\n for (const opt of (<DnsOptRecord>record).rdata) {\n message.setUint16(offset, opt.optionCode);\n offset += 2;\n message.setUint16(offset, opt.optionLength);\n offset += 2;\n for (const byte of opt.optionData) {\n message.setUint8(offset++, byte);\n }\n }\n } else {\n for (const byte of (<DnsResourceRecord>record).rdata) {\n message.setUint8(offset++, byte);\n }\n }\n\n return offset;\n}\n\nfunction serializeEDNS0Padding(message: DataView, offset: number) {\n // RFC 8467 - Recommended Strategy: Block-Length Padding\n\n // padding header of 4 bytes must be included\n const length = offset + 4;\n const paddingLength = Math.ceil(length / 128) * 128 - length;\n\n const padding = Array.from({ length: paddingLength }, () =>\n Math.floor(Math.random() * 0xff),\n );\n\n // RFC 7830\n const paddingRecord: DnsOptRecord = {\n name: [],\n type: 41,\n maxPayloadSize: 0,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: padding.length + 4,\n rdata: [\n { optionCode: 12, optionLength: padding.length, optionData: padding },\n ],\n };\n offset = serializeResourceRecord(message, offset, paddingRecord);\n\n return offset;\n}\n\nfunction serializeQuestion(\n message: DataView,\n offset: number,\n question: DnsQuestion,\n) {\n offset = serializeName(message, offset, question.qname);\n\n message.setUint16(offset, question.qtype);\n offset += 2;\n message.setUint16(offset, question.qclass);\n offset += 2;\n\n return offset;\n}\n\nfunction serializeHeader(\n message: DataView,\n offset: number,\n header: DnsMessage,\n) {\n // message id\n message.setUint16(offset, header.id);\n offset += 2;\n\n // flags\n message.setUint16(\n offset,\n ((header.qr & 0b1) << 15) |\n ((header.opcode & 0b1111) << 11) |\n ((header.aa & 0b1) << 10) |\n ((header.tc & 0b1) << 9) |\n ((header.rd & 0b1) << 8) |\n ((header.ra & 0b1) << 7) |\n ((header.z & 0b111) << 4) |\n (header.rcode & 0b1111),\n );\n offset += 2;\n\n // question records count\n message.setUint16(4, header.qdcount);\n offset += 2;\n\n // answer records count\n message.setUint16(6, header.ancount);\n offset += 2;\n\n // authority records count\n message.setUint16(8, header.nscount);\n offset += 2;\n\n // additional records count\n message.setUint16(10, header.arcount);\n offset += 2;\n\n return offset;\n}\n\nexport function parseDnsMessage(\n raw: RawDnsMessage,\n offset: number = 0,\n): DnsMessage {\n const rawView = new DataView(raw);\n const message = createDnsMessage();\n\n offset = parseHeader(rawView, offset, message);\n\n offset = parseQuestion(rawView, offset, message.qdcount, message.questions);\n\n offset = parseResourceRecords(\n rawView,\n offset,\n message.ancount,\n message.answers,\n );\n offset = parseResourceRecords(\n rawView,\n offset,\n message.nscount,\n message.authorityRecords,\n );\n offset = parseAdditionalRecords(\n rawView,\n offset,\n message.arcount,\n message.additionalRecords,\n );\n\n if (offset !== raw.byteLength) {\n // TODO: implement support for parsing padding and replace the warning with error\n throw new Error(\n `Unexpected end of message (offset: ${offset}, length: ${raw.byteLength})`,\n );\n }\n\n return message;\n}\n\nfunction parseQuestion(\n rawView: DataView,\n offset: number,\n number: number,\n records: DnsQuestion[],\n) {\n for (let i = 0; i < number; i++) {\n const qname: DNSName = [];\n offset = parseName(rawView, offset, qname, 0);\n\n const qtype = rawView.getUint16(offset);\n offset += 2;\n const qclass = rawView.getUint16(offset);\n offset += 2;\n\n records.push({ qname, qtype, qclass });\n }\n return offset;\n}\n\nfunction parseAdditionalRecords(\n rawView: DataView,\n offset: number,\n number: number,\n records: Array<DnsResourceRecord | DnsOptRecord>,\n) {\n for (let i = 0; i < number; i++) {\n const name: DNSName = [];\n offset = parseName(rawView, offset, name, 0);\n\n const type = rawView.getUint16(offset);\n offset += 2;\n\n if (type === 41) {\n const record: DnsOptRecord = {\n name,\n type,\n maxPayloadSize: 0,\n extendedRcode: 0,\n version: 0,\n do: 0,\n z: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseOptRecordBody(rawView, offset, record);\n\n records.push(record);\n } else {\n const record: DnsResourceRecord = {\n name,\n type,\n class: 0,\n ttl: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseResourceRecordBody(rawView, offset, record);\n\n records.push(record);\n }\n }\n\n return offset;\n}\n\nfunction parseOptRecordBody(\n rawView: DataView,\n offset: number,\n record: DnsOptRecord,\n) {\n record.maxPayloadSize = rawView.getUint16(offset);\n offset += 2;\n\n // TTL field is used as the extended RCODE and flags\n const ttl = rawView.getUint32(offset);\n offset += 4;\n\n record.extendedRcode = (ttl & 0xff000000) >> 24;\n record.version = (ttl & 0x00ff0000) >> 16;\n record.do = ((ttl & 0x00008000) >> 15) as BinaryFlag;\n record.z = ttl & 0x00007fff;\n\n record.rdlength = rawView.getUint16(offset);\n offset += 2;\n\n const rdEnd = offset + record.rdlength;\n\n while (offset < rdEnd) {\n const optionCode = rawView.getUint16(offset);\n offset += 2;\n const optionLength = rawView.getUint16(offset);\n const opt = {\n optionCode,\n optionLength,\n optionData: [],\n } as Opt;\n offset += 2;\n for (let k = 0; k < opt.optionLength; k++) {\n opt.optionData.push(rawView.getUint8(offset++));\n }\n record.rdata.push(opt);\n }\n return offset;\n}\n\nfunction parseResourceRecordBody(\n rawView: DataView,\n offset: number,\n record: DnsResourceRecord,\n) {\n record.class = rawView.getUint16(offset);\n offset += 2;\n record.ttl = rawView.getUint32(offset);\n offset += 4;\n record.rdlength = rawView.getUint16(offset);\n offset += 2;\n for (let j = 0; j < record.rdlength; j++) {\n record.rdata.push(rawView.getUint8(offset++));\n }\n return offset;\n}\n\nfunction parseResourceRecords(\n rawView: DataView,\n offset: number,\n number: number,\n records: DnsResourceRecord[],\n) {\n for (let i = 0; i < number; i++) {\n const name: DNSName = [];\n offset = parseName(rawView, offset, name, 0);\n\n const type = rawView.getUint16(offset);\n offset += 2;\n\n const record: DnsResourceRecord = {\n name,\n type,\n class: 0,\n ttl: 0,\n rdlength: 0,\n rdata: [],\n };\n\n offset = parseResourceRecordBody(rawView, offset, record);\n\n records.push(record);\n }\n\n return offset;\n}\n\nfunction parseName(\n view: DataView,\n offset: number,\n output: DNSName,\n recursionDepth = 0,\n) {\n if (recursionDepth > 20) {\n throw new Error(\"Too many nested labels\");\n }\n\n let length = view.getUint8(offset++);\n while (length !== 0) {\n const labelType = length >> 6;\n if (labelType === 0b00) {\n // standard label\n const label = [];\n for (let i = 0; i < length; i++) {\n label.push(view.getUint8(offset++));\n }\n output.push(label);\n length = view.getUint8(offset++);\n } else if (labelType === 0b11) {\n // compressed label\n const pointer = ((length & 0b00111111) << 8) | view.getUint8(offset++);\n // ignore the offset as we returning from a \"jump\"\n parseName(view, pointer, output, recursionDepth + 1);\n break;\n } else {\n // we do not (yet) support extended label types (RFC2671)\n throw new Error(`Invalid label type: ${labelType.toString(2)}`);\n }\n }\n return offset;\n}\n\nfunction parseHeader(raw: DataView, offset: number, output: DnsMessage) {\n output.id = raw.getUint16(offset);\n offset += 2;\n\n const flags = raw.getUint16(offset);\n offset += 2;\n\n output.qr = ((flags & 0b1000000000000000) >> 15) as BinaryFlag;\n output.opcode = ((flags & 0b0111100000000000) >> 11) as FourBitNumber;\n output.aa = ((flags & 0b0000010000000000) >> 10) as BinaryFlag;\n output.tc = ((flags & 0b0000001000000000) >> 9) as BinaryFlag;\n output.rd = ((flags & 0b0000000100000000) >> 8) as BinaryFlag;\n output.ra = ((flags & 0b0000000010000000) >> 7) as BinaryFlag;\n output.z = ((flags & 0b0000000001110000) >> 4) as ThreeBitNumber;\n output.rcode = (flags & 0b0000000000001111) as FourBitNumber;\n\n output.qdcount = raw.getUint16(offset);\n offset += 2;\n\n output.ancount = raw.getUint16(offset);\n offset += 2;\n\n output.nscount = raw.getUint16(offset);\n offset += 2;\n\n output.arcount = raw.getUint16(offset);\n offset += 2;\n\n return offset;\n}\n","export function domainToAscii(domain: string) {\n const preprocessed = preprocessDomain(domain);\n const labels = preprocessed.split(\".\");\n\n const asciiLabels = labels.map((label) => {\n if (stringIsAscii(label)) {\n return label;\n } else {\n return \"xn--\" + punycodeEncode(label);\n }\n });\n\n return asciiLabels.join(\".\").toLowerCase();\n}\n\nfunction preprocessDomain(domain: string) {\n // https://unicode.org/reports/tr46/#TableDerivationStep1\n const exceptionalMapped = domain\n .replace(/[.。。]/gu, \".\")\n .replace(/ẞ/gu, \"ß\");\n\n // we normalize the input to Unicode Normalization Form KC\n const normalized = exceptionalMapped.normalize(\"NFKC\");\n\n // TODO: we deviate from the spec here to simplify the implementation\n // this may need to be revisited in the future\n\n // we should perform case folding here (NFKC_Casefold)\n // but we simplify this step to just lowercase the input instead\n const lowercased = normalized.toLowerCase();\n\n // remove all code points in the range U+FE00 to U+FE0F\n // (Unicode variation selectors) from the input\n // as they break emoji domains handling\n const filtered = lowercased.replace(/[\\uFE00-\\uFE0F]/gu, \"\");\n\n return filtered;\n}\n\nfunction stringIsAscii(str: string): boolean {\n return Array.from(str).every(charIsAscii);\n}\n\nfunction charIsAscii(char: string): boolean {\n return char.charCodeAt(0) < 128;\n}\n\nconst base = 36;\nconst tmin = 1;\nconst tmax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initial_bias = 72;\nconst initial_n = 0x80;\n\nexport function punycodeEncode(str: string) {\n let n = initial_n;\n let delta = 0;\n let bias = initial_bias;\n const output: string[] = [];\n\n const inputChars = Array.from(str);\n\n // copy ascii chars to output\n const asciiChars = inputChars.filter(charIsAscii);\n const basicCodePoints = asciiChars.length;\n let handledCodePoints = basicCodePoints;\n output.push(...asciiChars);\n\n // append delimiter if we consumed any ascii chars\n if (basicCodePoints > 0) {\n output.push(\"-\");\n }\n\n const inputCodePoints = inputChars.map((char) => char.codePointAt(0)!);\n const inputLength = inputCodePoints.length;\n\n while (handledCodePoints < inputLength) {\n // Find the minimum code point >= n\n let m = Number.MAX_SAFE_INTEGER;\n for (const c of inputCodePoints) {\n if (c >= n && c < m) {\n m = c;\n }\n }\n\n delta += (m - n) * (handledCodePoints + 1);\n n = m;\n\n for (const c of inputCodePoints) {\n if (c < n) {\n delta++;\n } else if (c === n) {\n let q = delta;\n let k = base;\n\n while (true) {\n let t: number;\n if (k <= bias) {\n t = tmin;\n } else if (k >= bias + tmax) {\n t = tmax;\n } else {\n t = k - bias;\n }\n if (q < t) break;\n const code = t + ((q - t) % (base - t));\n output.push(encodeDigit(code));\n q = div(q - t, base - t);\n k += base;\n }\n\n output.push(encodeDigit(q));\n bias = adaptBias(\n delta,\n handledCodePoints + 1,\n handledCodePoints === basicCodePoints,\n );\n delta = 0;\n handledCodePoints++;\n }\n }\n\n delta++;\n n++;\n }\n\n return output.join(\"\");\n}\n\nfunction encodeDigit(d: number): string {\n return String.fromCharCode(d + 22 + 75 * Number(d < 26));\n}\n\nfunction div(n: number, d: number) {\n return Math.floor(n / d);\n}\n\nfunction adaptBias(delta: number, numPoints: number, firstTime: boolean) {\n if (firstTime) {\n delta = div(delta, damp);\n } else {\n delta = div(delta, 2);\n }\n\n delta += div(delta, numPoints);\n\n let k = 0;\n while (delta > div((base - tmin) * tmax, 2)) {\n delta = div(delta, base - tmin);\n\n k += 36;\n }\n\n return k + div((36 - 1 + 1) * delta, delta + skew);\n}\n","export const version = __LIB_VERSION__;\nimport type { DnsResourceRecord, DnsOptRecord } from \"./dns-message\";\nimport {\n serializeDnsQuery,\n createDnsQuery,\n parseDnsMessage,\n stringToDNSName,\n dnsNameToString,\n} from \"./dns-message\";\nimport { domainToAscii } from \"./punycode\";\n\nexport function resolve(server: string, name: string, type: string) {\n const qualifiedName = domainToAscii(name);\n\n const query = createDnsQuery([\n {\n qname: stringToDNSName(qualifiedName),\n qtype: parseInt(type, 10),\n qclass: 1, // INTERNET\n },\n ]);\n\n const buffer = serializeDnsQuery(query);\n\n const url = new URL(server);\n url.pathname = \"/dns-query\";\n\n return fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n headers: {\n Accept: \"application/dns-message\",\n \"Content-Type\": \"application/dns-message\",\n },\n body: buffer,\n })\n .then((response) => {\n if (!response.ok) {\n return response.text().then((text) => {\n throw new Error(`HTTP ${response.status}: ${text}`);\n });\n }\n return response.arrayBuffer();\n })\n .then((buffer) => {\n const message = parseDnsMessage(buffer);\n return formatDnsMessage(message);\n })\n .catch((error) => {\n console.error(error);\n throw error;\n });\n}\n\nfunction formatDnsMessage(message: ReturnType<typeof parseDnsMessage>) {\n const formatted = {\n id: message.id,\n authoritativeAnswer: message.aa === 1,\n truncated: message.tc === 1,\n recursionAvailable: message.ra === 1,\n responseCode: message.rcode === 0 ? \"OK\" : \"ERROR\",\n questions: message.questions.map((question) => ({\n name: dnsNameToString(question.qname),\n type: question.qtype,\n })),\n answers: message.answers.map((record) => ({\n name: dnsNameToString(record.name),\n type: record.type,\n ttl: record.ttl,\n value: formatRData(record.type, record.rdata),\n })),\n authorityRecords: message.authorityRecords.map((record) => ({\n name: dnsNameToString(record.name),\n type: record.type,\n ttl: record.ttl,\n value: formatRData(record.type, record.rdata),\n })),\n additionalRecords: message.additionalRecords.map((record) => {\n if (record.type === 41) {\n return {\n name: dnsNameToString(record.name),\n type: record.type,\n maxPayloadSize: (<DnsOptRecord>record).maxPayloadSize,\n extendedRcode: (<DnsOptRecord>record).extendedRcode,\n version: (<DnsOptRecord>record).version,\n do: (<DnsOptRecord>record).do,\n z: (<DnsOptRecord>record).z,\n value: (<DnsOptRecord>record).rdata,\n };\n } else {\n return {\n name: dnsNameToString(record.name),\n type: record.type,\n class: (<DnsResourceRecord>record).class,\n ttl: (<DnsResourceRecord>record).ttl,\n value: formatRData(record.type, (<DnsResourceRecord>record).rdata),\n };\n }\n }),\n };\n return JSON.stringify(formatted, null, 2);\n}\n\nfunction formatRData(recordType: number, rdata: number[]) {\n // TODO: this has to be implemented in the parser as the data\n // may include dns names and labels like for CNAMEs\n // or TXT (where there are labels but merged into a single string)\n switch (recordType) {\n case 1:\n return rdata.join(\".\");\n case 28:\n return rdata.map((c) => c.toString(16)).join(\":\");\n default:\n return rdata;\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "universal-doh",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "DNS over HTTPS universal TypeScript library",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"universal-doh",
|
|
@@ -65,18 +65,20 @@
|
|
|
65
65
|
"test": "vitest"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"@eslint/js": "^
|
|
68
|
+
"@eslint/js": "^10.0.1",
|
|
69
|
+
"@microsoft/api-extractor": "^7.58.2",
|
|
69
70
|
"@types/eslint__js": "^8.42.3",
|
|
70
|
-
"@vitest/coverage-v8": "^
|
|
71
|
-
"eslint": "^
|
|
72
|
-
"eslint-config-prettier": "^
|
|
73
|
-
"eslint-plugin-prettier": "^5.
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"typescript
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
71
|
+
"@vitest/coverage-v8": "^4.1.4",
|
|
72
|
+
"eslint": "^10.2.0",
|
|
73
|
+
"eslint-config-prettier": "^10.1.8",
|
|
74
|
+
"eslint-plugin-prettier": "^5.5.5",
|
|
75
|
+
"globals": "^17.5.0",
|
|
76
|
+
"prettier": "^3.8.2",
|
|
77
|
+
"typescript": "^6.0.2",
|
|
78
|
+
"typescript-eslint": "^8.58.2",
|
|
79
|
+
"unplugin-dts": "^1.0.0-beta.6",
|
|
80
|
+
"vite": "^8.0.8",
|
|
81
|
+
"vitest": "^4.1.4"
|
|
80
82
|
},
|
|
81
83
|
"engines": {
|
|
82
84
|
"node": ">=18.0.0"
|