summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/encode.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/evp/encode.c524
1 files changed, 263 insertions, 261 deletions
diff --git a/src/lib/libcrypto/evp/encode.c b/src/lib/libcrypto/evp/encode.c
index 7af9a2780b..dca5ffdcf4 100644
--- a/src/lib/libcrypto/evp/encode.c
+++ b/src/lib/libcrypto/evp/encode.c
@@ -5,21 +5,21 @@
5 * This package is an SSL implementation written 5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com). 6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL. 7 * The implementation was written so as to conform with Netscapes SSL.
8 * 8 *
9 * This library is free for commercial and non-commercial use as long as 9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions 10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA, 11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms 13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 * 15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in 16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed. 17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution 18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used. 19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or 20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package. 21 * in documentation (online or textual) provided with the package.
22 * 22 *
23 * Redistribution and use in source and binary forms, with or without 23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions 24 * modification, are permitted provided that the following conditions
25 * are met: 25 * are met:
@@ -34,10 +34,10 @@
34 * Eric Young (eay@cryptsoft.com)" 34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library 35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-). 36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from 37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement: 38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 * 40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -49,7 +49,7 @@
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE. 51 * SUCH DAMAGE.
52 * 52 *
53 * The licence and distribution terms for any publically available version or 53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be 54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
@@ -74,7 +74,7 @@
74#define CHUNKS_PER_LINE (64/4) 74#define CHUNKS_PER_LINE (64/4)
75#define CHAR_PER_LINE (64+1) 75#define CHAR_PER_LINE (64+1)
76 76
77static const unsigned char data_bin2ascii[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZ\ 77static const unsigned char data_bin2ascii[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\
78abcdefghijklmnopqrstuvwxyz0123456789+/"; 78abcdefghijklmnopqrstuvwxyz0123456789+/";
79 79
80/* 0xF0 is a EOLN 80/* 0xF0 is a EOLN
@@ -91,344 +91,346 @@ abcdefghijklmnopqrstuvwxyz0123456789+/";
91#define B64_ERROR 0xFF 91#define B64_ERROR 0xFF
92#define B64_NOT_BASE64(a) (((a)|0x13) == 0xF3) 92#define B64_NOT_BASE64(a) (((a)|0x13) == 0xF3)
93 93
94static const unsigned char data_ascii2bin[128]={ 94static const unsigned char data_ascii2bin[128] = {
95 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 95 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
96 0xFF,0xE0,0xF0,0xFF,0xFF,0xF1,0xFF,0xFF, 96 0xFF, 0xE0, 0xF0, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF,
97 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 97 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
98 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 98 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
99 0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 99 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
100 0xFF,0xFF,0xFF,0x3E,0xFF,0xF2,0xFF,0x3F, 100 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xF2, 0xFF, 0x3F,
101 0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B, 101 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,
102 0x3C,0x3D,0xFF,0xFF,0xFF,0x00,0xFF,0xFF, 102 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
103 0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06, 103 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
104 0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E, 104 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
105 0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16, 105 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
106 0x17,0x18,0x19,0xFF,0xFF,0xFF,0xFF,0xFF, 106 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
107 0xFF,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20, 107 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,
108 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, 108 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
109 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30, 109 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,
110 0x31,0x32,0x33,0xFF,0xFF,0xFF,0xFF,0xFF, 110 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
111 }; 111};
112 112
113void EVP_EncodeInit(EVP_ENCODE_CTX *ctx) 113void
114 { 114EVP_EncodeInit(EVP_ENCODE_CTX *ctx)
115 ctx->length=48; 115{
116 ctx->num=0; 116 ctx->length = 48;
117 ctx->line_num=0; 117 ctx->num = 0;
118 } 118 ctx->line_num = 0;
119 119}
120void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, 120
121 const unsigned char *in, int inl) 121void
122 { 122EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,
123 int i,j; 123 const unsigned char *in, int inl)
124 unsigned int total=0; 124{
125 125 int i, j;
126 *outl=0; 126 unsigned int total = 0;
127 if (inl == 0) return; 127
128 *outl = 0;
129 if (inl == 0)
130 return;
128 OPENSSL_assert(ctx->length <= (int)sizeof(ctx->enc_data)); 131 OPENSSL_assert(ctx->length <= (int)sizeof(ctx->enc_data));
129 if ((ctx->num+inl) < ctx->length) 132 if ((ctx->num + inl) < ctx->length) {
130 { 133 memcpy(&(ctx->enc_data[ctx->num]), in, inl);
131 memcpy(&(ctx->enc_data[ctx->num]),in,inl); 134 ctx->num += inl;
132 ctx->num+=inl;
133 return; 135 return;
134 }
135 if (ctx->num != 0)
136 {
137 i=ctx->length-ctx->num;
138 memcpy(&(ctx->enc_data[ctx->num]),in,i);
139 in+=i;
140 inl-=i;
141 j=EVP_EncodeBlock(out,ctx->enc_data,ctx->length);
142 ctx->num=0;
143 out+=j;
144 *(out++)='\n';
145 *out='\0';
146 total=j+1;
147 }
148 while (inl >= ctx->length)
149 {
150 j=EVP_EncodeBlock(out,in,ctx->length);
151 in+=ctx->length;
152 inl-=ctx->length;
153 out+=j;
154 *(out++)='\n';
155 *out='\0';
156 total+=j+1;
157 }
158 if (inl != 0)
159 memcpy(&(ctx->enc_data[0]),in,inl);
160 ctx->num=inl;
161 *outl=total;
162 } 136 }
163 137 if (ctx->num != 0) {
164void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl) 138 i = ctx->length - ctx->num;
165 { 139 memcpy(&(ctx->enc_data[ctx->num]), in, i);
166 unsigned int ret=0; 140 in += i;
167 141 inl -= i;
168 if (ctx->num != 0) 142 j = EVP_EncodeBlock(out, ctx->enc_data, ctx->length);
169 { 143 ctx->num = 0;
170 ret=EVP_EncodeBlock(out,ctx->enc_data,ctx->num); 144 out += j;
171 out[ret++]='\n'; 145 *(out++) = '\n';
172 out[ret]='\0'; 146 *out = '\0';
173 ctx->num=0; 147 total = j + 1;
174 } 148 }
175 *outl=ret; 149 while (inl >= ctx->length) {
150 j = EVP_EncodeBlock(out, in, ctx->length);
151 in += ctx->length;
152 inl -= ctx->length;
153 out += j;
154 *(out++) = '\n';
155 *out = '\0';
156 total += j + 1;
157 }
158 if (inl != 0)
159 memcpy(&(ctx->enc_data[0]), in, inl);
160 ctx->num = inl;
161 *outl = total;
162}
163
164void
165EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl)
166{
167 unsigned int ret = 0;
168
169 if (ctx->num != 0) {
170 ret = EVP_EncodeBlock(out, ctx->enc_data, ctx->num);
171 out[ret++] = '\n';
172 out[ret] = '\0';
173 ctx->num = 0;
176 } 174 }
175 *outl = ret;
176}
177 177
178int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int dlen) 178int
179 { 179EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int dlen)
180 int i,ret=0; 180{
181 int i, ret = 0;
181 unsigned long l; 182 unsigned long l;
182 183
183 for (i=dlen; i > 0; i-=3) 184 for (i = dlen; i > 0; i -= 3) {
184 { 185 if (i >= 3) {
185 if (i >= 3) 186 l = (((unsigned long)f[0]) << 16L) |
186 { 187 (((unsigned long)f[1]) << 8L) | f[2];
187 l= (((unsigned long)f[0])<<16L)| 188 *(t++) = conv_bin2ascii(l >> 18L);
188 (((unsigned long)f[1])<< 8L)|f[2]; 189 *(t++) = conv_bin2ascii(l >> 12L);
189 *(t++)=conv_bin2ascii(l>>18L); 190 *(t++) = conv_bin2ascii(l >> 6L);
190 *(t++)=conv_bin2ascii(l>>12L); 191 *(t++) = conv_bin2ascii(l );
191 *(t++)=conv_bin2ascii(l>> 6L); 192 } else {
192 *(t++)=conv_bin2ascii(l ); 193 l = ((unsigned long)f[0]) << 16L;
193 } 194 if (i == 2)
194 else 195 l |= ((unsigned long)f[1] << 8L);
195 { 196
196 l=((unsigned long)f[0])<<16L; 197 *(t++) = conv_bin2ascii(l >> 18L);
197 if (i == 2) l|=((unsigned long)f[1]<<8L); 198 *(t++) = conv_bin2ascii(l >> 12L);
198 199 *(t++) = (i == 1) ? '=' : conv_bin2ascii(l >> 6L);
199 *(t++)=conv_bin2ascii(l>>18L); 200 *(t++) = '=';
200 *(t++)=conv_bin2ascii(l>>12L);
201 *(t++)=(i == 1)?'=':conv_bin2ascii(l>> 6L);
202 *(t++)='=';
203 }
204 ret+=4;
205 f+=3;
206 } 201 }
207 202 ret += 4;
208 *t='\0'; 203 f += 3;
209 return(ret);
210 } 204 }
211 205
212void EVP_DecodeInit(EVP_ENCODE_CTX *ctx) 206 *t = '\0';
213 { 207 return (ret);
214 ctx->length=30; 208}
215 ctx->num=0; 209
216 ctx->line_num=0; 210void
217 ctx->expect_nl=0; 211EVP_DecodeInit(EVP_ENCODE_CTX *ctx)
218 } 212{
213 ctx->length = 30;
214 ctx->num = 0;
215 ctx->line_num = 0;
216 ctx->expect_nl = 0;
217}
219 218
220/* -1 for error 219/* -1 for error
221 * 0 for last line 220 * 0 for last line
222 * 1 for full line 221 * 1 for full line
223 */ 222 */
224int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, 223int
225 const unsigned char *in, int inl) 224EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,
226 { 225 const unsigned char *in, int inl)
227 int seof= -1,eof=0,rv= -1,ret=0,i,v,tmp,n,ln,exp_nl; 226{
227 int seof = -1, eof = 0, rv = -1, ret = 0, i,v, tmp, n,ln, exp_nl;
228 unsigned char *d; 228 unsigned char *d;
229 229
230 n=ctx->num; 230 n = ctx->num;
231 d=ctx->enc_data; 231 d = ctx->enc_data;
232 ln=ctx->line_num; 232 ln = ctx->line_num;
233 exp_nl=ctx->expect_nl; 233 exp_nl = ctx->expect_nl;
234 234
235 /* last line of input. */ 235 /* last line of input. */
236 if ((inl == 0) || ((n == 0) && (conv_ascii2bin(in[0]) == B64_EOF))) 236 if ((inl == 0) || ((n == 0) && (conv_ascii2bin(in[0]) == B64_EOF))) {
237 { rv=0; goto end; } 237 rv = 0;
238 238 goto end;
239 }
240
239 /* We parse the input data */ 241 /* We parse the input data */
240 for (i=0; i<inl; i++) 242 for (i = 0; i < inl; i++) {
241 {
242 /* If the current line is > 80 characters, scream alot */ 243 /* If the current line is > 80 characters, scream alot */
243 if (ln >= 80) { rv= -1; goto end; } 244 if (ln >= 80) {
245 rv = -1;
246 goto end;
247 }
244 248
245 /* Get char and put it into the buffer */ 249 /* Get char and put it into the buffer */
246 tmp= *(in++); 250 tmp= *(in++);
247 v=conv_ascii2bin(tmp); 251 v = conv_ascii2bin(tmp);
248 /* only save the good data :-) */ 252 /* only save the good data :-) */
249 if (!B64_NOT_BASE64(v)) 253 if (!B64_NOT_BASE64(v)) {
250 {
251 OPENSSL_assert(n < (int)sizeof(ctx->enc_data)); 254 OPENSSL_assert(n < (int)sizeof(ctx->enc_data));
252 d[n++]=tmp; 255 d[n++] = tmp;
253 ln++; 256 ln++;
254 } 257 } else if (v == B64_ERROR) {
255 else if (v == B64_ERROR) 258 rv = -1;
256 {
257 rv= -1;
258 goto end; 259 goto end;
259 } 260 }
260 261
261 /* have we seen a '=' which is 'definitly' the last 262 /* have we seen a '=' which is 'definitly' the last
262 * input line. seof will point to the character that 263 * input line. seof will point to the character that
263 * holds it. and eof will hold how many characters to 264 * holds it. and eof will hold how many characters to
264 * chop off. */ 265 * chop off. */
265 if (tmp == '=') 266 if (tmp == '=') {
266 { 267 if (seof == -1)
267 if (seof == -1) seof=n; 268 seof = n;
268 eof++; 269 eof++;
269 } 270 }
270 271
271 if (v == B64_CR) 272 if (v == B64_CR) {
272 {
273 ln = 0; 273 ln = 0;
274 if (exp_nl) 274 if (exp_nl)
275 continue; 275 continue;
276 } 276 }
277 277
278 /* eoln */ 278 /* eoln */
279 if (v == B64_EOLN) 279 if (v == B64_EOLN) {
280 { 280 ln = 0;
281 ln=0; 281 if (exp_nl) {
282 if (exp_nl) 282 exp_nl = 0;
283 {
284 exp_nl=0;
285 continue; 283 continue;
286 }
287 } 284 }
288 exp_nl=0; 285 }
286 exp_nl = 0;
289 287
290 /* If we are at the end of input and it looks like a 288 /* If we are at the end of input and it looks like a
291 * line, process it. */ 289 * line, process it. */
292 if (((i+1) == inl) && (((n&3) == 0) || eof)) 290 if (((i + 1) == inl) && (((n&3) == 0) || eof)) {
293 { 291 v = B64_EOF;
294 v=B64_EOF;
295 /* In case things were given us in really small 292 /* In case things were given us in really small
296 records (so two '=' were given in separate 293 records (so two '=' were given in separate
297 updates), eof may contain the incorrect number 294 updates), eof may contain the incorrect number
298 of ending bytes to skip, so let's redo the count */ 295 of ending bytes to skip, so let's redo the count */
299 eof = 0; 296 eof = 0;
300 if (d[n-1] == '=') eof++; 297 if (d[n-1] == '=')
301 if (d[n-2] == '=') eof++; 298 eof++;
299 if (d[n-2] == '=')
300 eof++;
302 /* There will never be more than two '=' */ 301 /* There will never be more than two '=' */
303 } 302 }
304 303
305 if ((v == B64_EOF && (n&3) == 0) || (n >= 64)) 304 if ((v == B64_EOF && (n&3) == 0) || (n >= 64)) {
306 {
307 /* This is needed to work correctly on 64 byte input 305 /* This is needed to work correctly on 64 byte input
308 * lines. We process the line and then need to 306 * lines. We process the line and then need to
309 * accept the '\n' */ 307 * accept the '\n' */
310 if ((v != B64_EOF) && (n >= 64)) exp_nl=1; 308 if ((v != B64_EOF) && (n >= 64))
311 if (n > 0) 309 exp_nl = 1;
312 { 310 if (n > 0) {
313 v=EVP_DecodeBlock(out,d,n); 311 v = EVP_DecodeBlock(out, d, n);
314 n=0; 312 n = 0;
315 if (v < 0) { rv=0; goto end; } 313 if (v < 0) {
316 ret+=(v-eof); 314 rv = 0;
317 } 315 goto end;
318 else
319 {
320 eof=1;
321 v=0;
322 } 316 }
317 ret += (v - eof);
318 } else {
319 eof = 1;
320 v = 0;
321 }
323 322
324 /* This is the case where we have had a short 323 /* This is the case where we have had a short
325 * but valid input line */ 324 * but valid input line */
326 if ((v < ctx->length) && eof) 325 if ((v < ctx->length) && eof) {
327 { 326 rv = 0;
328 rv=0;
329 goto end; 327 goto end;
330 } 328 } else
331 else 329 ctx->length = v;
332 ctx->length=v;
333 330
334 if (seof >= 0) { rv=0; goto end; } 331 if (seof >= 0) {
335 out+=v; 332 rv = 0;
333 goto end;
336 } 334 }
335 out += v;
337 } 336 }
338 rv=1;
339end:
340 *outl=ret;
341 ctx->num=n;
342 ctx->line_num=ln;
343 ctx->expect_nl=exp_nl;
344 return(rv);
345 } 337 }
338 rv = 1;
346 339
347int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n) 340end:
348 { 341 *outl = ret;
349 int i,ret=0,a,b,c,d; 342 ctx->num = n;
343 ctx->line_num = ln;
344 ctx->expect_nl = exp_nl;
345 return (rv);
346}
347
348int
349EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n)
350{
351 int i, ret = 0, a,b, c, d;
350 unsigned long l; 352 unsigned long l;
351 353
352 /* trim white space from the start of the line. */ 354 /* trim white space from the start of the line. */
353 while ((conv_ascii2bin(*f) == B64_WS) && (n > 0)) 355 while ((conv_ascii2bin(*f) == B64_WS) && (n > 0)) {
354 {
355 f++; 356 f++;
356 n--; 357 n--;
357 } 358 }
358 359
359 /* strip off stuff at the end of the line 360 /* strip off stuff at the end of the line
360 * ascii2bin values B64_WS, B64_EOLN, B64_EOLN and B64_EOF */ 361 * ascii2bin values B64_WS, B64_EOLN, B64_EOLN and B64_EOF */
361 while ((n > 3) && (B64_NOT_BASE64(conv_ascii2bin(f[n-1])))) 362 while ((n > 3) && (B64_NOT_BASE64(conv_ascii2bin(f[n - 1]))))
362 n--; 363 n--;
363 364
364 if (n%4 != 0) return(-1); 365 if (n % 4 != 0)
365 366 return (-1);
366 for (i=0; i<n; i+=4) 367
367 { 368 for (i = 0; i < n; i += 4) {
368 a=conv_ascii2bin(*(f++)); 369 a = conv_ascii2bin(*(f++));
369 b=conv_ascii2bin(*(f++)); 370 b = conv_ascii2bin(*(f++));
370 c=conv_ascii2bin(*(f++)); 371 c = conv_ascii2bin(*(f++));
371 d=conv_ascii2bin(*(f++)); 372 d = conv_ascii2bin(*(f++));
372 if ( (a & 0x80) || (b & 0x80) || 373 if ((a & 0x80) || (b & 0x80) ||
373 (c & 0x80) || (d & 0x80)) 374 (c & 0x80) || (d & 0x80))
374 return(-1); 375 return (-1);
375 l=( (((unsigned long)a)<<18L)| 376 l = ((((unsigned long)a) << 18L) |
376 (((unsigned long)b)<<12L)| 377 (((unsigned long)b) << 12L) |
377 (((unsigned long)c)<< 6L)| 378 (((unsigned long)c) << 6L) |
378 (((unsigned long)d) )); 379 (((unsigned long)d)));
379 *(t++)=(unsigned char)(l>>16L)&0xff; 380 *(t++) = (unsigned char)(l >> 16L) & 0xff;
380 *(t++)=(unsigned char)(l>> 8L)&0xff; 381 *(t++) = (unsigned char)(l >> 8L) & 0xff;
381 *(t++)=(unsigned char)(l )&0xff; 382 *(t++) = (unsigned char)(l) & 0xff;
382 ret+=3; 383 ret += 3;
383 }
384 return(ret);
385 } 384 }
385 return (ret);
386}
386 387
387int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl) 388int
388 { 389EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl)
390{
389 int i; 391 int i;
390 392
391 *outl=0; 393 *outl = 0;
392 if (ctx->num != 0) 394 if (ctx->num != 0) {
393 { 395 i = EVP_DecodeBlock(out, ctx->enc_data, ctx->num);
394 i=EVP_DecodeBlock(out,ctx->enc_data,ctx->num); 396 if (i < 0)
395 if (i < 0) return(-1); 397 return (-1);
396 ctx->num=0; 398 ctx->num = 0;
397 *outl=i; 399 *outl = i;
398 return(1); 400 return (1);
399 } 401 } else
400 else 402 return (1);
401 return(1); 403}
402 }
403 404
404#ifdef undef 405#ifdef undef
405int EVP_DecodeValid(unsigned char *buf, int len) 406int
406 { 407EVP_DecodeValid(unsigned char *buf, int len)
407 int i,num=0,bad=0; 408{
408 409 int i, num = 0, bad = 0;
409 if (len == 0) return(-1); 410
410 while (conv_ascii2bin(*buf) == B64_WS) 411 if (len == 0)
411 { 412 return (-1);
413 while (conv_ascii2bin(*buf) == B64_WS) {
412 buf++; 414 buf++;
413 len--; 415 len--;
414 if (len == 0) return(-1); 416 if (len == 0)
415 } 417 return (-1);
418 }
416 419
417 for (i=len; i >= 4; i-=4) 420 for (i = len; i >= 4; i -= 4) {
418 { 421 if ((conv_ascii2bin(buf[0]) >= 0x40) ||
419 if ( (conv_ascii2bin(buf[0]) >= 0x40) || 422 (conv_ascii2bin(buf[1]) >= 0x40) ||
420 (conv_ascii2bin(buf[1]) >= 0x40) || 423 (conv_ascii2bin(buf[2]) >= 0x40) ||
421 (conv_ascii2bin(buf[2]) >= 0x40) || 424 (conv_ascii2bin(buf[3]) >= 0x40))
422 (conv_ascii2bin(buf[3]) >= 0x40)) 425 return (-1);
423 return(-1); 426 buf += 4;
424 buf+=4; 427 num += 1 + (buf[2] != '=') + (buf[3] != '=');
425 num+=1+(buf[2] != '=')+(buf[3] != '='); 428 }
426 }
427 if ((i == 1) && (conv_ascii2bin(buf[0]) == B64_EOLN)) 429 if ((i == 1) && (conv_ascii2bin(buf[0]) == B64_EOLN))
428 return(num); 430 return (num);
429 if ((i == 2) && (conv_ascii2bin(buf[0]) == B64_EOLN) && 431 if ((i == 2) && (conv_ascii2bin(buf[0]) == B64_EOLN) &&
430 (conv_ascii2bin(buf[0]) == B64_EOLN)) 432 (conv_ascii2bin(buf[0]) == B64_EOLN))
431 return(num); 433 return (num);
432 return(1); 434 return (1);
433 } 435}
434#endif 436#endif