Botan  2.18.2
Crypto and TLS for C++11
Public Member Functions | Static Public Member Functions | List of all members
Botan::EC_Group Class Referencefinal

#include <ec_group.h>

Public Member Functions

bool a_is_minus_3 () const
 
bool a_is_zero () const
 
PointGFp blinded_base_point_multiply (const BigInt &k, RandomNumberGenerator &rng, std::vector< BigInt > &ws) const
 
BigInt blinded_base_point_multiply_x (const BigInt &k, RandomNumberGenerator &rng, std::vector< BigInt > &ws) const
 
PointGFp blinded_var_point_multiply (const PointGFp &point, const BigInt &k, RandomNumberGenerator &rng, std::vector< BigInt > &ws) const
 
std::vector< uint8_t > DER_encode (EC_Group_Encoding form) const
 
 EC_Group (const CurveGFp &curve, const PointGFp &base_point, const BigInt &order, const BigInt &cofactor)
 
 EC_Group (const BigInt &p, const BigInt &a, const BigInt &b, const BigInt &base_x, const BigInt &base_y, const BigInt &order, const BigInt &cofactor, const OID &oid=OID())
 
 EC_Group (const uint8_t ber[], size_t ber_len)
 
template<typename Alloc >
 EC_Group (const std::vector< uint8_t, Alloc > &ber)
 
 EC_Group (const OID &oid)
 
 EC_Group (const std::string &pem_or_oid)
 
 EC_Group ()
 
 EC_Group (const EC_Group &)=default
 
 EC_Group (EC_Group &&)=default
 
const BigIntget_a () const
 
const BigIntget_b () const
 
const PointGFpget_base_point () const
 
const BigIntget_cofactor () const
 
const CurveGFpget_curve () const
 
const OIDget_curve_oid () const
 
const BigIntget_g_x () const
 
const BigIntget_g_y () const
 
std::string get_oid () const
 
const BigIntget_order () const
 
size_t get_order_bits () const
 
size_t get_order_bytes () const
 
const BigIntget_p () const
 
size_t get_p_bits () const
 
size_t get_p_bytes () const
 
bool initialized () const
 
BigInt inverse_mod_order (const BigInt &x) const
 
BigInt mod_order (const BigInt &x) const
 
BigInt multiply_mod_order (const BigInt &x, const BigInt &y) const
 
BigInt multiply_mod_order (const BigInt &x, const BigInt &y, const BigInt &z) const
 
EC_Groupoperator= (const EC_Group &)=default
 
EC_Groupoperator= (EC_Group &&)=default
 
bool operator== (const EC_Group &other) const
 
PointGFp OS2ECP (const uint8_t bits[], size_t len) const
 
template<typename Alloc >
PointGFp OS2ECP (const std::vector< uint8_t, Alloc > &vec) const
 
std::string PEM_encode () const
 
PointGFp point (const BigInt &x, const BigInt &y) const
 
PointGFp point_multiply (const BigInt &x, const PointGFp &pt, const BigInt &y) const
 
size_t point_size (PointGFp::Compression_Type format) const
 
BigInt random_scalar (RandomNumberGenerator &rng) const
 
EC_Group_Source source () const
 
BigInt square_mod_order (const BigInt &x) const
 
bool verify_group (RandomNumberGenerator &rng, bool strong=false) const
 
bool verify_public_element (const PointGFp &y) const
 
PointGFp zero_point () const
 
 ~EC_Group ()
 

Static Public Member Functions

static size_t clear_registered_curve_data ()
 
static EC_Group EC_Group_from_PEM (const std::string &pem)
 
static std::shared_ptr< EC_Group_Data > EC_group_info (const OID &oid)
 
static const std::set< std::string > & known_named_groups ()
 
static std::string PEM_for_named_group (const std::string &name)
 

Detailed Description

Class representing an elliptic curve

The internal representation is stored in a shared_ptr, so copying an EC_Group is inexpensive.

Definition at line 45 of file ec_group.h.

Constructor & Destructor Documentation

◆ EC_Group() [1/9]

Botan::EC_Group::EC_Group ( const CurveGFp curve,
const PointGFp base_point,
const BigInt order,
const BigInt cofactor 
)
inline

Construct Domain paramers from specified parameters

Parameters
curveelliptic curve
base_pointa base point
orderthe order of the base point
cofactorthe cofactor

Definition at line 57 of file ec_group.h.

60  :
61  EC_Group(curve.get_p(),
62  curve.get_a(),
63  curve.get_b(),
64  base_point.get_affine_x(),
65  base_point.get_affine_y(),
66  order,
67  cofactor) {}

◆ EC_Group() [2/9]

Botan::EC_Group::EC_Group ( const BigInt p,
const BigInt a,
const BigInt b,
const BigInt base_x,
const BigInt base_y,
const BigInt order,
const BigInt cofactor,
const OID oid = OID() 
)

Construct Domain paramers from specified parameters

Parameters
pthe elliptic curve p
athe elliptic curve a param
bthe elliptic curve b param
base_xthe x coordinate of the base point
base_ythe y coordinate of the base point
orderthe order of the base point
cofactorthe cofactor
oidan optional OID used to identify this curve

Definition at line 429 of file ec_group.cpp.

References Botan::ExternalSource.

