summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/chacha
diff options
context:
space:
mode:
authorjsing <>2014-05-15 14:14:56 +0000
committerjsing <>2014-05-15 14:14:56 +0000
commitb115738274236129c97a787d577da5cbff4c828e (patch)
treed1545fae6b44d7a9d7d6aa80a89b700911a313f3 /src/lib/libcrypto/chacha
parent331e9a2412038c63b968d43c57141df1425f9d43 (diff)
downloadopenbsd-b115738274236129c97a787d577da5cbff4c828e.tar.gz
openbsd-b115738274236129c97a787d577da5cbff4c828e.tar.bz2
openbsd-b115738274236129c97a787d577da5cbff4c828e.zip
KNF.
Diffstat (limited to 'src/lib/libcrypto/chacha')
-rw-r--r--src/lib/libcrypto/chacha/chacha-merged.c312
-rw-r--r--src/lib/libcrypto/chacha/chacha.h2
2 files changed, 158 insertions, 156 deletions
diff --git a/src/lib/libcrypto/chacha/chacha-merged.c b/src/lib/libcrypto/chacha/chacha-merged.c
index 5ba813147a..5cd1dde072 100644
--- a/src/lib/libcrypto/chacha/chacha-merged.c
+++ b/src/lib/libcrypto/chacha/chacha-merged.c
@@ -43,14 +43,14 @@ typedef struct chacha_ctx chacha_ctx;
43 (U32V((v) << (n)) | ((v) >> (32 - (n)))) 43 (U32V((v) << (n)) | ((v) >> (32 - (n))))
44 44
45#define U8TO32_LITTLE(p) \ 45#define U8TO32_LITTLE(p) \
46 (((u32)((p)[0]) ) | \ 46 (((u32)((p)[0])) | \
47 ((u32)((p)[1]) << 8) | \ 47 ((u32)((p)[1]) << 8) | \
48 ((u32)((p)[2]) << 16) | \ 48 ((u32)((p)[2]) << 16) | \
49 ((u32)((p)[3]) << 24)) 49 ((u32)((p)[3]) << 24))
50 50
51#define U32TO8_LITTLE(p, v) \ 51#define U32TO8_LITTLE(p, v) \
52 do { \ 52 do { \
53 (p)[0] = U8V((v) ); \ 53 (p)[0] = U8V((v)); \
54 (p)[1] = U8V((v) >> 8); \ 54 (p)[1] = U8V((v) >> 8); \
55 (p)[2] = U8V((v) >> 16); \ 55 (p)[2] = U8V((v) >> 16); \
56 (p)[3] = U8V((v) >> 24); \ 56 (p)[3] = U8V((v) >> 24); \
@@ -71,167 +71,169 @@ static const char sigma[16] = "expand 32-byte k";
71static const char tau[16] = "expand 16-byte k"; 71static const char tau[16] = "expand 16-byte k";
72 72
73static inline void 73static inline void
74chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits) 74chacha_keysetup(chacha_ctx *x, const u8 *k, u32 kbits)
75{ 75{
76 const char *constants; 76 const char *constants;
77 77
78 x->input[4] = U8TO32_LITTLE(k + 0); 78 x->input[4] = U8TO32_LITTLE(k + 0);
79 x->input[5] = U8TO32_LITTLE(k + 4); 79 x->input[5] = U8TO32_LITTLE(k + 4);
80 x->input[6] = U8TO32_LITTLE(k + 8); 80 x->input[6] = U8TO32_LITTLE(k + 8);
81 x->input[7] = U8TO32_LITTLE(k + 12); 81 x->input[7] = U8TO32_LITTLE(k + 12);
82 if (kbits == 256) { /* recommended */ 82 if (kbits == 256) { /* recommended */
83 k += 16; 83 k += 16;
84 constants = sigma; 84 constants = sigma;
85 } else { /* kbits == 128 */ 85 } else { /* kbits == 128 */
86 constants = tau; 86 constants = tau;
87 } 87 }
88 x->input[8] = U8TO32_LITTLE(k + 0); 88 x->input[8] = U8TO32_LITTLE(k + 0);
89 x->input[9] = U8TO32_LITTLE(k + 4); 89 x->input[9] = U8TO32_LITTLE(k + 4);
90 x->input[10] = U8TO32_LITTLE(k + 8); 90 x->input[10] = U8TO32_LITTLE(k + 8);
91 x->input[11] = U8TO32_LITTLE(k + 12); 91 x->input[11] = U8TO32_LITTLE(k + 12);
92 x->input[0] = U8TO32_LITTLE(constants + 0); 92 x->input[0] = U8TO32_LITTLE(constants + 0);
93 x->input[1] = U8TO32_LITTLE(constants + 4); 93 x->input[1] = U8TO32_LITTLE(constants + 4);
94 x->input[2] = U8TO32_LITTLE(constants + 8); 94 x->input[2] = U8TO32_LITTLE(constants + 8);
95 x->input[3] = U8TO32_LITTLE(constants + 12); 95 x->input[3] = U8TO32_LITTLE(constants + 12);
96} 96}
97 97
98static inline void 98static inline void
99chacha_ivsetup(chacha_ctx *x, const u8 *iv, const u8 *counter) 99chacha_ivsetup(chacha_ctx *x, const u8 *iv, const u8 *counter)
100{ 100{
101 x->input[12] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 0); 101 x->input[12] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 0);
102 x->input[13] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 4); 102 x->input[13] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 4);
103 x->input[14] = U8TO32_LITTLE(iv + 0); 103 x->input[14] = U8TO32_LITTLE(iv + 0);
104 x->input[15] = U8TO32_LITTLE(iv + 4); 104 x->input[15] = U8TO32_LITTLE(iv + 4);
105} 105}
106 106
107static inline void 107static inline void
108chacha_encrypt_bytes(chacha_ctx *x,const u8 *m,u8 *c,u32 bytes) 108chacha_encrypt_bytes(chacha_ctx *x, const u8 *m, u8 *c, u32 bytes)
109{ 109{
110 u32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; 110 u32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;
111 u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15; 111 u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;
112 u8 *ctarget = NULL; 112 u8 *ctarget = NULL;
113 u8 tmp[64]; 113 u8 tmp[64];
114 u_int i; 114 u_int i;
115 115
116 if (!bytes) return; 116 if (!bytes)
117 117 return;
118 j0 = x->input[0]; 118
119 j1 = x->input[1]; 119 j0 = x->input[0];
120 j2 = x->input[2]; 120 j1 = x->input[1];
121 j3 = x->input[3]; 121 j2 = x->input[2];
122 j4 = x->input[4]; 122 j3 = x->input[3];
123 j5 = x->input[5]; 123 j4 = x->input[4];
124 j6 = x->input[6]; 124 j5 = x->input[5];
125 j7 = x->input[7]; 125 j6 = x->input[6];
126 j8 = x->input[8]; 126 j7 = x->input[7];
127 j9 = x->input[9]; 127 j8 = x->input[8];
128 j10 = x->input[10]; 128 j9 = x->input[9];
129 j11 = x->input[11]; 129 j10 = x->input[10];
130 j12 = x->input[12]; 130 j11 = x->input[11];
131 j13 = x->input[13]; 131 j12 = x->input[12];
132 j14 = x->input[14]; 132 j13 = x->input[13];
133 j15 = x->input[15]; 133 j14 = x->input[14];
134 134 j15 = x->input[15];
135 for (;;) { 135
136 if (bytes < 64) { 136 for (;;) {
137 for (i = 0;i < bytes;++i) tmp[i] = m[i]; 137 if (bytes < 64) {
138 m = tmp; 138 for (i = 0;i < bytes;++i) tmp[i] = m[i];
139 ctarget = c; 139 m = tmp;
140 c = tmp; 140 ctarget = c;
141 } 141 c = tmp;
142 x0 = j0; 142 }
143 x1 = j1; 143 x0 = j0;
144 x2 = j2; 144 x1 = j1;
145 x3 = j3; 145 x2 = j2;
146 x4 = j4; 146 x3 = j3;
147 x5 = j5; 147 x4 = j4;
148 x6 = j6; 148 x5 = j5;
149 x7 = j7; 149 x6 = j6;
150 x8 = j8; 150 x7 = j7;
151 x9 = j9; 151 x8 = j8;
152 x10 = j10; 152 x9 = j9;
153 x11 = j11; 153 x10 = j10;
154 x12 = j12; 154 x11 = j11;
155 x13 = j13; 155 x12 = j12;
156 x14 = j14; 156 x13 = j13;
157 x15 = j15; 157 x14 = j14;
158 for (i = 20;i > 0;i -= 2) { 158 x15 = j15;
159 QUARTERROUND( x0, x4, x8,x12) 159 for (i = 20; i > 0; i -= 2) {
160 QUARTERROUND( x1, x5, x9,x13) 160 QUARTERROUND(x0, x4, x8, x12)
161 QUARTERROUND( x2, x6,x10,x14) 161 QUARTERROUND(x1, x5, x9, x13)
162 QUARTERROUND( x3, x7,x11,x15) 162 QUARTERROUND(x2, x6, x10, x14)
163 QUARTERROUND( x0, x5,x10,x15) 163 QUARTERROUND(x3, x7, x11, x15)
164 QUARTERROUND( x1, x6,x11,x12) 164 QUARTERROUND(x0, x5, x10, x15)
165 QUARTERROUND( x2, x7, x8,x13) 165 QUARTERROUND(x1, x6, x11, x12)
166 QUARTERROUND( x3, x4, x9,x14) 166 QUARTERROUND(x2, x7, x8, x13)
167 } 167 QUARTERROUND(x3, x4, x9, x14)
168 x0 = PLUS(x0,j0); 168 }
169 x1 = PLUS(x1,j1); 169 x0 = PLUS(x0, j0);
170 x2 = PLUS(x2,j2); 170 x1 = PLUS(x1, j1);
171 x3 = PLUS(x3,j3); 171 x2 = PLUS(x2, j2);
172 x4 = PLUS(x4,j4); 172 x3 = PLUS(x3, j3);
173 x5 = PLUS(x5,j5); 173 x4 = PLUS(x4, j4);
174 x6 = PLUS(x6,j6); 174 x5 = PLUS(x5, j5);
175 x7 = PLUS(x7,j7); 175 x6 = PLUS(x6, j6);
176 x8 = PLUS(x8,j8); 176 x7 = PLUS(x7, j7);
177 x9 = PLUS(x9,j9); 177 x8 = PLUS(x8, j8);
178 x10 = PLUS(x10,j10); 178 x9 = PLUS(x9, j9);
179 x11 = PLUS(x11,j11); 179 x10 = PLUS(x10, j10);
180 x12 = PLUS(x12,j12); 180 x11 = PLUS(x11, j11);
181 x13 = PLUS(x13,j13); 181 x12 = PLUS(x12, j12);
182 x14 = PLUS(x14,j14); 182 x13 = PLUS(x13, j13);
183 x15 = PLUS(x15,j15); 183 x14 = PLUS(x14, j14);
184 184 x15 = PLUS(x15, j15);
185 x0 = XOR(x0,U8TO32_LITTLE(m + 0)); 185
186 x1 = XOR(x1,U8TO32_LITTLE(m + 4)); 186 x0 = XOR(x0, U8TO32_LITTLE(m + 0));
187 x2 = XOR(x2,U8TO32_LITTLE(m + 8)); 187 x1 = XOR(x1, U8TO32_LITTLE(m + 4));
188 x3 = XOR(x3,U8TO32_LITTLE(m + 12)); 188 x2 = XOR(x2, U8TO32_LITTLE(m + 8));
189 x4 = XOR(x4,U8TO32_LITTLE(m + 16)); 189 x3 = XOR(x3, U8TO32_LITTLE(m + 12));
190 x5 = XOR(x5,U8TO32_LITTLE(m + 20)); 190 x4 = XOR(x4, U8TO32_LITTLE(m + 16));
191 x6 = XOR(x6,U8TO32_LITTLE(m + 24)); 191 x5 = XOR(x5, U8TO32_LITTLE(m + 20));
192 x7 = XOR(x7,U8TO32_LITTLE(m + 28)); 192 x6 = XOR(x6, U8TO32_LITTLE(m + 24));
193 x8 = XOR(x8,U8TO32_LITTLE(m + 32)); 193 x7 = XOR(x7, U8TO32_LITTLE(m + 28));
194 x9 = XOR(x9,U8TO32_LITTLE(m + 36)); 194 x8 = XOR(x8, U8TO32_LITTLE(m + 32));
195 x10 = XOR(x10,U8TO32_LITTLE(m + 40)); 195 x9 = XOR(x9, U8TO32_LITTLE(m + 36));
196 x11 = XOR(x11,U8TO32_LITTLE(m + 44)); 196 x10 = XOR(x10, U8TO32_LITTLE(m + 40));
197 x12 = XOR(x12,U8TO32_LITTLE(m + 48)); 197 x11 = XOR(x11, U8TO32_LITTLE(m + 44));
198 x13 = XOR(x13,U8TO32_LITTLE(m + 52)); 198 x12 = XOR(x12, U8TO32_LITTLE(m + 48));
199 x14 = XOR(x14,U8TO32_LITTLE(m + 56)); 199 x13 = XOR(x13, U8TO32_LITTLE(m + 52));
200 x15 = XOR(x15,U8TO32_LITTLE(m + 60)); 200 x14 = XOR(x14, U8TO32_LITTLE(m + 56));
201 201 x15 = XOR(x15, U8TO32_LITTLE(m + 60));
202 j12 = PLUSONE(j12); 202
203 if (!j12) { 203 j12 = PLUSONE(j12);
204 j13 = PLUSONE(j13); 204 if (!j12) {
205 /* stopping at 2^70 bytes per nonce is user's responsibility */ 205 j13 = PLUSONE(j13);
206 } 206 /* stopping at 2^70 bytes per nonce is user's responsibility */
207 207 }
208 U32TO8_LITTLE(c + 0,x0); 208
209 U32TO8_LITTLE(c + 4,x1); 209 U32TO8_LITTLE(c + 0, x0);
210 U32TO8_LITTLE(c + 8,x2); 210 U32TO8_LITTLE(c + 4, x1);
211 U32TO8_LITTLE(c + 12,x3); 211 U32TO8_LITTLE(c + 8, x2);
212 U32TO8_LITTLE(c + 16,x4); 212 U32TO8_LITTLE(c + 12, x3);
213 U32TO8_LITTLE(c + 20,x5); 213 U32TO8_LITTLE(c + 16, x4);
214 U32TO8_LITTLE(c + 24,x6); 214 U32TO8_LITTLE(c + 20, x5);
215 U32TO8_LITTLE(c + 28,x7); 215 U32TO8_LITTLE(c + 24, x6);
216 U32TO8_LITTLE(c + 32,x8); 216 U32TO8_LITTLE(c + 28, x7);
217 U32TO8_LITTLE(c + 36,x9); 217 U32TO8_LITTLE(c + 32, x8);
218 U32TO8_LITTLE(c + 40,x10); 218 U32TO8_LITTLE(c + 36, x9);
219 U32TO8_LITTLE(c + 44,x11); 219 U32TO8_LITTLE(c + 40, x10);
220 U32TO8_LITTLE(c + 48,x12); 220 U32TO8_LITTLE(c + 44, x11);
221 U32TO8_LITTLE(c + 52,x13); 221 U32TO8_LITTLE(c + 48, x12);
222 U32TO8_LITTLE(c + 56,x14); 222 U32TO8_LITTLE(c + 52, x13);
223 U32TO8_LITTLE(c + 60,x15); 223 U32TO8_LITTLE(c + 56, x14);
224 224 U32TO8_LITTLE(c + 60, x15);
225 if (bytes <= 64) { 225
226 if (bytes < 64) { 226 if (bytes <= 64) {
227 for (i = 0;i < bytes;++i) ctarget[i] = c[i]; 227 if (bytes < 64) {
228 } 228 for (i = 0; i < bytes; ++i)
229 x->input[12] = j12; 229 ctarget[i] = c[i];
230 x->input[13] = j13; 230 }
231 return; 231 x->input[12] = j12;
232 } 232 x->input[13] = j13;
233 bytes -= 64; 233 return;
234 c += 64; 234 }
235 m += 64; 235 bytes -= 64;
236 } 236 c += 64;
237 m += 64;
238 }
237} 239}
diff --git a/src/lib/libcrypto/chacha/chacha.h b/src/lib/libcrypto/chacha/chacha.h
index 456d960ed9..8312273cea 100644
--- a/src/lib/libcrypto/chacha/chacha.h
+++ b/src/lib/libcrypto/chacha/chacha.h
@@ -30,7 +30,7 @@ extern "C" {
30#endif 30#endif
31 31
32typedef struct { 32typedef struct {
33 unsigned int input[16]; 33 unsigned int input[16];
34} ChaCha_ctx; 34} ChaCha_ctx;
35 35
36void ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key, 36void ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key,