OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
ChaCha.c
Go to the documentation of this file.
1
19/*
20 chacha-merged.c version 20080118
21 D. J. Bernstein
22 Public domain.
23 */
24
25#include <Library/BaseLib.h>
26#include <Library/BaseMemoryLib.h>
27#include <Library/OcCryptoLib.h>
28
29#define U32V(v) ((UINT32)(v) & 0xFFFFFFFFU)
30#define ROTATE(v, c) (LRotU32 ((v), (c)))
31#define XOR(v, w) ((v) ^ (w))
32#define PLUS(v, w) (U32V((v) + (w)))
33#define PLUSONE(v) (PLUS((v), 1))
34#define LOAD32_LE(a) (ReadUnaligned32 ((UINT32 *)(a)))
35#define STORE32_LE(a, v) (WriteUnaligned32 ((UINT32 *)(a), (v)))
36
37#define QUARTERROUND(a, b, c, d) \
38 a = PLUS(a, b); \
39 d = ROTATE(XOR(d, a), 16); \
40 c = PLUS(c, d); \
41 b = ROTATE(XOR(b, c), 12); \
42 a = PLUS(a, b); \
43 d = ROTATE(XOR(d, a), 8); \
44 c = PLUS(c, d); \
45 b = ROTATE(XOR(b, c), 7);
46
47VOID
49 OUT CHACHA_CONTEXT *Context,
50 IN CONST UINT8 *Key,
51 IN CONST UINT8 *Iv,
52 IN UINT32 Counter
53 )
54{
55 Context->Input[0] = 0x61707865U;
56 Context->Input[1] = 0x3320646EU;
57 Context->Input[2] = 0x79622d32U;
58 Context->Input[3] = 0x6B206574U;
59 Context->Input[4] = LOAD32_LE (Key + 0);
60 Context->Input[5] = LOAD32_LE (Key + 4);
61 Context->Input[6] = LOAD32_LE (Key + 8);
62 Context->Input[7] = LOAD32_LE (Key + 12);
63 Context->Input[8] = LOAD32_LE (Key + 16);
64 Context->Input[9] = LOAD32_LE (Key + 20);
65 Context->Input[10] = LOAD32_LE (Key + 24);
66 Context->Input[11] = LOAD32_LE (Key + 28);
67 Context->Input[12] = Counter;
68 Context->Input[13] = LOAD32_LE (Iv + 0);
69 Context->Input[14] = LOAD32_LE (Iv + 4);
70 Context->Input[15] = LOAD32_LE (Iv + 8);
71}
72
73VOID
75 IN OUT CHACHA_CONTEXT *Context,
76 IN CONST UINT8 *Source,
77 OUT UINT8 *Destination,
78 IN UINT32 Length
79 )
80{
81 UINT32 X0;
82 UINT32 X1;
83 UINT32 X2;
84 UINT32 X3;
85 UINT32 X4;
86 UINT32 X5;
87 UINT32 X6;
88 UINT32 X7;
89 UINT32 X8;
90 UINT32 X9;
91 UINT32 X10;
92 UINT32 X11;
93 UINT32 X12;
94 UINT32 X13;
95 UINT32 X14;
96 UINT32 X15;
97 UINT32 J0;
98 UINT32 J1;
99 UINT32 J2;
100 UINT32 J3;
101 UINT32 J4;
102 UINT32 J5;
103 UINT32 J6;
104 UINT32 J7;
105 UINT32 J8;
106 UINT32 J9;
107 UINT32 J10;
108 UINT32 J11;
109 UINT32 J12;
110 UINT32 J13;
111 UINT32 J14;
112 UINT32 J15;
113 UINT8 *Ctarget;
114 UINT8 Tmp[64];
115 UINT32 Index;
116
117 Ctarget = NULL;
118
119 if (Length == 0) {
120 return;
121 }
122
123 J0 = Context->Input[0];
124 J1 = Context->Input[1];
125 J2 = Context->Input[2];
126 J3 = Context->Input[3];
127 J4 = Context->Input[4];
128 J5 = Context->Input[5];
129 J6 = Context->Input[6];
130 J7 = Context->Input[7];
131 J8 = Context->Input[8];
132 J9 = Context->Input[9];
133 J10 = Context->Input[10];
134 J11 = Context->Input[11];
135 J12 = Context->Input[12];
136 J13 = Context->Input[13];
137 J14 = Context->Input[14];
138 J15 = Context->Input[15];
139
140 while (TRUE) {
141 if (Length < sizeof (Tmp)) {
142 CopyMem (Tmp, Source, Length);
143 ZeroMem (Tmp + Length, sizeof (Tmp) - Length);
144 Source = Tmp;
145 Ctarget = Destination;
146 Destination = Tmp;
147 }
148
149 X0 = J0;
150 X1 = J1;
151 X2 = J2;
152 X3 = J3;
153 X4 = J4;
154 X5 = J5;
155 X6 = J6;
156 X7 = J7;
157 X8 = J8;
158 X9 = J9;
159 X10 = J10;
160 X11 = J11;
161 X12 = J12;
162 X13 = J13;
163 X14 = J14;
164 X15 = J15;
165
166 for (Index = 20; Index > 0; Index -= 2) {
167 QUARTERROUND (X0, X4, X8, X12)
168 QUARTERROUND (X1, X5, X9, X13)
169 QUARTERROUND (X2, X6, X10, X14)
170 QUARTERROUND (X3, X7, X11, X15)
171 QUARTERROUND (X0, X5, X10, X15)
172 QUARTERROUND (X1, X6, X11, X12)
173 QUARTERROUND (X2, X7, X8, X13)
174 QUARTERROUND (X3, X4, X9, X14)
175 }
176
177 X0 = PLUS (X0, J0);
178 X1 = PLUS (X1, J1);
179 X2 = PLUS (X2, J2);
180 X3 = PLUS (X3, J3);
181 X4 = PLUS (X4, J4);
182 X5 = PLUS (X5, J5);
183 X6 = PLUS (X6, J6);
184 X7 = PLUS (X7, J7);
185 X8 = PLUS (X8, J8);
186 X9 = PLUS (X9, J9);
187 X10 = PLUS (X10, J10);
188 X11 = PLUS (X11, J11);
189 X12 = PLUS (X12, J12);
190 X13 = PLUS (X13, J13);
191 X14 = PLUS (X14, J14);
192 X15 = PLUS (X15, J15);
193
194 X0 = XOR (X0, LOAD32_LE (Source + 0));
195 X1 = XOR (X1, LOAD32_LE (Source + 4));
196 X2 = XOR (X2, LOAD32_LE (Source + 8));
197 X3 = XOR (X3, LOAD32_LE (Source + 12));
198 X4 = XOR (X4, LOAD32_LE (Source + 16));
199 X5 = XOR (X5, LOAD32_LE (Source + 20));
200 X6 = XOR (X6, LOAD32_LE (Source + 24));
201 X7 = XOR (X7, LOAD32_LE (Source + 28));
202 X8 = XOR (X8, LOAD32_LE (Source + 32));
203 X9 = XOR (X9, LOAD32_LE (Source + 36));
204 X10 = XOR (X10, LOAD32_LE (Source + 40));
205 X11 = XOR (X11, LOAD32_LE (Source + 44));
206 X12 = XOR (X12, LOAD32_LE (Source + 48));
207 X13 = XOR (X13, LOAD32_LE (Source + 52));
208 X14 = XOR (X14, LOAD32_LE (Source + 56));
209 X15 = XOR (X15, LOAD32_LE (Source + 60));
210
211 J12 = PLUSONE (J12);
212
213 if (J12 == 0) {
214 J13 = PLUSONE (J13);
215 }
216
217 STORE32_LE (Destination + 0, X0);
218 STORE32_LE (Destination + 4, X1);
219 STORE32_LE (Destination + 8, X2);
220 STORE32_LE (Destination + 12, X3);
221 STORE32_LE (Destination + 16, X4);
222 STORE32_LE (Destination + 20, X5);
223 STORE32_LE (Destination + 24, X6);
224 STORE32_LE (Destination + 28, X7);
225 STORE32_LE (Destination + 32, X8);
226 STORE32_LE (Destination + 36, X9);
227 STORE32_LE (Destination + 40, X10);
228 STORE32_LE (Destination + 44, X11);
229 STORE32_LE (Destination + 48, X12);
230 STORE32_LE (Destination + 52, X13);
231 STORE32_LE (Destination + 56, X14);
232 STORE32_LE (Destination + 60, X15);
233
234 if (Length <= sizeof (Tmp)) {
235 if (Length < sizeof (Tmp)) {
236 CopyMem (Ctarget, Destination, Length);
237 }
238
239 Context->Input[12] = J12;
240 Context->Input[13] = J13;
241
242 return;
243 }
244
245 Length -= sizeof (Tmp);
246 Destination += sizeof (Tmp);
247 Source += sizeof (Tmp);
248 }
249}
UINT32 Counter
UINT64 Length
#define LOAD32_LE(a)
Definition ChaCha.c:34
VOID ChaChaCryptBuffer(IN OUT CHACHA_CONTEXT *Context, IN CONST UINT8 *Source, OUT UINT8 *Destination, IN UINT32 Length)
Definition ChaCha.c:74
#define STORE32_LE(a, v)
Definition ChaCha.c:35
VOID ChaChaInitCtx(OUT CHACHA_CONTEXT *Context, IN CONST UINT8 *Key, IN CONST UINT8 *Iv, IN UINT32 Counter)
Definition ChaCha.c:48
#define PLUS(v, w)
Definition ChaCha.c:32
#define QUARTERROUND(a, b, c, d)
Definition ChaCha.c:37
#define PLUSONE(v)
Definition ChaCha.c:33
#define XOR(v, w)
Definition ChaCha.c:31
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)