Coverage Report

Created: 2024-11-21 07:03

/src/cryptopp/eccrypto.cpp
Line
Count
Source (jump to first uncovered line)
1
// eccrypto.cpp - originally written and placed in the public domain by Wei Dai
2
3
#include "pch.h"
4
5
#include "config.h"
6
7
#if CRYPTOPP_MSC_VERSION
8
# pragma warning(push)
9
# pragma warning(disable: 4127 4189 4505)
10
#endif
11
12
#if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE
13
# pragma GCC diagnostic push
14
# pragma GCC diagnostic ignored "-Wunused-function"
15
#endif
16
17
#ifndef CRYPTOPP_IMPORTS
18
19
#include "eccrypto.h"
20
#include "integer.h"
21
#include "nbtheory.h"
22
#include "filters.h"
23
#include "argnames.h"
24
#include "smartptr.h"
25
#include "oids.h"
26
#include "asn.h"
27
#include "hex.h"
28
#include "ec2n.h"
29
#include "misc.h"
30
31
#include <iostream>
32
#include <sstream>
33
34
// Squash MS LNK4221 and libtool warnings
35
#ifndef CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
36
extern const char ECCRYPTO_FNAME[] = __FILE__;
37
#endif
38
39
NAMESPACE_BEGIN(CryptoPP)
40
41
#if 0
42
#if defined(CRYPTOPP_DEBUG) && !defined(CRYPTOPP_DOXYGEN_PROCESSING)
43
static void ECDSA_TestInstantiations()
44
{
45
  ECDSA<EC2N>::Signer t1;
46
  ECDSA<EC2N>::Verifier t2(t1);
47
  ECNR<ECP>::Signer t3;
48
  ECNR<ECP>::Verifier t4(t3);
49
  ECIES<ECP>::Encryptor t5;
50
  ECIES<EC2N>::Decryptor t6;
51
  ECDH<ECP>::Domain t7;
52
  ECMQV<ECP>::Domain t8;
53
}
54
#endif
55
#endif
56
57
ANONYMOUS_NAMESPACE_BEGIN
58
inline Integer ConvertToInteger(const PolynomialMod2 &x)
59
0
{
60
0
  unsigned int l = x.ByteCount();
61
0
  SecByteBlock temp(l);
62
0
  x.Encode(temp, l);
63
0
  return Integer(temp, l);
64
0
}
65
66
inline Integer ConvertToInteger(const Integer &x)
67
0
{
68
0
  return x;
69
0
}
70
71
inline bool CheckMOVCondition(const Integer &q, const Integer &r)
72
0
{
73
  // see "Updated standards for validating elliptic curves", http://eprint.iacr.org/2007/343
74
0
  Integer t = 1;
75
0
  unsigned int n = q.IsEven() ? 1 : q.BitCount(), m = r.BitCount();
76
77
0
  for (unsigned int i=n; DiscreteLogWorkFactor(i)<m/2; i+=n)
78
0
  {
79
0
    if (q.IsEven())
80
0
      t = (t+t)%r;
81
0
    else
82
0
      t = (t*q)%r;
83
0
    if (t == 1)
84
0
      return false;
85
0
  }
86
0
  return true;
87
0
}
88
ANONYMOUS_NAMESPACE_END
89
90
// ******************************************************************
91
92
template <class T> struct EcRecommendedParameters;
93
94
template<> struct EcRecommendedParameters<EC2N>
95
{
96
  EcRecommendedParameters(const OID &oid, unsigned int t2, unsigned int t3, unsigned int t4, const char *a, const char *b, const char *g, const char *n, unsigned int h)
97
0
    : oid(oid), a(a), b(b), g(g), n(n), h(h), t0(0), t1(0), t2(t2), t3(t3), t4(t4) {}
98
  EcRecommendedParameters(const OID &oid, unsigned int t0, unsigned int t1, unsigned int t2, unsigned int t3, unsigned int t4, const char *a, const char *b, const char *g, const char *n, unsigned int h)
99
0
    : oid(oid), a(a), b(b), g(g), n(n), h(h), t0(t0), t1(t1), t2(t2), t3(t3), t4(t4) {}
100
  EC2N *NewEC() const
101
0
  {
102
0
    StringSource ssA(a, true, new HexDecoder);
103
0
    StringSource ssB(b, true, new HexDecoder);
104
0
    if (t0 == 0)
105
0
    {
106
0
      if (t2 == 233 && t3 == 74 && t4 == 0)
107
0
        return new EC2N(GF2NT233(233, 74, 0), EC2N::FieldElement(ssA, (size_t)ssA.MaxRetrievable()), EC2N::FieldElement(ssB, (size_t)ssB.MaxRetrievable()));
108
0
      else
109
0
        return new EC2N(GF2NT(t2, t3, t4), EC2N::FieldElement(ssA, (size_t)ssA.MaxRetrievable()), EC2N::FieldElement(ssB, (size_t)ssB.MaxRetrievable()));
110
0
    }
111
0
    else
112
0
      return new EC2N(GF2NPP(t0, t1, t2, t3, t4), EC2N::FieldElement(ssA, (size_t)ssA.MaxRetrievable()), EC2N::FieldElement(ssB, (size_t)ssB.MaxRetrievable()));
113
0
  };
114
115
  OID oid;
116
  const char *a, *b, *g, *n;
117
  unsigned int h, t0, t1, t2, t3, t4;
118
};
119
120
template<> struct EcRecommendedParameters<ECP>
121
{
122
  EcRecommendedParameters(const OID &oid, const char *p, const char *a, const char *b, const char *g, const char *n, unsigned int h)
123
120
    : oid(oid), p(p), a(a), b(b), g(g), n(n), h(h) {}
124
  ECP *NewEC() const
125
27.1k
  {
126
27.1k
    StringSource ssP(p, true, new HexDecoder);
127
27.1k
    StringSource ssA(a, true, new HexDecoder);
128
27.1k
    StringSource ssB(b, true, new HexDecoder);
129
27.1k
    return new ECP(Integer(ssP, (size_t)ssP.MaxRetrievable()), ECP::FieldElement(ssA, (size_t)ssA.MaxRetrievable()), ECP::FieldElement(ssB, (size_t)ssB.MaxRetrievable()));
130
27.1k
  };
131
132
  OID oid;
133
  const char *p, *a, *b, *g, *n;
134
  unsigned int h;
135
};
136
137
struct OIDLessThan
138
{
139
  template <typename T>
140
134k
  inline bool operator()(const EcRecommendedParameters<T>& a, const OID& b) {return a.oid < b;}
bool CryptoPP::OIDLessThan::operator()<CryptoPP::ECP>(CryptoPP::EcRecommendedParameters<CryptoPP::ECP> const&, CryptoPP::OID const&)
Line
Count
Source
140
134k
  inline bool operator()(const EcRecommendedParameters<T>& a, const OID& b) {return a.oid < b;}
Unexecuted instantiation: bool CryptoPP::OIDLessThan::operator()<CryptoPP::EC2N>(CryptoPP::EcRecommendedParameters<CryptoPP::EC2N> const&, CryptoPP::OID const&)
141
  template <typename T>
142
0
  inline bool operator()(const OID& a, const EcRecommendedParameters<T>& b) {return a < b.oid;}
Unexecuted instantiation: bool CryptoPP::OIDLessThan::operator()<CryptoPP::ECP>(CryptoPP::OID const&, CryptoPP::EcRecommendedParameters<CryptoPP::ECP> const&)
Unexecuted instantiation: bool CryptoPP::OIDLessThan::operator()<CryptoPP::EC2N>(CryptoPP::OID const&, CryptoPP::EcRecommendedParameters<CryptoPP::EC2N> const&)
143
  template <typename T>
144
  inline bool operator()(const EcRecommendedParameters<T>& a, const EcRecommendedParameters<T>& b) {return a.oid < b.oid;}
145
};
146
147
static void GetRecommendedParameters(const EcRecommendedParameters<EC2N> *&begin, const EcRecommendedParameters<EC2N> *&end)
148
0
{
149
  // this array must be sorted by OID
150
0
  static const EcRecommendedParameters<EC2N> rec[] = {
151
0
    EcRecommendedParameters<EC2N>(ASN1::sect163k1(),
152
0
      163, 7, 6, 3, 0,
153
0
      "000000000000000000000000000000000000000001",
154
0
      "000000000000000000000000000000000000000001",
155
0
      "0402FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE80289070FB05D38FF58321F2E800536D538CCDAA3D9",
156
0
      "04000000000000000000020108A2E0CC0D99F8A5EF",
157
0
      2),
158
0
    EcRecommendedParameters<EC2N>(ASN1::sect163r1(),
159
0
      163, 7, 6, 3, 0,
160
0
      "07B6882CAAEFA84F9554FF8428BD88E246D2782AE2",
161
0
      "0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9",
162
0
      "040369979697AB43897789566789567F787A7876A65400435EDB42EFAFB2989D51FEFCE3C80988F41FF883",
163
0
      "03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B",
164
0
      2),
165
0
    EcRecommendedParameters<EC2N>(ASN1::sect239k1(),
166
0
      239, 158, 0,
167
0
      "000000000000000000000000000000000000000000000000000000000000",
168
0
      "000000000000000000000000000000000000000000000000000000000001",
169
0
      "0429A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA",
170
0
      "2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5",
171
0
      4),
172
0
    EcRecommendedParameters<EC2N>(ASN1::sect113r1(),
173
0
      113, 9, 0,
174
0
      "003088250CA6E7C7FE649CE85820F7",
175
0
      "00E8BEE4D3E2260744188BE0E9C723",
176
0
      "04009D73616F35F4AB1407D73562C10F00A52830277958EE84D1315ED31886",
177
0
      "0100000000000000D9CCEC8A39E56F",
178
0
      2),
179
0
    EcRecommendedParameters<EC2N>(ASN1::sect113r2(),
180
0
      113, 9, 0,
181
0
      "00689918DBEC7E5A0DD6DFC0AA55C7",
182
0
      "0095E9A9EC9B297BD4BF36E059184F",
183
0
      "0401A57A6A7B26CA5EF52FCDB816479700B3ADC94ED1FE674C06E695BABA1D",
184
0
      "010000000000000108789B2496AF93",
185
0
      2),
186
0
    EcRecommendedParameters<EC2N>(ASN1::sect163r2(),
187
0
      163, 7, 6, 3, 0,
188
0
      "000000000000000000000000000000000000000001",
189
0
      "020A601907B8C953CA1481EB10512F78744A3205FD",
190
0
      "0403F0EBA16286A2D57EA0991168D4994637E8343E3600D51FBC6C71A0094FA2CDD545B11C5C0C797324F1",
191
0
      "040000000000000000000292FE77E70C12A4234C33",
192
0
      2),
193
0
    EcRecommendedParameters<EC2N>(ASN1::sect283k1(),
194
0
      283, 12, 7, 5, 0,
195
0
      "000000000000000000000000000000000000000000000000000000000000000000000000",
196
0
      "000000000000000000000000000000000000000000000000000000000000000000000001",
197
0
      "040503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC245849283601CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259",
198
0
      "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61",
199
0
      4),
200
0
    EcRecommendedParameters<EC2N>(ASN1::sect283r1(),
201
0
      283, 12, 7, 5, 0,
202
0
      "000000000000000000000000000000000000000000000000000000000000000000000001",
203
0
      "027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5",
204
0
      "0405F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B1205303676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4",
205
0
      "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307",
206
0
      2),
207
0
    EcRecommendedParameters<EC2N>(ASN1::sect131r1(),
208
0
      131, 8, 3, 2, 0,
209
0
      "07A11B09A76B562144418FF3FF8C2570B8",
210
0
      "0217C05610884B63B9C6C7291678F9D341",
211
0
      "040081BAF91FDF9833C40F9C181343638399078C6E7EA38C001F73C8134B1B4EF9E150",
212
0
      "0400000000000000023123953A9464B54D",
213
0
      2),
214
0
    EcRecommendedParameters<EC2N>(ASN1::sect131r2(),
215
0
      131, 8, 3, 2, 0,
216
0
      "03E5A88919D7CAFCBF415F07C2176573B2",
217
0
      "04B8266A46C55657AC734CE38F018F2192",
218
0
      "040356DCD8F2F95031AD652D23951BB366A80648F06D867940A5366D9E265DE9EB240F",
219
0
      "0400000000000000016954A233049BA98F",
220
0
      2),
221
0
    EcRecommendedParameters<EC2N>(ASN1::sect193r1(),
222
0
      193, 15, 0,
223
0
      "0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01",
224
0
      "00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814",
225
0
      "0401F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E10025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05",
226
0
      "01000000000000000000000000C7F34A778F443ACC920EBA49",
227
0
      2),
228
0
    EcRecommendedParameters<EC2N>(ASN1::sect193r2(),
229
0
      193, 15, 0,
230
0
      "0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B",
231
0
      "00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE",
232
0
      "0400D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C",
233
0
      "010000000000000000000000015AAB561B005413CCD4EE99D5",
234
0
      2),
235
0
    EcRecommendedParameters<EC2N>(ASN1::sect233k1(),
236
0
      233, 74, 0,
237
0
      "000000000000000000000000000000000000000000000000000000000000",
238
0
      "000000000000000000000000000000000000000000000000000000000001",
239
0
      "04017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD612601DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3",
240
0
      "8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF",
241
0
      4),
242
0
    EcRecommendedParameters<EC2N>(ASN1::sect233r1(),
243
0
      233, 74, 0,
244
0
      "000000000000000000000000000000000000000000000000000000000001",
245
0
      "0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD",
246
0
      "0400FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052",
247
0
      "01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7",
248
0
      2),
249
0
    EcRecommendedParameters<EC2N>(ASN1::sect409k1(),
250
0
      409, 87, 0,
251
0
      "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
252
0
      "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
253
0
      "040060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE902374601E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B",
254
0
      "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF",
255
0
      4),
256
0
    EcRecommendedParameters<EC2N>(ASN1::sect409r1(),
257
0
      409, 87, 0,
258
0
      "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
259
0
      "0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F",
260
0
      "04015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A70061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706",
261
0
      "010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173",
262
0
      2),
263
0
    EcRecommendedParameters<EC2N>(ASN1::sect571k1(),
264
0
      571, 10, 5, 2, 0,
265
0
      "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
266
0
      "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
267
0
      "04026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C89720349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3",
268
0
      "020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001",
269
0
      4),
270
0
    EcRecommendedParameters<EC2N>(ASN1::sect571r1(),
271
0
      571, 10, 5, 2, 0,
272
0
      "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
273
0
      "02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A",
274
0
      "040303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B",
275
0
      "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47",
276
0
      2),
277
0
  };
278
0
  begin = rec;
279
0
  end = rec + sizeof(rec)/sizeof(rec[0]);
280
0
}
281
282
// See https://www.cryptopp.com/wiki/SM2 for details on sm2p256v1 and sm2encrypt_recommendedParameters
283
static void GetRecommendedParameters(const EcRecommendedParameters<ECP> *&begin, const EcRecommendedParameters<ECP> *&end)
284
28.4k
{
285
  // this array must be sorted by OID
286
28.4k
  static const EcRecommendedParameters<ECP> rec[] = {
287
28.4k
    EcRecommendedParameters<ECP>(ASN1::sm2p256v1(),
288
28.4k
      "FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF",
289
28.4k
      "FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC",
290
28.4k
      "28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93",
291
28.4k
      "04" "32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7"
292
28.4k
           "BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0",
293
28.4k
      "FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123",
294
28.4k
      1),
295
28.4k
    EcRecommendedParameters<ECP>(ASN1::sm2encrypt_recommendedParameters(),
296
28.4k
      "FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF",
297
28.4k
      "FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC",
298
28.4k
      "28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93",
299
28.4k
      "04" "32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7"
300
28.4k
           "BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0",
301
28.4k
      "FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123",
302
28.4k
      1),
303
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp192r1(),
304
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
305
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
306
28.4k
      "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1",
307
28.4k
      "04188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF101207192B95FFC8DA78631011ED6B24CDD573F977A11E794811",
308
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",
309
28.4k
      1),
310
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp256r1(),
311
28.4k
      "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
312
28.4k
      "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
313
28.4k
      "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
314
28.4k
      "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
315
28.4k
      "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
316
28.4k
      1),
