ソースを参照

enhanced readability

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7627 8c9fc860-2736-0410-a75d-ab315db34111
eth.guenter 7 年 前
コミット
c4580eb93d
2 ファイル変更66 行追加77 行削除
  1. 39 29
      source/CryptoDES.Mod
  2. 27 48
      source/CryptoDES3.Mod

+ 39 - 29
source/CryptoDES.Mod

@@ -5,17 +5,24 @@ MODULE CryptoDES;	(** AUTHOR "G.F."; PUROSE "DES Cipher";	 *)
 
 
 IMPORT S := SYSTEM, U := CryptoUtils, Ciphers := CryptoCiphers;
+CONST 
+	Mask01 = S.VAL( SET, 0AAAAAAAAH );
+	Mask02 = S.VAL( SET, 33333333H );
+	Mask04 = S.VAL( SET, 0F0F0F0FH );
+	Mask08 = S.VAL( SET, 00FF00FFH );
+	Mask16 = S.VAL( SET, 0000FFFFH );
 
 TYPE
 	Sandbox = ARRAY 64 OF SET;
 	BitSwap = ARRAY 16 OF SET;
+	Ind4* = RECORD a-, b-, c-, d-: LONGINT END;
+	
 VAR
 	sb1-, sb2-, sb3-, sb4-, sb5-, sb6-, sb7-, sb8-: Sandbox;
-	
 	LHs, RHs: BitSwap;
 	
 TYPE 
-	Cipher* = OBJECT (Ciphers.Cipher)
+	Cipher* = OBJECT (Ciphers.Cipher)		
 	VAR
 		ske, skd: ARRAY 32 OF SET;  ki: LONGINT;
 		ivx, ivy: SET;
@@ -56,8 +63,7 @@ TYPE
 				IP( X, Y );  
 				ki := 0;
 				FOR r := 0 TO 7 DO  
-					RoundE( Y, X );
-					RoundE( X, Y );
+					RoundE( Y, X );  RoundE( X, Y );
 				END;
 				FP( Y, X );
 				U.SetToBufferBE( Y, buf, ofs + i );   U.SetToBufferBE( X, buf, ofs + i + 4); 
@@ -79,8 +85,7 @@ TYPE
 				IP( X, Y );  
 				ki := 0;
 				FOR r := 0 TO 7 DO  
-					RoundD( Y, X );
-					RoundD( X, Y );
+					RoundD( Y, X );  RoundD( X, Y );
 				END;
 				FP( Y, X );
 				IF mode = Ciphers.CBC THEN  
@@ -92,24 +97,23 @@ TYPE
 			END
 		END Decrypt;
 		
-		
-		
+				
 		PROCEDURE RoundE*( VAR x, y: SET );
-		VAR t: LONGINT;
+		VAR i: Ind4;
 		BEGIN
-			t := S.VAL( LONGINT,  ske[ki] / x );  INC( ki );
-			y := y / sb8[t MOD 40H] / sb6[t DIV 100H MOD 40H] / sb4[t DIV 10000H MOD 40H] / sb2[t DIV 1000000H MOD 40H];
-			t := S.VAL( LONGINT,  ske[ki] / ROT( x, -4 ) );  INC( ki );
-			y := y / sb7[t MOD 40H] / sb5[t DIV 100H MOD 40H] / sb3[t DIV 10000H MOD 40H] / sb1[t DIV 1000000H MOD 40H]
+			Split( ske[ki] / x, i );  INC( ki );
+			y := y / sb8[i.a] / sb6[i.b] / sb4[i.c] / sb2[i.d];
+			Split( ske[ki] / ROT( x, -4 ), i );  INC( ki );
+			y := y / sb7[i.a] / sb5[i.b] / sb3[i.c] / sb1[i.d]
 		END RoundE;
 		
 		PROCEDURE RoundD*( VAR x, y: SET );
-		VAR t: LONGINT;
+		VAR i: Ind4;
 		BEGIN
