Coverage Report

Created: 2026-01-09 07:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl/crypto/evp/enc_b64_scalar.c
Line
Count
Source
1
#include <openssl/evp.h>
2
#include "internal/cryptlib.h"
3
#include "crypto/evp.h"
4
#include "evp_local.h"
5
#include "enc_b64_scalar.h"
6
7
static const unsigned char base64_srp_bin2ascii_0[256] = {
8
    '0', '0', '0', '0', '1', '1', '1', '1', '2', '2', '2', '2', '3', '3', '3', '3',
9
    '4', '4', '4', '4', '5', '5', '5', '5', '6', '6', '6', '6', '7', '7', '7', '7',
10
    '8', '8', '8', '8', '9', '9', '9', '9', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B',
11
    'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'E', 'E', 'E', 'E', 'F', 'F', 'F', 'F',
12
    'G', 'G', 'G', 'G', 'H', 'H', 'H', 'H', 'I', 'I', 'I', 'I', 'J', 'J', 'J', 'J',
13
    'K', 'K', 'K', 'K', 'L', 'L', 'L', 'L', 'M', 'M', 'M', 'M', 'N', 'N', 'N', 'N',
14
    'O', 'O', 'O', 'O', 'P', 'P', 'P', 'P', 'Q', 'Q', 'Q', 'Q', 'R', 'R', 'R', 'R',
15
    'S', 'S', 'S', 'S', 'T', 'T', 'T', 'T', 'U', 'U', 'U', 'U', 'V', 'V', 'V', 'V',
16
    'W', 'W', 'W', 'W', 'X', 'X', 'X', 'X', 'Y', 'Y', 'Y', 'Y', 'Z', 'Z', 'Z', 'Z',
17
    'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd', 'd', 'd', 'd',
18
    'e', 'e', 'e', 'e', 'f', 'f', 'f', 'f', 'g', 'g', 'g', 'g', 'h', 'h', 'h', 'h',
19
    'i', 'i', 'i', 'i', 'j', 'j', 'j', 'j', 'k', 'k', 'k', 'k', 'l', 'l', 'l', 'l',
20
    'm', 'm', 'm', 'm', 'n', 'n', 'n', 'n', 'o', 'o', 'o', 'o', 'p', 'p', 'p', 'p',
21
    'q', 'q', 'q', 'q', 'r', 'r', 'r', 'r', 's', 's', 's', 's', 't', 't', 't', 't',
22
    'u', 'u', 'u', 'u', 'v', 'v', 'v', 'v', 'w', 'w', 'w', 'w', 'x', 'x', 'x', 'x',
23
    'y', 'y', 'y', 'y', 'z', 'z', 'z', 'z', '.', '.', '.', '.', '/', '/', '/', '/'
24
};
25
26
static const unsigned char base64_srp_bin2ascii_1[256] = {
27
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
28
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
29
    'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
30
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '.', '/',
31
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
32
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
33
    'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
34
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '.', '/',
35
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
36
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
37
    'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
38
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '.', '/',
39
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
40
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
41
    'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
42
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '.', '/'
43
};
44
45
static const unsigned char base64_srp_bin2ascii_2[256] = {
46
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
47
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
48
    'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
49
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '.', '/',
50
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
51
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
52
    'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
53
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '.', '/',
54
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
55
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
56
    'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
57
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '.', '/',
58
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
59
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
60
    'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
61
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '.', '/'
62
};
63
64
static const unsigned char base64_std_bin2ascii_0[256] = {
65
    'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D',
66
    'D', 'E', 'E', 'E', 'E', 'F', 'F', 'F', 'F', 'G', 'G', 'G', 'G', 'H', 'H',
67
    'H', 'H', 'I', 'I', 'I', 'I', 'J', 'J', 'J', 'J', 'K', 'K', 'K', 'K', 'L',
68
    'L', 'L', 'L', 'M', 'M', 'M', 'M', 'N', 'N', 'N', 'N', 'O', 'O', 'O', 'O',
69
    'P', 'P', 'P', 'P', 'Q', 'Q', 'Q', 'Q', 'R', 'R', 'R', 'R', 'S', 'S', 'S',
70
    'S', 'T', 'T', 'T', 'T', 'U', 'U', 'U', 'U', 'V', 'V', 'V', 'V', 'W', 'W',
71
    'W', 'W', 'X', 'X', 'X', 'X', 'Y', 'Y', 'Y', 'Y', 'Z', 'Z', 'Z', 'Z', 'a',
72
    'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd', 'd', 'd', 'd',
73
    'e', 'e', 'e', 'e', 'f', 'f', 'f', 'f', 'g', 'g', 'g', 'g', 'h', 'h', 'h',
74
    'h', 'i', 'i', 'i', 'i', 'j', 'j', 'j', 'j', 'k', 'k', 'k', 'k', 'l', 'l',
75
    'l', 'l', 'm', 'm', 'm', 'm', 'n', 'n', 'n', 'n', 'o', 'o', 'o', 'o', 'p',
76
    'p', 'p', 'p', 'q', 'q', 'q', 'q', 'r', 'r', 'r', 'r', 's', 's', 's', 's',
77
    't', 't', 't', 't', 'u', 'u', 'u', 'u', 'v', 'v', 'v', 'v', 'w', 'w', 'w',
78
    'w', 'x', 'x', 'x', 'x', 'y', 'y', 'y', 'y', 'z', 'z', 'z', 'z', '0', '0',
79
    '0', '0', '1', '1', '1', '1', '2', '2', '2', '2', '3', '3', '3', '3', '4',
80
    '4', '4', '4', '5', '5', '5', '5', '6', '6', '6', '6', '7', '7', '7', '7',
81
    '8', '8', '8', '8', '9', '9', '9', '9', '+', '+', '+', '+', '/', '/', '/',
82
    '/'
83
};
84
85
static const unsigned char base64_std_bin2ascii_1[256] = {
86
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
87
    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
88
    'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
89
    't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
90
    '8', '9', '+', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
91
    'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
92
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
93
    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
94
    '4', '5', '6', '7', '8', '9', '+', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
95
    'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
96
    'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
97
    'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
98
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', 'A', 'B', 'C',
99
    'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
100
    'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
101
    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
102
    'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+',
103
    '/'
104
};
105
106
static const unsigned char base64_std_bin2ascii_2[256] = {
107
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
108
    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
109
    'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
110
    't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
111
    '8', '9', '+', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
112
    'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
113
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
114
    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
115
    '4', '5', '6', '7', '8', '9', '+', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
116
    'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
117
    'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
118
    'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
119
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', 'A', 'B', 'C',
120
    'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
121
    'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
122
    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
123
    'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+',
124
    '/'
125
};
126
127
int evp_encodeblock_int(EVP_ENCODE_CTX *ctx, unsigned char *t,
128
    const unsigned char *f, int dlen, int *wrap_cnt)
