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