1*e7b1675dSTing-Kang Chang // Copyright 2021 Google LLC 2*e7b1675dSTing-Kang Chang // 3*e7b1675dSTing-Kang Chang // Licensed under the Apache License, Version 2.0 (the "License"); 4*e7b1675dSTing-Kang Chang // you may not use this file except in compliance with the License. 5*e7b1675dSTing-Kang Chang // You may obtain a copy of the License at 6*e7b1675dSTing-Kang Chang // 7*e7b1675dSTing-Kang Chang // http://www.apache.org/licenses/LICENSE-2.0 8*e7b1675dSTing-Kang Chang // 9*e7b1675dSTing-Kang Chang // Unless required by applicable law or agreed to in writing, software 10*e7b1675dSTing-Kang Chang // distributed under the License is distributed on an "AS IS" BASIS, 11*e7b1675dSTing-Kang Chang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*e7b1675dSTing-Kang Chang // See the License for the specific language governing permissions and 13*e7b1675dSTing-Kang Chang // limitations under the License. 14*e7b1675dSTing-Kang Chang // 15*e7b1675dSTing-Kang Chang /////////////////////////////////////////////////////////////////////////////// 16*e7b1675dSTing-Kang Chang #ifndef TINK_INTERNAL_BN_UTIL_H_ 17*e7b1675dSTing-Kang Chang #define TINK_INTERNAL_BN_UTIL_H_ 18*e7b1675dSTing-Kang Chang 19*e7b1675dSTing-Kang Chang #include <stddef.h> 20*e7b1675dSTing-Kang Chang 21*e7b1675dSTing-Kang Chang #include <string> 22*e7b1675dSTing-Kang Chang 23*e7b1675dSTing-Kang Chang #include "absl/strings/string_view.h" 24*e7b1675dSTing-Kang Chang #include "absl/types/span.h" 25*e7b1675dSTing-Kang Chang #include "openssl/bn.h" 26*e7b1675dSTing-Kang Chang #include "tink/internal/ssl_unique_ptr.h" 27*e7b1675dSTing-Kang Chang #include "tink/util/secret_data.h" 28*e7b1675dSTing-Kang Chang #include "tink/util/status.h" 29*e7b1675dSTing-Kang Chang #include "tink/util/statusor.h" 30*e7b1675dSTing-Kang Chang 31*e7b1675dSTing-Kang Chang namespace crypto { 32*e7b1675dSTing-Kang Chang namespace tink { 33*e7b1675dSTing-Kang Chang namespace internal { 34*e7b1675dSTing-Kang Chang 35*e7b1675dSTing-Kang Chang // Compares `bignum` with the given `word`. It returns a result < 0 if `bignum` 36*e7b1675dSTing-Kang Chang // < `word`, 0 if `bignum` == `word`, and > 0 if `bignum` > `word`. 37*e7b1675dSTing-Kang Chang int CompareBignumWithWord(const BIGNUM* bignum, BN_ULONG word); 38*e7b1675dSTing-Kang Chang 39*e7b1675dSTing-Kang Chang // Converts the absolute value of `bignum` into a big-endian form, and writes it 40*e7b1675dSTing-Kang Chang // in `buffer`. 41*e7b1675dSTing-Kang Chang crypto::tink::util::Status BignumToBinaryPadded(absl::Span<char> buffer, 42*e7b1675dSTing-Kang Chang const BIGNUM* bignum); 43*e7b1675dSTing-Kang Chang 44*e7b1675dSTing-Kang Chang // Retuns a string that encodes `bn` in big-endian form of size `len` with 45*e7b1675dSTing-Kang Chang // leading zeroes. 46*e7b1675dSTing-Kang Chang crypto::tink::util::StatusOr<std::string> BignumToString(const BIGNUM* bn, 47*e7b1675dSTing-Kang Chang size_t len); 48*e7b1675dSTing-Kang Chang 49*e7b1675dSTing-Kang Chang // Retuns a SecretData object that encodes `bn` in big-endian form of size `len` 50*e7b1675dSTing-Kang Chang // with leading zeroes. 51*e7b1675dSTing-Kang Chang crypto::tink::util::StatusOr<crypto::tink::util::SecretData> BignumToSecretData( 52*e7b1675dSTing-Kang Chang const BIGNUM* bn, size_t len); 53*e7b1675dSTing-Kang Chang 54*e7b1675dSTing-Kang Chang // Returns an OpenSSL/BoringSSL BIGNUM constructed from a bigendian string 55*e7b1675dSTing-Kang Chang // representation `bigendian_bn_str`. 56*e7b1675dSTing-Kang Chang crypto::tink::util::StatusOr<internal::SslUniquePtr<BIGNUM>> StringToBignum( 57*e7b1675dSTing-Kang Chang absl::string_view bigendian_bn_str); 58*e7b1675dSTing-Kang Chang 59*e7b1675dSTing-Kang Chang } // namespace internal 60*e7b1675dSTing-Kang Chang } // namespace tink 61*e7b1675dSTing-Kang Chang } // namespace crypto 62*e7b1675dSTing-Kang Chang 63*e7b1675dSTing-Kang Chang #endif // TINK_INTERNAL_BN_UTIL_H_ 64