129
0
{
130
0
    int i = 0;
131
0
    int ret = 0;
132
0
    uint8_t t1, t2, t3;
133
0
    const unsigned char *e0, *e1, *e2;
134
0
    int srp = (ctx != NULL
135
0
        && (ctx->flags & EVP_ENCODE_CTX_USE_SRP_ALPHABET) != 0);
136
0
    int wrap_cnt_by_input = *wrap_cnt / 4 * 3;
137
0
    const int ctx_length = (ctx != NULL) ? ctx->length : 0;
138
139
0
    if (srp) {
140
0
        e0 = base64_srp_bin2ascii_0;
141
0
        e1 = base64_srp_bin2ascii_1;
142
0
        e2 = base64_srp_bin2ascii_2;
143
0
    } else {
144
0
        e0 = base64_std_bin2ascii_0;
145
0
        e1 = base64_std_bin2ascii_1;
146
0
        e2 = base64_std_bin2ascii_2;
147
0
    }
148
149
0
    if (ctx_length == 1) {
150
0
        while (i < dlen && ctx != NULL) {
151
0
            t1 = f[i];
152
0
            *(t++) = e0[t1];
153
0
            *(t++) = e1[(t1 & 0x03) << 4];
154
0
            *(t++) = '=';
155
0
            *(t++) = '=';
156
0
            *(t++) = '\n';
157
158
0
            ret += 5;
159
0
            i++;
160
0
        }
161
162
0
        *t = '\0';
163
0
        ret--;
164
165
0
        return ret;
166
0
    } else if (ctx_length % 3 != 0) {
167
0
        i = 0;
168
0
        int wrap_cnt_nm3 = 0;
169
0
        while (i + 2 < dlen) {
170
0
            if (ctx != NULL) {
171
0
                if ((wrap_cnt_nm3 < ctx->length
172
0
                        && (wrap_cnt_nm3 + 3 + wrap_cnt_by_input) > ctx->length)
173
0
                    && ((ctx->flags & EVP_ENCODE_CTX_NO_NEWLINES) == 0)) {
174
175
0
                    switch (ctx->length % 3) {
176
0
                    case 0:
177
0
                        break;
178
0
                    case 1:
179
0
                        t1 = f[i];
180
0
                        *(t++) = e0[t1];
181
0
                        *(t++) = e1[(t1 & 0x03) << 4];
182
0
                        *(t++) = '=';
183
0
                        *(t++) = '=';
184
185
0
                        ret += 4;
186
0
                        i++;
187
0
                        break;
188
0
                    case 2:
189
0
                        t1 = f[i];
190
0
                        t2 = f[i + 1];
191
0
                        *(t++) = e0[t1];
192
0
                        *(t++) = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
193
0
                        *(t++) = e2[(t2 & 0x0F) << 2];
194
0
                        *(t++) = '=';
195
0
                        i += 2;
196
0
                        ret += 4;
197
0
                        break;
198
0
                    }
199
0
                    *(t++) = '\n';
200
0
                    ret++;
201
0
                    wrap_cnt_nm3 = 0;
202
0
                }
203
0
            }
204
205
0
            if (ctx_length >= 4 && i + 2 < dlen) {
206
0
                t1 = f[i];
207
0
                t2 = f[i + 1];
208
0
                t3 = f[i + 2];
209
0
                *(t++) = e0[t1];
210
0
                *(t++) = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
211
0
                *(t++) = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)];
212
0
                *(t++) = e2[t3];
213
0
                ret += 4;
214
0
                wrap_cnt_nm3 += 3;
215
0
                i += 3;
216
0
            }
217
0
        }