437  {
438  m_data = ec_group_data().lookup_or_create(p, a, b, base_x, base_y, order, cofactor, oid,
440  }

◆ EC_Group() [3/9]

Botan::EC_Group::EC_Group ( const uint8_t  ber[],
size_t  ber_len 
)
explicit

Decode a BER encoded ECC domain parameter set

Parameters
berthe bytes of the BER encoding
ber_lenthe length of ber

Definition at line 442 of file ec_group.cpp.

References Botan::ExternalSource.

443  {
444  m_data = BER_decode_EC_group(ber, ber_len, EC_Group_Source::ExternalSource);
445  }

◆ EC_Group() [4/9]

template<typename Alloc >
Botan::EC_Group::EC_Group ( const std::vector< uint8_t, Alloc > &  ber)
inline

Definition at line 97 of file ec_group.h.

97  :
98  EC_Group(ber.data(), ber.size()) {}

◆ EC_Group() [5/9]

Botan::EC_Group::EC_Group ( const OID oid)
explicit

Create an EC domain by OID (or throw if unknown)

Parameters
oidthe OID of the EC domain to create

Definition at line 372 of file ec_group.cpp.

References Botan::OID::to_string().

373  {
374  this->m_data = ec_group_data().lookup(domain_oid);
375  if(!this->m_data)
376  throw Invalid_Argument("Unknown EC_Group " + domain_oid.to_string());
377  }

◆ EC_Group() [6/9]

Botan::EC_Group::EC_Group ( const std::string &  pem_or_oid)
explicit

Create an EC domain from PEM encoding (as from PEM_encode), or from an OID name (eg "secp256r1", or "1.2.840.10045.3.1.7")

Parameters
pem_or_oidPEM-encoded data, or an OID
Warning
Support for PEM in this function is deprecated. Use EC_Group_from_PEM

Definition at line 379 of file ec_group.cpp.

References Botan::PEM_Code::decode_check_label(), Botan::ExternalSource, Botan::OID::from_string(), and Botan::OID::has_value().

380  {
381  if(str == "")
382  return; // no initialization / uninitialized
383 
384  try
385  {
386  const OID oid = OID::from_string(str);
387  if(oid.has_value())
388  m_data = ec_group_data().lookup(oid);
389  }
390  catch(...)
391  {
392  }
393 
394  if(m_data == nullptr)
395  {
396  if(str.size() > 30 && str.substr(0, 29) == "-----BEGIN EC PARAMETERS-----")
397  {
398  // OK try it as PEM ...
399  secure_vector<uint8_t> ber = PEM_Code::decode_check_label(str, "EC PARAMETERS");
400  this->m_data = BER_decode_EC_group(ber.data(), ber.size(), EC_Group_Source::ExternalSource);
401  }
402  }
403 
404  if(m_data == nullptr)
405  throw Invalid_Argument("Unknown ECC group '" + str + "'");
406  }
secure_vector< uint8_t > decode_check_label(DataSource &source, const std::string &label_want)
Definition: pem.cpp:54
static OID from_string(const std::string &str)
Definition: asn1_oid.cpp:62

◆ EC_Group() [7/9]

Botan::EC_Group::EC_Group ( )

Create an uninitialized EC_Group

Definition at line 363 of file ec_group.cpp.

Referenced by EC_Group_from_PEM().

364  {
365  }

◆ ~EC_Group()

Botan::EC_Group::~EC_Group ( )

Definition at line 367 of file ec_group.cpp.

368  {
369  // shared_ptr possibly freed here
370  }

◆ EC_Group() [8/9]

Botan::EC_Group::EC_Group ( const EC_Group )
default

◆ EC_Group() [9/9]

Botan::EC_Group::EC_Group ( EC_Group &&  )
default

Member Function Documentation

◆ a_is_minus_3()

bool Botan::EC_Group::a_is_minus_3 ( ) const

Return if a == -3 mod p

Definition at line 459 of file ec_group.cpp.

460  {
461  return data().a_is_minus_3();
462  }

◆ a_is_zero()

bool Botan::EC_Group::a_is_zero ( ) const

Return if a == 0 mod p

Definition at line 464 of file ec_group.cpp.

465  {
466  return data().a_is_zero();
467  }

◆ blinded_base_point_multiply()

PointGFp Botan::EC_Group::blinded_base_point_multiply ( const BigInt k,
RandomNumberGenerator rng,
std::vector< BigInt > &  ws 
) const

Blinded point multiplication, attempts resistance to side channels

Parameters
kthe scalar
rnga random number generator
wsa temp workspace
Returns
base_point*k

Definition at line 590 of file ec_group.cpp.

Referenced by Botan::EC_PrivateKey::EC_PrivateKey().

593  {
594  return data().blinded_base_point_multiply(k, rng, ws);
595  }

◆ blinded_base_point_multiply_x()

BigInt Botan::EC_Group::blinded_base_point_multiply_x ( const BigInt k,
RandomNumberGenerator rng,
std::vector< BigInt > &  ws 
) const

Blinded point multiplication, attempts resistance to side channels Returns just the x coordinate of the point

Parameters
kthe scalar
rnga random number generator
wsa temp workspace
Returns
x coordinate of base_point*k

Definition at line 597 of file ec_group.cpp.

References Botan::PointGFp::get_affine_x(), and Botan::PointGFp::is_zero().

600  {
601  const PointGFp pt = data().blinded_base_point_multiply(k, rng, ws);
602 
603  if(pt.is_zero())
604  return 0;
605  return pt.get_affine_x();
606  }

◆ blinded_var_point_multiply()

PointGFp Botan::EC_Group::blinded_var_point_multiply ( const PointGFp point,
const BigInt k,
RandomNumberGenerator rng,
std::vector< BigInt > &  ws 
) const

Blinded point multiplication, attempts resistance to side channels

Parameters
pointinput point
kthe scalar
rnga random number generator
wsa temp workspace
Returns
point*k

Definition at line 613 of file ec_group.cpp.

References get_order(), Botan::PointGFp_Var_Point_Precompute::mul(), and point().

617  {
618  PointGFp_Var_Point_Precompute mul(point, rng, ws);
619  return mul.mul(k, rng, get_order(), ws);
620  }
PointGFp point(const BigInt &x, const BigInt &y) const
Definition: ec_group.cpp:578
const BigInt & get_order() const
Definition: ec_group.cpp:509

◆ clear_registered_curve_data()

size_t Botan::EC_Group::clear_registered_curve_data ( )
static

Definition at line 269 of file ec_group.cpp.

270  {
271  return ec_group_data().clear();
272  }

◆ DER_encode()

std::vector< uint8_t > Botan::EC_Group::DER_encode ( EC_Group_Encoding  form) const

Create the DER encoding of this domain

Parameters
formof encoding to use
Returns
bytes encododed as DER

Definition at line 628 of file ec_group.cpp.

References Botan::EC_DOMPAR_ENC_EXPLICIT, Botan::EC_DOMPAR_ENC_IMPLICITCA, Botan::EC_DOMPAR_ENC_OID, Botan::OID::empty(), Botan::PEM_Code::encode(), Botan::DER_Encoder::encode(), Botan::BigInt::encode_1363(), Botan::DER_Encoder::encode_null(), Botan::DER_Encoder::end_cons(), get_a(), get_b(), get_base_point(), get_cofactor(), get_curve_oid(), get_order(), get_p(), get_p_bytes(), Botan::OCTET_STRING, Botan::SEQUENCE, Botan::DER_Encoder::start_cons(), and Botan::PointGFp::UNCOMPRESSED.

Referenced by PEM_encode().

629  {
630  std::vector<uint8_t> output;
631 
632  DER_Encoder der(output);
633 
634  if(form == EC_DOMPAR_ENC_EXPLICIT)
635  {
636  const size_t ecpVers1 = 1;
637  const OID curve_type("1.2.840.10045.1.1"); // prime field
638 
639  const size_t p_bytes = get_p_bytes();
640 
641  der.start_cons(SEQUENCE)
642  .encode(ecpVers1)
643  .start_cons(SEQUENCE)
644  .encode(curve_type)
645  .encode(get_p())
646  .end_cons()
647  .start_cons(SEQUENCE)
648  .encode(BigInt::encode_1363(get_a(), p_bytes),
649  OCTET_STRING)
650  .encode(BigInt::encode_1363(get_b(), p_bytes),
651  OCTET_STRING)
652  .end_cons()
654  .encode(get_order())
655  .encode(get_cofactor())
656  .end_cons();
657  }
658  else if(form == EC_DOMPAR_ENC_OID)
659  {
660  const OID oid = get_curve_oid();
661  if(oid.empty())
662  {
663  throw Encoding_Error("Cannot encode EC_Group as OID because OID not set");
664  }
665  der.encode(oid);
666  }
667  else if(form == EC_DOMPAR_ENC_IMPLICITCA)
668  {
669  der.encode_null();
670  }
671  else
672  {
673  throw Internal_Error("EC_Group::DER_encode: Unknown encoding");
674  }
675 
676  return output;
677  }
size_t get_p_bytes() const
Definition: ec_group.cpp:474
const OID & get_curve_oid() const
Definition: ec_group.cpp:554
const BigInt & get_order() const
Definition: ec_group.cpp:509
std::string encode(const uint8_t der[], size_t length, const std::string &label, size_t width)
Definition: pem.cpp:43
const PointGFp & get_base_point() const
Definition: ec_group.cpp:504
const BigInt & get_cofactor() const
Definition: ec_group.cpp:524
const BigInt & get_b() const
Definition: ec_group.cpp:499
const BigInt & get_a() const
Definition: ec_group.cpp:494
const BigInt & get_p() const
Definition: ec_group.cpp:489
static secure_vector< uint8_t > encode_1363(const BigInt &n, size_t bytes)
Definition: big_code.cpp:111

◆ EC_Group_from_PEM()

EC_Group Botan::EC_Group::EC_Group_from_PEM ( const std::string &  pem)
static

Definition at line 409 of file ec_group.cpp.

References Botan::PEM_Code::decode_check_label(), and EC_Group().

410  {
411  const auto ber = PEM_Code::decode_check_label(pem, "EC PARAMETERS");
412  return EC_Group(ber.data(), ber.size());
413  }
secure_vector< uint8_t > decode_check_label(DataSource &source, const std::string &label_want)
Definition: pem.cpp:54

◆ EC_group_info()

std::shared_ptr< EC_Group_Data > Botan::EC_Group::EC_group_info ( const OID oid)
static

Definition at line 13 of file ec_named.cpp.

14  {
15  // P-256
16  if(oid == OID{1,2,840,10045,3,1,7})
17  return load_EC_group_info("0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
18  "0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
19  "0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
20  "0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
21  "0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
22  "0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
23  oid);
24 
25  // P-384
26  if(oid == OID{1,3,132,0,34})
27  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
28  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
29  "0xB3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
30  "0xAA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
31  "0x3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
32  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
33  oid);
34  // P-521
35  if(oid == OID{1,3,132,0,35})
36  return load_EC_group_info("0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
37  "0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
38  "0x51953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
39  "0xC6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
40  "0x11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
41  "0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
42  oid);
43 
44  // brainpool160r1
45  if(oid == OID{1,3,36,3,3,2,8,1,1,1})
46  return load_EC_group_info("0xE95E4A5F737059DC60DFC7AD95B3D8139515620F",
47  "0x340E7BE2A280EB74E2BE61BADA745D97E8F7C300",
48  "0x1E589A8595423412134FAA2DBDEC95C8D8675E58",
49  "0xBED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3",
50  "0x1667CB477A1A8EC338F94741669C976316DA6321",
51  "0xE95E4A5F737059DC60DF5991D45029409E60FC09",
52  oid);
53  // brainpool192r1
54  if(oid == OID{1,3,36,3,3,2,8,1,1,3})
55  return load_EC_group_info("0xC302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297",
56  "0x6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF",
57  "0x469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9",
58  "0xC0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6",
59  "0x14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F",
60  "0xC302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1",
61  oid);
62  // brainpool224r1
63  if(oid == OID{1,3,36,3,3,2,8,1,1,5})
64  return load_EC_group_info("0xD7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF",
65  "0x68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43",
66  "0x2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B",
67  "0xD9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D",
68  "0x58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD",
69  "0xD7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F",
70  oid);
71  // brainpool256r1
72  if(oid == OID{1,3,36,3,3,2,8,1,1,7})
73  return load_EC_group_info("0xA9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377",
74  "0x7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9",
75  "0x26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6",
76  "0x8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262",
77  "0x547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997",
78  "0xA9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7",
79  oid);
80  // brainpool320r1
81  if(oid == OID{1,3,36,3,3,2,8,1,1,9})
82  return load_EC_group_info("0xD35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27",
83  "0x3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4",
84  "0x520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6",
85  "0x43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E20611",
86  "0x14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1",
87  "0xD35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311",
88  oid);
89  // brainpool384r1
90  if(oid == OID{1,3,36,3,3,2,8,1,1,11})
91  return load_EC_group_info("0x8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53",
92  "0x7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826",
93  "0x4A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11",
94  "0x1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E",
95  "0x8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315",
96  "0x8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565",
97  oid);
98  // brainpool512r1
99  if(oid == OID{1,3,36,3,3,2,8,1,1,13})
100  return load_EC_group_info("0xAADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3",
101  "0x7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA",
102  "0x3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723",
103  "0x81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822",
104  "0x7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892",
105  "0xAADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069",
106  oid);
107  // frp256v1
108  if(oid == OID{1,2,250,1,223,101,256,1})
109  return load_EC_group_info("0xF1FD178C0B3AD58F10126DE8CE42435B3961ADBCABC8CA6DE8FCF353D86E9C03",
110  "0xF1FD178C0B3AD58F10126DE8CE42435B3961ADBCABC8CA6DE8FCF353D86E9C00",
111  "0xEE353FCA5428A9300D4ABA754A44C00FDFEC0C9AE4B1A1803075ED967B7BB73F",
112  "0xB6B3D4C356C139EB31183D4749D423958C27D2DCAF98B70164C97A2DD98F5CFF",
113  "0x6142E0F7C8B204911F9271F0F3ECEF8C2701C307E8E4C9E183115A1554062CFB",
114  "0xF1FD178C0B3AD58F10126DE8CE42435B53DC67E140D2BF941FFDD459C6D655E1",
115  oid);
116  // gost_256A
117  if(oid == OID{1,2,643,2,2,35,1} || oid == OID{1,2,643,2,2,36,0} || oid == OID{1,2,643,7,1,2,1,1,1})
118  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD97",
119  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD94",
120  "0xA6",
121  "0x1",
122  "0x8D91E471E0989CDA27DF505A453F2B7635294F2DDF23E3B122ACC99C9E9F1E14",
123  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C611070995AD10045841B09B761B893",
124  OID{1,2,643,7,1,2,1,1,1});
125 
126  // gost_512A
127  if(oid == OID{1,2,643,7,1,2,1,2,1})
128  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC7",
129  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC4",
130  "0xE8C2505DEDFC86DDC1BD0B2B6667F1DA34B82574761CB0E879BD081CFD0B6265EE3CB090F30D27614CB4574010DA90DD862EF9D4EBEE4761503190785A71C760",
131  "3",
132  "0x7503CFE87A836AE3A61B8816E25450E6CE5E1C93ACF1ABC1778064FDCBEFA921DF1626BE4FD036E93D75E6A50E3A41E98028FE5FC235F5B889A589CB5215F2A4",
133  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27E69532F48D89116FF22B8D4E0560609B4B38ABFAD2B85DCACDB1411F10B275",
134  oid);
135 
136  // secp160k1
137  if(oid == OID{1,3,132,0,9})
138  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
139  "0x0",
140  "0x7",
141  "0x3B4C382CE37AA192A4019E763036F4F5DD4D7EBB",
142  "0x938CF935318FDCED6BC28286531733C3F03C4FEE",
143  "0x100000000000000000001B8FA16DFAB9ACA16B6B3",
144  oid);
145  // secp160r1
146  if(oid == OID{1,3,132,0,8})
147  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF",
148  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC",
149  "0x1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45",
150  "0x4A96B5688EF573284664698968C38BB913CBFC82",
151  "0x23A628553168947D59DCC912042351377AC5FB32",
152  "0x100000000000000000001F4C8F927AED3CA752257",
153  oid);
154  // secp160r2
155  if(oid == OID{1,3,132,0,30})
156  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
157  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70",
158  "0xB4E134D3FB59EB8BAB57274904664D5AF50388BA",
159  "0x52DCB034293A117E1F4FF11B30F7199D3144CE6D",
160  "0xFEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E",
161  "0x100000000000000000000351EE786A818F3A1A16B",
162  oid);
163  // secp192k1
164  if(oid == OID{1,3,132,0,31})
165  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37",
166  "0x0",
167  "0x3",
168  "0xDB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D",
169  "0x9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D",
170  "0xFFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",
171  oid);
172  // secp192r1
173  if(oid == OID{1,2,840,10045,3,1,1})
174  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
175  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
176  "0x64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1",
177  "0x188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012",
178  "0x7192B95FFC8DA78631011ED6B24CDD573F977A11E794811",
179  "0xFFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",
180  oid);
181  // secp224k1
182  if(oid == OID{1,3,132,0,32})
183  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D",
184  "0x0",
185  "0x5",
186  "0xA1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C",
187  "0x7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5",
188  "0x10000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",
189  oid);
190  // secp224r1
191  if(oid == OID{1,3,132,0,33})
192  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
193  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
194  "0xB4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
195  "0xB70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",
196  "0xBD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",
197  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
198  oid);
199  // secp256k1
200  if(oid == OID{1,3,132,0,10})
201  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",
202  "0x0",
203  "0x7",
204  "0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",
205  "0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",
206  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",
207  oid);
208 
209  // sm2p256v1
210  if(oid == OID{1,2,156,10197,1,301})
211  return load_EC_group_info("0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",
212  "0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",
213  "0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",
214  "0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",
215  "0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0",
216  "0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",
217  oid);
218  // x962_p192v2
219  if(oid == OID{1,2,840,10045,3,1,2})
220  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
221  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
222  "0xCC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953",
223  "0xEEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A",
224  "0x6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15",
225  "0xFFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31",
226  oid);
227  // x962_p192v3
228  if(oid == OID{1,2,840,10045,3,1,3})
229  return load_EC_group_info("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
230  "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
231  "0x22123DC2395A05CAA7423DAECCC94760A7D462256BD56916",
232  "0x7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896",
233  "0x38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0",
234  "0xFFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13",
235  oid);
236  // x962_p239v1
237  if(oid == OID{1,2,840,10045,3,1,4})
238  return load_EC_group_info("0x7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
239  "0x7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
240  "0x6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A",
241  "0xFFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF",
242  "0x7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE",
243  "0x7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B",
244  oid);
245  // x962_p239v2
246  if(oid == OID{1,2,840,10045,3,1,5})
247  return load_EC_group_info("0x7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
248  "0x7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
249  "0x617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C",
250  "0x38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7",
251  "0x5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA",
252  "0x7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063",
253  oid);
254  // x962_p239v3
255  if(oid == OID{1,2,840,10045,3,1,6})
256  return load_EC_group_info("0x7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
257  "0x7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
258  "0x255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E",
259  "0x6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A",
260  "0x1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3",
261  "0x7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551",
262  oid);
263 
264  return std::shared_ptr<EC_Group_Data>();
265  }

