// Copyright 2017 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Utility classes for cert_provision library.

#include <brillo/mime_utils.h>

#include "cryptohome/cert/cert_provision_pca.h"

namespace cert_provision {

PCAProxy* PCAProxy::subst_obj = nullptr;

Scoped<PCAProxy> PCAProxy::Create(const std::string& pca_url) {
  return subst_obj ? Scoped<PCAProxy>(subst_obj)
                   : Scoped<PCAProxy>(GetDefault(pca_url));
}

std::unique_ptr<PCAProxy> PCAProxy::GetDefault(const std::string& pca_url) {
  return std::unique_ptr<PCAProxy>(new PCAProxyImpl(pca_url));
}

PCAProxyImpl::PCAProxyImpl(const std::string& pca_url)
    : PCAProxy(pca_url),
      http_transport_(brillo::http::Transport::CreateDefault()) {}

OpResult PCAProxyImpl::MakeRequest(const std::string& action,
                                   const brillo::SecureBlob& request,
                                   brillo::SecureBlob* reply) {
  brillo::ErrorPtr error;
  auto response = brillo::http::PostBinaryAndBlock(
      pca_url_ + "/" + action,
      request.data(),
      request.size(),
      brillo::mime::application::kOctet_stream,
      {},  // headers
      http_transport_,
      &error);
  if (!response) {
    return {Status::HttpError,
            std::string("Sending PCA request failed: ") + action + ": " +
                error->GetMessage()};
  }
  if (!response->IsSuccessful()) {
    return {Status::ServerError,
            std::string("PCA server error: ") + action + ": " +
                response->GetStatusText()};
  }
  auto response_data = response->ExtractData();
  brillo::SecureBlob tmp(response_data.begin(), response_data.end());
  reply->swap(tmp);
  return OpResult();
}

}  // namespace cert_provision