317
28.4k
    EcRecommendedParameters<ECP>(ASN1::brainpoolP160r1(),
318
28.4k
      "E95E4A5F737059DC60DFC7AD95B3D8139515620F",
319
28.4k
      "340E7BE2A280EB74E2BE61BADA745D97E8F7C300",
320
28.4k
      "1E589A8595423412134FAA2DBDEC95C8D8675E58",
321
28.4k
      "04BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC31667CB477A1A8EC338F94741669C976316DA6321",
322
28.4k
      "E95E4A5F737059DC60DF5991D45029409E60FC09",
323
28.4k
      1),
324
28.4k
    EcRecommendedParameters<ECP>(ASN1::brainpoolP192r1(),
325
28.4k
      "C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297",
326
28.4k
      "6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF",
327
28.4k
      "469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9",
328
28.4k
      "04C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD614B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F",
329
28.4k
      "C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1",
330
28.4k
      1),
331
28.4k
    EcRecommendedParameters<ECP>(ASN1::brainpoolP224r1(),
332
28.4k
      "D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF",
333
28.4k
      "68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43",
334
28.4k
      "2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B",
335
28.4k
      "040D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD",
336
28.4k
      "D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F",
337
28.4k
      1),
338
28.4k
    EcRecommendedParameters<ECP>(ASN1::brainpoolP256r1(),
339
28.4k
      "A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377",
340
28.4k
      "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9",
341
28.4k
      "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6",
342
28.4k
      "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997",
343
28.4k
      "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7",
344
28.4k
      1),
