ssl2-tools 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # ssl2-tools
2
+
3
+ Decrypt and encrypt Nicolaudie SSL2 fixture library files.
4
+
5
+ SSL2 is the encrypted fixture profile format used by [ESA Pro 2](https://www.nicolaudie.com/esa-pro2.htm), [Daslight](https://www.daslight.com/), [Sunlite Suite](https://www.nicolaudie.com/sunlite-suite.htm), and [myDMX](https://www.adj.com/mydmx). The files contain XML fixture definitions encrypted with the [AraCrypt](https://www.codeproject.com/articles/2329/aracrypt-a-crypto-class) stream cipher.
6
+
7
+ The [Nicolaudie fixture store](https://store.daslight.com/ssl) hosts thousands of these files.
8
+
9
+ ## Install
10
+
11
+ ```
12
+ npm install -g ssl2-tools
13
+ ```
14
+
15
+ Or use without installing:
16
+
17
+ ```
18
+ npx ssl2-tools decrypt fixture.ssl2
19
+ ```
20
+
21
+ ## CLI Usage
22
+
23
+ ```
24
+ # Decrypt SSL2 to XML
25
+ ssl2 decrypt fixture.ssl2
26
+ ssl2 decrypt fixture.ssl2 output.xml
27
+
28
+ # Encrypt XML back to SSL2
29
+ ssl2 encrypt fixture.xml
30
+ ssl2 encrypt fixture.xml output.ssl2
31
+
32
+ # Print decrypted XML to stdout
33
+ ssl2 dump fixture.ssl2
34
+ ssl2 dump fixture.ssl2 | xmllint --format -
35
+ ```
36
+
37
+ ## API
38
+
39
+ ```typescript
40
+ import { decrypt, encrypt } from 'ssl2-tools'
41
+ import { readFileSync, writeFileSync } from 'fs'
42
+
43
+ const ssl2 = readFileSync('fixture.ssl2')
44
+ const xml = decrypt(ssl2)
45
+ console.log(xml.toString('utf-8'))
46
+
47
+ const reEncrypted = encrypt(xml)
48
+ writeFileSync('fixture-copy.ssl2', reEncrypted)
49
+ ```
50
+
51
+ ## SSL2 XML Format
52
+
53
+ Decrypted files contain XML with this structure:
54
+
55
+ ```xml
56
+ <?xml version="1.0" encoding="UTF-8"?>
57
+ <DLMFILE VERSION="3" TYPE="SSLLIBRARY">
58
+ <SSLLIBRARY SSLNAME="Fixture Name" ...>
59
+ <SSLPROPERTIES SSLBRAND="Brand" ... />
60
+ <SSLMODES SSLNBMODE="1">
61
+ <SSLMODE SSLMODENAME="Mode Name" SSLNBCHANNEL="6">
62
+ <SSLCHANNEL SSLCHANNELTYPE="25" SSLCHANNELNAME="Red" ...>
63
+ <SSLPRESETS ...>
64
+ <SSLPRESET SSLPRESETNAME="Red" SSLPRESETDMXSTART="0" SSLPRESETDMXEND="255" ... />
65
+ </SSLPRESETS>
66
+ </SSLCHANNEL>
67
+ <!-- more channels -->
68
+ </SSLMODE>
69
+ </SSLMODES>
70
+ </SSLLIBRARY>
71
+ </DLMFILE>
72
+ ```
73
+
74
+ ### Channel Types
75
+
76
+ | Type | Name |
77
+ |------|------|
78
+ | 0 | Generic |
79
+ | 7 | Dimmer |
80
+ | 14 | Zoom |
81
+ | 15 | Shutter / Strobe |
82
+ | 18 | Speed |
83
+ | 23 | Color Temperature |
84
+ | 25 | Red |
85
+ | 26 | Green |
86
+ | 27 | Blue |
87
+ | 31 | White |
88
+ | 37 | Auto Programs |
89
+ | 43 | Warm White |
90
+ | 44 | Cold White |
91
+ | 45 | Amber |
92
+ | 46 | UV |
93
+ | 48 | Lime |
94
+
95
+ ## Credits
96
+
97
+ Encryption was reverse-engineered by [@HakanL](https://github.com/HakanL) — see [open-fixture-library#99](https://github.com/OpenLightingProject/open-fixture-library/issues/99).
98
+
99
+ ## License
100
+
101
+ MIT
@@ -0,0 +1,8 @@
1
+ export declare class AraCrypt {
2
+ private lfsrA;
3
+ private lfsrB;
4
+ private lfsrC;
5
+ setKey(key: string): void;
6
+ transformByte(input: number): number;
7
+ transform(data: Buffer): Buffer;
8
+ }
@@ -0,0 +1,85 @@
1
+ // AraCrypt LFSR stream cipher
2
+ // Ported from https://gist.github.com/HakanL/f67fb9452d086856f105d64bc13a3f46
3
+ // Original algorithm: https://www.codeproject.com/articles/2329/aracrypt-a-crypto-class
4
+ const MASK_A = 0x80000062;
5
+ const MASK_B = 0x40000020;
6
+ const MASK_C = 0x10000002;
7
+ const ROT0_A = 0x7FFFFFFF;
8
+ const ROT0_B = 0x3FFFFFFF;
9
+ const ROT0_C = 0x0FFFFFFF;
10
+ const ROT1_A = 0x80000000;
11
+ const ROT1_B = 0xC0000000;
12
+ const ROT1_C = 0xF0000000;
13
+ const SEED_A = 0x13579BDF;
14
+ const SEED_B = 0x2468ACE0;
15
+ const SEED_C = 0xFDB97531;
16
+ export class AraCrypt {
17
+ lfsrA = SEED_A;
18
+ lfsrB = SEED_B;
19
+ lfsrC = SEED_C;
20
+ setKey(key) {
21
+ if (!key)
22
+ throw new Error('Key must not be empty');
23
+ let seed = key;
24
+ let idx = 0;
25
+ while (seed.length < 12) {
26
+ seed += seed[idx++];
27
+ }
28
+ this.lfsrA = SEED_A;
29
+ this.lfsrB = SEED_B;
30
+ this.lfsrC = SEED_C;
31
+ for (let i = 0; i < 4; i++) {
32
+ this.lfsrA = (((this.lfsrA << 8) >>> 0) | seed.charCodeAt(i + 0)) >>> 0;
33
+ this.lfsrB = (((this.lfsrB << 8) >>> 0) | seed.charCodeAt(i + 4)) >>> 0;
34
+ this.lfsrC = (((this.lfsrC << 8) >>> 0) | seed.charCodeAt(i + 8)) >>> 0;
35
+ }
36
+ if (this.lfsrA === 0)
37
+ this.lfsrA = SEED_A;
38
+ if (this.lfsrB === 0)
39
+ this.lfsrB = SEED_B;
40
+ if (this.lfsrC === 0)
41
+ this.lfsrC = SEED_C;
42
+ }
43
+ transformByte(input) {
44
+ let crypto = 0;
45
+ let outB = (this.lfsrB & 1) >>> 0;
46
+ let outC = (this.lfsrC & 1) >>> 0;
47
+ for (let i = 0; i < 8; i++) {
48
+ if ((this.lfsrA & 1) !== 0) {
49
+ this.lfsrA = ((((this.lfsrA ^ MASK_A) >>> 0) >>> 1) | ROT1_A) >>> 0;
50
+ if ((this.lfsrB & 1) !== 0) {
51
+ this.lfsrB = ((((this.lfsrB ^ MASK_B) >>> 0) >>> 1) | ROT1_B) >>> 0;
52
+ outB = 1;
53
+ }
54
+ else {
55
+ this.lfsrB = ((this.lfsrB >>> 1) & ROT0_B) >>> 0;
56
+ outB = 0;
57
+ }
58
+ }
59
+ else {
60
+ this.lfsrA = ((this.lfsrA >>> 1) & ROT0_A) >>> 0;
61
+ if ((this.lfsrC & 1) !== 0) {
62
+ this.lfsrC = ((((this.lfsrC ^ MASK_C) >>> 0) >>> 1) | ROT1_C) >>> 0;
63
+ outC = 1;
64
+ }
65
+ else {
66
+ this.lfsrC = ((this.lfsrC >>> 1) & ROT0_C) >>> 0;
67
+ outC = 0;
68
+ }
69
+ }
70
+ crypto = ((crypto << 1) | (outB ^ outC)) & 0xFF;
71
+ }
72
+ input = (input ^ crypto) & 0xFF;
73
+ if (input === 0)
74
+ input = crypto;
75
+ return input;
76
+ }
77
+ transform(data) {
78
+ const out = Buffer.alloc(data.length);
79
+ for (let i = 0; i < data.length; i++) {
80
+ out[i] = this.transformByte(data[i]);
81
+ }
82
+ return out;
83
+ }
84
+ }
85
+ //# sourceMappingURL=aracrypt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aracrypt.js","sourceRoot":"","sources":["../src/aracrypt.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync, writeFileSync } from 'node:fs';
3
+ import { basename, resolve } from 'node:path';
4
+ import { decrypt, encrypt } from './index.js';
5
+ const USAGE = `ssl2-tools — Decrypt and encrypt Nicolaudie SSL2 fixture files
6
+
7
+ Usage:
8
+ ssl2 decrypt <file.ssl2> [output.xml] Decrypt SSL2 to XML
9
+ ssl2 encrypt <file.xml> [output.ssl2] Encrypt XML to SSL2
10
+ ssl2 dump <file.ssl2> Decrypt and print to stdout
11
+
12
+ SSL2 is the encrypted fixture format used by ESA Pro 2, Daslight,
13
+ Sunlite Suite, and myDMX. Files are XML encrypted with AraCrypt.`;
14
+ function main() {
15
+ const args = process.argv.slice(2);
16
+ if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
17
+ console.log(USAGE);
18
+ process.exit(0);
19
+ }
20
+ const command = args[0];
21
+ const inputPath = args[1];
22
+ if (!inputPath) {
23
+ console.error('Error: no input file specified');
24
+ console.error(USAGE);
25
+ process.exit(1);
26
+ }
27
+ const input = readFileSync(resolve(inputPath));
28
+ switch (command) {
29
+ case 'decrypt':
30
+ case 'd': {
31
+ const output = decrypt(input);
32
+ const head = output.subarray(0, 50).toString('utf-8');
33
+ if (!head.includes('<?xml')) {
34
+ console.error('Warning: decrypted output does not look like XML.');
35
+ console.error('The file may use a different encryption key.');
36
+ }
37
+ const outPath = args[2] ?? inputPath.replace(/\.ssl2$/i, '.xml');
38
+ writeFileSync(resolve(outPath), output);
39
+ console.log(`Decrypted: ${basename(inputPath)} → ${basename(outPath)}`);
40
+ break;
41
+ }
42
+ case 'encrypt':
43
+ case 'e': {
44
+ const output = encrypt(input);
45
+ const outPath = args[2] ?? inputPath.replace(/\.xml$/i, '.ssl2');
46
+ writeFileSync(resolve(outPath), output);
47
+ console.log(`Encrypted: ${basename(inputPath)} → ${basename(outPath)}`);
48
+ break;
49
+ }
50
+ case 'dump': {
51
+ const output = decrypt(input);
52
+ process.stdout.write(output);
53
+ break;
54
+ }
55
+ default:
56
+ console.error(`Unknown command: ${command}`);
57
+ console.error(USAGE);
58
+ process.exit(1);
59
+ }
60
+ }
61
+ main();
62
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { AraCrypt } from './aracrypt.js';
2
+ export declare function decrypt(data: Buffer, key?: string): Buffer;
3
+ export declare function encrypt(data: Buffer, key?: string): Buffer;
4
+ export declare function isSSL2(data: Buffer): boolean;
5
+ export { AraCrypt };
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ import { AraCrypt } from './aracrypt.js';
2
+ const DEFAULT_KEY = 'DasCryptKey';
3
+ export function decrypt(data, key = DEFAULT_KEY) {
4
+ const cipher = new AraCrypt();
5
+ cipher.setKey(key);
6
+ return cipher.transform(data);
7
+ }
8
+ export function encrypt(data, key = DEFAULT_KEY) {
9
+ const cipher = new AraCrypt();
10
+ cipher.setKey(key);
11
+ return cipher.transform(data);
12
+ }
13
+ export function isSSL2(data) {
14
+ const decrypted = decrypt(data);
15
+ const head = decrypted.subarray(0, 100).toString('utf-8');
16
+ return head.includes('<?xml');
17
+ }
18
+ export { AraCrypt };
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,WAAW,GAAG,aAAa,CAAA;AAEjC,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,MAAc,WAAW;IAC7D,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,MAAc,WAAW;IAC7D,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACzD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AAC/B,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAA"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "ssl2-tools",
3
+ "version": "1.0.0",
4
+ "description": "Decrypt and encrypt Nicolaudie SSL2 fixture library files",
5
+ "type": "module",
6
+ "bin": {
7
+ "ssl2": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "keywords": [
25
+ "dmx",
26
+ "ssl2",
27
+ "nicolaudie",
28
+ "daslight",
29
+ "sunlite",
30
+ "fixture",
31
+ "scan-library",
32
+ "lighting"
33
+ ],
34
+ "author": "Mike Rothenberg <miker@miker.org>",
35
+ "license": "MIT",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/ecopoesis/ssl2-tools.git"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^22.0.0",
42
+ "typescript": "^5.7.0"
43
+ }
44
+ }