susi-qemu 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/bin/susi +9 -4
  3. data/lib/disk.rb +7 -5
  4. data/lib/novnc/core/base64.js +104 -0
  5. data/lib/novnc/core/crypto/aes.js +178 -0
  6. data/lib/novnc/core/crypto/bigint.js +34 -0
  7. data/lib/novnc/core/crypto/crypto.js +90 -0
  8. data/lib/novnc/core/crypto/des.js +330 -0
  9. data/lib/novnc/core/crypto/dh.js +55 -0
  10. data/lib/novnc/core/crypto/md5.js +82 -0
  11. data/lib/novnc/core/crypto/rsa.js +132 -0
  12. data/lib/novnc/core/decoders/copyrect.js +27 -0
  13. data/lib/novnc/core/decoders/h264.js +321 -0
  14. data/lib/novnc/core/decoders/hextile.js +181 -0
  15. data/lib/novnc/core/decoders/jpeg.js +146 -0
  16. data/lib/novnc/core/decoders/raw.js +59 -0
  17. data/lib/novnc/core/decoders/rre.js +44 -0
  18. data/lib/novnc/core/decoders/tight.js +393 -0
  19. data/lib/novnc/core/decoders/tightpng.js +27 -0
  20. data/lib/novnc/core/decoders/zlib.js +51 -0
  21. data/lib/novnc/core/decoders/zrle.js +185 -0
  22. data/lib/novnc/core/deflator.js +84 -0
  23. data/lib/novnc/core/display.js +575 -0
  24. data/lib/novnc/core/encodings.js +53 -0
  25. data/lib/novnc/core/inflator.js +65 -0
  26. data/lib/novnc/core/input/domkeytable.js +311 -0
  27. data/lib/novnc/core/input/fixedkeys.js +129 -0
  28. data/lib/novnc/core/input/gesturehandler.js +567 -0
  29. data/lib/novnc/core/input/keyboard.js +294 -0
  30. data/lib/novnc/core/input/keysym.js +616 -0
  31. data/lib/novnc/core/input/keysymdef.js +688 -0
  32. data/lib/novnc/core/input/util.js +191 -0
  33. data/lib/novnc/core/input/vkeys.js +116 -0
  34. data/lib/novnc/core/input/xtscancodes.js +173 -0
  35. data/lib/novnc/core/ra2.js +312 -0
  36. data/lib/novnc/core/rfb.js +3257 -0
  37. data/lib/novnc/core/util/browser.js +172 -0
  38. data/lib/novnc/core/util/cursor.js +249 -0
  39. data/lib/novnc/core/util/element.js +32 -0
  40. data/lib/novnc/core/util/events.js +138 -0
  41. data/lib/novnc/core/util/eventtarget.js +35 -0
  42. data/lib/novnc/core/util/int.js +15 -0
  43. data/lib/novnc/core/util/logging.js +56 -0
  44. data/lib/novnc/core/util/strings.js +28 -0
  45. data/lib/novnc/core/websock.js +365 -0
  46. data/lib/novnc/screen.html +21 -0
  47. data/lib/novnc/vendor/pako/lib/utils/common.js +45 -0
  48. data/lib/novnc/vendor/pako/lib/zlib/adler32.js +27 -0
  49. data/lib/novnc/vendor/pako/lib/zlib/constants.js +47 -0
  50. data/lib/novnc/vendor/pako/lib/zlib/crc32.js +36 -0
  51. data/lib/novnc/vendor/pako/lib/zlib/deflate.js +1846 -0
  52. data/lib/novnc/vendor/pako/lib/zlib/gzheader.js +35 -0
  53. data/lib/novnc/vendor/pako/lib/zlib/inffast.js +324 -0
  54. data/lib/novnc/vendor/pako/lib/zlib/inflate.js +1527 -0
  55. data/lib/novnc/vendor/pako/lib/zlib/inftrees.js +322 -0
  56. data/lib/novnc/vendor/pako/lib/zlib/messages.js +11 -0
  57. data/lib/novnc/vendor/pako/lib/zlib/trees.js +1195 -0
  58. data/lib/novnc/vendor/pako/lib/zlib/zstream.js +24 -0
  59. data/lib/output.rb +11 -0
  60. data/lib/qmp.rb +6 -0
  61. data/lib/ssh.rb +3 -1
  62. data/lib/susi.rb +7 -6
  63. data/lib/version.rb +1 -1
  64. data/lib/vm.rb +36 -13
  65. data/lib/vnc.rb +34 -30
  66. metadata +57 -1
