Botan 2.19.1
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 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
 
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
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.

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

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
berthe bytes of the BER encoding
ber_lenthe length of ber

Definition at line 442 of file ec_group.cpp.

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

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
oidthe OID of the EC domain to create

Definition at line 372 of file ec_group.cpp.

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 }

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_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.

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 }
static OID from_string(const std::string &str)
Definition: asn1_oid.cpp:62
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 363 of file ec_group.cpp.

364 {
365 }

Referenced by EC_Group_from_PEM().

◆ ~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.

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

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

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 }

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
pointinput point
kthe scalar
rnga random number generator
wsa temp workspace
Returns
point*k

Definition at line 613 of file ec_group.cpp.

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

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
formof encoding to use
Returns
bytes encododed as DER

Definition at line 628 of file ec_group.cpp.

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),
650 .encode(BigInt::encode_1363(get_b(), p_bytes),
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 }
static secure_vector< uint8_t > encode_1363(const BigInt &n, size_t bytes)
Definition: big_code.cpp:111
const BigInt & get_b() const
Definition: ec_group.cpp:499
const BigInt & get_a() const
Definition: ec_group.cpp:494
const BigInt & get_cofactor() const
Definition: ec_group.cpp:524
const BigInt & get_p() const
Definition: ec_group.cpp:489
const OID & get_curve_oid() const
Definition: ec_group.cpp:554
const PointGFp & get_base_point() const
Definition: ec_group.cpp:504
size_t get_p_bytes() const
Definition: ec_group.cpp:474
std::string encode(const uint8_t der[], size_t length, const std::string &label, size_t width)
Definition: pem.cpp:43
@ SEQUENCE
Definition: asn1_obj.h:42
@ OCTET_STRING
Definition: asn1_obj.h:38
@ EC_DOMPAR_ENC_EXPLICIT
Definition: ec_group.h:24
@ EC_DOMPAR_ENC_OID
Definition: ec_group.h:26
@ 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 409 of file ec_group.cpp.

410 {
411 const auto ber = PEM_Code::decode_check_label(pem, "EC PARAMETERS");
412 return EC_Group(ber.data(), ber.size());
413 }

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 494 of file ec_group.cpp.

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

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 499 of file ec_group.cpp.

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

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 504 of file ec_group.cpp.

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

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 524 of file ec_group.cpp.

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

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 454 of file ec_group.cpp.

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.

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

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 514 of file ec_group.cpp.

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

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 519 of file ec_group.cpp.

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

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

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

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

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

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 469 of file ec_group.cpp.

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

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 474 of file ec_group.cpp.

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

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 549 of file ec_group.cpp.

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

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

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_g_y() const
Definition: ec_group.cpp:519
const BigInt & get_g_x() const
Definition: ec_group.cpp:514

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 }
PointGFp OS2ECP(const uint8_t bits[], size_t len) const
Definition: ec_group.cpp:573

References Botan::OS2ECP().

◆ OS2ECP() [2/2]

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

Definition at line 573 of file ec_group.cpp.

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

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 679 of file ec_group.cpp.

680 {
681 const std::vector<uint8_t> der = DER_encode(EC_DOMPAR_ENC_EXPLICIT);
682 return PEM_Code::encode(der, "EC PARAMETERS");
683 }
std::vector< uint8_t > DER_encode(EC_Group_Encoding form) const
Definition: ec_group.cpp:628

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 416 of file ec_group.cpp.

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

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 578 of file ec_group.cpp.

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

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 584 of file ec_group.cpp.

585 {
586 PointGFp_Multi_Point_Precompute xy_mul(get_base_point(), pt);
587 return xy_mul.multi_exp(x, y);
588 }

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 564 of file ec_group.cpp.

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 }

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 608 of file ec_group.cpp.

609 {
610 return BigInt::random_integer(rng, 1, get_order());
611 }
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 559 of file ec_group.cpp.

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

Referenced by verify_group().

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

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 }
EC_Group_Source source() const
Definition: ec_group.cpp:559
bool is_prime(const BigInt &n, RandomNumberGenerator &rng, size_t prob, bool is_random)
Definition: numthry.cpp:228

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 701 of file ec_group.cpp.

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 }
bool on_the_curve() const
Definition: point_gfp.cpp:544
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 622 of file ec_group.cpp.

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

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