// Copyright 2021 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 "cryptohome/crypto/big_num_util.h"

#include <base/logging.h>

#include "cryptohome/crypto/error_util.h"

namespace cryptohome {

ScopedBN_CTX CreateBigNumContext() {
  ScopedBN_CTX bn_ctx(BN_CTX_new());
  if (!bn_ctx) {
    LOG(ERROR) << "Failed to allocate BN_CTX structure: " << GetOpenSSLErrors();
    return nullptr;
  }
  return bn_ctx;
}

crypto::ScopedBIGNUM CreateBigNum() {
  crypto::ScopedBIGNUM result(BN_secure_new());
  if (!result) {
    LOG(ERROR) << "Failed to allocate BIGNUM structure: " << GetOpenSSLErrors();
    return nullptr;
  }
  return result;
}

crypto::ScopedBIGNUM BigNumFromValue(BN_ULONG value) {
  crypto::ScopedBIGNUM result(BN_secure_new());
  if (!result) {
    LOG(ERROR) << "Failed to allocate BIGNUM structure: " << GetOpenSSLErrors();
    return nullptr;
  }
  if (BN_set_word(result.get(), value) != 1) {
    LOG(ERROR) << "Failed to allocate BIGNUM structure: " << GetOpenSSLErrors();
    return nullptr;
  }
  return result;
}

crypto::ScopedBIGNUM SecureBlobToBigNum(const brillo::SecureBlob& blob) {
  crypto::ScopedBIGNUM result(BN_secure_new());
  if (!result) {
    LOG(ERROR) << "Failed to allocate BIGNUM structure: " << GetOpenSSLErrors();
    return nullptr;
  }
  if (!BN_bin2bn(blob.data(), blob.size(), result.get())) {
    LOG(ERROR) << "Failed to convert SecureBlob to BIGNUM: "
               << GetOpenSSLErrors();
    return nullptr;
  }
  return result;
}

bool BigNumToSecureBlob(const BIGNUM& bn, brillo::SecureBlob* result) {
  result->resize(BN_num_bytes(&bn));
  // TODO(b:185363157): Improve security using BN_bn2binpad instead.
  if (BN_bn2bin(&bn, result->data()) < 0) {
    LOG(ERROR) << "Failed to convert BIGNUM to SecureBlob: "
               << GetOpenSSLErrors();
    return false;
  }
  return true;
}

}  // namespace cryptohome