@@ -0,0 +1,330 @@
1
+ /*
2
+ * Ported from Flashlight VNC ActionScript implementation:
3
+ * http://www.wizhelp.com/flashlight-vnc/
4
+ *
5
+ * Full attribution follows:
6
+ *
7
+ * -------------------------------------------------------------------------
8
+ *
9
+ * This DES class has been extracted from package Acme.Crypto for use in VNC.
10
+ * The unnecessary odd parity code has been removed.
11
+ *
12
+ * These changes are:
13
+ * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
14
+ *
15
+ * This software is distributed in the hope that it will be useful,
16
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18
+ *
19
+
20
+ * DesCipher - the DES encryption method
21
+ *
22
+ * The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is:
23
+ *
24
+ * Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved.
25
+ *
26
+ * Permission to use, copy, modify, and distribute this software
27
+ * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
28
+ * without fee is hereby granted, provided that this copyright notice is kept
29
+ * intact.
30
+ *
31
+ * WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
32
+ * OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
33
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
34
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE
35
+ * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
36
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
37
+ *
38
+ * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
39
+ * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
40
+ * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
41
+ * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
42
+ * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
43
+ * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
44
+ * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). WIDGET WORKSHOP
45
+ * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
46
+ * HIGH RISK ACTIVITIES.
47
+ *
48
+ *
49
+ * The rest is:
50
+ *
51
+ * Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>. All rights reserved.
52
+ *
53
+ * Redistribution and use in source and binary forms, with or without
54
+ * modification, are permitted provided that the following conditions
55
+ * are met:
56
+ * 1. Redistributions of source code must retain the above copyright
57
+ * notice, this list of conditions and the following disclaimer.
58
+ * 2. Redistributions in binary form must reproduce the above copyright
59
+ * notice, this list of conditions and the following disclaimer in the
60
+ * documentation and/or other materials provided with the distribution.
61
+ *
62
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
63
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
64
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
65
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
66
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
67
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
68
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
69
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
70
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
71
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
72
+ * SUCH DAMAGE.
73
+ *
74
+ * Visit the ACME Labs Java page for up-to-date versions of this and other
75
+ * fine Java utilities: http://www.acme.com/java/
76
+ */
77
+
78
+ /* eslint-disable comma-spacing */
79
+
80
+ // Tables, permutations, S-boxes, etc.
81
+ const PC2 = [13,16,10,23, 0, 4, 2,27,14, 5,20, 9,22,18,11, 3,
82
+ 25, 7,15, 6,26,19,12, 1,40,51,30,36,46,54,29,39,
83
+ 50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31 ],
84
+ totrot = [ 1, 2, 4, 6, 8,10,12,14,15,17,19,21,23,25,27,28];
85
+
86
+ const z = 0x0;
87
+ let a,b,c,d,e,f;
88
+ a=1<<16; b=1<<24; c=a|b; d=1<<2; e=1<<10; f=d|e;
89
+ const SP1 = [c|e,z|z,a|z,c|f,c|d,a|f,z|d,a|z,z|e,c|e,c|f,z|e,b|f,c|d,b|z,z|d,
90
+ z|f,b|e,b|e,a|e,a|e,c|z,c|z,b|f,a|d,b|d,b|d,a|d,z|z,z|f,a|f,b|z,
91
+ a|z,c|f,z|d,c|z,c|e,b|z,b|z,z|e,c|d,a|z,a|e,b|d,z|e,z|d,b|f,a|f,
92
+ c|f,a|d,c|z,b|f,b|d,z|f,a|f,c|e,z|f,b|e,b|e,z|z,a|d,a|e,z|z,c|d];
93
+ a=1<<20; b=1<<31; c=a|b; d=1<<5; e=1<<15; f=d|e;
94
+ const SP2 = [c|f,b|e,z|e,a|f,a|z,z|d,c|d,b|f,b|d,c|f,c|e,b|z,b|e,a|z,z|d,c|d,
95
+ a|e,a|d,b|f,z|z,b|z,z|e,a|f,c|z,a|d,b|d,z|z,a|e,z|f,c|e,c|z,z|f,
96
+ z|z,a|f,c|d,a|z,b|f,c|z,c|e,z|e,c|z,b|e,z|d,c|f,a|f,z|d,z|e,b|z,
97
+ z|f,c|e,a|z,b|d,a|d,b|f,b|d,a|d,a|e,z|z,b|e,z|f,b|z,c|d,c|f,a|e];
98
+ a=1<<17; b=1<<27; c=a|b; d=1<<3; e=1<<9; f=d|e;
99
+ const SP3 = [z|f,c|e,z|z,c|d,b|e,z|z,a|f,b|e,a|d,b|d,b|d,a|z,c|f,a|d,c|z,z|f,
100
+ b|z,z|d,c|e,z|e,a|e,c|z,c|d,a|f,b|f,a|e,a|z,b|f,z|d,c|f,z|e,b|z,
101
+ c|e,b|z,a|d,z|f,a|z,c|e,b|e,z|z,z|e,a|d,c|f,b|e,b|d,z|e,z|z,c|d,
102
+ b|f,a|z,b|z,c|f,z|d,a|f,a|e,b|d,c|z,b|f,z|f,c|z,a|f,z|d,c|d,a|e];
103
+ a=1<<13; b=1<<23; c=a|b; d=1<<0; e=1<<7; f=d|e;
104
+ const SP4 = [c|d,a|f,a|f,z|e,c|e,b|f,b|d,a|d,z|z,c|z,c|z,c|f,z|f,z|z,b|e,b|d,
105
+ z|d,a|z,b|z,c|d,z|e,b|z,a|d,a|e,b|f,z|d,a|e,b|e,a|z,c|e,c|f,z|f,
106
+ b|e,b|d,c|z,c|f,z|f,z|z,z|z,c|z,a|e,b|e,b|f,z|d,c|d,a|f,a|f,z|e,
107
+ c|f,z|f,z|d,a|z,b|d,a|d,c|e,b|f,a|d,a|e,b|z,c|d,z|e,b|z,a|z,c|e];
108
+ a=1<<25; b=1<<30; c=a|b; d=1<<8; e=1<<19; f=d|e;
109
+ const SP5 = [z|d,a|f,a|e,c|d,z|e,z|d,b|z,a|e,b|f,z|e,a|d,b|f,c|d,c|e,z|f,b|z,
110
+ a|z,b|e,b|e,z|z,b|d,c|f,c|f,a|d,c|e,b|d,z|z,c|z,a|f,a|z,c|z,z|f,
111
+ z|e,c|d,z|d,a|z,b|z,a|e,c|d,b|f,a|d,b|z,c|e,a|f,b|f,z|d,a|z,c|e,
112
+ c|f,z|f,c|z,c|f,a|e,z|z,b|e,c|z,z|f,a|d,b|d,z|e,z|z,b|e,a|f,b|d];
113
+ a=1<<22; b=1<<29; c=a|b; d=1<<4; e=1<<14; f=d|e;
114
+ const SP6 = [b|d,c|z,z|e,c|f,c|z,z|d,c|f,a|z,b|e,a|f,a|z,b|d,a|d,b|e,b|z,z|f,
115
+ z|z,a|d,b|f,z|e,a|e,b|f,z|d,c|d,c|d,z|z,a|f,c|e,z|f,a|e,c|e,b|z,
116
+ b|e,z|d,c|d,a|e,c|f,a|z,z|f,b|d,a|z,b|e,b|z,z|f,b|d,c|f,a|e,c|z,
117
+ a|f,c|e,z|z,c|d,z|d,z|e,c|z,a|f,z|e,a|d,b|f,z|z,c|e,b|z,a|d,b|f];
118
+ a=1<<21; b=1<<26; c=a|b; d=1<<1; e=1<<11; f=d|e;
119
+ const SP7 = [a|z,c|d,b|f,z|z,z|e,b|f,a|f,c|e,c|f,a|z,z|z,b|d,z|d,b|z,c|d,z|f,
120
+ b|e,a|f,a|d,b|e,b|d,c|z,c|e,a|d,c|z,z|e,z|f,c|f,a|e,z|d,b|z,a|e,
121
+ b|z,a|e,a|z,b|f,b|f,c|d,c|d,z|d,a|d,b|z,b|e,a|z,c|e,z|f,a|f,c|e,
122
+ z|f,b|d,c|f,c|z,a|e,z|z,z|d,c|f,z|z,a|f,c|z,z|e,b|d,b|e,z|e,a|d];
123
+ a=1<<18; b=1<<28; c=a|b; d=1<<6; e=1<<12; f=d|e;
124
+ const SP8 = [b|f,z|e,a|z,c|f,b|z,b|f,z|d,b|z,a|d,c|z,c|f,a|e,c|e,a|f,z|e,z|d,
125
+ c|z,b|d,b|e,z|f,a|e,a|d,c|d,c|e,z|f,z|z,z|z,c|d,b|d,b|e,a|f,a|z,
126
+ a|f,a|z,c|e,z|e,z|d,c|d,z|e,a|f,b|e,z|d,b|d,c|z,c|d,b|z,a|z,b|f,
127
+ z|z,c|f,a|d,b|d,c|z,b|e,b|f,z|z,c|f,a|e,a|e,z|f,z|f,a|d,b|z,c|e];
128
+
129
+ /* eslint-enable comma-spacing */
130
+
131
+ class DES {
132
+ constructor(password) {
133
+ this.keys = [];
134
+
135
+ // Set the key.
136
+ const pc1m = [], pcr = [], kn = [];
137
+
138
+ for (let j = 0, l = 56; j < 56; ++j, l -= 8) {
139
+ l += l < -5 ? 65 : l < -3 ? 31 : l < -1 ? 63 : l === 27 ? 35 : 0; // PC1
140
+ const m = l & 0x7;
141
+ pc1m[j] = ((password[l >>> 3] & (1<<m)) !== 0) ? 1: 0;
142
+ }
143
+
144
+ for (let i = 0; i < 16; ++i) {
145
+ const m = i << 1;
146
+ const n = m + 1;
147
+ kn[m] = kn[n] = 0;
148
+ for (let o = 28; o < 59; o += 28) {
149
+ for (let j = o - 28; j < o; ++j) {
150
+ const l = j + totrot[i];
151
+ pcr[j] = l < o ? pc1m[l] : pc1m[l - 28];
152
+ }
153
+ }
154
+ for (let j = 0; j < 24; ++j) {
155
+ if (pcr[PC2[j]] !== 0) {
156
+ kn[m] |= 1 << (23 - j);
157
+ }
158
+ if (pcr[PC2[j + 24]] !== 0) {
159
+ kn[n] |= 1 << (23 - j);
160
+ }
161
+ }
162
+ }
163
+
164
+ // cookey
165
+ for (let i = 0, rawi = 0, KnLi = 0; i < 16; ++i) {
166
+ const raw0 = kn[rawi++];
167
+ const raw1 = kn[rawi++];
168
+ this.keys[KnLi] = (raw0 & 0x00fc0000) << 6;
169
+ this.keys[KnLi] |= (raw0 & 0x00000fc0) << 10;
170
+ this.keys[KnLi] |= (raw1 & 0x00fc0000) >>> 10;
171
+ this.keys[KnLi] |= (raw1 & 0x00000fc0) >>> 6;
172
+ ++KnLi;
173
+ this.keys[KnLi] = (raw0 & 0x0003f000) << 12;
174
+ this.keys[KnLi] |= (raw0 & 0x0000003f) << 16;
175
+ this.keys[KnLi] |= (raw1 & 0x0003f000) >>> 4;
176
+ this.keys[KnLi] |= (raw1 & 0x0000003f);
177
+ ++KnLi;
178
+ }
179
+ }
180
+
181
+ // Encrypt 8 bytes of text
182
+ enc8(text) {
183
+ const b = text.slice();
184
+ let i = 0, l, r, x; // left, right, accumulator
185
+
186
+ // Squash 8 bytes to 2 ints
187
+ l = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++];
188
+ r = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++];
189
+
190
+ x = ((l >>> 4) ^ r) & 0x0f0f0f0f;
191
+ r ^= x;
192
+ l ^= (x << 4);
193
+ x = ((l >>> 16) ^ r) & 0x0000ffff;
194
+ r ^= x;
195
+ l ^= (x << 16);
196
+ x = ((r >>> 2) ^ l) & 0x33333333;
197
+ l ^= x;
198
+ r ^= (x << 2);
199
+ x = ((r >>> 8) ^ l) & 0x00ff00ff;
200
+ l ^= x;
201
+ r ^= (x << 8);
202
+ r = (r << 1) | ((r >>> 31) & 1);
203
+ x = (l ^ r) & 0xaaaaaaaa;
204
+ l ^= x;
205
+ r ^= x;
206
+ l = (l << 1) | ((l >>> 31) & 1);
207
+
208
+ for (let i = 0, keysi = 0; i < 8; ++i) {
209
+ x = (r << 28) | (r >>> 4);
210
+ x ^= this.keys[keysi++];
211
+ let fval = SP7[x & 0x3f];
212
+ fval |= SP5[(x >>> 8) & 0x3f];
213
+ fval |= SP3[(x >>> 16) & 0x3f];
214
+ fval |= SP1[(x >>> 24) & 0x3f];
215
+ x = r ^ this.keys[keysi++];
216
+ fval |= SP8[x & 0x3f];
217
+ fval |= SP6[(x >>> 8) & 0x3f];
218
+ fval |= SP4[(x >>> 16) & 0x3f];
219
+ fval |= SP2[(x >>> 24) & 0x3f];
220
+ l ^= fval;
221
+ x = (l << 28) | (l >>> 4);
222
+ x ^= this.keys[keysi++];
223
+ fval = SP7[x & 0x3f];
224
+ fval |= SP5[(x >>> 8) & 0x3f];
225
+ fval |= SP3[(x >>> 16) & 0x3f];
226
+ fval |= SP1[(x >>> 24) & 0x3f];
227
+ x = l ^ this.keys[keysi++];
228
+ fval |= SP8[x & 0x0000003f];
229
+ fval |= SP6[(x >>> 8) & 0x3f];
230
+ fval |= SP4[(x >>> 16) & 0x3f];
231
+ fval |= SP2[(x >>> 24) & 0x3f];
232
+ r ^= fval;
233
+ }
234
+
235
+ r = (r << 31) | (r >>> 1);
236
+ x = (l ^ r) & 0xaaaaaaaa;
237
+ l ^= x;
238
+ r ^= x;
239
+ l = (l << 31) | (l >>> 1);
240
+ x = ((l >>> 8) ^ r) & 0x00ff00ff;
241
+ r ^= x;
242
+ l ^= (x << 8);
243
+ x = ((l >>> 2) ^ r) & 0x33333333;
244
+ r ^= x;
245
+ l ^= (x << 2);
246
+ x = ((r >>> 16) ^ l) & 0x0000ffff;
247
+ l ^= x;
248
+ r ^= (x << 16);
249
+ x = ((r >>> 4) ^ l) & 0x0f0f0f0f;
250
+ l ^= x;
251
+ r ^= (x << 4);
252
+
253
+ // Spread ints to bytes
254
+ x = [r, l];
255
+ for (i = 0; i < 8; i++) {
256
+ b[i] = (x[i>>>2] >>> (8 * (3 - (i % 4)))) % 256;
257
+ if (b[i] < 0) { b[i] += 256; } // unsigned
258
+ }
259
+ return b;
260
+ }
261
+ }
262
+
263
+ export class DESECBCipher {
264
+ constructor() {
265
+ this._cipher = null;
266
+ }
267
+
268
+ get algorithm() {
269
+ return { name: "DES-ECB" };
270
+ }
271
+
272
+ static importKey(key, _algorithm, _extractable, _keyUsages) {
273
+ const cipher = new DESECBCipher;
274
+ cipher._importKey(key);
275
+ return cipher;
276
+ }
277
+
278
+ _importKey(key, _extractable, _keyUsages) {
279
+ this._cipher = new DES(key);
280
+ }
281
+
282
+ encrypt(_algorithm, plaintext) {
283
+ const x = new Uint8Array(plaintext);
284
+ if (x.length % 8 !== 0 || this._cipher === null) {
285
+ return null;
286
+ }
287
+ const n = x.length / 8;
288
+ for (let i = 0; i < n; i++) {
289
+ x.set(this._cipher.enc8(x.slice(i * 8, i * 8 + 8)), i * 8);
290
+ }
291
+ return x;
292
+ }
293
+ }
294
+
295
+ export class DESCBCCipher {
296
+ constructor() {
297
+ this._cipher = null;
298
+ }
299
+
300
+ get algorithm() {
301
+ return { name: "DES-CBC" };
302
+ }
303
+
304
+ static importKey(key, _algorithm, _extractable, _keyUsages) {
305
+ const cipher = new DESCBCCipher;
306
+ cipher._importKey(key);
307
+ return cipher;
308
+ }
309
+
310
+ _importKey(key) {
311
+ this._cipher = new DES(key);
312
+ }
313
+
314
+ encrypt(algorithm, plaintext) {
315
+ const x = new Uint8Array(plaintext);
316
+ let y = new Uint8Array(algorithm.iv);
317
+ if (x.length % 8 !== 0 || this._cipher === null) {
318
+ return null;
319
+ }
320
+ const n = x.length / 8;
321
+ for (let i = 0; i < n; i++) {
322
+ for (let j = 0; j < 8; j++) {
323
+ y[j] ^= plaintext[i * 8 + j];
324
+ }
325
+ y = this._cipher.enc8(y);
326
+ x.set(y, i * 8);
327
+ }
328
+ return x;
329
+ }
330
+ }
@@ -0,0 +1,55 @@
1
+ import { modPow, bigIntToU8Array, u8ArrayToBigInt } from "./bigint.js";
2
+
3
+ class DHPublicKey {
4
+ constructor(key) {
5
+ this._key = key;
6
+ }
7
+
8
+ get algorithm() {
9
+ return { name: "DH" };
10
+ }
11
+
12
+ exportKey() {
13
+ return this._key;
14
+ }
15
+ }
16
+
17
+ export class DHCipher {
18
+ constructor() {
19
+ this._g = null;
20
+ this._p = null;
21
+ this._gBigInt = null;
22
+ this._pBigInt = null;
23
+ this._privateKey = null;
24
+ }
25
+
26
+ get algorithm() {
27
+ return { name: "DH" };
28
+ }
29
+
30
+ static generateKey(algorithm, _extractable) {
31
+ const cipher = new DHCipher;
32
+ cipher._generateKey(algorithm);
33
+ return { privateKey: cipher, publicKey: new DHPublicKey(cipher._publicKey) };
34
+ }
35
+
36
+ _generateKey(algorithm) {
37
+ const g = algorithm.g;
38
+ const p = algorithm.p;
39
+ this._keyBytes = p.length;
40
+ this._gBigInt = u8ArrayToBigInt(g);
41
+ this._pBigInt = u8ArrayToBigInt(p);
42
+ this._privateKey = window.crypto.getRandomValues(new Uint8Array(this._keyBytes));
43
+ this._privateKeyBigInt = u8ArrayToBigInt(this._privateKey);
44
+ this._publicKey = bigIntToU8Array(modPow(
45
+ this._gBigInt, this._privateKeyBigInt, this._pBigInt), this._keyBytes);
46
+ }
47
+
48
+ deriveBits(algorithm, length) {
49
+ const bytes = Math.ceil(length / 8);
50
+ const pkey = new Uint8Array(algorithm.public);
51
+ const len = bytes > this._keyBytes ? bytes : this._keyBytes;
52
+ const secret = modPow(u8ArrayToBigInt(pkey), this._privateKeyBigInt, this._pBigInt);
53
+ return bigIntToU8Array(secret, len).slice(0, len);
54
+ }
55
+ }
@@ -0,0 +1,82 @@
1
+ /*
2
+ * noVNC: HTML5 VNC client
3
+ * Copyright (C) 2021 The noVNC Authors
4
+ * Licensed under MPL 2.0 (see LICENSE.txt)
5
+ *
6
+ * See README.md for usage and integration instructions.
7
+ */
8
+
9
+ /*
10
+ * Performs MD5 hashing on an array of bytes, returns an array of bytes
11
+ */
12
+
13
+ export async function MD5(d) {
14
+ let s = "";
15
+ for (let i = 0; i < d.length; i++) {
16
+ s += String.fromCharCode(d[i]);
17
+ }
18
+ return M(V(Y(X(s), 8 * s.length)));
19
+ }
20
+
21
+ function M(d) {
22
+ let f = new Uint8Array(d.length);
23
+ for (let i=0;i<d.length;i++) {
24
+ f[i] = d.charCodeAt(i);
25
+ }
26
+ return f;
27
+ }
28
+
29
+ function X(d) {
30
+ let r = Array(d.length >> 2);
31
+ for (let m = 0; m < r.length; m++) r[m] = 0;
32
+ for (let m = 0; m < 8 * d.length; m += 8) r[m >> 5] |= (255 & d.charCodeAt(m / 8)) << m % 32;
33
+ return r;
34
+ }
35
+
36
+ function V(d) {
37
+ let r = "";
38
+ for (let m = 0; m < 32 * d.length; m += 8) r += String.fromCharCode(d[m >> 5] >>> m % 32 & 255);
39
+ return r;
40
+ }
41
+
42
+ function Y(d, g) {
43
+ d[g >> 5] |= 128 << g % 32, d[14 + (g + 64 >>> 9 << 4)] = g;
44
+ let m = 1732584193, f = -271733879, r = -1732584194, i = 271733878;
45
+ for (let n = 0; n < d.length; n += 16) {
46
+ let h = m,
47
+ t = f,
48
+ g = r,
49
+ e = i;
50
+ f = ii(f = ii(f = ii(f = ii(f = hh(f = hh(f = hh(f = hh(f = gg(f = gg(f = gg(f = gg(f = ff(f = ff(f = ff(f = ff(f, r = ff(r, i = ff(i, m = ff(m, f, r, i, d[n + 0], 7, -680876936), f, r, d[n + 1], 12, -389564586), m, f, d[n + 2], 17, 606105819), i, m, d[n + 3], 22, -1044525330), r = ff(r, i = ff(i, m = ff(m, f, r, i, d[n + 4], 7, -176418897), f, r, d[n + 5], 12, 1200080426), m, f, d[n + 6], 17, -1473231341), i, m, d[n + 7], 22, -45705983), r = ff(r, i = ff(i, m = ff(m, f, r, i, d[n + 8], 7, 1770035416), f, r, d[n + 9], 12, -1958414417), m, f, d[n + 10], 17, -42063), i, m, d[n + 11], 22, -1990404162), r = ff(r, i = ff(i, m = ff(m, f, r, i, d[n + 12], 7, 1804603682), f, r, d[n + 13], 12, -40341101), m, f, d[n + 14], 17, -1502002290), i, m, d[n + 15], 22, 1236535329), r = gg(r, i = gg(i, m = gg(m, f, r, i, d[n + 1], 5, -165796510), f, r, d[n + 6], 9, -1069501632), m, f, d[n + 11], 14, 643717713), i, m, d[n + 0], 20, -373897302), r = gg(r, i = gg(i, m = gg(m, f, r, i, d[n + 5], 5, -701558691), f, r, d[n + 10], 9, 38016083), m, f, d[n + 15], 14, -660478335), i, m, d[n + 4], 20, -405537848), r = gg(r, i = gg(i, m = gg(m, f, r, i, d[n + 9], 5, 568446438), f, r, d[n + 14], 9, -1019803690), m, f, d[n + 3], 14, -187363961), i, m, d[n + 8], 20, 1163531501), r = gg(r, i = gg(i, m = gg(m, f, r, i, d[n + 13], 5, -1444681467), f, r, d[n + 2], 9, -51403784), m, f, d[n + 7], 14, 1735328473), i, m, d[n + 12], 20, -1926607734), r = hh(r, i = hh(i, m = hh(m, f, r, i, d[n + 5], 4, -378558), f, r, d[n + 8], 11, -2022574463), m, f, d[n + 11], 16, 1839030562), i, m, d[n + 14], 23, -35309556), r = hh(r, i = hh(i, m = hh(m, f, r, i, d[n + 1], 4, -1530992060), f, r, d[n + 4], 11, 1272893353), m, f, d[n + 7], 16, -155497632), i, m, d[n + 10], 23, -1094730640), r = hh(r, i = hh(i, m = hh(m, f, r, i, d[n + 13], 4, 681279174), f, r, d[n + 0], 11, -358537222), m, f, d[n + 3], 16, -722521979), i, m, d[n + 6], 23, 76029189), r = hh(r, i = hh(i, m = hh(m, f, r, i, d[n + 9], 4, -640364487), f, r, d[n + 12], 11, -421815835), m, f, d[n + 15], 16, 530742520), i, m, d[n + 2], 23, -995338651), r = ii(r, i = ii(i, m = ii(m, f, r, i, d[n + 0], 6, -198630844), f, r, d[n + 7], 10, 1126891415), m, f, d[n + 14], 15, -1416354905), i, m, d[n + 5], 21, -57434055), r = ii(r, i = ii(i, m = ii(m, f, r, i, d[n + 12], 6, 1700485571), f, r, d[n + 3], 10, -1894986606), m, f, d[n + 10], 15, -1051523), i, m, d[n + 1], 21, -2054922799), r = ii(r, i = ii(i, m = ii(m, f, r, i, d[n + 8], 6, 1873313359), f, r, d[n + 15], 10, -30611744), m, f, d[n + 6], 15, -1560198380), i, m, d[n + 13], 21, 1309151649), r = ii(r, i = ii(i, m = ii(m, f, r, i, d[n + 4], 6, -145523070), f, r, d[n + 11], 10, -1120210379), m, f, d[n + 2], 15, 718787259), i, m, d[n + 9], 21, -343485551), m = add(m, h), f = add(f, t), r = add(r, g), i = add(i, e);
51
+ }
52
+ return Array(m, f, r, i);
53
+ }
54
+
55
+ function cmn(d, g, m, f, r, i) {
56
+ return add(rol(add(add(g, d), add(f, i)), r), m);
57
+ }
58
+
59
+ function ff(d, g, m, f, r, i, n) {
60
+ return cmn(g & m | ~g & f, d, g, r, i, n);
61
+ }
62
+
63
+ function gg(d, g, m, f, r, i, n) {
64
+ return cmn(g & f | m & ~f, d, g, r, i, n);
65
+ }
66
+
67
+ function hh(d, g, m, f, r, i, n) {
68
+ return cmn(g ^ m ^ f, d, g, r, i, n);
69
+ }
70
+
71
+ function ii(d, g, m, f, r, i, n) {
72
+ return cmn(m ^ (g | ~f), d, g, r, i, n);
73
+ }
74
+
75
+ function add(d, g) {
76
+ let m = (65535 & d) + (65535 & g);
77
+ return (d >> 16) + (g >> 16) + (m >> 16) << 16 | 65535 & m;
78
+ }
79
+
80
+ function rol(d, g) {
81
+ return d << g | d >>> 32 - g;
82
+ }
@@ -0,0 +1,132 @@
1
+ import Base64 from "../base64.js";
2
+ import { modPow, bigIntToU8Array, u8ArrayToBigInt } from "./bigint.js";
3
+
4
+ export class RSACipher {
5
+ constructor() {
6
+ this._keyLength = 0;
7
+ this._keyBytes = 0;
8
+ this._n = null;
9
+ this._e = null;
10
+ this._d = null;
11
+ this._nBigInt = null;
12
+ this._eBigInt = null;
13
+ this._dBigInt = null;
14
+ this._extractable = false;
15
+ }
16
+
17
+ get algorithm() {
18
+ return { name: "RSA-PKCS1-v1_5" };
19
+ }
20
+
21
+ _base64urlDecode(data) {
22
+ data = data.replace(/-/g, "+").replace(/_/g, "/");
23
+ data = data.padEnd(Math.ceil(data.length / 4) * 4, "=");
24
+ return Base64.decode(data);
25
+ }
26
+
27
+ _padArray(arr, length) {
28
+ const res = new Uint8Array(length);
29
+ res.set(arr, length - arr.length);
30
+ return res;
31
+ }
32
+
33
+ static async generateKey(algorithm, extractable, _keyUsages) {
34
+ const cipher = new RSACipher;
35
+ await cipher._generateKey(algorithm, extractable);
36
+ return { privateKey: cipher };
37
+ }
38
+
39
+ async _generateKey(algorithm, extractable) {
40
+ this._keyLength = algorithm.modulusLength;
41
+ this._keyBytes = Math.ceil(this._keyLength / 8);
42
+ const key = await window.crypto.subtle.generateKey(
43
+ {
44
+ name: "RSA-OAEP",
45
+ modulusLength: algorithm.modulusLength,
46
+ publicExponent: algorithm.publicExponent,
47
+ hash: {name: "SHA-256"},
48
+ },
49
+ true, ["encrypt", "decrypt"]);
50
+ const privateKey = await window.crypto.subtle.exportKey("jwk", key.privateKey);
51
+ this._n = this._padArray(this._base64urlDecode(privateKey.n), this._keyBytes);
52
+ this._nBigInt = u8ArrayToBigInt(this._n);
53
+ this._e = this._padArray(this._base64urlDecode(privateKey.e), this._keyBytes);
54
+ this._eBigInt = u8ArrayToBigInt(this._e);
55
+ this._d = this._padArray(this._base64urlDecode(privateKey.d), this._keyBytes);
56
+ this._dBigInt = u8ArrayToBigInt(this._d);
57
+ this._extractable = extractable;
58
+ }
59
+
60
+ static async importKey(key, _algorithm, extractable, keyUsages) {
61
+ if (keyUsages.length !== 1 || keyUsages[0] !== "encrypt") {
62
+ throw new Error("only support importing RSA public key");
63
+ }
64
+ const cipher = new RSACipher;
65
+ await cipher._importKey(key, extractable);
66
+ return cipher;
67
+ }
68
+
69
+ async _importKey(key, extractable) {
70
+ const n = key.n;
71
+ const e = key.e;
72
+ if (n.length !== e.length) {
73
+ throw new Error("the sizes of modulus and public exponent do not match");
74
+ }
75
+ this._keyBytes = n.length;
76
+ this._keyLength = this._keyBytes * 8;
77
+ this._n = new Uint8Array(this._keyBytes);
78
+ this._e = new Uint8Array(this._keyBytes);
79
+ this._n.set(n);
80
+ this._e.set(e);
81
+ this._nBigInt = u8ArrayToBigInt(this._n);
82
+ this._eBigInt = u8ArrayToBigInt(this._e);
83
+ this._extractable = extractable;
84
+ }
85
+
86
+ async encrypt(_algorithm, message) {
87
+ if (message.length > this._keyBytes - 11) {
88
+ return null;
89
+ }
90
+ const ps = new Uint8Array(this._keyBytes - message.length - 3);
91
+ window.crypto.getRandomValues(ps);
92
+ for (let i = 0; i < ps.length; i++) {
93
+ ps[i] = Math.floor(ps[i] * 254 / 255 + 1);
94
+ }
95
+ const em = new Uint8Array(this._keyBytes);
96
+ em[1] = 0x02;
97
+ em.set(ps, 2);
98
+ em.set(message, ps.length + 3);
99
+ const emBigInt = u8ArrayToBigInt(em);
100
+ const c = modPow(emBigInt, this._eBigInt, this._nBigInt);
101
+ return bigIntToU8Array(c, this._keyBytes);
102
+ }
103
+
104
+ async decrypt(_algorithm, message) {
105
+ if (message.length !== this._keyBytes) {
106
+ return null;
107
+ }
108
+ const msgBigInt = u8ArrayToBigInt(message);
109
+ const emBigInt = modPow(msgBigInt, this._dBigInt, this._nBigInt);
110
+ const em = bigIntToU8Array(emBigInt, this._keyBytes);
111
+ if (em[0] !== 0x00 || em[1] !== 0x02) {
112
+ return null;
113
+ }
114
+ let i = 2;
115
+ for (; i < em.length; i++) {
116
+ if (em[i] === 0x00) {
117
+ break;
118
+ }
119
+ }
120
+ if (i === em.length) {
121
+ return null;
122
+ }
123
+ return em.slice(i + 1, em.length);
124
+ }
125
+
126
+ async exportKey() {
127
+ if (!this._extractable) {
128
+ throw new Error("key is not extractable");
129
+ }
130
+ return { n: this._n, e: this._e, d: this._d };
131
+ }
132
+ }
@@ -0,0 +1,27 @@
1
+ /*
2
+ * noVNC: HTML5 VNC client
3
+ * Copyright (C) 2019 The noVNC Authors
4
+ * Licensed under MPL 2.0 (see LICENSE.txt)
5
+ *
6
+ * See README.md for usage and integration instructions.
7
+ *
8
+ */
9
+
10
+ export default class CopyRectDecoder {
11
+ decodeRect(x, y, width, height, sock, display, depth) {
12
+ if (sock.rQwait("COPYRECT", 4)) {
13
+ return false;
14
+ }
15
+
16
+ let deltaX = sock.rQshift16();
17
+ let deltaY = sock.rQshift16();
18
+
19
+ if ((width === 0) || (height === 0)) {
20
+ return true;
21
+ }
22
+
23
+ display.copyImage(deltaX, deltaY, x, y, width, height);
24
+
25
+ return true;
26
+ }
27
+ }