Botan 3.13.0
Crypto and TLS for C&
Botan::SRP6_Server_Session Class Referencefinal

#include <srp6.h>

Public Member Functions

BigInt step1 (const BigInt &v, const DL_Group &group, std::string_view hash_id, size_t b_bits, RandomNumberGenerator &rng)
BigInt step1 (const BigInt &v, std::string_view group_id, std::string_view hash_id, RandomNumberGenerator &rng)
SymmetricKey step2 (const BigInt &A)

Detailed Description

Represents a SRP-6a server session

Definition at line 102 of file srp6.h.

Member Function Documentation

◆ step1() [1/2]

BigInt Botan::SRP6_Server_Session::step1 ( const BigInt & v,
const DL_Group & group,
std::string_view hash_id,
size_t b_bits,
RandomNumberGenerator & rng )

Server side step 1 This version of step1 added in 2.11

Parameters
vthe verification value saved from client registration
groupthe SRP group
Hash Function Identificationthe SRP hash in use
Random Number Generatorsa random number generator
b_bitssize of secret exponent in bits
Returns
SRP-6 B value

Definition at line 164 of file srp6.cpp.

165 {
166 if(v.signum() <= 0 || v >= group.get_p()) {
167 throw Invalid_Argument("SRP6_Server_Session: invalid verifier");
168 }
169
170 BOTAN_ARG_CHECK(b_bits >= 160 && b_bits <= group.p_bits(), "Invalid b_bits");
171
172 BOTAN_STATE_CHECK(!m_group);
173 m_group = std::make_unique<DL_Group>(group);
174 m_b_bits = b_bits;
175
176 const BigInt& g = m_group->get_g();
177 const BigInt& p = m_group->get_p();
178
179 m_v = v;
180 m_b = BigInt(rng, m_b_bits);
181 m_hash_id = hash_id;
182
183 auto hash_fn = HashFunction::create_or_throw(hash_id);
184 if(8 * hash_fn->output_length() >= m_group->p_bits()) {
185 throw Invalid_Argument(fmt("Hash function {} too large for SRP6 with this group", hash_fn->name()));
186 }
187
188 const BigInt k = hash_seq(*hash_fn, m_group->p_bytes(), p, g);
189 m_B = m_group->mod_p(v * k + m_group->power_g_p(m_b, b_bits));
190
191 return m_B;
192}
#define BOTAN_STATE_CHECK(expr)
Definition assert.h:49
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:33
static std::unique_ptr< HashFunction > create_or_throw(std::string_view algo_spec, std::string_view provider="")
Definition hash.cpp:308
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53

References BOTAN_ARG_CHECK, BOTAN_STATE_CHECK, Botan::HashFunction::create_or_throw(), Botan::fmt(), Botan::DL_Group::get_p(), Botan::DL_Group::p_bits(), and Botan::BigInt::signum().

◆ step1() [2/2]

BigInt Botan::SRP6_Server_Session::step1 ( const BigInt & v,
std::string_view group_id,
std::string_view hash_id,
RandomNumberGenerator & rng )

Server side step 1

Parameters
vthe verification value saved from client registration
group_idthe SRP group id
Hash Function Identificationthe SRP hash in use
Random Number Generatorsa random number generator
Returns
SRP-6 B value

Definition at line 155 of file srp6.cpp.

158 {
159 auto group = DL_Group::from_name(group_id);
160 const size_t b_bits = group.exponent_bits();
161 return this->step1(v, group, hash_id, b_bits, rng);
162}
static DL_Group from_name(std::string_view name)
Definition dl_group.cpp:266
BigInt step1(const BigInt &v, std::string_view group_id, std::string_view hash_id, RandomNumberGenerator &rng)
Definition srp6.cpp:155

References Botan::DL_Group::from_name(), and step1().

Referenced by step1().

◆ step2()

SymmetricKey Botan::SRP6_Server_Session::step2 ( const BigInt & A)

Server side step 2

Parameters
Athe client's value
Returns
shared symmetric key

Definition at line 194 of file srp6.cpp.

194 {
195 BOTAN_STATE_CHECK(m_group);
196
197 if(A <= 0 || A >= m_group->get_p()) {
198 throw Decoding_Error("Invalid SRP parameter from client");
199 }
200
201 auto hash_fn = HashFunction::create_or_throw(m_hash_id);
202 if(8 * hash_fn->output_length() >= m_group->p_bits()) {
203 throw Invalid_Argument(fmt("Hash function {} too large for SRP6 with this group", hash_fn->name()));
204 }
205
206 const BigInt u = hash_seq(*hash_fn, m_group->p_bytes(), A, m_B);
207 BOTAN_ASSERT_NOMSG(!u.is_zero());
208
209 // The maximum length of u is fixed based on the chosen hash function
210 const size_t u_bits = hash_fn->output_length() * 8;
211 const BigInt vup = m_group->power_b_p(m_v, u, u_bits);
212
213 // The size of b is chosen by either a formula or the application; either way it is public
214 const BigInt S = m_group->power_b_p(m_group->multiply_mod_p(A, vup), m_b, m_b_bits);
215
216 return SymmetricKey(S.serialize<secure_vector<uint8_t>>(m_group->p_bytes()));
217}
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75
OctetString SymmetricKey
Definition symkey.h:153
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:128

References BOTAN_ASSERT_NOMSG, BOTAN_STATE_CHECK, Botan::HashFunction::create_or_throw(), Botan::fmt(), Botan::BigInt::is_zero(), and Botan::BigInt::serialize().


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