Skip to content

Commit c8db4fb

Browse files
committed
CT AES first steps
1 parent e1a4566 commit c8db4fb

File tree

2 files changed

+375
-0
lines changed

2 files changed

+375
-0
lines changed

Classes/FCryptoAES.uc

Lines changed: 366 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,366 @@
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+
}

Classes/FCryptoAESMacros.uci

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
`define SWAPN(cl, ch, s, x, y) \
2+
a = (`x); \
3+
b = (`y); \
4+
(`x) = (a & `cl) | ((b & `cl) << (`s)); \
5+
(`y) = ((a & `ch) >> (`s)) | (b & `ch); \
6+
7+
`define SWAP2(x, y) `SWAPN(0x55555555, 0xAAAAAAAA, 1, `x, `y)
8+
`define SWAP4(x, y) `SWAPN(0x33333333, 0xCCCCCCCC, 2, `x, `y)
9+
`define SWAP8(x, y) `SWAPN(0x0F0F0F0F, 0xF0F0F0F0, 4, `x, `y)

0 commit comments

Comments
 (0)