345
28.4k
    EcRecommendedParameters<ECP>(ASN1::brainpoolP320r1(),
346
28.4k
      "D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27",
347
28.4k
      "3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4",
348
28.4k
      "520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6",
349
28.4k
      "0443BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E2061114FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1",
350
28.4k
      "D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311",
351
28.4k
      1),
352
28.4k
    EcRecommendedParameters<ECP>(ASN1::brainpoolP384r1(),
353
28.4k
      "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53",
354
28.4k
      "7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826",
355
28.4k
      "04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11",
356
28.4k
      "041D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315",
357
28.4k
      "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565",
358
28.4k
      1),
359
28.4k
    EcRecommendedParameters<ECP>(ASN1::brainpoolP512r1(),
360
28.4k
      "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3",
361
28.4k
      "7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA",
362
28.4k
      "3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723",
363
28.4k
      "0481AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F8227DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892",
364
28.4k
      "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069",
365
28.4k
      1),
366
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp112r1(),
367
28.4k
      "DB7C2ABF62E35E668076BEAD208B",
368
28.4k
      "DB7C2ABF62E35E668076BEAD2088",
369
28.4k
      "659EF8BA043916EEDE8911702B22",
370
28.4k
      "0409487239995A5EE76B55F9C2F098A89CE5AF8724C0A23E0E0FF77500",
