// 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.
//
// Library that provides certificate provisioning/signing interface.

#ifndef CRYPTOHOME_CERT_PROVISION_H_
#define CRYPTOHOME_CERT_PROVISION_H_

#include <string>

#include <base/callback.h>

// Use this for the interface exported by this library.
#define CERT_PROVISION_EXPORT __attribute__((__visibility__("default")))

namespace cert_provision {

enum class Status {
  Success = 0,
  NotPrepared = 1,
  NotProvisioned = 2,
  HttpError = 3,
  ServerError = 4,
  DBusError = 5,
  CryptohomeError = 6,
  KeyStoreError = 7,
};

// Privacy CA types. These values match PCAType values in attestation.h,
// and are implicitly converted to cryptohome::Attestation::PCAType when
// calling cryptohome.
enum PCAType {
  kDefaultPCA = 0,    // The Google-operated Privacy CA.
  kTestPCA = 1,       // The test instance of the Google-operated Privacy CA.
};

// Attestation certificate profiles. These values match CertificateProfile
// values in attestation.proto, where descriptions for profiles are provided.
// They are implicitly converted to cryptohome::Attestation::PCAType when
// calling cryptohome.
enum CertificateProfile {
  ENTERPRISE_MACHINE_CERTIFICATE = 0,
  ENTERPRISE_USER_CERTIFICATE = 1,
  CONTENT_PROTECTION_CERTIFICATE = 2,
  CONTENT_PROTECTION_CERTIFICATE_WITH_STABLE_ID = 3,
  CAST_CERTIFICATE = 4,
  GFSC_CERTIFICATE = 5,
  JETSTREAM_CERTIFICATE = 6,
  ENTERPRISE_ENROLLMENT_CERTIFICATE = 7,
  XTS_CERTIFICATE = 8,
  ENTERPRISE_VTPM_EK_CERTIFICATE = 9,
};

// Supported signing mechanisms.
enum SignMechanism {
  SHA1_RSA_PKCS = 0,  // Sign SHA-1 hash using RSASSA-PKCS1-v1_5
  SHA256_RSA_PKCS = 1,  // Sign SHA-256 hash using RSASSA-PKCS1-v1_5
};

using ProgressCallback = base::Callback<void(
    Status status, int progress, const std::string& message)>;

// Synchronously obtains a new certificate with |cert_profile| from the PCA.
// The PCA is identified by the |pca_type|. If |pca_url| is not empty, it
// overrides the default PCA url. Stores the obtained certificate, its private
// and public keys in the keystore under |label|.
//
// |progress_callback| is called after major internal steps or on errors:
// - on steps: status is set to Status::Success, progress is the number between
//   0 and 100 that roughly defines the completeness percentage, and message
//   is the description of the current step.
// - on errors: status is set to the appropriate error, progress is set to 100,
//   and message provides error details.
//
// Returns Status::Success if the certificate was successfully obtained, and
// an appropriate other status on errors.
CERT_PROVISION_EXPORT Status ProvisionCertificate(
    PCAType pca_type,
    const std::string& pca_url,
    const std::string& label,
    CertificateProfile cert_profile,
    const ProgressCallback& progress_callback);

// Retrieves the provisioned certificate identified by |label| into |cert| in
// PEM format. If |include_intermediate| is true, all intermediate certificates
// in its chain are also obtained.
//
// Returns Status::Success if the certificate was successfully obtained, and
// an appropriate other status on errors.
CERT_PROVISION_EXPORT Status GetCertificate(const std::string& label,
                                            bool include_intermediate,
                                            std::string* cert);

// Signs |data| with the private key of the certificate identified by |label|
// using signing |mechanism|. Stores the resulting signature in |signature|.
//
// Returns Status::Success if the certificate was successfully obtained, and
// an appropriate other status on errors.
CERT_PROVISION_EXPORT Status Sign(const std::string& label,
                                  SignMechanism mechanism,
                                  const std::string& data,
                                  std::string* signature);

}  // namespace cert_provision

#endif  // CRYPTOHOME_CERT_PROVISION_H_
