// Copyright 2020 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.

#include "trunks/openssl_utility.h"

#include <base/logging.h>
#include <libhwsec/crypto_utility.h>
#include <openssl/bn.h>
#include <openssl/ec.h>

#include "trunks/tpm_generated.h"

namespace {

// Converts an ECC point |coordinate| in the OpenSSL BIGNUM format to the
// TPM2B_ECC_PARAMETER format and pads the result to |coord_size| bytes. If
// succeeded, stores the result in |param| and returns true; otherwise, returns
// false.
bool BignumCoordinateToEccParameter(const BIGNUM& coordinate,
                                    size_t coord_size,
                                    trunks::TPM2B_ECC_PARAMETER* param) {
  if (coord_size > MAX_ECC_KEY_BYTES) {
    LOG(ERROR) << "Coordinate size is too large: " << coord_size;
    return false;
  }

  int key_size = BN_num_bytes(&coordinate);
  if (key_size > coord_size) {
    LOG(ERROR) << "Coordinate size is larger than expected: " << key_size
               << " vs. " << coord_size;
    return false;
  }

  memset(param->buffer, 0, sizeof(trunks::BYTE) * MAX_ECC_KEY_BYTES);
  unsigned char* start_pos =
      reinterpret_cast<unsigned char*>(param->buffer) + coord_size - key_size;
  if (BN_bn2bin(&coordinate, start_pos) != key_size) {
    LOG(ERROR) << "BN_bn2bin() doesn't write a correct size: "
               << hwsec::GetOpensslError();
    return false;
  }

  param->size = coord_size;
  return true;
}

}  // namespace

namespace trunks {

bool TpmToOpensslEccPoint(const TPMS_ECC_POINT& point,
                          const EC_GROUP& ec_group,
                          EC_POINT* ec_point) {
  CHECK(ec_point);

  hwsec::ScopedBN_CTX ctx;
  BIGNUM* x = BN_CTX_get(ctx.get());
  BIGNUM* y = BN_CTX_get(ctx.get());
  if (!x || !y) {
    LOG(ERROR) << "Failed to create bignums for x or y when converting to "
               << "openssl ECC point: " << hwsec::GetOpensslError();
    return false;
  }

  if (!BN_bin2bn(reinterpret_cast<const unsigned char*>(point.x.buffer),
                 point.x.size, x) ||
      !BN_bin2bn(reinterpret_cast<const unsigned char*>(point.y.buffer),
                 point.y.size, y) ||
      !EC_POINT_set_affine_coordinates_GFp(&ec_group, ec_point, x, y,
                                           ctx.get())) {
    LOG(ERROR) << "Failed to convert TPMS_ECC_POINT to OpenSSL EC_POINT: "
               << hwsec::GetOpensslError();
    return false;
  }

  return true;
}

bool OpensslToTpmEccPoint(const EC_GROUP& ec_group,
                          const EC_POINT& point,
                          size_t coord_size,
                          TPMS_ECC_POINT* ecc_point) {
  CHECK(ecc_point);

  hwsec::ScopedBN_CTX ctx;
  BIGNUM* x = BN_CTX_get(ctx.get());
  BIGNUM* y = BN_CTX_get(ctx.get());
  if (!x || !y) {
    LOG(ERROR) << "Failed to create bignums for x or y when converting to TPM "
               << "ECC point: " << hwsec::GetOpensslError();
    return false;
  }

  if (!EC_POINT_get_affine_coordinates_GFp(&ec_group, &point, x, y,
                                           ctx.get())) {
    LOG(ERROR) << "Failed to get X and Y from OpenSSL EC_POINT: "
               << hwsec::GetOpensslError();
    return false;
  }

  if (!BignumCoordinateToEccParameter(*x, coord_size, &ecc_point->x) ||
      !BignumCoordinateToEccParameter(*y, coord_size, &ecc_point->y)) {
    LOG(ERROR) << "Bad EC_POINT coordinate value.";
    return false;
  }

  return true;
}

}  // namespace trunks
