summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/modes/ctr128.c
diff options
context:
space:
mode:
authorbeck <>2023-07-08 14:55:36 +0000
committerbeck <>2023-07-08 14:55:36 +0000
commit3c27356c4047c5869d9365e12ad90ccbdbb882ab (patch)
tree8b52e2acda02335df7e6b79862b2a92ae5046a0f /src/lib/libcrypto/modes/ctr128.c
parentcfe8c9ef5ce212d7cb6e1b00c34a8835dd08c925 (diff)
downloadopenbsd-3c27356c4047c5869d9365e12ad90ccbdbb882ab.tar.gz
openbsd-3c27356c4047c5869d9365e12ad90ccbdbb882ab.tar.bz2
openbsd-3c27356c4047c5869d9365e12ad90ccbdbb882ab.zip
Hit modes with the loving mallet of knfmt
ok tb@
Diffstat (limited to 'src/lib/libcrypto/modes/ctr128.c')
-rw-r--r--src/lib/libcrypto/modes/ctr128.c148
1 files changed, 81 insertions, 67 deletions
diff --git a/src/lib/libcrypto/modes/ctr128.c b/src/lib/libcrypto/modes/ctr128.c
index eadb80449c..7ba68a9c4c 100644
--- a/src/lib/libcrypto/modes/ctr128.c
+++ b/src/lib/libcrypto/modes/ctr128.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ctr128.c,v 1.9 2022/12/26 07:18:52 jmc Exp $ */ 1/* $OpenBSD: ctr128.c,v 1.10 2023/07/08 14:55:36 beck Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright (c) 2008 The OpenSSL Project. All rights reserved. 3 * Copyright (c) 2008 The OpenSSL Project. All rights reserved.
4 * 4 *
@@ -7,7 +7,7 @@
7 * are met: 7 * are met:
8 * 8 *
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
11 * 11 *
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in 13 * notice, this list of conditions and the following disclaimer in
@@ -64,8 +64,10 @@
64 * is endian-neutral. */ 64 * is endian-neutral. */
65 65
66/* increment counter (128-bit int) by 1 */ 66/* increment counter (128-bit int) by 1 */
67static void ctr128_inc(unsigned char *counter) { 67static void
68 u32 n=16; 68ctr128_inc(unsigned char *counter)
69{
70 u32 n = 16;
69 u8 c; 71 u8 c;
70 72
71 do { 73 do {
@@ -73,7 +75,8 @@ static void ctr128_inc(unsigned char *counter) {
73 c = counter[n]; 75 c = counter[n];
74 ++c; 76 ++c;
75 counter[n] = c; 77 counter[n] = c;
76 if (c) return; 78 if (c)
79 return;
77 } while (n); 80 } while (n);
78} 81}
79 82
@@ -112,70 +115,76 @@ ctr128_inc_aligned(unsigned char *counter)
112 * responsibility for checking that the counter doesn't overflow 115 * responsibility for checking that the counter doesn't overflow
113 * into the rest of the IV when incremented. 116 * into the rest of the IV when incremented.
114 */ 117 */
115void CRYPTO_ctr128_encrypt(const unsigned char *in, unsigned char *out, 118void
116 size_t len, const void *key, 119CRYPTO_ctr128_encrypt(const unsigned char *in, unsigned char *out,
117 unsigned char ivec[16], unsigned char ecount_buf[16], 120 size_t len, const void *key,
118 unsigned int *num, block128_f block) 121 unsigned char ivec[16], unsigned char ecount_buf[16],
122 unsigned int *num, block128_f block)
119{ 123{
120 unsigned int n; 124 unsigned int n;
121 size_t l=0; 125 size_t l = 0;
122 126
123 assert(*num < 16); 127 assert(*num < 16);
124 128
125 n = *num; 129 n = *num;
126 130
127#if !defined(OPENSSL_SMALL_FOOTPRINT) 131#if !defined(OPENSSL_SMALL_FOOTPRINT)
128 if (16%sizeof(size_t) == 0) do { /* always true actually */ 132 if (16 % sizeof(size_t) == 0)
129 while (n && len) { 133 do { /* always true actually */
130 *(out++) = *(in++) ^ ecount_buf[n]; 134 while (n && len) {
131 --len; 135 *(out++) = *(in++) ^ ecount_buf[n];
132 n = (n+1) % 16; 136 --len;
133 } 137 n = (n + 1) % 16;
138 }
134 139
135#ifdef __STRICT_ALIGNMENT 140#ifdef __STRICT_ALIGNMENT
136 if (((size_t)in|(size_t)out|(size_t)ivec)%sizeof(size_t) != 0) 141 if (((size_t)in|(size_t)out|(size_t)ivec) %
137 break; 142 sizeof(size_t) != 0)
143 break;
138#endif 144#endif
139 while (len>=16) { 145 while (len >= 16) {
140 (*block)(ivec, ecount_buf, key); 146 (*block)(ivec, ecount_buf, key);
141 ctr128_inc_aligned(ivec); 147 ctr128_inc_aligned(ivec);
142 for (; n<16; n+=sizeof(size_t)) 148 for (; n < 16; n += sizeof(size_t))
143 *(size_t *)(out+n) = 149 *(size_t *)(out + n) =
144 *(size_t *)(in+n) ^ *(size_t *)(ecount_buf+n); 150 *(size_t *)(in + n) ^ *(size_t *)(ecount_buf +
145 len -= 16; 151 n);
146 out += 16; 152 len -= 16;
147 in += 16; 153 out += 16;
148 n = 0; 154 in += 16;
149 } 155 n = 0;
150 if (len) {
151 (*block)(ivec, ecount_buf, key);
152 ctr128_inc_aligned(ivec);
153 while (len--) {
154 out[n] = in[n] ^ ecount_buf[n];
155 ++n;
156 } 156 }
157 } 157 if (len) {
158 *num = n; 158 (*block)(ivec, ecount_buf, key);
159 return; 159 ctr128_inc_aligned(ivec);
160 } while(0); 160 while (len--) {
161 out[n] = in[n] ^ ecount_buf[n];
162 ++n;
163 }
164 }
165 *num = n;
166 return;
167 } while (0);
161 /* the rest would be commonly eliminated by x86* compiler */ 168 /* the rest would be commonly eliminated by x86* compiler */
162#endif 169#endif
163 while (l<len) { 170 while (l < len) {
164 if (n==0) { 171 if (n == 0) {
165 (*block)(ivec, ecount_buf, key); 172 (*block)(ivec, ecount_buf, key);
166 ctr128_inc(ivec); 173 ctr128_inc(ivec);
167 } 174 }
168 out[l] = in[l] ^ ecount_buf[n]; 175 out[l] = in[l] ^ ecount_buf[n];
169 ++l; 176 ++l;
170 n = (n+1) % 16; 177 n = (n + 1) % 16;
171 } 178 }
172 179
173 *num=n; 180 *num = n;
174} 181}
175 182
176/* increment upper 96 bits of 128-bit counter by 1 */ 183/* increment upper 96 bits of 128-bit counter by 1 */
177static void ctr96_inc(unsigned char *counter) { 184static void
178 u32 n=12; 185ctr96_inc(unsigned char *counter)
186{
187 u32 n = 12;
179 u8 c; 188 u8 c;
180 189
181 do { 190 do {
@@ -183,16 +192,18 @@ static void ctr96_inc(unsigned char *counter) {
183 c = counter[n]; 192 c = counter[n];
184 ++c; 193 ++c;
185 counter[n] = c; 194 counter[n] = c;
186 if (c) return; 195 if (c)
196 return;
187 } while (n); 197 } while (n);
188} 198}
189 199
190void CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out, 200void
191 size_t len, const void *key, 201CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out,
192 unsigned char ivec[16], unsigned char ecount_buf[16], 202 size_t len, const void *key,
193 unsigned int *num, ctr128_f func) 203 unsigned char ivec[16], unsigned char ecount_buf[16],
204 unsigned int *num, ctr128_f func)
194{ 205{
195 unsigned int n,ctr32; 206 unsigned int n, ctr32;
196 207
197 assert(*num < 16); 208 assert(*num < 16);
198 209
@@ -201,19 +212,20 @@ void CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out,
201 while (n && len) { 212 while (n && len) {
202 *(out++) = *(in++) ^ ecount_buf[n]; 213 *(out++) = *(in++) ^ ecount_buf[n];
203 --len; 214 --len;
204 n = (n+1) % 16; 215 n = (n + 1) % 16;
205 } 216 }
206 217
207 ctr32 = GETU32(ivec+12); 218 ctr32 = GETU32(ivec + 12);
208 while (len>=16) { 219 while (len >= 16) {
209 size_t blocks = len/16; 220 size_t blocks = len/16;
210 /* 221 /*
211 * 1<<28 is just a not-so-small yet not-so-large number... 222 * 1<<28 is just a not-so-small yet not-so-large number...
212 * Below condition is practically never met, but it has to 223 * Below condition is practically never met, but it has to
213 * be checked for code correctness. 224 * be checked for code correctness.
214 */ 225 */
215 if (sizeof(size_t)>sizeof(unsigned int) && blocks>(1U<<28)) 226 if (sizeof(size_t) > sizeof(unsigned int) &&
216 blocks = (1U<<28); 227 blocks > (1U << 28))
228 blocks = (1U << 28);
217 /* 229 /*
218 * As (*func) operates on 32-bit counter, caller 230 * As (*func) operates on 32-bit counter, caller
219 * has to handle overflow. 'if' below detects the 231 * has to handle overflow. 'if' below detects the
@@ -223,29 +235,31 @@ void CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out,
223 ctr32 += (u32)blocks; 235 ctr32 += (u32)blocks;
224 if (ctr32 < blocks) { 236 if (ctr32 < blocks) {
225 blocks -= ctr32; 237 blocks -= ctr32;
226 ctr32 = 0; 238 ctr32 = 0;
227 } 239 }
228 (*func)(in,out,blocks,key,ivec); 240 (*func)(in, out, blocks, key, ivec);
229 /* (*ctr) does not update ivec, caller does: */ 241 /* (*ctr) does not update ivec, caller does: */
230 PUTU32(ivec+12,ctr32); 242 PUTU32(ivec + 12, ctr32);
231 /* ... overflow was detected, propagate carry. */ 243 /* ... overflow was detected, propagate carry. */
232 if (ctr32 == 0) ctr96_inc(ivec); 244 if (ctr32 == 0)
245 ctr96_inc(ivec);
233 blocks *= 16; 246 blocks *= 16;
234 len -= blocks; 247 len -= blocks;
235 out += blocks; 248 out += blocks;
236 in += blocks; 249 in += blocks;
237 } 250 }
238 if (len) { 251 if (len) {
239 memset(ecount_buf,0,16); 252 memset(ecount_buf, 0, 16);
240 (*func)(ecount_buf,ecount_buf,1,key,ivec); 253 (*func)(ecount_buf, ecount_buf, 1, key, ivec);
241 ++ctr32; 254 ++ctr32;
242 PUTU32(ivec+12,ctr32); 255 PUTU32(ivec + 12, ctr32);
243 if (ctr32 == 0) ctr96_inc(ivec); 256 if (ctr32 == 0)
257 ctr96_inc(ivec);
244 while (len--) { 258 while (len--) {
245 out[n] = in[n] ^ ecount_buf[n]; 259 out[n] = in[n] ^ ecount_buf[n];
246 ++n; 260 ++n;
247 } 261 }
248 } 262 }
249 263
250 *num=n; 264 *num = n;
251} 265}