218
0
    } else {
219
0
        for (i = 0; i + 2 < dlen; i += 3) {
220
221
0
            t1 = f[i];
222
0
            t2 = f[i + 1];
223
0
            t3 = f[i + 2];
224
0
            *(t++) = e0[t1];
225
0
            *(t++) = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
226
0
            *(t++) = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)];
227
0
            *(t++) = e2[t3];
228
0
            ret += 4;
229
230
0
            if (ctx != NULL) {
231
0
                if ((i + 3 + wrap_cnt_by_input) % ctx->length == 0 && ((ctx->flags & EVP_ENCODE_CTX_NO_NEWLINES) == 0) && ctx->length % 3 == 0) {
232
0
                    *(t++) = '\n';
233
0
                    ret++;
234
0
                }
235
0
            }
236
0
        }
237
0
    }
238
239
0
    switch (dlen - i) {
240
0
    case 0:
241
0
        break;
242
0
    case 1:
243
0
        t1 = f[i];
244
0
        *(t++) = e0[t1];
245
0
        *(t++) = e1[(t1 & 0x03) << 4];
246
0
        *(t++) = '=';
247
0
        *(t++) = '=';
248
249
0
        ret += 4;
250
251
0
        if (ctx != NULL) {
252
0
            if ((i + 1 + wrap_cnt_by_input) % ctx->length == 0 && ((ctx->flags & EVP_ENCODE_CTX_NO_NEWLINES) == 0) && ctx->length % 3 == 0) {
253
0
                *(t++) = '\n';
254
0
                ret++;
255
0
            }
256
0
        }
257
258
0
        break;
259
0
    case 2:
260
0
        t1 = f[i];
261
0
        t2 = f[i + 1];
262
0
        *(t++) = e0[t1];
263
0
        *(t++) = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
264
0
        *(t++) = e2[(t2 & 0x0F) << 2];
265
0
        *(t++) = '=';
266
0
        ret += 4;
267
268
0
        if (ctx != NULL) {
269
0
            if ((i + 2 + wrap_cnt_by_input) % ctx->length == 0 && ((ctx->flags & EVP_ENCODE_CTX_NO_NEWLINES) == 0) && ctx->length % 3 == 0) {
270
0
                *(t++) = '\n';
271
0
                ret++;
272
0
            }
273
0
        }
274
0
        break;
275
0
    }
276
277
0
    *t = '\0';
278
279
0
    return ret;
280
0
}