Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cECPGroupParams.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cECPGroupParams_H
7 #define _INC_cECPGroupParams_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "../Math/cBigInteger.h"
13 
14 namespace GrayLib
15 {
16  class cASNReader;
17 
19  {
23  ECP_CurveType_SHORT_WEIERSTRASS, // 4 in ReadPointBinary? = // y^2 = x^3 + a x + b
24  ECP_CurveType_MONTGOMERY, // ? = // y^2 = x^3 + a x^2 + x (ECPGroup_x25519) NOT WORKING
25  };
26 
28  {
34 
35 #define ECPGROUPTYPEDEF(a,b,c,d,e) ECPGroup_##a = c,
36 #include "cECPGroupTypes.tbl"
37 #undef ECPGROUPTYPEDEF
38  };
39 
41  {
48 
49  public:
53 
54  public:
56  {
57  }
59  {
60  }
61 
63  {
64  m_X.SetNullVal();
65  m_Y.SetNullVal();
66  m_Z.SetNullVal();
67  }
68 
69  bool IsEqualPoint(const cECPPoint& ref) const
70  {
71  if (!m_X.IsEqual(ref.m_X))
72  return false;
73  if (!m_Y.IsEqual(ref.m_Y))
74  return false;
75  if (!m_Z.IsEqual(ref.m_Z))
76  return false;
77  return true;
78  }
79 
80  bool isZeroPoint() const
81  {
83  return this->m_Z.isZero();
84  }
85 
86  bool IsMatchParams(const cECPPoint& ref) const;
87  void SetPointNormal();
88 
89  void SetCopyPoint(const cECPPoint& Q);
90 
91  bool SetPointFromStr(RADIX_t radix, const char* x, const char* y);
92 
93  HRESULT WritePointBinary(BYTE* pBuf, size_t nSizeBuffer, size_t nSizeP, bool bCompressed) const;
94 
95  HRESULT WritePointLen(BYTE* pBuf, size_t nSizeBuffer, size_t nSizeP, bool bCompressed) const;
96 
97  HRESULT ReadPointBinary(size_t nSizeP, const BYTE* pBuf, size_t nSizeBuffer);
98 
99  HRESULT ReadPointLen(size_t nSizeP, const BYTE* pBuf, size_t nSizeBuffer);
100 
101  HRESULT ReadPointASN(size_t nSizeP, cASNReader& r0);
102  };
103 
105  {
110 
111  typedef cECPGroupParams THIS_t;
112 
113  public:
114 
115  static const char* k_pszPEM;
116 
117  static const WORD k_ECP_MAX_BITS = 521;
118  static const WORD k_ECP_MAX_BYTES = GETSIZEBYTES(k_ECP_MAX_BITS);
119 
120  // d = ceil( n / w )
121  static const WORD k_COMB_MAX_D = (k_ECP_MAX_BITS + 1) / 2;
122 
125 
128 
130 
133 
134  public:
136  : m_nPBits(0)
137  , m_nNBits(0)
138  {
139  }
140 
142  {
144  if (this->m_G.m_X.isNullVal())
145  return ECP_CurveType_NONE;
146  if (this->m_G.m_Y.isNullVal())
149  }
150 
151  size_t get_SizeP() const
152  {
153  return m_P.get_BinarySize();
154  }
155 
156  void inline DoModPLo(OUT cBigInteger& N) const
157  {
160  while (N.isNegative())
161  {
162  N.InitAdd(N, this->m_P);
163  }
164  }
165  void inline DoModPHi(OUT cBigInteger& N) const
166  {
169  while (N.Compare(this->m_P) >= 0)
170  {
171  N.InitSubU(N, this->m_P);
172  }
173  }
174 
175  bool IsMatchECPParams(const cECPGroupParams& ref) const;
176  HRESULT IsValidPrivateKey(const cBigUnsigned& d) const;
177 
178  void UpdateBits();
179  void InjectCommon();
180  HRESULT SetCopyECP(const THIS_t& rSrc);
181  void SetEmptyECPGroup();
182 
183  HRESULT ReadSpecifiedECDomain(cASNReader& r);
184  HRESULT SetECPGroupFromStr(RADIX_t radix, const char* p, const char* b, const char* gx, const char* gy, const char* n); // NOT USED.
185  HRESULT ReadBigIntECDSA(OUT cBigInteger& x, const BYTE* buf, size_t nSizeBuffer) const;
186  };
187 }
188 
189 #endif
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define GETSIZEBYTES(nBits)
Definition: cASNReader.h:22
Definition: cBigInteger.h:18
void SetNullVal()
Definition: cBigInteger.h:224
bool IsEqual(const THIS_t &x) const
Definition: cBigInteger.h:112
Definition: cBigUnsigned.h:22
bool isZero() const
Definition: cBigUnsigned.h:82
bool isNullVal() const noexcept
Definition: cBitArray.h:218
size_t get_BinarySize() const
Definition: cBitArray.h:688
Definition: cECPGroupParams.h:105
cBigInteger m_N
Definition: cECPGroupParams.h:131
cBigInteger m_A
Definition: cECPGroupParams.h:126
void DoModPLo(OUT cBigInteger &N) const
Definition: cECPGroupParams.h:156
cBigInteger m_B
Definition: cECPGroupParams.h:127
cBigInteger m_P
prime modulus of the base field
Definition: cECPGroupParams.h:123
static const char * k_pszPEM
"EC PARAMETERS"
Definition: cECPGroupParams.h:115
BIT_ENUM_t m_nPBits
number of used bits in P. m_P.get_Highest1Bit();
Definition: cECPGroupParams.h:124
cECPGroupParams()
Definition: cECPGroupParams.h:135
ECP_CurveType_t get_ECP_CurveType() const
Definition: cECPGroupParams.h:141
cECPPoint m_G
generator of the (sub)group used
Definition: cECPGroupParams.h:129
void DoModPHi(OUT cBigInteger &N) const
Definition: cECPGroupParams.h:165
BIT_ENUM_t m_nNBits
number of used bits get_Highest1Bit() in 1. m_N, or 2. private keys
Definition: cECPGroupParams.h:132
size_t get_SizeP() const
Definition: cECPGroupParams.h:151
Definition: cECPGroupParams.h:41
bool isZeroPoint() const
Definition: cECPGroupParams.h:80
~cECPPoint()
Definition: cECPGroupParams.h:58
cECPPoint()
Definition: cECPGroupParams.h:55
void SetEmptyPoint()
Definition: cECPGroupParams.h:62
cBigInteger m_X
the point's X coordinate
Definition: cECPGroupParams.h:50
cBigInteger m_Y
the point's Y coordinate
Definition: cECPGroupParams.h:51
bool IsEqualPoint(const cECPPoint &ref) const
Definition: cECPGroupParams.h:69
cBigInteger m_Z
the point's Z coordinate. Z == 0 or Z == 1
Definition: cECPGroupParams.h:52
Definition: cMesh.h:22
ECPGroup_TYPE
Definition: cECPGroupParams.h:28
ECP_CurveType_t
Definition: cECPGroupParams.h:19
@ ECP_CurveType_SHORT_WEIERSTRASS
Definition: cECPGroupParams.h:23
@ ECP_CurveType_MONTGOMERY
Definition: cECPGroupParams.h:24
@ ECP_CurveType_NONE
Definition: cECPGroupParams.h:22
WORD RADIX_t
Base for convert of numbers to strings. e.g. 10 base vs 16 base hex numbers.
Definition: StrChar.h:27
unsigned int BIT_ENUM_t
Enumerate number of bits or address a single bit in some array of bits.
Definition: cBits.h:20