|
| 1 | +/* |
| 2 | + * Copyright (c) 2024 Tuomo Kriikkula <tuokri@tuta.io> |
| 3 | + * Copyright (c) 2017 Thomas Pornin <pornin@bolet.org> |
| 4 | + * |
| 5 | + * Permission is hereby granted, free of charge, to any person obtaining |
| 6 | + * a copy of this software and associated documentation files (the |
| 7 | + * "Software"), to deal in the Software without restriction, including |
| 8 | + * without limitation the rights to use, copy, modify, merge, publish, |
| 9 | + * distribute, sublicense, and/or sell copies of the Software, and to |
| 10 | + * permit persons to whom the Software is furnished to do so, subject to |
| 11 | + * the following conditions: |
| 12 | + * |
| 13 | + * The above copyright notice and this permission notice shall be |
| 14 | + * included in all copies or substantial portions of the Software. |
| 15 | + * |
| 16 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| 17 | + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| 18 | + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| 19 | + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
| 20 | + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
| 21 | + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| 22 | + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| 23 | + * SOFTWARE. |
| 24 | + */ |
| 25 | + |
| 26 | +/** |
| 27 | + * AES implementation mirroring BearSSL's aes_ct.c |
| 28 | + */ |
| 29 | +class FCryptoAES extends Object |
| 30 | + notplaceable |
| 31 | + abstract; |
| 32 | + |
| 33 | +`include(FCrypto\Classes\FCryptoAESMacros.uci); |
| 34 | + |
| 35 | +var const array<byte> RCon; |
| 36 | + |
| 37 | +static final function AesCtBitSliceSBox(out array<int> Q) |
| 38 | +{ |
| 39 | + /* |
| 40 | + * This S-box implementation is a straightforward translation of |
| 41 | + * the circuit described by Boyar and Peralta in "A new |
| 42 | + * combinational logic minimization technique with applications |
| 43 | + * to cryptology" (https://eprint.iacr.org/2009/191.pdf). |
| 44 | + * |
| 45 | + * Note that variables x* (input) and s* (output) are numbered |
| 46 | + * in "reverse" order (x0 is the high bit, x7 is the low bit). |
| 47 | + */ |
| 48 | + |
| 49 | + local int X0; |
| 50 | + local int X1; |
| 51 | + local int X2; |
| 52 | + local int X3; |
| 53 | + local int X4; |
| 54 | + local int X5; |
| 55 | + local int X6; |
| 56 | + local int X7; |
| 57 | + local int Y1; |
| 58 | + local int Y2; |
| 59 | + local int Y3; |
| 60 | + local int Y4; |
| 61 | + local int Y5; |
| 62 | + local int Y6; |
| 63 | + local int Y7; |
| 64 | + local int Y8; |
| 65 | + local int Y9; |
| 66 | + local int Y10; |
| 67 | + local int Y11; |
| 68 | + local int Y12; |
| 69 | + local int Y13; |
| 70 | + local int Y14; |
| 71 | + local int Y15; |
| 72 | + local int Y16; |
| 73 | + local int Y17; |
| 74 | + local int Y18; |
| 75 | + local int Y19; |
| 76 | + local int Y20; |
| 77 | + local int Y21; |
| 78 | + local int Z0; |
| 79 | + local int Z1; |
| 80 | + local int Z2; |
| 81 | + local int Z3; |
| 82 | + local int Z4; |
| 83 | + local int Z5; |
| 84 | + local int Z6; |
| 85 | + local int Z7; |
| 86 | + local int Z8; |
| 87 | + local int Z9; |
| 88 | + local int Z10; |
| 89 | + local int Z11; |
| 90 | + local int Z12; |
| 91 | + local int Z13; |
| 92 | + local int Z14; |
| 93 | + local int Z15; |
| 94 | + local int Z16; |
| 95 | + local int Z17; |
| 96 | + local int T0; |
| 97 | + local int T1; |
| 98 | + local int T2; |
| 99 | + local int T3; |
| 100 | + local int T4; |
| 101 | + local int T5; |
| 102 | + local int T6; |
| 103 | + local int T7; |
| 104 | + local int T8; |
| 105 | + local int T9; |
| 106 | + local int T10; |
| 107 | + local int T11; |
| 108 | + local int T12; |
| 109 | + local int T13; |
| 110 | + local int T14; |
| 111 | + local int T15; |
| 112 | + local int T16; |
| 113 | + local int T17; |
| 114 | + local int T18; |
| 115 | + local int T19; |
| 116 | + local int T20; |
| 117 | + local int T21; |
| 118 | + local int T22; |
| 119 | + local int T23; |
| 120 | + local int T24; |
| 121 | + local int T25; |
| 122 | + local int T26; |
| 123 | + local int T27; |
| 124 | + local int T28; |
| 125 | + local int T29; |
| 126 | + local int T30; |
| 127 | + local int T31; |
| 128 | + local int T32; |
| 129 | + local int T33; |
| 130 | + local int T34; |
| 131 | + local int T35; |
| 132 | + local int T36; |
| 133 | + local int T37; |
| 134 | + local int T38; |
| 135 | + local int T39; |
| 136 | + local int T40; |
| 137 | + local int T41; |
| 138 | + local int T42; |
| 139 | + local int T43; |
| 140 | + local int T44; |
| 141 | + local int T45; |
| 142 | + local int T46; |
| 143 | + local int T47; |
| 144 | + local int T48; |
| 145 | + local int T49; |
| 146 | + local int T50; |
| 147 | + local int T51; |
| 148 | + local int T52; |
| 149 | + local int T53; |
| 150 | + local int T54; |
| 151 | + local int T55; |
| 152 | + local int T56; |
| 153 | + local int T57; |
| 154 | + local int T58; |
| 155 | + local int T59; |
| 156 | + local int T60; |
| 157 | + local int T61; |
| 158 | + local int T62; |
| 159 | + local int T63; |
| 160 | + local int T64; |
| 161 | + local int T65; |
| 162 | + local int T66; |
| 163 | + local int T67; |
| 164 | + local int S0; |
| 165 | + local int S1; |
| 166 | + local int S2; |
| 167 | + local int S3; |
| 168 | + local int S4; |
| 169 | + local int S5; |
| 170 | + local int S6; |
| 171 | + local int S7; |
| 172 | + |
| 173 | + X0 = Q[7]; |
| 174 | + X1 = Q[6]; |
| 175 | + X2 = Q[5]; |
| 176 | + X3 = Q[4]; |
| 177 | + X4 = Q[3]; |
| 178 | + X5 = Q[2]; |
| 179 | + X6 = Q[1]; |
| 180 | + X7 = Q[0]; |
| 181 | + |
| 182 | + /* |
| 183 | + * Top linear transformation. |
| 184 | + */ |
| 185 | + Y14 = X3 ^ X5; |
| 186 | + Y13 = X0 ^ X6; |
| 187 | + Y9 = X0 ^ X3; |
| 188 | + Y8 = X0 ^ X5; |
| 189 | + T0 = X1 ^ X2; |
| 190 | + Y1 = T0 ^ X7; |
| 191 | + Y4 = Y1 ^ X3; |
| 192 | + Y12 = Y13 ^ Y14; |
| 193 | + Y2 = Y1 ^ X0; |
| 194 | + Y5 = Y1 ^ X6; |
| 195 | + Y3 = Y5 ^ Y8; |
| 196 | + T1 = X4 ^ Y12; |
| 197 | + Y15 = T1 ^ X5; |
| 198 | + Y20 = T1 ^ X1; |
| 199 | + Y6 = Y15 ^ X7; |
| 200 | + Y10 = Y15 ^ T0; |
| 201 | + Y11 = Y20 ^ Y9; |
| 202 | + Y7 = X7 ^ Y11; |
| 203 | + Y17 = Y10 ^ Y11; |
| 204 | + Y19 = Y10 ^ Y8; |
| 205 | + Y16 = T0 ^ Y11; |
| 206 | + Y21 = Y13 ^ Y16; |
| 207 | + Y18 = X0 ^ Y16; |
| 208 | + |
| 209 | + /* |
| 210 | + * Non-linear section. |
| 211 | + */ |
| 212 | + T2 = Y12 & Y15; |
| 213 | + T3 = Y3 & Y6; |
| 214 | + T4 = T3 ^ T2; |
| 215 | + T5 = Y4 & X7; |
| 216 | + T6 = T5 ^ T2; |
| 217 | + T7 = Y13 & Y16; |
| 218 | + T8 = Y5 & Y1; |
| 219 | + T9 = T8 ^ T7; |
| 220 | + T10 = Y2 & Y7; |
| 221 | + T11 = T10 ^ T7; |
| 222 | + T12 = Y9 & Y11; |
| 223 | + T13 = Y14 & Y17; |
| 224 | + T14 = T13 ^ T12; |
| 225 | + T15 = Y8 & Y10; |
| 226 | + T16 = T15 ^ T12; |
| 227 | + T17 = T4 ^ T14; |
| 228 | + T18 = T6 ^ T16; |
| 229 | + T19 = T9 ^ T14; |
| 230 | + T20 = T11 ^ T16; |
| 231 | + T21 = T17 ^ Y20; |
| 232 | + T22 = T18 ^ Y19; |
| 233 | + T23 = T19 ^ Y21; |
| 234 | + T24 = T20 ^ Y18; |
| 235 | + |
| 236 | + T25 = T21 ^ T22; |
| 237 | + T26 = T21 & T23; |
| 238 | + T27 = T24 ^ T26; |
| 239 | + T28 = T25 & T27; |
| 240 | + T29 = T28 ^ T22; |
| 241 | + T30 = T23 ^ T24; |
| 242 | + T31 = T22 ^ T26; |
| 243 | + T32 = T31 & T30; |
| 244 | + T33 = T32 ^ T24; |
| 245 | + T34 = T23 ^ T33; |
| 246 | + T35 = T27 ^ T33; |
| 247 | + T36 = T24 & T35; |
| 248 | + T37 = T36 ^ T34; |
| 249 | + T38 = T27 ^ T36; |
| 250 | + T39 = T29 & T38; |
| 251 | + T40 = T25 ^ T39; |
| 252 | + |
| 253 | + T41 = T40 ^ T37; |
| 254 | + T42 = T29 ^ T33; |
| 255 | + T43 = T29 ^ T40; |
| 256 | + T44 = T33 ^ T37; |
| 257 | + T45 = T42 ^ T41; |
| 258 | + Z0 = T44 & Y15; |
| 259 | + Z1 = T37 & Y6; |
| 260 | + Z2 = T33 & X7; |
| 261 | + Z3 = T43 & Y16; |
| 262 | + Z4 = T40 & Y1; |
| 263 | + Z5 = T29 & Y7; |
| 264 | + Z6 = T42 & Y11; |
| 265 | + Z7 = T45 & Y17; |
| 266 | + Z8 = T41 & Y10; |
| 267 | + Z9 = T44 & Y12; |
| 268 | + Z10 = T37 & Y3; |
| 269 | + Z11 = T33 & Y4; |
| 270 | + Z12 = T43 & Y13; |
| 271 | + Z13 = T40 & Y5; |
| 272 | + Z14 = T29 & Y2; |
| 273 | + Z15 = T42 & Y9; |
| 274 | + Z16 = T45 & Y14; |
| 275 | + Z17 = T41 & Y8; |
| 276 | + |
| 277 | + /* |
| 278 | + * Bottom linear transformation. |
| 279 | + */ |
| 280 | + T46 = Z15 ^ Z16; |
| 281 | + T47 = Z10 ^ Z11; |
| 282 | + T48 = Z5 ^ Z13; |
| 283 | + T49 = Z9 ^ Z10; |
| 284 | + T50 = Z2 ^ Z12; |
| 285 | + T51 = Z2 ^ Z5; |
| 286 | + T52 = Z7 ^ Z8; |
| 287 | + T53 = Z0 ^ Z3; |
| 288 | + T54 = Z6 ^ Z7; |
| 289 | + T55 = Z16 ^ Z17; |
| 290 | + T56 = Z12 ^ T48; |
| 291 | + T57 = T50 ^ T53; |
| 292 | + T58 = Z4 ^ T46; |
| 293 | + T59 = Z3 ^ T54; |
| 294 | + T60 = T46 ^ T57; |
| 295 | + T61 = Z14 ^ T57; |
| 296 | + T62 = T52 ^ T58; |
| 297 | + T63 = T49 ^ T58; |
| 298 | + T64 = Z4 ^ T59; |
| 299 | + T65 = T61 ^ T62; |
| 300 | + T66 = Z1 ^ T63; |
| 301 | + S0 = T59 ^ T63; |
| 302 | + S6 = T56 ^ ~T62; |
| 303 | + S7 = T48 ^ ~T60; |
| 304 | + T67 = T64 ^ T65; |
| 305 | + S3 = T53 ^ T66; |
| 306 | + S4 = T51 ^ T66; |
| 307 | + S5 = T47 ^ T65; |
| 308 | + S1 = T64 ^ ~S3; |
| 309 | + S2 = T55 ^ ~T67; |
| 310 | + |
| 311 | + Q[7] = S0; |
| 312 | + Q[6] = S1; |
| 313 | + Q[5] = S2; |
| 314 | + Q[4] = S3; |
| 315 | + Q[3] = S4; |
| 316 | + Q[2] = S5; |
| 317 | + Q[1] = S6; |
| 318 | + Q[0] = S7; |
| 319 | +} |
| 320 | + |
| 321 | +static final function AesCtOrtho(out array<int> Q) |
| 322 | +{ |
| 323 | + local int A; |
| 324 | + local int B; |
| 325 | + |
| 326 | + `SWAP2(Q[0], Q[1]); |
| 327 | + `SWAP2(Q[2], Q[3]); |
| 328 | + `SWAP2(Q[4], Q[5]); |
| 329 | + `SWAP2(Q[6], Q[7]); |
| 330 | + |
| 331 | + `SWAP4(Q[0], Q[2]); |
| 332 | + `SWAP4(Q[1], Q[3]); |
| 333 | + `SWAP4(Q[4], Q[6]); |
| 334 | + `SWAP4(Q[5], Q[7]); |
| 335 | + |
| 336 | + `SWAP8(Q[0], Q[4]); |
| 337 | + `SWAP8(Q[1], Q[5]); |
| 338 | + `SWAP8(Q[2], Q[6]); |
| 339 | + `SWAP8(Q[3], Q[7]); |
| 340 | +} |
| 341 | + |
| 342 | +static final function int SubWord(int X) |
| 343 | +{ |
| 344 | +} |
| 345 | + |
| 346 | +static final function int AesCtKeySched( |
| 347 | + out array<int> CompSKey, |
| 348 | + const out array<byte> Key, |
| 349 | + int KeyLen |
| 350 | +) |
| 351 | +{ |
| 352 | +} |
| 353 | + |
| 354 | +static final function AesCtSKeyExpand( |
| 355 | + out array<int> SKey, |
| 356 | + int NumRounds, |
| 357 | + const out array<int> CompSKey |
| 358 | +) |
| 359 | +{ |
| 360 | +} |
| 361 | + |
| 362 | +DefaultProperties |
| 363 | +{ |
| 364 | + // 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 |
| 365 | + RCon=(1, 2, 4, 8, 16, 32, 64, 128, 27, 54) |
| 366 | +} |
0 commit comments