| 1 | // The source code refers to the go standard library, which can be merged with AES later |
| 2 | |
| 3 | // Package des implements the Data Encryption Standard (DES) and the |
| 4 | // Triple Data Encryption Algorithm (TDEA) as defined |
| 5 | // in U.S. Federal Information Processing Standards Publication 46-3. |
| 6 | // |
| 7 | // DES is cryptographically broken and should not be used for secure |
| 8 | // applications. |
| 9 | |
| 10 | module des |
| 11 | |
| 12 | // Used to perform an initial permutation of a 64-bit input block. |
| 13 | // const initial_permutation = [u8(6), 14, 22, 30, 38, 46, 54, 62, 4, 12, 20, 28, 36, 44, 52, 60, |
| 14 | // 2, 10, 18, 26, 34, 42, 50, 58, 0, 8, 16, 24, 32, 40, 48, 56, 7, 15, 23, 31, 39, 47, 55, 63, |
| 15 | // 5, 13, 21, 29, 37, 45, 53, 61, 3, 11, 19, 27, 35, 43, 51, 59, 1, 9, 17, 25, 33, 41, 49, 57] |
| 16 | |
| 17 | // // Used to perform a final permutation of a 4-bit preoutput block. This is the |
| 18 | // // inverse of initialPermutation |
| 19 | // const final_permutation = [u8(24), 56, 16, 48, 8, 40, 0, 32, 25, 57, 17, 49, 9, 41, 1, 33, 26, |
| 20 | // 58, 18, 50, 10, 42, 2, 34, 27, 59, 19, 51, 11, 43, 3, 35, 28, 60, 20, 52, 12, 44, 4, 36, 29, |
| 21 | // 61, 21, 53, 13, 45, 5, 37, 30, 62, 22, 54, 14, 46, 6, 38, 31, 63, 23, 55, 15, 47, 7, 39] |
| 22 | |
| 23 | // // Used to expand an input block of 32 bits, producing an output block of 48 |
| 24 | // // bits. |
| 25 | // const expansion_function = [u8(0), 31, 30, 29, 28, 27, 28, 27, 26, 25, 24, 23, 24, 23, 22, 21, |
| 26 | // 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, |
| 27 | // 3, 4, 3, 2, 1, 0, 31] |
| 28 | |
| 29 | // // Yields a 32-bit output from a 32-bit input |
| 30 | // const permutation_function = [u8(16), 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22, |
| 31 | // 30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7] |
| 32 | |
| 33 | // Used in the key schedule to select 56 bits |
| 34 | // from a 64-bit input. |
| 35 | const permuted_choice1 = [u8(7), 15, 23, 31, 39, 47, 55, 63, 6, 14, 22, 30, 38, 46, 54, 62, 5, |
| 36 | 13, 21, 29, 37, 45, 53, 61, 4, 12, 20, 28, 1, 9, 17, 25, 33, 41, 49, 57, 2, 10, 18, 26, 34, |
| 37 | 42, 50, 58, 3, 11, 19, 27, 35, 43, 51, 59, 36, 44, 52, 60] |
| 38 | |
| 39 | // Used in the key schedule to produce each subkey by selecting 48 bits from |
| 40 | // the 56-bit input |
| 41 | const permuted_choice2 = [u8(42), 39, 45, 32, 55, 51, 53, 28, 41, 50, 35, 46, 33, 37, 44, 52, 30, |
| 42 | 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, |
| 43 | 10, 14, 6, 20, 27, 24] |
| 44 | |
| 45 | // 8 S-boxes composed of 4 rows and 16 columns |
| 46 | // Used in the DES cipher function |
| 47 | // const s_boxes = [ |
| 48 | // [ |
| 49 | // [u8(14), 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7], |
| 50 | // [u8(0), 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8], |
| 51 | // [u8(4), 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0], |
| 52 | // [u8(15), 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13], |
| 53 | // ], |
| 54 | // [ |
| 55 | // [u8(15), 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10], |
| 56 | // [u8(3), 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5], |
| 57 | // [u8(0), 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15], |
| 58 | // [u8(13), 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9], |
| 59 | // ], |
| 60 | // [ |
| 61 | // [u8(10), 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8], |
| 62 | // [u8(13), 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1], |
| 63 | // [u8(13), 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7], |
| 64 | // [u8(1), 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12], |
| 65 | // ], |
| 66 | // [ |
| 67 | // [u8(7), 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15], |
| 68 | // [u8(13), 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9], |
| 69 | // [u8(10), 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4], |
| 70 | // [u8(3), 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14], |
| 71 | // ], |
| 72 | // [ |
| 73 | // [u8(2), 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9], |
| 74 | // [u8(14), 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6], |
| 75 | // [u8(4), 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14], |
| 76 | // [u8(11), 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3], |
| 77 | // ], |
| 78 | // [ |
| 79 | // [u8(12), 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11], |
| 80 | // [u8(10), 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8], |
| 81 | // [u8(9), 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6], |
| 82 | // [u8(4), 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13], |
| 83 | // ], |
| 84 | // [ |
| 85 | // [u8(4), 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1], |
| 86 | // [u8(13), 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6], |
| 87 | // [u8(1), 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2], |
| 88 | // [u8(6), 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12], |
| 89 | // ], |
| 90 | // [ |
| 91 | // [u8(13), 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7], |
| 92 | // [u8(1), 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2], |
| 93 | // [u8(7), 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8], |
| 94 | // [u8(2), 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11], |
| 95 | // ], |
| 96 | // ] |
| 97 | |
| 98 | const feistel_box = [ |
| 99 | [u32(16843776), 0, 65536, 16843780, 16842756, 66564, 4, 65536, 1024, 16843776, 16843780, 1024, |
| 100 | 16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752, 16842752, |
| 101 | 16778244, 65540, 16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780, |
| 102 | 4, 16842752, 16843776, 16777216, 16777216, 1024, 16842756, 65536, 66560, 16777220, 1024, |
| 103 | 4, 16778244, 66564, 16843780, 65540, 16842752, 16778244, 16777220, 1028, 66564, 16843776, |
| 104 | 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756], |
| 105 | [u32(2148565024), 2147516416, 32768, 1081376, 1048576, 32, 2148532256, 2147516448, 2147483680, |
| 106 | 2148565024, 2148564992, 2147483648, 2147516416, 1048576, 32, 2148532256, 1081344, 1048608, |
| 107 | 2147516448, 0, 2147483648, 32768, 1081376, 2148532224, 1048608, 2147483680, 0, 1081344, |
| 108 | 32800, 2148564992, 2148532224, 32800, 0, 1081376, 2148532256, 1048576, 2147516448, 2148532224, |
| 109 | 2148564992, 32768, 2148532224, 2147516416, 32, 2148565024, 1081376, 32, 32768, 2147483648, |
| 110 | 32800, 2148564992, 1048576, 2147483680, 1048608, 2147516448, 2147483680, 1048608, 1081344, |
| 111 | 0, 2147516416, 32800, 2147483648, 2148532256, 2148565024, 1081344], |
| 112 | [u32(520), 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736, |
| 113 | 131072, 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800, |
| 114 | 134348808, 131592, 134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728, |
| 115 | 134349312, 134217728, 131080, 520, 131072, 134349312, 134218240, 0, 512, 131080, 134349320, |
| 116 | 134218240, 134217736, 512, 0, 134348808, 134218248, 131072, 134217728, 134349320, 8, 131592, |
| 117 | 131584, 134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808, 131584], |
| 118 | [u32(8396801), 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929, |
| 119 | 129, 0, 8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, |
| 120 | 1, 8320, 8388736, 8192, 8396928, 8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, |
| 121 | 0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801, 8321, 8321, 128, 8396929, 129, 1, 8192, |
| 122 | 8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801, 128, 8388608, 8192, 8396928], |
| 123 | [u32(256), 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288, |
| 124 | 33554688, 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112, |
| 125 | 1074266112, 0, 1073742080, 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, |
| 126 | 1107296256, 34078976, 33554432, 1107296256, 524544, 524288, 1107296512, 256, 33554432, |
| 127 | 1073741824, 34078720, 1107296512, 1074266368, 33554688, 1073741824, 1107820544, 34078976, |
| 128 | 1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256, 1107820800, 34078720, |
| 129 | 0, 1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112, 34078976, |
| 130 | 1073742080], |
| 131 | [u32(536870928), 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296, |
| 132 | 4210704, 4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, |
| 133 | 16384, 4210688, 536887312, 16, 541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, |
| 134 | 541081600, 536870912, 536887296, 16, 541065232, 4210688, 541081616, 4194304, 16400, 536870928, |
| 135 | 4194304, 536887296, 536870912, 16400, 536870928, 541081616, 4210688, 541065216, 4210704, |
| 136 | 541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312, 0, |
| 137 | 541081600, 536870912, 4194320, 536887312], |
| 138 | [u32(2097152), 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, |
| 139 | 0, 67108866, 2, 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, |
| 140 | 69206016, 69208064, 2097154, 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, |
| 141 | 67108864, 2099200, 2097152, 67110914, 67110914, 69206018, 69206018, 2, 2097154, 67108864, |
| 142 | 67110912, 2097152, 69208064, 2050, 2099202, 69208064, 2050, 67108866, 69208066, 69206016, |
| 143 | 2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866, 67110912, 2048, 2097154], |
| 144 | [u32(268439616), 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600, |
| 145 | 268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160, |
| 146 | 266240, 262208, 268697664, 268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, |
| 147 | 262144, 266304, 262144, 268701696, 4096, 64, 268697664, 4096, 266304, 268439552, 64, |
| 148 | 268435520, 268697600, 268697664, 268435456, 262144, 268439616, 0, 268701760, 262208, |
| 149 | 268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208, |
| 150 | 268435456, 268701696], |
| 151 | ] |
| 152 | |
| 153 | // Size of left rotation per round in each half of the key schedule |
| 154 | const ks_rotations = [u8(1), 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1] |
| 155 | |