6#ifndef CRYPTOPP_ELGAMAL_H
7#define CRYPTOPP_ELGAMAL_H
19NAMESPACE_BEGIN(CryptoPP)
33 CRYPTOPP_UNUSED(groupParams); CRYPTOPP_UNUSED(ephemeralPublicKey);
34 CRYPTOPP_UNUSED(derivationParams);
35 agreedElement.
Encode(derivedKey, derivedLength);
38 size_t GetSymmetricKeyLength(
size_t plainTextLength)
const
40 CRYPTOPP_UNUSED(plainTextLength);
41 return GetGroupParameters().GetModulus().ByteCount();
44 size_t GetSymmetricCiphertextLength(
size_t plainTextLength)
const
46 unsigned int len = GetGroupParameters().GetModulus().ByteCount();
47 if (plainTextLength <= GetMaxSymmetricPlaintextLength(len))
53 size_t GetMaxSymmetricPlaintextLength(
size_t cipherTextLength)
const
55 unsigned int len = GetGroupParameters().GetModulus().ByteCount();
56 CRYPTOPP_ASSERT(len >= 3);
58 if (cipherTextLength == len)
59 return STDMIN(255U, len-3);
66 CRYPTOPP_UNUSED(parameters);
67 const Integer &p = GetGroupParameters().GetModulus();
72 memcpy(block+modulusLen-2-plainTextLength, plainText, plainTextLength);
73 block[modulusLen-2] = (
byte)plainTextLength;
75 a_times_b_mod_c(
Integer(key, modulusLen),
Integer(block, modulusLen-1), p).
Encode(cipherText, modulusLen);
78 DecodingResult SymmetricDecrypt(
const byte *key,
const byte *cipherText,
size_t cipherTextLength,
byte *plainText,
const NameValuePairs ¶meters)
const
80 CRYPTOPP_UNUSED(parameters);
81 const Integer &p = GetGroupParameters().GetModulus();
84 if (cipherTextLength != modulusLen)
87 Integer m = a_times_b_mod_c(
Integer(cipherText, modulusLen),
Integer(key, modulusLen).InverseMod(p), p);
90 unsigned int plainTextLength = plainText[0];
91 if (plainTextLength > GetMaxSymmetricPlaintextLength(modulusLen))
94 m.
Encode(plainText, plainTextLength);
106template <
class BASE,
class SCHEME_OPTIONS,
class KEY>
114 size_t FixedMaxPlaintextLength()
const {
return this->MaxPlaintextLength(FixedCiphertextLength());}
115 size_t FixedCiphertextLength()
const {
return this->CiphertextLength(0);}
120 {
return Decrypt(rng, cipherText, FixedCiphertextLength(), plainText);}
155 return ASN1::elGamal();
186 return ASN1::elGamal();
218 CRYPTOPP_ASSERT(this->GetAbstractGroupParameters().
Validate(rng, level));
219 bool pass = this->GetAbstractGroupParameters().Validate(rng, level);
221 const Integer &p = this->GetGroupParameters().GetModulus();
222 const Integer &q = this->GetAbstractGroupParameters().GetSubgroupOrder();
223 const Integer &x = this->GetPrivateExponent();
226 CRYPTOPP_ASSERT(x.IsPositive());
227 CRYPTOPP_ASSERT(x < p-1);
228 pass = pass && x.IsPositive() && x < p-1;
287 typedef SchemeOptions::PublicKey
PublicKey;
Classes and functions for working with ANS.1 objects.
Interface for Discrete Log (DL) group parameters.
Diffie-Hellman key agreement algorithm.
Interface for DL key agreement algorithms.
Interface for key derivation algorithms used in DL cryptosystems.
Discrete Log (DL) base object implementation.
Interface for symmetric encryption algorithms used in DL cryptosystems.
ElGamal key agreement and encryption schemes base class.
ElGamal key agreement and encryption schemes default implementation.
Multiple precision integer with arithmetic operations.
static Integer CRYPTOPP_API Gcd(const Integer &a, const Integer &n)
Calculate greatest common divisor.
static const Integer &CRYPTOPP_API One()
Integer representing 1.
unsigned int ByteCount() const
Determines the number of bytes required to represent the Integer.
void Encode(byte *output, size_t outputLen, Signedness sign=UNSIGNED) const
Encode in big-endian format.
Interface for retrieving values given their names.
Template implementing constructors for public key algorithm classes.
Interface for private keys.
Interface for public keys.
Interface for random number generators.
virtual void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
unsigned char byte
8-bit unsigned datatype
Abstract base classes that provide a uniform interface to this library.
Classes for the DSA signature algorithm.
Classes and functions for schemes based on Discrete Logs (DL) over GF(p)
Multiple precision integer with arithmetic operations.
Utility functions for the Crypto++ library.
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
ASN.1 object identifiers for algorithms and schemes.
This file contains helper classes/functions for implementing public key algorithms.
Discrete Log (DL) crypto scheme options.
ElGamal Private Key adapter.
virtual OID GetAlgorithmID() const
Retrieves the OID of the algorithm.
bool Validate(RandomNumberGenerator &rng, unsigned int level) const
Check the key for errors.
ElGamal Public Key adapter.
virtual OID GetAlgorithmID() const
Retrieves the OID of the algorithm.
Returns a decoding results.
ElGamal encryption scheme with non-standard padding.
PK_FinalTemplate< ElGamalObjectImpl< DL_EncryptorBase< Integer >, SchemeOptions, SchemeOptions::PublicKey > > Encryptor
Implements PK_Encryptor interface.
CRYPTOPP_STATIC_CONSTEXPR const char * StaticAlgorithmName()
The algorithm name.
PK_FinalTemplate< ElGamalObjectImpl< DL_DecryptorBase< Integer >, SchemeOptions, SchemeOptions::PrivateKey > > Decryptor
Implements PK_Encryptor interface.
SchemeOptions::GroupParameters GroupParameters
Implements DL_GroupParameters interface.
ElGamal key agreement and encryption schemes keys.
DL_PrivateKey_ElGamal< DL_CryptoKeys_ElGamal::PrivateKey > PrivateKey
Implements DL_PrivateKey interface.
DL_CryptoKeys_ElGamal::GroupParameters GroupParameters
Implements DL_GroupParameters interface.
DL_PublicKey_ElGamal< DL_CryptoKeys_ElGamal::PublicKey > PublicKey
Implements DL_PublicKey interface.
Converts an enumeration to a type suitable for use as a template parameter.