Program Listing for File random.cu

Return to documentation for file (src/lib/util/random.cu)

// Copyright 2024-2026 Alişah Özcan
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
// Developer: Alişah Özcan

#include <heongpu/util/random.cuh>

namespace heongpu
{
    std::shared_ptr<rngongpu::RNG<rngongpu::Mode::AES>>
        RandomNumberGenerator::generator_ = nullptr;
    bool RandomNumberGenerator::initialized_ = false;
    std::mutex RandomNumberGenerator::mutex_;

    RandomNumberGenerator& RandomNumberGenerator::instance()
    {
        static RandomNumberGenerator instance;
        return instance;
    }

    void RandomNumberGenerator::initialize(
        const std::vector<unsigned char>& key,
        const std::vector<unsigned char>& nonce,
        const std::vector<unsigned char>& personalization_string,
        rngongpu::SecurityLevel security_level,
        bool prediction_resistance_enabled)
    {
        std::lock_guard<std::mutex> guard(mutex_);
        if (!initialized_)
        {
            generator_ = std::make_shared<rngongpu::RNG<rngongpu::Mode::AES>>(
                key, nonce, personalization_string, security_level,
                prediction_resistance_enabled);

            initialized_ = true;
        }
    }

    void RandomNumberGenerator::set(
        const std::vector<unsigned char>& entropy_input,
        const std::vector<unsigned char>& nonce,
        const std::vector<unsigned char>& personalization_string,
        cudaStream_t stream)
    {
        generator_->set(entropy_input, nonce, personalization_string, stream);
    }

    RandomNumberGenerator::RandomNumberGenerator() = default;

    RandomNumberGenerator::~RandomNumberGenerator()
    {
        generator_.reset();
    }

    __host__ void
    RandomNumberGenerator::modular_uniform_random_number_generation(
        Data64* pointer, Modulus64* modulus, Data64 log_size, int mod_count,
        int repeat_count, cudaStream_t stream)
    {
        std::vector<unsigned char> additional_input = {};
        generator_->modular_uniform_random_number(pointer, modulus, log_size,
                                                  mod_count, repeat_count,
                                                  additional_input, stream);
    }

    __host__ void
    RandomNumberGenerator::modular_uniform_random_number_generation(
        Data64* pointer, Modulus64* modulus, Data64 log_size, int mod_count,
        int repeat_count, std::vector<unsigned char>& entropy_input,
        std::vector<unsigned char> additional_input, cudaStream_t stream)
    {
        generator_->modular_uniform_random_number(
            pointer, modulus, log_size, mod_count, repeat_count, entropy_input,
            additional_input, stream);
    }

    __host__ void
    RandomNumberGenerator::modular_uniform_random_number_generation(
        Data64* pointer, Modulus64* modulus, Data64 log_size, int mod_count,
        int* mod_index, int repeat_count, cudaStream_t stream)
    {
        std::vector<unsigned char> additional_input = {};
        generator_->modular_uniform_random_number(
            pointer, modulus, log_size, mod_count, mod_index, repeat_count,
            additional_input, stream);
    }

    __host__ void
    RandomNumberGenerator::modular_uniform_random_number_generation(
        Data64* pointer, Modulus64* modulus, Data64 log_size, int mod_count,
        int* mod_index, int repeat_count,
        std::vector<unsigned char>& entropy_input,
        std::vector<unsigned char> additional_input, cudaStream_t stream)
    {
        generator_->modular_uniform_random_number(
            pointer, modulus, log_size, mod_count, mod_index, repeat_count,
            entropy_input, additional_input, stream);
    }

    __host__ void
    RandomNumberGenerator::modular_gaussian_random_number_generation(
        Float64 std_dev, Data64* pointer, Modulus64* modulus, Data64 log_size,
        int mod_count, int repeat_count, cudaStream_t stream)
    {
        std::vector<unsigned char> additional_input = {};
        generator_->modular_normal_random_number(
            std_dev, pointer, modulus, log_size, mod_count, repeat_count,
            additional_input, stream);
    }

    __host__ void
    RandomNumberGenerator::modular_gaussian_random_number_generation(
        Float64 std_dev, Data64* pointer, Modulus64* modulus, Data64 log_size,
        int mod_count, int repeat_count,
        std::vector<unsigned char>& entropy_input,
        std::vector<unsigned char> additional_input, cudaStream_t stream)
    {
        generator_->modular_normal_random_number(
            std_dev, pointer, modulus, log_size, mod_count, repeat_count,
            entropy_input, additional_input, stream);
    }

    __host__ void
    RandomNumberGenerator::modular_gaussian_random_number_generation(
        Float64 std_dev, Data64* pointer, Modulus64* modulus, Data64 log_size,
        int mod_count, int* mod_index, int repeat_count, cudaStream_t stream)
    {
        std::vector<unsigned char> additional_input = {};
        generator_->modular_normal_random_number(
            std_dev, pointer, modulus, log_size, mod_count, mod_index,
            repeat_count, additional_input, stream);
    }

    __host__ void
    RandomNumberGenerator::modular_gaussian_random_number_generation(
        Float64 std_dev, Data64* pointer, Modulus64* modulus, Data64 log_size,
        int mod_count, int* mod_index, int repeat_count,
        std::vector<unsigned char>& entropy_input,
        std::vector<unsigned char> additional_input, cudaStream_t stream)
    {
        generator_->modular_normal_random_number(
            std_dev, pointer, modulus, log_size, mod_count, mod_index,
            repeat_count, entropy_input, additional_input, stream);
    }

    __host__ void
    RandomNumberGenerator::modular_ternary_random_number_generation(
        Data64* pointer, Modulus64* modulus, Data64 log_size, int mod_count,
        int repeat_count, cudaStream_t stream)
    {
        std::vector<unsigned char> additional_input = {};
        generator_->modular_ternary_random_number(pointer, modulus, log_size,
                                                  mod_count, repeat_count,
                                                  additional_input, stream);
    }

    __host__ void
    RandomNumberGenerator::modular_ternary_random_number_generation(
        Data64* pointer, Modulus64* modulus, Data64 log_size, int mod_count,
        int repeat_count, std::vector<unsigned char>& entropy_input,
        std::vector<unsigned char> additional_input, cudaStream_t stream)
    {
        generator_->modular_ternary_random_number(
            pointer, modulus, log_size, mod_count, repeat_count, entropy_input,
            additional_input, stream);
    }

    __host__ void
    RandomNumberGenerator::modular_ternary_random_number_generation(
        Data64* pointer, Modulus64* modulus, Data64 log_size, int mod_count,
        int* mod_index, int repeat_count, cudaStream_t stream)
    {
        std::vector<unsigned char> additional_input = {};
        generator_->modular_ternary_random_number(
            pointer, modulus, log_size, mod_count, mod_index, repeat_count,
            additional_input, stream);
    }

    __host__ void
    RandomNumberGenerator::modular_ternary_random_number_generation(
        Data64* pointer, Modulus64* modulus, Data64 log_size, int mod_count,
        int* mod_index, int repeat_count,
        std::vector<unsigned char>& entropy_input,
        std::vector<unsigned char> additional_input, cudaStream_t stream)
    {
        generator_->modular_ternary_random_number(
            pointer, modulus, log_size, mod_count, mod_index, repeat_count,
            entropy_input, additional_input, stream);
    }

} // namespace heongpu