5 #ifndef CRYPTOPP_IMPORTS 13 #include "algebra.cpp" 15 ANONYMOUS_NAMESPACE_BEGIN
18 using CryptoPP::ModularArithmetic;
20 #if defined(HAVE_GCC_INIT_PRIORITY) 21 const ECP::Point g_identity __attribute__ ((init_priority (CRYPTOPP_INIT_PRIORITY + 51))) =
ECP::Point();
22 #elif defined(HAVE_MSC_INIT_PRIORITY) 23 #pragma warning(disable: 4075) 24 #pragma init_seg(".CRT$XCU") 26 #pragma warning(default: 4075) 27 #elif defined(HAVE_XLC_INIT_PRIORITY) 42 ANONYMOUS_NAMESPACE_END
46 ECP::
ECP(const
ECP &ecp,
bool convertToMontgomeryRepresentation)
48 if (convertToMontgomeryRepresentation && !ecp.GetField().IsMontgomeryRepresentation())
51 m_a = GetField().ConvertIn(ecp.m_a);
52 m_b = GetField().ConvertIn(ecp.m_b);
59 : m_fieldPtr(new
Field(bt))
65 if (!seq.EndReached())
92 if (encodedPointLen < 1 || !bt.
Get(type))
109 P.x.Decode(bt, GetField().MaxElementByteLength());
110 P.y = ((P.x*P.x+m_a)*P.x+m_b) % p;
117 if ((type & 1) != P.y.GetBit(0))
144 bt.
Put((byte)(2U + P.y.GetBit(0)));
145 P.x.Encode(bt, GetField().MaxElementByteLength());
184 bool pass = p.
IsOdd();
188 pass = pass && ((4*m_a*m_a*m_a+27*m_b*m_b)%p).IsPositive();
201 (!x.IsNegative() && x<p && !y.
IsNegative() && y<p
202 && !(((x*x+m_a)*x+m_b-y*y)%p));
207 if (P.identity && Q.identity)
210 if (P.identity && !Q.identity)
213 if (!P.identity && Q.identity)
216 return (GetField().
Equal(P.x,Q.x) && GetField().
Equal(P.y,Q.y));
221 #if defined(HAVE_GCC_INIT_PRIORITY) || defined(HAVE_MSC_INIT_PRIORITY) || defined(HAVE_XLC_INIT_PRIORITY) 223 #elif defined(CRYPTOPP_CXX11_DYNAMIC_INIT) 237 m_R.identity =
false;
239 m_R.y = GetField().
Inverse(P.y);
246 if (P.identity)
return Q;
247 if (Q.identity)
return P;
248 if (GetField().
Equal(P.x, Q.x))
254 m_R.y = GetField().
Subtract(GetField().Multiply(t, GetField().
Subtract(P.x, x)), P.y);
257 m_R.identity =
false;
266 t = GetField().
Add(GetField().
Add(GetField().
Double(t), t), m_a);
269 m_R.y = GetField().
Subtract(GetField().Multiply(t, GetField().
Subtract(P.x, x)), P.y);
272 m_R.identity =
false;
276 template <
class T,
class Iterator>
void ParallelInvert(
const AbstractRing<T> &ring, Iterator begin, Iterator end)
278 size_t n = end-begin;
283 std::vector<T> vec((n+1)/2);
287 for (i=0, it=begin; i<n/2; i++, it+=2)
288 vec[i] = ring.
Multiply(*it, *(it+1));
292 ParallelInvert(ring, vec.begin(), vec.end());
294 for (i=0, it=begin; i<n/2; i++, it+=2)
303 std::swap(*it, *(it+1));
305 *(it+1) = ring.
Multiply(*(it+1), vec[i]);
317 : x(x), y(y), z(z) {}
326 : mr(m_mr), firstDoubling(
true), negated(
false)
328 CRYPTOPP_UNUSED(m_b);
357 sixteenY4 = mr.
Square(fourY2);
363 bool firstDoubling, negated;
364 Integer sixteenY4, aZ4, twoY, fourY2, S, M;
370 ZIterator(std::vector<ProjectivePoint>::iterator it) : it(it) {}
371 Integer& operator*() {
return it->z;}
372 int operator-(
ZIterator it2) {
return int(it-it2.it);}
374 ZIterator& operator+=(
int i) {it+=i;
return *
this;}
375 std::vector<ProjectivePoint>::iterator it;
390 if (!GetField().IsMontgomeryRepresentation())
392 ECP ecpmr(*
this,
true);
395 for (
unsigned int i=0; i<expCount; i++)
396 results[i] = FromMontgomery(mr, results[i]);
401 std::vector<ProjectivePoint> bases;
402 std::vector<WindowSlider> exponents;
403 exponents.reserve(expCount);
404 std::vector<std::vector<word32> > baseIndices(expCount);
405 std::vector<std::vector<bool> > negateBase(expCount);
406 std::vector<std::vector<word32> > exponentWindows(expCount);
409 for (i=0; i<expCount; i++)
413 exponents[i].FindNextWindow();
416 unsigned int expBitPosition = 0;
422 bool baseAdded =
false;
423 for (i=0; i<expCount; i++)
425 if (!exponents[i].finished && expBitPosition == exponents[i].windowBegin)
429 bases.push_back(rd.P);
433 exponentWindows[i].push_back(exponents[i].expWindow);
434 baseIndices[i].push_back((word32)bases.size()-1);
435 negateBase[i].push_back(exponents[i].negateNext);
437 exponents[i].FindNextWindow();
439 notDone = notDone || !exponents[i].finished;
451 for (i=0; i<bases.size(); i++)
453 if (bases[i].z.NotZero())
455 bases[i].y = GetField().
Multiply(bases[i].y, bases[i].z);
456 bases[i].z = GetField().
Square(bases[i].z);
457 bases[i].x = GetField().
Multiply(bases[i].x, bases[i].z);
458 bases[i].y = GetField().
Multiply(bases[i].y, bases[i].z);
462 std::vector<BaseAndExponent<Point, Integer> > finalCascade;
463 for (i=0; i<expCount; i++)
465 finalCascade.resize(baseIndices[i].size());
466 for (
unsigned int j=0; j<baseIndices[i].size(); j++)
470 finalCascade[j].base.identity =
true;
473 finalCascade[j].base.identity =
false;
474 finalCascade[j].base.x = base.x;
475 if (negateBase[i][j])
476 finalCascade[j].base.y = GetField().
Inverse(base.y);
478 finalCascade[j].base.y = base.y;
482 results[i] = GeneralCascadeMultiplication(*
this, finalCascade.begin(), finalCascade.end());
488 if (!GetField().IsMontgomeryRepresentation())
490 ECP ecpmr(*
this,
true);
492 return FromMontgomery(mr, ecpmr.
CascadeScalarMultiply(ToMontgomery(mr, P), k1, ToMontgomery(mr, Q), k2));
const Integer & Double(const Integer &a) const
Doubles an element in the ring.
bool VerifyPoint(const Point &P) const
Verifies points on elliptic curve.
Integer & Reduce(Integer &a, const Integer &b) const
TODO.
bool Equal(const Integer &a, const Integer &b) const
Compare two elements for equality.
const Integer & Square(const Integer &a) const
Square an element in the ring.
const Integer & Divide(const Integer &a, const Integer &b) const
Divides elements in the ring.
Restricts the instantiation of a class to one static object without locks.
Elliptical Curve Point over GF(p), where p is prime.
virtual const Element & Subtract(const Element &a, const Element &b) const
Subtracts elements in the group.
virtual const Element & Multiply(const Element &a, const Element &b) const =0
Multiplies elements in the group.
Classes for Elliptic Curves over prime fields.
Elliptic Curve over GF(p), where p is prime.
virtual Integer ConvertOut(const Integer &a) const
Reduces an element in the congruence class.
const Integer & Inverse(const Integer &a) const
Inverts the element in the ring.
bool InversionIsFast() const
Determine if inversion is fast.
const Integer & Subtract(const Integer &a, const Integer &b) const
Subtracts elements in the ring.
unsigned int MaxElementByteLength() const
Provides the maximum byte size of an element in the ring.
bool IsNegative() const
Determines if the Integer is negative.
Ring of congruence classes modulo n.
Interface for random number generators.
int Jacobi(const Integer &a, const Integer &b)
Calculate the Jacobi symbol.
bool DecodePoint(Point &P, BufferedTransformation &bt, size_t len) const
Decodes an elliptic curve point.
Integer ModularSquareRoot(const Integer &a, const Integer &p)
Extract a modular square root.
bool NotNegative() const
Determines if the Integer is non-negative.
virtual Element CascadeScalarMultiply(const Element &x, const Integer &e1, const Element &y, const Integer &e2) const
TODO.
const Integer & Add(const Integer &a, const Integer &b) const
Adds elements in the ring.
const Integer & Identity() const
Provides the Identity element.
const Point & Identity() const
Provides the Identity element.
void DEREncodeElement(BufferedTransformation &out, const Element &a) const
Encodes element in DER format.
Point CascadeScalarMultiply(const Point &P, const Integer &k1, const Point &Q, const Integer &k2) const
TODO.
const Point & Inverse(const Point &P) const
Inverts the element in the group.
Copy input to a memory buffer.
void BERDecodeElement(BufferedTransformation &in, Element &a) const
Decodes element in DER format.
Point ScalarMultiply(const Point &P, const Integer &k) const
Performs a scalar multiplication.
size_t BERDecodeOctetString(BufferedTransformation &bt, SecByteBlock &str)
BER decode octet string.
const Integer & Multiply(const Integer &a, const Integer &b) const
Multiplies elements in the ring.
void swap(Integer &a)
Swaps this Integer with another Integer.
bool Equal(const Point &P, const Point &Q) const
Compare two elements for equality.
bool IsZero() const
Determines if the Integer is 0.
bool VerifyPrime(RandomNumberGenerator &rng, const Integer &p, unsigned int level=1)
Verifies a number is probably prime.
virtual const Element & MultiplicativeInverse(const Element &a) const =0
Calculate the multiplicative inverse of an element in the group.
Multiple precision integer with arithmetic operations.
const Integer & Half(const Integer &a) const
Divides an element by 2.
String-based implementation of Store interface.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
void BERDecodeError()
Raises a BERDecodeErr.
virtual Integer ConvertIn(const Integer &a) const
Reduces an element in the congruence class.
Classes and functions for working with ANS.1 objects.
void DEREncodePoint(BufferedTransformation &bt, const Point &P, bool compressed) const
DER Encodes an elliptic curve point.
unsigned int BitCount() const
Determines the number of bits required to represent the Integer.
Implementation of BufferedTransformation's attachment interface.
Classes and functions for number theoretic operations.
const Point & Double(const Point &P) const
Doubles an element in the group.
Performs modular arithmetic in Montgomery representation for increased speed.
void EncodePoint(byte *encodedPoint, const Point &P, bool compressed) const
Encodes an elliptic curve point.
size_t DEREncodeOctetString(BufferedTransformation &bt, const byte *str, size_t strLen)
DER encode octet string.
Multiple precision integer with arithmetic operations.
unsigned int EncodedPointSize(bool compressed=false) const
Determines encoded point size.
size_t BERDecodeBitString(BufferedTransformation &bt, SecByteBlock &str, unsigned int &unusedBits)
DER decode bit string.
Class file for performing modular arithmetic.
Crypto++ library namespace.
void DEREncode(BufferedTransformation &bt) const
Encode the fields fieldID and curve of the sequence ECParameters.
const Integer & MultiplicativeIdentity() const
Retrieves the multiplicative identity.
Point BERDecodePoint(BufferedTransformation &bt) const
BER Decodes an elliptic curve point.
void SimultaneousMultiply(Point *results, const Point &base, const Integer *exponents, unsigned int exponentsCount) const
Multiplies a base to multiple exponents in a group.
size_type size() const
Provides the count of elements in the SecBlock.
lword TotalPutLength()
Provides the number of bytes written to the Sink.
void DEREncode(BufferedTransformation &bt) const
Encodes in DER format.
const Point & Add(const Point &P, const Point &Q) const
Adds elements in the group.
the value is positive or 0
bool IsOdd() const
Determines if the Integer is odd parity.