Crypto++  8.2
Free C++ class library of cryptographic schemes
ecpoint.h
Go to the documentation of this file.
1 // ecpoint.h - written and placed in the public domain by Jeffrey Walton
2 // Data structures moved from ecp.h and ec2n.h. Added EncodedPoint interface
3 
4 /// \file ecpoint.h
5 /// \brief Classes for Elliptic Curve points
6 /// \since Crypto++ 6.0
7 
8 #ifndef CRYPTOPP_ECPOINT_H
9 #define CRYPTOPP_ECPOINT_H
10 
11 #include "cryptlib.h"
12 #include "integer.h"
13 #include "algebra.h"
14 #include "gf2n.h"
15 
16 NAMESPACE_BEGIN(CryptoPP)
17 
18 /// \brief Elliptical Curve Point over GF(p), where p is prime
19 /// \since Crypto++ 2.0
20 struct CRYPTOPP_DLL ECPPoint
21 {
22  virtual ~ECPPoint() {}
23 
24  /// \brief Construct an ECPPoint
25  /// \details identity is set to <tt>true</tt>
26  ECPPoint() : identity(true) {}
27 
28  /// \brief Construct an ECPPoint from coordinates
29  /// \details identity is set to <tt>false</tt>
30  ECPPoint(const Integer &x, const Integer &y)
31  : x(x), y(y), identity(false) {}
32 
33  /// \brief Tests points for equality
34  /// \param t the other point
35  /// \returns true if the points are equal, false otherwise
36  bool operator==(const ECPPoint &t) const
37  {return (identity && t.identity) || (!identity && !t.identity && x==t.x && y==t.y);}
38 
39  /// \brief Tests points for ordering
40  /// \param t the other point
41  /// \returns true if this point is less than other, false otherwise
42  bool operator< (const ECPPoint &t) const
43  {return identity ? !t.identity : (!t.identity && (x<t.x || (x==t.x && y<t.y)));}
44 
45  Integer x, y;
46  bool identity;
47 };
48 
49 CRYPTOPP_DLL_TEMPLATE_CLASS AbstractGroup<ECPPoint>;
50 
51 /// \brief Elliptical Curve Point over GF(2^n)
52 /// \since Crypto++ 2.0
53 struct CRYPTOPP_DLL EC2NPoint
54 {
55  virtual ~EC2NPoint() {}
56 
57  /// \brief Construct an EC2NPoint
58  /// \details identity is set to <tt>true</tt>
59  EC2NPoint() : identity(true) {}
60 
61  /// \brief Construct an EC2NPoint from coordinates
62  /// \details identity is set to <tt>false</tt>
64  : x(x), y(y), identity(false) {}
65 
66  /// \brief Tests points for equality
67  /// \param t the other point
68  /// \returns true if the points are equal, false otherwise
69  bool operator==(const EC2NPoint &t) const
70  {return (identity && t.identity) || (!identity && !t.identity && x==t.x && y==t.y);}
71 
72  /// \brief Tests points for ordering
73  /// \param t the other point
74  /// \returns true if this point is less than other, false otherwise
75  bool operator< (const EC2NPoint &t) const
76  {return identity ? !t.identity : (!t.identity && (x<t.x || (x==t.x && y<t.y)));}
77 
78  PolynomialMod2 x, y;
79  bool identity;
80 };
81 
82 CRYPTOPP_DLL_TEMPLATE_CLASS AbstractGroup<EC2NPoint>;
83 
84 /// \brief Abstract class for encoding and decoding ellicptic curve points
85 /// \tparam Point ellicptic curve point
86 /// \details EncodedPoint is an interface for encoding and decoding elliptic curve points.
87 /// The template parameter <tt>Point</tt> should be a class like ECP or EC2N.
88 /// \since Crypto++ 6.0
89 template <class Point>
91 {
92 public:
93  virtual ~EncodedPoint() {}
94 
95  /// \brief Decodes an elliptic curve point
96  /// \param P point which is decoded
97  /// \param bt source BufferedTransformation
98  /// \param len number of bytes to read from the BufferedTransformation
99  /// \returns true if a point was decoded, false otherwise
100  virtual bool DecodePoint(Point &P, BufferedTransformation &bt, size_t len) const =0;
101 
102  /// \brief Decodes an elliptic curve point
103  /// \param P point which is decoded
104  /// \param encodedPoint byte array with the encoded point
105  /// \param len the size of the array
106  /// \returns true if a point was decoded, false otherwise
107  virtual bool DecodePoint(Point &P, const byte *encodedPoint, size_t len) const =0;
108 
109  /// \brief Verifies points on elliptic curve
110  /// \param P point to verify
111  /// \returns true if the point is valid, false otherwise
112  virtual bool VerifyPoint(const Point &P) const =0;
113 
114  /// \brief Determines encoded point size
115  /// \param compressed flag indicating if the point is compressed
116  /// \returns the minimum number of bytes required to encode the point
117  virtual unsigned int EncodedPointSize(bool compressed = false) const =0;
118 
119  /// \brief Encodes an elliptic curve point
120  /// \param P point which is decoded
121  /// \param encodedPoint byte array for the encoded point
122  /// \param compressed flag indicating if the point is compressed
123  /// \details <tt>encodedPoint</tt> must be at least EncodedPointSize() in length
124  virtual void EncodePoint(byte *encodedPoint, const Point &P, bool compressed) const =0;
125 
126  /// \brief Encodes an elliptic curve point
127  /// \param bt target BufferedTransformation
128  /// \param P point which is encoded
129  /// \param compressed flag indicating if the point is compressed
130  virtual void EncodePoint(BufferedTransformation &bt, const Point &P, bool compressed) const =0;
131 
132  /// \brief BER Decodes an elliptic curve point
133  /// \param bt source BufferedTransformation
134  /// \returns the decoded elliptic curve point
135  virtual Point BERDecodePoint(BufferedTransformation &bt) const =0;
136 
137  /// \brief DER Encodes an elliptic curve point
138  /// \param bt target BufferedTransformation
139  /// \param P point which is encoded
140  /// \param compressed flag indicating if the point is compressed
141  virtual void DEREncodePoint(BufferedTransformation &bt, const Point &P, bool compressed) const =0;
142 };
143 
144 NAMESPACE_END
145 
146 #endif // CRYPTOPP_ECPOINT_H
bool operator==(const EC2NPoint &t) const
Tests points for equality.
Definition: ecpoint.h:69
Elliptical Curve Point over GF(p), where p is prime.
Definition: ecpoint.h:20
Abstract base classes that provide a uniform interface to this library.
Classes for performing mathematics over different fields.
Interface for buffered transformations.
Definition: cryptlib.h:1630
Polynomial with Coefficients in GF(2)
Definition: gf2n.h:26
ECPPoint(const Integer &x, const Integer &y)
Construct an ECPPoint from coordinates.
Definition: ecpoint.h:30
bool operator<(const OID &lhs, const OID &rhs)
Compare two OIDs for ordering.
Multiple precision integer with arithmetic operations.
Definition: integer.h:49
Classes and functions for schemes over GF(2^n)
ECPPoint()
Construct an ECPPoint.
Definition: ecpoint.h:26
bool operator==(const ECPPoint &t) const
Tests points for equality.
Definition: ecpoint.h:36
Abstract class for encoding and decoding ellicptic curve points.
Definition: ecpoint.h:90
Multiple precision integer with arithmetic operations.
EC2NPoint()
Construct an EC2NPoint.
Definition: ecpoint.h:59
Crypto++ library namespace.
Elliptical Curve Point over GF(2^n)
Definition: ecpoint.h:53
EC2NPoint(const PolynomialMod2 &x, const PolynomialMod2 &y)
Construct an EC2NPoint from coordinates.
Definition: ecpoint.h:63