Skip to content

ProofSystem/include/ProofSystem/ECElGamalKeyGenerator.hpp

Header file of EC ElGamal module. More...

Classes

Name
class ECElGamalKeyGenerator

Detailed Description

Header file of EC ElGamal module.

Date: 2024-02-01 Henrique A. Klein ([email protected])

Source code

#ifndef _EC_ELGAMAL_HPP_
#define _EC_ELGAMAL_HPP_

#include "ECElGamalTypes.hpp"
#include "ECDSATypes.hpp"

class ECElGamalKeyGenerator
{

#ifdef _USE_CRYPTO3_
    using cpp_int = nil::crypto3::multiprecision::cpp_int;
#else
    using cpp_int = boost::multiprecision::cpp_int;
#endif

public:
    ECElGamalKeyGenerator( const cpp_int &key_scalar )
    {
        private_key = std::make_shared<PrivateKey<ecdsa_t::CurveType, ecdsa_t::padding_policy, ecdsa_t::generator_type>>(
            static_cast<typename PrivateKey<ecdsa_t::CurveType, ecdsa_t::padding_policy, ecdsa_t::generator_type>::private_key_type>( key_scalar ) );
        public_key = std::make_shared<PublicKey<ecdsa_t::CurveType, ecdsa_t::padding_policy, ecdsa_t::generator_type>>( *private_key );
    }

    const PrivateKey<ecdsa_t::CurveType, ecdsa_t::padding_policy, ecdsa_t::generator_type> &GetPrivateKey() const
    {
        return *private_key;
    }

    std::pair<ECElGamalPoint<ecdsa_t::CurveType>, ECElGamalPoint<ecdsa_t::CurveType>> EncryptData( const cpp_int &data )
    {
        ecdsa_t::random_generator_type     random_gen;
        auto                               random_num = random_gen();
        ECElGamalPoint<ecdsa_t::CurveType> C1( random_num * ECElGamalPoint<ecdsa_t::CurveType>::curve_point_type::one() );

        ECElGamalPoint<ecdsa_t::CurveType> M( data );
        ECElGamalPoint<ecdsa_t::CurveType> kQ( random_num * public_key->pubkey_data() );
        ECElGamalPoint<ecdsa_t::CurveType> C2 = M + kQ;

        return std::make_pair( C1, C2 );
    }
    cpp_int DecryptData( const std::pair<ECElGamalPoint<ecdsa_t::CurveType>, ECElGamalPoint<ecdsa_t::CurveType>> &data )
    {

        ECElGamalPoint<ecdsa_t::CurveType> dC1( ( *data.first.curve_point ) * private_key->GetPrivateKeyScalar() );
        ECElGamalPoint<ecdsa_t::CurveType> M = data.second - dC1;

        return M.UnMap();
    }

private:
    std::shared_ptr<PrivateKey<ecdsa_t::CurveType, ecdsa_t::padding_policy, ecdsa_t::generator_type>> private_key; 
    std::shared_ptr<PublicKey<ecdsa_t::CurveType, ecdsa_t::padding_policy, ecdsa_t::generator_type>>  public_key;  
};

#endif

Updated on 2026-03-04 at 13:10:44 -0800