#ifndef PA_SIGNER_SRC_PROCESSCERTIFICATE_H_
#define PA_SIGNER_SRC_PROCESSCERTIFICATE_H_

#include <cstddef>
#include <cstdint>
#include <string>
#include <vector>

#include "Asn1Types.h"
#include "KeyInterface.h"
#include "PrivateKey.h"

static const size_t kKeyMaterialSize = 128;

class ProcessCertificate {
 private:
  PaCertificate *pa_certificate_;
  std::vector<uint8_t> native_data_;
  std::vector<uint8_t> five_signature_hash_;
  std::vector<uint8_t> pa_rsa_signature_;
  std::vector<uint8_t> pa_id_;
  std::vector<uint8_t> pa_app_name_;
  bool is_allocated_;

 public:
  ~ProcessCertificate();
  ProcessCertificate(const std::vector<uint8_t>& native_data,
                     const std::vector<uint8_t>& five_signature,
                     const std::vector<uint8_t>& pa_app_name, long key_id, long flags);
  ProcessCertificate(const std::string& b64_request,
                     const std::string& b64_signature);
  ProcessCertificate(const std::string& b64_encoded_certificate);

  void Sign(PrivateKey& key);
  bool Verify(KeyInterface& key) const;
  void Dump() const;
  std::string GetRequest();
  std::string ToAsn1Buffer();
};

#endif /* PA_SIGNER_SRC_PROCESSCERTIFICATE_H_ */
