summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/modes/ofb128.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/modes/ofb128.c')
-rw-r--r--src/lib/libcrypto/modes/ofb128.c80
1 files changed, 42 insertions, 38 deletions
diff --git a/src/lib/libcrypto/modes/ofb128.c b/src/lib/libcrypto/modes/ofb128.c
index 3cf5d98150..9ef812a08b 100644
--- a/src/lib/libcrypto/modes/ofb128.c
+++ b/src/lib/libcrypto/modes/ofb128.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ofb128.c,v 1.5 2022/11/26 16:08:53 tb Exp $ */ 1/* $OpenBSD: ofb128.c,v 1.6 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
@@ -63,57 +63,61 @@
63 * used. The extra state information to record how much of the 63 * used. The extra state information to record how much of the
64 * 128bit block we have used is contained in *num; 64 * 128bit block we have used is contained in *num;
65 */ 65 */
66void CRYPTO_ofb128_encrypt(const unsigned char *in, unsigned char *out, 66void
67 size_t len, const void *key, 67CRYPTO_ofb128_encrypt(const unsigned char *in, unsigned char *out,
68 unsigned char ivec[16], int *num, 68 size_t len, const void *key,
69 block128_f block) 69 unsigned char ivec[16], int *num,
70 block128_f block)
70{ 71{
71 unsigned int n; 72 unsigned int n;
72 size_t l=0; 73 size_t l = 0;
73 74
74 n = *num; 75 n = *num;
75 76
76#if !defined(OPENSSL_SMALL_FOOTPRINT) 77#if !defined(OPENSSL_SMALL_FOOTPRINT)
77 if (16%sizeof(size_t) == 0) do { /* always true actually */ 78 if (16 % sizeof(size_t) == 0)
78 while (n && len) { 79 do { /* always true actually */
79 *(out++) = *(in++) ^ ivec[n]; 80 while (n && len) {
80 --len; 81 *(out++) = *(in++) ^ ivec[n];
81 n = (n+1) % 16; 82 --len;
82 } 83 n = (n + 1) % 16;
84 }
83#ifdef __STRICT_ALIGNMENT 85#ifdef __STRICT_ALIGNMENT
84 if (((size_t)in|(size_t)out|(size_t)ivec)%sizeof(size_t) != 0) 86 if (((size_t)in|(size_t)out|(size_t)ivec) %
85 break; 87 sizeof(size_t) != 0)
88 break;
86#endif 89#endif
87 while (len>=16) { 90 while (len >= 16) {
88 (*block)(ivec, ivec, key); 91 (*block)(ivec, ivec, key);
89 for (; n<16; n+=sizeof(size_t)) 92 for (; n < 16; n += sizeof(size_t))
90 *(size_t*)(out+n) = 93 *(size_t *)(out + n) =
91 *(size_t*)(in+n) ^ *(size_t*)(ivec+n); 94 *(size_t *)(in + n) ^ *(size_t *)(ivec +
92 len -= 16; 95 n);
93 out += 16; 96 len -= 16;
94 in += 16; 97 out += 16;
95 n = 0; 98 in += 16;
96 } 99 n = 0;
97 if (len) {
98 (*block)(ivec, ivec, key);
99 while (len--) {
100 out[n] = in[n] ^ ivec[n];
101 ++n;
102 } 100 }
103 } 101 if (len) {
104 *num = n; 102 (*block)(ivec, ivec, key);
105 return; 103 while (len--) {
106 } while(0); 104 out[n] = in[n] ^ ivec[n];
105 ++n;
106 }
107 }
108 *num = n;
109 return;
110 } while (0);
107 /* the rest would be commonly eliminated by x86* compiler */ 111 /* the rest would be commonly eliminated by x86* compiler */
108#endif 112#endif
109 while (l<len) { 113 while (l < len) {
110 if (n==0) { 114 if (n == 0) {
111 (*block)(ivec, ivec, key); 115 (*block)(ivec, ivec, key);
112 } 116 }
113 out[l] = in[l] ^ ivec[n]; 117 out[l] = in[l] ^ ivec[n];
114 ++l; 118 ++l;
115 n = (n+1) % 16; 119 n = (n + 1) % 16;
116 } 120 }
117 121
118 *num=n; 122 *num = n;
119} 123}