| // See file LICENSE for more information. |
| |
| library impl.block_cipher.aes; |
| |
| import 'dart:core'; |
| import 'dart:typed_data'; |
| |
| import 'package:pointycastle/api.dart'; |
| import 'package:pointycastle/src/impl/base_block_cipher.dart'; |
| import 'package:pointycastle/src/registry/registry.dart'; |
| import 'package:pointycastle/src/ufixnum.dart'; |
| |
| class AESEngine extends BaseBlockCipher { |
| static final FactoryConfig factoryConfig = |
| StaticFactoryConfig(BlockCipher, 'AES', () => AESEngine()); |
| |
| int _ROUNDS = 0; |
| late List<List<int>> _WorkingKey; |
| bool _forEncryption = false; |
| |
| List<int> _s = List.empty(); |
| |
| static const _S = [ |
| 99, |
| 124, |
| 119, |
| 123, |
| 242, |
| 107, |
| 111, |
| 197, |
| 48, |
| 1, |
| 103, |
| 43, |
| 254, |
| 215, |
| 171, |
| 118, |
| 202, |
| 130, |
| 201, |
| 125, |
| 250, |
| 89, |
| 71, |
| 240, |
| 173, |
| 212, |
| 162, |
| 175, |
| 156, |
| 164, |
| 114, |
| 192, |
| 183, |
| 253, |
| 147, |
| 38, |
| 54, |
| 63, |
| 247, |
| 204, |
| 52, |
| 165, |
| 229, |
| 241, |
| 113, |
| 216, |
| 49, |
| 21, |
| 4, |
| 199, |
| 35, |
| 195, |
| 24, |
| 150, |
| 5, |
| 154, |
| 7, |
| 18, |
| 128, |
| 226, |
| 235, |
| 39, |
| 178, |
| 117, |
| 9, |
| 131, |
| 44, |
| 26, |
| 27, |
| 110, |
| 90, |
| 160, |
| 82, |
| 59, |
| 214, |
| 179, |
| 41, |
| 227, |
| 47, |
| 132, |
| 83, |
| 209, |
| 0, |
| 237, |
| 32, |
| 252, |
| 177, |
| 91, |
| 106, |
| 203, |
| 190, |
| 57, |
| 74, |
| 76, |
| 88, |
| 207, |
| 208, |
| 239, |
| 170, |
| 251, |
| 67, |
| 77, |
| 51, |
| 133, |
| 69, |
| 249, |
| 2, |
| 127, |
| 80, |
| 60, |
| 159, |
| 168, |
| 81, |
| 163, |
| 64, |
| 143, |
| 146, |
| 157, |
| 56, |
| 245, |
| 188, |
| 182, |
| 218, |
| 33, |
| 16, |
| 255, |
| 243, |
| 210, |
| 205, |
| 12, |
| 19, |
| 236, |
| 95, |
| 151, |
| 68, |
| 23, |
| 196, |
| 167, |
| 126, |
| 61, |
| 100, |
| 93, |
| 25, |
| 115, |
| 96, |
| 129, |
| 79, |
| 220, |
| 34, |
| 42, |
| 144, |
| 136, |
| 70, |
| 238, |
| 184, |
| 20, |
| 222, |
| 94, |
| 11, |
| 219, |
| 224, |
| 50, |
| 58, |
| 10, |
| 73, |
| 6, |
| 36, |
| 92, |
| 194, |
| 211, |
| 172, |
| 98, |
| 145, |
| 149, |
| 228, |
| 121, |
| 231, |
| 200, |
| 55, |
| 109, |
| 141, |
| 213, |
| 78, |
| 169, |
| 108, |
| 86, |
| 244, |
| 234, |
| 101, |
| 122, |
| 174, |
| 8, |
| 186, |
| 120, |
| 37, |
| 46, |
| 28, |
| 166, |
| 180, |
| 198, |
| 232, |
| 221, |
| 116, |
| 31, |
| 75, |
| 189, |
| 139, |
| 138, |
| 112, |
| 62, |
| 181, |
| 102, |
| 72, |
| 3, |
| 246, |
| 14, |
| 97, |
| 53, |
| 87, |
| 185, |
| 134, |
| 193, |
| 29, |
| 158, |
| 225, |
| 248, |
| 152, |
| 17, |
| 105, |
| 217, |
| 142, |
| 148, |
| 155, |
| 30, |
| 135, |
| 233, |
| 206, |
| 85, |
| 40, |
| 223, |
| 140, |
| 161, |
| 137, |
| 13, |
| 191, |
| 230, |
| 66, |
| 104, |
| 65, |
| 153, |
| 45, |
| 15, |
| 176, |
| 84, |
| 187, |
| 22, |
| ]; |
| |
| static const _Si = [ |
| 82, |
| 9, |
| 106, |
| 213, |
| 48, |
| 54, |
| 165, |
| 56, |
| 191, |
| 64, |
| 163, |
| 158, |
| 129, |
| 243, |
| 215, |
| 251, |
| 124, |
| 227, |
| 57, |
| 130, |
| 155, |
| 47, |
| 255, |
| 135, |
| 52, |
| 142, |
| 67, |
| 68, |
| 196, |
| 222, |
| 233, |
| 203, |
| 84, |
| 123, |
| 148, |
| 50, |
| 166, |
| 194, |
| 35, |
| 61, |
| 238, |
| 76, |
| 149, |
| 11, |
| 66, |
| 250, |
| 195, |
| 78, |
| 8, |
| 46, |
| 161, |
| 102, |
| 40, |
| 217, |
| 36, |
| 178, |
| 118, |
| 91, |
| 162, |
| 73, |
| 109, |
| 139, |
| 209, |
| 37, |
| 114, |
| 248, |
| 246, |
| 100, |
| 134, |
| 104, |
| 152, |
| 22, |
| 212, |
| 164, |
| 92, |
| 204, |
| 93, |
| 101, |
| 182, |
| 146, |
| 108, |
| 112, |
| 72, |
| 80, |
| 253, |
| 237, |
| 185, |
| 218, |
| 94, |
| 21, |
| 70, |
| 87, |
| 167, |
| 141, |
| 157, |
| 132, |
| 144, |
| 216, |
| 171, |
| 0, |
| 140, |
| 188, |
| 211, |
| 10, |
| 247, |
| 228, |
| 88, |
| 5, |
| 184, |
| 179, |
| 69, |
| 6, |
| 208, |
| 44, |
| 30, |
| 143, |
| 202, |
| 63, |
| 15, |
| 2, |
| 193, |
| 175, |
| 189, |
| 3, |
| 1, |
| 19, |
| 138, |
| 107, |
| 58, |
| 145, |
| 17, |
| 65, |
| 79, |
| 103, |
| 220, |
| 234, |
| 151, |
| 242, |
| 207, |
| 206, |
| 240, |
| 180, |
| 230, |
| 115, |
| 150, |
| 172, |
| 116, |
| 34, |
| 231, |
| 173, |
| 53, |
| 133, |
| 226, |
| 249, |
| 55, |
| 232, |
| 28, |
| 117, |
| 223, |
| 110, |
| 71, |
| 241, |
| 26, |
| 113, |
| 29, |
| 41, |
| 197, |
| 137, |
| 111, |
| 183, |
| 98, |
| 14, |
| 170, |
| 24, |
| 190, |
| 27, |
| 252, |
| 86, |
| 62, |
| 75, |
| 198, |
| 210, |
| 121, |
| 32, |
| 154, |
| 219, |
| 192, |
| 254, |
| 120, |
| 205, |
| 90, |
| 244, |
| 31, |
| 221, |
| 168, |
| 51, |
| 136, |
| 7, |
| 199, |
| 49, |
| 177, |
| 18, |
| 16, |
| 89, |
| 39, |
| 128, |
| 236, |
| 95, |
| 96, |
| 81, |
| 127, |
| 169, |
| 25, |
| 181, |
| 74, |
| 13, |
| 45, |
| 229, |
| 122, |
| 159, |
| 147, |
| 201, |
| 156, |
| 239, |
| 160, |
| 224, |
| 59, |
| 77, |
| 174, |
| 42, |
| 245, |
| 176, |
| 200, |
| 235, |
| 187, |
| 60, |
| 131, |
| 83, |
| 153, |
| 97, |
| 23, |
| 43, |
| 4, |
| 126, |
| 186, |
| 119, |
| 214, |
| 38, |
| 225, |
| 105, |
| 20, |
| 99, |
| 85, |
| 33, |
| 12, |
| 125, |
| ]; |
| |
| static const _rcon = [ |
| 0x01, |
| 0x02, |
| 0x04, |
| 0x08, |
| 0x10, |
| 0x20, |
| 0x40, |
| 0x80, |
| 0x1b, |
| 0x36, |
| 0x6c, |
| 0xd8, |
| 0xab, |
| 0x4d, |
| 0x9a, |
| 0x2f, |
| 0x5e, |
| 0xbc, |
| 0x63, |
| 0xc6, |
| 0x97, |
| 0x35, |
| 0x6a, |
| 0xd4, |
| 0xb3, |
| 0x7d, |
| 0xfa, |
| 0xef, |
| 0xc5, |
| 0x91 |
| ]; |
| |
| static const _T0 = [ |
| 0xa56363c6, |
| 0x847c7cf8, |
| 0x997777ee, |
| 0x8d7b7bf6, |
| 0x0df2f2ff, |
| 0xbd6b6bd6, |
| 0xb16f6fde, |
| 0x54c5c591, |
| 0x50303060, |
| 0x03010102, |
| 0xa96767ce, |
| 0x7d2b2b56, |
| 0x19fefee7, |
| 0x62d7d7b5, |
| 0xe6abab4d, |
| 0x9a7676ec, |
| 0x45caca8f, |
| 0x9d82821f, |
| 0x40c9c989, |
| 0x877d7dfa, |
| 0x15fafaef, |
| 0xeb5959b2, |
| 0xc947478e, |
| 0x0bf0f0fb, |
| 0xecadad41, |
| 0x67d4d4b3, |
| 0xfda2a25f, |
| 0xeaafaf45, |
| 0xbf9c9c23, |
| 0xf7a4a453, |
| 0x967272e4, |
| 0x5bc0c09b, |
| 0xc2b7b775, |
| 0x1cfdfde1, |
| 0xae93933d, |
| 0x6a26264c, |
| 0x5a36366c, |
| 0x413f3f7e, |
| 0x02f7f7f5, |
| 0x4fcccc83, |
| 0x5c343468, |
| 0xf4a5a551, |
| 0x34e5e5d1, |
| 0x08f1f1f9, |
| 0x937171e2, |
| 0x73d8d8ab, |
| 0x53313162, |
| 0x3f15152a, |
| 0x0c040408, |
| 0x52c7c795, |
| 0x65232346, |
| 0x5ec3c39d, |
| 0x28181830, |
| 0xa1969637, |
| 0x0f05050a, |
| 0xb59a9a2f, |
| 0x0907070e, |
| 0x36121224, |
| 0x9b80801b, |
| 0x3de2e2df, |
| 0x26ebebcd, |
| 0x6927274e, |
| 0xcdb2b27f, |
| 0x9f7575ea, |
| 0x1b090912, |
| 0x9e83831d, |
| 0x742c2c58, |
| 0x2e1a1a34, |
| 0x2d1b1b36, |
| 0xb26e6edc, |
| 0xee5a5ab4, |
| 0xfba0a05b, |
| 0xf65252a4, |
| 0x4d3b3b76, |
| 0x61d6d6b7, |
| 0xceb3b37d, |
| 0x7b292952, |
| 0x3ee3e3dd, |
| 0x712f2f5e, |
| 0x97848413, |
| 0xf55353a6, |
| 0x68d1d1b9, |
| 0x00000000, |
| 0x2cededc1, |
| 0x60202040, |
| 0x1ffcfce3, |
| 0xc8b1b179, |
| 0xed5b5bb6, |
| 0xbe6a6ad4, |
| 0x46cbcb8d, |
| 0xd9bebe67, |
| 0x4b393972, |
| 0xde4a4a94, |
| 0xd44c4c98, |
| 0xe85858b0, |
| 0x4acfcf85, |
| 0x6bd0d0bb, |
| 0x2aefefc5, |
| 0xe5aaaa4f, |
| 0x16fbfbed, |
| 0xc5434386, |
| 0xd74d4d9a, |
| 0x55333366, |
| 0x94858511, |
| 0xcf45458a, |
| 0x10f9f9e9, |
| 0x06020204, |
| 0x817f7ffe, |
| 0xf05050a0, |
| 0x443c3c78, |
| 0xba9f9f25, |
| 0xe3a8a84b, |
| 0xf35151a2, |
| 0xfea3a35d, |
| 0xc0404080, |
| 0x8a8f8f05, |
| 0xad92923f, |
| 0xbc9d9d21, |
| 0x48383870, |
| 0x04f5f5f1, |
| 0xdfbcbc63, |
| 0xc1b6b677, |
| 0x75dadaaf, |
| 0x63212142, |
| 0x30101020, |
| 0x1affffe5, |
| 0x0ef3f3fd, |
| 0x6dd2d2bf, |
| 0x4ccdcd81, |
| 0x140c0c18, |
| 0x35131326, |
| 0x2fececc3, |
| 0xe15f5fbe, |
| 0xa2979735, |
| 0xcc444488, |
| 0x3917172e, |
| 0x57c4c493, |
| 0xf2a7a755, |
| 0x827e7efc, |
| 0x473d3d7a, |
| 0xac6464c8, |
| 0xe75d5dba, |
| 0x2b191932, |
| 0x957373e6, |
| 0xa06060c0, |
| 0x98818119, |
| 0xd14f4f9e, |
| 0x7fdcdca3, |
| 0x66222244, |
| 0x7e2a2a54, |
| 0xab90903b, |
| 0x8388880b, |
| 0xca46468c, |
| 0x29eeeec7, |
| 0xd3b8b86b, |
| 0x3c141428, |
| 0x79dedea7, |
| 0xe25e5ebc, |
| 0x1d0b0b16, |
| 0x76dbdbad, |
| 0x3be0e0db, |
| 0x56323264, |
| 0x4e3a3a74, |
| 0x1e0a0a14, |
| 0xdb494992, |
| 0x0a06060c, |
| 0x6c242448, |
| 0xe45c5cb8, |
| 0x5dc2c29f, |
| 0x6ed3d3bd, |
| 0xefacac43, |
| 0xa66262c4, |
| 0xa8919139, |
| 0xa4959531, |
| 0x37e4e4d3, |
| 0x8b7979f2, |
| 0x32e7e7d5, |
| 0x43c8c88b, |
| 0x5937376e, |
| 0xb76d6dda, |
| 0x8c8d8d01, |
| 0x64d5d5b1, |
| 0xd24e4e9c, |
| 0xe0a9a949, |
| 0xb46c6cd8, |
| 0xfa5656ac, |
| 0x07f4f4f3, |
| 0x25eaeacf, |
| 0xaf6565ca, |
| 0x8e7a7af4, |
| 0xe9aeae47, |
| 0x18080810, |
| 0xd5baba6f, |
| 0x887878f0, |
| 0x6f25254a, |
| 0x722e2e5c, |
| 0x241c1c38, |
| 0xf1a6a657, |
| 0xc7b4b473, |
| 0x51c6c697, |
| 0x23e8e8cb, |
| 0x7cdddda1, |
| 0x9c7474e8, |
| 0x211f1f3e, |
| 0xdd4b4b96, |
| 0xdcbdbd61, |
| 0x868b8b0d, |
| 0x858a8a0f, |
| 0x907070e0, |
| 0x423e3e7c, |
| 0xc4b5b571, |
| 0xaa6666cc, |
| 0xd8484890, |
| 0x05030306, |
| 0x01f6f6f7, |
| 0x120e0e1c, |
| 0xa36161c2, |
| 0x5f35356a, |
| 0xf95757ae, |
| 0xd0b9b969, |
| 0x91868617, |
| 0x58c1c199, |
| 0x271d1d3a, |
| 0xb99e9e27, |
| 0x38e1e1d9, |
| 0x13f8f8eb, |
| 0xb398982b, |
| 0x33111122, |
| 0xbb6969d2, |
| 0x70d9d9a9, |
| 0x898e8e07, |
| 0xa7949433, |
| 0xb69b9b2d, |
| 0x221e1e3c, |
| 0x92878715, |
| 0x20e9e9c9, |
| 0x49cece87, |
| 0xff5555aa, |
| 0x78282850, |
| 0x7adfdfa5, |
| 0x8f8c8c03, |
| 0xf8a1a159, |
| 0x80898909, |
| 0x170d0d1a, |
| 0xdabfbf65, |
| 0x31e6e6d7, |
| 0xc6424284, |
| 0xb86868d0, |
| 0xc3414182, |
| 0xb0999929, |
| 0x772d2d5a, |
| 0x110f0f1e, |
| 0xcbb0b07b, |
| 0xfc5454a8, |
| 0xd6bbbb6d, |
| 0x3a16162c |
| ]; |
| |
| static const _Tinv0 = [ |
| 0x50a7f451, |
| 0x5365417e, |
| 0xc3a4171a, |
| 0x965e273a, |
| 0xcb6bab3b, |
| 0xf1459d1f, |
| 0xab58faac, |
| 0x9303e34b, |
| 0x55fa3020, |
| 0xf66d76ad, |
| 0x9176cc88, |
| 0x254c02f5, |
| 0xfcd7e54f, |
| 0xd7cb2ac5, |
| 0x80443526, |
| 0x8fa362b5, |
| 0x495ab1de, |
| 0x671bba25, |
| 0x980eea45, |
| 0xe1c0fe5d, |
| 0x02752fc3, |
| 0x12f04c81, |
| 0xa397468d, |
| 0xc6f9d36b, |
| 0xe75f8f03, |
| 0x959c9215, |
| 0xeb7a6dbf, |
| 0xda595295, |
| 0x2d83bed4, |
| 0xd3217458, |
| 0x2969e049, |
| 0x44c8c98e, |
| 0x6a89c275, |
| 0x78798ef4, |
| 0x6b3e5899, |
| 0xdd71b927, |
| 0xb64fe1be, |
| 0x17ad88f0, |
| 0x66ac20c9, |
| 0xb43ace7d, |
| 0x184adf63, |
| 0x82311ae5, |
| 0x60335197, |
| 0x457f5362, |
| 0xe07764b1, |
| 0x84ae6bbb, |
| 0x1ca081fe, |
| 0x942b08f9, |
| 0x58684870, |
| 0x19fd458f, |
| 0x876cde94, |
| 0xb7f87b52, |
| 0x23d373ab, |
| 0xe2024b72, |
| 0x578f1fe3, |
| 0x2aab5566, |
| 0x0728ebb2, |
| 0x03c2b52f, |
| 0x9a7bc586, |
| 0xa50837d3, |
| 0xf2872830, |
| 0xb2a5bf23, |
| 0xba6a0302, |
| 0x5c8216ed, |
| 0x2b1ccf8a, |
| 0x92b479a7, |
| 0xf0f207f3, |
| 0xa1e2694e, |
| 0xcdf4da65, |
| 0xd5be0506, |
| 0x1f6234d1, |
| 0x8afea6c4, |
| 0x9d532e34, |
| 0xa055f3a2, |
| 0x32e18a05, |
| 0x75ebf6a4, |
| 0x39ec830b, |
| 0xaaef6040, |
| 0x069f715e, |
| 0x51106ebd, |
| 0xf98a213e, |
| 0x3d06dd96, |
| 0xae053edd, |
| 0x46bde64d, |
| 0xb58d5491, |
| 0x055dc471, |
| 0x6fd40604, |
| 0xff155060, |
| 0x24fb9819, |
| 0x97e9bdd6, |
| 0xcc434089, |
| 0x779ed967, |
| 0xbd42e8b0, |
| 0x888b8907, |
| 0x385b19e7, |
| 0xdbeec879, |
| 0x470a7ca1, |
| 0xe90f427c, |
| 0xc91e84f8, |
| 0x00000000, |
| 0x83868009, |
| 0x48ed2b32, |
| 0xac70111e, |
| 0x4e725a6c, |
| 0xfbff0efd, |
| 0x5638850f, |
| 0x1ed5ae3d, |
| 0x27392d36, |
| 0x64d90f0a, |
| 0x21a65c68, |
| 0xd1545b9b, |
| 0x3a2e3624, |
| 0xb1670a0c, |
| 0x0fe75793, |
| 0xd296eeb4, |
| 0x9e919b1b, |
| 0x4fc5c080, |
| 0xa220dc61, |
| 0x694b775a, |
| 0x161a121c, |
| 0x0aba93e2, |
| 0xe52aa0c0, |
| 0x43e0223c, |
| 0x1d171b12, |
| 0x0b0d090e, |
| 0xadc78bf2, |
| 0xb9a8b62d, |
| 0xc8a91e14, |
| 0x8519f157, |
| 0x4c0775af, |
| 0xbbdd99ee, |
| 0xfd607fa3, |
| 0x9f2601f7, |
| 0xbcf5725c, |
| 0xc53b6644, |
| 0x347efb5b, |
| 0x7629438b, |
| 0xdcc623cb, |
| 0x68fcedb6, |
| 0x63f1e4b8, |
| 0xcadc31d7, |
| 0x10856342, |
| 0x40229713, |
| 0x2011c684, |
| 0x7d244a85, |
| 0xf83dbbd2, |
| 0x1132f9ae, |
| 0x6da129c7, |
| 0x4b2f9e1d, |
| 0xf330b2dc, |
| 0xec52860d, |
| 0xd0e3c177, |
| 0x6c16b32b, |
| 0x99b970a9, |
| 0xfa489411, |
| 0x2264e947, |
| 0xc48cfca8, |
| 0x1a3ff0a0, |
| 0xd82c7d56, |
| 0xef903322, |
| 0xc74e4987, |
| 0xc1d138d9, |
| 0xfea2ca8c, |
| 0x360bd498, |
| 0xcf81f5a6, |
| 0x28de7aa5, |
| 0x268eb7da, |
| 0xa4bfad3f, |
| 0xe49d3a2c, |
| 0x0d927850, |
| 0x9bcc5f6a, |
| 0x62467e54, |
| 0xc2138df6, |
| 0xe8b8d890, |
| 0x5ef7392e, |
| 0xf5afc382, |
| 0xbe805d9f, |
| 0x7c93d069, |
| 0xa92dd56f, |
| 0xb31225cf, |
| 0x3b99acc8, |
| 0xa77d1810, |
| 0x6e639ce8, |
| 0x7bbb3bdb, |
| 0x097826cd, |
| 0xf418596e, |
| 0x01b79aec, |
| 0xa89a4f83, |
| 0x656e95e6, |
| 0x7ee6ffaa, |
| 0x08cfbc21, |
| 0xe6e815ef, |
| 0xd99be7ba, |
| 0xce366f4a, |
| 0xd4099fea, |
| 0xd67cb029, |
| 0xafb2a431, |
| 0x31233f2a, |
| 0x3094a5c6, |
| 0xc066a235, |
| 0x37bc4e74, |
| 0xa6ca82fc, |
| 0xb0d090e0, |
| 0x15d8a733, |
| 0x4a9804f1, |
| 0xf7daec41, |
| 0x0e50cd7f, |
| 0x2ff69117, |
| 0x8dd64d76, |
| 0x4db0ef43, |
| 0x544daacc, |
| 0xdf0496e4, |
| 0xe3b5d19e, |
| 0x1b886a4c, |
| 0xb81f2cc1, |
| 0x7f516546, |
| 0x04ea5e9d, |
| 0x5d358c01, |
| 0x737487fa, |
| 0x2e410bfb, |
| 0x5a1d67b3, |
| 0x52d2db92, |
| 0x335610e9, |
| 0x1347d66d, |
| 0x8c61d79a, |
| 0x7a0ca137, |
| 0x8e14f859, |
| 0x893c13eb, |
| 0xee27a9ce, |
| 0x35c961b7, |
| 0xede51ce1, |
| 0x3cb1477a, |
| 0x59dfd29c, |
| 0x3f73f255, |
| 0x79ce1418, |
| 0xbf37c773, |
| 0xeacdf753, |
| 0x5baafd5f, |
| 0x146f3ddf, |
| 0x86db4478, |
| 0x81f3afca, |
| 0x3ec468b9, |
| 0x2c342438, |
| 0x5f40a3c2, |
| 0x72c31d16, |
| 0x0c25e2bc, |
| 0x8b493c28, |
| 0x41950dff, |
| 0x7101a839, |
| 0xdeb30c08, |
| 0x9ce4b4d8, |
| 0x90c15664, |
| 0x6184cb7b, |
| 0x70b632d5, |
| 0x745c6c48, |
| 0x4257b8d0 |
| ]; |
| |
| int _shift(int r, int shift) => rotr32(r, shift); |
| |
| static const int _m1 = 0x80808080; |
| static const int _m2 = 0x7f7f7f7f; |
| static const int _m3 = 0x0000001b; |
| static const int _m4 = 0xC0C0C0C0; |
| static const int _m5 = 0x3f3f3f3f; |
| |
| int _fFmulX(int x) { |
| var lsr = shiftr32(x & _m1, 7); |
| return ((x & _m2) << 1) ^ lsr * _m3; |
| } |
| |
| int _fFmulX2(int x) { |
| var t0 = shiftl32(x & _m5, 2); // int t0 = (x & m5) << 2; |
| var t1 = x & _m4; |
| t1 ^= shiftr32(t1, 1); |
| return t0 ^ shiftr32(t1, 2) ^ shiftr32(t1, 5); |
| } |
| |
| /// |
| /// The following defines provide alternative definitions of FFmulX that might |
| /// give improved performance if a fast 32-bit multiply is not available. |
| /// private int FFmulX(int x) { int u = x & m1; u |= (u >> 1); return ((x & m2) << 1) ^ ((u >>> 3) | (u >>> 6)); } |
| /// private static final int m4 = 0x1b1b1b1b; |
| /// private int FFmulX(int x) { int u = x & m1; return ((x & m2) << 1) ^ ((u - (u >>> 7)) & m4); } |
| /// |
| int _invMcol(int x) { |
| int t0, t1; |
| t0 = x; |
| t1 = t0 ^ _shift(t0, 8); |
| t0 ^= _fFmulX(t1); |
| t1 ^= _fFmulX2(t0); |
| t0 ^= t1 ^ _shift(t1, 16); |
| return t0; |
| } |
| |
| int _subWord(int x) { |
| return _S[x & 255] & 255 | |
| ((_S[(x >> 8) & 255] & 255) << 8) | |
| ((_S[(x >> 16) & 255] & 255) << 16) | |
| _S[(x >> 24) & 255] << 24; |
| } |
| |
| static const _BLOCK_SIZE = 16; |
| |
| @override |
| String get algorithmName => 'AES'; |
| |
| @override |
| int get blockSize => _BLOCK_SIZE; |
| |
| @override |
| void reset() {} |
| |
| @override |
| void init(bool forEncryption, covariant KeyParameter params) { |
| _forEncryption = forEncryption; |
| |
| _WorkingKey = generateWorkingKey(forEncryption, params); |
| |
| if (_forEncryption) { |
| _s = List.from(_S); |
| } else { |
| _s = List.from(_Si); |
| } |
| } |
| |
| List<List<int>> generateWorkingKey(bool forEncryption, KeyParameter params) { |
| var key = params.key; |
| var keyLen = key.length; |
| if (keyLen < 16 || keyLen > 32 || (keyLen & 7) != 0) { |
| throw ArgumentError('Key length not 128/192/256 bits.'); |
| } |
| |
| var KC = shiftr32(keyLen, 2); |
| _ROUNDS = KC + |
| 6; // This is not always true for the generalized Rijndael that allows larger block sizes |
| |
| var W = List.generate( |
| _ROUNDS + 1, |
| (int i) => |
| List<int>.filled(4, 0, growable: false)); // 4 words in a block |
| |
| switch (KC) { |
| case 4: |
| var col0 = unpack32(key, 0, Endian.little); |
| W[0][0] = col0; |
| var col1 = unpack32(key, 4, Endian.little); |
| W[0][1] = col1; |
| var col2 = unpack32(key, 8, Endian.little); |
| W[0][2] = col2; |
| var col3 = unpack32(key, 12, Endian.little); |
| W[0][3] = col3; |
| |
| for (var i = 1; i <= 10; ++i) { |
| var colx = _subWord(_shift(col3, 8)) ^ _rcon[i - 1]; |
| col0 ^= colx; |
| W[i][0] = col0; |
| col1 ^= col0; |
| W[i][1] = col1; |
| col2 ^= col1; |
| W[i][2] = col2; |
| col3 ^= col2; |
| W[i][3] = col3; |
| } |
| break; |
| case 6: |
| var col0 = unpack32(key, 0, Endian.little); |
| W[0][0] = col0; |
| var col1 = unpack32(key, 4, Endian.little); |
| W[0][1] = col1; |
| var col2 = unpack32(key, 8, Endian.little); |
| W[0][2] = col2; |
| var col3 = unpack32(key, 12, Endian.little); |
| W[0][3] = col3; |
| |
| var col4 = unpack32(key, 16, Endian.little); |
| var col5 = unpack32(key, 20, Endian.little); |
| |
| int i = 1, rcon = 1, colx; |
| for (;;) { |
| W[i][0] = col4; |
| W[i][1] = col5; |
| colx = _subWord(_shift(col5, 8)) ^ rcon; |
| rcon <<= 1; |
| col0 ^= colx; |
| W[i][2] = col0; |
| col1 ^= col0; |
| W[i][3] = col1; |
| |
| col2 ^= col1; |
| W[i + 1][0] = col2; |
| col3 ^= col2; |
| W[i + 1][1] = col3; |
| col4 ^= col3; |
| W[i + 1][2] = col4; |
| col5 ^= col4; |
| W[i + 1][3] = col5; |
| |
| colx = _subWord(_shift(col5, 8)) ^ rcon; |
| rcon <<= 1; |
| col0 ^= colx; |
| W[i + 2][0] = col0; |
| col1 ^= col0; |
| W[i + 2][1] = col1; |
| col2 ^= col1; |
| W[i + 2][2] = col2; |
| col3 ^= col2; |
| W[i + 2][3] = col3; |
| |
| if ((i += 3) >= 13) { |
| break; |
| } |
| |
| col4 ^= col3; |
| col5 ^= col4; |
| } |
| |
| break; |
| |
| case 8: |
| { |
| var col0 = unpack32(key, 0, Endian.little); |
| W[0][0] = col0; |
| var col1 = unpack32(key, 4, Endian.little); |
| W[0][1] = col1; |
| var col2 = unpack32(key, 8, Endian.little); |
| W[0][2] = col2; |
| var col3 = unpack32(key, 12, Endian.little); |
| W[0][3] = col3; |
| |
| var col4 = unpack32(key, 16, Endian.little); |
| W[1][0] = col4; |
| var col5 = unpack32(key, 20, Endian.little); |
| W[1][1] = col5; |
| var col6 = unpack32(key, 24, Endian.little); |
| W[1][2] = col6; |
| var col7 = unpack32(key, 28, Endian.little); |
| W[1][3] = col7; |
| |
| int i = 2, rcon = 1, colx; |
| for (;;) { |
| colx = _subWord(_shift(col7, 8)) ^ rcon; |
| rcon <<= 1; |
| col0 ^= colx; |
| W[i][0] = col0; |
| col1 ^= col0; |
| W[i][1] = col1; |
| col2 ^= col1; |
| W[i][2] = col2; |
| col3 ^= col2; |
| W[i][3] = col3; |
| ++i; |
| |
| if (i >= 15) { |
| break; |
| } |
| |
| colx = _subWord(col3); |
| col4 ^= colx; |
| W[i][0] = col4; |
| col5 ^= col4; |
| W[i][1] = col5; |
| col6 ^= col5; |
| W[i][2] = col6; |
| col7 ^= col6; |
| W[i][3] = col7; |
| ++i; |
| } |
| |
| break; |
| } |
| default: |
| { |
| throw StateError('Should never get here'); |
| } |
| } |
| |
| if (!forEncryption) { |
| for (var j = 1; j < _ROUNDS; j++) { |
| for (var i = 0; i < 4; i++) { |
| W[j][i] = _invMcol(W[j][i]); |
| } |
| } |
| } |
| |
| return W; |
| } |
| |
| @override |
| int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { |
| if ((inpOff + (32 / 2)) > inp.lengthInBytes) { |
| throw ArgumentError('Input buffer too short'); |
| } |
| |
| if ((outOff + (32 / 2)) > out.lengthInBytes) { |
| throw ArgumentError('Output buffer too short'); |
| } |
| |
| if (_forEncryption) { |
| _encryptBlock(inp, inpOff, out, outOff, _WorkingKey); |
| } else { |
| _decryptBlock(inp, inpOff, out, outOff, _WorkingKey); |
| } |
| |
| return _BLOCK_SIZE; |
| } |
| |
| void _encryptBlock( |
| input, int inOff, Uint8List out, int outOff, List<List<int>> KW) { |
| var C0 = unpack32(input, inOff + 0, Endian.little); |
| var C1 = unpack32(input, inOff + 4, Endian.little); |
| var C2 = unpack32(input, inOff + 8, Endian.little); |
| var C3 = unpack32(input, inOff + 12, Endian.little); |
| |
| var t0 = C0 ^ KW[0][0]; |
| var t1 = C1 ^ KW[0][1]; |
| var t2 = C2 ^ KW[0][2]; |
| |
| int r = 1, r0, r1, r2, r3 = C3 ^ KW[0][3]; |
| |
| while (r < _ROUNDS - 1) { |
| r0 = _T0[t0 & 255] ^ |
| _shift(_T0[(t1 >> 8) & 255], 24) ^ |
| _shift(_T0[(t2 >> 16) & 255], 16) ^ |
| _shift(_T0[(r3 >> 24) & 255], 8) ^ |
| KW[r][0]; |
| r1 = _T0[t1 & 255] ^ |
| _shift(_T0[(t2 >> 8) & 255], 24) ^ |
| _shift(_T0[(r3 >> 16) & 255], 16) ^ |
| _shift(_T0[(t0 >> 24) & 255], 8) ^ |
| KW[r][1]; |
| r2 = _T0[t2 & 255] ^ |
| _shift(_T0[(r3 >> 8) & 255], 24) ^ |
| _shift(_T0[(t0 >> 16) & 255], 16) ^ |
| _shift(_T0[(t1 >> 24) & 255], 8) ^ |
| KW[r][2]; |
| r3 = _T0[r3 & 255] ^ |
| _shift(_T0[(t0 >> 8) & 255], 24) ^ |
| _shift(_T0[(t1 >> 16) & 255], 16) ^ |
| _shift(_T0[(t2 >> 24) & 255], 8) ^ |
| KW[r++][3]; |
| t0 = _T0[r0 & 255] ^ |
| _shift(_T0[(r1 >> 8) & 255], 24) ^ |
| _shift(_T0[(r2 >> 16) & 255], 16) ^ |
| _shift(_T0[(r3 >> 24) & 255], 8) ^ |
| KW[r][0]; |
| t1 = _T0[r1 & 255] ^ |
| _shift(_T0[(r2 >> 8) & 255], 24) ^ |
| _shift(_T0[(r3 >> 16) & 255], 16) ^ |
| _shift(_T0[(r0 >> 24) & 255], 8) ^ |
| KW[r][1]; |
| t2 = _T0[r2 & 255] ^ |
| _shift(_T0[(r3 >> 8) & 255], 24) ^ |
| _shift(_T0[(r0 >> 16) & 255], 16) ^ |
| _shift(_T0[(r1 >> 24) & 255], 8) ^ |
| KW[r][2]; |
| r3 = _T0[r3 & 255] ^ |
| _shift(_T0[(r0 >> 8) & 255], 24) ^ |
| _shift(_T0[(r1 >> 16) & 255], 16) ^ |
| _shift(_T0[(r2 >> 24) & 255], 8) ^ |
| KW[r++][3]; |
| } |
| |
| r0 = _T0[t0 & 255] ^ |
| _shift(_T0[(t1 >> 8) & 255], 24) ^ |
| _shift(_T0[(t2 >> 16) & 255], 16) ^ |
| _shift(_T0[(r3 >> 24) & 255], 8) ^ |
| KW[r][0]; |
| r1 = _T0[t1 & 255] ^ |
| _shift(_T0[(t2 >> 8) & 255], 24) ^ |
| _shift(_T0[(r3 >> 16) & 255], 16) ^ |
| _shift(_T0[(t0 >> 24) & 255], 8) ^ |
| KW[r][1]; |
| r2 = _T0[t2 & 255] ^ |
| _shift(_T0[(r3 >> 8) & 255], 24) ^ |
| _shift(_T0[(t0 >> 16) & 255], 16) ^ |
| _shift(_T0[(t1 >> 24) & 255], 8) ^ |
| KW[r][2]; |
| r3 = _T0[r3 & 255] ^ |
| _shift(_T0[(t0 >> 8) & 255], 24) ^ |
| _shift(_T0[(t1 >> 16) & 255], 16) ^ |
| _shift(_T0[(t2 >> 24) & 255], 8) ^ |
| KW[r++][3]; |
| |
| // the final round's table is a simple function of S so we don't use a whole other four tables for it |
| |
| C0 = (_S[r0 & 255] & 255) ^ |
| ((_S[(r1 >> 8) & 255] & 255) << 8) ^ |
| ((_s[(r2 >> 16) & 255] & 255) << 16) ^ |
| (_s[(r3 >> 24) & 255] << 24) ^ |
| KW[r][0]; |
| C1 = (_s[r1 & 255] & 255) ^ |
| ((_S[(r2 >> 8) & 255] & 255) << 8) ^ |
| ((_S[(r3 >> 16) & 255] & 255) << 16) ^ |
| (_s[(r0 >> 24) & 255] << 24) ^ |
| KW[r][1]; |
| C2 = (_s[r2 & 255] & 255) ^ |
| ((_S[(r3 >> 8) & 255] & 255) << 8) ^ |
| ((_S[(r0 >> 16) & 255] & 255) << 16) ^ |
| (_S[(r1 >> 24) & 255] << 24) ^ |
| KW[r][2]; |
| C3 = (_s[r3 & 255] & 255) ^ |
| ((_s[(r0 >> 8) & 255] & 255) << 8) ^ |
| ((_s[(r1 >> 16) & 255] & 255) << 16) ^ |
| (_S[(r2 >> 24) & 255] << 24) ^ |
| KW[r][3]; |
| |
| pack32(C0, out, outOff + 0, Endian.little); |
| pack32(C1, out, outOff + 4, Endian.little); |
| pack32(C2, out, outOff + 8, Endian.little); |
| pack32(C3, out, outOff + 12, Endian.little); |
| } |
| |
| void _decryptBlock( |
| input, int inOff, Uint8List out, int outOff, List<List<int>> KW) { |
| var C0 = unpack32(input, inOff + 0, Endian.little); |
| var C1 = unpack32(input, inOff + 4, Endian.little); |
| var C2 = unpack32(input, inOff + 8, Endian.little); |
| var C3 = unpack32(input, inOff + 12, Endian.little); |
| |
| var t0 = C0 ^ KW[_ROUNDS][0]; |
| var t1 = C1 ^ KW[_ROUNDS][1]; |
| var t2 = C2 ^ KW[_ROUNDS][2]; |
| |
| int r = _ROUNDS - 1, r0, r1, r2, r3 = C3 ^ KW[_ROUNDS][3]; |
| while (r > 1) { |
| r0 = _Tinv0[t0 & 255] ^ |
| _shift(_Tinv0[(r3 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(t2 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(t1 >> 24) & 255], 8) ^ |
| KW[r][0]; |
| r1 = _Tinv0[t1 & 255] ^ |
| _shift(_Tinv0[(t0 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(r3 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(t2 >> 24) & 255], 8) ^ |
| KW[r][1]; |
| r2 = _Tinv0[t2 & 255] ^ |
| _shift(_Tinv0[(t1 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(t0 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(r3 >> 24) & 255], 8) ^ |
| KW[r][2]; |
| r3 = _Tinv0[r3 & 255] ^ |
| _shift(_Tinv0[(t2 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(t1 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(t0 >> 24) & 255], 8) ^ |
| KW[r--][3]; |
| t0 = _Tinv0[r0 & 255] ^ |
| _shift(_Tinv0[(r3 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(r2 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(r1 >> 24) & 255], 8) ^ |
| KW[r][0]; |
| t1 = _Tinv0[r1 & 255] ^ |
| _shift(_Tinv0[(r0 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(r3 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(r2 >> 24) & 255], 8) ^ |
| KW[r][1]; |
| t2 = _Tinv0[r2 & 255] ^ |
| _shift(_Tinv0[(r1 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(r0 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(r3 >> 24) & 255], 8) ^ |
| KW[r][2]; |
| r3 = _Tinv0[r3 & 255] ^ |
| _shift(_Tinv0[(r2 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(r1 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(r0 >> 24) & 255], 8) ^ |
| KW[r--][3]; |
| } |
| |
| r0 = _Tinv0[t0 & 255] ^ |
| _shift(_Tinv0[(r3 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(t2 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(t1 >> 24) & 255], 8) ^ |
| KW[r][0]; |
| r1 = _Tinv0[t1 & 255] ^ |
| _shift(_Tinv0[(t0 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(r3 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(t2 >> 24) & 255], 8) ^ |
| KW[r][1]; |
| r2 = _Tinv0[t2 & 255] ^ |
| _shift(_Tinv0[(t1 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(t0 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(r3 >> 24) & 255], 8) ^ |
| KW[r][2]; |
| r3 = _Tinv0[r3 & 255] ^ |
| _shift(_Tinv0[(t2 >> 8) & 255], 24) ^ |
| _shift(_Tinv0[(t1 >> 16) & 255], 16) ^ |
| _shift(_Tinv0[(t0 >> 24) & 255], 8) ^ |
| KW[r][3]; |
| |
| // the final round's table is a simple function of Si so we don't use a whole other four tables for it |
| |
| C0 = (_Si[r0 & 255] & 255) ^ |
| ((_s[(r3 >> 8) & 255] & 255) << 8) ^ |
| ((_s[(r2 >> 16) & 255] & 255) << 16) ^ |
| (_Si[(r1 >> 24) & 255] << 24) ^ |
| KW[0][0]; |
| C1 = (_s[r1 & 255] & 255) ^ |
| ((_s[(r0 >> 8) & 255] & 255) << 8) ^ |
| ((_Si[(r3 >> 16) & 255] & 255) << 16) ^ |
| (_s[(r2 >> 24) & 255] << 24) ^ |
| KW[0][1]; |
| C2 = (_s[r2 & 255] & 255) ^ |
| ((_Si[(r1 >> 8) & 255] & 255) << 8) ^ |
| ((_Si[(r0 >> 16) & 255] & 255) << 16) ^ |
| (_s[(r3 >> 24) & 255] << 24) ^ |
| KW[0][2]; |
| C3 = (_Si[r3 & 255] & 255) ^ |
| ((_s[(r2 >> 8) & 255] & 255) << 8) ^ |
| ((_s[(r1 >> 16) & 255] & 255) << 16) ^ |
| (_s[(r0 >> 24) & 255] << 24) ^ |
| KW[0][3]; |
| |
| pack32(C0, out, outOff + 0, Endian.little); |
| pack32(C1, out, outOff + 4, Endian.little); |
| pack32(C2, out, outOff + 8, Endian.little); |
| pack32(C3, out, outOff + 12, Endian.little); |
| } |
| } |