◆ get_a()

const BigInt & Botan::EC_Group::get_a ( ) const

Return the a parameter of the elliptic curve equation

Definition at line 494 of file ec_group.cpp.

Referenced by DER_encode(), operator==(), Botan::sm2_compute_za(), and verify_group().

495  {
496  return data().a();
497  }

◆ get_b()

const BigInt & Botan::EC_Group::get_b ( ) const

Return the b parameter of the elliptic curve equation

Definition at line 499 of file ec_group.cpp.

Referenced by DER_encode(), operator==(), Botan::sm2_compute_za(), and verify_group().

500  {
501  return data().b();
502  }

◆ get_base_point()

const PointGFp & Botan::EC_Group::get_base_point ( ) const

Return group base point

Returns
base point

Definition at line 504 of file ec_group.cpp.

Referenced by DER_encode(), Botan::EC_PrivateKey::EC_PrivateKey(), point_multiply(), and verify_group().

505  {
506  return data().base_point();
507  }

◆ get_cofactor()

const BigInt & Botan::EC_Group::get_cofactor ( ) const

Return the cofactor

Returns
the cofactor

Definition at line 524 of file ec_group.cpp.

Referenced by DER_encode(), Botan::ECIES_KA_Operation::derive_secret(), Botan::ECIES_Decryptor::ECIES_Decryptor(), verify_group(), and verify_public_element().

