#include "AndroidCertificate.h"

#include "PaFlagBits.h"
#include "Utils.h"

using namespace std;

static vector<uint8_t> ExtractModulus(const Pkcs7& key) {
  vector<uint8_t> modulus(1024);
  size_t modulus_size;

  modulus_size = BN_bn2bin(key.GetRsa()->n, &modulus[0]);
  if (modulus_size < kKeyMaterialSize) {
    throw runtime_error("ExtractModulus: RSA key to small");
  }

  modulus.resize(modulus_size);

  return modulus;
}

static vector<uint8_t> CreateAndroidId(
    const string& package_name, const Pkcs7& package_key) {
  vector<uint8_t> modulus = ExtractModulus(package_key);

  vector<uint8_t> data = StringToVector(package_name);
  data.insert(data.end(), modulus.begin(), modulus.end());

  return data;
}

AndroidCertificate::AndroidCertificate(
    const string& package_name, const string& package_key,
    const string& b64_five_signature,
    long key_id): AndroidCertificate(
        package_name, Pkcs7(package_key),
        b64_five_signature, key_id) {
}

AndroidCertificate::AndroidCertificate(
    const string& package_name, const Pkcs7& package_key,
    const string& b64_five_signature,
    long key_id): ProcessCertificate(
        CreateAndroidId(package_name, package_key),
        Base64Decode(b64_five_signature), StringToVector(package_name), key_id, 1 << PaFlagBits_bitAndroid) {
}