-			t := S.VAL( LONGINT,  skd[ki] / x );  INC( ki );
-			y := y / sb8[t MOD 40H] / sb6[t DIV 100H MOD 40H] / sb4[t DIV 10000H MOD 40H] / sb2[t DIV 1000000H MOD 40H];
-			t := S.VAL( LONGINT,  skd[ki] / ROT( x, -4 ) );  INC( ki );
-			y := y / sb7[t MOD 40H] / sb5[t DIV 100H MOD 40H] / sb3[t DIV 10000H MOD 40H] / sb1[t DIV 1000000H MOD 40H]
+			Split( skd[ki] / x, i );  INC( ki );
+			y := y / sb8[i.a] / sb6[i.b] / sb4[i.c] / sb2[i.d];
+			Split( skd[ki] / ROT( x, -4 ), i );  INC( ki );
+			y := y / sb7[i.a] / sb5[i.b] / sb3[i.c] / sb1[i.d]
 		END RoundD;
 		
 		
@@ -120,7 +124,13 @@ TYPE
 	
 	END Cipher;
 	
-	
+	PROCEDURE -Split*( x: SET; VAR i4: Ind4 );
+	BEGIN
+		i4.a := S.VAL( LONGINT, x ) MOD 40H;
+		i4.b := S.VAL( LONGINT, x ) DIV 100H MOD 40H;
+		i4.c := S.VAL( LONGINT, x ) DIV 10000H MOD 40H;
+		i4.d := S.VAL( LONGINT, x ) DIV 1000000H MOD 40H
+	END Split; 
 	
 	
 	PROCEDURE NewCipher*( ): Ciphers.Cipher;
@@ -134,12 +144,12 @@ TYPE
 	PROCEDURE IP*( VAR x, y: SET );	(* initial permutation *)
 	VAR t: SET;
 	BEGIN
-		t := (LSH( x,   -4 ) / y) * S.VAL( SET, 0F0F0F0FH );	y := y / t;  x := x / LSH( t, 4 );
-		t := (LSH( x, -16 ) / y) * S.VAL( SET, 0000FFFFH );	y := y / t;  x := x / LSH( t, 16 );
-		t := (LSH( y,   -2 ) / x) * S.VAL( SET, 33333333H );	x := x / t;  y := y / LSH( t, 2 );
-		t := (LSH( y,   -8 ) / x) * S.VAL( SET, 00FF00FFH );	x := x / t;  y := y / LSH( t, 8 );
+		t := (LSH( x,   -4 ) / y) * Mask04;	 y := y / t;  x := x / LSH( t, 4 );
+		t := (LSH( x, -16 ) / y) * Mask16;	 y := y / t;  x := x / LSH( t, 16 );
+		t := (LSH( y,   -2 ) / x) * Mask02;	 x := x / t;  y := y / LSH( t, 2 );
+		t := (LSH( y,   -8 ) / x) * Mask08;	 x := x / t;  y := y / LSH( t, 8 );
 		y := ROT( y, 1 );
-		t := (x / y) * S.VAL( SET, 0AAAAAAAAH );  y := y / t;  x := x / t; 
+		t := (x / y) * Mask01;  y := y / t;  x := x / t; 
 		x := ROT( x, 1 );			
 	END IP;
 		
@@ -147,12 +157,12 @@ TYPE
 	VAR t: SET;
 	BEGIN
 		x := ROT( x, -1 );
-		t := (x / y) * S.VAL( SET, 0AAAAAAAAH );  x := x / t;  y := y / t;
+		t := (x / y) * Mask01;  x := x / t;  y := y / t;
 		y := ROT( y, -1 );
