Botan 3.0.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#include <botan/der_enc.h>
9#include <botan/ber_dec.h>
10#include <botan/assert.h>
11
12namespace Botan {
13
14namespace {
15
16BigInt decode_single_bigint(std::span<const uint8_t> key_bits)
17 {
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 {
25 if(group.has_q() && group.q_bits() >= 160 && group.q_bits() <= 384)
26 {
27 return BigInt::random_integer(rng, 2, group.get_q());
28 }
29 else
30 {
31 return BigInt(rng, group.exponent_bits());
32 }
33 }
34
35BigInt check_dl_private_key_input(const BigInt& x, const DL_Group& group)
36 {
37 BOTAN_ARG_CHECK(group.verify_private_element(x),
38 "Invalid discrete logarithm private key value");
39 return x;
40 }
41
42}
43
45 const BigInt& public_key) :
46 m_group(group),
47 m_public_key(public_key)
48 {
49 }
50
52 std::span<const uint8_t> key_bits,
53 DL_Group_Format format) :
54 m_group(alg_id.parameters(), format),
55 m_public_key(decode_single_bigint(key_bits))
56 {
57 }
58
59std::vector<uint8_t> DL_PublicKey::public_key_as_bytes() const
60 {
61 std::vector<uint8_t> bits(m_group.p_bytes());
62 BigInt::encode_1363(bits.data(), bits.size(), m_public_key);
63 return bits;
64 }
65
66std::vector<uint8_t> DL_PublicKey::DER_encode() const
67 {
68 std::vector<uint8_t> output;
69 DER_Encoder(output).encode(m_public_key);
70 return output;
71 }
72
74 {
75 return m_group.verify_group(rng, strong) &&
76 m_group.verify_public_element(m_public_key);
77 }
78
80 {
81 return m_group.estimated_strength();
82 }
83
85 {
86 return m_group.p_bits();
87 }
88
90 const BigInt& private_key) :
91 m_group(group),
92 m_private_key(check_dl_private_key_input(private_key, m_group)),
93 m_public_key(m_group.power_g_p(m_private_key, m_private_key.bits()))
94 {
95 }
96
99 m_group(group),
100 m_private_key(generate_private_dl_key(group, rng)),
101 m_public_key(m_group.power_g_p(m_private_key, m_private_key.bits()))
102 {
103 }
104
106 std::span<const uint8_t> key_bits,
107 DL_Group_Format format) :
108 m_group(alg_id.parameters(), format),
109 m_private_key(check_dl_private_key_input(decode_single_bigint(key_bits), m_group)),
110 m_public_key(m_group.power_g_p(m_private_key, m_group.p_bits()))
111 {
112 }
113
115 {
116 return DER_Encoder().encode(m_private_key).get_contents();
117 }
118
120 {
121 return BigInt::encode_locked(m_private_key);
122 }
123
125 {
126 return m_group.verify_group(rng, strong) &&
127 m_group.verify_private_element(m_private_key);
128 }
129
130std::shared_ptr<DL_PublicKey> DL_PrivateKey::public_key() const
131 {
132 return std::make_shared<DL_PublicKey>(m_group, m_public_key);
133 }
134
135const BigInt& DL_PublicKey::get_int_field(std::string_view algo,
136 std::string_view field) const
137 {
138 if(field == "p")
139 return m_group.get_p();
140 else if(field == "q")
141 return m_group.get_q();
142 else if(field == "g")
143 return m_group.get_g();
144 else if(field == "y")
145 return m_public_key;
146 else
147 throw Unknown_PK_Field_Name(algo, field);
148 }
149
150const BigInt& DL_PrivateKey::get_int_field(std::string_view algo,
151 std::string_view field) const
152 {
153 if(field == "p")
154 return m_group.get_p();
155 else if(field == "q")
156 return m_group.get_q();
157 else if(field == "g")
158 return m_group.get_g();
159 else if(field == "x")
160 return m_private_key;
161 else if(field == "y")
162 return m_public_key;
163 else
164 throw Unknown_PK_Field_Name(algo, field);
165 }
166
167}
#define BOTAN_ARG_CHECK(expr, msg)
Definition: assert.h:36
static BigInt random_integer(RandomNumberGenerator &rng, const BigInt &min, const BigInt &max)
Definition: big_rand.cpp:45
static secure_vector< uint8_t > encode_locked(const BigInt &n)
Definition: bigint.h:792
static secure_vector< uint8_t > encode_1363(const BigInt &n, size_t bytes)
Definition: big_code.cpp:107
secure_vector< uint8_t > get_contents()
Definition: der_enc.cpp:157
DER_Encoder & encode(bool b)
Definition: der_enc.cpp:290
bool verify_private_element(const BigInt &x) const
Definition: dl_group.cpp:387
size_t p_bits() const
Definition: dl_group.cpp:511
const BigInt & get_p() const
Definition: dl_group.cpp:480
bool verify_public_element(const BigInt &y) const
Definition: dl_group.cpp:370
size_t p_bytes() const
Definition: dl_group.cpp:516
size_t estimated_strength() const
Definition: dl_group.cpp:533
bool verify_group(RandomNumberGenerator &rng, bool strong=true) const
Definition: dl_group.cpp:417
const BigInt & get_g() const
Definition: dl_group.cpp:488
const BigInt & get_q() const
Definition: dl_group.cpp:496
DL_PrivateKey(const DL_Group &group, const BigInt &private_key)
Definition: dl_scheme.cpp:89
secure_vector< uint8_t > DER_encode() const
Definition: dl_scheme.cpp:114
const BigInt & get_int_field(std::string_view algo_name, std::string_view field) const
Definition: dl_scheme.cpp:150
secure_vector< uint8_t > raw_private_key_bits() const
Definition: dl_scheme.cpp:119
std::shared_ptr< DL_PublicKey > public_key() const
Definition: dl_scheme.cpp:130
bool check_key(RandomNumberGenerator &rng, bool strong) const
Definition: dl_scheme.cpp:124
std::vector< uint8_t > public_key_as_bytes() const
Definition: dl_scheme.cpp:59
const BigInt & get_int_field(std::string_view algo_name, std::string_view field) const
Definition: dl_scheme.cpp:135
size_t p_bits() const
Definition: dl_scheme.cpp:84
size_t estimated_strength() const
Definition: dl_scheme.cpp:79
std::vector< uint8_t > DER_encode() const
Definition: dl_scheme.cpp:66
bool check_key(RandomNumberGenerator &rng, bool strong) const
Definition: dl_scheme.cpp:73
DL_PublicKey(const DL_Group &group, const BigInt &public_key)
Definition: dl_scheme.cpp:44
Definition: alg_id.cpp:12
DL_Group_Format
Definition: dl_group.h:28
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:64