// 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/system_data/client_secret.h"

#include <utility>

#include "src/lib/crypto_util/random.h"
#include "third_party/abseil-cpp/absl/strings/escaping.h"

namespace cobalt::system_data {

// static
ClientSecret ClientSecret::GenerateNewSecret() {
  crypto::Random rand;
  return GenerateNewSecret(&rand);
}

// static
ClientSecret ClientSecret::GenerateNewSecret(crypto::Random* rand) {
  ClientSecret client_secret;
  client_secret.bytes_.resize(kNumSecretBytes);
  rand->RandomBytes(reinterpret_cast<byte*>(client_secret.bytes_.data()), kNumSecretBytes);
  return client_secret;
}

// static
ClientSecret ClientSecret::FromToken(const std::string& token) {
  ClientSecret client_secret;
  absl::Base64Unescape(token, &client_secret.bytes_);
  return client_secret;
}

std::string ClientSecret::GetToken() { return absl::Base64Escape(bytes_); }

}  // namespace cobalt::system_data
