/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 | } |