7 #if CRYPTOPP_MSC_VERSION 8 # pragma warning(disable: 4189 4589) 11 #ifndef CRYPTOPP_IMPORTS 23 #if defined(CRYPTOPP_DEBUG) && !defined(CRYPTOPP_DOXYGEN_PROCESSING) 24 void TestInstantiations_gfpcrypt()
48 int modulusSize = 2048, defaultSubgroupOrderSize;
54 defaultSubgroupOrderSize = 160;
57 defaultSubgroupOrderSize = 224;
60 defaultSubgroupOrderSize = 256;
76 pass = pass && ((pSize==1024 && qSize==160) || (pSize==2048 && qSize==224) || (pSize==2048 && qSize==256) || (pSize==3072 && qSize==256));
83 const byte *recoverableMessage,
size_t recoverableMessageLength,
85 byte *representative,
size_t representativeBitLength)
const 87 CRYPTOPP_UNUSED(rng), CRYPTOPP_UNUSED(recoverableMessage), CRYPTOPP_UNUSED(recoverableMessageLength);
88 CRYPTOPP_UNUSED(messageEmpty), CRYPTOPP_UNUSED(hashIdentifier);
92 const size_t representativeByteLength =
BitsToBytes(representativeBitLength);
96 memset(representative, 0, paddingLength);
99 if (digestSize*8 > representativeBitLength)
101 Integer h(representative, representativeByteLength);
102 h >>= representativeByteLength*8 - representativeBitLength;
103 h.
Encode(representative, representativeByteLength);
108 const byte *recoverableMessage,
size_t recoverableMessageLength,
110 byte *representative,
size_t representativeBitLength)
const 112 CRYPTOPP_UNUSED(rng);CRYPTOPP_UNUSED(recoverableMessage); CRYPTOPP_UNUSED(recoverableMessageLength);
113 CRYPTOPP_UNUSED(hash); CRYPTOPP_UNUSED(hashIdentifier); CRYPTOPP_UNUSED(messageEmpty);
114 CRYPTOPP_UNUSED(representative); CRYPTOPP_UNUSED(representativeBitLength);
118 const size_t representativeByteLength =
BitsToBytes(representativeBitLength);
120 const size_t paddingLength =
SaturatingSubtract(representativeByteLength, digestSize);
122 memset(representative, 0, paddingLength);
123 hash.
TruncatedFinal(representative+paddingLength,
STDMIN(representativeByteLength, digestSize));
125 if (digestSize*8 >= representativeBitLength)
127 Integer h(representative, representativeByteLength);
128 h >>= representativeByteLength*8 - representativeBitLength + 1;
129 h.
Encode(representative, representativeByteLength);
178 if (GetFieldType() == 2)
180 pass = pass &&
Jacobi(g*g-4, p)==-1;
186 bool fullValidate = (GetFieldType() == 2 && level >= 3) || !FastSubgroupCheckAvailable();
188 if (fullValidate && pass)
194 else if (GetFieldType() == 1)
196 pass = pass &&
Jacobi(g, p) == 1;
214 int modulusSize, subgroupOrderSize;
219 if (!alg.
GetIntValue(
"SubgroupOrderSize", subgroupOrderSize))
220 subgroupOrderSize = GetDefaultSubgroupOrderSize(modulusSize);
223 pg.
Generate(GetFieldType() == 1 ? 1 : -1, rng, modulusSize, subgroupOrderSize);
232 void DL_GroupParameters_IntegerBased::EncodeElement(
bool reversible,
const Element &element, byte *encoded)
const 234 CRYPTOPP_UNUSED(reversible);
235 element.Encode(encoded, GetModulus().ByteCount());
240 CRYPTOPP_UNUSED(reversible);
246 CRYPTOPP_UNUSED(checkForGroupMembership);
247 Integer g(encoded, GetModulus().ByteCount());
259 if (parameters.EndReached())
262 q = ComputeGroupOrder(p) / 2;
266 parameters.MessageEnd();
268 SetModulusAndSubgroupGenerator(p, g);
276 m_q.DEREncode(parameters);
278 parameters.MessageEnd();
283 return GetValueHelper<DL_GroupParameters<Element> >(
this, name, valueType, pValue)
284 CRYPTOPP_GET_FUNCTION_ENTRY(
Modulus);
289 AssignFromHelper(
this, source)
295 OID DL_GroupParameters_IntegerBased::GetAlgorithmID()
const 297 return ASN1::id_dsa();
300 void DL_GroupParameters_GFP::SimultaneousExponentiate(Element *results,
const Element &base,
const Integer *exponents,
unsigned int exponentsCount)
const 306 DL_GroupParameters_GFP::Element DL_GroupParameters_GFP::MultiplyElements(
const Element &a,
const Element &b)
const 308 return a_times_b_mod_c(a, b, GetModulus());
311 DL_GroupParameters_GFP::Element DL_GroupParameters_GFP::CascadeExponentiate(
const Element &element1,
const Integer &exponent1,
const Element &element2,
const Integer &exponent2)
const 322 unsigned int DL_GroupParameters_IntegerBased::GetDefaultSubgroupOrderSize(
unsigned int modulusSize)
const void AssignFrom(const NameValuePairs &source)
Assign values to this object.
int GetIntValueWithDefault(const char *name, int defaultValue) const
Get a named value with type int, with default.
An invalid argument was detected.
void BERDecode(BufferedTransformation &bt)
Decode this object from a BufferedTransformation.
virtual Element Exponentiate(const DL_GroupPrecomputation< Element > &group, const Integer &exponent) const =0
Exponentiates an element.
virtual Integer GetCofactor() const
Retrieves the cofactor.
Utility functions for the Crypto++ library.
const DL_GroupPrecomputation< Element > & GetGroupPrecomputation() const
Retrieves the group precomputation.
T GetValueWithDefault(const char *name, T defaultValue) const
Get a named value.
Integer GetGroupOrder() const
Retrieves the order of the group.
void DEREncode(BufferedTransformation &bt) const
Encode in DER format.
size_t BitsToBytes(size_t bitCount)
Returns the number of 8-bit bytes or octets required for the specified number of bits.
ASN.1 object identifiers for algorthms and schemes.
Library configuration file.
Ring of congruence classes modulo n.
Interface for random number generators.
int Jacobi(const Integer &a, const Integer &b)
Calculate the Jacobi symbol.
Combines two sets of NameValuePairs.
Generator of prime numbers of special forms.
bool IsPositive() const
Determines if the Integer is positive.
bool NotNegative() const
Determines if the Integer is non-negative.
static const Integer & One()
Integer representing 1.
bool ValidateGroup(RandomNumberGenerator &rng, unsigned int level) const
Check the group for errors.
unsigned int ByteCount() const
Determines the number of bytes required to represent the Integer.
const char * SubgroupOrderSize()
int, in bits
const Integer & SubPrime() const
Retrieve second prime.
const Integer & Prime() const
Retrieve first prime.
Integer CascadeExponentiate(const Integer &x, const Integer &e1, const Integer &y, const Integer &e2) const
TODO.
AlgorithmParameters MakeParameters(const char *name, const T &value, bool throwIfNotUsed=true)
Create an object that implements NameValuePairs.
bool VerifyPrime(RandomNumberGenerator &rng, const Integer &p, unsigned int level=1)
Verifies a number is probably prime.
virtual const Element & GetSubgroupGenerator() const
Retrieves the subgroup generator.
static Integer Power2(size_t e)
Exponentiates to a power of 2.
Multiple precision integer with arithmetic operations.
T1 SaturatingSubtract(const T1 &a, const T2 &b)
Performs a saturating subtract clamped at 0.
const char * SubgroupGenerator()
Integer, ECP::Point, or EC2N::Point.
Classes and functions for schemes based on Discrete Logs (DL) over GF(p)
bool IsIdentity(const Integer &element) const
Determines if an element is an identity.
void GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg)
bool ValidateGroup(RandomNumberGenerator &rng, unsigned int level) const
Exception thrown when an invalid group element is encountered.
RandomNumberGenerator & NullRNG()
Random Number Generator that does not produce random numbers.
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
Classes and functions for working with ANS.1 objects.
void Initialize(const DL_GroupParameters_IntegerBased ¶ms)
Initialize a group parameters over integers.
unsigned int BitCount() const
Determines the number of bits required to represent the Integer.
Classes and functions for number theoretic operations.
unsigned int DiscreteLogWorkFactor(unsigned int bitlength)
Estimate work factor.
void Encode(byte *output, size_t outputLen, Signedness sign=UNSIGNED) const
Encode in big-endian format.
bool ValidateElement(unsigned int level, const Integer &element, const DL_FixedBasePrecomputation< Integer > *precomp) const
Check the element for errors.
void DEREncode(BufferedTransformation &bt) const
Encode this object into a BufferedTransformation.
Integer GetMaxExponent() const
Retrieves the maximum exponent for the group.
const char * Modulus()
Integer.
void Generate(signed int delta, RandomNumberGenerator &rng, unsigned int pbits, unsigned qbits)
Generate a Prime and Generator.
void SimultaneousExponentiate(Element *results, const Element &base, const Integer *exponents, unsigned int exponentsCount) const
Exponentiates a base to multiple exponents in the ring.
Multiple precision integer with arithmetic operations.
const Integer & GetSubgroupOrder() const
Retrieves the subgroup order.
static const Integer & Zero()
Integer representing 0.
unsigned int GetEncodedElementSize(bool reversible) const
Retrieves the encoded element's size.
void BERDecode(const byte *input, size_t inputLen)
Decode from BER format.
Class file for performing modular arithmetic.
Crypto++ library namespace.
bool GetValue(const char *name, T &value) const
Get a named value.
bool GetIntValue(const char *name, int &value) const
Get a named value with type int.
Integer DecodeElement(const byte *encoded, bool checkForGroupMembership) const
Decodes the element.
virtual Element ExponentiateElement(const Element &base, const Integer &exponent) const
Exponentiates an element.
const char * SubgroupOrder()
Integer.
const Integer & Generator() const
Retrieve the generator.
void GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg)
bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const
Get a named value.
bool IsOdd() const
Determines if the Integer is odd parity.
Interface for retrieving values given their names.
Template implementing constructors for public key algorithm classes.