371
28.4k
      "DB7C2ABF62E35E7628DFAC6561C5",
372
28.4k
      1),
373
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp112r2(),
374
28.4k
      "DB7C2ABF62E35E668076BEAD208B",
375
28.4k
      "6127C24C05F38A0AAAF65C0EF02C",
376
28.4k
      "51DEF1815DB5ED74FCC34C85D709",
377
28.4k
      "044BA30AB5E892B4E1649DD0928643ADCD46F5882E3747DEF36E956E97",
378
28.4k
      "36DF0AAFD8B8D7597CA10520D04B",
379
28.4k
      4),
380
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp160r1(),
381
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF",
382
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC",
383
28.4k
      "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45",
384
28.4k
      "044A96B5688EF573284664698968C38BB913CBFC8223A628553168947D59DCC912042351377AC5FB32",
385
28.4k
      "0100000000000000000001F4C8F927AED3CA752257",
386
28.4k
      1),
387
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp160k1(),
388
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
389
28.4k
      "0000000000000000000000000000000000000000",
390
28.4k
      "0000000000000000000000000000000000000007",
391
28.4k
      "043B4C382CE37AA192A4019E763036F4F5DD4D7EBB938CF935318FDCED6BC28286531733C3F03C4FEE",
392
28.4k
      "0100000000000000000001B8FA16DFAB9ACA16B6B3",
393
28.4k
      1),
394
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp256k1(),
395
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",
396
28.4k
      "0000000000000000000000000000000000000000000000000000000000000000",
397
28.4k
      "0000000000000000000000000000000000000000000000000000000000000007",
398
28.4k
      "0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",
399
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",
400
28.4k
      1),
401
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp128r1(),
402
28.4k
      "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
403
28.4k
      "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC",
404
28.4k
      "E87579C11079F43DD824993C2CEE5ED3",
405
28.4k
      "04161FF7528B899B2D0C28607CA52C5B86CF5AC8395BAFEB13C02DA292DDED7A83",
406
28.4k
      "FFFFFFFE0000000075A30D1B9038A115",
407
28.4k
      1),
408
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp128r2(),
409
28.4k
      "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
410
28.4k
      "D6031998D1B3BBFEBF59CC9BBFF9AEE1",
411
28.4k
      "5EEEFCA380D02919DC2C6558BB6D8A5D",
412
28.4k
      "047B6AA5D85E572983E6FB32A7CDEBC14027B6916A894D3AEE7106FE805FC34B44",
413
28.4k
      "3FFFFFFF7FFFFFFFBE0024720613B5A3",
414
28.4k
      4),
415
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp160r2(),
416
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
417
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70",
418
28.4k
      "B4E134D3FB59EB8BAB57274904664D5AF50388BA",
419
28.4k
      "0452DCB034293A117E1F4FF11B30F7199D3144CE6DFEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E",
420
28.4k
      "0100000000000000000000351EE786A818F3A1A16B",
421
28.4k
      1),
422
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp192k1(),
423
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37",
424
28.4k
      "000000000000000000000000000000000000000000000000",
425
28.4k
      "000000000000000000000000000000000000000000000003",
426
28.4k
      "04DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D",
427
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",
428
28.4k
      1),
429
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp224k1(),
430
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D",
431
28.4k
      "00000000000000000000000000000000000000000000000000000000",
432
28.4k
      "00000000000000000000000000000000000000000000000000000005",
433
28.4k
      "04A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5",
434
28.4k
      "010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",
435
28.4k
      1),
436
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp224r1(),
437
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
438
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
439
28.4k
      "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
440
28.4k
      "04B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",
441
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
442
28.4k
      1),
443
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp384r1(),
444
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
445
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
446
28.4k
      "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
447
28.4k
      "04AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB73617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
448
28.4k
      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
449
28.4k
      1),
450
28.4k
    EcRecommendedParameters<ECP>(ASN1::secp521r1(),
451
28.4k
      "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
452
28.4k
      "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
453
28.4k
      "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
454
28.4k
      "0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
455
28.4k
      "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
456
28.4k
      1),
457
28.4k
  };
458
28.4k
  begin = rec;
459
28.4k
  end = rec + sizeof(rec)/sizeof(rec[0]);
