diff --git a/galois_key.h b/galois_key.h index 0b73a63eff4d0..e6295f1082748 100644 --- a/galois_key.h +++ b/galois_key.h @@ -23,6 +23,8 @@ #include "relinearization_key.h" #include "status_macros.h" #include "statusor.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" +#include "third_party/shell-encryption/base/shell_encryption_export_template.h" namespace rlwe { @@ -41,7 +43,7 @@ namespace rlwe { // // Details can be found in Appendix D.2 of https://eprint.iacr.org/2011/566.pdf template -class GaloisKey { +class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) GaloisKey { public: // Initializes a GaloisKey based on a SymmetricRlweKey key that can key-switch // two component ciphertexts. A positive log_decomposition_modulus corresponds @@ -49,7 +51,7 @@ class GaloisKey { // power of x in the secret key polynomial s(x^substitution_power) that the // ciphertext is encrypted with. The prng_seed is used to generate and encode // the bottom row of the matrix, which consists of random entries. - static rlwe::StatusOr Create( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr Create( const SymmetricRlweKey& key, absl::string_view prng_seed, Uint64 substitution_power, Uint64 log_decomposition_modulus) { RLWE_ASSIGN_OR_RETURN(auto relinearization_key, @@ -88,7 +90,7 @@ class GaloisKey { // SerializedGaloisKey is (2 * num_parts * dimension) where dimension is the // number of digits needed to represent the modulus in base // 2^{log_decomposition_modulus}. Crashes for non-valid input parameters. - static rlwe::StatusOr Deserialize( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr Deserialize( const SerializedGaloisKey& serialized, const typename ModularInt::Params* modulus_params, const NttParameters* ntt_params) { @@ -110,6 +112,14 @@ class GaloisKey { RelinearizationKey relinearization_key_; }; +template class EXPORT_TEMPLATE_DECLARE( + SHELL_ENCRYPTION_EXPORT) GaloisKey>; +template class EXPORT_TEMPLATE_DECLARE( + SHELL_ENCRYPTION_EXPORT) GaloisKey>; +template class EXPORT_TEMPLATE_DECLARE( + SHELL_ENCRYPTION_EXPORT) GaloisKey>; +template class EXPORT_TEMPLATE_DECLARE( + SHELL_ENCRYPTION_EXPORT) GaloisKey>; } // namespace rlwe #endif // RLWE_GALOIS_KEY_H_ diff --git a/int256.h b/int256.h index 540dce2d765b1..4c464a4978412 100644 --- a/int256.h +++ b/int256.h @@ -18,13 +18,15 @@ #include "absl/numeric/int128.h" #include "integral_types.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" +#include "third_party/shell-encryption/base/shell_encryption_export_template.h" namespace rlwe { struct uint256_pod; // An unsigned 256-bit integer type. Thread-compatible. -class uint256 { +class SHELL_ENCRYPTION_EXPORT uint256 { public: constexpr uint256(); constexpr uint256(absl::uint128 top, absl::uint128 bottom); @@ -74,11 +76,11 @@ class uint256 { uint256& operator-=(const uint256& b); uint256& operator*=(const uint256& b); // Long division/modulo for uint256. - uint256& operator/=(const uint256& b); - uint256& operator%=(const uint256& b); + SHELL_ENCRYPTION_EXPORT uint256& operator/=(const uint256& b); + SHELL_ENCRYPTION_EXPORT uint256& operator%=(const uint256& b); uint256 operator++(int); uint256 operator--(int); - uint256& operator<<=(int); + SHELL_ENCRYPTION_EXPORT uint256& operator<<=(int); uint256& operator>>=(int); uint256& operator&=(const uint256& b); uint256& operator|=(const uint256& b); @@ -90,7 +92,7 @@ class uint256 { friend absl::uint128 Uint256High128(const uint256& v); // We add "std::" to avoid including all of port.h. - friend std::ostream& operator<<(std::ostream& o, const uint256& b); + friend SHELL_ENCRYPTION_EXPORT std::ostream& operator<<(std::ostream& o, const uint256& b); private: static void DivModImpl(uint256 dividend, uint256 divisor, @@ -121,7 +123,7 @@ constexpr uint256 Uint256Max() { // This is a POD form of uint256 which can be used for static variables which // need to be operated on as uint256. -struct uint256_pod { +struct SHELL_ENCRYPTION_EXPORT uint256_pod { // Note: The ordering of fields is different than 'class uint256' but the // same as its 2-arg constructor. This enables more obvious initialization // of static instances, which is the primary reason for this struct in the diff --git a/montgomery.cc b/montgomery.cc index 9fbc5dabee18c..4bd03362420fc 100644 --- a/montgomery.cc +++ b/montgomery.cc @@ -14,6 +14,8 @@ #include "montgomery.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" +#include "third_party/shell-encryption/base/shell_encryption_export_template.h" #include "transcription.h" namespace rlwe { @@ -416,12 +418,12 @@ MontgomeryInt MontgomeryInt::MultiplicativeInverse( // Instantiations of MontgomeryInt and MontgomeryIntParams with specific // integral types. -template struct MontgomeryIntParams; -template struct MontgomeryIntParams; -template struct MontgomeryIntParams; -template struct MontgomeryIntParams; -template class MontgomeryInt; -template class MontgomeryInt; -template class MontgomeryInt; -template class MontgomeryInt; +template struct EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) MontgomeryIntParams; +template struct EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) MontgomeryIntParams; +template struct EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) MontgomeryIntParams; +template struct EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) MontgomeryIntParams; +template class EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) MontgomeryInt; +template class EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) MontgomeryInt; +template class EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) MontgomeryInt; +template class EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) MontgomeryInt; } // namespace rlwe diff --git a/montgomery.h b/montgomery.h index 4f0e2eafb815f..c3988ff34da34 100644 --- a/montgomery.h +++ b/montgomery.h @@ -34,6 +34,8 @@ #include "serialization.pb.h" #include "status_macros.h" #include "statusor.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" +#include "third_party/shell-encryption/base/shell_encryption_export_template.h" namespace rlwe { @@ -43,24 +45,24 @@ namespace internal { template struct BigInt; // Specialization for uint8, uint16, uint32, uint64, and uint128. -template <> -struct BigInt { +template <> +struct EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) BigInt { typedef Uint16 value_type; }; -template <> -struct BigInt { +template <> +struct EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) BigInt { typedef Uint32 value_type; }; -template <> -struct BigInt { +template <> +struct EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) BigInt { typedef Uint64 value_type; }; -template <> -struct BigInt { +template <> +struct EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) BigInt { typedef absl::uint128 value_type; }; -template <> -struct BigInt { +template <> +struct EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) BigInt { typedef uint256 value_type; }; @@ -69,7 +71,7 @@ struct BigInt { // The parameters necessary for a Montgomery integer. Note that the template // parameters ensure that T is an unsigned integral of at least 8 bits. template -struct MontgomeryIntParams { +struct EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) MontgomeryIntParams{ // Expose Int and its greater type. BigInt is required in order to multiply // two Int and ensure that no overflow occurs. // @@ -159,7 +161,7 @@ struct MontgomeryIntParams { // modulus must be odd. // Returns a tuple of (inv_r, inv_modulus) such that: // r * inv_r - modulus * inv_modulus = 1 - static std::tuple Inverses(BigInt modulus_bigint, BigInt r); + static SHELL_ENCRYPTION_EXPORT std::tuple Inverses(BigInt modulus_bigint, BigInt r); }; // Stores an integer in Montgomery representation. The goal of this @@ -170,7 +172,7 @@ struct MontgomeryIntParams { // The underlying integer type T must be unsigned and must not be bool. // This class is thread safe. template -class ABSL_MUST_USE_RESULT MontgomeryInt { +class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) ABSL_MUST_USE_RESULT MontgomeryInt { public: // Expose Int and its greater type. BigInt is required in order to multiply // two Int and ensure that no overflow occurs. This should also be used by @@ -184,16 +186,16 @@ class ABSL_MUST_USE_RESULT MontgomeryInt { // Static factory that converts a non-Montgomery representation integer, the // underlying integer type, into a Montgomery representation integer. Does not // take ownership of params. i.e., import "a". - static rlwe::StatusOr ImportInt(Int n, const Params* params); + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr ImportInt(Int n, const Params* params); // Static functions to create a MontgomeryInt of 0 and 1. - static MontgomeryInt ImportZero(const Params* params); - static MontgomeryInt ImportOne(const Params* params); + static SHELL_ENCRYPTION_EXPORT MontgomeryInt ImportZero(const Params* params); + static SHELL_ENCRYPTION_EXPORT MontgomeryInt ImportOne(const Params* params); // Import a random integer using entropy from specified prng. Does not take // ownership of params or prng. template - static rlwe::StatusOr ImportRandom(Prng* prng, + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr ImportRandom(Prng* prng, const Params* params) { // In order to generate unbiased randomness, we uniformly and randomly // sample integers in [0, 2^params->log_modulus) until the generated integer @@ -234,13 +236,13 @@ class ABSL_MUST_USE_RESULT MontgomeryInt { // Serialization. rlwe::StatusOr Serialize(const Params* params) const; - static rlwe::StatusOr SerializeVector( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr SerializeVector( const std::vector& coeffs, const Params* params); // Deserialization. - static rlwe::StatusOr Deserialize(absl::string_view payload, + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr Deserialize(absl::string_view payload, const Params* params); - static rlwe::StatusOr> DeserializeVector( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr> DeserializeVector( int num_coeffs, absl::string_view serialized, const Params* params); // Modular multiplication. @@ -353,7 +355,7 @@ class ABSL_MUST_USE_RESULT MontgomeryInt { // size. // Batch addition of two vectors. - static rlwe::StatusOr> BatchAdd( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr> BatchAdd( const std::vector& in1, const std::vector& in2, const Params* params); static absl::Status BatchAddInPlace(std::vector* in1, @@ -361,7 +363,7 @@ class ABSL_MUST_USE_RESULT MontgomeryInt { const Params* params); // Batch addition of one vector with a scalar. - static rlwe::StatusOr> BatchAdd( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr> BatchAdd( const std::vector& in1, const MontgomeryInt& in2, const Params* params); static absl::Status BatchAddInPlace(std::vector* in1, @@ -369,51 +371,51 @@ class ABSL_MUST_USE_RESULT MontgomeryInt { const Params* params); // Batch subtraction of two vectors. - static rlwe::StatusOr> BatchSub( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr> BatchSub( const std::vector& in1, const std::vector& in2, const Params* params); - static absl::Status BatchSubInPlace(std::vector* in1, + static SHELL_ENCRYPTION_EXPORT absl::Status BatchSubInPlace(std::vector* in1, const std::vector& in2, const Params* params); // Batch subtraction of one vector with a scalar. - static rlwe::StatusOr> BatchSub( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr> BatchSub( const std::vector& in1, const MontgomeryInt& in2, const Params* params); - static absl::Status BatchSubInPlace(std::vector* in1, + static SHELL_ENCRYPTION_EXPORT absl::Status BatchSubInPlace(std::vector* in1, const MontgomeryInt& in2, const Params* params); // Batch multiplication of two vectors. - static rlwe::StatusOr> BatchMul( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr> BatchMul( const std::vector& in1, const std::vector& in2, const Params* params); - static absl::Status BatchMulInPlace(std::vector* in1, + static SHELL_ENCRYPTION_EXPORT absl::Status BatchMulInPlace(std::vector* in1, const std::vector& in2, const Params* params); // Batch multiplication of two vectors, where the second vector is a constant. - static rlwe::StatusOr> BatchMulConstant( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr> BatchMulConstant( const std::vector& in1, const std::vector& in2_constant, const std::vector& in2_constant_barrett, const Params* params); - static absl::Status BatchMulConstantInPlace( + static SHELL_ENCRYPTION_EXPORT absl::Status BatchMulConstantInPlace( std::vector* in1, const std::vector& in2_constant, const std::vector& in2_constant_barrett, const Params* params); // Batch multiplication of a vector with a scalar. - static rlwe::StatusOr> BatchMul( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr> BatchMul( const std::vector& in1, const MontgomeryInt& in2, const Params* params); - static absl::Status BatchMulInPlace(std::vector* in1, + static SHELL_ENCRYPTION_EXPORT absl::Status BatchMulInPlace(std::vector* in1, const MontgomeryInt& in2, const Params* params); // Batch multiplication of a vector with a constant scalar. - static rlwe::StatusOr> BatchMulConstant( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr> BatchMulConstant( const std::vector& in1, const Int& constant, const Int& constant_barrett, const Params* params); - static absl::Status BatchMulConstantInPlace(std::vector* in1, + static SHELL_ENCRYPTION_EXPORT absl::Status BatchMulConstantInPlace(std::vector* in1, const Int& constant, const Int& constant_barrett, const Params* params); @@ -423,14 +425,14 @@ class ABSL_MUST_USE_RESULT MontgomeryInt { bool operator!=(const MontgomeryInt& that) const { return !(*this == that); } // Modular exponentiation. - MontgomeryInt ModExp(Int exponent, const Params* params) const; + SHELL_ENCRYPTION_EXPORT MontgomeryInt ModExp(Int exponent, const Params* params) const; // Inverse. - MontgomeryInt MultiplicativeInverse(const Params* params) const; + SHELL_ENCRYPTION_EXPORT MontgomeryInt MultiplicativeInverse(const Params* params) const; private: template - static rlwe::StatusOr GenerateRandomInt(int log_modulus, Prng* prng) { + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr GenerateRandomInt(int log_modulus, Prng* prng) { // Generate a random Int. As the modulus is always smaller than max(Int), // there will be no issues with overflow. int max_bits_per_step = std::min((int)Params::bitsize_int, (int)64); @@ -467,6 +469,17 @@ class ABSL_MUST_USE_RESULT MontgomeryInt { Int n_; }; +// Instantiations of MontgomeryInt and MontgomeryIntParams with specific +// integral types. +extern template struct EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) MontgomeryIntParams; +extern template struct EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) MontgomeryIntParams; +extern template struct EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) MontgomeryIntParams; +extern template struct EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) MontgomeryIntParams; +extern template class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) MontgomeryInt; +extern template class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) MontgomeryInt; +extern template class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) MontgomeryInt; +extern template class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) MontgomeryInt; + } // namespace rlwe #endif // RLWE_MONTGOMERY_H_ diff --git a/montgomery_test.cc b/montgomery_test.cc index 7caf459a4c08b..2d952ddfbdad4 100644 --- a/montgomery_test.cc +++ b/montgomery_test.cc @@ -30,6 +30,8 @@ #include "testing/status_matchers.h" #include "testing/status_testing.h" #include "testing/testing_prng.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" +#include "third_party/shell-encryption/base/shell_encryption_export_template.h" namespace rlwe { namespace { @@ -65,7 +67,7 @@ uint256 GenerateRandom(unsigned int* seed) { } template -class MontgomeryTest : public ::testing::Test {}; +class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) MontgomeryTest : public ::testing::Test {}; TYPED_TEST_SUITE(MontgomeryTest, testing::ModularIntTypes); TYPED_TEST(MontgomeryTest, ModulusTooLarge) { diff --git a/ntt_parameters.h b/ntt_parameters.h index 55671ec5e65de..eba9579ab87ca 100644 --- a/ntt_parameters.h +++ b/ntt_parameters.h @@ -24,6 +24,7 @@ #include "constants.h" #include "status_macros.h" #include "statusor.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" namespace rlwe { namespace internal { @@ -94,7 +95,7 @@ rlwe::StatusOr> NttPsis( // Creates a vector containing the indices necessary to perform the NTT bit // reversal operation. Index i of the returned vector contains an integer with // the rightmost log_n bits of i reversed. -std::vector BitrevArray(unsigned int log_n); +SHELL_ENCRYPTION_EXPORT std::vector BitrevArray(unsigned int log_n); // Helper function: Perform the bit-reversal operation in-place on coeffs_. template diff --git a/prng/chacha_prng.h b/prng/chacha_prng.h index 27940fd82c646..7e4f719fedaf6 100644 --- a/prng/chacha_prng.h +++ b/prng/chacha_prng.h @@ -26,6 +26,7 @@ #include "prng/chacha_prng_util.h" #include "prng/prng.h" #include "statusor.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" namespace rlwe { @@ -56,7 +57,7 @@ class ChaChaPrng : public SecurePrng { // errors. // // Thread safe. - static rlwe::StatusOr> Create( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr> Create( absl::string_view in_key); // Returns 8 bits of randomness. @@ -72,12 +73,12 @@ class ChaChaPrng : public SecurePrng { // Generate a valid seed for the Prng. // // Fails on internal cryptographic errors. - static rlwe::StatusOr GenerateSeed() { + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr GenerateSeed() { return internal::ChaChaPrngGenerateKey(); } // Output the size of the expected generated seed. - static int SeedLength() { return internal::kChaChaKeyBytesSize; } + static SHELL_ENCRYPTION_EXPORT int SeedLength() { return internal::kChaChaKeyBytesSize; } private: explicit ChaChaPrng(absl::string_view in_key, int position_in_buffer, diff --git a/prng/chacha_prng_util.h b/prng/chacha_prng_util.h index 8eb8118fe26f9..80f0cedf4a703 100644 --- a/prng/chacha_prng_util.h +++ b/prng/chacha_prng_util.h @@ -27,6 +27,7 @@ #include "absl/strings/string_view.h" #include "integral_types.h" #include "statusor.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" namespace rlwe { namespace internal { @@ -37,28 +38,33 @@ const int kChaChaOutputBytes = 255 * 32; // Once pseudorandom output is exhausted, the salt is updated to construct // new pseudorandom output. -absl::Status ChaChaPrngResalt(absl::string_view key, int buffer_size, - int* salt_counter, int* position_in_buffer, - std::vector* buffer); +SHELL_ENCRYPTION_EXPORT absl::Status ChaChaPrngResalt( + absl::string_view key, + int buffer_size, + int* salt_counter, + int* position_in_buffer, + std::vector* buffer); // Generates a secure key for instantiating an CHACHA. -rlwe::StatusOr ChaChaPrngGenerateKey(); +SHELL_ENCRYPTION_EXPORT rlwe::StatusOr ChaChaPrngGenerateKey(); // Returns 8 bits of randomness. // // Fails on internal cryptographic errors. -rlwe::StatusOr ChaChaPrngRand8(absl::string_view key, - int* position_in_buffer, - int* salt_counter, - std::vector* buffer); +SHELL_ENCRYPTION_EXPORT rlwe::StatusOr ChaChaPrngRand8( + absl::string_view key, + int* position_in_buffer, + int* salt_counter, + std::vector* buffer); // Returns 64 bits of randomness. // // Fails on internal cryptographic errors. -rlwe::StatusOr ChaChaPrngRand64(absl::string_view key, - int* position_in_buffer, - int* salt_counter, - std::vector* buffer); +SHELL_ENCRYPTION_EXPORT rlwe::StatusOr ChaChaPrngRand64( + absl::string_view key, + int* position_in_buffer, + int* salt_counter, + std::vector* buffer); } // namespace internal } // namespace rlwe diff --git a/prng/single_thread_chacha_prng.h b/prng/single_thread_chacha_prng.h index fcaff827be355..2fddf6f3530c4 100644 --- a/prng/single_thread_chacha_prng.h +++ b/prng/single_thread_chacha_prng.h @@ -24,6 +24,7 @@ #include "prng/chacha_prng_util.h" #include "prng/prng.h" #include "statusor.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" namespace rlwe { @@ -52,7 +53,7 @@ class SingleThreadChaChaPrng : public SecurePrng { // // Fails if the key is not the expected size or on internal cryptographic // errors. - static rlwe::StatusOr> Create( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr> Create( absl::string_view in_key); // Returns 8 bits of randomness. diff --git a/relinearization_key.cc b/relinearization_key.cc index 7982a2f71a74c..0b22a50e0abb7 100644 --- a/relinearization_key.cc +++ b/relinearization_key.cc @@ -22,6 +22,8 @@ #include "status_macros.h" #include "statusor.h" #include "symmetric_encryption_with_prng.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" +#include "third_party/shell-encryption/base/shell_encryption_export_template.h" namespace rlwe { namespace { @@ -432,9 +434,9 @@ RelinearizationKey::Deserialize( // Instantiations of RelinearizationKey with specific MontgomeryInt classes. // If any new types are added, montgomery.h should be updated accordingly (such // as ensuring BigInt is correctly specialized, etc.). -template class RelinearizationKey>; -template class RelinearizationKey>; -template class RelinearizationKey>; -template class RelinearizationKey>; +template class EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) RelinearizationKey>; +template class EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) RelinearizationKey>; +template class EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) RelinearizationKey>; +template class EXPORT_TEMPLATE_DEFINE(SHELL_ENCRYPTION_EXPORT) RelinearizationKey>; } // namespace rlwe diff --git a/relinearization_key.h b/relinearization_key.h index 265da33e5af15..1aff179b9ed39 100644 --- a/relinearization_key.h +++ b/relinearization_key.h @@ -22,6 +22,8 @@ #include "sample_error.h" #include "statusor.h" #include "symmetric_encryption.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" +#include "third_party/shell-encryption/base/shell_encryption_export_template.h" namespace rlwe { // Represents a RelinearizationKey constructed from a symmetric-key. Applying a @@ -57,7 +59,7 @@ namespace rlwe { // length (k - 1), where k is the number of parts of the ciphertext it applies // to. template -class RelinearizationKey { +class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) RelinearizationKey { using ModularIntParams = typename ModularInt::Params; public: @@ -73,7 +75,7 @@ class RelinearizationKey { // with (1, s^k). In that case, we would use a relinearization key with // substition_power = k to return the ciphertext to be encrypted with (1,s). // See GaloisKey for an explicit wrapper around RelinearizationKey. - static rlwe::StatusOr Create( + static SHELL_ENCRYPTION_EXPORT rlwe::StatusOr Create( const SymmetricRlweKey& key, absl::string_view prng_seed, ssize_t num_parts, Uint64 log_decomposition_modulus, Uint64 substitution_power = 1); @@ -192,6 +194,13 @@ class RelinearizationKey { std::string prng_seed_; }; +// Instantiations of RelinearizationKey with specific MontgomeryInt classes. +// If any new types are added, montgomery.h should be updated accordingly (such +// as ensuring BigInt is correctly specialized, etc.). +extern template class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) RelinearizationKey>; +extern template class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) RelinearizationKey>; +extern template class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) RelinearizationKey>; +extern template class EXPORT_TEMPLATE_DECLARE(SHELL_ENCRYPTION_EXPORT) RelinearizationKey>; } // namespace rlwe #endif // RLWE_RELINEARIZATION_KEY_H_ diff --git a/statusor.h b/statusor.h index 200f62d917d0f..b7ada09372c9f 100644 --- a/statusor.h +++ b/statusor.h @@ -22,11 +22,12 @@ #include "absl/base/attributes.h" #include "absl/status/status.h" #include "absl/types/optional.h" +#include "third_party/shell-encryption/base/shell_encryption_export.h" namespace rlwe { template -class StatusOr { +class SHELL_ENCRYPTION_EXPORT StatusOr { public: // Construct a new StatusOr with Status::UNKNOWN status StatusOr(); @@ -112,12 +113,12 @@ class StatusOr { namespace internal { -class StatusOrHelper { +class SHELL_ENCRYPTION_EXPORT StatusOrHelper { public: // Move type-agnostic error handling to the .cc. - static absl::Status HandleInvalidStatusCtorArg(); - static absl::Status HandleNullObjectCtorArg(); - static void Crash(const absl::Status& status); + static SHELL_ENCRYPTION_EXPORT absl::Status HandleInvalidStatusCtorArg(); + static SHELL_ENCRYPTION_EXPORT absl::Status HandleNullObjectCtorArg(); + static SHELL_ENCRYPTION_EXPORT void Crash(const absl::Status& status); // Customized behavior for StatusOr vs. StatusOr template @@ -125,13 +126,13 @@ class StatusOrHelper { }; template -struct StatusOrHelper::Specialize { +struct SHELL_ENCRYPTION_EXPORT StatusOrHelper::Specialize { // For non-pointer T, a reference can never be NULL. static inline bool IsValueNull(const T& t) { return false; } }; template -struct StatusOrHelper::Specialize { +struct SHELL_ENCRYPTION_EXPORT StatusOrHelper::Specialize { static inline bool IsValueNull(const T* t) { return t == nullptr; } };