OpenCoverage

bio_b64.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/evp/bio_b64.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: bio_b64.c,v 1.22 2018/08/24 19:47:25 tb Exp $ */-
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)-
3 * All rights reserved.-
4 *-
5 * This package is an SSL implementation written-
6 * by Eric Young (eay@cryptsoft.com).-
7 * The implementation was written so as to conform with Netscapes SSL.-
8 *-
9 * This library is free for commercial and non-commercial use as long as-
10 * the following conditions are aheared to. The following conditions-
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-
13 * included with this distribution is covered by the same copyright terms-
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).-
15 *-
16 * Copyright remains Eric Young's, and as such any Copyright notices in-
17 * the code are not to be removed.-
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.-
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.-
22 *-
23 * Redistribution and use in source and binary forms, with or without-
24 * modification, are permitted provided that the following conditions-
25 * are met:-
26 * 1. Redistributions of source code must retain the copyright-
27 * notice, this list of conditions and the following disclaimer.-
28 * 2. Redistributions in binary form must reproduce the above copyright-
29 * notice, this list of conditions and the following disclaimer in the-
30 * documentation and/or other materials provided with the distribution.-
31 * 3. All advertising materials mentioning features or use of this software-
32 * must display the following acknowledgement:-
33 * "This product includes cryptographic software written by-
34 * Eric Young (eay@cryptsoft.com)"-
35 * The word 'cryptographic' can be left out if the rouines from the library-
36 * being used are not cryptographic related :-).-
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:-
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"-
40 *-
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND-
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE-
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS-
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT-
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-
51 * SUCH DAMAGE.-
52 *-
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-
55 * copied and put under another distribution licence-
56 * [including the GNU Public Licence.]-
57 */-
58-
59#include <errno.h>-
60#include <stdio.h>-
61#include <string.h>-
62-
63#include <openssl/buffer.h>-
64#include <openssl/evp.h>-
65-
66static int b64_write(BIO *h, const char *buf, int num);-
67static int b64_read(BIO *h, char *buf, int size);-
68static int b64_puts(BIO *h, const char *str);-
69/*static int b64_gets(BIO *h, char *str, int size); */-
70static long b64_ctrl(BIO *h, int cmd, long arg1, void *arg2);-
71static int b64_new(BIO *h);-
72static int b64_free(BIO *data);-
73static long b64_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);-
74#define B64_BLOCK_SIZE 1024-
75#define B64_BLOCK_SIZE2 768-
76#define B64_NONE 0-
77#define B64_ENCODE 1-
78#define B64_DECODE 2-
79-
80typedef struct b64_struct {-
81 /*BIO *bio; moved to the BIO structure */-
82 int buf_len;-
83 int buf_off;-
84 int tmp_len; /* used to find the start when decoding */-
85 int tmp_nl; /* If true, scan until '\n' */-
86 int encode;-
87 int start; /* have we started decoding yet? */-
88 int cont; /* <= 0 when finished */-
89 EVP_ENCODE_CTX base64;-
90 char buf[EVP_ENCODE_LENGTH(B64_BLOCK_SIZE) + 10];-
91 char tmp[B64_BLOCK_SIZE];-
92} BIO_B64_CTX;-
93-
94static const BIO_METHOD methods_b64 = {-
95 .type = BIO_TYPE_BASE64,-
96 .name = "base64 encoding",-
97 .bwrite = b64_write,-
98 .bread = b64_read,-
99 .bputs = b64_puts,-
100 .ctrl = b64_ctrl,-
101 .create = b64_new,-
102 .destroy = b64_free,-
103 .callback_ctrl = b64_callback_ctrl-
104};-
105-
106const BIO_METHOD *-
107BIO_f_base64(void)-
108{-
109 return (&methods_b64);
executed 253 times by 2 tests: return (&methods_b64);
Executed by:
  • base64test
  • libcrypto.so.44.0.1
253
110}-
111-
112static int-
113b64_new(BIO *bi)-
114{-
115 BIO_B64_CTX *ctx;-
116-
117 ctx = malloc(sizeof(BIO_B64_CTX));-
118 if (ctx == NULL)
ctx == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 253 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-253
119 return (0);
never executed: return (0);
0
120-
121 ctx->buf_len = 0;-
122 ctx->tmp_len = 0;-
123 ctx->tmp_nl = 0;-
124 ctx->buf_off = 0;-
125 ctx->cont = 1;-
126 ctx->start = 1;-
127 ctx->encode = 0;-
128-
129 bi->init = 1;-
130 bi->ptr = (char *)ctx;-
131 bi->flags = 0;-
132 bi->num = 0;-
133 return (1);
executed 253 times by 2 tests: return (1);
Executed by:
  • base64test
  • libcrypto.so.44.0.1
253
134}-
135-
136static int-
137b64_free(BIO *a)-
138{-
139 if (a == NULL)
a == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 253 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-253
140 return (0);
never executed: return (0);
0
141 free(a->ptr);-
142 a->ptr = NULL;-
143 a->init = 0;-
144 a->flags = 0;-
145 return (1);
executed 253 times by 2 tests: return (1);
Executed by:
  • base64test
  • libcrypto.so.44.0.1
253
146}-
147-
148static int-
149b64_read(BIO *b, char *out, int outl)-
150{-
151 int ret = 0, i, ii, j, k, x, n, num, ret_code = 0;-
152 BIO_B64_CTX *ctx;-
153 unsigned char *p, *q;-
154-
155 if (out == NULL)
out == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 298 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-298
156 return (0);
never executed: return (0);
0
157 ctx = (BIO_B64_CTX *)b->ptr;-
158-
159 if ((ctx == NULL) || (b->next_bio == NULL))
(ctx == ((void *)0) )Description
TRUEnever evaluated
FALSEevaluated 298 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
(b->next_bio == ((void *)0) )Description
TRUEnever evaluated
FALSEevaluated 298 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-298
160 return (0);
never executed: return (0);
0
161-
162 BIO_clear_retry_flags(b);-
163-
164 if (ctx->encode != B64_DECODE) {
ctx->encode != 2Description
TRUEevaluated 150 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 148 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
148-150
165 ctx->encode = B64_DECODE;-
166 ctx->buf_len = 0;-
167 ctx->buf_off = 0;-
168 ctx->tmp_len = 0;-
169 EVP_DecodeInit(&(ctx->base64));-
170 }
executed 150 times by 2 tests: end of block
Executed by:
  • base64test
  • libcrypto.so.44.0.1
150
171-
172 /* First check if there are bytes decoded/encoded */-
173 if (ctx->buf_len > 0) {
ctx->buf_len > 0Description
TRUEevaluated 98 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
FALSEevaluated 200 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
98-200
174 OPENSSL_assert(ctx->buf_len >= ctx->buf_off);-
175 i = ctx->buf_len - ctx->buf_off;-
176 if (i > outl)
i > outlDescription
TRUEevaluated 49 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
FALSEevaluated 49 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
49
177 i = outl;
executed 49 times by 1 test: i = outl;
Executed by:
  • libcrypto.so.44.0.1
49
178 OPENSSL_assert(ctx->buf_off + i < (int)sizeof(ctx->buf));-
179 memcpy(out, &(ctx->buf[ctx->buf_off]), i);-
180 ret = i;-
181 out += i;-
182 outl -= i;-
183 ctx->buf_off += i;-
184 if (ctx->buf_len == ctx->buf_off) {
ctx->buf_len == ctx->buf_offDescription
TRUEevaluated 49 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
FALSEevaluated 49 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
49
185 ctx->buf_len = 0;-
186 ctx->buf_off = 0;-
187 }
executed 49 times by 1 test: end of block
Executed by:
  • libcrypto.so.44.0.1
49
188 }
executed 98 times by 1 test: end of block
Executed by:
  • libcrypto.so.44.0.1
98
189-
190 /* At this point, we have room of outl bytes and an empty-
191 * buffer, so we should read in some more. */-
192-
193 ret_code = 0;-
194 while (outl > 0) {
outl > 0Description
TRUEevaluated 464 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 98 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
98-464
195 if (ctx->cont <= 0)
ctx->cont <= 0Description
TRUEevaluated 124 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 340 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
124-340
196 break;
executed 124 times by 2 tests: break;
Executed by:
  • base64test
  • libcrypto.so.44.0.1
124
197-
198 i = BIO_read(b->next_bio, &(ctx->tmp[ctx->tmp_len]),-
199 B64_BLOCK_SIZE - ctx->tmp_len);-
200-
201 if (i <= 0) {
i <= 0Description
TRUEevaluated 142 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 198 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
142-198
202 ret_code = i;-
203-
204 /* Should we continue next time we are called? */-
205 if (!BIO_should_retry(b->next_bio)) {
!BIO_test_flag...ext_bio, 0x08)Description
TRUEevaluated 142 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEnever evaluated
0-142
206 ctx->cont = i;-
207 /* If buffer empty break */-
208 if (ctx->tmp_len == 0)
ctx->tmp_len == 0Description
TRUEevaluated 68 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 74 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
68-74
209 break;
executed 68 times by 1 test: break;
Executed by:
  • base64test
68
210 /* Fall through and process what we have */-
211 else-
212 i = 0;
executed 74 times by 2 tests: i = 0;
Executed by:
  • base64test
  • libcrypto.so.44.0.1
74
213 }-
214 /* else we retry and add more data to buffer */-
215 else-
216 break;
never executed: break;
0
217 }-
218 i += ctx->tmp_len;-
219 ctx->tmp_len = i;-
220-
221 /* We need to scan, a line at a time until we-
222 * have a valid line if we are starting. */-
223 if (ctx->start && (BIO_get_flags(b) & BIO_FLAGS_BASE64_NO_NL)) {
ctx->startDescription
TRUEevaluated 172 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 100 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
(BIO_test_flag...0x0)) & 0x100)Description
TRUEevaluated 60 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 112 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
60-172
224 /* ctx->start=1; */-
225 ctx->tmp_len = 0;-
226 } else if (ctx->start) {
executed 60 times by 1 test: end of block
Executed by:
  • base64test
ctx->startDescription
TRUEevaluated 112 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 100 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
60-112
227 q = p =(unsigned char *)ctx->tmp;-
228 num = 0;-
229 for (j = 0; j < i; j++) {
j < iDescription
TRUEevaluated 3890 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 24 times by 1 test
Evaluated by:
  • base64test
24-3890
230 if (*(q++) != '\n')
*(q++) != '\n'Description
TRUEevaluated 3778 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 112 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
112-3778
231 continue;
executed 3778 times by 2 tests: continue;
Executed by:
  • base64test
  • libcrypto.so.44.0.1
3778
232-
233 /* due to a previous very long line,-
234 * we need to keep on scanning for a '\n'-
235 * before we even start looking for-
236 * base64 encoded stuff. */-
237 if (ctx->tmp_nl) {
ctx->tmp_nlDescription
TRUEnever evaluated
FALSEevaluated 112 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-112
238 p = q;-
239 ctx->tmp_nl = 0;-
240 continue;
never executed: continue;
0
241 }-
242-
243 k = EVP_DecodeUpdate(&(ctx->base64),-
244 (unsigned char *)ctx->buf,-
245 &num, p, q - p);-
246 if ((k <= 0) && (num == 0) && (ctx->start))
(k <= 0)Description
TRUEevaluated 43 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 69 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
(num == 0)Description
TRUEevaluated 24 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 19 times by 1 test
Evaluated by:
  • base64test
(ctx->start)Description
TRUEevaluated 24 times by 1 test
Evaluated by:
  • base64test
FALSEnever evaluated
0-69
247 EVP_DecodeInit(&ctx->base64);
executed 24 times by 1 test: EVP_DecodeInit(&ctx->base64);
Executed by:
  • base64test
24
248 else {-
249 if (p != (unsigned char *)
p != (unsigned...&(ctx->tmp[0])Description
TRUEnever evaluated
FALSEevaluated 88 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-88
250 &(ctx->tmp[0])) {
p != (unsigned...&(ctx->tmp[0])Description
TRUEnever evaluated
FALSEevaluated 88 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-88
251 i -= (p - (unsigned char *)-
252 &(ctx->tmp[0]));-
253 for (x = 0; x < i; x++)
x < iDescription
TRUEnever evaluated
FALSEnever evaluated
0
254 ctx->tmp[x] = p[x];
never executed: ctx->tmp[x] = p[x];
0
255 }
never executed: end of block
0
256 EVP_DecodeInit(&ctx->base64);-
257 ctx->start = 0;-
258 break;
executed 88 times by 2 tests: break;
Executed by:
  • base64test
  • libcrypto.so.44.0.1
88
259 }-
260 p = q;-
261 }
executed 24 times by 1 test: end of block
Executed by:
  • base64test
24
262-
263 /* we fell off the end without starting */-
264 if ((j == i) && (num == 0)) {
(j == i)Description
TRUEevaluated 24 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 88 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
(num == 0)Description
TRUEevaluated 24 times by 1 test
Evaluated by:
  • base64test
FALSEnever evaluated
0-88
265 /* Is this is one long chunk?, if so, keep on-
266 * reading until a new line. */-
267 if (p == (unsigned char *)&(ctx->tmp[0])) {
p == (unsigned...&(ctx->tmp[0])Description
TRUEnever evaluated
FALSEevaluated 24 times by 1 test
Evaluated by:
  • base64test
0-24
268 /* Check buffer full */-
269 if (i == B64_BLOCK_SIZE) {
i == 1024Description
TRUEnever evaluated
FALSEnever evaluated
0
270 ctx->tmp_nl = 1;-
271 ctx->tmp_len = 0;-
272 }
never executed: end of block
0
273 }
never executed: end of block
0
274 else if (p != q) /* finished on a '\n' */
p != qDescription
TRUEnever evaluated
FALSEevaluated 24 times by 1 test
Evaluated by:
  • base64test
0-24
275 {-
276 n = q - p;-
277 for (ii = 0; ii < n; ii++)
ii < nDescription
TRUEnever evaluated
FALSEnever evaluated
0
278 ctx->tmp[ii] = p[ii];
never executed: ctx->tmp[ii] = p[ii];
0
279 ctx->tmp_len = n;-
280 }
never executed: end of block
0
281 /* else finished on a '\n' */-
282 continue;
executed 24 times by 1 test: continue;
Executed by:
  • base64test
24
283 } else {-
284 ctx->tmp_len = 0;-
285 }
executed 88 times by 2 tests: end of block
Executed by:
  • base64test
  • libcrypto.so.44.0.1
88
286 } else if ((i < B64_BLOCK_SIZE) && (ctx->cont > 0)) {
(i < 1024)Description
TRUEevaluated 100 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
FALSEnever evaluated
(ctx->cont > 0)Description
TRUEevaluated 50 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
FALSEevaluated 50 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
0-100
287 /* If buffer isn't full and we can retry then-
288 * restart to read in more data.-
289 */-
290 continue;
executed 50 times by 1 test: continue;
Executed by:
  • libcrypto.so.44.0.1
50
291 }-
292-
293 if (BIO_get_flags(b) & BIO_FLAGS_BASE64_NO_NL) {
BIO_test_flags...(0x0)) & 0x100Description
TRUEevaluated 60 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 138 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
60-138
294 int z, jj;-
295-
296 jj = i & ~3; /* process per 4 */-
297 z = EVP_DecodeBlock((unsigned char *)ctx->buf,-
298 (unsigned char *)ctx->tmp, jj);-
299 if (jj > 2) {
jj > 2Description
TRUEevaluated 45 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 15 times by 1 test
Evaluated by:
  • base64test
15-45
300 if (ctx->tmp[jj-1] == '=') {
ctx->tmp[jj-1] == '='Description
TRUEevaluated 27 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 18 times by 1 test
Evaluated by:
  • base64test
18-27
301 z--;-
302 if (ctx->tmp[jj-2] == '=')
ctx->tmp[jj-2] == '='Description
TRUEevaluated 17 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • base64test
10-17
303 z--;
executed 17 times by 1 test: z--;
Executed by:
  • base64test
17
304 }
executed 27 times by 1 test: end of block
Executed by:
  • base64test
27
305 }
executed 45 times by 1 test: end of block
Executed by:
  • base64test
45
306 /* z is now number of output bytes and jj is the-
307 * number consumed */-
308 if (jj != i) {
jj != iDescription
TRUEevaluated 30 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 30 times by 1 test
Evaluated by:
  • base64test
30
309 memmove(ctx->tmp, &ctx->tmp[jj], i - jj);-
310 ctx->tmp_len = i - jj;-
311 }
executed 30 times by 1 test: end of block
Executed by:
  • base64test
30
312 ctx->buf_len = 0;-
313 if (z > 0) {
z > 0Description
TRUEevaluated 37 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 23 times by 1 test
Evaluated by:
  • base64test
23-37
314 ctx->buf_len = z;-
315 }
executed 37 times by 1 test: end of block
Executed by:
  • base64test
37
316 i = z;-
317 } else {
executed 60 times by 1 test: end of block
Executed by:
  • base64test
60
318 i = EVP_DecodeUpdate(&(ctx->base64),-
319 (unsigned char *)ctx->buf, &ctx->buf_len,-
320 (unsigned char *)ctx->tmp, i);-
321 ctx->tmp_len = 0;-
322 }
executed 138 times by 2 tests: end of block
Executed by:
  • base64test
  • libcrypto.so.44.0.1
138
323 ctx->buf_off = 0;-
324 if (i < 0) {
i < 0Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 190 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
8-190
325 ret_code = 0;-
326 ctx->buf_len = 0;-
327 break;
executed 8 times by 1 test: break;
Executed by:
  • base64test
8
328 }-
329-
330 if (ctx->buf_len <= outl)
ctx->buf_len <= outlDescription
TRUEevaluated 141 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 49 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
49-141
331 i = ctx->buf_len;
executed 141 times by 2 tests: i = ctx->buf_len;
Executed by:
  • base64test
  • libcrypto.so.44.0.1
141
332 else-
333 i = outl;
executed 49 times by 1 test: i = outl;
Executed by:
  • libcrypto.so.44.0.1
49
334-
335 memcpy(out, ctx->buf, i);-
336 ret += i;-
337 ctx->buf_off = i;-
338 if (ctx->buf_off == ctx->buf_len) {
ctx->buf_off == ctx->buf_lenDescription
TRUEevaluated 141 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 49 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
49-141
339 ctx->buf_len = 0;-
340 ctx->buf_off = 0;-
341 }
executed 141 times by 2 tests: end of block
Executed by:
  • base64test
  • libcrypto.so.44.0.1
141
342 outl -= i;-
343 out += i;-
344 }
executed 190 times by 2 tests: end of block
Executed by:
  • base64test
  • libcrypto.so.44.0.1
190
345 /* BIO_clear_retry_flags(b); */-
346 BIO_copy_next_retry(b);-
347 return ((ret == 0) ? ret_code : ret);
executed 298 times by 2 tests: return ((ret == 0) ? ret_code : ret);
Executed by:
  • base64test
  • libcrypto.so.44.0.1
(ret == 0)Description
TRUEevaluated 81 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 217 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
81-298
348}-
349-
350static int-
351b64_write(BIO *b, const char *in, int inl)-
352{-
353 int ret = 0;-
354 int n;-
355 int i;-
356 BIO_B64_CTX *ctx;-
357-
358 ctx = (BIO_B64_CTX *)b->ptr;-
359 BIO_clear_retry_flags(b);-
360-
361 if (ctx->encode != B64_ENCODE) {
ctx->encode != 1Description
TRUEevaluated 103 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 194 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
103-194
362 ctx->encode = B64_ENCODE;-
363 ctx->buf_len = 0;-
364 ctx->buf_off = 0;-
365 ctx->tmp_len = 0;-
366 EVP_EncodeInit(&(ctx->base64));-
367 }
executed 103 times by 2 tests: end of block
Executed by:
  • base64test
  • libcrypto.so.44.0.1
103
368-
369 OPENSSL_assert(ctx->buf_off < (int)sizeof(ctx->buf));-
370 OPENSSL_assert(ctx->buf_len <= (int)sizeof(ctx->buf));-
371 OPENSSL_assert(ctx->buf_len >= ctx->buf_off);-
372 n = ctx->buf_len - ctx->buf_off;-
373 while (n > 0) {
n > 0Description
TRUEevaluated 74 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 297 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
74-297
374 i = BIO_write(b->next_bio, &(ctx->buf[ctx->buf_off]), n);-
375 if (i <= 0) {
i <= 0Description
TRUEnever evaluated
FALSEevaluated 74 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-74
376 BIO_copy_next_retry(b);-
377 return (i);
never executed: return (i);
0
378 }-
379 OPENSSL_assert(i <= n);-
380 ctx->buf_off += i;-
381 OPENSSL_assert(ctx->buf_off <= (int)sizeof(ctx->buf));-
382 OPENSSL_assert(ctx->buf_len >= ctx->buf_off);-
383 n -= i;-
384 }
executed 74 times by 2 tests: end of block
Executed by:
  • base64test
  • libcrypto.so.44.0.1
74
385 /* at this point all pending data has been written */-
386 ctx->buf_off = 0;-
387 ctx->buf_len = 0;-
388-
389 if ((in == NULL) || (inl <= 0))
(in == ((void *)0) )Description
TRUEevaluated 74 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 223 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
(inl <= 0)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 221 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
2-223
390 return (0);
executed 76 times by 2 tests: return (0);
Executed by:
  • base64test
  • libcrypto.so.44.0.1
76
391-
392 while (inl > 0) {
inl > 0Description
TRUEevaluated 235 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 204 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
204-235
393 n = (inl > B64_BLOCK_SIZE) ? B64_BLOCK_SIZE : inl;
(inl > 1024)Description
TRUEnever evaluated
FALSEevaluated 235 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-235
394-
395 if (BIO_get_flags(b) & BIO_FLAGS_BASE64_NO_NL) {
BIO_test_flags...(0x0)) & 0x100Description
TRUEevaluated 36 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 199 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
36-199
396 if (ctx->tmp_len > 0) {
ctx->tmp_len > 0Description
TRUEnever evaluated
FALSEevaluated 36 times by 1 test
Evaluated by:
  • base64test
0-36
397 OPENSSL_assert(ctx->tmp_len <= 3);-
398 n = 3 - ctx->tmp_len;-
399 /* There's a theoretical possibility for this */-
400 if (n > inl)
n > inlDescription
TRUEnever evaluated
FALSEnever evaluated
0
401 n = inl;
never executed: n = inl;
0
402 memcpy(&(ctx->tmp[ctx->tmp_len]), in, n);-
403 ctx->tmp_len += n;-
404 ret += n;-
405 if (ctx->tmp_len < 3)
ctx->tmp_len < 3Description
TRUEnever evaluated
FALSEnever evaluated
0
406 break;
never executed: break;
0
407 ctx->buf_len = EVP_EncodeBlock(-
408 (unsigned char *)ctx->buf,-
409 (unsigned char *)ctx->tmp, ctx->tmp_len);-
410 OPENSSL_assert(ctx->buf_len <=-
411 (int)sizeof(ctx->buf));-
412 OPENSSL_assert(ctx->buf_len >= ctx->buf_off);-
413 /* Since we're now done using the temporary-
414 buffer, the length should be 0'd */-
415 ctx->tmp_len = 0;-
416 } else {
never executed: end of block
0
417 if (n < 3) {
n < 3Description
TRUEevaluated 17 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 19 times by 1 test
Evaluated by:
  • base64test
17-19
418 memcpy(ctx->tmp, in, n);-
419 ctx->tmp_len = n;-
420 ret += n;-
421 break;
executed 17 times by 1 test: break;
Executed by:
  • base64test
17
422 }-
423 n -= n % 3;-
424 ctx->buf_len = EVP_EncodeBlock(-
425 (unsigned char *)ctx->buf,-
426 (const unsigned char *)in, n);-
427 OPENSSL_assert(ctx->buf_len <=-
428 (int)sizeof(ctx->buf));-
429 OPENSSL_assert(ctx->buf_len >= ctx->buf_off);-
430 ret += n;-
431 }
executed 19 times by 1 test: end of block
Executed by:
  • base64test
19
432 } else {-
433 if (!EVP_EncodeUpdate(&(ctx->base64),
!EVP_EncodeUpd... char *)in, n)Description
TRUEnever evaluated
FALSEevaluated 199 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-199
434 (unsigned char *)ctx->buf, &ctx->buf_len,
!EVP_EncodeUpd... char *)in, n)Description
TRUEnever evaluated
FALSEevaluated 199 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-199
435 (unsigned char *)in, n))
!EVP_EncodeUpd... char *)in, n)Description
TRUEnever evaluated
FALSEevaluated 199 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-199
436 return ((ret == 0) ? -1 : ret);
never executed: return ((ret == 0) ? -1 : ret);
(ret == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
437 OPENSSL_assert(ctx->buf_len <= (int)sizeof(ctx->buf));-
438 OPENSSL_assert(ctx->buf_len >= ctx->buf_off);-
439 ret += n;-
440 }
executed 199 times by 2 tests: end of block
Executed by:
  • base64test
  • libcrypto.so.44.0.1
