susi-qemu 0.0.2 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/susi +9 -4
- data/lib/disk.rb +7 -5
- data/lib/novnc/core/base64.js +104 -0
- data/lib/novnc/core/crypto/aes.js +178 -0
- data/lib/novnc/core/crypto/bigint.js +34 -0
- data/lib/novnc/core/crypto/crypto.js +90 -0
- data/lib/novnc/core/crypto/des.js +330 -0
- data/lib/novnc/core/crypto/dh.js +55 -0
- data/lib/novnc/core/crypto/md5.js +82 -0
- data/lib/novnc/core/crypto/rsa.js +132 -0
- data/lib/novnc/core/decoders/copyrect.js +27 -0
- data/lib/novnc/core/decoders/h264.js +321 -0
- data/lib/novnc/core/decoders/hextile.js +181 -0
- data/lib/novnc/core/decoders/jpeg.js +146 -0
- data/lib/novnc/core/decoders/raw.js +59 -0
- data/lib/novnc/core/decoders/rre.js +44 -0
- data/lib/novnc/core/decoders/tight.js +393 -0
- data/lib/novnc/core/decoders/tightpng.js +27 -0
- data/lib/novnc/core/decoders/zlib.js +51 -0
- data/lib/novnc/core/decoders/zrle.js +185 -0
- data/lib/novnc/core/deflator.js +84 -0
- data/lib/novnc/core/display.js +575 -0
- data/lib/novnc/core/encodings.js +53 -0
- data/lib/novnc/core/inflator.js +65 -0
- data/lib/novnc/core/input/domkeytable.js +311 -0
- data/lib/novnc/core/input/fixedkeys.js +129 -0
- data/lib/novnc/core/input/gesturehandler.js +567 -0
- data/lib/novnc/core/input/keyboard.js +294 -0
- data/lib/novnc/core/input/keysym.js +616 -0
- data/lib/novnc/core/input/keysymdef.js +688 -0
- data/lib/novnc/core/input/util.js +191 -0
- data/lib/novnc/core/input/vkeys.js +116 -0
- data/lib/novnc/core/input/xtscancodes.js +173 -0
- data/lib/novnc/core/ra2.js +312 -0
- data/lib/novnc/core/rfb.js +3257 -0
- data/lib/novnc/core/util/browser.js +172 -0
- data/lib/novnc/core/util/cursor.js +249 -0
- data/lib/novnc/core/util/element.js +32 -0
- data/lib/novnc/core/util/events.js +138 -0
- data/lib/novnc/core/util/eventtarget.js +35 -0
- data/lib/novnc/core/util/int.js +15 -0
- data/lib/novnc/core/util/logging.js +56 -0
- data/lib/novnc/core/util/strings.js +28 -0
- data/lib/novnc/core/websock.js +365 -0
- data/lib/novnc/screen.html +21 -0
- data/lib/novnc/vendor/pako/lib/utils/common.js +45 -0
- data/lib/novnc/vendor/pako/lib/zlib/adler32.js +27 -0
- data/lib/novnc/vendor/pako/lib/zlib/constants.js +47 -0
- data/lib/novnc/vendor/pako/lib/zlib/crc32.js +36 -0
- data/lib/novnc/vendor/pako/lib/zlib/deflate.js +1846 -0
- data/lib/novnc/vendor/pako/lib/zlib/gzheader.js +35 -0
- data/lib/novnc/vendor/pako/lib/zlib/inffast.js +324 -0
- data/lib/novnc/vendor/pako/lib/zlib/inflate.js +1527 -0
- data/lib/novnc/vendor/pako/lib/zlib/inftrees.js +322 -0
- data/lib/novnc/vendor/pako/lib/zlib/messages.js +11 -0
- data/lib/novnc/vendor/pako/lib/zlib/trees.js +1195 -0
- data/lib/novnc/vendor/pako/lib/zlib/zstream.js +24 -0
- data/lib/output.rb +11 -0
- data/lib/qmp.rb +6 -0
- data/lib/ssh.rb +3 -1
- data/lib/susi.rb +7 -6
- data/lib/version.rb +1 -1
- data/lib/vm.rb +44 -26
- data/lib/vnc.rb +34 -31
- 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
|
+
}
|