Botan 2.19.5 Crypto and TLS for C&

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 ()
| 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 CurveGFp &curve, const PointGFp &base_point, const BigInt &order, const BigInt &cofactor)
| EC_Group (const EC_Group &)=default
| EC_Group (const OID &oid)
| EC_Group (const std::string &pem_or_oid)
template<typename Alloc >
| EC_Group (const std::vector< uint8_t, Alloc > &ber)
| EC_Group (const uint8_t ber[], size_t ber_len)
| EC_Group (EC_Group &&)=default
const BigInt & | get_a () const
const BigInt & | get_b () const
const PointGFp & | get_base_point () const
const BigInt & | get_cofactor () const
const CurveGFp & | get_curve () const
const OID & | get_curve_oid () const
const BigInt & | get_g_x () const
const BigInt & | get_g_y () const
std::string | get_oid () const
const BigInt & | get_order () const
size_t | get_order_bits () const
size_t | get_order_bytes () const
const BigInt & | get_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_Group & | operator= (const EC_Group &)=default
EC_Group & | operator= (EC_Group &&)=default
bool | operator== (const EC_Group &other) const
template<typename Alloc >
PointGFp | OS2ECP (const std::vector< uint8_t, Alloc > &vec) const
PointGFp | OS2ECP (const uint8_t bits[], size_t len) 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

  curve | elliptic curve
  base_point | a base point
  order | the order of the base point
  cofactor | the 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) {}
Botan::EC_Group::EC_Group
EC_Group()
Definition: ec_group.cpp:366

## ◆ 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

  p | the elliptic curve p
  a | the elliptic curve a param
  b | the elliptic curve b param
  base_x | the x coordinate of the base point
  base_y | the y coordinate of the base point
  order | the order of the base point
  cofactor | the cofactor
  oid | an optional OID used to identify this curve

Definition at line 432 of file ec_group.cpp.

440 {
441 m_data = ec_group_data().lookup_or_create(p, a, b, base_x, base_y, order, cofactor, oid,
442 EC_Group_Source::ExternalSource);
443 }
Botan::EC_Group_Source::ExternalSource
@ ExternalSource

References Botan::ExternalSource.

## ◆ 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

  ber | the bytes of the BER encoding
  ber_len | the length of ber

Definition at line 445 of file ec_group.cpp.

446 {
447 m_data = BER_decode_EC_group(ber, ber_len, EC_Group_Source::ExternalSource);
448 }

References Botan::ExternalSource.

## ◆ 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

  oid | the OID of the EC domain to create

Definition at line 375 of file ec_group.cpp.

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

References Botan::OID::to_string().

## ◆ 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_oid | PEM-encoded data, or an OID

Warning
  Support for PEM in this function is deprecated. Use EC_Group_from_PEM

Definition at line 382 of file ec_group.cpp.

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

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

## ◆ EC_Group() [7/9]

Botan::EC_Group::EC_Group | ( |  | ) |

Create an uninitialized EC_Group

Definition at line 366 of file ec_group.cpp.

367 {
368 }

Referenced by EC_Group_from_PEM().

## ◆ ~EC_Group()

Botan::EC_Group::~EC_Group | ( |  | ) |

Definition at line 370 of file ec_group.cpp.

371 {
372 // shared_ptr possibly freed here
373 }

## ◆ 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 462 of file ec_group.cpp.

463 {
464 return data().a_is_minus_3();
465 }

## ◆ a_is_zero()

bool Botan::EC_Group::a_is_zero | ( |  | ) | const

Return if a == 0 mod p

Definition at line 467 of file ec_group.cpp.

468 {
469 return data().a_is_zero();
470 }

## ◆ 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

  k | the scalar
  rng | a random number generator
  ws | a temp workspace

Returns
  base_point*k

Definition at line 593 of file ec_group.cpp.

596 {
597 return data().blinded_base_point_multiply(k, rng, ws);
598 }

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

## ◆ 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

  k | the scalar
  rng | a random number generator
  ws | a temp workspace

Returns
  x coordinate of base_point*k

Definition at line 600 of file ec_group.cpp.

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

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

## ◆ 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

  point | input point
  k | the scalar
  rng | a random number generator
  ws | a temp workspace

Returns
  point*k

Definition at line 616 of file ec_group.cpp.

620 {
621 PointGFp_Var_Point_Precompute mul(point, rng, ws);
622 return mul.mul(k, rng, get_order(), ws);
623 }
Botan::EC_Group::point
PointGFp point(const BigInt &x, const BigInt &y) const
Definition: ec_group.cpp:581
Botan::EC_Group::get_order
const BigInt & get_order() const
Definition: ec_group.cpp:512

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

## ◆ 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

  form | of encoding to use

Returns
  bytes encododed as DER

Definition at line 631 of file ec_group.cpp.

