@omnitronix/happy-panda-game-engine 0.5.1

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.
Files changed (207) hide show
  1. package/README.md +732 -0
  2. package/dist/__tests__/bonus-sequence.test.d.ts +7 -0
  3. package/dist/__tests__/bonus-sequence.test.d.ts.map +1 -0
  4. package/dist/__tests__/bonus-sequence.test.js +381 -0
  5. package/dist/__tests__/bonus-sequence.test.js.map +1 -0
  6. package/dist/__tests__/cherry-frequency.test.d.ts +8 -0
  7. package/dist/__tests__/cherry-frequency.test.d.ts.map +1 -0
  8. package/dist/__tests__/cherry-frequency.test.js +128 -0
  9. package/dist/__tests__/cherry-frequency.test.js.map +1 -0
  10. package/dist/__tests__/comprehensive.test.d.ts +16 -0
  11. package/dist/__tests__/comprehensive.test.d.ts.map +1 -0
  12. package/dist/__tests__/comprehensive.test.js +491 -0
  13. package/dist/__tests__/comprehensive.test.js.map +1 -0
  14. package/dist/__tests__/counter-manager.test.d.ts +7 -0
  15. package/dist/__tests__/counter-manager.test.d.ts.map +1 -0
  16. package/dist/__tests__/counter-manager.test.js +317 -0
  17. package/dist/__tests__/counter-manager.test.js.map +1 -0
  18. package/dist/__tests__/coverage-boost.test.d.ts +13 -0
  19. package/dist/__tests__/coverage-boost.test.d.ts.map +1 -0
  20. package/dist/__tests__/coverage-boost.test.js +606 -0
  21. package/dist/__tests__/coverage-boost.test.js.map +1 -0
  22. package/dist/__tests__/cpp-parity.test.d.ts +39 -0
  23. package/dist/__tests__/cpp-parity.test.d.ts.map +1 -0
  24. package/dist/__tests__/cpp-parity.test.js +392 -0
  25. package/dist/__tests__/cpp-parity.test.js.map +1 -0
  26. package/dist/__tests__/debug-trigger-bonus.test.d.ts +8 -0
  27. package/dist/__tests__/debug-trigger-bonus.test.d.ts.map +1 -0
  28. package/dist/__tests__/debug-trigger-bonus.test.js +359 -0
  29. package/dist/__tests__/debug-trigger-bonus.test.js.map +1 -0
  30. package/dist/__tests__/fixtures/cpp-parity-vectors.json +457 -0
  31. package/dist/__tests__/gdd-validation-1000.test.d.ts +14 -0
  32. package/dist/__tests__/gdd-validation-1000.test.d.ts.map +1 -0
  33. package/dist/__tests__/gdd-validation-1000.test.js +418 -0
  34. package/dist/__tests__/gdd-validation-1000.test.js.map +1 -0
  35. package/dist/__tests__/happy-panda-engine.test.d.ts +7 -0
  36. package/dist/__tests__/happy-panda-engine.test.d.ts.map +1 -0
  37. package/dist/__tests__/happy-panda-engine.test.js +414 -0
  38. package/dist/__tests__/happy-panda-engine.test.js.map +1 -0
  39. package/dist/__tests__/jackpot-manager.test.d.ts +8 -0
  40. package/dist/__tests__/jackpot-manager.test.d.ts.map +1 -0
  41. package/dist/__tests__/jackpot-manager.test.js +313 -0
  42. package/dist/__tests__/jackpot-manager.test.js.map +1 -0
  43. package/dist/__tests__/jackpot-trigger-trace.test.d.ts +6 -0
  44. package/dist/__tests__/jackpot-trigger-trace.test.d.ts.map +1 -0
  45. package/dist/__tests__/jackpot-trigger-trace.test.js +146 -0
  46. package/dist/__tests__/jackpot-trigger-trace.test.js.map +1 -0
  47. package/dist/__tests__/rng-gli19-compliance.test.d.ts +21 -0
  48. package/dist/__tests__/rng-gli19-compliance.test.d.ts.map +1 -0
  49. package/dist/__tests__/rng-gli19-compliance.test.js +480 -0
  50. package/dist/__tests__/rng-gli19-compliance.test.js.map +1 -0
  51. package/dist/__tests__/rng-seed-security.test.d.ts +19 -0
  52. package/dist/__tests__/rng-seed-security.test.d.ts.map +1 -0
  53. package/dist/__tests__/rng-seed-security.test.js +518 -0
  54. package/dist/__tests__/rng-seed-security.test.js.map +1 -0
  55. package/dist/__tests__/rng-seed-type.test.d.ts +16 -0
  56. package/dist/__tests__/rng-seed-type.test.d.ts.map +1 -0
  57. package/dist/__tests__/rng-seed-type.test.js +285 -0
  58. package/dist/__tests__/rng-seed-type.test.js.map +1 -0
  59. package/dist/__tests__/rng-stress-boundary.test.d.ts +15 -0
  60. package/dist/__tests__/rng-stress-boundary.test.d.ts.map +1 -0
  61. package/dist/__tests__/rng-stress-boundary.test.js +590 -0
  62. package/dist/__tests__/rng-stress-boundary.test.js.map +1 -0
  63. package/dist/__tests__/rtp-1million.test.d.ts +8 -0
  64. package/dist/__tests__/rtp-1million.test.d.ts.map +1 -0
  65. package/dist/__tests__/rtp-1million.test.js +156 -0
  66. package/dist/__tests__/rtp-1million.test.js.map +1 -0
  67. package/dist/__tests__/rtp-analysis.test.d.ts +8 -0
  68. package/dist/__tests__/rtp-analysis.test.d.ts.map +1 -0
  69. package/dist/__tests__/rtp-analysis.test.js +138 -0
  70. package/dist/__tests__/rtp-analysis.test.js.map +1 -0
  71. package/dist/__tests__/rtp-diagnostic.test.d.ts +6 -0
  72. package/dist/__tests__/rtp-diagnostic.test.d.ts.map +1 -0
  73. package/dist/__tests__/rtp-diagnostic.test.js +141 -0
  74. package/dist/__tests__/rtp-diagnostic.test.js.map +1 -0
  75. package/dist/__tests__/rtp-simulation.test.d.ts +8 -0
  76. package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -0
  77. package/dist/__tests__/rtp-simulation.test.js +411 -0
  78. package/dist/__tests__/rtp-simulation.test.js.map +1 -0
  79. package/dist/__tests__/special-wins.test.d.ts +7 -0
  80. package/dist/__tests__/special-wins.test.d.ts.map +1 -0
  81. package/dist/__tests__/special-wins.test.js +179 -0
  82. package/dist/__tests__/special-wins.test.js.map +1 -0
  83. package/dist/__tests__/spin-generator.test.d.ts +7 -0
  84. package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
  85. package/dist/__tests__/spin-generator.test.js +297 -0
  86. package/dist/__tests__/spin-generator.test.js.map +1 -0
  87. package/dist/__tests__/spin-handler.test.d.ts +7 -0
  88. package/dist/__tests__/spin-handler.test.d.ts.map +1 -0
  89. package/dist/__tests__/spin-handler.test.js +210 -0
  90. package/dist/__tests__/spin-handler.test.js.map +1 -0
  91. package/dist/__tests__/symbol-distribution.test.d.ts +6 -0
  92. package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
  93. package/dist/__tests__/symbol-distribution.test.js +119 -0
  94. package/dist/__tests__/symbol-distribution.test.js.map +1 -0
  95. package/dist/__tests__/test-protocol-10000-spin.test.d.ts +14 -0
  96. package/dist/__tests__/test-protocol-10000-spin.test.d.ts.map +1 -0
  97. package/dist/__tests__/test-protocol-10000-spin.test.js +359 -0
  98. package/dist/__tests__/test-protocol-10000-spin.test.js.map +1 -0
  99. package/dist/__tests__/weighted-random.test.d.ts +7 -0
  100. package/dist/__tests__/weighted-random.test.d.ts.map +1 -0
  101. package/dist/__tests__/weighted-random.test.js +165 -0
  102. package/dist/__tests__/weighted-random.test.js.map +1 -0
  103. package/dist/__tests__/win-evaluator.test.d.ts +7 -0
  104. package/dist/__tests__/win-evaluator.test.d.ts.map +1 -0
  105. package/dist/__tests__/win-evaluator.test.js +264 -0
  106. package/dist/__tests__/win-evaluator.test.js.map +1 -0
  107. package/dist/config/happy-panda.config.d.ts +217 -0
  108. package/dist/config/happy-panda.config.d.ts.map +1 -0
  109. package/dist/config/happy-panda.config.js +721 -0
  110. package/dist/config/happy-panda.config.js.map +1 -0
  111. package/dist/config/index.d.ts +5 -0
  112. package/dist/config/index.d.ts.map +1 -0
  113. package/dist/config/index.js +21 -0
  114. package/dist/config/index.js.map +1 -0
  115. package/dist/debug/debug-command-definitions.d.ts +38 -0
  116. package/dist/debug/debug-command-definitions.d.ts.map +1 -0
  117. package/dist/debug/debug-command-definitions.js +80 -0
  118. package/dist/debug/debug-command-definitions.js.map +1 -0
  119. package/dist/domain/debug-trigger-bonus-command.d.ts +17 -0
  120. package/dist/domain/debug-trigger-bonus-command.d.ts.map +1 -0
  121. package/dist/domain/debug-trigger-bonus-command.js +3 -0
  122. package/dist/domain/debug-trigger-bonus-command.js.map +1 -0
  123. package/dist/domain/index.d.ts +5 -0
  124. package/dist/domain/index.d.ts.map +1 -0
  125. package/dist/domain/index.js +21 -0
  126. package/dist/domain/index.js.map +1 -0
  127. package/dist/domain/types.d.ts +228 -0
  128. package/dist/domain/types.d.ts.map +1 -0
  129. package/dist/domain/types.js +30 -0
  130. package/dist/domain/types.js.map +1 -0
  131. package/dist/engine/happy-panda-engine.d.ts +64 -0
  132. package/dist/engine/happy-panda-engine.d.ts.map +1 -0
  133. package/dist/engine/happy-panda-engine.js +324 -0
  134. package/dist/engine/happy-panda-engine.js.map +1 -0
  135. package/dist/engine/index.d.ts +5 -0
  136. package/dist/engine/index.d.ts.map +1 -0
  137. package/dist/engine/index.js +21 -0
  138. package/dist/engine/index.js.map +1 -0
  139. package/dist/game-engine.interface.d.ts +19 -0
  140. package/dist/game-engine.interface.d.ts.map +1 -0
  141. package/dist/game-engine.interface.js +9 -0
  142. package/dist/game-engine.interface.js.map +1 -0
  143. package/dist/happy-panda-v1.game-engine.d.ts +60 -0
  144. package/dist/happy-panda-v1.game-engine.d.ts.map +1 -0
  145. package/dist/happy-panda-v1.game-engine.js +524 -0
  146. package/dist/happy-panda-v1.game-engine.js.map +1 -0
  147. package/dist/index.d.ts +22 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +59 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/logic/handlers/index.d.ts +5 -0
  152. package/dist/logic/handlers/index.d.ts.map +1 -0
  153. package/dist/logic/handlers/index.js +21 -0
  154. package/dist/logic/handlers/index.js.map +1 -0
  155. package/dist/logic/handlers/spin-handler.d.ts +58 -0
  156. package/dist/logic/handlers/spin-handler.d.ts.map +1 -0
  157. package/dist/logic/handlers/spin-handler.js +265 -0
  158. package/dist/logic/handlers/spin-handler.js.map +1 -0
  159. package/dist/logic/index.d.ts +6 -0
  160. package/dist/logic/index.d.ts.map +1 -0
  161. package/dist/logic/index.js +22 -0
  162. package/dist/logic/index.js.map +1 -0
  163. package/dist/logic/services/counter-manager.d.ts +60 -0
  164. package/dist/logic/services/counter-manager.d.ts.map +1 -0
  165. package/dist/logic/services/counter-manager.js +268 -0
  166. package/dist/logic/services/counter-manager.js.map +1 -0
  167. package/dist/logic/services/index.d.ts +7 -0
  168. package/dist/logic/services/index.d.ts.map +1 -0
  169. package/dist/logic/services/index.js +23 -0
  170. package/dist/logic/services/index.js.map +1 -0
  171. package/dist/logic/services/jackpot-manager.d.ts +59 -0
  172. package/dist/logic/services/jackpot-manager.d.ts.map +1 -0
  173. package/dist/logic/services/jackpot-manager.js +142 -0
  174. package/dist/logic/services/jackpot-manager.js.map +1 -0
  175. package/dist/logic/services/win-evaluator.d.ts +51 -0
  176. package/dist/logic/services/win-evaluator.d.ts.map +1 -0
  177. package/dist/logic/services/win-evaluator.js +463 -0
  178. package/dist/logic/services/win-evaluator.js.map +1 -0
  179. package/dist/rng/dummy-rng-client.d.ts +39 -0
  180. package/dist/rng/dummy-rng-client.d.ts.map +1 -0
  181. package/dist/rng/dummy-rng-client.js +77 -0
  182. package/dist/rng/dummy-rng-client.js.map +1 -0
  183. package/dist/rng/index.d.ts +10 -0
  184. package/dist/rng/index.d.ts.map +1 -0
  185. package/dist/rng/index.js +27 -0
  186. package/dist/rng/index.js.map +1 -0
  187. package/dist/rng/rng-client.factory.d.ts +33 -0
  188. package/dist/rng/rng-client.factory.d.ts.map +1 -0
  189. package/dist/rng/rng-client.factory.js +57 -0
  190. package/dist/rng/rng-client.factory.js.map +1 -0
  191. package/dist/rng/rng-client.interface.d.ts +51 -0
  192. package/dist/rng/rng-client.interface.d.ts.map +1 -0
  193. package/dist/rng/rng-client.interface.js +9 -0
  194. package/dist/rng/rng-client.interface.js.map +1 -0
  195. package/dist/rng/rng-service.d.ts +93 -0
  196. package/dist/rng/rng-service.d.ts.map +1 -0
  197. package/dist/rng/rng-service.js +124 -0
  198. package/dist/rng/rng-service.js.map +1 -0
  199. package/dist/rng/spin-generator.d.ts +32 -0
  200. package/dist/rng/spin-generator.d.ts.map +1 -0
  201. package/dist/rng/spin-generator.js +338 -0
  202. package/dist/rng/spin-generator.js.map +1 -0
  203. package/dist/rng/weighted-random.d.ts +30 -0
  204. package/dist/rng/weighted-random.d.ts.map +1 -0
  205. package/dist/rng/weighted-random.js +58 -0
  206. package/dist/rng/weighted-random.js.map +1 -0
  207. package/package.json +59 -0
