7#ifndef BOTAN_PAKE_SPAKE2PLUS_H_
8#define BOTAN_PAKE_SPAKE2PLUS_H_
10#include <botan/ec_apoint.h>
11#include <botan/ec_group.h>
12#include <botan/ec_scalar.h>
13#include <botan/secmem.h>
14#include <botan/types.h>
110 static SystemParameters
custom(
const EC_Group&
group, std::span<const uint8_t> seed, std::string_view hash_fn);
135 size_t share_size()
const;
140 size_t confirmation_size()
const;
148 std::string m_hash_fn;
171 std::string_view password,
172 std::span<const uint8_t> prover_id,
173 std::span<const uint8_t> verifier_id,
174 std::span<const uint8_t> salt,
226 std::string_view password,
227 std::span<const uint8_t> prover_id,
228 std::span<const uint8_t> verifier_id,
229 std::span<const uint8_t> salt);
267 ProverSecret(
EC_Scalar w0,
EC_Scalar w1) : m_w0(std::move(w0)), m_w1(std::move(w1)) {}
290 std::span<const uint8_t> prover_id,
291 std::span<const uint8_t> verifier_id,
292 std::span<const uint8_t> context = {});
325 enum class State : uint8_t { Initial, ShareGenerated, Complete, Failed };
327 SystemParameters m_params;
328 ProverSecret m_secret;
329 std::vector<uint8_t> m_prover_id;
330 std::vector<uint8_t> m_verifier_id;
331 std::vector<uint8_t> m_context;
332 std::optional<std::pair<std::vector<uint8_t>,
EC_Scalar>> m_our_message;
334 State m_state = State::Initial;
354 std::span<const uint8_t> prover_id,
355 std::span<const uint8_t> verifier_id,
356 std::span<const uint8_t> context = {});
410 enum class State : uint8_t { Initial, Responded, Complete, Failed };
412 SystemParameters m_params;
413 RegistrationRecord m_record;
414 std::vector<uint8_t> m_prover_id;
415 std::vector<uint8_t> m_verifier_id;
416 std::vector<uint8_t> m_context;
417 std::vector<uint8_t> m_expected_confirmation;
419 State m_state = State::Initial;
#define BOTAN_PUBLIC_API(maj, min)
std::vector< uint8_t > process_message(std::span< const uint8_t > peer_message, RandomNumberGenerator &rng)
std::vector< uint8_t > generate_message(RandomNumberGenerator &rng)
const SystemParameters & parameters() const
secure_vector< uint8_t > shared_secret() const
ProverContext(const SystemParameters ¶ms, const ProverSecret &secret, std::span< const uint8_t > prover_id, std::span< const uint8_t > verifier_id, std::span< const uint8_t > context={})
static ProverSecret from_prehashed(EC_Scalar w0, EC_Scalar w1)
static ProverSecret from_password(const SystemParameters ¶ms, std::string_view password, std::span< const uint8_t > prover_id, std::span< const uint8_t > verifier_id, std::span< const uint8_t > salt)
static ProverSecret deserialize(const SystemParameters ¶ms, std::span< const uint8_t > secret)
RegistrationRecord registration_record(RandomNumberGenerator &rng) const
friend class ProverContext
secure_vector< uint8_t > serialize() const
secure_vector< uint8_t > serialize() const
friend class VerifierContext
friend class ProverSecret
static RegistrationRecord deserialize(const SystemParameters ¶ms, std::span< const uint8_t > record)
static RegistrationRecord from_password(const SystemParameters ¶ms, std::string_view password, std::span< const uint8_t > prover_id, std::span< const uint8_t > verifier_id, std::span< const uint8_t > salt, RandomNumberGenerator &rng)
const EC_Group & group() const
const EC_AffinePoint & spake2p_n() const
static SystemParameters rfc9383_p256_sha512()
static SystemParameters rfc9383_p521_sha512()
static SystemParameters rfc9383_p384_sha256()
const std::string & hash_function() const
static SystemParameters rfc9383_p256_sha256()
static SystemParameters rfc9383_p384_sha512()
const EC_AffinePoint & spake2p_m() const
static SystemParameters custom(const EC_Group &group, std::span< const uint8_t > seed, std::string_view hash_fn)
std::vector< uint8_t > process_message(std::span< const uint8_t > peer_message, RandomNumberGenerator &rng)
VerifierContext(const SystemParameters ¶ms, const RegistrationRecord &record, std::span< const uint8_t > prover_id, std::span< const uint8_t > verifier_id, std::span< const uint8_t > context={})
const SystemParameters & parameters() const
secure_vector< uint8_t > shared_secret() const
void verify_confirmation(std::span< const uint8_t > confirmation)
std::vector< T, secure_allocator< T > > secure_vector