155 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			V
		
	
	
| // The source code refers to the go standard library, which can be merged with AES later
 | |
| 
 | |
| // Package des implements the Data Encryption Standard (DES) and the
 | |
| // Triple Data Encryption Algorithm (TDEA) as defined
 | |
| // in U.S. Federal Information Processing Standards Publication 46-3.
 | |
| //
 | |
| // DES is cryptographically broken and should not be used for secure
 | |
| // applications.
 | |
| 
 | |
| module des
 | |
| 
 | |
| // Used to perform an initial permutation of a 64-bit input block.
 | |
| // const initial_permutation = [u8(6), 14, 22, 30, 38, 46, 54, 62, 4, 12, 20, 28, 36, 44, 52, 60,
 | |
| // 	2, 10, 18, 26, 34, 42, 50, 58, 0, 8, 16, 24, 32, 40, 48, 56, 7, 15, 23, 31, 39, 47, 55, 63,
 | |
| // 	5, 13, 21, 29, 37, 45, 53, 61, 3, 11, 19, 27, 35, 43, 51, 59, 1, 9, 17, 25, 33, 41, 49, 57]
 | |
| 
 | |
| // // Used to perform a final permutation of a 4-bit preoutput block. This is the
 | |
| // // inverse of initialPermutation
 | |
| // const final_permutation = [u8(24), 56, 16, 48, 8, 40, 0, 32, 25, 57, 17, 49, 9, 41, 1, 33, 26,
 | |
| // 	58, 18, 50, 10, 42, 2, 34, 27, 59, 19, 51, 11, 43, 3, 35, 28, 60, 20, 52, 12, 44, 4, 36, 29,
 | |
| // 	61, 21, 53, 13, 45, 5, 37, 30, 62, 22, 54, 14, 46, 6, 38, 31, 63, 23, 55, 15, 47, 7, 39]
 | |
| 
 | |
| // // Used to expand an input block of 32 bits, producing an output block of 48
 | |
| // // bits.
 | |
| // const expansion_function = [u8(0), 31, 30, 29, 28, 27, 28, 27, 26, 25, 24, 23, 24, 23, 22, 21,
 | |
| // 	20, 19, 20, 19, 18, 17, 16, 15, 16, 15, 14, 13, 12, 11, 12, 11, 10, 9, 8, 7, 8, 7, 6, 5, 4,
 | |
| // 	3, 4, 3, 2, 1, 0, 31]
 | |
| 
 | |
| // // Yields a 32-bit output from a 32-bit input
 | |
| // const permutation_function = [u8(16), 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22,
 | |
| // 	30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7]
 | |
| 
 | |
| // Used in the key schedule to select 56 bits
 | |
| // from a 64-bit input.
 | |
| const permuted_choice1 = [u8(7), 15, 23, 31, 39, 47, 55, 63, 6, 14, 22, 30, 38, 46, 54, 62, 5,
 | |
| 	13, 21, 29, 37, 45, 53, 61, 4, 12, 20, 28, 1, 9, 17, 25, 33, 41, 49, 57, 2, 10, 18, 26, 34,
 | |
| 	42, 50, 58, 3, 11, 19, 27, 35, 43, 51, 59, 36, 44, 52, 60]
 | |
| 
 | |
| // Used in the key schedule to produce each subkey by selecting 48 bits from
 | |
| // the 56-bit input
 | |
| const permuted_choice2 = [u8(42), 39, 45, 32, 55, 51, 53, 28, 41, 50, 35, 46, 33, 37, 44, 52, 30,
 | |
| 	48, 40, 49, 29, 36, 43, 54, 15, 4, 25, 19, 9, 1, 26, 16, 5, 11, 23, 8, 12, 7, 17, 0, 22, 3,
 | |
| 	10, 14, 6, 20, 27, 24]
 | |
| 
 | |
| // 8 S-boxes composed of 4 rows and 16 columns
 | |
| // Used in the DES cipher function
 | |
| // const s_boxes = [
 | |
| // 	[
 | |
| // 		[u8(14), 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],
 | |
| // 		[u8(0), 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],
 | |
| // 		[u8(4), 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],
 | |
| // 		[u8(15), 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13],
 | |
| // 	],
 | |
| // 	[
 | |
| // 		[u8(15), 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],
 | |
| // 		[u8(3), 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],
 | |
| // 		[u8(0), 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],
 | |
| // 		[u8(13), 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9],
 | |
| // 	],
 | |
| // 	[
 | |
| // 		[u8(10), 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],
 | |
| // 		[u8(13), 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],
 | |
| // 		[u8(13), 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],
 | |
| // 		[u8(1), 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12],
 | |
| // 	],
 | |
| // 	[
 | |
| // 		[u8(7), 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],
 | |
| // 		[u8(13), 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],
 | |
| // 		[u8(10), 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],
 | |
| // 		[u8(3), 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14],
 | |
| // 	],
 | |
| // 	[
 | |
| // 		[u8(2), 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],
 | |
| // 		[u8(14), 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],
 | |
| // 		[u8(4), 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],
 | |
| // 		[u8(11), 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3],
 | |
| // 	],
 | |
| // 	[
 | |
| // 		[u8(12), 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],
 | |
| // 		[u8(10), 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],
 | |
