#include "PublicKey.h"

#include <openssl/pem.h>
#include <stdexcept>

#include "Utils.h"

using namespace std;

PublicKey::PublicKey(const string& filename)
    : key_(NULL) {
  if (FILE *fp = fopen(filename.c_str(), "rb")) {
    key_ = PEM_read_PUBKEY(fp, &key_, NULL, NULL);
    fclose(fp);
  } else {
    throw std::runtime_error("Can't open file: " + filename);
  }
}

PublicKey::PublicKey(const vector<uint8_t>& keydata)
    : key_(NULL) {
  BIO *bufio = BIO_new_mem_buf((void*) &keydata[0], keydata.size());
  key_ = PEM_read_bio_PUBKEY(bufio, &key_, 0, NULL);
  BIO_free(bufio);
}

PublicKey::~PublicKey()  {
  EVP_PKEY_free(key_);
}

EVP_PKEY* PublicKey::GetKey() {
  return key_;
}