632 {
633 std::vector<uint8_t> output;
634
635 DER_Encoder der(output);
636
637 if(form == EC_DOMPAR_ENC_EXPLICIT)
638 {
639 const size_t ecpVers1 = 1;
640 const OID curve_type("1.2.840.10045.1.1"); // prime field
641
642 const size_t p_bytes = get_p_bytes();
643
644 der.start_cons(SEQUENCE)
645 .encode(ecpVers1)
646 .start_cons(SEQUENCE)
647 .encode(curve_type)
648 .encode(get_p())
649 .end_cons()
650 .start_cons(SEQUENCE)
651 .encode(BigInt::encode_1363(get_a(), p_bytes),
652 OCTET_STRING)
653 .encode(BigInt::encode_1363(get_b(), p_bytes),
654 OCTET_STRING)
655 .end_cons()
656 .encode(get_base_point().encode(PointGFp::UNCOMPRESSED), OCTET_STRING)
657 .encode(get_order())
658 .encode(get_cofactor())
659 .end_cons();
660 }
661 else if(form == EC_DOMPAR_ENC_OID)
662 {
663 const OID oid = get_curve_oid();
664 if(oid.empty())
665 {
666 throw Encoding_Error("Cannot encode EC_Group as OID because OID not set");
667 }
668 der.encode(oid);
669 }
670 else if(form == EC_DOMPAR_ENC_IMPLICITCA)
671 {
672 der.encode_null();
673 }
674 else
675 {
676 throw Internal_Error("EC_Group::DER_encode: Unknown encoding");
677 }
678
679 return output;
680 }
Botan::BigInt::encode_1363
static secure_vector< uint8_t > encode_1363(const BigInt &n, size_t bytes)
Definition: big_code.cpp:111
Botan::EC_Group::get_b
const BigInt & get_b() const
Definition: ec_group.cpp:502
Botan::EC_Group::get_a
const BigInt & get_a() const
Definition: ec_group.cpp:497
Botan::EC_Group::get_cofactor
const BigInt & get_cofactor() const
Definition: ec_group.cpp:527
Botan::EC_Group::get_p
const BigInt & get_p() const
Definition: ec_group.cpp:492
Botan::EC_Group::get_curve_oid
const OID & get_curve_oid() const
Definition: ec_group.cpp:557
Botan::EC_Group::get_base_point
const PointGFp & get_base_point() const
Definition: ec_group.cpp:507
Botan::EC_Group::get_p_bytes
size_t get_p_bytes() const
Definition: ec_group.cpp:477
Botan::PointGFp::UNCOMPRESSED
@ UNCOMPRESSED
Definition: point_gfp.h:51
Botan::OCSP::Response_Status_Code::Internal_Error
@ Internal_Error
Botan::PEM_Code::encode
std::string encode(const uint8_t der[], size_t length, const std::string &label, size_t width)
Definition: pem.cpp:43
Botan::SEQUENCE
@ SEQUENCE
Definition: asn1_obj.h:42
Botan::OCTET_STRING
@ OCTET_STRING
Definition: asn1_obj.h:38
Botan::EC_DOMPAR_ENC_EXPLICIT
@ EC_DOMPAR_ENC_EXPLICIT
Definition: ec_group.h:24
Botan::EC_DOMPAR_ENC_OID
@ EC_DOMPAR_ENC_OID
Definition: ec_group.h:26
Botan::EC_DOMPAR_ENC_IMPLICITCA
@ EC_DOMPAR_ENC_IMPLICITCA
Definition: ec_group.h:25

References Botan::EC_DOMPAR_ENC_EXPLICIT, Botan::EC_DOMPAR_ENC_IMPLICITCA, Botan::EC_DOMPAR_ENC_OID, Botan::OID::empty(), Botan::DER_Encoder::encode(), Botan::PEM_Code::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().

## ◆ EC_Group_from_PEM()

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

Definition at line 412 of file ec_group.cpp.

413 {
414 const auto ber = PEM_Code::decode_check_label(pem, "EC PARAMETERS");
415 return EC_Group(ber.data(), ber.size());
416 }

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

## ◆ 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 497 of file ec_group.cpp.

498 {
499 return data().a();
500 }

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

## ◆ get_b()

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

Return the b parameter of the elliptic curve equation

Definition at line 502 of file ec_group.cpp.

503 {
504 return data().b();
505 }

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

## ◆ get_base_point()

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

Return group base point

Returns
  base point

Definition at line 507 of file ec_group.cpp.

508 {
509 return data().base_point();
510 }

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

## ◆ get_cofactor()

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

Return the cofactor

Returns
  the cofactor

Definition at line 527 of file ec_group.cpp.

528 {
529 return data().cofactor();
530 }

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

## ◆ get_curve()

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

Return domain parameter curve

Returns
  domain parameter curve

Definition at line 457 of file ec_group.cpp.

458 {
459 return data().curve();
460 }

## ◆ 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 557 of file ec_group.cpp.

558 {
559 return data().oid();
560 }

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().

## ◆ get_g_x()

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

Return the x coordinate of the base point

Definition at line 517 of file ec_group.cpp.

518 {
519 return data().g_x();
520 }

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

## ◆ get_g_y()

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

Return the y coordinate of the base point

Definition at line 522 of file ec_group.cpp.

523 {
524 return data().g_y();
525 }

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

