// 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 "src/modular/lib/base64url/base64url.h"

#include <lib/syslog/cpp/macros.h>

#include "third_party/modp_b64/modp_b64.h"

namespace base64url {

std::string Base64UrlEncode(std::string_view 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());
  FX_DCHECK(output_length == written);
  for (char& c : output) {
    if (c == '+')
      c = '-';
    else if (c == '/')
      c = '_';
  }
  return output;
}

bool Base64UrlDecode(std::string_view input, std::string* output) {
  std::string input_copy = std::string(input);
  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