-		t := (LSH( y,   -8 ) / x) * S.VAL( SET, 00FF00FFH );	x := x / t;  y := y / LSH( t, 8 );
-		t := (LSH( y,   -2 ) / x) * S.VAL( SET, 33333333H );	x := x / t;  y := y / LSH( t, 2 );
-		t := (LSH( x, -16 ) / y) * S.VAL( SET, 0000FFFFH );	y := y / t;  x := x / LSH( t, 16 );
-		t := (LSH( x,   -4 ) / y) * S.VAL( SET, 0F0F0F0FH );	y := y / t;  x := x / LSH( t, 4 );
+		t := (LSH( y,   -8 ) / x) * Mask08;	 x := x / t;  y := y / LSH( t, 8 );
+		t := (LSH( y,   -2 ) / x) * Mask02;	 x := x / t;  y := y / LSH( t, 2 );
+		t := (LSH( x, -16 ) / y) * Mask16;	 y := y / t;  x := x / LSH( t, 16 );
+		t := (LSH( x,   -4 ) / y) * Mask04;	 y := y / t;  x := x / LSH( t, 4 );
 	END FP;
 	
 	

+ 27 - 48
source/CryptoDES3.Mod

@@ -3,13 +3,14 @@ MODULE CryptoDES3;   (** AUTHOR "G.F."; PUROSE "Triple DES Cipher";	 *)
 
 (*  based on  POLARSSL des.c *)
 
-IMPORT Ciphers := CryptoCiphers, U := CryptoUtils, DES := CryptoDES, S := SYSTEM;
+IMPORT Ciphers := CryptoCiphers, U := CryptoUtils, D := CryptoDES;
 
 	
 	
 TYPE
 	Cipher* = OBJECT (Ciphers.Cipher)
-			VAR ske, skd: ARRAY 96 OF SET; ski: LONGINT;
+			VAR 
+				ske, skd: ARRAY 96 OF SET; ski: LONGINT;
 				ivx, ivy: SET;
 
 				PROCEDURE InitKey*( CONST src: ARRAY OF CHAR; keybits: LONGINT );
@@ -19,13 +20,13 @@ TYPE
 					InitKey^( src, 64 );
 					
 					X := U.SetFromBufferBE( src, 0 );  Y := U.SetFromBufferBE( src, 4 );
-					DES.ComputeSubkeys( X, Y, ske, 0 );
+					D.ComputeSubkeys( X, Y, ske, 0 );
 					
 					X := U.SetFromBufferBE( src, 8 );  Y := U.SetFromBufferBE( src, 12 );
-					DES.ComputeSubkeys( X, Y, skd, 32 );
+					D.ComputeSubkeys( X, Y, skd, 32 );
 					
 					X := U.SetFromBufferBE( src, 16);  Y := U.SetFromBufferBE( src, 20 );
-					DES.ComputeSubkeys( X, Y, ske, 64 );
+					D.ComputeSubkeys( X, Y, ske, 64 );
 					
 					FOR i := 0 TO 30 BY 2 DO
 						skd[i + 0] := ske[94 - i];
@@ -55,21 +56,18 @@ TYPE
 						X := U.SetFromBufferBE( buf, ofs + i );  Y := U.SetFromBufferBE( buf, ofs + i + 4 );
 						IF mode = Ciphers.CBC THEN  X := X / ivx;  Y := Y / ivy   END;
 
-						DES.IP( X, Y );
+						D.IP( X, Y );
 						ski := 0;
 						FOR r := 0 TO 7 DO  
-							RoundE( Y, X );
-							RoundE( X, Y );
+							RoundE( Y, X );  RoundE( X, Y );
 						END;
 						FOR r := 0 TO 7 DO  
-							RoundE( X, Y );
-							RoundE( Y, X );
+							RoundE( X, Y );  RoundE( Y, X );
 						END;
 						FOR r := 0 TO 7 DO  
-							RoundE( Y, X );
-							RoundE( X, Y );
+							RoundE( Y, X );  RoundE( X, Y );
 						END;
-						DES.FP( Y, X );
+						D.FP( Y, X );
 						
 						U.SetToBufferBE( Y, buf, ofs + i );   U.SetToBufferBE( X, buf, ofs + i + 4); 
 						IF mode = Ciphers.CBC THEN  ivx := Y;  ivy := X  END;
