@push.rocks/smartdns 6.1.1 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts_server/classes.dnssec.d.ts +31 -0
- package/dist_ts_server/classes.dnssec.js +139 -0
- package/dist_ts_server/classes.dnsserver.d.ts +22 -2
- package/dist_ts_server/classes.dnsserver.js +241 -8
- package/dist_ts_server/plugins.d.ts +1 -1
- package/dist_ts_server/plugins.js +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
interface DnssecZone {
|
|
2
|
+
zone: string;
|
|
3
|
+
algorithm: 'ECDSA' | 'ED25519' | 'RSA';
|
|
4
|
+
keySize: number;
|
|
5
|
+
days: number;
|
|
6
|
+
}
|
|
7
|
+
interface DnssecKeyPair {
|
|
8
|
+
privateKey: string;
|
|
9
|
+
publicKey: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class DnsSec {
|
|
12
|
+
private zone;
|
|
13
|
+
private keyPair;
|
|
14
|
+
private ec?;
|
|
15
|
+
private eddsa?;
|
|
16
|
+
constructor(zone: DnssecZone);
|
|
17
|
+
private generateKeyPair;
|
|
18
|
+
getAlgorithmNumber(): number;
|
|
19
|
+
signData(data: Buffer): Buffer;
|
|
20
|
+
private generateDNSKEY;
|
|
21
|
+
private computeKeyTag;
|
|
22
|
+
private getDNSKEYRecord;
|
|
23
|
+
getDSRecord(): string;
|
|
24
|
+
getKeyPair(): DnssecKeyPair;
|
|
25
|
+
getDsAndKeyPair(): {
|
|
26
|
+
keyPair: DnssecKeyPair;
|
|
27
|
+
dsRecord: string;
|
|
28
|
+
dnskeyRecord: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// Import necessary plugins from plugins.ts
|
|
2
|
+
import * as plugins from './plugins.js';
|
|
3
|
+
export class DnsSec {
|
|
4
|
+
constructor(zone) {
|
|
5
|
+
this.zone = zone;
|
|
6
|
+
// Initialize the appropriate cryptographic instance based on the algorithm
|
|
7
|
+
switch (this.zone.algorithm) {
|
|
8
|
+
case 'ECDSA':
|
|
9
|
+
this.ec = new plugins.elliptic.ec('p256'); // Use P-256 curve for ECDSA
|
|
10
|
+
break;
|
|
11
|
+
case 'ED25519':
|
|
12
|
+
this.eddsa = new plugins.elliptic.eddsa('ed25519');
|
|
13
|
+
break;
|
|
14
|
+
case 'RSA':
|
|
15
|
+
// RSA implementation would go here
|
|
16
|
+
throw new Error('RSA algorithm is not yet implemented.');
|
|
17
|
+
default:
|
|
18
|
+
throw new Error(`Unsupported algorithm: ${this.zone.algorithm}`);
|
|
19
|
+
}
|
|
20
|
+
// Generate the key pair
|
|
21
|
+
this.keyPair = this.generateKeyPair();
|
|
22
|
+
}
|
|
23
|
+
generateKeyPair() {
|
|
24
|
+
let privateKey;
|
|
25
|
+
let publicKey;
|
|
26
|
+
switch (this.zone.algorithm) {
|
|
27
|
+
case 'ECDSA':
|
|
28
|
+
if (!this.ec)
|
|
29
|
+
throw new Error('EC instance is not initialized.');
|
|
30
|
+
const ecKeyPair = this.ec.genKeyPair();
|
|
31
|
+
privateKey = ecKeyPair.getPrivate('hex');
|
|
32
|
+
publicKey = ecKeyPair.getPublic(false, 'hex'); // Uncompressed format
|
|
33
|
+
break;
|
|
34
|
+
case 'ED25519':
|
|
35
|
+
if (!this.eddsa)
|
|
36
|
+
throw new Error('EdDSA instance is not initialized.');
|
|
37
|
+
const secret = plugins.crypto.randomBytes(32);
|
|
38
|
+
const edKeyPair = this.eddsa.keyFromSecret(secret);
|
|
39
|
+
privateKey = edKeyPair.getSecret('hex');
|
|
40
|
+
publicKey = edKeyPair.getPublic('hex');
|
|
41
|
+
break;
|
|
42
|
+
case 'RSA':
|
|
43
|
+
// RSA key generation would be implemented here
|
|
44
|
+
throw new Error('RSA key generation is not yet implemented.');
|
|
45
|
+
default:
|
|
46
|
+
throw new Error(`Unsupported algorithm: ${this.zone.algorithm}`);
|
|
47
|
+
}
|
|
48
|
+
return { privateKey, publicKey };
|
|
49
|
+
}
|
|
50
|
+
getAlgorithmNumber() {
|
|
51
|
+
switch (this.zone.algorithm) {
|
|
52
|
+
case 'ECDSA':
|
|
53
|
+
return 13; // ECDSAP256SHA256
|
|
54
|
+
case 'ED25519':
|
|
55
|
+
return 15;
|
|
56
|
+
case 'RSA':
|
|
57
|
+
return 8; // RSASHA256
|
|
58
|
+
default:
|
|
59
|
+
throw new Error(`Unsupported algorithm: ${this.zone.algorithm}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
signData(data) {
|
|
63
|
+
// Sign the data using the private key
|
|
64
|
+
const keyPair = this.ec.keyFromPrivate(this.keyPair.privateKey, 'hex');
|
|
65
|
+
const signature = keyPair.sign(plugins.crypto.createHash('sha256').update(data).digest());
|
|
66
|
+
return Buffer.from(signature.toDER());
|
|
67
|
+
}
|
|
68
|
+
generateDNSKEY() {
|
|
69
|
+
const flags = 256; // 256 indicates a Zone Signing Key (ZSK)
|
|
70
|
+
const protocol = 3; // Must be 3 according to RFC
|
|
71
|
+
const algorithm = this.getAlgorithmNumber();
|
|
72
|
+
let publicKeyData;
|
|
73
|
+
switch (this.zone.algorithm) {
|
|
74
|
+
case 'ECDSA':
|
|
75
|
+
if (!this.ec)
|
|
76
|
+
throw new Error('EC instance is not initialized.');
|
|
77
|
+
const ecPublicKey = this.ec.keyFromPublic(this.keyPair.publicKey, 'hex').getPublic();
|
|
78
|
+
const x = ecPublicKey.getX().toArrayLike(Buffer, 'be', 32);
|
|
79
|
+
const y = ecPublicKey.getY().toArrayLike(Buffer, 'be', 32);
|
|
80
|
+
publicKeyData = Buffer.concat([x, y]);
|
|
81
|
+
break;
|
|
82
|
+
case 'ED25519':
|
|
83
|
+
publicKeyData = Buffer.from(this.keyPair.publicKey, 'hex');
|
|
84
|
+
break;
|
|
85
|
+
case 'RSA':
|
|
86
|
+
// RSA public key extraction would go here
|
|
87
|
+
throw new Error('RSA public key extraction is not yet implemented.');
|
|
88
|
+
default:
|
|
89
|
+
throw new Error(`Unsupported algorithm: ${this.zone.algorithm}`);
|
|
90
|
+
}
|
|
91
|
+
// Construct the DNSKEY RDATA
|
|
92
|
+
const dnskeyRdata = Buffer.concat([
|
|
93
|
+
Buffer.from([flags >> 8, flags & 0xff]), // Flags (2 bytes)
|
|
94
|
+
Buffer.from([protocol]), // Protocol (1 byte)
|
|
95
|
+
Buffer.from([algorithm]), // Algorithm (1 byte)
|
|
96
|
+
publicKeyData, // Public Key
|
|
97
|
+
]);
|
|
98
|
+
return dnskeyRdata;
|
|
99
|
+
}
|
|
100
|
+
computeKeyTag(dnskeyRdata) {
|
|
101
|
+
// Key Tag calculation as per RFC 4034, Appendix B
|
|
102
|
+
let acc = 0;
|
|
103
|
+
for (let i = 0; i < dnskeyRdata.length; i++) {
|
|
104
|
+
acc += i & 1 ? dnskeyRdata[i] : dnskeyRdata[i] << 8;
|
|
105
|
+
}
|
|
106
|
+
acc += (acc >> 16) & 0xffff;
|
|
107
|
+
return acc & 0xffff;
|
|
108
|
+
}
|
|
109
|
+
getDNSKEYRecord() {
|
|
110
|
+
const dnskeyRdata = this.generateDNSKEY();
|
|
111
|
+
const flags = 256;
|
|
112
|
+
const protocol = 3;
|
|
113
|
+
const algorithm = this.getAlgorithmNumber();
|
|
114
|
+
const publicKeyData = dnskeyRdata.slice(4); // Skip flags, protocol, algorithm bytes
|
|
115
|
+
const publicKeyBase64 = publicKeyData.toString('base64');
|
|
116
|
+
return `${this.zone.zone}. IN DNSKEY ${flags} ${protocol} ${algorithm} ${publicKeyBase64}`;
|
|
117
|
+
}
|
|
118
|
+
getDSRecord() {
|
|
119
|
+
const dnskeyRdata = this.generateDNSKEY();
|
|
120
|
+
const keyTag = this.computeKeyTag(dnskeyRdata);
|
|
121
|
+
const algorithm = this.getAlgorithmNumber();
|
|
122
|
+
const digestType = 2; // SHA-256
|
|
123
|
+
const digest = plugins.crypto
|
|
124
|
+
.createHash('sha256')
|
|
125
|
+
.update(dnskeyRdata)
|
|
126
|
+
.digest('hex')
|
|
127
|
+
.toUpperCase();
|
|
128
|
+
return `${this.zone.zone}. IN DS ${keyTag} ${algorithm} ${digestType} ${digest}`;
|
|
129
|
+
}
|
|
130
|
+
getKeyPair() {
|
|
131
|
+
return this.keyPair;
|
|
132
|
+
}
|
|
133
|
+
getDsAndKeyPair() {
|
|
134
|
+
const dsRecord = this.getDSRecord();
|
|
135
|
+
const dnskeyRecord = this.getDNSKEYRecord();
|
|
136
|
+
return { keyPair: this.keyPair, dsRecord, dnskeyRecord };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kbnNzZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zZXJ2ZXIvY2xhc3Nlcy5kbnNzZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkNBQTJDO0FBQzNDLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBY3hDLE1BQU0sT0FBTyxNQUFNO0lBTWpCLFlBQVksSUFBZ0I7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFakIsMkVBQTJFO1FBQzNFLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1QixLQUFLLE9BQU87Z0JBQ1YsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsNEJBQTRCO2dCQUN2RSxNQUFNO1lBQ1IsS0FBSyxTQUFTO2dCQUNaLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbkQsTUFBTTtZQUNSLEtBQUssS0FBSztnQkFDUixtQ0FBbUM7Z0JBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztZQUMzRDtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELHdCQUF3QjtRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLFVBQWtCLENBQUM7UUFDdkIsSUFBSSxTQUFpQixDQUFDO1FBRXRCLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1QixLQUFLLE9BQU87Z0JBQ1YsSUFBSSxDQUFDLElBQUksQ0FB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
|
|
@@ -1,20 +1,40 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as dnsPacket from 'dns-packet';
|
|
2
2
|
interface IDnsServerOptions {
|
|
3
3
|
httpsKey: string;
|
|
4
4
|
httpsCert: string;
|
|
5
5
|
httpsPort: number;
|
|
6
6
|
udpPort: number;
|
|
7
|
+
dnssecZone: string;
|
|
8
|
+
}
|
|
9
|
+
interface DnsAnswer {
|
|
10
|
+
name: string;
|
|
11
|
+
type: string;
|
|
12
|
+
class: string | number;
|
|
13
|
+
ttl: number;
|
|
14
|
+
data: any;
|
|
7
15
|
}
|
|
8
16
|
export declare class DnsServer {
|
|
9
17
|
private options;
|
|
10
18
|
private udpServer;
|
|
11
19
|
private httpsServer;
|
|
12
20
|
private handlers;
|
|
21
|
+
private dnsSec;
|
|
22
|
+
private dnskeyRecord;
|
|
23
|
+
private keyTag;
|
|
13
24
|
constructor(options: IDnsServerOptions);
|
|
14
|
-
registerHandler(domainPattern: string, recordTypes: string[], handler: (question:
|
|
25
|
+
registerHandler(domainPattern: string, recordTypes: string[], handler: (question: dnsPacket.Question) => DnsAnswer | null): void;
|
|
15
26
|
private processDnsRequest;
|
|
27
|
+
private isDnssecRequested;
|
|
28
|
+
private generateRRSIG;
|
|
29
|
+
private serializeRRset;
|
|
30
|
+
private serializeRData;
|
|
31
|
+
private parseDNSKEYRecord;
|
|
32
|
+
private computeKeyTag;
|
|
16
33
|
private handleHttpsRequest;
|
|
17
34
|
start(): Promise<void>;
|
|
18
35
|
stop(): Promise<void>;
|
|
36
|
+
private qtypeToNumber;
|
|
37
|
+
private classToNumber;
|
|
38
|
+
private nameToBuffer;
|
|
19
39
|
}
|
|
20
40
|
export {};
|
|
@@ -1,8 +1,22 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
+
import { DnsSec } from './classes.dnssec.js';
|
|
3
|
+
import * as dnsPacket from 'dns-packet';
|
|
2
4
|
export class DnsServer {
|
|
3
5
|
constructor(options) {
|
|
4
6
|
this.options = options;
|
|
5
7
|
this.handlers = [];
|
|
8
|
+
// Initialize DNSSEC
|
|
9
|
+
this.dnsSec = new DnsSec({
|
|
10
|
+
zone: options.dnssecZone,
|
|
11
|
+
algorithm: 'ECDSA', // You can change this based on your needs
|
|
12
|
+
keySize: 256,
|
|
13
|
+
days: 365,
|
|
14
|
+
});
|
|
15
|
+
// Generate DNSKEY and DS records
|
|
16
|
+
const { dsRecord, dnskeyRecord } = this.dnsSec.getDsAndKeyPair();
|
|
17
|
+
// Parse DNSKEY record into dns-packet format
|
|
18
|
+
this.dnskeyRecord = this.parseDNSKEYRecord(dnskeyRecord);
|
|
19
|
+
this.keyTag = this.computeKeyTag(this.dnskeyRecord);
|
|
6
20
|
}
|
|
7
21
|
registerHandler(domainPattern, recordTypes, handler) {
|
|
8
22
|
this.handlers.push({ domainPattern, recordTypes, handler });
|
|
@@ -11,19 +25,50 @@ export class DnsServer {
|
|
|
11
25
|
const response = {
|
|
12
26
|
type: 'response',
|
|
13
27
|
id: request.id,
|
|
14
|
-
flags:
|
|
28
|
+
flags: dnsPacket.AUTHORITATIVE_ANSWER |
|
|
29
|
+
dnsPacket.RECURSION_AVAILABLE |
|
|
30
|
+
(request.flags & dnsPacket.RECURSION_DESIRED ? dnsPacket.RECURSION_DESIRED : 0),
|
|
15
31
|
questions: request.questions,
|
|
16
32
|
answers: [],
|
|
33
|
+
additionals: [],
|
|
17
34
|
};
|
|
35
|
+
const dnssecRequested = this.isDnssecRequested(request);
|
|
18
36
|
for (const question of request.questions) {
|
|
19
37
|
console.log(`Query for ${question.name} of type ${question.type}`);
|
|
20
38
|
let answered = false;
|
|
39
|
+
// Handle DNSKEY queries if DNSSEC is requested
|
|
40
|
+
if (dnssecRequested && question.type === 'DNSKEY' && question.name === this.options.dnssecZone) {
|
|
41
|
+
const dnskeyAnswer = {
|
|
42
|
+
name: question.name,
|
|
43
|
+
type: 'DNSKEY',
|
|
44
|
+
class: 'IN',
|
|
45
|
+
ttl: 3600,
|
|
46
|
+
data: this.dnskeyRecord,
|
|
47
|
+
};
|
|
48
|
+
response.answers.push(dnskeyAnswer);
|
|
49
|
+
// Sign the DNSKEY RRset
|
|
50
|
+
const rrsig = this.generateRRSIG('DNSKEY', [dnskeyAnswer], question.name);
|
|
51
|
+
response.answers.push(rrsig);
|
|
52
|
+
answered = true;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
21
55
|
for (const handlerEntry of this.handlers) {
|
|
22
56
|
if (plugins.minimatch.minimatch(question.name, handlerEntry.domainPattern) &&
|
|
23
57
|
handlerEntry.recordTypes.includes(question.type)) {
|
|
24
58
|
const answer = handlerEntry.handler(question);
|
|
25
59
|
if (answer) {
|
|
26
|
-
|
|
60
|
+
// Ensure the answer has ttl and class
|
|
61
|
+
const dnsAnswer = {
|
|
62
|
+
...answer,
|
|
63
|
+
ttl: answer.ttl || 300,
|
|
64
|
+
class: answer.class || 'IN',
|
|
65
|
+
};
|
|
66
|
+
response.answers.push(dnsAnswer);
|
|
67
|
+
if (dnssecRequested) {
|
|
68
|
+
// Sign the answer RRset
|
|
69
|
+
const rrsig = this.generateRRSIG(question.type, [dnsAnswer], question.name);
|
|
70
|
+
response.answers.push(rrsig);
|
|
71
|
+
}
|
|
27
72
|
answered = true;
|
|
28
73
|
break;
|
|
29
74
|
}
|
|
@@ -31,20 +76,167 @@ export class DnsServer {
|
|
|
31
76
|
}
|
|
32
77
|
if (!answered) {
|
|
33
78
|
console.log(`No handler found for ${question.name} of type ${question.type}`);
|
|
79
|
+
response.flags |= dnsPacket.AUTHORITATIVE_ANSWER;
|
|
80
|
+
const soaAnswer = {
|
|
81
|
+
name: question.name,
|
|
82
|
+
type: 'SOA',
|
|
83
|
+
class: 'IN',
|
|
84
|
+
ttl: 3600,
|
|
85
|
+
data: {
|
|
86
|
+
mname: `ns1.${this.options.dnssecZone}`,
|
|
87
|
+
rname: `hostmaster.${this.options.dnssecZone}`,
|
|
88
|
+
serial: Math.floor(Date.now() / 1000),
|
|
89
|
+
refresh: 3600,
|
|
90
|
+
retry: 600,
|
|
91
|
+
expire: 604800,
|
|
92
|
+
minimum: 86400,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
response.answers.push(soaAnswer);
|
|
34
96
|
}
|
|
35
97
|
}
|
|
36
98
|
return response;
|
|
37
99
|
}
|
|
100
|
+
isDnssecRequested(request) {
|
|
101
|
+
if (!request.additionals)
|
|
102
|
+
return false;
|
|
103
|
+
for (const additional of request.additionals) {
|
|
104
|
+
if (additional.type === 'OPT' && typeof additional.flags === 'number') {
|
|
105
|
+
// The DO bit is the 15th bit (0x8000)
|
|
106
|
+
if (additional.flags & 0x8000) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
generateRRSIG(type, rrset, name) {
|
|
114
|
+
// Prepare RRSIG data
|
|
115
|
+
const algorithm = this.dnsSec.getAlgorithmNumber();
|
|
116
|
+
const keyTag = this.keyTag;
|
|
117
|
+
const signerName = this.options.dnssecZone.endsWith('.') ? this.options.dnssecZone : `${this.options.dnssecZone}.`;
|
|
118
|
+
const inception = Math.floor(Date.now() / 1000) - 3600; // 1 hour ago
|
|
119
|
+
const expiration = inception + 86400; // Valid for 1 day
|
|
120
|
+
const ttl = rrset[0].ttl || 300;
|
|
121
|
+
// Serialize the RRset in canonical form
|
|
122
|
+
const rrsetBuffer = this.serializeRRset(rrset);
|
|
123
|
+
// Sign the RRset
|
|
124
|
+
const signature = this.dnsSec.signData(rrsetBuffer);
|
|
125
|
+
// Construct the RRSIG record
|
|
126
|
+
const rrsig = {
|
|
127
|
+
name,
|
|
128
|
+
type: 'RRSIG',
|
|
129
|
+
class: 'IN',
|
|
130
|
+
ttl,
|
|
131
|
+
data: {
|
|
132
|
+
typeCovered: type, // Changed to type string
|
|
133
|
+
algorithm,
|
|
134
|
+
labels: name.split('.').length - 1,
|
|
135
|
+
originalTTL: ttl,
|
|
136
|
+
expiration,
|
|
137
|
+
inception,
|
|
138
|
+
keyTag,
|
|
139
|
+
signerName,
|
|
140
|
+
signature: signature,
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
return rrsig;
|
|
144
|
+
}
|
|
145
|
+
serializeRRset(rrset) {
|
|
146
|
+
// Implement canonical DNS RRset serialization as per RFC 4034 Section 6
|
|
147
|
+
const buffers = [];
|
|
148
|
+
for (const rr of rrset) {
|
|
149
|
+
if (rr.type === 'OPT') {
|
|
150
|
+
continue; // Skip OPT records
|
|
151
|
+
}
|
|
152
|
+
const name = rr.name.endsWith('.') ? rr.name : rr.name + '.';
|
|
153
|
+
const nameBuffer = this.nameToBuffer(name.toLowerCase());
|
|
154
|
+
const typeValue = this.qtypeToNumber(rr.type);
|
|
155
|
+
const typeBuffer = Buffer.alloc(2);
|
|
156
|
+
typeBuffer.writeUInt16BE(typeValue, 0);
|
|
157
|
+
const classValue = this.classToNumber(rr.class);
|
|
158
|
+
const classBuffer = Buffer.alloc(2);
|
|
159
|
+
classBuffer.writeUInt16BE(classValue, 0);
|
|
160
|
+
const ttlValue = rr.ttl || 300;
|
|
161
|
+
const ttlBuffer = Buffer.alloc(4);
|
|
162
|
+
ttlBuffer.writeUInt32BE(ttlValue, 0);
|
|
163
|
+
// Serialize the data based on the record type
|
|
164
|
+
const dataBuffer = this.serializeRData(rr.type, rr.data);
|
|
165
|
+
const rdLengthBuffer = Buffer.alloc(2);
|
|
166
|
+
rdLengthBuffer.writeUInt16BE(dataBuffer.length, 0);
|
|
167
|
+
buffers.push(Buffer.concat([nameBuffer, typeBuffer, classBuffer, ttlBuffer, rdLengthBuffer, dataBuffer]));
|
|
168
|
+
}
|
|
169
|
+
return Buffer.concat(buffers);
|
|
170
|
+
}
|
|
171
|
+
serializeRData(type, data) {
|
|
172
|
+
// Implement serialization for each record type you support
|
|
173
|
+
switch (type) {
|
|
174
|
+
case 'A':
|
|
175
|
+
return Buffer.from(data.split('.').map((octet) => parseInt(octet, 10)));
|
|
176
|
+
case 'AAAA':
|
|
177
|
+
// Handle IPv6 addresses
|
|
178
|
+
return Buffer.from(data.split(':').flatMap((segment) => {
|
|
179
|
+
const num = parseInt(segment, 16);
|
|
180
|
+
return [num >> 8, num & 0xff];
|
|
181
|
+
}));
|
|
182
|
+
case 'DNSKEY':
|
|
183
|
+
const dnskeyData = data;
|
|
184
|
+
return Buffer.concat([
|
|
185
|
+
Buffer.from([dnskeyData.flags >> 8, dnskeyData.flags & 0xff]),
|
|
186
|
+
Buffer.from([3]), // Protocol field, always 3
|
|
187
|
+
Buffer.from([dnskeyData.algorithm]),
|
|
188
|
+
dnskeyData.key,
|
|
189
|
+
]);
|
|
190
|
+
case 'SOA':
|
|
191
|
+
// Implement SOA record serialization if needed
|
|
192
|
+
// For now, return an empty buffer or handle as needed
|
|
193
|
+
return Buffer.alloc(0);
|
|
194
|
+
// Add cases for other record types as needed
|
|
195
|
+
default:
|
|
196
|
+
throw new Error(`Serialization for record type ${type} is not implemented.`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
parseDNSKEYRecord(dnskeyRecord) {
|
|
200
|
+
// Parse the DNSKEY record string into dns-packet format
|
|
201
|
+
const parts = dnskeyRecord.trim().split(/\s+/);
|
|
202
|
+
const flags = parseInt(parts[3], 10);
|
|
203
|
+
const algorithm = parseInt(parts[5], 10);
|
|
204
|
+
const publicKeyBase64 = parts.slice(6).join('');
|
|
205
|
+
const key = Buffer.from(publicKeyBase64, 'base64');
|
|
206
|
+
return {
|
|
207
|
+
flags,
|
|
208
|
+
algorithm,
|
|
209
|
+
key,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
computeKeyTag(dnskeyRecord) {
|
|
213
|
+
// Compute key tag as per RFC 4034 Appendix B
|
|
214
|
+
const flags = dnskeyRecord.flags;
|
|
215
|
+
const algorithm = dnskeyRecord.algorithm;
|
|
216
|
+
const key = dnskeyRecord.key;
|
|
217
|
+
const dnskeyRdata = Buffer.concat([
|
|
218
|
+
Buffer.from([flags >> 8, flags & 0xff]),
|
|
219
|
+
Buffer.from([3]), // Protocol field, always 3
|
|
220
|
+
Buffer.from([algorithm]),
|
|
221
|
+
key,
|
|
222
|
+
]);
|
|
223
|
+
let acc = 0;
|
|
224
|
+
for (let i = 0; i < dnskeyRdata.length; i++) {
|
|
225
|
+
acc += (i & 1) ? dnskeyRdata[i] : dnskeyRdata[i] << 8;
|
|
226
|
+
}
|
|
227
|
+
acc += (acc >> 16) & 0xffff;
|
|
228
|
+
return acc & 0xffff;
|
|
229
|
+
}
|
|
38
230
|
handleHttpsRequest(req, res) {
|
|
39
231
|
if (req.method === 'POST' && req.url === '/dns-query') {
|
|
40
232
|
let body = [];
|
|
41
|
-
req.on('data', chunk => {
|
|
233
|
+
req.on('data', (chunk) => {
|
|
42
234
|
body.push(chunk);
|
|
43
235
|
}).on('end', () => {
|
|
44
236
|
const msg = Buffer.concat(body);
|
|
45
|
-
const request =
|
|
237
|
+
const request = dnsPacket.decode(msg);
|
|
46
238
|
const response = this.processDnsRequest(request);
|
|
47
|
-
const responseData =
|
|
239
|
+
const responseData = dnsPacket.encode(response);
|
|
48
240
|
res.writeHead(200, { 'Content-Type': 'application/dns-message' });
|
|
49
241
|
res.end(responseData);
|
|
50
242
|
});
|
|
@@ -61,9 +253,9 @@ export class DnsServer {
|
|
|
61
253
|
}, this.handleHttpsRequest.bind(this));
|
|
62
254
|
this.udpServer = plugins.dgram.createSocket('udp4');
|
|
63
255
|
this.udpServer.on('message', (msg, rinfo) => {
|
|
64
|
-
const request =
|
|
256
|
+
const request = dnsPacket.decode(msg);
|
|
65
257
|
const response = this.processDnsRequest(request);
|
|
66
|
-
const responseData =
|
|
258
|
+
const responseData = dnsPacket.encode(response);
|
|
67
259
|
this.udpServer.send(responseData, rinfo.port, rinfo.address);
|
|
68
260
|
});
|
|
69
261
|
this.udpServer.on('error', (err) => {
|
|
@@ -105,5 +297,46 @@ export class DnsServer {
|
|
|
105
297
|
});
|
|
106
298
|
await Promise.all([doneUdp.promise, doneHttps.promise]);
|
|
107
299
|
}
|
|
300
|
+
// Helper methods
|
|
301
|
+
qtypeToNumber(type) {
|
|
302
|
+
const QTYPE_NUMBERS = {
|
|
303
|
+
'A': 1,
|
|
304
|
+
'NS': 2,
|
|
305
|
+
'CNAME': 5,
|
|
306
|
+
'SOA': 6,
|
|
307
|
+
'PTR': 12,
|
|
308
|
+
'MX': 15,
|
|
309
|
+
'TXT': 16,
|
|
310
|
+
'AAAA': 28,
|
|
311
|
+
'SRV': 33,
|
|
312
|
+
'DNSKEY': 48,
|
|
313
|
+
'RRSIG': 46,
|
|
314
|
+
// Add more as needed
|
|
315
|
+
};
|
|
316
|
+
return QTYPE_NUMBERS[type.toUpperCase()] || 0;
|
|
317
|
+
}
|
|
318
|
+
classToNumber(cls) {
|
|
319
|
+
const CLASS_NUMBERS = {
|
|
320
|
+
'IN': 1,
|
|
321
|
+
'CH': 3,
|
|
322
|
+
'HS': 4,
|
|
323
|
+
// Add more as needed
|
|
324
|
+
};
|
|
325
|
+
if (typeof cls === 'number') {
|
|
326
|
+
return cls;
|
|
327
|
+
}
|
|
328
|
+
return CLASS_NUMBERS[cls.toUpperCase()] || 1;
|
|
329
|
+
}
|
|
330
|
+
nameToBuffer(name) {
|
|
331
|
+
const labels = name.split('.');
|
|
332
|
+
const buffers = labels.map(label => {
|
|
333
|
+
const len = Buffer.byteLength(label, 'utf8');
|
|
334
|
+
const buf = Buffer.alloc(1 + len);
|
|
335
|
+
buf.writeUInt8(len, 0);
|
|
336
|
+
buf.write(label, 1);
|
|
337
|
+
return buf;
|
|
338
|
+
});
|
|
339
|
+
return Buffer.concat([...buffers, Buffer.from([0])]); // Add root label
|
|
340
|
+
}
|
|
108
341
|
}
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kbnNzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zZXJ2ZXIvY2xhc3Nlcy5kbnNzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFleEMsTUFBTSxPQUFPLFNBQVM7SUFLcEIsWUFBb0IsT0FBMEI7UUFBMUIsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFGdEMsYUFBUSxHQUFrQixFQUFFLENBQUM7SUFFWSxDQUFDO0lBRTNDLGVBQWUsQ0FDcEIsYUFBcUIsRUFDckIsV0FBcUIsRUFDckIsT0FBa0Y7UUFFbEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE9BQWlDO1FBQ3pELE1BQU0sUUFBUSxHQUE2QjtZQUN6QyxJQUFJLEVBQUUsVUFBVTtZQUNoQixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDZCxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLG1CQUFtQjtZQUNsRixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBRUYsS0FBSyxNQUFNLFFBQVEsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLFFBQVEsQ0FBQyxJQUFJLFlBQVksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFFbkUsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBRXJCLEtBQUssTUFBTSxZQUFZLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN6QyxJQUNFLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEs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
|
|
342
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kbnNzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zZXJ2ZXIvY2xhc3Nlcy5kbnNzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBMkN4QyxNQUFNLE9BQU8sU0FBUztJQVVwQixZQUFvQixPQUEwQjtRQUExQixZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQVB0QyxhQUFRLEdBQWtCLEVBQUUsQ0FBQztRQVFuQyxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQztZQUN2QixJQUFJLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDeEIsU0FBUyxFQUFFLE9BQU8sRUFBRSwwQ0FBMEM7WUFDOUQsT0FBTyxFQUFFLEdBQUc7WUFDWixJQUFJLEVBQUUsR0FBRztTQUNWLENBQUMsQ0FBQztRQUVILGlDQUFpQztRQUNqQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFakUsNkNBQTZDO1FBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLGVBQWUsQ0FDcEIsYUFBcUIsRUFDckIsV0FBcUIsRUFDckIsT0FBMkQ7UUFFM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVP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
|
|
@@ -6,7 +6,7 @@ import dgram from 'dgram';
|
|
|
6
6
|
export { crypto, fs, http, https, dgram, };
|
|
7
7
|
import * as smartpromise from '@push.rocks/smartpromise';
|
|
8
8
|
export { smartpromise, };
|
|
9
|
-
import
|
|
9
|
+
import elliptic from 'elliptic';
|
|
10
10
|
import * as dnsPacket from 'dns-packet';
|
|
11
11
|
import * as minimatch from 'minimatch';
|
|
12
12
|
export { dnsPacket, elliptic, minimatch, };
|
|
@@ -9,8 +9,8 @@ export { crypto, fs, http, https, dgram, };
|
|
|
9
9
|
import * as smartpromise from '@push.rocks/smartpromise';
|
|
10
10
|
export { smartpromise, };
|
|
11
11
|
// third party
|
|
12
|
-
import
|
|
12
|
+
import elliptic from 'elliptic';
|
|
13
13
|
import * as dnsPacket from 'dns-packet';
|
|
14
14
|
import * as minimatch from 'minimatch';
|
|
15
15
|
export { dnsPacket, elliptic, minimatch, };
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3NlcnZlci9wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWM7QUFDZCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFDTCxNQUFNLEVBQ04sRUFBRSxFQUNGLElBQUksRUFDSixLQUFLLEVBQ0wsS0FBSyxHQUNOLENBQUE7QUFFRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQ0wsWUFBWSxHQUNiLENBQUE7QUFFRCxjQUFjO0FBQ2QsT0FBTyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBRXZDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFNBQVMsR0FDVixDQUFBIn0=
|