Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
N
noVNC
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
rasky
noVNC
Commits
c539e4dc
Commit
c539e4dc
authored
May 05, 2010
by
Joel Martin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
DES that works with KVM's VNC. RFB 3.8 fixes.
parent
ef764d3b
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
441 additions
and
237 deletions
+441
-237
des.js
include/des.js
+410
-205
util.js
include/util.js
+1
-1
vnc.js
vnc.js
+30
-31
No files found.
include/des.js
View file @
c539e4dc
/*
/*
*
From: http://www.tero.co.uk/des/
*
Ported from Flashlight VNC ActionScript implementation:
*
Paul Tero, July 2001
*
http://www.wizhelp.com/flashlight-vnc/
*
*
*
Derived from Eric Young's OpenSSL C implementation (BSD-style license)
*
Full attribution follows:
*
*
* Optimised for performance with large blocks by Michael Hayworth, November 2001
* -------------------------------------------------------------------------
* http://www.netdealing.com
*
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND
* This DES class has been extracted from package Acme.Crypto for use in VNC.
* The bytebit[] array has been reversed so that the most significant bit
* in each byte of the key is ignored, not the least significant. Also the
* unnecessary odd parity code has been removed.
*
* These changes are:
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* DesCipher - the DES encryption method
*
* The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is:
*
* Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
* without fee is hereby granted, provided that this copyright notice is kept
* intact.
*
* WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
* OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*
* THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
* CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
* PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
* NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
* SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
* SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
* PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). WIDGET WORKSHOP
* SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
* HIGH RISK ACTIVITIES.
*
*
* The rest is:
*
* Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
...
@@ -18,210 +72,361 @@
...
@@ -18,210 +72,361 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* SUCH DAMAGE.
*
* Visit the ACME Labs Java page for up-to-date versions of this and other
* fine Java utilities: http://www.acme.com/java/
*/
*/
DES
=
{
//des
// Tables, permutations, S-boxes, etc.
//this takes the key (byte array), the message (byte array), and whether to encrypt or decrypt
function
des
(
key
,
message
,
encrypt
,
mode
,
iv
,
padding
)
{
bytebit
:
[
0x01
,
0x02
,
0x04
,
0x08
,
0x10
,
0x20
,
0x40
,
0x80
],
//declaring this locally speeds things up a bit
bigbyte
:
[
0x800000
,
0x400000
,
0x200000
,
0x100000
,
var
spfunction1
=
new
Array
(
0x1010400
,
0
,
0x10000
,
0x1010404
,
0x1010004
,
0x10404
,
0x4
,
0x10000
,
0x400
,
0x1010400
,
0x1010404
,
0x400
,
0x1000404
,
0x1010004
,
0x1000000
,
0x4
,
0x404
,
0x1000400
,
0x1000400
,
0x10400
,
0x10400
,
0x1010000
,
0x1010000
,
0x1000404
,
0x10004
,
0x1000004
,
0x1000004
,
0x10004
,
0
,
0x404
,
0x10404
,
0x1000000
,
0x10000
,
0x1010404
,
0x4
,
0x1010000
,
0x1010400
,
0x1000000
,
0x1000000
,
0x400
,
0x1010004
,
0x10000
,
0x10400
,
0x1000004
,
0x400
,
0x4
,
0x1000404
,
0x10404
,
0x1010404
,
0x10004
,
0x1010000
,
0x1000404
,
0x1000004
,
0x404
,
0x10404
,
0x1010400
,
0x404
,
0x1000400
,
0x1000400
,
0
,
0x10004
,
0x10400
,
0
,
0x1010004
);
0x080000
,
0x040000
,
0x020000
,
0x010000
,
0x008000
,
0x004000
,
var
spfunction2
=
new
Array
(
-
0x7fef7fe0
,
-
0x7fff8000
,
0x8000
,
0x108020
,
0x100000
,
0x20
,
-
0x7fefffe0
,
-
0x7fff7fe0
,
-
0x7fffffe0
,
-
0x7fef7fe0
,
-
0x7fef8000
,
-
0x80000000
,
-
0x7fff8000
,
0x100000
,
0x20
,
-
0x7fefffe0
,
0x108000
,
0x100020
,
-
0x7fff7fe0
,
0
,
-
0x80000000
,
0x8000
,
0x108020
,
-
0x7ff00000
,
0x100020
,
-
0x7fffffe0
,
0
,
0x108000
,
0x8020
,
-
0x7fef8000
,
-
0x7ff00000
,
0x8020
,
0
,
0x108020
,
-
0x7fefffe0
,
0x100000
,
-
0x7fff7fe0
,
-
0x7ff00000
,
-
0x7fef8000
,
0x8000
,
-
0x7ff00000
,
-
0x7fff8000
,
0x20
,
-
0x7fef7fe0
,
0x108020
,
0x20
,
0x8000
,
-
0x80000000
,
0x8020
,
-
0x7fef8000
,
0x100000
,
-
0x7fffffe0
,
0x100020
,
-
0x7fff7fe0
,
-
0x7fffffe0
,
0x100020
,
0x108000
,
0
,
-
0x7fff8000
,
0x8020
,
-
0x80000000
,
-
0x7fefffe0
,
-
0x7fef7fe0
,
0x108000
);
0x002000
,
0x001000
,
0x000800
,
0x000400
,
0x000200
,
0x000100
,
var
spfunction3
=
new
Array
(
0x208
,
0x8020200
,
0
,
0x8020008
,
0x8000200
,
0
,
0x20208
,
0x8000200
,
0x20008
,
0x8000008
,
0x8000008
,
0x20000
,
0x8020208
,
0x20008
,
0x8020000
,
0x208
,
0x8000000
,
0x8
,
0x8020200
,
0x200
,
0x20200
,
0x8020000
,
0x8020008
,
0x20208
,
0x8000208
,
0x20200
,
0x20000
,
0x8000208
,
0x8
,
0x8020208
,
0x200
,
0x8000000
,
0x8020200
,
0x8000000
,
0x20008
,
0x208
,
0x20000
,
0x8020200
,
0x8000200
,
0
,
0x200
,
0x20008
,
0x8020208
,
0x8000200
,
0x8000008
,
0x200
,
0
,
0x8020008
,
0x8000208
,
0x20000
,
0x8000000
,
0x8020208
,
0x8
,
0x20208
,
0x20200
,
0x8000008
,
0x8020000
,
0x8000208
,
0x208
,
0x8020000
,
0x20208
,
0x8
,
0x8020008
,
0x20200
);
0x000080
,
0x000040
,
0x000020
,
0x000010
,
0x000008
,
0x000004
,
var
spfunction4
=
new
Array
(
0x802001
,
0x2081
,
0x2081
,
0x80
,
0x802080
,
0x800081
,
0x800001
,
0x2001
,
0
,
0x802000
,
0x802000
,
0x802081
,
0x81
,
0
,
0x800080
,
0x800001
,
0x1
,
0x2000
,
0x800000
,
0x802001
,
0x80
,
0x800000
,
0x2001
,
0x2080
,
0x800081
,
0x1
,
0x2080
,
0x800080
,
0x2000
,
0x802080
,
0x802081
,
0x81
,
0x800080
,
0x800001
,
0x802000
,
0x802081
,
0x81
,
0
,
0
,
0x802000
,
0x2080
,
0x800080
,
0x800081
,
0x1
,
0x802001
,
0x2081
,
0x2081
,
0x80
,
0x802081
,
0x81
,
0x1
,
0x2000
,
0x800001
,
0x2001
,
0x802080
,
0x800081
,
0x2001
,
0x2080
,
0x800000
,
0x802001
,
0x80
,
0x800000
,
0x2000
,
0x802080
);
0x000002
,
0x000001
],
var
spfunction5
=
new
Array
(
0x100
,
0x2080100
,
0x2080000
,
0x42000100
,
0x80000
,
0x100
,
0x40000000
,
0x2080000
,
0x40080100
,
0x80000
,
0x2000100
,
0x40080100
,
0x42000100
,
0x42080000
,
0x80100
,
0x40000000
,
0x2000000
,
0x40080000
,
0x40080000
,
0
,
0x40000100
,
0x42080100
,
0x42080100
,
0x2000100
,
0x42080000
,
0x40000100
,
0
,
0x42000000
,
0x2080100
,
0x2000000
,
0x42000000
,
0x80100
,
0x80000
,
0x42000100
,
0x100
,
0x2000000
,
0x40000000
,
0x2080000
,
0x42000100
,
0x40080100
,
0x2000100
,
0x40000000
,
0x42080000
,
0x2080100
,
0x40080100
,
0x100
,
0x2000000
,
0x42080000
,
0x42080100
,
0x80100
,
0x42000000
,
0x42080100
,
0x2080000
,
0
,
0x40080000
,
0x42000000
,
0x80100
,
0x2000100
,
0x40000100
,
0x80000
,
0
,
0x40080000
,
0x2080100
,
0x40000100
);
pc1
:
[
56
,
48
,
40
,
32
,
var
spfunction6
=
new
Array
(
0x20000010
,
0x20400000
,
0x4000
,
0x20404010
,
0x20400000
,
0x10
,
0x20404010
,
0x400000
,
0x20004000
,
0x404010
,
0x400000
,
0x20000010
,
0x400010
,
0x20004000
,
0x20000000
,
0x4010
,
0
,
0x400010
,
0x20004010
,
0x4000
,
0x404000
,
0x20004010
,
0x10
,
0x20400010
,
0x20400010
,
0
,
0x404010
,
0x20404000
,
0x4010
,
0x404000
,
0x20404000
,
0x20000000
,
0x20004000
,
0x10
,
0x20400010
,
0x404000
,
0x20404010
,
0x400000
,
0x4010
,
0x20000010
,
0x400000
,
0x20004000
,
0x20000000
,
0x4010
,
0x20000010
,
0x20404010
,
0x404000
,
0x20400000
,
0x404010
,
0x20404000
,
0
,
0x20400010
,
0x10
,
0x4000
,
0x20400000
,
0x404010
,
0x4000
,
0x400010
,
0x20004010
,
0
,
0x20404000
,
0x20000000
,
0x400010
,
0x20004010
);
24
,
16
,
8
,
0
,
57
,
49
,
var
spfunction7
=
new
Array
(
0x200000
,
0x4200002
,
0x4000802
,
0
,
0x800
,
0x4000802
,
0x200802
,
0x4200800
,
0x4200802
,
0x200000
,
0
,
0x4000002
,
0x2
,
0x4000000
,
0x4200002
,
0x802
,
0x4000800
,
0x200802
,
0x200002
,
0x4000800
,
0x4000002
,
0x4200000
,
0x4200800
,
0x200002
,
0x4200000
,
0x800
,
0x802
,
0x4200802
,
0x200800
,
0x2
,
0x4000000
,
0x200800
,
0x4000000
,
0x200800
,
0x200000
,
0x4000802
,
0x4000802
,
0x4200002
,
0x4200002
,
0x2
,
0x200002
,
0x4000000
,
0x4000800
,
0x200000
,
0x4200800
,
0x802
,
0x200802
,
0x4200800
,
0x802
,
0x4000002
,
0x4200802
,
0x4200000
,
0x200800
,
0
,
0x2
,
0x4200802
,
0
,
0x200802
,
0x4200000
,
0x800
,
0x4000002
,
0x4000800
,
0x800
,
0x200002
);
41
,
33
,
25
,
17
,
9
,
1
,
var
spfunction8
=
new
Array
(
0x10001040
,
0x1000
,
0x40000
,
0x10041040
,
0x10000000
,
0x10001040
,
0x40
,
0x10000000
,
0x40040
,
0x10040000
,
0x10041040
,
0x41000
,
0x10041000
,
0x41040
,
0x1000
,
0x40
,
0x10040000
,
0x10000040
,
0x10001000
,
0x1040
,
0x41000
,
0x40040
,
0x10040040
,
0x10041000
,
0x1040
,
0
,
0
,
0x10040040
,
0x10000040
,
0x10001000
,
0x41040
,
0x40000
,
0x41040
,
0x40000
,
0x10041000
,
0x1000
,
0x40
,
0x10040040
,
0x1000
,
0x41040
,
0x10001000
,
0x40
,
0x10000040
,
0x10040000
,
0x10040040
,
0x10000000
,
0x40000
,
0x10001040
,
0
,
0x10041040
,
0x40040
,
0x10000040
,
0x10040000
,
0x10001000
,
0x10001040
,
0
,
0x10041040
,
0x41000
,
0x41000
,
0x1040
,
0x1040
,
0x40040
,
0x10000000
,
0x10041000
);
58
,
50
,
42
,
34
,
26
,
18
,
10
,
2
,
59
,
51
,
43
,
35
,
//create the 16 or 48 subkeys we will need
62
,
54
,
46
,
38
,
30
,
22
,
var
keys
=
des_createKeys
(
key
);
14
,
6
,
61
,
53
,
45
,
37
,
var
m
=
0
,
i
,
j
,
temp
,
temp2
,
right1
,
right2
,
left
,
right
,
looping
;
29
,
21
,
13
,
5
,
60
,
52
,
var
cbcleft
,
cbcleft2
,
cbcright
,
cbcright2
44
,
36
,
28
,
20
,
12
,
4
,
var
endloop
,
loopinc
;
27
,
19
,
11
,
3
],
var
len
=
message
.
length
;
totrot
:
[
1
,
2
,
4
,
6
,
8
,
10
,
12
,
14
,
15
,
17
,
19
,
21
,
var
chunk
=
0
;
23
,
25
,
27
,
28
],
//set up the loops for single and triple des
pc2
:
[
13
,
16
,
10
,
23
,
var
iterations
=
keys
.
length
==
32
?
3
:
9
;
//single or triple des
0
,
4
,
2
,
27
,
14
,
5
,
if
(
iterations
==
3
)
{
looping
=
encrypt
?
new
Array
(
0
,
32
,
2
)
:
new
Array
(
30
,
-
2
,
-
2
);}
20
,
9
,
22
,
18
,
11
,
3
,
else
{
looping
=
encrypt
?
new
Array
(
0
,
32
,
2
,
62
,
30
,
-
2
,
64
,
96
,
2
)
:
new
Array
(
94
,
62
,
-
2
,
32
,
64
,
2
,
30
,
-
2
,
-
2
);}
25
,
7
,
15
,
6
,
26
,
19
,
12
,
1
,
40
,
51
,
30
,
36
,
//pad the message depending on the padding parameter
46
,
54
,
29
,
39
,
50
,
44
,
if
(
padding
==
2
)
{
32
,
47
,
43
,
48
,
38
,
55
,
for
(
var
i
=
0
;
i
<
8
;
i
++
)
{
message
.
push
(
" "
);
}
//pad the message with spaces
33
,
52
,
45
,
41
,
49
,
35
,
}
else
if
(
padding
==
1
)
{
28
,
31
,
],
temp
=
8
-
(
len
%
8
);
SP1
:
[
0x01010400
,
0x00000000
,
0x00010000
,
for
(
var
i
=
0
;
i
<
8
;
i
++
)
{
message
.
push
(
temp
);
};
0x01010404
,
0x01010004
,
0x00010404
,
0x00000004
,
0x00010000
,
if
(
temp
==
8
)
len
+=
8
;
//PKCS7 padding
0x00000400
,
0x01010400
,
0x01010404
,
0x00000400
,
0x01000404
,
}
else
if
(
!
padding
)
{
0x01010004
,
0x01000000
,
0x00000004
,
0x00000404
,
0x01000400
,
for
(
var
i
=
0
;
i
<
8
;
i
++
)
{
message
.
push
(
0
);
}
//pad the message out with null bytes
0x01000400
,
0x00010400
,
0x00010400
,
0x01010000
,
0x01010000
,
}
0x01000404
,
0x00010004
,
0x01000004
,
0x01000004
,
0x00010004
,
0x00000000
,
0x00000404
,
0x00010404
,
0x01000000
,
0x00010000
,
0x01010404
,
0x00000004
,
0x01010000
,
0x01010400
,
0x01000000
,
0x01000000
,
0x00000400
,
0x01010004
,
0x00010000
,
0x00010400
,
0x01000004
,
0x00000400
,
0x00000004
,
0x01000404
,
0x00010404
,
0x01010404
,
0x00010004
,
0x01010000
,
0x01000404
,
0x01000004
,
0x00000404
,
0x00010404
,
0x01010400
,
0x00000404
,
0x01000400
,
0x01000400
,
0x00000000
,
0x00010004
,
0x00010400
,
0x00000000
,
0x01010004
],
SP2
:
[
0x80108020
,
0x80008000
,
0x00008000
,
0x00108020
,
0x00100000
,
0x00000020
,
0x80100020
,
0x80008020
,
0x80000020
,
0x80108020
,
0x80108000
,
0x80000000
,
0x80008000
,
0x00100000
,
0x00000020
,
0x80100020
,
0x00108000
,
0x00100020
,
0x80008020
,
0x00000000
,
0x80000000
,
0x00008000
,
0x00108020
,
0x80100000
,
0x00100020
,
0x80000020
,
0x00000000
,
0x00108000
,
0x00008020
,
0x80108000
,
0x80100000
,
0x00008020
,
0x00000000
,
0x00108020
,
0x80100020
,
0x00100000
,
0x80008020
,
0x80100000
,
0x80108000
,
0x00008000
,
0x80100000
,
0x80008000
,
0x00000020
,
0x80108020
,
0x00108020
,
0x00000020
,
0x00008000
,
0x80000000
,
0x00008020
,
0x80108000
,
0x00100000
,
0x80000020
,
0x00100020
,
0x80008020
,
0x80000020
,
0x00100020
,
0x00108000
,
0x00000000
,
0x80008000
,
0x00008020
,
0x80000000
,
0x80100020
,
0x80108020
,
0x00108000
],
SP3
:
[
0x00000208
,
0x08020200
,
0x00000000
,
0x08020008
,
0x08000200
,
0x00000000
,
0x00020208
,
0x08000200
,
0x00020008
,
0x08000008
,
0x08000008
,
0x00020000
,
0x08020208
,
0x00020008
,
0x08020000
,
0x00000208
,
0x08000000
,
0x00000008
,
0x08020200
,
0x00000200
,
0x00020200
,
0x08020000
,
0x08020008
,
0x00020208
,
0x08000208
,
0x00020200
,
0x00020000
,
0x08000208
,
0x00000008
,
0x08020208
,
0x00000200
,
0x08000000
,
0x08020200
,
0x08000000
,
0x00020008
,
0x00000208
,
0x00020000
,
0x08020200
,
0x08000200
,
0x00000000
,
0x00000200
,
0x00020008
,
0x08020208
,
0x08000200
,
0x08000008
,
0x00000200
,
0x00000000
,
0x08020008
,
0x08000208
,
0x00020000
,
0x08000000
,
0x08020208
,
0x00000008
,
0x00020208
,
0x00020200
,
0x08000008
,
0x08020000
,
0x08000208
,
0x00000208
,
0x08020000
,
0x00020208
,
0x00000008
,
0x08020008
,
0x00020200
],
SP4
:
[
0x00802001
,
0x00002081
,
0x00002081
,
0x00000080
,
0x00802080
,
0x00800081
,
0x00800001
,
0x00002001
,
0x00000000
,
0x00802000
,
0x00802000
,
0x00802081
,
0x00000081
,
0x00000000
,
0x00800080
,
0x00800001
,
0x00000001
,
0x00002000
,
0x00800000
,
0x00802001
,
0x00000080
,
0x00800000
,
0x00002001
,
0x00002080
,
0x00800081
,
0x00000001
,
0x00002080
,
0x00800080
,
0x00002000
,
0x00802080
,
0x00802081
,
0x00000081
,
0x00800080
,
0x00800001
,
0x00802000
,
0x00802081
,
0x00000081
,
0x00000000
,
0x00000000
,
0x00802000
,
0x00002080
,
0x00800080
,
0x00800081
,
0x00000001
,
0x00802001
,
0x00002081
,
0x00002081
,
0x00000080
,
0x00802081
,
0x00000081
,
0x00000001
,
0x00002000
,
0x00800001
,
0x00002001
,
0x00802080
,
0x00800081
,
0x00002001
,
0x00002080
,
0x00800000
,
0x00802001
,
0x00000080
,
0x00800000
,
0x00002000
,
0x00802080
],
SP5
:
[
0x00000100
,
0x02080100
,
0x02080000
,
0x42000100
,
0x00080000
,
0x00000100
,
0x40000000
,
0x02080000
,
0x40080100
,
0x00080000
,
0x02000100
,
0x40080100
,
0x42000100
,
0x42080000
,
0x00080100
,
0x40000000
,
0x02000000
,
0x40080000
,
0x40080000
,
0x00000000
,
0x40000100
,
0x42080100
,
0x42080100
,
0x02000100
,
0x42080000
,
0x40000100
,
0x00000000
,
0x42000000
,
0x02080100
,
0x02000000
,
0x42000000
,
0x00080100
,
0x00080000
,
0x42000100
,
0x00000100
,
0x02000000
,
0x40000000
,
0x02080000
,
0x42000100
,
0x40080100
,
0x02000100
,
0x40000000
,
0x42080000
,
0x02080100
,
0x40080100
,
0x00000100
,
0x02000000
,
0x42080000
,
0x42080100
,
0x00080100
,
0x42000000
,
0x42080100
,
0x02080000
,
0x00000000
,
0x40080000
,
0x42000000
,
0x00080100
,
0x02000100
,
0x40000100
,
0x00080000
,
0x00000000
,
0x40080000
,
0x02080100
,
0x40000100
],
SP6
:
[
0x20000010
,
0x20400000
,
0x00004000
,
0x20404010
,
0x20400000
,
0x00000010
,
0x20404010
,
0x00400000
,
0x20004000
,
0x00404010
,
0x00400000
,
0x20000010
,
0x00400010
,
0x20004000
,
0x20000000
,
0x00004010
,
0x00000000
,
0x00400010
,
0x20004010
,
0x00004000
,
0x00404000
,
0x20004010
,
0x00000010
,
0x20400010
,
0x20400010
,
0x00000000
,
0x00404010
,
0x20404000
,
0x00004010
,
0x00404000
,
0x20404000
,
0x20000000
,
0x20004000
,
0x00000010
,
0x20400010
,
0x00404000
,
0x20404010
,
0x00400000
,
0x00004010
,
0x20000010
,
0x00400000
,
0x20004000
,
0x20000000
,
0x00004010
,
0x20000010
,
0x20404010
,
0x00404000
,
0x20400000
,
0x00404010
,
0x20404000
,
0x00000000
,
0x20400010
,
0x00000010
,
0x00004000
,
0x20400000
,
0x00404010
,
0x00004000
,
0x00400010
,
0x20004010
,
0x00000000
,
0x20404000
,
0x20000000
,
0x00400010
,
0x20004010
],
SP7
:
[
0x00200000
,
0x04200002
,
0x04000802
,
0x00000000
,
0x00000800
,
0x04000802
,
0x00200802
,
0x04200800
,
0x04200802
,
0x00200000
,
0x00000000
,
0x04000002
,
0x00000002
,
0x04000000
,
0x04200002
,
0x00000802
,
0x04000800
,
0x00200802
,
0x00200002
,
0x04000800
,
0x04000002
,
0x04200000
,
0x04200800
,
0x00200002
,
0x04200000
,
0x00000800
,
0x00000802
,
0x04200802
,
0x00200800
,
0x00000002
,
0x04000000
,
0x00200800
,
0x04000000
,
0x00200800
,
0x00200000
,
0x04000802
,
0x04000802
,
0x04200002
,
0x04200002
,
0x00000002
,
0x00200002
,
0x04000000
,
0x04000800
,
0x00200000
,
0x04200800
,
0x00000802
,
0x00200802
,
0x04200800
,
0x00000802
,
0x04000002
,
0x04200802
,
0x04200000
,
0x00200800
,
0x00000000
,
0x00000002
,
0x04200802
,
0x00000000
,
0x00200802
,
0x04200000
,
0x00000800
,
0x04000002
,
0x04000800
,
0x00000800
,
0x00200002
],
SP8
:
[
0x10001040
,
0x00001000
,
0x00040000
,
0x10041040
,
0x10000000
,
0x10001040
,
0x00000040
,
0x10000000
,
0x00040040
,
0x10040000
,
0x10041040
,
0x00041000
,
0x10041000
,
0x00041040
,
0x00001000
,
0x00000040
,
0x10040000
,
0x10000040
,
0x10001000
,
0x00001040
,
0x00041000
,
0x00040040
,
0x10040040
,
0x10041000
,
0x00001040
,
0x00000000
,
0x00000000
,
0x10040040
,
0x10000040
,
0x10001000
,
0x00041040
,
0x00040000
,
0x00041040
,
0x00040000
,
0x10041000
,
0x00001000
,
0x00000040
,
0x10040040
,
0x00001000
,
0x00041040
,
0x10001000
,
0x00000040
,
0x10000040
,
0x10040000
,
0x10040040
,
0x10000000
,
0x00040000
,
0x10001040
,
0x00000000
,
0x10041040
,
0x00040040
,
0x10000040
,
0x10040000
,
0x10001000
,
0x10001040
,
0x00000000
,
0x10041040
,
0x00041000
,
0x00041000
,
0x00001040
,
0x00001040
,
0x00040040
,
0x10000000
,
0x10041000
],
// Key routines.
//store the result here
encryptKeys
:
[],
result
=
[];
decryptKeys
:
[],
tempresult
=
[];
if
(
mode
==
1
)
{
//CBC mode
// / Set the key.
cbcleft
=
(
iv
.
charCodeAt
(
m
++
)
<<
24
)
|
(
iv
.
charCodeAt
(
m
++
)
<<
16
)
|
(
iv
.
charCodeAt
(
m
++
)
<<
8
)
|
iv
.
charCodeAt
(
m
++
);
setKeys
:
function
(
key
)
{
cbcright
=
(
iv
.
charCodeAt
(
m
++
)
<<
24
)
|
(
iv
.
charCodeAt
(
m
++
)
<<
16
)
|
(
iv
.
charCodeAt
(
m
++
)
<<
8
)
|
iv
.
charCodeAt
(
m
++
);
DES
.
encryptKeys
=
new
Array
(
32
);
m
=
0
;
DES
.
decryptKeys
=
new
Array
(
32
);
DES
.
deskey
(
key
,
true
,
DES
.
encryptKeys
);
DES
.
deskey
(
key
,
false
,
DES
.
decryptKeys
);
console
.
log
(
"DES.encryptKeys: "
+
DES
.
encryptKeys
);
},
// Turn an 8-byte key into internal keys.
deskey
:
function
(
keyBlock
,
encrypting
,
KnL
)
{
var
i
,
j
,
l
,
m
,
n
;
var
pc1m
=
new
Array
(
56
);
var
pcr
=
new
Array
(
56
);
var
kn
=
new
Array
(
32
);
for
(
j
=
0
;
j
<
56
;
++
j
)
{
l
=
DES
.
pc1
[
j
];
m
=
l
&
07
;
pc1m
[
j
]
=
((
keyBlock
[
l
>>>
3
]
&
DES
.
bytebit
[
m
])
!=
0
)
?
1
:
0
;
}
}
//loop through each 64 bit chunk of the message
for
(
i
=
0
;
i
<
16
;
++
i
)
{
while
(
m
<
len
)
{
if
(
encrypting
)
left
=
(
message
[
m
++
]
<<
24
)
|
(
message
[
m
++
]
<<
16
)
|
(
message
[
m
++
]
<<
8
)
|
message
[
m
++
];
m
=
i
<<
1
;
right
=
(
message
[
m
++
]
<<
24
)
|
(
message
[
m
++
]
<<
16
)
|
(
message
[
m
++
]
<<
8
)
|
message
[
m
++
];
else
m
=
(
15
-
i
)
<<
1
;
//for Cipher Block Chaining mode, xor the message with the previous result
n
=
m
+
1
;
if
(
mode
==
1
)
{
if
(
encrypt
)
{
left
^=
cbcleft
;
right
^=
cbcright
;}
else
{
cbcleft2
=
cbcleft
;
cbcright2
=
cbcright
;
cbcleft
=
left
;
cbcright
=
right
;}}
kn
[
m
]
=
kn
[
n
]
=
0
;
for
(
j
=
0
;
j
<
28
;
++
j
)
{
//first each 64 but chunk of the message must be permuted according to IP
l
=
j
+
DES
.
totrot
[
i
];
temp
=
((
left
>>>
4
)
^
right
)
&
0x0f0f0f0f
;
right
^=
temp
;
left
^=
(
temp
<<
4
);
if
(
l
<
28
)
temp
=
((
left
>>>
16
)
^
right
)
&
0x0000ffff
;
right
^=
temp
;
left
^=
(
temp
<<
16
);
pcr
[
j
]
=
pc1m
[
l
];
temp
=
((
right
>>>
2
)
^
left
)
&
0x33333333
;
left
^=
temp
;
right
^=
(
temp
<<
2
);
else
temp
=
((
right
>>>
8
)
^
left
)
&
0x00ff00ff
;
left
^=
temp
;
right
^=
(
temp
<<
8
);
pcr
[
j
]
=
pc1m
[
l
-
28
];
temp
=
((
left
>>>
1
)
^
right
)
&
0x55555555
;
right
^=
temp
;
left
^=
(
temp
<<
1
);
left
=
((
left
<<
1
)
|
(
left
>>>
31
));
right
=
((
right
<<
1
)
|
(
right
>>>
31
));
//do this either 1 or 3 times for each chunk of the message
for
(
j
=
0
;
j
<
iterations
;
j
+=
3
)
{
endloop
=
looping
[
j
+
1
];
loopinc
=
looping
[
j
+
2
];
//now go through and perform the encryption or decryption
for
(
i
=
looping
[
j
];
i
!=
endloop
;
i
+=
loopinc
)
{
//for efficiency
right1
=
right
^
keys
[
i
];
right2
=
((
right
>>>
4
)
|
(
right
<<
28
))
^
keys
[
i
+
1
];
//the result is attained by passing these bytes through the S selection functions
temp
=
left
;
left
=
right
;
right
=
temp
^
(
spfunction2
[(
right1
>>>
24
)
&
0x3f
]
|
spfunction4
[(
right1
>>>
16
)
&
0x3f
]
|
spfunction6
[(
right1
>>>
8
)
&
0x3f
]
|
spfunction8
[
right1
&
0x3f
]
|
spfunction1
[(
right2
>>>
24
)
&
0x3f
]
|
spfunction3
[(
right2
>>>
16
)
&
0x3f
]
|
spfunction5
[(
right2
>>>
8
)
&
0x3f
]
|
spfunction7
[
right2
&
0x3f
]);
}
}
temp
=
left
;
left
=
right
;
right
=
temp
;
//unreverse left and right
for
(
j
=
28
;
j
<
56
;
++
j
)
{
}
//for either 1 or 3 iterations
l
=
j
+
DES
.
totrot
[
i
];
if
(
l
<
56
)
//move then each one bit to the right
pcr
[
j
]
=
pc1m
[
l
];
left
=
((
left
>>>
1
)
|
(
left
<<
31
));
else
right
=
((
right
>>>
1
)
|
(
right
<<
31
));
pcr
[
j
]
=
pc1m
[
l
-
28
];
//now perform IP-1, which is IP in the opposite direction
temp
=
((
left
>>>
1
)
^
right
)
&
0x55555555
;
right
^=
temp
;
left
^=
(
temp
<<
1
);
temp
=
((
right
>>>
8
)
^
left
)
&
0x00ff00ff
;
left
^=
temp
;
right
^=
(
temp
<<
8
);
temp
=
((
right
>>>
2
)
^
left
)
&
0x33333333
;
left
^=
temp
;
right
^=
(
temp
<<
2
);
temp
=
((
left
>>>
16
)
^
right
)
&
0x0000ffff
;
right
^=
temp
;
left
^=
(
temp
<<
16
);
temp
=
((
left
>>>
4
)
^
right
)
&
0x0f0f0f0f
;
right
^=
temp
;
left
^=
(
temp
<<
4
);
//for Cipher Block Chaining mode, xor the message with the previous result
if
(
mode
==
1
)
{
if
(
encrypt
)
{
cbcleft
=
left
;
cbcright
=
right
;}
else
{
left
^=
cbcleft2
;
right
^=
cbcright2
;}}
tempresult
=
tempresult
.
concat
([(
left
>>>
24
),
((
left
>>>
16
)
&
0xff
),
((
left
>>>
8
)
&
0xff
),
(
left
&
0xff
),
(
right
>>>
24
),
((
right
>>>
16
)
&
0xff
),
((
right
>>>
8
)
&
0xff
),
(
right
&
0xff
)]);
chunk
+=
8
;
if
(
chunk
==
512
)
{
result
=
result
.
concat
(
tempresult
);
tempresult
=
[];
chunk
=
0
;}
}
//for every 8 characters, or 64 bits in the message
//return the result as an array
return
result
.
concat
(
tempresult
);
}
//end of des
//des_createKeys
//this takes as input a 64 bit key (even though only 56 bits are used)
//as an array of 2 integers, and returns 16 48 bit keys
function
des_createKeys
(
key
)
{
//declaring this locally speeds things up a bit
pc2bytes0
=
new
Array
(
0
,
0x4
,
0x20000000
,
0x20000004
,
0x10000
,
0x10004
,
0x20010000
,
0x20010004
,
0x200
,
0x204
,
0x20000200
,
0x20000204
,
0x10200
,
0x10204
,
0x20010200
,
0x20010204
);
pc2bytes1
=
new
Array
(
0
,
0x1
,
0x100000
,
0x100001
,
0x4000000
,
0x4000001
,
0x4100000
,
0x4100001
,
0x100
,
0x101
,
0x100100
,
0x100101
,
0x4000100
,
0x4000101
,
0x4100100
,
0x4100101
);
pc2bytes2
=
new
Array
(
0
,
0x8
,
0x800
,
0x808
,
0x1000000
,
0x1000008
,
0x1000800
,
0x1000808
,
0
,
0x8
,
0x800
,
0x808
,
0x1000000
,
0x1000008
,
0x1000800
,
0x1000808
);
pc2bytes3
=
new
Array
(
0
,
0x200000
,
0x8000000
,
0x8200000
,
0x2000
,
0x202000
,
0x8002000
,
0x8202000
,
0x20000
,
0x220000
,
0x8020000
,
0x8220000
,
0x22000
,
0x222000
,
0x8022000
,
0x8222000
);
pc2bytes4
=
new
Array
(
0
,
0x40000
,
0x10
,
0x40010
,
0
,
0x40000
,
0x10
,
0x40010
,
0x1000
,
0x41000
,
0x1010
,
0x41010
,
0x1000
,
0x41000
,
0x1010
,
0x41010
);
pc2bytes5
=
new
Array
(
0
,
0x400
,
0x20
,
0x420
,
0
,
0x400
,
0x20
,
0x420
,
0x2000000
,
0x2000400
,
0x2000020
,
0x2000420
,
0x2000000
,
0x2000400
,
0x2000020
,
0x2000420
);
pc2bytes6
=
new
Array
(
0
,
0x10000000
,
0x80000
,
0x10080000
,
0x2
,
0x10000002
,
0x80002
,
0x10080002
,
0
,
0x10000000
,
0x80000
,
0x10080000
,
0x2
,
0x10000002
,
0x80002
,
0x10080002
);
pc2bytes7
=
new
Array
(
0
,
0x10000
,
0x800
,
0x10800
,
0x20000000
,
0x20010000
,
0x20000800
,
0x20010800
,
0x20000
,
0x30000
,
0x20800
,
0x30800
,
0x20020000
,
0x20030000
,
0x20020800
,
0x20030800
);
pc2bytes8
=
new
Array
(
0
,
0x40000
,
0
,
0x40000
,
0x2
,
0x40002
,
0x2
,
0x40002
,
0x2000000
,
0x2040000
,
0x2000000
,
0x2040000
,
0x2000002
,
0x2040002
,
0x2000002
,
0x2040002
);
pc2bytes9
=
new
Array
(
0
,
0x10000000
,
0x8
,
0x10000008
,
0
,
0x10000000
,
0x8
,
0x10000008
,
0x400
,
0x10000400
,
0x408
,
0x10000408
,
0x400
,
0x10000400
,
0x408
,
0x10000408
);
pc2bytes10
=
new
Array
(
0
,
0x20
,
0
,
0x20
,
0x100000
,
0x100020
,
0x100000
,
0x100020
,
0x2000
,
0x2020
,
0x2000
,
0x2020
,
0x102000
,
0x102020
,
0x102000
,
0x102020
);
pc2bytes11
=
new
Array
(
0
,
0x1000000
,
0x200
,
0x1000200
,
0x200000
,
0x1200000
,
0x200200
,
0x1200200
,
0x4000000
,
0x5000000
,
0x4000200
,
0x5000200
,
0x4200000
,
0x5200000
,
0x4200200
,
0x5200200
);
pc2bytes12
=
new
Array
(
0
,
0x1000
,
0x8000000
,
0x8001000
,
0x80000
,
0x81000
,
0x8080000
,
0x8081000
,
0x10
,
0x1010
,
0x8000010
,
0x8001010
,
0x80010
,
0x81010
,
0x8080010
,
0x8081010
);
pc2bytes13
=
new
Array
(
0
,
0x4
,
0x100
,
0x104
,
0
,
0x4
,
0x100
,
0x104
,
0x1
,
0x5
,
0x101
,
0x105
,
0x1
,
0x5
,
0x101
,
0x105
);
//how many iterations (1 for des, 3 for triple des)
var
iterations
=
key
.
length
>
8
?
3
:
1
;
//changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys
//stores the return keys
var
keys
=
new
Array
(
32
*
iterations
);
//now define the left shifts which need to be done
var
shifts
=
new
Array
(
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
);
//other variables
var
lefttemp
,
righttemp
,
m
=
0
,
n
=
0
,
temp
;
for
(
var
j
=
0
;
j
<
iterations
;
j
++
)
{
//either 1 or 3 iterations
left
=
(
key
[
m
++
]
<<
24
)
|
(
key
[
m
++
]
<<
16
)
|
(
key
[
m
++
]
<<
8
)
|
key
[
m
++
];
right
=
(
key
[
m
++
]
<<
24
)
|
(
key
[
m
++
]
<<
16
)
|
(
key
[
m
++
]
<<
8
)
|
key
[
m
++
];
temp
=
((
left
>>>
4
)
^
right
)
&
0x0f0f0f0f
;
right
^=
temp
;
left
^=
(
temp
<<
4
);
temp
=
((
right
>>>
-
16
)
^
left
)
&
0x0000ffff
;
left
^=
temp
;
right
^=
(
temp
<<
-
16
);
temp
=
((
left
>>>
2
)
^
right
)
&
0x33333333
;
right
^=
temp
;
left
^=
(
temp
<<
2
);
temp
=
((
right
>>>
-
16
)
^
left
)
&
0x0000ffff
;
left
^=
temp
;
right
^=
(
temp
<<
-
16
);
temp
=
((
left
>>>
1
)
^
right
)
&
0x55555555
;
right
^=
temp
;
left
^=
(
temp
<<
1
);
temp
=
((
right
>>>
8
)
^
left
)
&
0x00ff00ff
;
left
^=
temp
;
right
^=
(
temp
<<
8
);
temp
=
((
left
>>>
1
)
^
right
)
&
0x55555555
;
right
^=
temp
;
left
^=
(
temp
<<
1
);
//the right side needs to be shifted and to get the last four bits of the left side
temp
=
(
left
<<
8
)
|
((
right
>>>
20
)
&
0x000000f0
);
//left needs to be put upside down
left
=
(
right
<<
24
)
|
((
right
<<
8
)
&
0xff0000
)
|
((
right
>>>
8
)
&
0xff00
)
|
((
right
>>>
24
)
&
0xf0
);
right
=
temp
;
//now go through and perform these shifts on the left and right keys
for
(
var
i
=
0
;
i
<
shifts
.
length
;
i
++
)
{
//shift the keys either one or two bits to the left
if
(
shifts
[
i
])
{
left
=
(
left
<<
2
)
|
(
left
>>>
26
);
right
=
(
right
<<
2
)
|
(
right
>>>
26
);}
else
{
left
=
(
left
<<
1
)
|
(
left
>>>
27
);
right
=
(
right
<<
1
)
|
(
right
>>>
27
);}
left
&=
-
0xf
;
right
&=
-
0xf
;
//now apply PC-2, in such a way that E is easier when encrypting or decrypting
//this conversion will look like PC-2 except only the last 6 bits of each byte are used
//rather than 48 consecutive bits and the order of lines will be according to
//how the S selection functions will be applied: S2, S4, S6, S8, S1, S3, S5, S7
lefttemp
=
pc2bytes0
[
left
>>>
28
]
|
pc2bytes1
[(
left
>>>
24
)
&
0xf
]
|
pc2bytes2
[(
left
>>>
20
)
&
0xf
]
|
pc2bytes3
[(
left
>>>
16
)
&
0xf
]
|
pc2bytes4
[(
left
>>>
12
)
&
0xf
]
|
pc2bytes5
[(
left
>>>
8
)
&
0xf
]
|
pc2bytes6
[(
left
>>>
4
)
&
0xf
];
righttemp
=
pc2bytes7
[
right
>>>
28
]
|
pc2bytes8
[(
right
>>>
24
)
&
0xf
]
|
pc2bytes9
[(
right
>>>
20
)
&
0xf
]
|
pc2bytes10
[(
right
>>>
16
)
&
0xf
]
|
pc2bytes11
[(
right
>>>
12
)
&
0xf
]
|
pc2bytes12
[(
right
>>>
8
)
&
0xf
]
|
pc2bytes13
[(
right
>>>
4
)
&
0xf
];
temp
=
((
righttemp
>>>
16
)
^
lefttemp
)
&
0x0000ffff
;
keys
[
n
++
]
=
lefttemp
^
temp
;
keys
[
n
++
]
=
righttemp
^
(
temp
<<
16
);
}
}
}
//for each iterations
for
(
j
=
0
;
j
<
24
;
++
j
)
{
//return the keys we've created
if
(
pcr
[
DES
.
pc2
[
j
]]
!=
0
)
return
keys
;
kn
[
m
]
|=
DES
.
bigbyte
[
j
];
}
//end of des_createKeys
if
(
pcr
[
DES
.
pc2
[
j
+
24
]]
!=
0
)
kn
[
n
]
|=
DES
.
bigbyte
[
j
];
}
}
DES
.
cookey
(
kn
,
KnL
);
},
cookey
:
function
(
raw
,
KnL
)
{
var
raw0
,
raw1
;
var
rawi
,
KnLi
;
var
i
;
for
(
i
=
0
,
rawi
=
0
,
KnLi
=
0
;
i
<
16
;
++
i
)
{
raw0
=
raw
[
rawi
++
];
raw1
=
raw
[
rawi
++
];
KnL
[
KnLi
]
=
(
raw0
&
0x00fc0000
)
<<
6
;
KnL
[
KnLi
]
|=
(
raw0
&
0x00000fc0
)
<<
10
;
KnL
[
KnLi
]
|=
(
raw1
&
0x00fc0000
)
>>>
10
;
KnL
[
KnLi
]
|=
(
raw1
&
0x00000fc0
)
>>>
6
;
++
KnLi
;
KnL
[
KnLi
]
=
(
raw0
&
0x0003f000
)
<<
12
;
KnL
[
KnLi
]
|=
(
raw0
&
0x0000003f
)
<<
16
;
KnL
[
KnLi
]
|=
(
raw1
&
0x0003f000
)
>>>
4
;
KnL
[
KnLi
]
|=
(
raw1
&
0x0000003f
);
++
KnLi
;
}
},
////////////////////////////// TEST //////////////////////////////
// Block encryption routines.
function
stringToHex
(
s
)
{
var
r
=
"0x"
;
var
hexes
=
new
Array
(
"0"
,
"1"
,
"2"
,
"3"
,
"4"
,
"5"
,
"6"
,
"7"
,
"8"
,
"9"
,
"a"
,
"b"
,
"c"
,
"d"
,
"e"
,
"f"
);
for
(
var
i
=
0
;
i
<
s
.
length
;
i
++
)
{
r
+=
hexes
[
s
.
charCodeAt
(
i
)
>>
4
]
+
hexes
[
s
.
charCodeAt
(
i
)
&
0xf
];}
return
r
;
}
function
hexToString
(
h
)
{
// / Encrypt a block of eight bytes.
var
r
=
""
;
encrypt
:
function
(
clearText
,
clearOff
,
cipherText
,
cipherOff
)
{
for
(
var
i
=
(
h
.
substr
(
0
,
2
)
==
"0x"
)?
2
:
0
;
i
<
h
.
length
;
i
+=
2
)
{
r
+=
String
.
fromCharCode
(
parseInt
(
h
.
substr
(
i
,
2
),
16
));}
var
tempInts
=
new
Array
(
12
);
return
r
;
DES
.
squashBytesToInts
(
clearText
,
clearOff
,
tempInts
,
0
,
2
);
}
DES
.
des
(
tempInts
,
tempInts
,
DES
.
encryptKeys
);
DES
.
spreadIntsToBytes
(
tempInts
,
0
,
cipherText
,
cipherOff
,
2
);
},
/*
// / Decrypt a block of eight bytes.
var key = "this is a 24 byte key !!";
decrypt
:
function
(
cipherText
,
cipherOff
,
clearText
,
clearOff
)
{
var message = "This is a test message";
var
tempInts
=
new
Array
(
12
);
var ciphertext = des (key, message, 1, 0);
DES
.
squashBytesToInts
(
cipherText
,
cipherOff
,
tempInts
,
0
,
2
);
document.writeln ("DES Test: " + stringToHex (ciphertext));
DES
.
des
(
tempInts
,
tempInts
,
DES
.
decryptKeys
);
*/
DES
.
spreadIntsToBytes
(
tempInts
,
0
,
clearText
,
clearOff
,
2
);
},
// The DES function.
des
:
function
(
inInts
,
outInts
,
keys
)
{
var
fval
,
work
,
right
,
leftt
;
var
round
;
var
keysi
=
0
;
leftt
=
inInts
[
0
];
right
=
inInts
[
1
];
work
=
((
leftt
>>>
4
)
^
right
)
&
0x0f0f0f0f
;
right
^=
work
;
leftt
^=
(
work
<<
4
);
work
=
((
leftt
>>>
16
)
^
right
)
&
0x0000ffff
;
right
^=
work
;
leftt
^=
(
work
<<
16
);
work
=
((
right
>>>
2
)
^
leftt
)
&
0x33333333
;
leftt
^=
work
;
right
^=
(
work
<<
2
);
work
=
((
right
>>>
8
)
^
leftt
)
&
0x00ff00ff
;
leftt
^=
work
;
right
^=
(
work
<<
8
);
right
=
(
right
<<
1
)
|
((
right
>>>
31
)
&
1
);
work
=
(
leftt
^
right
)
&
0xaaaaaaaa
;
leftt
^=
work
;
right
^=
work
;
leftt
=
(
leftt
<<
1
)
|
((
leftt
>>>
31
)
&
1
);
for
(
round
=
0
;
round
<
8
;
++
round
)
{
work
=
(
right
<<
28
)
|
(
right
>>>
4
);
work
^=
keys
[
keysi
++
];
fval
=
DES
.
SP7
[
work
&
0x0000003f
];
fval
|=
DES
.
SP5
[(
work
>>>
8
)
&
0x0000003f
];
fval
|=
DES
.
SP3
[(
work
>>>
16
)
&
0x0000003f
];
fval
|=
DES
.
SP1
[(
work
>>>
24
)
&
0x0000003f
];
work
=
right
^
keys
[
keysi
++
];
fval
|=
DES
.
SP8
[
work
&
0x0000003f
];
fval
|=
DES
.
SP6
[(
work
>>>
8
)
&
0x0000003f
];
fval
|=
DES
.
SP4
[(
work
>>>
16
)
&
0x0000003f
];
fval
|=
DES
.
SP2
[(
work
>>>
24
)
&
0x0000003f
];
leftt
^=
fval
;
work
=
(
leftt
<<
28
)
|
(
leftt
>>>
4
);
work
^=
keys
[
keysi
++
];
fval
=
DES
.
SP7
[
work
&
0x0000003f
];
fval
|=
DES
.
SP5
[(
work
>>>
8
)
&
0x0000003f
];
fval
|=
DES
.
SP3
[(
work
>>>
16
)
&
0x0000003f
];
fval
|=
DES
.
SP1
[(
work
>>>
24
)
&
0x0000003f
];
work
=
leftt
^
keys
[
keysi
++
];
fval
|=
DES
.
SP8
[
work
&
0x0000003f
];
fval
|=
DES
.
SP6
[(
work
>>>
8
)
&
0x0000003f
];
fval
|=
DES
.
SP4
[(
work
>>>
16
)
&
0x0000003f
];
fval
|=
DES
.
SP2
[(
work
>>>
24
)
&
0x0000003f
];
right
^=
fval
;
}
right
=
(
right
<<
31
)
|
(
right
>>>
1
);
work
=
(
leftt
^
right
)
&
0xaaaaaaaa
;
leftt
^=
work
;
right
^=
work
;
leftt
=
(
leftt
<<
31
)
|
(
leftt
>>>
1
);
work
=
((
leftt
>>>
8
)
^
right
)
&
0x00ff00ff
;
right
^=
work
;
leftt
^=
(
work
<<
8
);
work
=
((
leftt
>>>
2
)
^
right
)
&
0x33333333
;
right
^=
work
;
leftt
^=
(
work
<<
2
);
work
=
((
right
>>>
16
)
^
leftt
)
&
0x0000ffff
;
leftt
^=
work
;
right
^=
(
work
<<
16
);
work
=
((
right
>>>
4
)
^
leftt
)
&
0x0f0f0f0f
;
leftt
^=
work
;
right
^=
(
work
<<
4
);
outInts
[
0
]
=
right
;
outInts
[
1
]
=
leftt
;
},
// Routines taken from other parts of the Acme utilities.
// / Squash bytes down to ints.
squashBytesToInts
:
function
(
inBytes
,
inOff
,
outInts
,
outOff
,
intLen
)
{
for
(
var
i
=
0
;
i
<
intLen
;
++
i
)
outInts
[
outOff
+
i
]
=
((
inBytes
[
inOff
+
i
*
4
]
&
0xff
)
<<
24
)
|
((
inBytes
[
inOff
+
i
*
4
+
1
]
&
0xff
)
<<
16
)
|
((
inBytes
[
inOff
+
i
*
4
+
2
]
&
0xff
)
<<
8
)
|
(
inBytes
[
inOff
+
i
*
4
+
3
]
&
0xff
);
},
// / Spread ints into unsigned bytes.
spreadIntsToBytes
:
function
(
inInts
,
inOff
,
outBytes
,
outOff
,
intLen
)
{
for
(
var
i
=
0
;
i
<
intLen
;
++
i
)
{
outBytes
[
outOff
+
i
*
4
]
=
(
inInts
[
inOff
+
i
]
>>>
24
)
%
256
;
outBytes
[
outOff
+
i
*
4
+
1
]
=
(
inInts
[
inOff
+
i
]
>>>
16
)
%
256
;
outBytes
[
outOff
+
i
*
4
+
2
]
=
(
inInts
[
inOff
+
i
]
>>>
8
)
%
256
;
outBytes
[
outOff
+
i
*
4
+
3
]
=
(
inInts
[
inOff
+
i
])
%
256
;
}
/* Make unsigned */
var
idx
;
for
(
var
i
=
0
;
i
<
intLen
;
++
i
)
{
for
(
var
j
=
0
;
j
<
4
;
j
++
)
{
idx
=
outOff
+
i
*
4
+
j
;
if
(
outBytes
[
idx
]
<
0
)
{
outBytes
[
idx
]
+=
256
;
}
}
}
}
}
include/util.js
View file @
c539e4dc
vnc.js
View file @
c539e4dc
...
@@ -123,7 +123,7 @@ rre_chunk : 100,
...
@@ -123,7 +123,7 @@ rre_chunk : 100,
init_msg
:
function
()
{
init_msg
:
function
()
{
console
.
log
(
">> init_msg"
);
console
.
log
(
">> init_msg"
);
//
console.log("RQ (" + RQ.length + ") " + RQ);
console
.
log
(
"RQ ("
+
RQ
.
length
+
") "
+
RQ
);
switch
(
RFB
.
state
)
{
switch
(
RFB
.
state
)
{
...
@@ -151,14 +151,7 @@ init_msg: function () {
...
@@ -151,14 +151,7 @@ init_msg: function () {
break
;
break
;
case
'Security'
:
case
'Security'
:
if
(
RFB
.
version
==
3.3
)
{
if
(
RFB
.
version
==
3.8
)
{
if
(
RQ
.
length
<
4
)
{
RFB
.
updateState
(
'reset'
,
"Invalid security frame"
);
return
;
}
RFB
.
auth_scheme
=
RQ
.
shift32
();
console
.
log
(
"auth_scheme: "
+
RFB
.
auth_scheme
);
}
else
if
(
RFB
.
version
==
3.8
)
{
var
num_types
=
RQ
.
shift8
();
var
num_types
=
RQ
.
shift8
();
if
(
num_types
==
0
)
{
if
(
num_types
==
0
)
{
var
strlen
=
RQ
.
shift32
();
var
strlen
=
RQ
.
shift32
();
...
@@ -168,11 +161,17 @@ init_msg: function () {
...
@@ -168,11 +161,17 @@ init_msg: function () {
}
}
var
types
=
RQ
.
shiftBytes
(
num_types
);
var
types
=
RQ
.
shiftBytes
(
num_types
);
if
((
types
[
0
]
!=
1
)
&&
(
types
[
0
]
!=
2
))
{
if
((
types
[
0
]
!=
1
)
&&
(
types
[
0
]
!=
2
))
{
RFB
.
updateState
(
'failed'
,
"Disconnected: invalid security type list: "
+
types
);
RFB
.
updateState
(
'failed'
,
"Disconnected: invalid security type
s
list: "
+
types
);
return
;
return
;
}
}
RFB
.
auth_scheme
=
types
[
0
];
RFB
.
auth_scheme
=
types
[
0
];
RFB
.
send_array
([
RFB
.
auth_scheme
]);
RFB
.
send_array
([
RFB
.
auth_scheme
]);
}
else
if
(
RFB
.
version
==
3.3
)
{
if
(
RQ
.
length
<
4
)
{
RFB
.
updateState
(
'failed'
,
"Invalid security frame"
);
return
;
}
RFB
.
auth_scheme
=
RQ
.
shift32
();
}
}
RFB
.
updateState
(
'Authentication'
,
"Authenticating using scheme: "
+
RFB
.
auth_scheme
);
RFB
.
updateState
(
'Authentication'
,
"Authenticating using scheme: "
+
RFB
.
auth_scheme
);
// Fall through
// Fall through
...
@@ -201,8 +200,7 @@ init_msg: function () {
...
@@ -201,8 +200,7 @@ init_msg: function () {
var
challenge
=
RQ
.
shiftBytes
(
16
);
var
challenge
=
RQ
.
shiftBytes
(
16
);
console
.
log
(
"Password: "
+
RFB
.
password
);
console
.
log
(
"Password: "
+
RFB
.
password
);
console
.
log
(
"Challenge: "
+
challenge
+
" ("
+
challenge
.
length
+
")"
);
console
.
log
(
"Challenge: "
+
challenge
+
" ("
+
challenge
.
length
+
")"
);
passwd
=
RFB
.
passwdTwiddle
(
RFB
.
password
);
var
response
=
RFB
.
DES
(
RFB
.
password
,
challenge
);
response
=
des
(
passwd
,
challenge
,
1
);
console
.
log
(
"Response: "
+
response
+
" ("
+
response
.
length
+
")"
);
console
.
log
(
"Response: "
+
response
+
" ("
+
response
.
length
+
")"
);
RFB
.
send_array
(
response
);
RFB
.
send_array
(
response
);
...
@@ -215,8 +213,8 @@ init_msg: function () {
...
@@ -215,8 +213,8 @@ init_msg: function () {
break
;
break
;
case
'SecurityResult'
:
case
'SecurityResult'
:
if
(
RQ
.
length
!=
4
)
{
if
(
RQ
.
length
<
4
)
{
RFB
.
updateState
(
'
reset
'
,
"Invalid VNC auth response"
);
RFB
.
updateState
(
'
failed
'
,
"Invalid VNC auth response"
);
return
;
return
;
}
}
var
resp
=
RQ
.
shift32
();
var
resp
=
RQ
.
shift32
();
...
@@ -225,7 +223,13 @@ init_msg: function () {
...
@@ -225,7 +223,13 @@ init_msg: function () {
RFB
.
updateState
(
'ServerInitialisation'
,
"Authentication OK"
);
RFB
.
updateState
(
'ServerInitialisation'
,
"Authentication OK"
);
break
;
break
;
case
1
:
// failed
case
1
:
// failed
RFB
.
updateState
(
'reset'
,
"Authentication failed"
);
if
(
RFB
.
version
==
3.8
)
{
var
reason_len
=
RQ
.
shift32
();
var
reason
=
RQ
.
shiftStr
(
reason_len
);
RFB
.
updateState
(
'failed'
,
reason
);
}
else
if
(
RFB
.
version
==
3.3
)
{
RFB
.
updateState
(
'failed'
,
"Authentication failed"
);
}
return
;
return
;
case
2
:
// too-many
case
2
:
// too-many
RFB
.
updateState
(
'failed'
,
"Disconnected: too many auth attempts"
);
RFB
.
updateState
(
'failed'
,
"Disconnected: too many auth attempts"
);
...
@@ -236,7 +240,7 @@ init_msg: function () {
...
@@ -236,7 +240,7 @@ init_msg: function () {
case
'ServerInitialisation'
:
case
'ServerInitialisation'
:
if
(
RQ
.
length
<
24
)
{
if
(
RQ
.
length
<
24
)
{
RFB
.
updateState
(
'
reset
'
,
"Invalid server initialisation"
);
RFB
.
updateState
(
'
failed
'
,
"Invalid server initialisation"
);
return
;
return
;
}
}
...
@@ -796,22 +800,17 @@ send_array: function (arr) {
...
@@ -796,22 +800,17 @@ send_array: function (arr) {
}
}
},
},
/* Mirror bits of each character and return as array */
DES
:
function
(
password
,
challenge
)
{
passwdTwiddle
:
function
(
passwd
)
{
var
passwd
=
[];
var
arr
;
var
response
=
challenge
.
slice
();
arr
=
[];
for
(
var
i
=
0
;
i
<
password
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
passwd
.
length
;
i
++
)
{
passwd
.
push
(
password
.
charCodeAt
(
i
));
var
c
=
passwd
.
charCodeAt
(
i
);
arr
.
push
(
((
c
&
0x80
)
>>
7
)
+
((
c
&
0x40
)
>>
5
)
+
((
c
&
0x20
)
>>
3
)
+
((
c
&
0x10
)
>>
1
)
+
((
c
&
0x08
)
<<
1
)
+
((
c
&
0x04
)
<<
3
)
+
((
c
&
0x02
)
<<
5
)
+
((
c
&
0x01
)
<<
7
)
);
}
}
return
arr
;
DES
.
setKeys
(
passwd
);
DES
.
encrypt
(
response
,
0
,
response
,
0
);
DES
.
encrypt
(
response
,
8
,
response
,
8
);
return
response
;
},
},
flushClient
:
function
()
{
flushClient
:
function
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment