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 +101 -0
- package/dist/aracrypt.d.ts +8 -0
- package/dist/aracrypt.js +85 -0
- package/dist/aracrypt.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +62 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/package.json +44 -0
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
|
package/dist/aracrypt.js
ADDED
|
@@ -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
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
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
|
+
}
|