199
441 inl -= n;-
442 in += n;-
443-
444 ctx->buf_off = 0;-
445 n = ctx->buf_len;-
446 while (n > 0) {
n > 0Description
TRUEevaluated 91 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 218 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
91-218
447 i = BIO_write(b->next_bio, &(ctx->buf[ctx->buf_off]), n);-
448 if (i <= 0) {
i <= 0Description
TRUEnever evaluated
FALSEevaluated 91 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-91
449 BIO_copy_next_retry(b);-
450 return ((ret == 0) ? i : ret);
never executed: return ((ret == 0) ? i : ret);
(ret == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
451 }-
452 OPENSSL_assert(i <= n);-
453 n -= i;-
454 ctx->buf_off += i;-
455 OPENSSL_assert(ctx->buf_off <= (int)sizeof(ctx->buf));-
456 OPENSSL_assert(ctx->buf_len >= ctx->buf_off);-
457 }
executed 91 times by 2 tests: end of block
Executed by:
  • base64test
  • libcrypto.so.44.0.1
91
458 ctx->buf_len = 0;-
459 ctx->buf_off = 0;-
460 }
executed 218 times by 2 tests: end of block
Executed by:
  • base64test
  • libcrypto.so.44.0.1
218
461 return (ret);
executed 221 times by 2 tests: return (ret);
Executed by:
  • base64test
  • libcrypto.so.44.0.1
