9#include <botan/assert.h>
10#include <botan/internal/ffi_rng.h>
11#include <botan/internal/ffi_util.h>
13#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
14 #include <botan/rng.h>
15 #include <botan/spake2p.h>
16 #include <botan/internal/ffi_ec.h>
19#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
26 const std::string_view name(ciphersuite);
28 if(name ==
"P256-SHA256") {
29 return SystemParameters::rfc9383_p256_sha256();
30 }
else if(name ==
"P256-SHA512") {
31 return SystemParameters::rfc9383_p256_sha512();
32 }
else if(name ==
"P384-SHA256") {
33 return SystemParameters::rfc9383_p384_sha256();
34 }
else if(name ==
"P384-SHA512") {
35 return SystemParameters::rfc9383_p384_sha512();
36 }
else if(name ==
"P521-SHA512") {
37 return SystemParameters::rfc9383_p521_sha512();
43std::span<const uint8_t> spake2p_opt_span(
const uint8_t* ptr,
size_t len) {
44 if(ptr ==
nullptr && len > 0) {
58#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
73#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
76 auto p = std::make_unique<Botan::SPAKE2p::SystemParameters>(spake2p_params_from_name(ciphersuite));
90#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
92 auto p = std::make_unique<Botan::SPAKE2p::SystemParameters>(
107#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
109 if(share_size ==
nullptr) {
112 *share_size = p.share_size();
126#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
128 *confirmation_size = p.confirmation_size();
138 const char* password,
139 const uint8_t prover_id[],
140 size_t prover_id_len,
141 const uint8_t verifier_id[],
142 size_t verifier_id_len,
143 const uint8_t salt[],
151#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
155 spake2p_opt_span(prover_id, prover_id_len),
156 spake2p_opt_span(verifier_id, verifier_id_len),
157 spake2p_opt_span(salt, salt_len));
161 BOTAN_UNUSED(params, password, prover_id, prover_id_len, verifier_id, verifier_id_len);
169 const uint8_t secret[],
173#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
183 BOTAN_UNUSED(params, rng, secret, secret_len, ctx, view);
190 const uint8_t secret[],
192 const uint8_t prover_id[],
193 size_t prover_id_len,
194 const uint8_t verifier_id[],
195 size_t verifier_id_len,
196 const uint8_t context[],
197 size_t context_len) {
198#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
207 auto ctx = std::make_unique<Botan::SPAKE2p::ProverContext>(p,
209 spake2p_opt_span(prover_id, prover_id_len),
210 spake2p_opt_span(verifier_id, verifier_id_len),
211 spake2p_opt_span(context, context_len));
215 BOTAN_UNUSED(prover, params, secret, secret_len, prover_id, prover_id_len);
216 BOTAN_UNUSED(verifier_id, verifier_id_len, context, context_len);
229#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
240 const uint8_t peer_message[],
241 size_t peer_message_len,
247#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
252 BOTAN_UNUSED(prover, rng, peer_message, peer_message_len, ctx, view);
258#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
268 const uint8_t record[],
270 const uint8_t prover_id[],
271 size_t prover_id_len,
272 const uint8_t verifier_id[],
273 size_t verifier_id_len,
274 const uint8_t context[],
275 size_t context_len) {
280#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
285 auto ctx = std::make_unique<Botan::SPAKE2p::VerifierContext>(p,
287 spake2p_opt_span(prover_id, prover_id_len),
288 spake2p_opt_span(verifier_id, verifier_id_len),
289 spake2p_opt_span(context, context_len));
293 BOTAN_UNUSED(verifier, params, record, record_len, prover_id, prover_id_len);
294 BOTAN_UNUSED(verifier_id, verifier_id_len, context, context_len);
305 const uint8_t peer_message[],
306 size_t peer_message_len,
313#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
318 BOTAN_UNUSED(verifier, rng, peer_message, peer_message_len, ctx, view);
324 const uint8_t confirmation[],
325 size_t confirmation_len) {
326 if(confirmation ==
nullptr) {
330#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
332 v.verify_confirmation({confirmation, confirmation_len});
342#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
344 v.skip_confirmation();
356#if defined(BOTAN_HAS_PAKE_SPAKE2PLUS)
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)
static RegistrationRecord deserialize(const SystemParameters ¶ms, std::span< const uint8_t > record)
static SystemParameters custom(const EC_Group &group, std::span< const uint8_t > seed, std::string_view hash_fn)
struct botan_spake2p_prover_struct * botan_spake2p_prover_t
struct botan_ec_group_struct * botan_ec_group_t
int(* botan_view_bin_fn)(botan_view_ctx view_ctx, const uint8_t *data, size_t len)
struct botan_rng_struct * botan_rng_t
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
@ BOTAN_FFI_ERROR_NULL_POINTER
struct botan_spake2p_verifier_struct * botan_spake2p_verifier_t
struct botan_spake2p_params_struct * botan_spake2p_params_t
int botan_spake2p_params_init(botan_spake2p_params_t *params, const char *ciphersuite)
int botan_spake2p_prover_init(botan_spake2p_prover_t *prover, botan_spake2p_params_t params, const uint8_t secret[], size_t secret_len, const uint8_t prover_id[], size_t prover_id_len, const uint8_t verifier_id[], size_t verifier_id_len, const uint8_t context[], size_t context_len)
int botan_spake2p_derive_secret(botan_spake2p_params_t params, const char *password, const uint8_t prover_id[], size_t prover_id_len, const uint8_t verifier_id[], size_t verifier_id_len, const uint8_t salt[], size_t salt_len, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_spake2p_verifier_verify_confirmation(botan_spake2p_verifier_t verifier, const uint8_t confirmation[], size_t confirmation_len)
int botan_spake2p_verifier_process_message(botan_spake2p_verifier_t verifier, botan_rng_t rng, const uint8_t peer_message[], size_t peer_message_len, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_spake2p_params_share_size(botan_spake2p_params_t params, size_t *share_size)
int botan_spake2p_prover_shared_secret(botan_spake2p_prover_t prover, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_spake2p_params_confirmation_size(botan_spake2p_params_t params, size_t *confirmation_size)
int botan_spake2p_verifier_destroy(botan_spake2p_verifier_t verifier)
int botan_spake2p_verifier_skip_confirmation(botan_spake2p_verifier_t verifier)
int botan_spake2p_prover_process_message(botan_spake2p_prover_t prover, botan_rng_t rng, const uint8_t peer_message[], size_t peer_message_len, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_spake2p_params_init_custom(botan_spake2p_params_t *params, botan_ec_group_t group, const uint8_t seed[], size_t seed_len, const char *hash_fn)
int botan_spake2p_verifier_init(botan_spake2p_verifier_t *verifier, botan_spake2p_params_t params, const uint8_t record[], size_t record_len, const uint8_t prover_id[], size_t prover_id_len, const uint8_t verifier_id[], size_t verifier_id_len, const uint8_t context[], size_t context_len)
int botan_spake2p_prover_destroy(botan_spake2p_prover_t prover)
int botan_spake2p_verifier_shared_secret(botan_spake2p_verifier_t verifier, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_spake2p_params_destroy(botan_spake2p_params_t params)
int botan_spake2p_prover_generate_message(botan_spake2p_prover_t prover, botan_rng_t rng, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_spake2p_registration_record(botan_spake2p_params_t params, botan_rng_t rng, const uint8_t secret[], size_t secret_len, botan_view_ctx ctx, botan_view_bin_fn view)
#define BOTAN_FFI_VISIT(obj, lambda)
#define BOTAN_FFI_CHECKED_DELETE(o)
#define BOTAN_FFI_DECLARE_DUMMY_STRUCT(NAME, MAGIC)
#define BOTAN_FFI_DECLARE_STRUCT(NAME, TYPE, MAGIC)
int invoke_view_callback(botan_view_bin_fn view, botan_view_ctx ctx, std::span< const uint8_t > buf)
T & safe_get(botan_struct< T, M > *p)
BOTAN_FFI_ERROR ffi_new_object(T *obj, Args &&... args)
int ffi_guard_thunk(const char *func_name, T thunk)
bool any_null_pointers(Ptrs... ptr)