hue-node-dtls 0.6.3 → 0.6.4-alpha.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hue-node-dtls",
3
- "version": "0.6.3",
3
+ "version": "0.6.4-alpha.2",
4
4
  "description": "Secure UDP communications using DTLS.",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  const crypto = require("crypto");
4
- const { createDecode, encode } = require("hue-binary-data");
4
+ const { createDecode, encode } = require("binary-data");
5
5
  const debug = require("../utils/debug")("dtls:cipher:aead");
6
6
  const { sessionType } = require("../lib/constants");
7
7
  const { AEADAdditionalData } = require("../lib/protocol");
@@ -2,7 +2,7 @@
2
2
 
3
3
  const crypto = require("crypto");
4
4
  const xor = require("buffer-xor/inplace");
5
- const { createDecode, encode } = require("hue-binary-data");
5
+ const { createDecode, encode } = require("binary-data");
6
6
  const AEADCipher = require("../cipher/aead");
7
7
  const { AEAD_CHACHA20_POLY1305 } = require("../lib/constants");
8
8
  const debug = require("../utils/debug")("dtls:cipher:aead");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  const { Transform } = require("readable-stream");
4
- const { decode, createDecode } = require("hue-binary-data");
4
+ const { decode, createDecode } = require("binary-data");
5
5
  const { contentType } = require("../lib/constants");
6
6
  const { DTLSPlaintext, Handshake } = require("../lib/protocol");
7
7
  const debug = require("../utils/debug")("dtls:decoder");
@@ -37,6 +37,7 @@ const alertDescription = {
37
37
  USER_CANCELED: 90,
38
38
  NO_RENEGOTIATION: 100,
39
39
  UNSUPPORTED_EXTENSION: 110,
40
+ UNKNOWN_PSK_IDENTITY: 115, // TLS PSK extension - RFC 4279
40
41
  };
41
42
 
42
43
  const sessionType = {
@@ -12,14 +12,14 @@ const {
12
12
  select,
13
13
  string
14
14
  }
15
- } = require("hue-binary-data");
15
+ } = require("binary-data");
16
16
  const { ecCurveTypes } = require("../lib/constants");
17
17
 
18
18
  /**
19
19
  * Internal type for trivial errors check.
20
20
  * @private
21
21
  * @param {string} errorMessage
22
- * @returns {Object} The `hue-binary-data` compatible type.
22
+ * @returns {Object} The `binary-data` compatible type.
23
23
  */
