21 #include <gtest/gtest.h>
27 #include "../internal.h"
28 #include "../test/test_util.h"
57 {
valid,
"foobar",
"Zm9vYmFy\n\n"},
58 {
valid,
"foobar",
" Zm9vYmFy\n\n"},
59 {
valid,
"foobar",
" Z m 9 v Y m F y\n\n"},
69 {
canonical,
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
70 "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==\n"},
71 {
valid,
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
72 "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA\n==\n"},
73 {
valid,
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
74 "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA=\n=\n"},
76 "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA=\n==\n"},
77 {
canonical,
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
78 "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4\neHh4eHh"
81 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
82 "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4\neHh4eHh"
83 "4eHh4eHh4eHh4eA==\n"},
84 {
valid,
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
85 "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh\n4eHh4eHh"
86 "4eHh4eHh4eHh4eA==\n"},
87 {
valid,
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
88 "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e"
91 "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA=="
92 "\neHh4eHh4eHh4eHh4eHh4eHh4\n"},
97 {
invalid,
"",
"Zm9vYmFy-anythinggoes"},
98 {
invalid,
"",
"Zm9vYmFy\n-anythinggoes"},
102 "ZW5jb2RlIG1lCg==========================================================="
113 const size_t in_len = strlen(
in);
115 for (
size_t i = 0;
i < in_len;
i++) {
130 const size_t decoded_len = strlen(t.decoded);
131 size_t max_encoded_len;
134 std::vector<uint8_t> out_vec(max_encoded_len);
144 if (t.relation ==
valid) {
151 std::vector<uint8_t> out_vec(encoded.size());
156 (
const uint8_t *)encoded.data(), encoded.size());
174 std::vector<uint8_t> out_vec(encoded.size());
183 size_t expected_len = strlen(t.decoded);
184 if (expected_len % 3 != 0) {
185 ret -= 3 - (expected_len % 3);
194 const size_t decoded_len = strlen(t.decoded);
197 size_t max_encoded_len;
202 max_encoded_len += (max_encoded_len + 63) >> 6;
203 std::vector<uint8_t> out_vec(max_encoded_len);
210 reinterpret_cast<const uint8_t *
>(t.decoded),
212 size_t total = out_len;
220 std::vector<uint8_t> out_vec(strlen(t.encoded));
227 reinterpret_cast<const uint8_t *
>(t.encoded),
235 switch (t.relation) {
254 const size_t encoded_len = strlen(t.encoded);
256 std::vector<uint8_t>
out(encoded_len);
258 for (
size_t chunk_size = 1; chunk_size <= encoded_len; chunk_size++) {
264 for (
size_t i = 0;
i < encoded_len;) {
265 size_t todo = encoded_len -
i;
266 if (
todo > chunk_size) {
273 reinterpret_cast<const uint8_t *
>(t.encoded +
i),
todo);
278 FAIL() <<
"EVP_DecodeUpdate failed";
281 if (
i == encoded_len ||
282 (
i + 1 == encoded_len && t.encoded[
i] ==
'\n') ||
286 strchr(t.encoded,
'-') !=
nullptr) {
291 <<
"EVP_DecodeUpdate returned zero before end of encoded data.";
296 FAIL() <<
"Invalid return value " <<
ret;