525  {
526  return data().cofactor();
527  }

◆ get_curve()

const CurveGFp & Botan::EC_Group::get_curve ( ) const

Return domain parameter curve

Returns
domain parameter curve

Definition at line 454 of file ec_group.cpp.

Referenced by Botan::EC_PublicKey::EC_PublicKey().

455  {
456  return data().curve();
457  }

◆ get_curve_oid()

const OID & Botan::EC_Group::get_curve_oid ( ) const

Return the OID of these domain parameters

Returns
the OID

Definition at line 554 of file ec_group.cpp.

Referenced by Botan::GOST_3410_PublicKey::algorithm_identifier(), DER_encode(), Botan::EC_PrivateKey::EC_PrivateKey(), Botan::EC_PublicKey::EC_PublicKey(), and Botan::EC_PublicKey::set_parameter_encoding().

555  {
556  return data().oid();
557  }

◆ get_g_x()

const BigInt & Botan::EC_Group::get_g_x ( ) const

Return the x coordinate of the base point

Definition at line 514 of file ec_group.cpp.

Referenced by operator==(), and Botan::sm2_compute_za().

515  {
516  return data().g_x();
517  }

◆ get_g_y()

const BigInt & Botan::EC_Group::get_g_y ( ) const

Return the y coordinate of the base point

