Botan 3.4.0
Crypto and TLS for C&
dl_scheme.cpp
Go to the documentation of this file.
1/*
2* (C) 2023 Jack Lloyd
3*
4* Botan is released under the Simplified BSD License (see license.txt)
5*/
6
7#include <botan/internal/dl_scheme.h>
8
9#include <botan/assert.h>
10#include <botan/ber_dec.h>
11#include <botan/der_enc.h>
12
13namespace Botan {
14
15namespace {
16
17BigInt decode_single_bigint(std::span<const uint8_t> key_bits) {
18 BigInt x;
19 BER_Decoder(key_bits).decode(x);
20 return x;
21}
22
23BigInt generate_private_dl_key(const DL_Group& group, RandomNumberGenerator& rng) {
24 if(group.has_q() && group.q_bits() >= 160 && group.q_bits() <= 384) {
25 return BigInt::random_integer(rng, 2, group.get_q());
26 } else {
27 return BigInt(rng, group.exponent_bits());
28 }
29}
30
31BigInt check_dl_private_key_input(const BigInt& x, const DL_Group& group) {
32 BOTAN_ARG_CHECK(group.verify_private_element(x), "Invalid discrete logarithm private key value");
33 return x;
34}
35
36} // namespace
37
38DL_PublicKey::DL_PublicKey(const DL_Group& group, const BigInt& public_key) :
39 m_group(group), m_public_key(public_key) {}
40
42 std::span<const uint8_t> key_bits,
43 DL_Group_Format format) :
44 m_group(alg_id.parameters(), format), m_public_key(decode_single_bigint(key_bits)) {}
45
46std::vector<uint8_t> DL_PublicKey::public_key_as_bytes() const {
47 std::vector<uint8_t> bits(m_group.p_bytes());
48 BigInt::encode_1363(bits.data(), bits.size(), m_public_key);
49 return bits;
50}
51
52std::vector<uint8_t> DL_PublicKey::DER_encode() const {
53 std::vector<uint8_t> output;
54 DER_Encoder(output).encode(m_public_key);
55 return output;
56}
57
58bool DL_PublicKey::check_key(RandomNumberGenerator& rng, bool strong) const {
59 return m_group.verify_group(rng, strong) && m_group.verify_public_element(m_public_key);
60}
61
63 return m_group.estimated_strength();
64}
65
66size_t DL_PublicKey::p_bits() const {
67 return m_group.p_bits();
68}
69
70DL_PrivateKey::DL_PrivateKey(const DL_Group& group, const BigInt& private_key) :
71 m_group(group),
72 m_private_key(check_dl_private_key_input(private_key, m_group)),
73 m_public_key(m_group.power_g_p(m_private_key, m_private_key.bits())) {}
74
76 m_group(group),
77 m_private_key(generate_private_dl_key(group, rng)),
78 m_public_key(m_group.power_g_p(m_private_key, m_private_key.bits())) {}
79
81 std::span<const uint8_t> key_bits,
82 DL_Group_Format format) :
83 m_group(alg_id.parameters(), format),
84 m_private_key(check_dl_private_key_input(decode_single_bigint(key_bits), m_group)),
85 m_public_key(m_group.power_g_p(m_private_key, m_group.p_bits())) {}
86
90
94
95bool DL_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const {
96 return m_group.verify_group(rng, strong) && m_group.verify_private_element(m_private_key);
97}
98
99std::shared_ptr<DL_PublicKey> DL_PrivateKey::public_key() const {
100 return std::make_shared<DL_PublicKey>(m_group, m_public_key);
101}
102
103const BigInt& DL_PublicKey::get_int_field(std::string_view algo, std::string_view field) const {
104 if(field == "p") {
105 return m_group.get_p();
106 } else if(field == "q") {
107 return m_group.get_q();
108 } else if(field == "g") {
109 return m_group.get_g();
110 } else if(field == "y") {
111 return m_public_key;
112 } else {
113 throw Unknown_PK_Field_Name(algo, field);
114 }
115}
116
117const BigInt& DL_PrivateKey::get_int_field(std::string_view algo, std::string_view field) const {
118 if(field == "p") {
119 return m_group.get_p();
120 } else if(field == "q") {
121 return m_group.get_q();
122 } else if(field == "g") {
123 return m_group.get_g();
124 } else if(field == "x") {
125 return m_private_key;
126 } else if(field == "y") {
127 return m_public_key;
128 } else {
129 throw Unknown_PK_Field_Name(algo, field);
130 }
131}
132
133} // namespace Botan
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:29
static BigInt random_integer(RandomNumberGenerator &rng, const BigInt &min, const BigInt &max)
Definition big_rand.cpp:43
static secure_vector< uint8_t > encode_locked(const BigInt &n)
Definition bigint.h:761
static secure_vector< uint8_t > encode_1363(const BigInt &n, size_t bytes)
Definition big_code.cpp:105
secure_vector< uint8_t > get_contents()
Definition der_enc.cpp:132
DER_Encoder & encode(bool b)
Definition der_enc.cpp:250
bool verify_private_element(const BigInt &x) const
Definition dl_group.cpp:341
size_t p_bits() const
Definition dl_group.cpp:452
const BigInt & get_p() const
Definition dl_group.cpp:426
bool verify_public_element(const BigInt &y) const
Definition dl_group.cpp:324
size_t p_bytes() const
Definition dl_group.cpp:456
size_t estimated_strength() const
Definition dl_group.cpp:470
bool verify_group(RandomNumberGenerator &rng, bool strong=true) const
Definition dl_group.cpp:373
const BigInt & get_g() const
Definition dl_group.cpp:433
const BigInt & get_q() const
Definition dl_group.cpp:440
DL_PrivateKey(const DL_Group &group, const BigInt &private_key)
Definition dl_scheme.cpp:70
secure_vector< uint8_t > DER_encode() const
Definition dl_scheme.cpp:87
const BigInt & get_int_field(std::string_view algo_name, std::string_view field) const
secure_vector< uint8_t > raw_private_key_bits() const
Definition dl_scheme.cpp:91
std::shared_ptr< DL_PublicKey > public_key() const
Definition dl_scheme.cpp:99
bool check_key(RandomNumberGenerator &rng, bool strong) const
Definition dl_scheme.cpp:95
std::vector< uint8_t > public_key_as_bytes() const
Definition dl_scheme.cpp:46
const BigInt & get_int_field(std::string_view algo_name, std::string_view field) const
size_t p_bits() const
Definition dl_scheme.cpp:66
size_t estimated_strength() const
Definition dl_scheme.cpp:62
std::vector< uint8_t > DER_encode() const
Definition dl_scheme.cpp:52
bool check_key(RandomNumberGenerator &rng, bool strong) const
Definition dl_scheme.cpp:58
DL_PublicKey(const DL_Group &group, const BigInt &public_key)
Definition dl_scheme.cpp:38
DL_Group_Format
Definition dl_group.h:28
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:61