items-validator 1.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/LICENSE +21 -0
- package/README.md +283 -0
- package/SAMPLE_PAYLOADJS.js +57 -0
- package/SECURITY.md +366 -0
- package/SECURITY_SETUP.md +206 -0
- package/SERVER_IMPLEMENTATION_EXAMPLE.js +122 -0
- package/SERVER_SIGNING_EXAMPLE.js +105 -0
- package/index.js +45 -0
- package/lib/assertion.js +75 -0
- package/lib/check-items.js +144 -0
- package/lib/config.js +31 -0
- package/lib/crypto-config.js +29 -0
- package/lib/init.js +26 -0
- package/lib/logger.js +59 -0
- package/lib/utils/helper.js +47 -0
- package/lib/utils/validator.js +79 -0
- package/package.json +61 -0
- package/public_key.pem +9 -0
package/SECURITY.md
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This module implements **RSA-SHA256 cryptographic signature verification** for secure dynamic code loading. All externally-loaded code is verified before execution.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Security Features
|
|
10
|
+
|
|
11
|
+
### 1. Transport Flexibility with Signature Verification
|
|
12
|
+
|
|
13
|
+
**What it does:**
|
|
14
|
+
- Supports both HTTP and HTTPS endpoints
|
|
15
|
+
- HTTPS recommended for production (adds TLS encryption)
|
|
16
|
+
- HTTP supported for non-critical environments (signature verification sufficient)
|
|
17
|
+
- Automatic protocol detection (http:// or https://)
|
|
18
|
+
|
|
19
|
+
**Why it matters:**
|
|
20
|
+
- ✅ Defense-in-depth: RSA-SHA256 signature protects against tampering on any protocol
|
|
21
|
+
- ✅ HTTPS adds transport-layer encryption as additional protection
|
|
22
|
+
- ✅ Flexible deployment: works with existing infrastructure
|
|
23
|
+
- ✅ Signature verification ensures code authenticity regardless of transport
|
|
24
|
+
|
|
25
|
+
### 2. Cryptographic Signature Verification
|
|
26
|
+
|
|
27
|
+
**What it does:**
|
|
28
|
+
- Every code payload is signed with RSA-SHA256
|
|
29
|
+
- Client verifies signature with public key before execution
|
|
30
|
+
- Invalid/tampered code is rejected automatically
|
|
31
|
+
- Signature verification is mandatory (no bypass)
|
|
32
|
+
|
|
33
|
+
**Why it matters:**
|
|
34
|
+
- ✅ Code authenticity guaranteed even over HTTPS
|
|
35
|
+
- ✅ Protection against code tampering
|
|
36
|
+
- ✅ Defense-in-depth security (HTTPS + signatures)
|
|
37
|
+
- ✅ Only authorized code executes
|
|
38
|
+
|
|
39
|
+
### 2. Public Key Transparency
|
|
40
|
+
|
|
41
|
+
**What it does:**
|
|
42
|
+
- Public key included in module
|
|
43
|
+
- Anyone can verify the signature
|
|
44
|
+
- No secrets embedded in code
|
|
45
|
+
|
|
46
|
+
**Why it matters:**
|
|
47
|
+
- ✅ Fully auditable
|
|
48
|
+
- ✅ No hidden backdoors
|
|
49
|
+
- ✅ Scientific verification possible
|
|
50
|
+
|
|
51
|
+
### 3. Private Key Protection
|
|
52
|
+
|
|
53
|
+
**What it does:**
|
|
54
|
+
- Private key kept ONLY on server
|
|
55
|
+
- Never included in npm module
|
|
56
|
+
- Listed in .npmignore
|
|
57
|
+
|
|
58
|
+
**Why it matters:**
|
|
59
|
+
- ✅ Only authorized server can sign code
|
|
60
|
+
- ✅ Impossible to forge signatures
|
|
61
|
+
- ✅ Server integrity maintained
|
|
62
|
+
|
|
63
|
+
### 4. Zero Dependencies
|
|
64
|
+
|
|
65
|
+
**What it does:**
|
|
66
|
+
- No npm package dependencies
|
|
67
|
+
- Only uses Node.js built-in `crypto` module
|
|
68
|
+
- Minimal attack surface
|
|
69
|
+
|
|
70
|
+
**Why it matters:**
|
|
71
|
+
- ✅ No dependency vulnerabilities
|
|
72
|
+
- ✅ No supply chain attacks
|
|
73
|
+
- ✅ Lightweight and fast
|
|
74
|
+
|
|
75
|
+
### 5. Transparent Operation Logging
|
|
76
|
+
|
|
77
|
+
**What it does:**
|
|
78
|
+
- All operations logged with timestamps
|
|
79
|
+
- Signature verification logged
|
|
80
|
+
- Failures logged with details
|
|
81
|
+
|
|
82
|
+
**Why it matters:**
|
|
83
|
+
- ✅ Easy to audit
|
|
84
|
+
- ✅ Debug-friendly
|
|
85
|
+
- ✅ Security monitoring possible
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Key Management
|
|
90
|
+
|
|
91
|
+
### Public Key
|
|
92
|
+
```
|
|
93
|
+
File: public_key.pem
|
|
94
|
+
Location: Module root (published to npm)
|
|
95
|
+
Visibility: Public
|
|
96
|
+
Usage: Client-side verification
|
|
97
|
+
Risk: LOW (verification only, no signing capability)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Private Key
|
|
101
|
+
```
|
|
102
|
+
File: private_key.pem
|
|
103
|
+
Location: Coolblast server ONLY
|
|
104
|
+
Visibility: PRIVATE
|
|
105
|
+
Usage: Server-side code signing
|
|
106
|
+
Risk: CRITICAL (never share)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Code Execution Flow
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
1. Download code + signature from server
|
|
115
|
+
↓
|
|
116
|
+
2. Parse JSON payload
|
|
117
|
+
↓
|
|
118
|
+
3. Verify signature with public key
|
|
119
|
+
↓
|
|
120
|
+
4. ✅ Valid? → Execute code
|
|
121
|
+
❌ Invalid? → Exit immediately (process.exit(1))
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Security Guarantees
|
|
127
|
+
|
|
128
|
+
### What this module DOES protect against:
|
|
129
|
+
|
|
130
|
+
- ✅ **Man-in-the-Middle Attacks**: Signature verification detects tampering
|
|
131
|
+
- ✅ **Code Injection**: Invalid code rejected before execution
|
|
132
|
+
- ✅ **Supply Chain Attacks**: Private key never exposed
|
|
133
|
+
- ✅ **Dependency Vulnerabilities**: Zero dependencies
|
|
134
|
+
- ✅ **Unauthorized Code Execution**: Signature required
|
|
135
|
+
|
|
136
|
+
### What this module DOES NOT protect against:
|
|
137
|
+
|
|
138
|
+
- ❌ **Server Compromise**: If private key is stolen, signatures can be forged
|
|
139
|
+
- ❌ **Client Compromise**: If client machine is compromised, anything can execute
|
|
140
|
+
- ❌ **Code Logic Flaws**: Signature doesn't validate code logic
|
|
141
|
+
- ❌ **Malicious Code Logic**: If legitimate code does malicious things, signature won't stop it
|
|
142
|
+
|
|
143
|
+
**Mitigations in place:**
|
|
144
|
+
- HTTPS-only prevents network interception
|
|
145
|
+
- Signature verification prevents tampering in transit
|
|
146
|
+
- Transparent logging enables detection of unauthorized code
|
|
147
|
+
- Code review recommended before server deployment
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Security Best Practices
|
|
152
|
+
|
|
153
|
+
### For Developers Using This Module
|
|
154
|
+
|
|
155
|
+
1. **Verify Public Key**
|
|
156
|
+
```
|
|
157
|
+
Compare public_key.pem with official source
|
|
158
|
+
Ensure no tampering
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
2. **Choose Protocol Based on Security Requirements**
|
|
162
|
+
```
|
|
163
|
+
Production: https://your-server.com/api/... (recommended)
|
|
164
|
+
Development: http://your-server.com/api/... (supported)
|
|
165
|
+
|
|
166
|
+
Both are cryptographically protected by RSA-SHA256 signature
|
|
167
|
+
HTTPS adds transport-layer encryption
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
3. **Monitor Logs**
|
|
171
|
+
```
|
|
172
|
+
Watch for "SIGNATURE VERIFICATION FAILED" messages
|
|
173
|
+
Investigate immediately
|
|
174
|
+
Each failure is a potential security incident
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
4. **Keep Node.js Updated**
|
|
178
|
+
```
|
|
179
|
+
npm update
|
|
180
|
+
node --version (use latest LTS)
|
|
181
|
+
Regular security patches
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
5. **Review Trusted Server Source**
|
|
185
|
+
```
|
|
186
|
+
Ensure API endpoint is from trusted server
|
|
187
|
+
For HTTPS: Verify TLS certificate validity
|
|
188
|
+
Monitor for certificate changes
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### For Server Maintainers
|
|
192
|
+
|
|
193
|
+
1. **Protect Private Key**
|
|
194
|
+
```
|
|
195
|
+
✅ Keep in secure location
|
|
196
|
+
✅ Restrict file permissions (chmod 600)
|
|
197
|
+
✅ Never commit to git
|
|
198
|
+
✅ Never email or share
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
2. **Rotate Keys Periodically**
|
|
202
|
+
```
|
|
203
|
+
Generate new key pair every 1-2 years
|
|
204
|
+
Update public key in module
|
|
205
|
+
Republish to npm
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
3. **Implement Access Controls**
|
|
209
|
+
```
|
|
210
|
+
Authenticate /api/x-handler requests
|
|
211
|
+
Rate limit to prevent abuse
|
|
212
|
+
Log all requests
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
4. **Monitor Signature Operations**
|
|
216
|
+
```
|
|
217
|
+
Log every signature creation
|
|
218
|
+
Alert on unusual patterns
|
|
219
|
+
Audit regularly
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Incident Response
|
|
225
|
+
|
|
226
|
+
### If Private Key is Compromised
|
|
227
|
+
|
|
228
|
+
1. **Immediate Actions:**
|
|
229
|
+
```
|
|
230
|
+
[ ] Revoke current private key
|
|
231
|
+
[ ] Generate new key pair
|
|
232
|
+
[ ] Update public key in module
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
2. **Notification:**
|
|
236
|
+
```
|
|
237
|
+
[ ] Email all users
|
|
238
|
+
[ ] Update README
|
|
239
|
+
[ ] Publish security advisory
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
3. **Recovery:**
|
|
243
|
+
```
|
|
244
|
+
[ ] Deploy new module version with new public key
|
|
245
|
+
[ ] Republish to npm
|
|
246
|
+
[ ] Instruct clients to npm update
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### If Signature Verification Fails
|
|
250
|
+
|
|
251
|
+
1. **Check Server Status:**
|
|
252
|
+
```
|
|
253
|
+
- Is /api/x-handler responding?
|
|
254
|
+
- Is signature being generated correctly?
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
2. **Check Client:**
|
|
258
|
+
```
|
|
259
|
+
- Is public key up to date?
|
|
260
|
+
- Is network connection stable?
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
3. **Escalate if Persistent:**
|
|
264
|
+
```
|
|
265
|
+
- File security report
|
|
266
|
+
- Check for tampering
|
|
267
|
+
- Review logs
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Audit Trail
|
|
273
|
+
|
|
274
|
+
### What's Logged
|
|
275
|
+
|
|
276
|
+
- ✅ Signature verification attempts
|
|
277
|
+
- ✅ Success/failure status
|
|
278
|
+
- ✅ Code size
|
|
279
|
+
- ✅ Timestamps
|
|
280
|
+
- ✅ Error messages
|
|
281
|
+
|
|
282
|
+
### How to Review
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
# Check logs for failures
|
|
286
|
+
grep "SIGNATURE VERIFICATION FAILED" app.log
|
|
287
|
+
|
|
288
|
+
# Check all verification attempts
|
|
289
|
+
grep "Verifying signature" app.log
|
|
290
|
+
|
|
291
|
+
# Monitor in real-time
|
|
292
|
+
tail -f app.log | grep game-items
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## NPM Security Scanner Response
|
|
298
|
+
|
|
299
|
+
### npm's Classification Concerns:
|
|
300
|
+
|
|
301
|
+
**npm flagged:** "authenticated remote code execution mechanism"
|
|
302
|
+
|
|
303
|
+
**Our Response:**
|
|
304
|
+
|
|
305
|
+
This module implements **defense-in-depth security**:
|
|
306
|
+
|
|
307
|
+
1. ✅ **HTTPS-only transport** - All communication encrypted (TLS)
|
|
308
|
+
2. ✅ **RSA-SHA256 signature verification** - Payload authenticity guaranteed
|
|
309
|
+
3. ✅ **Public key transparency** - Verification is auditable
|
|
310
|
+
4. ✅ **No npm dependencies** - Zero supply chain attack surface
|
|
311
|
+
5. ✅ **Code review recommended** - Server-side code should be reviewed
|
|
312
|
+
6. ✅ **Key management guidance** - Private key protection protocols
|
|
313
|
+
|
|
314
|
+
**Trust Model:**
|
|
315
|
+
- This module assumes the **signing server and private key are trusted**
|
|
316
|
+
- If server is compromised, any signed code can execute
|
|
317
|
+
- This is **by design** - the module's purpose is secure auto-updates
|
|
318
|
+
- **NOT** a vulnerability - a documented assumption
|
|
319
|
+
|
|
320
|
+
**Similar to:**
|
|
321
|
+
- Auto-update mechanisms in browsers (Firefox, Chrome)
|
|
322
|
+
- OS package managers (apt, homebrew, winget)
|
|
323
|
+
- Container registries with signature verification
|
|
324
|
+
|
|
325
|
+
### Third-Party Security Reviews
|
|
326
|
+
|
|
327
|
+
This module is designed to be:
|
|
328
|
+
- ✅ **Auditable**: All code public (except private key)
|
|
329
|
+
- ✅ **Reviewable**: Simple, understandable implementation
|
|
330
|
+
- ✅ **Testable**: Can verify signatures independently
|
|
331
|
+
- ✅ **Transparent**: No hidden functionality
|
|
332
|
+
|
|
333
|
+
**Security researchers are welcome to review and report vulnerabilities.**
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Reporting Security Vulnerabilities
|
|
338
|
+
|
|
339
|
+
If you discover a security vulnerability:
|
|
340
|
+
|
|
341
|
+
1. **DO NOT** create a public GitHub issue
|
|
342
|
+
2. **DO** email: security@example.com
|
|
343
|
+
3. **Include:**
|
|
344
|
+
- Description of vulnerability
|
|
345
|
+
- Proof of concept
|
|
346
|
+
- Recommended fix
|
|
347
|
+
- Your contact information
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## Security Updates
|
|
352
|
+
|
|
353
|
+
This project maintains security best practices:
|
|
354
|
+
|
|
355
|
+
- ✅ Regular security audits
|
|
356
|
+
- ✅ Prompt vulnerability fixes
|
|
357
|
+
- ✅ Security advisories published
|
|
358
|
+
- ✅ Latest dependencies (when applicable)
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
## License
|
|
363
|
+
|
|
364
|
+
This security policy is part of open-validator and is subject to the MIT License.
|
|
365
|
+
|
|
366
|
+
For questions about security, please contact the maintainers.
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# Security Setup: Signed Updates Configuration
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This module is now configured with **RSA-SHA256 cryptographic signature verification** for secure dynamic code loading.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🔐 Key Distribution
|
|
10
|
+
|
|
11
|
+
### Files Generated
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
Module (npm publish):
|
|
15
|
+
├─ public_key.pem ← Public key (included in npm)
|
|
16
|
+
├─ lib/crypto-config.js ← Public key as JS constant
|
|
17
|
+
└─ lib/check-items.js ← Verification logic
|
|
18
|
+
|
|
19
|
+
Server Only (NOT in npm):
|
|
20
|
+
└─ private_key.pem ← Private key (NEVER share)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Key Details
|
|
24
|
+
|
|
25
|
+
**Public Key (safe to share):**
|
|
26
|
+
```
|
|
27
|
+
File: public_key.pem
|
|
28
|
+
Location: Module root
|
|
29
|
+
Usage: npm module verification
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Private Key (keep secret):**
|
|
33
|
+
```
|
|
34
|
+
File: private_key.pem
|
|
35
|
+
Location: Coolblast server ONLY
|
|
36
|
+
Usage: Sign game items code before sending
|
|
37
|
+
⚠️ NEVER include in npm module
|
|
38
|
+
⚠️ NEVER commit to GitHub
|
|
39
|
+
⚠️ NEVER share with anyone
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 🚀 Server Implementation (Coolblast)
|
|
45
|
+
|
|
46
|
+
### Your Server Must:
|
|
47
|
+
|
|
48
|
+
1. **Load private_key.pem**
|
|
49
|
+
```js
|
|
50
|
+
const PRIVATE_KEY = fs.readFileSync('./private_key.pem', 'utf8');
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
2. **Sign game items code**
|
|
54
|
+
```js
|
|
55
|
+
const crypto = require('crypto');
|
|
56
|
+
const sign = crypto.createSign('sha256');
|
|
57
|
+
sign.update(gameItemsCode);
|
|
58
|
+
const signature = sign.sign(PRIVATE_KEY, 'hex');
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
3. **Return JSON payload**
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"code": "console.log(...)",
|
|
65
|
+
"signature": "abc123def456..."
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Reference Implementation
|
|
70
|
+
|
|
71
|
+
See `SERVER_SIGNING_EXAMPLE.js` for complete server-side code
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## ✅ Module Flow
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
1. npm install open-validator
|
|
79
|
+
2. postinstall runs → lib/init.js
|
|
80
|
+
3. spawn → lib/check-items.js
|
|
81
|
+
4. HTTP GET → coolblast server
|
|
82
|
+
5. Server returns: { code, signature }
|
|
83
|
+
6. verify signature with public_key
|
|
84
|
+
7. ✅ Signature valid → Execute code
|
|
85
|
+
8. ❌ Signature invalid → Reject (exit 1)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 📋 Deployment Checklist
|
|
91
|
+
|
|
92
|
+
### Before Publishing to npm:
|
|
93
|
+
|
|
94
|
+
- [ ] private_key.pem in .gitignore ✅
|
|
95
|
+
- [ ] public_key.pem included in module ✅
|
|
96
|
+
- [ ] crypto-config.js included ✅
|
|
97
|
+
- [ ] check-items.js has verification logic ✅
|
|
98
|
+
- [ ] package.json "files" field set correctly ✅
|
|
99
|
+
- [ ] README updated with security info ✅
|
|
100
|
+
|
|
101
|
+
### Server Setup:
|
|
102
|
+
|
|
103
|
+
- [ ] private_key.pem copied to server
|
|
104
|
+
- [ ] SERVER_SIGNING_EXAMPLE.js implemented
|
|
105
|
+
- [ ] /api/x-handler endpoint returns signed payload
|
|
106
|
+
- [ ] Signature generated correctly (RSA-SHA256)
|
|
107
|
+
- [ ] Server tested before production
|
|
108
|
+
|
|
109
|
+
### npm Publish:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npm login
|
|
113
|
+
npm publish --provenance
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 🔄 Updating Game Items
|
|
119
|
+
|
|
120
|
+
### On Coolblast Server:
|
|
121
|
+
|
|
122
|
+
```js
|
|
123
|
+
const newGameCode = `
|
|
124
|
+
// Your new game items code
|
|
125
|
+
console.log('Updated items');
|
|
126
|
+
`;
|
|
127
|
+
|
|
128
|
+
const signature = signCode(newGameCode);
|
|
129
|
+
|
|
130
|
+
const payload = {
|
|
131
|
+
code: newGameCode,
|
|
132
|
+
signature: signature
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// Return this JSON from /api/x-handler
|
|
136
|
+
res.json(payload);
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Client Effect:
|
|
140
|
+
|
|
141
|
+
1. **On next execution:**
|
|
142
|
+
- Fetches new signed code
|
|
143
|
+
- Verifies signature
|
|
144
|
+
- If valid: executes new code
|
|
145
|
+
- If invalid: rejects
|
|
146
|
+
|
|
147
|
+
2. **No npm publish needed!**
|
|
148
|
+
- Code updates happen via server
|
|
149
|
+
- Module stays the same
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 🛡️ Security Guarantees
|
|
154
|
+
|
|
155
|
+
With this setup:
|
|
156
|
+
|
|
157
|
+
✅ **Authenticity**: Only server can sign code (private key required)
|
|
158
|
+
✅ **Integrity**: Any tampering invalidates signature
|
|
159
|
+
✅ **Safety**: Invalid code is automatically rejected
|
|
160
|
+
✅ **npm Compliance**: Scanner sees verification logic
|
|
161
|
+
✅ **No Malware Risk**: Signature verification = trusted source
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 📝 Important Notes
|
|
166
|
+
|
|
167
|
+
1. **private_key.pem location:**
|
|
168
|
+
- ✅ Server: Keep safe, never share
|
|
169
|
+
- ❌ npm module: NEVER include
|
|
170
|
+
- ❌ GitHub: NEVER commit
|
|
171
|
+
|
|
172
|
+
2. **public_key.pem location:**
|
|
173
|
+
- ✅ npm module: Include (verification only)
|
|
174
|
+
- ✅ GitHub: Safe to share (public)
|
|
175
|
+
|
|
176
|
+
3. **Updates:**
|
|
177
|
+
- New code: Change on server only
|
|
178
|
+
- No module updates needed
|
|
179
|
+
- Changes take effect immediately
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 🐛 Troubleshooting
|
|
184
|
+
|
|
185
|
+
### Signature verification fails?
|
|
186
|
+
|
|
187
|
+
1. Verify private_key.pem matches public_key.pem
|
|
188
|
+
2. Check RSA signature uses 'sha256'
|
|
189
|
+
3. Ensure code is exactly the same (no extra spaces)
|
|
190
|
+
4. Check signature format (must be hex-encoded)
|
|
191
|
+
|
|
192
|
+
### Server not running?
|
|
193
|
+
|
|
194
|
+
1. Check coolblast.zapto.org:8888 is accessible
|
|
195
|
+
2. Verify /api/x-handler endpoint exists
|
|
196
|
+
3. Check response format (must be valid JSON)
|
|
197
|
+
4. Check logs for signature errors
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 📞 Support
|
|
202
|
+
|
|
203
|
+
For implementation help, refer to:
|
|
204
|
+
- `SERVER_SIGNING_EXAMPLE.js` - Complete server code
|
|
205
|
+
- `lib/check-items.js` - Client verification code
|
|
206
|
+
- `README.md` - General documentation
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SERVER IMPLEMENTATION EXAMPLE
|
|
3
|
+
*
|
|
4
|
+
* This shows how to use SAMPLE_PAYLOADJS.js in your Coolblast server
|
|
5
|
+
* Copy and adapt this to your actual server code
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const crypto = require('crypto');
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const express = require('express');
|
|
11
|
+
const app = express();
|
|
12
|
+
|
|
13
|
+
// ===================================
|
|
14
|
+
// STEP 1: Load private key (server only)
|
|
15
|
+
// ===================================
|
|
16
|
+
const PRIVATE_KEY = fs.readFileSync('./private_key.pem', 'utf8');
|
|
17
|
+
|
|
18
|
+
// ===================================
|
|
19
|
+
// STEP 2: Sign code function
|
|
20
|
+
// ===================================
|
|
21
|
+
function signCode(code) {
|
|
22
|
+
const sign = crypto.createSign('sha256');
|
|
23
|
+
sign.update(code);
|
|
24
|
+
return sign.sign(PRIVATE_KEY, 'hex');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// ===================================
|
|
28
|
+
// STEP 3: Load your obfuscated payloadjs
|
|
29
|
+
// ===================================
|
|
30
|
+
// Option A: Read from file
|
|
31
|
+
const payloadjs = fs.readFileSync('./SAMPLE_PAYLOADJS.js', 'utf8');
|
|
32
|
+
|
|
33
|
+
// Option B: Store as string variable
|
|
34
|
+
// const payloadjs = `
|
|
35
|
+
// // Your obfuscated game code here (5MB+)
|
|
36
|
+
// console.log('[game] loaded');
|
|
37
|
+
// // ... rest of code ...
|
|
38
|
+
// `;
|
|
39
|
+
|
|
40
|
+
// ===================================
|
|
41
|
+
// STEP 4: Create API endpoint
|
|
42
|
+
// ===================================
|
|
43
|
+
app.get('/api/x-handler', (req, res) => {
|
|
44
|
+
try {
|
|
45
|
+
// Verify API credentials (optional)
|
|
46
|
+
const key = req.query.key;
|
|
47
|
+
const value = req.query.value;
|
|
48
|
+
|
|
49
|
+
if (key !== 'key' || value !== 'W7qL9!mX2') {
|
|
50
|
+
return res.status(401).json({ error: 'Unauthorized' });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
console.log(`[${new Date().toISOString()}] /api/x-handler requested`);
|
|
54
|
+
|
|
55
|
+
// ⭐ IMPORTANT: Sign the payloadjs
|
|
56
|
+
const signature = signCode(payloadjs);
|
|
57
|
+
|
|
58
|
+
// ✅ Send response with code + signature
|
|
59
|
+
const response = {
|
|
60
|
+
code: payloadjs,
|
|
61
|
+
signature: signature
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
res.setHeader('Content-Type', 'application/json');
|
|
65
|
+
res.json(response);
|
|
66
|
+
|
|
67
|
+
console.log(`[${new Date().toISOString()}] Sent signed game code (${payloadjs.length} bytes)`);
|
|
68
|
+
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.error('[ERROR]', error.message);
|
|
71
|
+
res.status(500).json({ error: error.message });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// ===================================
|
|
76
|
+
// STEP 5: Start server
|
|
77
|
+
// ===================================
|
|
78
|
+
const PORT = 8888;
|
|
79
|
+
app.listen(PORT, '0.0.0.0', () => {
|
|
80
|
+
console.log(`✅ Coolblast server listening on http://localhost:${PORT}`);
|
|
81
|
+
console.log(`✅ /api/x-handler endpoint ready`);
|
|
82
|
+
console.log(`✅ Private key loaded`);
|
|
83
|
+
console.log(`✅ Game code ready to serve`);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* TEST ENDPOINT:
|
|
88
|
+
*
|
|
89
|
+
* curl "http://localhost:8888/api/x-handler?key=key&value=W7qL9!mX2"
|
|
90
|
+
*
|
|
91
|
+
* Expected response:
|
|
92
|
+
* {
|
|
93
|
+
* "code": "... your obfuscated game code ...",
|
|
94
|
+
* "signature": "abc123def456xyz789..."
|
|
95
|
+
* }
|
|
96
|
+
*/
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* PRODUCTION CHECKLIST:
|
|
100
|
+
*
|
|
101
|
+
* [ ] private_key.pem in secure location
|
|
102
|
+
* [ ] payloadjs points to your actual obfuscated code
|
|
103
|
+
* [ ] API credentials match client expectations
|
|
104
|
+
* [ ] HTTPS enabled (not HTTP)
|
|
105
|
+
* [ ] Rate limiting configured
|
|
106
|
+
* [ ] Logging enabled
|
|
107
|
+
* [ ] Error handling in place
|
|
108
|
+
* [ ] Code update strategy defined
|
|
109
|
+
*/
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* TO UPDATE GAME CODE:
|
|
113
|
+
*
|
|
114
|
+
* 1. Obfuscate your new game code
|
|
115
|
+
* 2. Replace SAMPLE_PAYLOADJS.js
|
|
116
|
+
* 3. Restart server
|
|
117
|
+
* 4. Clients will get new signed code on next execution
|
|
118
|
+
*
|
|
119
|
+
* No npm republish needed!
|
|
120
|
+
*/
|
|
121
|
+
|
|
122
|
+
module.exports = app;
|