Definition at line 519 of file ec_group.cpp.

Referenced by operator==(), and Botan::sm2_compute_za().

520  {
521  return data().g_y();
522  }

◆ get_oid()

std::string Botan::EC_Group::get_oid ( ) const
inline

Return the OID of these domain parameters

Returns
the OID as a string

Definition at line 260 of file ec_group.h.

260 { return get_curve_oid().to_string(); }
const OID & get_curve_oid() const
Definition: ec_group.cpp:554
std::string to_string() const
Definition: asn1_oid.cpp:98

◆ get_order()

const BigInt & Botan::EC_Group::get_order ( ) const

Return the order of the base point

Returns
order of the base point

Definition at line 509 of file ec_group.cpp.

Referenced by blinded_var_point_multiply(), DER_encode(), Botan::ECIES_KA_Operation::derive_secret(), Botan::ECIES_Decryptor::ECIES_Decryptor(), random_scalar(), verify_group(), and verify_public_element().

510  {
511  return data().order();
512  }

◆ get_order_bits()

size_t Botan::EC_Group::get_order_bits ( ) const

Return the size of group order in bits (same as get_order().bits())

Definition at line 479 of file ec_group.cpp.

480  {
481  return data().order_bits();
482  }

◆ get_order_bytes()

size_t Botan::EC_Group::get_order_bytes ( ) const