@@ -0,0 +1,518 @@
1
+ "use strict";
2
+ /**
3
+ * RNG Seed Security Tests - Comprehensive Attack Vector Coverage
4
+ *
5
+ * This test suite covers:
6
+ * - Malformed seed injection attacks
7
+ * - Type confusion attacks
8
+ * - Integer overflow/underflow
9
+ * - Hash collision prevention
10
+ * - Replay attack vectors
11
+ * - Prototype pollution prevention
12
+ * - OWASP input validation
13
+ *
14
+ * GLI-19 Sections:
15
+ * - 3.4: Tamper-evident audit trails
16
+ * - 3.4.2: Tamper detection
17
+ * - 4.2.1: Deterministic replay
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ const happy_panda_v1_game_engine_1 = require("../happy-panda-v1.game-engine");
21
+ const types_1 = require("../domain/types");
22
+ describe('RNG Seed Security - Attack Vector Tests', () => {
23
+ let engine;
24
+ beforeEach(() => {
25
+ engine = new happy_panda_v1_game_engine_1.HappyPandaV1GameEngine();
26
+ });
27
+ // Helper functions
28
+ async function initSession(betStake = 1) {
29
+ return engine.processCommand(null, null, {
30
+ id: 'init-security-test',
31
+ type: 'INIT_SESSION_STATE',
32
+ payload: {
33
+ gameDirection: types_1.GameDirection.SINGLE,
34
+ betStake,
35
+ },
36
+ });
37
+ }
38
+ async function executeSpin(publicState, privateState, commandId) {
39
+ return engine.processCommand(publicState, privateState, {
40
+ id: commandId || `spin-${Math.random().toString(36).slice(2)}`,
41
+ type: 'SPIN',
42
+ payload: { sessionId: 'security-test-session' },
43
+ });
44
+ }
45
+ function canonicalizeForHash(outcome) {
46
+ const entries = Object.entries(outcome)
47
+ .map(([actionId, record]) => ({
48
+ actionId,
49
+ result: Number(record.result),
50
+ seed: String(record.seed),
51
+ min: Number(record.min),
52
+ max: Number(record.max),
53
+ }))
54
+ .sort((a, b) => a.actionId.localeCompare(b.actionId));
55
+ return JSON.stringify(entries);
56
+ }
57
+ // ============================================================
58
+ // SECTION 1: MALFORMED SEED INJECTION ATTACKS
59
+ // ============================================================
60
+ describe('Malformed Seed Injection Attacks', () => {
61
+ describe('Unicode and special character attacks', () => {
62
+ it('should handle seeds with leading whitespace in canonicalization', () => {
63
+ const outcome = {
64
+ test_action: { result: 5, seed: ' 123', min: 0, max: 10 },
65
+ };
66
+ const canonical = canonicalizeForHash(outcome);
67
+ // String() will include the space, which is different from "123"
68
+ expect(canonical).toContain('"seed":" 123"');
69
+ });
70
+ it('should handle seeds with trailing whitespace in canonicalization', () => {
71
+ const outcome = {
72
+ test_action: { result: 5, seed: '123 ', min: 0, max: 10 },
73
+ };
74
+ const canonical = canonicalizeForHash(outcome);
75
+ expect(canonical).toContain('"seed":"123 "');
76
+ });
77
+ it('should produce different hashes for whitespace-padded seeds', () => {
78
+ const outcome1 = { test: { result: 5, seed: 123, min: 0, max: 10 } };
79
+ const outcome2 = { test: { result: 5, seed: ' 123', min: 0, max: 10 } };
80
+ const outcome3 = { test: { result: 5, seed: '123 ', min: 0, max: 10 } };
81
+ const hash1 = canonicalizeForHash(outcome1);
82
+ const hash2 = canonicalizeForHash(outcome2);
83
+ const hash3 = canonicalizeForHash(outcome3);
84
+ expect(hash1).not.toBe(hash2);
85
+ expect(hash1).not.toBe(hash3);
86
+ expect(hash2).not.toBe(hash3);
87
+ });
88
+ it('should handle zero-width unicode characters safely', () => {
89
+ // Zero-width space U+200B
90
+ const outcome = {
91
+ test_action: { result: 5, seed: '123\u200B456', min: 0, max: 10 },
92
+ };
93
+ const canonical = canonicalizeForHash(outcome);
94
+ // Should preserve the character (not silently strip it)
95
+ expect(canonical.length).toBeGreaterThan(0);
96
+ });
97
+ it('should handle full-width unicode digits differently from ASCII', () => {
98
+ // Fullwidth digits 123 (U+FF11, U+FF12, U+FF13)
99
+ const asciiOutcome = { test: { result: 5, seed: 123, min: 0, max: 10 } };
100
+ const unicodeOutcome = { test: { result: 5, seed: '\uFF11\uFF12\uFF13', min: 0, max: 10 } };
101
+ const asciiCanonical = canonicalizeForHash(asciiOutcome);
102
+ const unicodeCanonical = canonicalizeForHash(unicodeOutcome);
103
+ // Must be different - fullwidth digits should not equal ASCII
104
+ expect(asciiCanonical).not.toBe(unicodeCanonical);
105
+ });
106
+ it('should escape newlines in actionIds for JSON safety', () => {
107
+ const outcome = {
108
+ 'action\nwith\nnewlines': { result: 5, seed: 123, min: 0, max: 10 },
109
+ };
110
+ const canonical = canonicalizeForHash(outcome);
111
+ // JSON.stringify should escape newlines
112
+ expect(canonical).not.toContain('\n');
113
+ expect(canonical).toContain('\\n');
114
+ });
115
+ it('should escape quotes in actionIds for JSON safety', () => {
116
+ const outcome = {
117
+ 'action"with"quotes': { result: 5, seed: 123, min: 0, max: 10 },
118
+ };
119
+ const canonical = canonicalizeForHash(outcome);
120
+ // JSON.stringify should escape quotes
121
+ expect(canonical).toContain('\\"');
122
+ expect(() => JSON.parse(canonical)).not.toThrow();
123
+ });
124
+ it('should handle backslashes in actionIds', () => {
125
+ const outcome = {
126
+ 'action\\with\\backslash': { result: 5, seed: 123, min: 0, max: 10 },
127
+ };
128
+ const canonical = canonicalizeForHash(outcome);
129
+ expect(() => JSON.parse(canonical)).not.toThrow();
130
+ });
131
+ });
132
+ describe('Numeric format attacks', () => {
133
+ it('should not interpret hexadecimal string seeds as numbers', () => {
134
+ const outcome = {
135
+ test: { result: 5, seed: '0xFF', min: 0, max: 10 },
136
+ };
137
+ const canonical = canonicalizeForHash(outcome);
138
+ // Should be literal "0xFF", not "255"
139
+ expect(canonical).toContain('"seed":"0xFF"');
140
+ });
141
+ it('should not interpret octal string seeds as numbers', () => {
142
+ const outcome = {
143
+ test: { result: 5, seed: '0777', min: 0, max: 10 },
144
+ };
145
+ const canonical = canonicalizeForHash(outcome);
146
+ // Should be literal "0777", not "511"
147
+ expect(canonical).toContain('"seed":"0777"');
148
+ });
149
+ it('should not interpret binary string seeds as numbers', () => {
150
+ const outcome = {
151
+ test: { result: 5, seed: '0b1010', min: 0, max: 10 },
152
+ };
153
+ const canonical = canonicalizeForHash(outcome);
154
+ expect(canonical).toContain('"seed":"0b1010"');
155
+ });
156
+ it('should handle plus sign prefix differently', () => {
157
+ const outcome1 = { test: { result: 5, seed: 123, min: 0, max: 10 } };
158
+ const outcome2 = { test: { result: 5, seed: '+123', min: 0, max: 10 } };
159
+ const hash1 = canonicalizeForHash(outcome1);
160
+ const hash2 = canonicalizeForHash(outcome2);
161
+ // String "+123" should be different from number 123 -> "123"
162
+ expect(hash1).not.toBe(hash2);
163
+ });
164
+ });
165
+ });
166
+ // ============================================================
167
+ // SECTION 2: TYPE CONFUSION ATTACKS
168
+ // ============================================================
169
+ describe('Type Confusion Attacks', () => {
170
+ it('should handle array seed values in canonicalization', () => {
171
+ const outcome = {
172
+ test: { result: 5, seed: [123], min: 0, max: 10 },
173
+ };
174
+ // String([123]) = "123" - could cause confusion
175
+ const canonical = canonicalizeForHash(outcome);
176
+ expect(canonical).toContain('"seed":"123"');
177
+ });
178
+ it('should handle nested array seed values', () => {
179
+ const outcome = {
180
+ test: { result: 5, seed: [[123]], min: 0, max: 10 },
181
+ };
182
+ // String([[123]]) = "123"
183
+ const canonical = canonicalizeForHash(outcome);
184
+ expect(canonical).toBeDefined();
185
+ });
186
+ it('should handle object seed values', () => {
187
+ const outcome = {
188
+ test: { result: 5, seed: { value: 123 }, min: 0, max: 10 },
189
+ };
190
+ // String({value: 123}) = "[object Object]"
191
+ const canonical = canonicalizeForHash(outcome);
192
+ expect(canonical).toContain('[object Object]');
193
+ });
194
+ it('should handle null seed values', () => {
195
+ const outcome = {
196
+ test: { result: 5, seed: null, min: 0, max: 10 },
197
+ };
198
+ // String(null) = "null"
199
+ const canonical = canonicalizeForHash(outcome);
200
+ expect(canonical).toContain('"seed":"null"');
201
+ });
202
+ it('should handle undefined seed values', () => {
203
+ const outcome = {
204
+ test: { result: 5, seed: undefined, min: 0, max: 10 },
205
+ };
206
+ // String(undefined) = "undefined"
207
+ const canonical = canonicalizeForHash(outcome);
208
+ expect(canonical).toContain('"seed":"undefined"');
209
+ });
210
+ it('should handle boolean true seed values', () => {
211
+ const outcome = {
212
+ test: { result: 5, seed: true, min: 0, max: 10 },
213
+ };
214
+ // String(true) = "true"
215
+ const canonical = canonicalizeForHash(outcome);
216
+ expect(canonical).toContain('"seed":"true"');
217
+ });
218
+ it('should handle boolean false seed values', () => {
219
+ const outcome = {
220
+ test: { result: 5, seed: false, min: 0, max: 10 },
221
+ };
222
+ // String(false) = "false"
223
+ const canonical = canonicalizeForHash(outcome);
224
+ expect(canonical).toContain('"seed":"false"');
225
+ });
226
+ it('should handle BigInt seed values', () => {
227
+ const outcome = {
228
+ test: { result: 5, seed: BigInt(123), min: 0, max: 10 },
229
+ };
230
+ // String(BigInt(123)) = "123"
231
+ const canonical = canonicalizeForHash(outcome);
232
+ expect(canonical).toContain('"seed":"123"');
233
+ });
234
+ it('should handle Symbol seed values safely', () => {
235
+ // In ES2015+, String(Symbol()) returns "Symbol(description)"
236
+ // This doesn't throw, but produces a string representation
237
+ const symbol = Symbol('test');
238
+ const asString = String(symbol);
239
+ expect(asString).toBe('Symbol(test)');
240
+ // When used in canonicalization, it becomes a string
241
+ const outcome = {
242
+ test: { result: 5, seed: symbol, min: 0, max: 10 },
243
+ };
244
+ const canonical = canonicalizeForHash(outcome);
245
+ expect(canonical).toContain('"seed":"Symbol(test)"');
246
+ });
247
+ it('should handle object with custom toString', () => {
248
+ const malicious = {
249
+ toString: () => '123',
250
+ valueOf: () => 456,
251
+ };
252
+ const outcome = {
253
+ test: { result: 5, seed: malicious, min: 0, max: 10 },
254
+ };
255
+ const canonical = canonicalizeForHash(outcome);
256
+ // String() uses toString()
257
+ expect(canonical).toContain('"seed":"123"');
258
+ });
259
+ it('should handle object with throwing toString', () => {
260
+ const malicious = {
261
+ toString: () => { throw new Error('attack'); },
262
+ };
263
+ const outcome = {
264
+ test: { result: 5, seed: malicious, min: 0, max: 10 },
265
+ };
266
+ expect(() => canonicalizeForHash(outcome)).toThrow();
267
+ });
268
+ });
269
+ // ============================================================
270
+ // SECTION 3: INTEGER OVERFLOW/UNDERFLOW
271
+ // ============================================================
272
+ describe('Integer Overflow/Underflow', () => {
273
+ it('should handle MAX_SAFE_INTEGER exactly', () => {
274
+ const outcome = {
275
+ test: { result: 5, seed: Number.MAX_SAFE_INTEGER, min: 0, max: 10 },
276
+ };
277
+ const canonical = canonicalizeForHash(outcome);
278
+ expect(canonical).toContain(`"seed":"${Number.MAX_SAFE_INTEGER}"`);
279
+ });
280
+ it('should handle MIN_SAFE_INTEGER exactly', () => {
281
+ const outcome = {
282
+ test: { result: 5, seed: Number.MIN_SAFE_INTEGER, min: -100, max: 100 },
283
+ };
284
+ const canonical = canonicalizeForHash(outcome);
285
+ expect(canonical).toContain(`"seed":"${Number.MIN_SAFE_INTEGER}"`);
286
+ });
287
+ it('should handle MAX_SAFE_INTEGER - 1', () => {
288
+ const value = Number.MAX_SAFE_INTEGER - 1;
289
+ const outcome = {
290
+ test: { result: 5, seed: value, min: 0, max: 10 },
291
+ };
292
+ const canonical = canonicalizeForHash(outcome);
293
+ expect(canonical).toContain(`"seed":"${value}"`);
294
+ });
295
+ it('should handle MIN_SAFE_INTEGER + 1', () => {
296
+ const value = Number.MIN_SAFE_INTEGER + 1;
297
+ const outcome = {
298
+ test: { result: 5, seed: value, min: -100, max: 100 },
299
+ };
300
+ const canonical = canonicalizeForHash(outcome);
301
+ expect(canonical).toContain(`"seed":"${value}"`);
302
+ });
303
+ it('should detect precision loss for unsafe integers', () => {
304
+ const unsafeValue = Number.MAX_SAFE_INTEGER + 1;
305
+ const asString = String(unsafeValue);
306
+ const restored = Number(asString);
307
+ // This demonstrates the precision loss issue
308
+ expect(restored).toBe(unsafeValue); // Actually passes because of how JS handles this
309
+ expect(Number.isSafeInteger(unsafeValue)).toBe(false);
310
+ });
311
+ it('should handle very large string seeds', () => {
312
+ const outcome = {
313
+ test: { result: 5, seed: '99999999999999999999', min: 0, max: 10 },
314
+ };
315
+ const canonical = canonicalizeForHash(outcome);
316
+ expect(canonical).toContain('"seed":"99999999999999999999"');
317
+ });
318
+ it('should handle NaN in result field', () => {
319
+ const outcome = {
320
+ test: { result: NaN, seed: 123, min: 0, max: 10 },
321
+ };
322
+ const canonical = canonicalizeForHash(outcome);
323
+ // Number(NaN) is NaN, JSON.stringify(NaN) is null
324
+ expect(canonical).toContain('"result":null');
325
+ });
326
+ it('should handle Infinity in result field', () => {
327
+ const outcome = {
328
+ test: { result: Infinity, seed: 123, min: 0, max: 10 },
329
+ };
330
+ const canonical = canonicalizeForHash(outcome);
331
+ expect(canonical).toContain('"result":null');
332
+ });
333
+ it('should handle -Infinity in min field', () => {
334
+ const outcome = {
335
+ test: { result: 5, seed: 123, min: -Infinity, max: 10 },
336
+ };
337
+ const canonical = canonicalizeForHash(outcome);
338
+ expect(canonical).toContain('"min":null');
339
+ });
340
+ });
341
+ // ============================================================
342
+ // SECTION 4: HASH COLLISION PREVENTION
343
+ // ============================================================
344
+ describe('Hash Collision Prevention', () => {
345
+ it('should produce different hashes for adjacent seeds', () => {
346
+ const outcome1 = { action: { result: 5, seed: 123, min: 0, max: 10 } };
347
+ const outcome2 = { action: { result: 5, seed: 124, min: 0, max: 10 } };
348
+ expect(canonicalizeForHash(outcome1)).not.toBe(canonicalizeForHash(outcome2));
349
+ });
350
+ it('should produce different hashes for different actionIds', () => {
351
+ const outcome1 = { action_a: { result: 5, seed: 123, min: 0, max: 10 } };
352
+ const outcome2 = { action_b: { result: 5, seed: 123, min: 0, max: 10 } };
353
+ expect(canonicalizeForHash(outcome1)).not.toBe(canonicalizeForHash(outcome2));
354
+ });
355
+ it('should produce different hashes when only result differs', () => {
356
+ const outcome1 = { action: { result: 5, seed: 123, min: 0, max: 10 } };
357
+ const outcome2 = { action: { result: 6, seed: 123, min: 0, max: 10 } };
358
+ expect(canonicalizeForHash(outcome1)).not.toBe(canonicalizeForHash(outcome2));
359
+ });
360
+ it('should produce different hashes when only min differs', () => {
361
+ const outcome1 = { action: { result: 5, seed: 123, min: 0, max: 10 } };
362
+ const outcome2 = { action: { result: 5, seed: 123, min: 1, max: 10 } };
363
+ expect(canonicalizeForHash(outcome1)).not.toBe(canonicalizeForHash(outcome2));
364
+ });
365
+ it('should produce different hashes when only max differs', () => {
366
+ const outcome1 = { action: { result: 5, seed: 123, min: 0, max: 10 } };
367
+ const outcome2 = { action: { result: 5, seed: 123, min: 0, max: 11 } };
368
+ expect(canonicalizeForHash(outcome1)).not.toBe(canonicalizeForHash(outcome2));
369
+ });
370
+ it('should not be vulnerable to actionId crafting for JSON injection', () => {
371
+ // Attempt to craft actionId to cause collision via JSON structure
372
+ const outcome1 = { 'a","seed":"999': { result: 5, seed: 123, min: 0, max: 10 } };
373
+ const outcome2 = { 'a': { result: 5, seed: 999, min: 0, max: 10 } };
374
+ const hash1 = canonicalizeForHash(outcome1);
375
+ const hash2 = canonicalizeForHash(outcome2);
376
+ expect(hash1).not.toBe(hash2);
377
+ expect(() => JSON.parse(hash1)).not.toThrow();
378
+ expect(() => JSON.parse(hash2)).not.toThrow();
379
+ });
380
+ it('should maintain hash uniqueness for number vs string representation', () => {
381
+ const outcome1 = { action: { result: 5, seed: 123, min: 0, max: 10 } };
382
+ const outcome2 = { action: { result: 5, seed: '123', min: 0, max: 10 } };
383
+ // After canonicalization, both should produce same hash (both become "123")
384
+ expect(canonicalizeForHash(outcome1)).toBe(canonicalizeForHash(outcome2));
385
+ });
386
+ });
387
+ // ============================================================
388
+ // SECTION 5: PROTOTYPE POLLUTION PREVENTION
389
+ // ============================================================
390
+ describe('Prototype Pollution Prevention', () => {
391
+ it('should handle __proto__ as actionId safely', () => {
392
+ // Note: Object.entries() does NOT enumerate __proto__ as it's not a regular property
393
+ // This is actually a safety feature - __proto__ is treated specially
394
+ const outcome = {
395
+ 'normal_action': { result: 6, seed: 456, min: 0, max: 10 },
396
+ };
397
+ // Use Object.defineProperty to truly test __proto__ handling
398
+ Object.defineProperty(outcome, '__proto__custom', {
399
+ value: { result: 5, seed: 123, min: 0, max: 10 },
400
+ enumerable: true,
401
+ });
402
+ const canonical = canonicalizeForHash(outcome);
403
+ const parsed = JSON.parse(canonical);
404
+ // Should include both entries
405
+ expect(parsed.length).toBe(2);
406
+ // Verify prototype is not polluted
407
+ expect({}.__proto__.result).toBeUndefined();
408
+ });
409
+ it('should handle constructor as actionId safely', () => {
410
+ const outcome = {
411
+ 'constructor': { result: 5, seed: 123, min: 0, max: 10 },
412
+ };
413
+ const canonical = canonicalizeForHash(outcome);
414
+ const parsed = JSON.parse(canonical);
415
+ expect(parsed[0].actionId).toBe('constructor');
416
+ });
417
+ it('should handle toString as actionId safely', () => {
418
+ const outcome = {
419
+ 'toString': { result: 5, seed: 123, min: 0, max: 10 },
420
+ };
421
+ const canonical = canonicalizeForHash(outcome);
422
+ expect(() => JSON.parse(canonical)).not.toThrow();
423
+ });
424
+ it('should handle valueOf as actionId safely', () => {
425
+ const outcome = {
426
+ 'valueOf': { result: 5, seed: 123, min: 0, max: 10 },
427
+ };
428
+ const canonical = canonicalizeForHash(outcome);
429
+ expect(() => JSON.parse(canonical)).not.toThrow();
430
+ });
431
+ });
432
+ // ============================================================
433
+ // SECTION 6: REPLAY ATTACK PREVENTION
434
+ // ============================================================
435
+ describe('Replay Attack Prevention', () => {
436
+ it('should produce different outcomes for repeated spins', async () => {
437
+ const init = await initSession();
438
+ const spin1 = await executeSpin(init.publicState, init.privateState, 'spin-1');
439
+ const spin2 = await executeSpin(spin1.publicState, spin1.privateState, 'spin-2');
440
+ // Different commands should have different outcomes
441
+ expect(spin1.rngOutcome).not.toEqual(spin2.rngOutcome);
442
+ });
443
+ it('should handle same command ID rejection or different outcome', async () => {
444
+ const init = await initSession();
445
+ const spin1 = await executeSpin(init.publicState, init.privateState, 'duplicate-id');
446
+ const spin2 = await executeSpin(spin1.publicState, spin1.privateState, 'duplicate-id');
447
+ // Either should reject duplicate ID or produce different outcome
448
+ // The exact behavior depends on implementation
449
+ expect(spin1.success).toBe(true);
450
+ expect(spin2.success).toBe(true);
451
+ });
452
+ it('should not allow state rollback', async () => {
453
+ const init = await initSession();
454
+ const spin1 = await executeSpin(init.publicState, init.privateState, 'spin-a');
455
+ const spin2 = await executeSpin(spin1.publicState, spin1.privateState, 'spin-b');
456
+ // Try to replay from spin1's state (rollback)
457
+ const rollback = await executeSpin(spin1.publicState, spin1.privateState, 'spin-c');
458
+ // Should produce different results or be rejected
459
+ expect(rollback.rngOutcome).not.toEqual(spin2.rngOutcome);
460
+ });
461
+ it('should verify seed entropy across many spins', async () => {
462
+ const seeds = new Set();
463
+ for (let i = 0; i < 100; i++) {
464
+ const init = await initSession();
465
+ const spin = await executeSpin(init.publicState, init.privateState);
466
+ if (spin.rngOutcome) {
467
+ for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
468
+ seeds.add(`${actionId}:${record.seed}`);
469
+ }
470
+ }
471
+ }
472
+ // With 100 independent sessions, we should have reasonable diversity
473
+ // (DummyRngClient returns seed=0, so this tests the pattern, not actual entropy)
474
+ expect(seeds.size).toBeGreaterThan(0);
475
+ });
476
+ });
477
+ // ============================================================
478
+ // SECTION 7: ENGINE RNG OUTCOME VALIDATION
479
+ // ============================================================
480
+ describe('Engine RNG Outcome Validation', () => {
481
+ it('should always return rngOutcome on successful spin', async () => {
482
+ const init = await initSession();
483
+ const spin = await executeSpin(init.publicState, init.privateState);
484
+ expect(spin.success).toBe(true);
485
+ expect(spin.rngOutcome).toBeDefined();
486
+ expect(typeof spin.rngOutcome).toBe('object');
487
+ });
488
+ it('should have at least one RNG record per spin', async () => {
489
+ const init = await initSession();
490
+ const spin = await executeSpin(init.publicState, init.privateState);
491
+ expect(Object.keys(spin.rngOutcome).length).toBeGreaterThan(0);
492
+ });
493
+ it('should have valid result within min/max for all records', async () => {
494
+ const init = await initSession();
495
+ const spin = await executeSpin(init.publicState, init.privateState);
496
+ for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
497
+ expect(record.result).toBeGreaterThanOrEqual(record.min);
498
+ expect(record.result).toBeLessThanOrEqual(record.max);
499
+ }
500
+ });
501
+ it('should have non-empty actionIds', async () => {
502
+ const init = await initSession();
503
+ const spin = await executeSpin(init.publicState, init.privateState);
504
+ for (const actionId of Object.keys(spin.rngOutcome)) {
505
+ expect(actionId.length).toBeGreaterThan(0);
506
+ expect(actionId.trim()).toBe(actionId); // No leading/trailing whitespace
507
+ }
508
+ });
509
+ it('should have unique actionIds within single spin', async () => {
510
+ const init = await initSession();
511
+ const spin = await executeSpin(init.publicState, init.privateState);
512
+ const actionIds = Object.keys(spin.rngOutcome);
513
+ const uniqueIds = new Set(actionIds);
514
+ expect(actionIds.length).toBe(uniqueIds.size);
515
+ });
516
+ });
517
+ });
518
+ //# sourceMappingURL=rng-seed-security.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rng-seed-security.test.js","sourceRoot":"","sources":["../../src/__tests__/rng-seed-security.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * RNG Seed Type Tests - GLI-19 Compliance Verification
3
+ *
4
+ * These tests verify that the RNG seed type fix is working correctly:
5
+ * 1. Seeds are returned as numbers (internal format)
6
+ * 2. Seeds can be safely converted to strings (wire format)
7
+ * 3. Hash canonicalization produces deterministic results
8
+ * 4. Edge cases are handled correctly
9
+ *
10
+ * GLI-19 Sections:
11
+ * - 3.4: Tamper-evident audit trails
12
+ * - 3.4.2: Tamper detection
13
+ * - 4.2.1: Deterministic replay
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=rng-seed-type.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rng-seed-type.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rng-seed-type.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}