// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef POLO_UTIL_CERTIFICATEUTIL_H_
#define POLO_UTIL_CERTIFICATEUTIL_H_

#include <stdint.h>
#include <openssl/ssl.h>
#include <string>

// Fixes a problem with X509_NAME on Windows.
#undef X509_NAME

namespace polo {
namespace util {

class CertificateUtil {
 public:
  // Reads an X509 certificate from a PEM encoded string.
  // @param pem the PEM encoded string
  // @return a pointer to a new X509 certificate or NULL if there was an error
  //         loading the certificate
  static X509* X509FromPEM(std::string pem);

  // Converts an X509 certificate to a PEM encoded string.
  // @param x509 the X509 certificate
  // @return a PEM encoded string of the given certificate
  static std::string X509ToPEM(X509* x509);

  // Loads a private key from a PEM encoded string.
  // @param pem the PEM encoded string
  // @param passphrase the private key passphrase
  // @return a pointer to a new EVP_PKEY or NULL if there was an error loading
  //         the private key
  static EVP_PKEY* PKEYFromPEM(std::string pem,
                               std::string passphrase);

  // Converts a private key to a PEM encoded string.
  // @param pkey the private key
  // @param passphrase the private key passphrase to use
  // @return a PEM encoded string of the given private key
  static std::string PKEYToPEM(EVP_PKEY* pkey,
                               std::string passphrase);

  // Generates a new private key.
  // @return a new RSA private key that can be used to create a self-signed cert
  static EVP_PKEY* GeneratePrivateKey();

  // Generates a self-signed X509 certificate.
  // @param pkey the private key
  // @param subject_name the subject name
  // @param days the number of days before the certificate expires
  // @return a new self-signed X509 certificate
  static X509* GenerateSelfSignedCert(EVP_PKEY* pkey,
                                      std::string subject_name,
                                      uint32_t days);
};

}  // namespace util
}  // namespace polo

#endif  // POLO_UTIL_CERTIFICATEUTIL_H_