Return the size of p in bytes (same as get_order().bytes())

Definition at line 484 of file ec_group.cpp.

485  {
486  return data().order_bytes();
487  }

◆ get_p()

const BigInt & Botan::EC_Group::get_p ( ) const

Return the prime modulus of the field

Definition at line 489 of file ec_group.cpp.

Referenced by DER_encode(), operator==(), and verify_group().

490  {
491  return data().p();
492  }

◆ get_p_bits()

size_t Botan::EC_Group::get_p_bits ( ) const

Return the size of p in bits (same as get_p().bits())

Definition at line 469 of file ec_group.cpp.

Referenced by Botan::GOST_3410_PublicKey::algo_name(), Botan::GOST_3410_PrivateKey::GOST_3410_PrivateKey(), Botan::GOST_3410_PublicKey::GOST_3410_PublicKey(), and Botan::EC_PublicKey::key_length().

470  {
471  return data().p_bits();
472  }

◆ get_p_bytes()

size_t Botan::EC_Group::get_p_bytes ( ) const

Return the size of p in bits (same as get_p().bytes())

Definition at line 474 of file ec_group.cpp.

Referenced by DER_encode(), point_size(), and Botan::sm2_compute_za().

475  {
476  return data().p_bytes();
477  }

◆ initialized()

bool Botan::EC_Group::initialized ( ) const
inline

Definition at line 336 of file ec_group.h.

336 { return (m_data != nullptr); }

◆ inverse_mod_order()

BigInt Botan::EC_Group::inverse_mod_order ( const BigInt x) const

Definition at line 549 of file ec_group.cpp.

Referenced by Botan::EC_PrivateKey::EC_PrivateKey(), and Botan::SM2_PrivateKey::SM2_PrivateKey().

550  {
551  return data().inverse_mod_order(x);
552  }

◆ known_named_groups()

const std::set< std::string > & Botan::EC_Group::known_named_groups ( )
static

Return a set of known named EC groups

Definition at line 268 of file ec_named.cpp.

269  {
270  static const std::set<std::string> named_groups = {
271  "secp160k1",
272  "secp160r1",
273  "secp160r2",
274  "secp192k1",
275  "secp192r1",
276  "secp224k1",
277  "secp224r1",
278  "secp256k1",
279  "secp256r1",
280  "secp384r1",
281  "secp521r1",
282  "brainpool160r1",
283  "brainpool192r1",
284  "brainpool224r1",
285  "brainpool256r1",
286  "brainpool320r1",
287  "brainpool384r1",
288  "brainpool512r1",
289  "x962_p192v2",
290  "x962_p192v3",
291  "x962_p239v1",
292  "x962_p239v2",
293  "x962_p239v3",
294  "gost_256A",
295  "gost_512A",
296  "frp256v1",
297  "sm2p256v1"
298  };
299  return named_groups;
300  }

◆ mod_order()

BigInt Botan::EC_Group::mod_order ( const BigInt x) const

Definition at line 529 of file ec_group.cpp.

530  {
531  return data().mod_order(k);
532  }

◆ multiply_mod_order() [1/2]

BigInt Botan::EC_Group::multiply_mod_order ( const BigInt x,
const BigInt y 
) const

Definition at line 539 of file ec_group.cpp.

540  {
541  return data().multiply_mod_order(x, y);
542  }

◆ multiply_mod_order() [2/2]

BigInt Botan::EC_Group::multiply_mod_order ( const BigInt x,
const BigInt y,
const BigInt z 
) const

Definition at line 544 of file ec_group.cpp.

545  {
546  return data().multiply_mod_order(x, y, z);
547  }

◆ operator=() [1/2]