24
24
  function assertType(errorMessage) {
25
25
  return {
@@ -67,7 +67,8 @@ class Timer extends Emitter {
67
67
  */
68
68
  restart(ms) {
69
69
  this.stop();
70
- this[_onTimeout] = setTimeout(ontimeout, ms, this);
70
+
71
+ this[_onTimeout] = setTimeout(ontimeout, ms, this).unref();
71
72
  }
72
73
  }
73
74
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  const { Readable } = require("readable-stream");
4
4
  const debug = require("../utils/debug")("dtls:sender");
5
- const { createEncode, encode, BinaryStream } = require("hue-binary-data");
5
+ const { createEncode, encode, BinaryStream } = require("binary-data");
6
6
  const {
7
7
  contentType,
8
8
  handshakeType,
@@ -5,7 +5,7 @@ const Emitter = require("events");
5
5
  const { Duplex } = require("readable-stream");
6
6
  const debug = require("../utils/debug")("dtls:server");
7
7
  const CookieManager = require("../lib/cookie-manager");
8
- const { decode, encode } = require("hue-binary-data");
8
+ const { decode, encode } = require("binary-data");
9
9
  const {
10
10
  contentType,
11
11
  handshakeType,
@@ -179,9 +179,42 @@ class Socket extends Duplex {
179
179
  process.nextTick(() => this.emit("certificate", cert))
180
180
  );
181
181
 
182
- session.on("error", code =>
183
- this.emit("error", new Error(`alert code ${code}`))
184
- );
182
+ session.on('error', code => {
183
+ // Map DTLS alert codes to descriptive messages
184
+ const alertMessages = {
185
+ 0: 'close_notify - Server will disconnect (e.g. streaming disabled)',
186
+ 10: 'unexpected_message - Protocol failure',
187
+ 20: 'bad_record_mac - Protocol failure or invalid PSK',
188
+ 21: 'decryption_failed - Decryption failed',
189
+ 22: 'record_overflow - Record overflow',
190
+ 30: 'decompression_failure - Decompression failed',
191
+ 40: 'handshake_failure - Other insufficient security parameters',
192
+ 41: 'no_certificate - No certificate provided',
193
+ 42: 'bad_certificate - Bad certificate',
194
+ 43: 'unsupported_certificate - Unsupported certificate',
195
+ 44: 'certificate_revoked - Certificate revoked',
196
+ 45: 'certificate_expired - Certificate expired',
197
+ 46: 'certificate_unknown - Certificate unknown',
198
+ 47: 'illegal_parameter - Illegal parameter',
199
+ 48: 'unknown_ca - Unknown certificate authority',
200
+ 49: 'access_denied - Access denied',
201
+ 50: 'decode_error - Protocol failure - decode error',
202
+ 51: 'decrypt_error - Invalid PSK or decryption error',
203
+ 60: 'export_restriction - Export restriction',
204
+ 70: 'protocol_version - DTLS version not supported',
205
+ 71: 'insufficient_security - Higher cipher security required',
206
+ 80: 'internal_error - Internal bridge error',
207
+ 90: 'user_canceled - Maximum number of sessions already active',
208
+ 100: 'no_renegotiation - No renegotiation',
209
+ 110: 'unsupported_extension - Unsupported extension',
210
+ 115: 'unknown_psk_identity - Unknown identity',
211
+ };
212
+
213
+ const message = alertMessages[code] || `Unknown alert`;
214
+ const detailedError = new Error(`DTLS Alert ${code}: ${message}`);
215
+ debug('DTLS error - code: %d, message: %s', code, message);
216
+ this.emit('error', detailedError);
217
+ });
185
218
 
186
219
  this.once("timeout", () => {
187
220
  debug("got timeout, close connection");
@@ -563,11 +563,49 @@ function serverFinished(session, message) {
563
563
  * @param {Object} message
564
564
  */
565
565
  function alert(session, message) {
566
- debug("got alert");
566
+ debug('got alert');
567
567
  const packet = message.fragment;
568
568
 
569
569
  const { level, description } = decode(packet, Alert);
570
- debug("level %s, description %s", level, description);
570
+ debug('level %s, description %s', level, description);
571
+
572
+ // Map alert level and description to readable names for debugging
573
+ const levelName =
574
+ level === 1 ? 'WARNING' : level === 2 ? 'FATAL' : `UNKNOWN(${level})`;
575
+ const descriptionNames = {
576
+ 0: 'CLOSE_NOTIFY',
577
+ 10: 'UNEXPECTED_MESSAGE',
578
+ 20: 'BAD_RECORD_MAC',
579
+ 21: 'DECRYPTION_FAILED',
580
+ 22: 'RECORD_OVERFLOW',
581
+ 30: 'DECOMPRESSION_FAILURE',
582
+ 40: 'HANDSHAKE_FAILURE',
583
+ 41: 'NO_CERTIFICATE',
584
+ 42: 'BAD_CERTIFICATE',
585
+ 43: 'UNSUPPORTED_CERTIFICATE',
586
+ 44: 'CERTIFICATE_REVOKED',
587
+ 45: 'CERTIFICATE_EXPIRED',
588
+ 46: 'CERTIFICATE_UNKNOWN',
589
+ 47: 'ILLEGAL_PARAMETER',
590
+ 48: 'UNKNOWN_CA',
591
+ 49: 'ACCESS_DENIED',
592
+ 50: 'DECODE_ERROR',
593
+ 51: 'DECRYPT_ERROR',
594
+ 60: 'EXPORT_RESTRICTION',
595
+ 70: 'PROTOCOL_VERSION',
596
+ 71: 'INSUFFICIENT_SECURITY',
597
+ 80: 'INTERNAL_ERROR',
598
+ 90: 'USER_CANCELED',
599
+ 100: 'NO_RENEGOTIATION',
600
+ 110: 'UNSUPPORTED_EXTENSION',
601
+ 115: 'UNKNOWN_PSK_IDENTITY',
602
+ };
603
+
604
+ const descriptionName =
605
+ descriptionNames[description] || `UNKNOWN(${description})`;
606
+ debug(
607
+ `Alert received - Level: ${levelName} (${level}), Description: ${descriptionName} (${description})`
608
+ );
571
609
 
572
610
  session.error(description);
573
611
  }
@@ -6,7 +6,7 @@
6
6
  const assert = require("assert");
7
7
  const crypto = require("crypto");
8
8
  const Emitter = require("events");
9
- const { encode, BinaryStream } = require("hue-binary-data");
9
+ const { encode, BinaryStream } = require("binary-data");
10
10
  const {
11
11
  protocolVersion,
12
12
  signTypes,
@@ -11,7 +11,7 @@ const {
11
11
  encode,
12
12
  createEncode,
13
13
  types: { uint16be, buffer }
14
- } = require("hue-binary-data");
14
+ } = require("binary-data");
15
15
 
16
16
  const { RSA_PKCS1_PADDING } = crypto.constants;
17
17