@@ -87,21 +85,18 @@ TYPE
 						X := U.SetFromBufferBE( buf, ofs + i );  Y := U.SetFromBufferBE( buf, ofs + i + 4 );
 						IF mode = Ciphers.CBC THEN  X0 := X;  Y0 := Y  END;
 						
-						DES.IP( X, Y );
+						D.IP( X, Y );
 						ski := 0;
 						FOR r := 0 TO 7 DO  
-							RoundD( Y, X );
-							RoundD( X, Y );
+							RoundD( Y, X );  RoundD( X, Y );
 						END;
 						FOR r := 0 TO 7 DO  
-							RoundD( X, Y );
-							RoundD( Y, X );
+							RoundD( X, Y );  RoundD( Y, X );
 						END;
 						FOR r := 0 TO 7 DO  
-							RoundD( Y, X );
-							RoundD( X, Y );
+							RoundD( Y, X );  RoundD( X, Y );
 						END;
-						DES.FP( Y, X );
+						D.FP( Y, X );
 						
 						IF mode = Ciphers.CBC THEN  
 							Y := Y / ivx;  X := X / ivy  ; 
@@ -112,39 +107,23 @@ TYPE
 					END
 				END Decrypt;
 
-
+				
 				PROCEDURE RoundE*( VAR x, y: SET );
-				VAR t: LONGINT;
+				VAR i: D.Ind4;
 				BEGIN
-					t := S.VAL( LONGINT, ske[ski] / x );  INC(ski );
-					y := y / 
-						DES.sb8[t MOD 40H] / 
-						DES.sb6[t DIV 100H MOD 40H] /
-						DES.sb4[t DIV 10000H MOD 40H] / 
-						DES.sb2[t DIV 1000000H MOD 40H];
-					t := S.VAL( LONGINT, ske[ski] / ROT( x, -4 ) );  INC( ski );
-					y := y / 
-						DES.sb7[t MOD 40H] / 
-						DES.sb5[t DIV 100H MOD 40H] /
-						DES.sb3[t DIV 10000H MOD 40H] / 
-						DES.sb1[t DIV 1000000H MOD 40H]
+					D.Split( ske[ski] / x, i );  INC( ski );
+					y := y / D.sb8[i.a] / D.sb6[i.b] / D.sb4[i.c] / D.sb2[i.d];
+					D.Split( ske[ski] / ROT( x, -4 ), i );  INC( ski );
+					y := y / D.sb7[i.a] / D.sb5[i.b] / D.sb3[i.c] / D.sb1[i.d]
 				END RoundE;
 				
 				PROCEDURE RoundD*( VAR x, y: SET );
-				VAR t: LONGINT;
+				VAR i: D.Ind4;
 				BEGIN
-					t := S.VAL( LONGINT, skd[ski] / x );  INC( ski );
-					y := y / 
-						DES.sb8[t MOD 40H] / 
-						DES.sb6[t DIV 100H MOD 40H] /
-						DES.sb4[t DIV 10000H MOD 40H] / 
-						DES.sb2[t DIV 1000000H MOD 40H];
-					t := S.VAL( LONGINT, skd[ski] / ROT( x, -4 ) );  INC(ski );
-					y := y / 
-						DES.sb7[t MOD 40H] / 
-						DES.sb5[t DIV 100H MOD 40H] /
-						DES.sb3[t DIV 10000H MOD 40H] / 
-						DES.sb1[t DIV 1000000H MOD 40H]
+					D.Split( skd[ski] / x, i );  INC( ski );
+					y := y / D.sb8[i.a] / D.sb6[i.b] / D.sb4[i.c] / D.sb2[i.d];
+					D.Split( skd[ski] / ROT( x, -4 ), i );  INC( ski );
+					y := y / D.sb7[i.a] / D.sb5[i.b] / D.sb3[i.c] / D.sb1[i.d]
 				END RoundD;
 
 				PROCEDURE & Init*;