EC_Group& Botan::EC_Group::operator= ( const EC_Group )
default

◆ operator=() [2/2]

EC_Group& Botan::EC_Group::operator= ( EC_Group &&  )
default

◆ operator==()

bool Botan::EC_Group::operator== ( const EC_Group other) const

Definition at line 685 of file ec_group.cpp.

References get_a(), get_b(), get_g_x(), get_g_y(), and get_p().

686  {
687  if(m_data == other.m_data)
688  return true; // same shared rep
689 
690  /*
691  * No point comparing order/cofactor as they are uniquely determined
692  * by the curve equation (p,a,b) and the base point.
693  */
694  return (get_p() == other.get_p() &&
695  get_a() == other.get_a() &&
696  get_b() == other.get_b() &&
697  get_g_x() == other.get_g_x() &&
698  get_g_y() == other.get_g_y());
699  }
const BigInt & get_b() const
Definition: ec_group.cpp:499
const BigInt & get_g_x() const
Definition: ec_group.cpp:514
const BigInt & get_a() const
Definition: ec_group.cpp:494
const BigInt & get_g_y() const
Definition: ec_group.cpp:519
const BigInt & get_p() const
Definition: ec_group.cpp:489

◆ OS2ECP() [1/2]

PointGFp Botan::EC_Group::OS2ECP ( const uint8_t  bits[],
size_t  len 
) const

Definition at line 573 of file ec_group.cpp.

References Botan::OS2ECP().

Referenced by Botan::EC_PrivateKey::EC_PrivateKey(), Botan::ECIES_Encryptor::ECIES_Encryptor(), and Botan::TLS::Callbacks::tls_ecdh_agree().

574  {
575  return Botan::OS2ECP(bits, len, data().curve());
576  }
PointGFp OS2ECP(const uint8_t data[], size_t data_len, const CurveGFp &curve)
Definition: point_gfp.cpp:667

◆ OS2ECP() [2/2]

template<typename Alloc >
PointGFp Botan::EC_Group::OS2ECP ( const std::vector< uint8_t, Alloc > &  vec) const
inline

Definition at line 331 of file ec_group.h.

References Botan::OS2ECP().

332  {
333  return this->OS2ECP(vec.data(), vec.size());
334  }
PointGFp OS2ECP(const uint8_t bits[], size_t len) const
Definition: ec_group.cpp:573

◆ PEM_encode()

std::string Botan::EC_Group::PEM_encode ( ) const

Return the PEM encoding (always in explicit form)

Returns
string containing PEM data

Definition at line 679 of file ec_group.cpp.

References DER_encode(), Botan::EC_DOMPAR_ENC_EXPLICIT, and Botan::PEM_Code::encode().

Referenced by PEM_for_named_group().

680  {
681  const std::vector<uint8_t> der = DER_encode(EC_DOMPAR_ENC_EXPLICIT);
682  return PEM_Code::encode(der, "EC PARAMETERS");
683  }
std::string encode(const uint8_t der[], size_t length, const std::string &label, size_t width)
Definition: pem.cpp:43
std::vector< uint8_t > DER_encode(EC_Group_Encoding form) const
Definition: ec_group.cpp:628

◆ PEM_for_named_group()

std::string Botan::EC_Group::PEM_for_named_group ( const std::string &  name)
static

Return PEM representation of named EC group Deprecated: Use EC_Group(name).PEM_encode() if this is needed

Definition at line 416 of file ec_group.cpp.

References name, and PEM_encode().

417  {
418  try
419  {
420  EC_Group group(name);
421  return group.PEM_encode();
422  }
423  catch(...)
424  {
425  return "";
426  }
427  }
std::string name

◆ point()

PointGFp Botan::EC_Group::point ( const BigInt x,
const BigInt y 
) const

Return a point on this curve with the affine values x, y

Definition at line 578 of file ec_group.cpp.

Referenced by blinded_var_point_multiply(), Botan::GOST_3410_PublicKey::GOST_3410_PublicKey(), and verify_public_element().

579  {
580  // TODO: randomize the representation?
581  return PointGFp(data().curve(), x, y);
582  }

◆ point_multiply()

PointGFp Botan::EC_Group::point_multiply ( const BigInt x,
const PointGFp pt,
const BigInt y 
) const

Multi exponentiate. Not constant time.

Returns
base_point*x + pt*y

Definition at line 584 of file ec_group.cpp.

References get_base_point(), and Botan::PointGFp_Multi_Point_Precompute::multi_exp().

585  {
586  PointGFp_Multi_Point_Precompute xy_mul(get_base_point(), pt);
587  return xy_mul.multi_exp(x, y);
588  }
const PointGFp & get_base_point() const
Definition: ec_group.cpp:504

◆ point_size()

size_t Botan::EC_Group::point_size ( PointGFp::Compression_Type  format) const

Definition at line 564 of file ec_group.cpp.

References Botan::PointGFp::COMPRESSED, and get_p_bytes().

565  {
566  // Hybrid and standard format are (x,y), compressed is y, +1 format byte
567  if(format == PointGFp::COMPRESSED)
568  return (1 + get_p_bytes());
569  else
570  return (1 + 2*get_p_bytes());
571  }
size_t get_p_bytes() const
Definition: ec_group.cpp:474

◆ random_scalar()

BigInt Botan::EC_Group::random_scalar ( RandomNumberGenerator rng) const

Return a random scalar ie an integer in [1,order)

Definition at line 608 of file ec_group.cpp.