## ◆ 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(); }
Botan::OID::to_string
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 512 of file ec_group.cpp.

513 {
514 return data().order();
515 }

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().

## ◆ 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 482 of file ec_group.cpp.

483 {
484 return data().order_bits();
485 }

## ◆ 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 487 of file ec_group.cpp.

488 {
489 return data().order_bytes();
490 }

## ◆ get_p()

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

Return the prime modulus of the field

Definition at line 492 of file ec_group.cpp.

493 {
494 return data().p();
495 }

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

## ◆ 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 472 of file ec_group.cpp.

473 {
474 return data().p_bits();
475 }

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().

## ◆ 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 477 of file ec_group.cpp.

478 {
479 return data().p_bytes();
480 }

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

## ◆ 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 552 of file ec_group.cpp.

553 {
554 return data().inverse_mod_order(x);
555 }

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

## ◆ 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 532 of file ec_group.cpp.

533 {
534 return data().mod_order(k);
535 }

## ◆ multiply_mod_order() [1/2]

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

Definition at line 542 of file ec_group.cpp.

543 {
544 return data().multiply_mod_order(x, y);
545 }

## ◆ 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 547 of file ec_group.cpp.

548 {
549 return data().multiply_mod_order(x, y, z);
550 }

## ◆ 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 688 of file ec_group.cpp.

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

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

## ◆ OS2ECP() [1/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.

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

References Botan::OS2ECP().

## ◆ OS2ECP() [2/2]

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

Definition at line 576 of file ec_group.cpp.

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

References Botan::OS2ECP().

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

## ◆ 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 682 of file ec_group.cpp.

683 {
684 const std::vector<uint8_t> der = DER_encode(EC_DOMPAR_ENC_EXPLICIT);
685 return PEM_Code::encode(der, "EC PARAMETERS");
686 }
Botan::EC_Group::DER_encode
std::vector< uint8_t > DER_encode(EC_Group_Encoding form) const
Definition: ec_group.cpp:631

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

Referenced by PEM_for_named_group().

## ◆ 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 419 of file ec_group.cpp.

420 {
421 try
422 {
423 EC_Group group(name);
424 return group.PEM_encode();
425 }
426 catch(...)
427 {
428 return "";
429 }
430 }
name
std::string name
Definition: commoncrypto_hash.cpp:24

References name, and PEM_encode().

## ◆ 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 581 of file ec_group.cpp.

582 {
583 // TODO: randomize the representation?
584 return PointGFp(data().curve(), x, y);
585 }

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

## ◆ 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 587 of file ec_group.cpp.

588 {
589 PointGFp_Multi_Point_Precompute xy_mul(get_base_point(), pt);
590 return xy_mul.multi_exp(x, y);
591 }

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

## ◆ point_size()

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

Definition at line 567 of file ec_group.cpp.

568 {
569 // Hybrid and standard format are (x,y), compressed is y, +1 format byte
570 if(format == PointGFp::COMPRESSED)
571 return (1 + get_p_bytes());
572 else
573 return (1 + 2*get_p_bytes());
574 }
Botan::PointGFp::COMPRESSED
@ COMPRESSED
Definition: point_gfp.h:52

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

## ◆ random_scalar()

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

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

Definition at line 611 of file ec_group.cpp.

612 {
613 return BigInt::random_integer(rng, 1, get_order());
614 }
Botan::BigInt::random_integer
static BigInt random_integer(RandomNumberGenerator &rng, const BigInt &min, const BigInt &max)
Definition: big_rand.cpp:45

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

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

## ◆ source()

EC_Group_Source Botan::EC_Group::source | ( |  | ) | const

Definition at line 562 of file ec_group.cpp.

563 {
564 return data().source();
565 }

Referenced by verify_group().

## ◆ square_mod_order()

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

Definition at line 537 of file ec_group.cpp.

538 {
539 return data().square_mod_order(x);
540 }

## ◆ 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 727 of file ec_group.cpp.

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

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().

## ◆ 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 704 of file ec_group.cpp.

705 {
706 //check that public point is not at infinity
707 if(point.is_zero())
708 return false;
709
710 //check that public point is on the curve
711 if(point.on_the_curve() == false)
712 return false;
713
714 //check that public point has order q
715 if((point * get_order()).is_zero() == false)
716 return false;
717
718 if(get_cofactor() > 1)
719 {
720 if((point * get_cofactor()).is_zero())
721 return false;
722 }
723
724 return true;
725 }
Botan::PointGFp::on_the_curve
bool on_the_curve() const
Definition: point_gfp.cpp:544
Botan::PointGFp::is_zero
bool is_zero() const
Definition: point_gfp.h:184

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

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

## ◆ zero_point()

PointGFp Botan::EC_Group::zero_point | ( |  | ) | const

Return the zero (or infinite) point on this curve

Definition at line 625 of file ec_group.cpp.

626 {
627 return PointGFp(data().curve());
628 }

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

- src/lib/pubkey/ec_group/ec_group.h
- src/lib/pubkey/ec_group/ec_group.cpp
- src/lib/pubkey/ec_group/ec_named.cpp