| // 		[u8(9), 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],
 | |
| // 		[u8(4), 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13],
 | |
| // 	],
 | |
| // 	[
 | |
| // 		[u8(4), 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],
 | |
| // 		[u8(13), 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],
 | |
| // 		[u8(1), 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],
 | |
| // 		[u8(6), 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12],
 | |
| // 	],
 | |
| // 	[
 | |
| // 		[u8(13), 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],
 | |
| // 		[u8(1), 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],
 | |
| // 		[u8(7), 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],
 | |
| // 		[u8(2), 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11],
 | |
| // 	],
 | |
| // ]
 | |
| 
 | |
| const feistel_box = [
 | |
| 	[u32(16843776), 0, 65536, 16843780, 16842756, 66564, 4, 65536, 1024, 16843776, 16843780, 1024,
 | |
| 		16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752, 16842752,
 | |
| 		16778244, 65540, 16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780,
 | |
| 		4, 16842752, 16843776, 16777216, 16777216, 1024, 16842756, 65536, 66560, 16777220, 1024,
 | |
| 		4, 16778244, 66564, 16843780, 65540, 16842752, 16778244, 16777220, 1028, 66564, 16843776,
 | |
| 		1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756],
 | |
| 	[u32(2148565024), 2147516416, 32768, 1081376, 1048576, 32, 2148532256, 2147516448, 2147483680,
 | |
| 		2148565024, 2148564992, 2147483648, 2147516416, 1048576, 32, 2148532256, 1081344, 1048608,
 | |
| 		2147516448, 0, 2147483648, 32768, 1081376, 2148532224, 1048608, 2147483680, 0, 1081344,
 | |
| 		32800, 2148564992, 2148532224, 32800, 0, 1081376, 2148532256, 1048576, 2147516448, 2148532224,
 | |
| 		2148564992, 32768, 2148532224, 2147516416, 32, 2148565024, 1081376, 32, 32768, 2147483648,
 | |
| 		32800, 2148564992, 1048576, 2147483680, 1048608, 2147516448, 2147483680, 1048608, 1081344,
 | |
| 		0, 2147516416, 32800, 2147483648, 2148532256, 2148565024, 1081344],
 | |
| 	[u32(520), 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736,
 | |
| 		131072, 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800,
 | |
| 		134348808, 131592, 134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728,
 | |
| 		134349312, 134217728, 131080, 520, 131072, 134349312, 134218240, 0, 512, 131080, 134349320,
 | |
| 		134218240, 134217736, 512, 0, 134348808, 134218248, 131072, 134217728, 134349320, 8, 131592,
 | |
| 		131584, 134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808, 131584],
 | |
| 	[u32(8396801), 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929,
 | |
| 		129, 0, 8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737,
 | |
| 		1, 8320, 8388736, 8192, 8396928, 8396929, 129, 8388736, 8388609, 8396800, 8396929, 129,
 | |
| 		0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801, 8321, 8321, 128, 8396929, 129, 1, 8192,
 | |
| 		8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801, 128, 8388608, 8192, 8396928],
 | |
| 	[u32(256), 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288,
 | |
| 		33554688, 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112,
 | |
| 		1074266112, 0, 1073742080, 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0,
 | |
| 		1107296256, 34078976, 33554432, 1107296256, 524544, 524288, 1107296512, 256, 33554432,
 | |
| 		1073741824, 34078720, 1107296512, 1074266368, 33554688, 1073741824, 1107820544, 34078976,
 | |
| 		1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256, 1107820800, 34078720,
 | |
| 		0, 1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112, 34078976,
 | |
| 		1073742080],
 | |
| 	[u32(536870928), 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296,
 | |
| 		4210704, 4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312,
 | |
| 		16384, 4210688, 536887312, 16, 541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688,
 | |
| 		541081600, 536870912, 536887296, 16, 541065232, 4210688, 541081616, 4194304, 16400, 536870928,
 | |
| 		4194304, 536887296, 536870912, 16400, 536870928, 541081616, 4210688, 541065216, 4210704,
 | |
| 		541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312, 0,
 | |
| 		541081600, 536870912, 4194320, 536887312],
 | |
| 	[u32(2097152), 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152,
 | |
| 		0, 67108866, 2, 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866,
 | |
| 		69206016, 69208064, 2097154, 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200,
 | |
| 		67108864, 2099200, 2097152, 67110914, 67110914, 69206018, 69206018, 2, 2097154, 67108864,
 | |
| 		67110912, 2097152, 69208064, 2050, 2099202, 69208064, 2050, 67108866, 69208066, 69206016,
 | |
| 		2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866, 67110912, 2048, 2097154],
 | |
| 	[u32(268439616), 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600,
 | |
| 		268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160,
 | |
| 		266240, 262208, 268697664, 268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304,
 | |
| 		262144, 266304, 262144, 268701696, 4096, 64, 268697664, 4096, 266304, 268439552, 64,
 | |
| 		268435520, 268697600, 268697664, 268435456, 262144, 268439616, 0, 268701760, 262208,
 | |
| 		268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208,
 | |
| 		268435456, 268701696],
 | |
| ]
 | |
| 
 | |
| // Size of left rotation per round in each half of the key schedule
 | |
| const ks_rotations = [u8(1), 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]
 |