summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2022-09-03 19:43:16 +0000
committerjsing <>2022-09-03 19:43:16 +0000
commit57f270bb2fc6f47d34030e9b0909b06351dbcd5f (patch)
tree71bf4ac116b8c03f68161668e8070501f3b46e7b /src/lib
parent7776afea0252a08cf698b85c1874be612bb6e8ff (diff)
downloadopenbsd-57f270bb2fc6f47d34030e9b0909b06351dbcd5f.tar.gz
openbsd-57f270bb2fc6f47d34030e9b0909b06351dbcd5f.tar.bz2
openbsd-57f270bb2fc6f47d34030e9b0909b06351dbcd5f.zip
Mechanically expand IMPLEMENT_BLOCK_CIPHER macro.
These macros make the ASN.1 macros seem sane - there are layers and layers and layers here, which are hiding bugs. No change to generated assembly. Discussed with tb@
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/evp/e_bf.c168
1 files changed, 163 insertions, 5 deletions
diff --git a/src/lib/libcrypto/evp/e_bf.c b/src/lib/libcrypto/evp/e_bf.c
index 615c9bd771..f4e0c4c093 100644
--- a/src/lib/libcrypto/evp/e_bf.c
+++ b/src/lib/libcrypto/evp/e_bf.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: e_bf.c,v 1.8 2014/07/11 08:44:48 jsing Exp $ */ 1/* $OpenBSD: e_bf.c,v 1.9 2022/09/03 19:43:16 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -75,11 +75,169 @@ typedef struct {
75 BF_KEY ks; 75 BF_KEY ks;
76} EVP_BF_KEY; 76} EVP_BF_KEY;
77 77
78#define data(ctx) EVP_C_DATA(EVP_BF_KEY,ctx) 78#define data(ctx) ((EVP_BF_KEY *)(ctx)->cipher_data)
79
80static int
81bf_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
82{
83 while (inl >= EVP_MAXCHUNK) {
84 BF_cbc_encrypt(in, out, (long)EVP_MAXCHUNK, &((EVP_BF_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
85 inl -= EVP_MAXCHUNK;
86 in += EVP_MAXCHUNK;
87 out += EVP_MAXCHUNK;
88 }
89
90 if (inl)
91 BF_cbc_encrypt(in, out, (long)inl, &((EVP_BF_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
92
93 return 1;
94}
95
96static int
97bf_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
98{
99 size_t chunk = EVP_MAXCHUNK;
100
101 if (64 == 1)
102 chunk >>= 3;
103
104 if (inl < chunk)
105 chunk = inl;
106
107 while (inl && inl >= chunk) {
108 BF_cfb64_encrypt(in, out, (long)((64 == 1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ? inl * 8 : inl), &((EVP_BF_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
109 inl -= chunk;
110 in += chunk;
111 out += chunk;
112 if (inl < chunk)
113 chunk = inl;
114 }
115
116 return 1;
117}
118
119static int
120bf_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
121{
122 size_t i, bl;
123
124 bl = ctx->cipher->block_size;
125
126 if (inl < bl)
127 return 1;
128
129 inl -= bl;
130
131 for (i = 0; i <= inl; i += bl)
132 BF_ecb_encrypt(in + i, out + i, &((EVP_BF_KEY *)ctx->cipher_data)->ks, ctx->encrypt);
133
134 return 1;
135}
136
137static int
138bf_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
139{
140 while (inl >= EVP_MAXCHUNK) {
141 BF_ofb64_encrypt(in, out, (long)EVP_MAXCHUNK, &((EVP_BF_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
142 inl -= EVP_MAXCHUNK;
143 in += EVP_MAXCHUNK;
144 out += EVP_MAXCHUNK;
145 }
146
147 if (inl)
148 BF_ofb64_encrypt(in, out, (long)inl, &((EVP_BF_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
149
150 return 1;
151}
152
153static const EVP_CIPHER bf_cbc = {
154 .nid = NID_bf_cbc,
155 .block_size = 8,
156 .key_len = 16,
157 .iv_len = 8,
158 .flags = EVP_CIPH_VARIABLE_LENGTH | EVP_CIPH_CBC_MODE,
159 .init = bf_init_key,
160 .do_cipher = bf_cbc_cipher,
161 .cleanup = NULL,
162 .ctx_size = sizeof(EVP_BF_KEY),
163 .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
164 .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
165 .ctrl = NULL,
166 .app_data = NULL,
167};
168
169const EVP_CIPHER *
170EVP_bf_cbc(void)
171{
172 return &bf_cbc;
173}
174
175static const EVP_CIPHER bf_cfb64 = {
176 .nid = NID_bf_cfb64,
177 .block_size = 1,
178 .key_len = 16,
179 .iv_len = 8,
180 .flags = EVP_CIPH_VARIABLE_LENGTH | EVP_CIPH_CFB_MODE,
181 .init = bf_init_key,
182 .do_cipher = bf_cfb64_cipher,
183 .cleanup = NULL,
184 .ctx_size = sizeof(EVP_BF_KEY),
185 .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
186 .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
187 .ctrl = NULL,
188 .app_data = NULL,
189};
190
191const EVP_CIPHER *
192EVP_bf_cfb64(void)
193{
194 return &bf_cfb64;
195}
196
197static const EVP_CIPHER bf_ofb = {
198 .nid = NID_bf_ofb64,
199 .block_size = 1,
200 .key_len = 16,
201 .iv_len = 8,
202 .flags = EVP_CIPH_VARIABLE_LENGTH | EVP_CIPH_OFB_MODE,
203 .init = bf_init_key,
204 .do_cipher = bf_ofb_cipher,
205 .cleanup = NULL,
206 .ctx_size = sizeof(EVP_BF_KEY),
207 .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
208 .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
209 .ctrl = NULL,
210 .app_data = NULL,
211};
212
213const EVP_CIPHER *
214EVP_bf_ofb(void)
215{
216 return &bf_ofb;
217}
218
219static const EVP_CIPHER bf_ecb = {
220 .nid = NID_bf_ecb,
221 .block_size = 8,
222 .key_len = 16,
223 .iv_len = 0,
224 .flags = EVP_CIPH_VARIABLE_LENGTH | EVP_CIPH_ECB_MODE,
225 .init = bf_init_key,
226 .do_cipher = bf_ecb_cipher,
227 .cleanup = NULL,
228 .ctx_size = sizeof(EVP_BF_KEY),
229 .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
230 .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
231 .ctrl = NULL,
232 .app_data = NULL,
233};
234
235const EVP_CIPHER *
236EVP_bf_ecb(void)
237{
238 return &bf_ecb;
239}
79 240
80IMPLEMENT_BLOCK_CIPHER(bf, ks, BF, EVP_BF_KEY, NID_bf, 8, 16, 8, 64,
81 EVP_CIPH_VARIABLE_LENGTH, bf_init_key, NULL,
82 EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv, NULL)
83 241
84static int 242static int
85bf_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 243bf_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,