blob: 5c62d74c03a71eeeff7413cfaeea1cb3b3715ff6 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "peridot/lib/base64url/base64url.h"
#include <src/lib/fxl/logging.h>
#include "third_party/modp_b64/modp_b64.h"
namespace base64url {
std::string Base64UrlEncode(fxl::StringView input) {
std::string output;
size_t output_length = modp_b64_encode_strlen(input.size());
// In C++11, std::string guarantees that output[output.size()] is
// legal and points to a '\0' character. The last byte of modp_b64_encode() is
// a '\0' that will override output[output.size()].
output.resize(output_length);
size_t written = modp_b64_encode(&output[0], input.data(), input.size());
FXL_DCHECK(output_length == written);
for (char& c : output) {
if (c == '+') c = '-';
else if (c == '/') c = '_';
}
return output;
}
bool Base64UrlDecode(fxl::StringView input, std::string* output) {
std::string input_copy = input.ToString();
for (char& c : input_copy) {
if (c == '-') c = '+';
else if (c == '_') c = '/';
}
std::string tmp_output;
size_t output_maxlength = modp_b64_decode_len(input.size());
tmp_output.resize(output_maxlength);
size_t output_length = modp_b64_decode(&tmp_output[0], input_copy.data(), input_copy.size());
if (output_length == MODP_B64_ERROR) {
return false;
}
tmp_output.resize(output_length);
output->swap(tmp_output);
return true;
}
} // namespace base64url