11import type { BlockCipher } from "../block-modes/base.ts" ;
22// deno-fmt-ignore
3- import { PC2_0 , PC2_1 , PC2_10 , PC2_11 , PC2_12 , PC2_13 , PC2_2 , PC2_3 , PC2_4 , PC2_5 , PC2_6 , PC2_7 , PC2_8 , PC2_9 , SHIFTS , SP1 , SP2 , SP3 , SP4 , SP5 , SP6 , SP7 , SP8 } from "./consts.ts" ;
3+ import { PC2_0 , PC2_1 , PC2_10 , PC2_11 , PC2_12 , PC2_13 , PC2_2 , PC2_3 , PC2_4 , PC2_5 , PC2_6 , PC2_7 , PC2_8 , PC2_9 , SP1 , SP2 , SP3 , SP4 , SP5 , SP6 , SP7 , SP8 } from "./consts.ts" ;
44
55/**
66 * Data Encryption Standard (DES) block cipher.
@@ -19,8 +19,7 @@ export class Des implements BlockCipher {
1919 if ( key . length != 8 ) {
2020 throw new Error ( "Invalid key length (must be 8 bytes)" ) ;
2121 }
22-
23- const keyV = new DataView ( key . buffer ) ;
22+ const keyV = new DataView ( key . buffer , key . byteOffset , key . byteLength ) ;
2423 let l = keyV . getUint32 ( 0 ) ;
2524 let r = keyV . getUint32 ( 4 ) ;
2625 let t = ( l >>> 4 ^ r ) & 0x0f0f0f0f ;
@@ -47,17 +46,14 @@ export class Des implements BlockCipher {
4746 t = l << 8 | r >>> 20 & 0x000000f0 ;
4847 l = r << 24 | r << 8 & 0xff0000 | r >>> 8 & 0xff00 | r >>> 24 & 0xf0 ;
4948 r = t ;
50-
5149 for ( let i = 0 ; i < 32 ; i += 2 ) {
52- if ( SHIFTS [ i / 2 ] ) {
53- l = l << 2 | l >>> 26 ;
54- r = r << 2 | r >>> 26 ;
50+ if ( i == 0 || i == 2 || i == 16 || i == 30 ) {
51+ l = ( l << 1 | l >>> 27 ) & 0xfffffff1 ;
52+ r = ( r << 1 | r >>> 27 ) & 0xfffffff1 ;
5553 } else {
56- l = l << 1 | l >>> 27 ;
57- r = r << 1 | r >>> 27 ;
54+ l = ( l << 2 | l >>> 26 ) & 0xfffffff1 ;
55+ r = ( r << 2 | r >>> 26 ) & 0xfffffff1 ;
5856 }
59- l &= - 0xf ;
60- r &= - 0xf ;
6157 const lt = PC2_0 [ l >>> 28 ] | PC2_1 [ ( l >>> 24 ) & 0xf ] |
6258 PC2_2 [ ( l >>> 20 ) & 0xf ] | PC2_3 [ ( l >>> 16 ) & 0xf ] |
6359 PC2_4 [ ( l >>> 12 ) & 0xf ] | PC2_5 [ ( l >>> 8 ) & 0xf ] |
@@ -73,30 +69,13 @@ export class Des implements BlockCipher {
7369 }
7470
7571 encryptBlock ( data : DataView , offset : number ) {
76- let l = data . getUint32 ( offset ) ;
77- let r = data . getUint32 ( offset + 4 ) ;
78- let t = ( l >>> 4 ^ r ) & 0x0f0f0f0f ;
79- r ^= t ;
80- l ^= t << 4 ;
81- t = ( l >>> 16 ^ r ) & 0x0000ffff ;
82- r ^= t ;
83- l ^= t << 16 ;
84- t = ( r >>> 2 ^ l ) & 0x33333333 ;
85- l ^= t ;
86- r ^= t << 2 ;
87- t = ( r >>> 8 ^ l ) & 0x00ff00ff ;
88- l ^= t ;
89- r ^= t << 8 ;
90- t = ( l >>> 1 ^ r ) & 0x55555555 ;
91- r ^= t ;
92- l ^= t << 1 ;
93- l = l << 1 | l >>> 31 ;
94- r = r << 1 | r >>> 31 ;
72+ let [ l , r ] = ip ( data , offset ) ;
9573
9674 for ( let i = 0 ; i < 32 ; i += 2 ) {
9775 const r1 = r ^ this . #keys[ i ] ;
9876 const r2 = ( r >>> 4 | r << 28 ) ^ this . #keys[ i + 1 ] ;
99- t = l , l = r ;
77+ const t = l ;
78+ l = r ;
10079 r = t ^ (
10180 SP2 [ r1 >>> 24 & 0x3f ] |
10281 SP4 [ r1 >>> 16 & 0x3f ] |
@@ -109,53 +88,17 @@ export class Des implements BlockCipher {
10988 ) ;
11089 }
11190
112- t = l , l = r , r = t ;
113- l = l >>> 1 | l << 31 ;
114- r = r >>> 1 | r << 31 ;
115- t = ( l >>> 1 ^ r ) & 0x55555555 ;
116- r ^= t ;
117- l ^= t << 1 ;
118- t = ( r >>> 8 ^ l ) & 0x00ff00ff ;
119- l ^= t ;
120- r ^= t << 8 ;
121- t = ( r >>> 2 ^ l ) & 0x33333333 ;
122- l ^= t ;
123- r ^= t << 2 ;
124- t = ( l >>> 16 ^ r ) & 0x0000ffff ;
125- r ^= t ;
126- l ^= t << 16 ;
127- t = ( l >>> 4 ^ r ) & 0x0f0f0f0f ;
128- r ^= t ;
129- l ^= t << 4 ;
130- data . setUint32 ( offset , l ) ;
131- data . setUint32 ( offset + 4 , r ) ;
91+ rip ( r , l , data , offset ) ;
13292 }
13393
13494 decryptBlock ( data : DataView , offset : number ) {
135- let l = data . getUint32 ( offset ) ;
136- let r = data . getUint32 ( offset + 4 ) ;
137- let t = ( l >>> 4 ^ r ) & 0x0f0f0f0f ;
138- r ^= t ;
139- l ^= t << 4 ;
140- t = ( l >>> 16 ^ r ) & 0x0000ffff ;
141- r ^= t ;
142- l ^= t << 16 ;
143- t = ( r >>> 2 ^ l ) & 0x33333333 ;
144- l ^= t ;
145- r ^= t << 2 ;
146- t = ( r >>> 8 ^ l ) & 0x00ff00ff ;
147- l ^= t ;
148- r ^= t << 8 ;
149- t = ( l >>> 1 ^ r ) & 0x55555555 ;
150- r ^= t ;
151- l ^= t << 1 ;
152- l = l << 1 | l >>> 31 ;
153- r = r << 1 | r >>> 31 ;
95+ let [ l , r ] = ip ( data , offset ) ;
15496
15597 for ( let i = 30 ; i >= 0 ; i -= 2 ) {
15698 const r1 = r ^ this . #keys[ i ] ;
15799 const r2 = ( r >>> 4 | r << 28 ) ^ this . #keys[ i + 1 ] ;
158- t = l , l = r ;
100+ const t = l ;
101+ l = r ;
159102 r = t ^ (
160103 SP2 [ r1 >>> 24 & 0x3f ] |
161104 SP4 [ r1 >>> 16 & 0x3f ] |
@@ -168,25 +111,51 @@ export class Des implements BlockCipher {
168111 ) ;
169112 }
170113
171- t = l , l = r , r = t ;
172- l = l >>> 1 | l << 31 ;
173- r = r >>> 1 | r << 31 ;
174- t = ( l >>> 1 ^ r ) & 0x55555555 ;
175- r ^= t ;
176- l ^= t << 1 ;
177- t = ( r >>> 8 ^ l ) & 0x00ff00ff ;
178- l ^= t ;
179- r ^= t << 8 ;
180- t = ( r >>> 2 ^ l ) & 0x33333333 ;
181- l ^= t ;
182- r ^= t << 2 ;
183- t = ( l >>> 16 ^ r ) & 0x0000ffff ;
184- r ^= t ;
185- l ^= t << 16 ;
186- t = ( l >>> 4 ^ r ) & 0x0f0f0f0f ;
187- r ^= t ;
188- l ^= t << 4 ;
189- data . setInt32 ( offset , l ) ;
190- data . setInt32 ( offset + 4 , r ) ;
114+ rip ( r , l , data , offset ) ;
191115 }
192116}
117+
118+ function ip ( data : DataView , offset : number ) {
119+ let l = data . getUint32 ( offset ) ;
120+ let r = data . getUint32 ( offset + 4 ) ;
121+ let t = ( l >>> 4 ^ r ) & 0x0f0f0f0f ;
122+ r ^= t ;
123+ l ^= t << 4 ;
124+ t = ( l >>> 16 ^ r ) & 0x0000ffff ;
125+ r ^= t ;
126+ l ^= t << 16 ;
127+ t = ( r >>> 2 ^ l ) & 0x33333333 ;
128+ l ^= t ;
129+ r ^= t << 2 ;
130+ t = ( r >>> 8 ^ l ) & 0x00ff00ff ;
131+ l ^= t ;
132+ r ^= t << 8 ;
133+ t = ( l >>> 1 ^ r ) & 0x55555555 ;
134+ r ^= t ;
135+ l ^= t << 1 ;
136+ l = l << 1 | l >>> 31 ;
137+ r = r << 1 | r >>> 31 ;
138+ return [ l , r ] ;
139+ }
140+
141+ function rip ( l : number , r : number , data : DataView , offset : number ) {
142+ l = l >>> 1 | l << 31 ;
143+ r = r >>> 1 | r << 31 ;
144+ let t = ( l >>> 1 ^ r ) & 0x55555555 ;
145+ r ^= t ;
146+ l ^= t << 1 ;
147+ t = ( r >>> 8 ^ l ) & 0x00ff00ff ;
148+ l ^= t ;
149+ r ^= t << 8 ;
150+ t = ( r >>> 2 ^ l ) & 0x33333333 ;
151+ l ^= t ;
152+ r ^= t << 2 ;
153+ t = ( l >>> 16 ^ r ) & 0x0000ffff ;
154+ r ^= t ;
155+ l ^= t << 16 ;
156+ t = ( l >>> 4 ^ r ) & 0x0f0f0f0f ;
157+ r ^= t ;
158+ l ^= t << 4 ;
159+ data . setInt32 ( offset , l ) ;
160+ data . setInt32 ( offset + 4 , r ) ;
161+ }
0 commit comments