References get_order(), and Botan::BigInt::random_integer().

Referenced by Botan::EC_PrivateKey::EC_PrivateKey().

609  {
610  return BigInt::random_integer(rng, 1, get_order());
611  }
const BigInt & get_order() const
Definition: ec_group.cpp:509
static BigInt random_integer(RandomNumberGenerator &rng, const BigInt &min, const BigInt &max)
Definition: big_rand.cpp:45

◆ source()

EC_Group_Source Botan::EC_Group::source ( ) const

Definition at line 559 of file ec_group.cpp.

Referenced by verify_group().

560  {
561  return data().source();
562  }

◆ square_mod_order()

BigInt Botan::EC_Group::square_mod_order ( const BigInt x) const

Definition at line 534 of file ec_group.cpp.

535  {
536  return data().square_mod_order(x);
537  }

◆ verify_group()

bool Botan::EC_Group::verify_group ( RandomNumberGenerator rng,
bool  strong = false 
) const

Verify EC_Group domain

Returns
true if group is valid. false otherwise

Definition at line 724 of file ec_group.cpp.

References Botan::Builtin, Botan::Modular_Reducer::cube(), get_a(), get_b(), get_base_point(), get_cofactor(), get_order(), get_p(), Botan::is_prime(), Botan::Modular_Reducer::multiply(), Botan::PointGFp::on_the_curve(), Botan::Modular_Reducer::reduce(), source(), and Botan::Modular_Reducer::square().

Referenced by Botan::EC_PublicKey::check_key().

726  {
727  const bool is_builtin = source() == EC_Group_Source::Builtin;
728 
729  if(is_builtin && !strong)
730  return true;
731 
732  const BigInt& p = get_p();
733  const BigInt& a = get_a();
734  const BigInt& b = get_b();
735  const BigInt& order = get_order();
736  const PointGFp& base_point = get_base_point();
737 
738  if(p <= 3 || order <= 0)
739  return false;
740  if(a < 0 || a >= p)
741  return false;
742  if(b <= 0 || b >= p)
743  return false;
744 
745  const size_t test_prob = 128;
746  const bool is_randomly_generated = is_builtin;
747 
748  //check if field modulus is prime
749  if(!is_prime(p, rng, test_prob, is_randomly_generated))
750  {
751  return false;
752  }
753 
754  //check if order is prime
755  if(!is_prime(order, rng, test_prob, is_randomly_generated))
756  {
757  return false;
758  }
759 
760  //compute the discriminant: 4*a^3 + 27*b^2 which must be nonzero
761  const Modular_Reducer mod_p(p);
762 
763  const BigInt discriminant = mod_p.reduce(
764  mod_p.multiply(4, mod_p.cube(a)) +
765  mod_p.multiply(27, mod_p.square(b)));
766 
767  if(discriminant == 0)
768  {
769  return false;
770  }
771 
772  //check for valid cofactor
773  if(get_cofactor() < 1)
774  {
775  return false;
776  }
777 
778  //check if the base point is on the curve
779  if(!base_point.on_the_curve())
780  {
781  return false;
782  }
783  if((base_point * get_cofactor()).is_zero())
784  {
785  return false;
786  }
787  //check if order of the base point is correct
788  if(!(base_point * order).is_zero())
789  {
790  return false;
791  }
792 
793  return true;
794  }
const BigInt & get_order() const
Definition: ec_group.cpp:509
bool is_prime(const BigInt &n, RandomNumberGenerator &rng, size_t prob, bool is_random)
Definition: numthry.cpp:228
const PointGFp & get_base_point() const
Definition: ec_group.cpp:504
const BigInt & get_cofactor() const
Definition: ec_group.cpp:524
EC_Group_Source source() const
Definition: ec_group.cpp:559
const BigInt & get_b() const
Definition: ec_group.cpp:499
const BigInt & get_a() const
Definition: ec_group.cpp:494
const BigInt & get_p() const
Definition: ec_group.cpp:489

◆ verify_public_element()

bool Botan::EC_Group::verify_public_element ( const PointGFp y) const

Check if y is a plausible point on the curve

In particular, checks that it is a point on the curve, not infinity, and that it has order matching the group.

Definition at line 701 of file ec_group.cpp.

References get_cofactor(), get_order(), Botan::PointGFp::is_zero(), Botan::PointGFp::on_the_curve(), and point().

Referenced by Botan::EC_PublicKey::check_key().

702  {
703  //check that public point is not at infinity
704  if(point.is_zero())
705  return false;
706 
707  //check that public point is on the curve
708  if(point.on_the_curve() == false)
709  return false;
710 
711  //check that public point has order q
712  if((point * get_order()).is_zero() == false)
713  return false;
714 
715  if(get_cofactor() > 1)
716  {
717  if((point * get_cofactor()).is_zero())
718  return false;
719  }
720 
721  return true;
722  }
PointGFp point(const BigInt &x, const BigInt &y) const
Definition: ec_group.cpp:578
const BigInt & get_order() const
Definition: ec_group.cpp:509
const BigInt & get_cofactor() const
Definition: ec_group.cpp:524
bool on_the_curve() const
Definition: point_gfp.cpp:544
bool is_zero() const
Definition: point_gfp.h:184

◆ zero_point()

PointGFp Botan::EC_Group::zero_point ( ) const

Return the zero (or infinite) point on this curve

Definition at line 622 of file ec_group.cpp.

623  {
624  return PointGFp(data().curve());
625  }

The documentation for this class was generated from the following files: