blob: 422581cc9a60ca7d6a293a88b922a2c458119a39 [file] [log] [blame]
// 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.
#ifndef CRYPTOHOME_CRYPTO_BIG_NUM_UTIL_H_
#define CRYPTOHOME_CRYPTO_BIG_NUM_UTIL_H_
#include <brillo/secure_blob.h>
#include <crypto/scoped_openssl_types.h>
#include <openssl/bn.h>
namespace cryptohome {
// TODO(b:182154354): Move to Chrome crypto library.
using ScopedBN_CTX = crypto::ScopedOpenSSL<BN_CTX, BN_CTX_free>;
// Creates context for big number operations. Returns nullptr if error occurred.
ScopedBN_CTX CreateBigNumContext();
// Creates big number with undefined value. Returns nullptr if error occurred.
crypto::ScopedBIGNUM CreateBigNum();
// Creates BIGNUM and set it to a given value. Returns nullptr if error
// occurred. This is useful for testing, otherwise shouldn't be used.
crypto::ScopedBIGNUM BigNumFromValue(BN_ULONG value);
// Converts SecureBlob to BIGNUM. Returns nullptr if error occurred.
// Empty SecureBlob is interpreted as zero.
// The input SecureBlob is expected to be in big-endian encoding.
crypto::ScopedBIGNUM SecureBlobToBigNum(const brillo::SecureBlob& blob);
// Converts BIGNUM to SecureBlob padded to a given `result_len`. Returns false
// if error occurred, otherwise stores resulting blob in `result`. The resulting
// SecureBlob is encoded in big-endian form.
// This is the only method that should be used for converting BIGNUMs to
// SecureBlobs, as it is not advised to create variable length SecureBlobs for
// security reasons.
bool BigNumToSecureBlob(const BIGNUM& bn,
int result_len,
brillo::SecureBlob* result);
} // namespace cryptohome
#endif // CRYPTOHOME_CRYPTO_BIG_NUM_UTIL_H_