221
462}-
463-
464static long-
465b64_ctrl(BIO *b, int cmd, long num, void *ptr)-
466{-
467 BIO_B64_CTX *ctx;-
468 long ret = 1;-
469 int i;-
470-
471 ctx = (BIO_B64_CTX *)b->ptr;-
472-
473 switch (cmd) {-
474 case BIO_CTRL_RESET:
never executed: case 1:
0
475 ctx->cont = 1;-
476 ctx->start = 1;-
477 ctx->encode = B64_NONE;-
478 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);-
479 break;
never executed: break;
0
480 case BIO_CTRL_EOF: /* More to read */
never executed: case 2:
0
481 if (ctx->cont <= 0)
ctx->cont <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
482 ret = 1;
never executed: ret = 1;
0
483 else-
484 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
never executed: ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
0
485 break;
never executed: break;
0
486 case BIO_CTRL_WPENDING: /* More to write in buffer */
never executed: case 13:
0
487 OPENSSL_assert(ctx->buf_len >= ctx->buf_off);-
488 ret = ctx->buf_len - ctx->buf_off;-
489 if ((ret == 0) && (ctx->encode != B64_NONE) &&
(ret == 0)Description
TRUEnever evaluated
FALSEnever evaluated
(ctx->encode != 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
490 (ctx->base64.num != 0))
(ctx->base64.num != 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
491 ret = 1;
never executed: ret = 1;
0
492 else if (ret <= 0)
ret <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
493 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
never executed: ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
0
494 break;
never executed: break;
0
495 case BIO_CTRL_PENDING: /* More to read in buffer */
never executed: case 10:
0
496 OPENSSL_assert(ctx->buf_len >= ctx->buf_off);-
497 ret = ctx->buf_len - ctx->buf_off;-
498 if (ret <= 0)
ret <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
499 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
never executed: ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
0
500 break;
never executed: break;
0
501 case BIO_CTRL_FLUSH:
executed 103 times by 2 tests: case 11:
Executed by:
  • base64test
  • libcrypto.so.44.0.1
103
502 /* do a final write */-
503again:-
504 while (ctx->buf_len != ctx->buf_off) {
ctx->buf_len != ctx->buf_offDescription
TRUEevaluated 74 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 177 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
74-177
505 i = b64_write(b, NULL, 0);-
506 if (i < 0)
i < 0Description
TRUEnever evaluated
FALSEevaluated 74 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-74
507 return i;
never executed: return i;
0
508 }
executed 74 times by 2 tests: end of block
Executed by:
  • base64test
  • libcrypto.so.44.0.1
74
509 if (BIO_get_flags(b) & BIO_FLAGS_BASE64_NO_NL) {
BIO_test_flags...(0x0)) & 0x100Description
TRUEevaluated 40 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 137 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
40-137
510 if (ctx->tmp_len != 0) {
ctx->tmp_len != 0Description
TRUEevaluated 17 times by 1 test
Evaluated by:
  • base64test
FALSEevaluated 23 times by 1 test
Evaluated by:
  • base64test
17-23
511 ctx->buf_len = EVP_EncodeBlock(-
512 (unsigned char *)ctx->buf,-
513 (unsigned char *)ctx->tmp,-
514 ctx->tmp_len);-
515 ctx->buf_off = 0;-
516 ctx->tmp_len = 0;-
517 goto again;
executed 17 times by 1 test: goto again;
Executed by:
  • base64test
17
518 }-
519 } else if (ctx->encode != B64_NONE && ctx->base64.num != 0) {
executed 23 times by 1 test: end of block
Executed by:
  • base64test
ctx->encode != 0Description
TRUEevaluated 137 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEnever evaluated
ctx->base64.num != 0Description
TRUEevaluated 57 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
FALSEevaluated 80 times by 2 tests
Evaluated by:
  • base64test
  • libcrypto.so.44.0.1
0-137
520 ctx->buf_off = 0;-
521 EVP_EncodeFinal(&(ctx->base64),-
522 (unsigned char *)ctx->buf,-
523 &(ctx->buf_len));-
524 /* push out the bytes */-
525 goto again;
executed 57 times by 2 tests: goto again;
Executed by:
  • base64test
  • libcrypto.so.44.0.1
57
526 }-
527 /* Finally flush the underlying BIO */-
528 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);-
529 break;
executed 103 times by 2 tests: break;
Executed by:
  • base64test
  • libcrypto.so.44.0.1
103
530-
531 case BIO_C_DO_STATE_MACHINE:
never executed: case 101:
0
532 BIO_clear_retry_flags(b);-
533 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);-
534 BIO_copy_next_retry(b);-
535 break;
never executed: break;
0
536-
537 case BIO_CTRL_DUP:
never executed: case 12:
0
538 break;
never executed: break;
0
539 case BIO_CTRL_INFO:
executed 53 times by 1 test: case 3:
Executed by:
  • base64test
53
540 case BIO_CTRL_GET:
never executed: case 5:
0
541 case BIO_CTRL_SET:
never executed: case 4:
0
542 default:
executed 302 times by 2 tests: default:
Executed by:
  • base64test
  • libcrypto.so.44.0.1
302
543 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);-
544 break;
executed 355 times by 2 tests: break;
Executed by:
  • base64test
  • libcrypto.so.44.0.1
355
545 }-
546 return (ret);
executed 458 times by 2 tests: return (ret);
Executed by:
  • base64test
  • libcrypto.so.44.0.1
458
547}-
548-
549static long-
550b64_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)-
551{-
552 long ret = 1;-
553-
554 if (b->next_bio == NULL)
b->next_bio == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
555 return (0);
never executed: return (0);
0
556 switch (cmd) {-
557 default:
never executed: default:
0
558 ret = BIO_callback_ctrl(b->next_bio, cmd, fp);-
559 break;
never executed: break;
0
560 }-
561 return (ret);
never executed: return (ret);
0
562}-
563-
564static int-
565b64_puts(BIO *b, const char *str)-
566{-
567 return b64_write(b, str, strlen(str));
never executed: return b64_write(b, str, strlen(str));
0
568}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2