460
28.4k
}
461
462
template <class EC> OID DL_GroupParameters_EC<EC>::GetNextRecommendedParametersOID(const OID &oid)
463
0
{
464
0
  const EcRecommendedParameters<EllipticCurve> *begin, *end;
465
0
  GetRecommendedParameters(begin, end);
466
0
  const EcRecommendedParameters<EllipticCurve> *it = std::upper_bound(begin, end, oid, OIDLessThan());
467
0
  return (it == end ? OID() : it->oid);
468
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::GetNextRecommendedParametersOID(CryptoPP::OID const&)
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::GetNextRecommendedParametersOID(CryptoPP::OID const&)
469
470
template <class EC> void DL_GroupParameters_EC<EC>::Initialize(const OID &oid)
471
28.4k
{
472
28.4k
  const EcRecommendedParameters<EllipticCurve> *begin, *end;
473
28.4k
  GetRecommendedParameters(begin, end);
474
28.4k
  const EcRecommendedParameters<EllipticCurve> *it = std::lower_bound(begin, end, oid, OIDLessThan());
475
28.4k
  if (it == end || it->oid != oid)
476
1.23k
    throw UnknownOID();
477
478
27.1k
  const EcRecommendedParameters<EllipticCurve> &param = *it;
479
27.1k
  m_oid = oid;
480
27.1k
  member_ptr<EllipticCurve> ec(param.NewEC());
481
27.1k
  this->m_groupPrecomputation.SetCurve(*ec);
482
483
27.1k
  StringSource ssG(param.g, true, new HexDecoder);
484
27.1k
  Element G;
485
27.1k
  bool result = GetCurve().DecodePoint(G, ssG, (size_t)ssG.MaxRetrievable());
486
27.1k
  this->SetSubgroupGenerator(G);
487
488
  // TODO: this fails in practice. Should it throw?
489
27.1k
  CRYPTOPP_UNUSED(result); CRYPTOPP_ASSERT(result);
490
491
27.1k
  StringSource ssN(param.n, true, new HexDecoder);
492
27.1k
  m_n.Decode(ssN, (size_t)ssN.MaxRetrievable());
493
27.1k
  m_k = param.h;
494
27.1k
}
CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::Initialize(CryptoPP::OID const&)
Line
Count
Source
471
28.4k
{
472
28.4k
  const EcRecommendedParameters<EllipticCurve> *begin, *end;
473
28.4k
  GetRecommendedParameters(begin, end);
474
28.4k
  const EcRecommendedParameters<EllipticCurve> *it = std::lower_bound(begin, end, oid, OIDLessThan());
475
28.4k
  if (it == end || it->oid != oid)
476
1.23k
    throw UnknownOID();
477
478
27.1k
  const EcRecommendedParameters<EllipticCurve> &param = *it;
479
27.1k
  m_oid = oid;
480
27.1k
  member_ptr<EllipticCurve> ec(param.NewEC());
481
27.1k
  this->m_groupPrecomputation.SetCurve(*ec);
482
483
27.1k
  StringSource ssG(param.g, true, new HexDecoder);
484
27.1k
  Element G;
485
27.1k
  bool result = GetCurve().DecodePoint(G, ssG, (size_t)ssG.MaxRetrievable());
486
27.1k
  this->SetSubgroupGenerator(G);
487
488
  // TODO: this fails in practice. Should it throw?
489
27.1k
  CRYPTOPP_UNUSED(result); CRYPTOPP_ASSERT(result);
490
491
27.1k
  StringSource ssN(param.n, true, new HexDecoder);
492
27.1k
  m_n.Decode(ssN, (size_t)ssN.MaxRetrievable());
493
27.1k
  m_k = param.h;
494
27.1k
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::Initialize(CryptoPP::OID const&)
495
496
template <class EC>
497
bool DL_GroupParameters_EC<EC>::GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const
498
0
{
499
0
  if (strcmp(name, Name::GroupOID()) == 0)
500
0
  {
501
0
    if (m_oid.Empty())
502
0
      return false;
503
504
0
    this->ThrowIfTypeMismatch(name, typeid(OID), valueType);
505
0
    *reinterpret_cast<OID *>(pValue) = m_oid;
506
0
    return true;
507
0
  }
508
0
  else
509
0
    return GetValueHelper<DL_GroupParameters<Element> >(this, name, valueType, pValue).Assignable()
510
0
      CRYPTOPP_GET_FUNCTION_ENTRY(Curve);
511
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::GetVoidValue(char const*, std::type_info const&, void*) const
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::GetVoidValue(char const*, std::type_info const&, void*) const
512
513
template <class EC>
514
void DL_GroupParameters_EC<EC>::AssignFrom(const NameValuePairs &source)
515
0
{
516
0
  OID oid;
517
0
  if (source.GetValue(Name::GroupOID(), oid))
518
0
    Initialize(oid);
519
0
  else
520
0
  {
521
0
    EllipticCurve ec;
522
0
    Point G;
523
0
    Integer n;
524
525
0
    source.GetRequiredParameter("DL_GroupParameters_EC<EC>", Name::Curve(), ec);
526
0
    source.GetRequiredParameter("DL_GroupParameters_EC<EC>", Name::SubgroupGenerator(), G);
527
0
    source.GetRequiredParameter("DL_GroupParameters_EC<EC>", Name::SubgroupOrder(), n);
528
0
    Integer k = source.GetValueWithDefault(Name::Cofactor(), Integer::Zero());
529
530
0
    Initialize(ec, G, n, k);
531
0
  }
532
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::AssignFrom(CryptoPP::NameValuePairs const&)
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::AssignFrom(CryptoPP::NameValuePairs const&)
533
534
template <class EC>
535
void DL_GroupParameters_EC<EC>::GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg)
536
0
{
537
0
  try
538
0
  {
539
0
    CRYPTOPP_UNUSED(rng);
540
0
    AssignFrom(alg);
541
0
  }
542
0
  catch (InvalidArgument &)
543
0
  {
544
0
    throw NotImplemented("DL_GroupParameters_EC<EC>: curve generation is not implemented yet");
545
0
  }
546
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::GenerateRandom(CryptoPP::RandomNumberGenerator&, CryptoPP::NameValuePairs const&)
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::GenerateRandom(CryptoPP::RandomNumberGenerator&, CryptoPP::NameValuePairs const&)
547
548
template <class EC>
549
void DL_GroupParameters_EC<EC>::BERDecode(BufferedTransformation &bt)
550
0
{
551
0
  byte b;
552
0
  if (!bt.Peek(b))
553
0
    BERDecodeError();
554
0
  if (b == OBJECT_IDENTIFIER)
555
0
    Initialize(OID(bt));
556
0
  else
557
0
  {
558
0
    BERSequenceDecoder seq(bt);
559
0
      word32 version;
560
0
      BERDecodeUnsigned<word32>(seq, version, INTEGER, 1, 1); // check version
561
0
      EllipticCurve ec(seq);
562
0
      Point G = ec.BERDecodePoint(seq);
563
0
      Integer n(seq);
564
0
      Integer k;
565
0
      bool cofactorPresent = !seq.EndReached();
566
0
      if (cofactorPresent)
567
0
        k.BERDecode(seq);
568
0
      else
569
0
        k = Integer::Zero();
570
0
    seq.MessageEnd();
571
572
0
    Initialize(ec, G, n, k);
573
0
  }
574
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::BERDecode(CryptoPP::BufferedTransformation&)
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::BERDecode(CryptoPP::BufferedTransformation&)
575
576
template <class EC>
577
void DL_GroupParameters_EC<EC>::DEREncode(BufferedTransformation &bt) const
578
0
{
579
0
  if (m_encodeAsOID && !m_oid.Empty())
580
0
    m_oid.DEREncode(bt);
581
0
  else
582
0
  {
583
0
    DERSequenceEncoder seq(bt);
584
0
    DEREncodeUnsigned<word32>(seq, 1);  // version
585
0
    GetCurve().DEREncode(seq);
586
0
    GetCurve().DEREncodePoint(seq, this->GetSubgroupGenerator(), m_compress);
587
0
    m_n.DEREncode(seq);
588
0
    if (m_k.NotZero())
589
0
      m_k.DEREncode(seq);
590
0
    seq.MessageEnd();
591
0
  }
592
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::DEREncode(CryptoPP::BufferedTransformation&) const
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::DEREncode(CryptoPP::BufferedTransformation&) const
593
594
template <class EC>
595
Integer DL_GroupParameters_EC<EC>::GetCofactor() const
596
0
{
597
0
  if (!m_k)
598
0
  {
599
0
    Integer q = GetCurve().FieldSize();
600
0
    Integer qSqrt = q.SquareRoot();
601
0
    m_k = (q+2*qSqrt+1)/m_n;
602
0
  }
603
604
0
  return m_k;
605
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::GetCofactor() const
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::GetCofactor() const
606
607
template <class EC>
608
Integer DL_GroupParameters_EC<EC>::ConvertElementToInteger(const Element &element) const
609
0
{
610
0
  return ConvertToInteger(element.x);
611
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::ConvertElementToInteger(CryptoPP::ECPPoint const&) const
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::ConvertElementToInteger(CryptoPP::EC2NPoint const&) const
612
613
template <class EC>
614
bool DL_GroupParameters_EC<EC>::ValidateGroup(RandomNumberGenerator &rng, unsigned int level) const
615
0
{
616
0
  bool pass = GetCurve().ValidateParameters(rng, level);
617
0
  CRYPTOPP_ASSERT(pass);
618
619
0
  Integer q = GetCurve().FieldSize();
620
0
  pass = pass && m_n!=q;
621
0
  CRYPTOPP_ASSERT(pass);
622
623
0
  if (level >= 2)
624
0
  {
625
0
    Integer qSqrt = q.SquareRoot();
626
0
    pass = pass && m_n>4*qSqrt;
627
0
    CRYPTOPP_ASSERT(pass);
628
0
    pass = pass && VerifyPrime(rng, m_n, level-2);
629
0
    CRYPTOPP_ASSERT(pass);
630
0
    pass = pass && (m_k.IsZero() || m_k == (q+2*qSqrt+1)/m_n);
631
0
    CRYPTOPP_ASSERT(pass);
632
0
    pass = pass && CheckMOVCondition(q, m_n);
633
0
    CRYPTOPP_ASSERT(pass);
634
0
  }
635
636
0
  return pass;
637
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::ValidateGroup(CryptoPP::RandomNumberGenerator&, unsigned int) const
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::ValidateGroup(CryptoPP::RandomNumberGenerator&, unsigned int) const
638
639
template <class EC>
640
bool DL_GroupParameters_EC<EC>::ValidateElement(unsigned int level, const Element &g, const DL_FixedBasePrecomputation<Element> *gpc) const
641
0
{
642
0
  bool pass = !IsIdentity(g);
643
0
  CRYPTOPP_ASSERT(pass);
644
0
  pass = pass && GetCurve().VerifyPoint(g);
645
0
  CRYPTOPP_ASSERT(pass);
646
647
0
  if (level >= 1)
648
0
  {
649
0
    if (gpc)
650
0
    {
651
0
      pass = pass && gpc->Exponentiate(this->GetGroupPrecomputation(), Integer::One()) == g;
652
0
      CRYPTOPP_ASSERT(pass);
653
0
    }
654
0
  }
655
0
  if (level >= 2 && pass)
656
0
  {
657
0
    const Integer &q = GetSubgroupOrder();
658
0
    Element gq = gpc ? gpc->Exponentiate(this->GetGroupPrecomputation(), q) : this->ExponentiateElement(g, q);
659
0
    pass = pass && IsIdentity(gq);
660
0
    CRYPTOPP_ASSERT(pass);
661
0
  }
662
0
  return pass;
663
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::ValidateElement(unsigned int, CryptoPP::ECPPoint const&, CryptoPP::DL_FixedBasePrecomputation<CryptoPP::ECPPoint> const*) const
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::ValidateElement(unsigned int, CryptoPP::EC2NPoint const&, CryptoPP::DL_FixedBasePrecomputation<CryptoPP::EC2NPoint> const*) const
664
665
template <class EC>
666
void DL_GroupParameters_EC<EC>::SimultaneousExponentiate(Element *results, const Element &base, const Integer *exponents, unsigned int exponentsCount) const
667
0
{
668
0
  GetCurve().SimultaneousMultiply(results, base, exponents, exponentsCount);
669
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::SimultaneousExponentiate(CryptoPP::ECPPoint*, CryptoPP::ECPPoint const&, CryptoPP::Integer const*, unsigned int) const
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::SimultaneousExponentiate(CryptoPP::EC2NPoint*, CryptoPP::EC2NPoint const&, CryptoPP::Integer const*, unsigned int) const
670
671
template <class EC>
672
typename DL_GroupParameters_EC<EC>::Element DL_GroupParameters_EC<EC>::MultiplyElements(const Element &a, const Element &b) const
673
0
{
674
0
  return GetCurve().Add(a, b);
675
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::MultiplyElements(CryptoPP::ECPPoint const&, CryptoPP::ECPPoint const&) const
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::MultiplyElements(CryptoPP::EC2NPoint const&, CryptoPP::EC2NPoint const&) const
676
677
template <class EC>
678
typename DL_GroupParameters_EC<EC>::Element DL_GroupParameters_EC<EC>::CascadeExponentiate(const Element &element1, const Integer &exponent1, const Element &element2, const Integer &exponent2) const
679
0
{
680
0
  return GetCurve().CascadeMultiply(exponent1, element1, exponent2, element2);
681
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::CascadeExponentiate(CryptoPP::ECPPoint const&, CryptoPP::Integer const&, CryptoPP::ECPPoint const&, CryptoPP::Integer const&) const
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::CascadeExponentiate(CryptoPP::EC2NPoint const&, CryptoPP::Integer const&, CryptoPP::EC2NPoint const&, CryptoPP::Integer const&) const
682
683
template <class EC>
684
OID DL_GroupParameters_EC<EC>::GetAlgorithmID() const
685
0
{
686
0
  return ASN1::id_ecPublicKey();
687
0
}
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>::GetAlgorithmID() const
Unexecuted instantiation: CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>::GetAlgorithmID() const
688
689
std::ostream& operator<<(std::ostream& os, const DL_GroupParameters_EC<ECP>::Element& obj)
690
0
{
691
0
  std::ostringstream oss;
692
0
  oss << "(" << std::hex << obj.x << ", " << std::hex  << obj.y << ")";
693
0
  return os << oss.str();
694
0
}
695
696
// ******************************************************************
697
698
template <class EC>
699
void DL_PublicKey_EC<EC>::BERDecodePublicKey(BufferedTransformation &bt, bool parametersPresent, size_t size)
700
0
{
701
0
  CRYPTOPP_UNUSED(parametersPresent);
702
703
0
  typename EC::Point P;
704
0
  if (!this->GetGroupParameters().GetCurve().DecodePoint(P, bt, size))
705
0
    BERDecodeError();
706
0
  this->SetPublicElement(P);
707
0
}
Unexecuted instantiation: CryptoPP::DL_PublicKey_EC<CryptoPP::ECP>::BERDecodePublicKey(CryptoPP::BufferedTransformation&, bool, unsigned long)
Unexecuted instantiation: CryptoPP::DL_PublicKey_EC<CryptoPP::EC2N>::BERDecodePublicKey(CryptoPP::BufferedTransformation&, bool, unsigned long)
708
709
template <class EC>
710
void DL_PublicKey_EC<EC>::DEREncodePublicKey(BufferedTransformation &bt) const
711
0
{
712
0
  this->GetGroupParameters().GetCurve().EncodePoint(bt, this->GetPublicElement(), this->GetGroupParameters().GetPointCompression());
713
0
}
Unexecuted instantiation: CryptoPP::DL_PublicKey_EC<CryptoPP::ECP>::DEREncodePublicKey(CryptoPP::BufferedTransformation&) const
Unexecuted instantiation: CryptoPP::DL_PublicKey_EC<CryptoPP::EC2N>::DEREncodePublicKey(CryptoPP::BufferedTransformation&) const
714
715
// ******************************************************************
716
717
template <class EC>
718
void DL_PrivateKey_EC<EC>::BERDecodePrivateKey(BufferedTransformation &bt, bool parametersPresent, size_t size)
719
0
{
720
0
  CRYPTOPP_UNUSED(size);
721
0
  BERSequenceDecoder seq(bt);
722
0
    word32 version;
723
0
    BERDecodeUnsigned<word32>(seq, version, INTEGER, 1, 1); // check version
724
725
0
    BERGeneralDecoder dec(seq, OCTET_STRING);
726
0
    if (!dec.IsDefiniteLength())
727
0
      BERDecodeError();
728
0
    Integer x;
729
0
    x.Decode(dec, (size_t)dec.RemainingLength());
730
0
    dec.MessageEnd();
731
0
    if (!parametersPresent && seq.PeekByte() != (CONTEXT_SPECIFIC | CONSTRUCTED | 0))
732
0
      BERDecodeError();
733
0
    if (!seq.EndReached() && seq.PeekByte() == (CONTEXT_SPECIFIC | CONSTRUCTED | 0))
734
0
    {
735
0
      BERGeneralDecoder parameters(seq, CONTEXT_SPECIFIC | CONSTRUCTED | 0);
736
0
      this->AccessGroupParameters().BERDecode(parameters);
737
0
      parameters.MessageEnd();
738
0
    }
739
0
    if (!seq.EndReached())
740
0
    {
741
      // skip over the public element
742
0
      SecByteBlock subjectPublicKey;
743
0
      unsigned int unusedBits;
744
0
      BERGeneralDecoder publicKey(seq, CONTEXT_SPECIFIC | CONSTRUCTED | 1);
745
0
      BERDecodeBitString(publicKey, subjectPublicKey, unusedBits);
746
0
      publicKey.MessageEnd();
747
0
      Element Q;
748
0
      if (!(unusedBits == 0 && this->GetGroupParameters().GetCurve().DecodePoint(Q, subjectPublicKey, subjectPublicKey.size())))
749
0
        BERDecodeError();
750
0
    }
751
0
  seq.MessageEnd();
752
753
0
  this->SetPrivateExponent(x);
754
0
}
Unexecuted instantiation: CryptoPP::DL_PrivateKey_EC<CryptoPP::ECP>::BERDecodePrivateKey(CryptoPP::BufferedTransformation&, bool, unsigned long)
Unexecuted instantiation: CryptoPP::DL_PrivateKey_EC<CryptoPP::EC2N>::BERDecodePrivateKey(CryptoPP::BufferedTransformation&, bool, unsigned long)
755
756
template <class EC>
757
void DL_PrivateKey_EC<EC>::DEREncodePrivateKey(BufferedTransformation &bt) const
758
0
{
759
0
  DERSequenceEncoder privateKey(bt);
760
0
    DEREncodeUnsigned<word32>(privateKey, 1); // version
761
    // SEC 1 ver 1.0 says privateKey (m_d) has the same length as order of the curve
762
    // this will be changed to order of base point in a future version
763
0
    this->GetPrivateExponent().DEREncodeAsOctetString(privateKey, this->GetGroupParameters().GetSubgroupOrder().ByteCount());
764
0
  privateKey.MessageEnd();
765
0
}
Unexecuted instantiation: CryptoPP::DL_PrivateKey_EC<CryptoPP::ECP>::DEREncodePrivateKey(CryptoPP::BufferedTransformation&) const
Unexecuted instantiation: CryptoPP::DL_PrivateKey_EC<CryptoPP::EC2N>::DEREncodePrivateKey(CryptoPP::BufferedTransformation&) const
766
767
// ******************************************************************
768
769
template <class EC>
770
void DL_PublicKey_ECGDSA<EC>::BERDecodePublicKey(BufferedTransformation &bt, bool parametersPresent, size_t size)
771
0
{
772
0
  CRYPTOPP_UNUSED(parametersPresent);
773
774
0
  typename EC::Point P;
775
0
  if (!this->GetGroupParameters().GetCurve().DecodePoint(P, bt, size))
776
0
    BERDecodeError();
777
0
  this->SetPublicElement(P);
778
0
}
Unexecuted instantiation: CryptoPP::DL_PublicKey_ECGDSA<CryptoPP::ECP>::BERDecodePublicKey(CryptoPP::BufferedTransformation&, bool, unsigned long)
Unexecuted instantiation: CryptoPP::DL_PublicKey_ECGDSA<CryptoPP::EC2N>::BERDecodePublicKey(CryptoPP::BufferedTransformation&, bool, unsigned long)
779
780
template <class EC>
781
void DL_PublicKey_ECGDSA<EC>::DEREncodePublicKey(BufferedTransformation &bt) const
782
0
{
783
0
  this->GetGroupParameters().GetCurve().EncodePoint(bt, this->GetPublicElement(), this->GetGroupParameters().GetPointCompression());
784
0
}
Unexecuted instantiation: CryptoPP::DL_PublicKey_ECGDSA<CryptoPP::ECP>::DEREncodePublicKey(CryptoPP::BufferedTransformation&) const
Unexecuted instantiation: CryptoPP::DL_PublicKey_ECGDSA<CryptoPP::EC2N>::DEREncodePublicKey(CryptoPP::BufferedTransformation&) const
785
786
// ******************************************************************
787
788
template <class EC>
789
void DL_PrivateKey_ECGDSA<EC>::BERDecodePrivateKey(BufferedTransformation &bt, bool parametersPresent, size_t size)
790
0
{
791
0
  CRYPTOPP_UNUSED(size);
792
0
  BERSequenceDecoder seq(bt);
793
0
    word32 version;
794
0
    BERDecodeUnsigned<word32>(seq, version, INTEGER, 1, 1); // check version
795
796
0
    BERGeneralDecoder dec(seq, OCTET_STRING);
797
0
    if (!dec.IsDefiniteLength())
798
0
      BERDecodeError();
799
0
    Integer x;
800
0
    x.Decode(dec, (size_t)dec.RemainingLength());
801
0
    dec.MessageEnd();
802
0
    if (!parametersPresent && seq.PeekByte() != (CONTEXT_SPECIFIC | CONSTRUCTED | 0))
803
0
      BERDecodeError();
804
0
    if (!seq.EndReached() && seq.PeekByte() == (CONTEXT_SPECIFIC | CONSTRUCTED | 0))
805
0
    {
806
0
      BERGeneralDecoder parameters(seq, CONTEXT_SPECIFIC | CONSTRUCTED | 0);
807
0
      this->AccessGroupParameters().BERDecode(parameters);
808
0
      parameters.MessageEnd();
809
0
    }
810
0
    if (!seq.EndReached())
811
0
    {
812
      // skip over the public element
813
0
      SecByteBlock subjectPublicKey;
814
0
      unsigned int unusedBits;
815
0
      BERGeneralDecoder publicKey(seq, CONTEXT_SPECIFIC | CONSTRUCTED | 1);
816
0
      BERDecodeBitString(publicKey, subjectPublicKey, unusedBits);
817
0
      publicKey.MessageEnd();
818
0
      Element Q;
819
0
      if (!(unusedBits == 0 && this->GetGroupParameters().GetCurve().DecodePoint(Q, subjectPublicKey, subjectPublicKey.size())))
820
0
        BERDecodeError();
821
0
    }
822
0
  seq.MessageEnd();
823
824
0
  this->SetPrivateExponent(x);
825
0
}
Unexecuted instantiation: CryptoPP::DL_PrivateKey_ECGDSA<CryptoPP::ECP>::BERDecodePrivateKey(CryptoPP::BufferedTransformation&, bool, unsigned long)
Unexecuted instantiation: CryptoPP::DL_PrivateKey_ECGDSA<CryptoPP::EC2N>::BERDecodePrivateKey(CryptoPP::BufferedTransformation&, bool, unsigned long)
826
827
template <class EC>
828
void DL_PrivateKey_ECGDSA<EC>::DEREncodePrivateKey(BufferedTransformation &bt) const
829
0
{
830
0
  DERSequenceEncoder privateKey(bt);
831
0
    DEREncodeUnsigned<word32>(privateKey, 1); // version
832
    // SEC 1 ver 1.0 says privateKey (m_d) has the same length as order of the curve
833
    // this will be changed to order of base point in a future version
834
0
    this->GetPrivateExponent().DEREncodeAsOctetString(privateKey, this->GetGroupParameters().GetSubgroupOrder().ByteCount());
835
0
  privateKey.MessageEnd();
836
0
}
Unexecuted instantiation: CryptoPP::DL_PrivateKey_ECGDSA<CryptoPP::ECP>::DEREncodePrivateKey(CryptoPP::BufferedTransformation&) const
Unexecuted instantiation: CryptoPP::DL_PrivateKey_ECGDSA<CryptoPP::EC2N>::DEREncodePrivateKey(CryptoPP::BufferedTransformation&) const
837
838
NAMESPACE_END
839
840
#endif