Botan 3.5.0
Crypto and TLS for C&
ecc_key.cpp
Go to the documentation of this file.
1/*
2* ECC Key implemenation
3* (C) 2007 Manuel Hartl, FlexSecure GmbH
4* Falko Strenzke, FlexSecure GmbH
5* 2008-2010 Jack Lloyd
6*
7* Botan is released under the Simplified BSD License (see license.txt)
8*/
9
10#include <botan/ecc_key.h>
11
12#include <botan/ber_dec.h>
13#include <botan/der_enc.h>
14#include <botan/ec_point.h>
15#include <botan/numthry.h>
16#include <botan/secmem.h>
17#include <botan/internal/fmt.h>
18#include <botan/internal/workfactor.h>
19
20namespace Botan {
21
23 return domain().get_p_bits();
24}
25
29
30namespace {
31
32EC_Group_Encoding default_encoding_for(EC_Group& group) {
33 if(group.get_curve_oid().empty()) {
35 } else {
37 }
38}
39
40} // namespace
41
42EC_PublicKey::EC_PublicKey(const EC_Group& dom_par, const EC_Point& pub_point) :
43 m_domain_params(dom_par), m_public_key(pub_point), m_domain_encoding(default_encoding_for(m_domain_params)) {}
44
45EC_PublicKey::EC_PublicKey(const AlgorithmIdentifier& alg_id, std::span<const uint8_t> key_bits) :
46 m_domain_params{EC_Group(alg_id.parameters())},
47 m_public_key{domain().OS2ECP(key_bits)},
48 m_domain_encoding(default_encoding_for(m_domain_params)) {}
49
53
57
58std::vector<uint8_t> EC_PublicKey::raw_public_key_bits() const {
60}
61
62std::vector<uint8_t> EC_PublicKey::public_key_bits() const {
63 return raw_public_key_bits();
64}
65
68 throw Invalid_Argument("Invalid point encoding for EC_PublicKey");
69 }
70
71 m_point_encoding = enc;
72}
73
76 throw Invalid_Argument("Cannot used NamedCurve encoding for a curve without an OID");
77 }
78
79 m_domain_encoding = form;
80}
81
83 if(m_private_key == 0) {
84 throw Invalid_State("EC_PrivateKey::private_value - uninitialized");
85 }
86
87 return m_private_key;
88}
89
90/**
91* EC_PrivateKey constructor
92*/
94 const EC_Group& ec_group,
95 const BigInt& x,
96 bool with_modular_inverse) {
97 m_domain_params = ec_group;
98 m_domain_encoding = default_encoding_for(m_domain_params);
99
100 if(x == 0) {
101 m_private_key = ec_group.random_scalar(rng);
102 } else {
103 BOTAN_ARG_CHECK(x > 0 && x < ec_group.get_order(), "ECC private key out of range");
104 m_private_key = x;
105 }
106
107 std::vector<BigInt> ws;
108
109 if(with_modular_inverse) {
110 // ECKCDSA
112 } else {
114 }
115
116 BOTAN_ASSERT(m_public_key.on_the_curve(), "Generated public key point was on the curve");
117}
118
122
134
136 std::span<const uint8_t> key_bits,
137 bool with_modular_inverse) {
139 m_domain_encoding = default_encoding_for(m_domain_params);
140
141 OID key_parameters;
143
144 BER_Decoder(key_bits)
146 .decode_and_check<size_t>(1, "Unknown version code for ECC key")
147 .decode_octet_string_bigint(m_private_key)
150 .end_cons();
151
153 throw Decoding_Error("Invalid EC private key");
154 }
155
156 if(public_key_bits.empty()) {
157 if(with_modular_inverse) {
158 // ECKCDSA
160 } else {
162 }
163
164 BOTAN_ASSERT(m_public_key.on_the_curve(), "Public point derived from loaded key was on the curve");
165 } else {
167 // OS2ECP verifies that the point is on the curve
168 }
169}
170
171bool EC_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const {
173 return false;
174 }
175
176 return EC_PublicKey::check_key(rng, strong);
177}
178
179const BigInt& EC_PublicKey::get_int_field(std::string_view field) const {
180 if(field == "public_x" || field == "public_y") {
181 throw Not_Implemented(fmt("EC_PublicKey::get_int_field no longer implements getter for {}", field));
182 } else if(field == "base_x") {
183 return this->domain().get_g_x();
184 } else if(field == "base_y") {
185 return this->domain().get_g_y();
186 } else if(field == "p") {
187 return this->domain().get_p();
188 } else if(field == "a") {
189 return this->domain().get_a();
190 } else if(field == "b") {
191 return this->domain().get_b();
192 } else if(field == "cofactor") {
193 return this->domain().get_cofactor();
194 } else if(field == "order") {
195 return this->domain().get_order();
196 } else {
197 return Public_Key::get_int_field(field);
198 }
199}
200
201const BigInt& EC_PrivateKey::get_int_field(std::string_view field) const {
202 if(field == "x") {
203 return this->private_value();
204 } else {
205 return EC_PublicKey::get_int_field(field);
206 }
207}
208
209} // namespace Botan
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:29
#define BOTAN_ASSERT(expr, assertion_made)
Definition assert.h:50
const std::vector< uint8_t > & parameters() const
Definition asn1_obj.h:466
virtual const BigInt & get_int_field(std::string_view field) const
Definition pk_keys.cpp:18
virtual OID object_identifier() const
Definition pk_keys.cpp:22
BER_Decoder & end_cons()
Definition ber_dec.cpp:309
BER_Decoder start_sequence()
Definition ber_dec.h:123
BER_Decoder & decode_optional(T &out, ASN1_Type type_tag, ASN1_Class class_tag, const T &default_value=T())
Definition ber_dec.h:332
BER_Decoder & decode_and_check(const T &expected, std::string_view error_msg)
Definition ber_dec.h:272
T serialize(size_t len) const
Definition bigint.h:711
secure_vector< uint8_t > get_contents()
Definition der_enc.cpp:132
DER_Encoder & start_explicit_context_specific(uint32_t tag)
Definition der_enc.h:72
DER_Encoder & start_sequence()
Definition der_enc.h:64
DER_Encoder & end_cons()
Definition der_enc.cpp:171
DER_Encoder & encode(bool b)
Definition der_enc.cpp:250
const BigInt & get_b() const
Definition ec_group.cpp:563
const BigInt & get_a() const
Definition ec_group.cpp:559
const BigInt & get_g_y() const
Definition ec_group.cpp:579
const BigInt & get_cofactor() const
Definition ec_group.cpp:583
bool verify_public_element(const EC_Point &y) const
Definition ec_group.cpp:764
const BigInt & get_p() const
Definition ec_group.cpp:555
bool verify_group(RandomNumberGenerator &rng, bool strong=false) const
Definition ec_group.cpp:789
const BigInt & get_order() const
Definition ec_group.cpp:571
size_t get_p_bits() const
Definition ec_group.cpp:539
const EC_Point & get_base_point() const
Definition ec_group.cpp:567
EC_Point blinded_base_point_multiply(const BigInt &k, RandomNumberGenerator &rng, std::vector< BigInt > &ws) const
Definition ec_group.cpp:642
const BigInt & get_g_x() const
Definition ec_group.cpp:575
const OID & get_curve_oid() const
Definition ec_group.cpp:611
BigInt inverse_mod_order(const BigInt &x) const
Definition ec_group.cpp:607
EC_Point OS2ECP(const uint8_t bits[], size_t len) const
Definition ec_group.cpp:628
BigInt random_scalar(RandomNumberGenerator &rng) const
Definition ec_group.cpp:659
size_t get_order_bytes() const
Definition ec_group.cpp:551
bool on_the_curve() const
Definition ec_point.cpp:531
std::vector< uint8_t > encode(EC_Point_Format format) const
Definition ec_point.cpp:589
const BigInt & private_value() const
Definition ecc_key.cpp:82
secure_vector< uint8_t > raw_private_key_bits() const final
Definition ecc_key.cpp:119
bool check_key(RandomNumberGenerator &rng, bool strong) const override
Definition ecc_key.cpp:171
const BigInt & get_int_field(std::string_view field) const final
Definition ecc_key.cpp:201
secure_vector< uint8_t > private_key_bits() const final
Definition ecc_key.cpp:123
const EC_Group & domain() const
Definition ecc_key.h:56
std::vector< uint8_t > DER_domain() const
Definition ecc_key.h:74
void set_parameter_encoding(EC_Group_Encoding enc)
Definition ecc_key.cpp:74
EC_Point_Format m_point_encoding
Definition ecc_key.h:113
EC_Group_Encoding m_domain_encoding
Definition ecc_key.h:112
size_t estimated_strength() const override
Definition ecc_key.cpp:26
AlgorithmIdentifier algorithm_identifier() const override
Definition ecc_key.cpp:54
size_t key_length() const override
Definition ecc_key.cpp:22
EC_Group m_domain_params
Definition ecc_key.h:110
std::vector< uint8_t > raw_public_key_bits() const override
Definition ecc_key.cpp:58
void set_point_encoding(EC_Point_Format enc)
Definition ecc_key.cpp:66
const BigInt & get_int_field(std::string_view field) const override
Definition ecc_key.cpp:179
EC_Point_Format point_encoding() const
Definition ecc_key.h:86
EC_Point m_public_key
Definition ecc_key.h:111
bool check_key(RandomNumberGenerator &rng, bool strong) const override
Definition ecc_key.cpp:50
const EC_Point & public_point() const
Definition ecc_key.h:40
std::vector< uint8_t > public_key_bits() const override
Definition ecc_key.cpp:62
bool empty() const
Definition asn1_obj.h:266
size_t ecp_work_factor(size_t bits)
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53
ASN1_Type
Definition asn1_obj.h:44
EC_Point_Format
Definition ec_point.h:19
EC_Point OS2ECP(const uint8_t data[], size_t data_len, const CurveGFp &curve)
Definition ec_point.cpp:648
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:61
EC_Group_Encoding
Definition ec_group.h:24