Botan 3.0.0
Crypto and TLS for C&
Functions
ffi_srp6.cpp File Reference
#include <botan/ffi.h>
#include <botan/internal/ffi_rng.h>
#include <botan/internal/ffi_util.h>

Go to the source code of this file.

Functions

 BOTAN_FFI_DECLARE_DUMMY_STRUCT (botan_srp6_server_session_struct, 0x44F7425F)
 
int botan_srp6_client_agree (const char *identity, const char *password, const char *group_id, const char *hash_id, const uint8_t salt[], size_t salt_len, const uint8_t b[], size_t b_len, botan_rng_t rng_obj, uint8_t A[], size_t *A_len, uint8_t K[], size_t *K_len)
 
int botan_srp6_generate_verifier (const char *username, const char *password, const uint8_t salt[], size_t salt_len, const char *group_id, const char *hash_id, uint8_t verifier[], size_t *verifier_len)
 
int botan_srp6_group_size (const char *group_id, size_t *group_p_bytes)
 
int botan_srp6_server_session_destroy (botan_srp6_server_session_t srp6)
 
int botan_srp6_server_session_init (botan_srp6_server_session_t *srp6)
 
int botan_srp6_server_session_step1 (botan_srp6_server_session_t srp6, const uint8_t *verifier, size_t verifier_len, const char *group_id, const char *hash_id, botan_rng_t rng_obj, uint8_t b_pub[], size_t *b_pub_len)
 
int botan_srp6_server_session_step2 (botan_srp6_server_session_t srp6, const uint8_t a[], size_t a_len, uint8_t key[], size_t *key_len)
 

Function Documentation

◆ BOTAN_FFI_DECLARE_DUMMY_STRUCT()

BOTAN_FFI_DECLARE_DUMMY_STRUCT ( botan_srp6_server_session_struct  ,
0x44F7425F   
)

◆ botan_srp6_client_agree()

int botan_srp6_client_agree ( const char *  username,
const char *  password,
const char *  group_id,
const char *  hash_id,
const uint8_t  salt[],
size_t  salt_len,
const uint8_t  B[],
size_t  B_len,
botan_rng_t  rng_obj,
uint8_t  A[],
size_t *  A_len,
uint8_t  K[],
size_t *  K_len 
)

SRP6a Client side

Parameters
usernamethe username we are attempting login for
passwordthe password we are attempting to use
group_idspecifies the shared SRP group
hash_idspecifies a secure hash function
saltis the salt value sent by the server
salt_lenthe length of salt
Bis the server's public value
B_lenis the server's public value length
rng_objis a random number generator object
Aout buffer to store the SRP-6 A value
A_lenSRP-6 A verifier value length
Kout buffer to store the symmetric value
K_lensymmetric key length
Returns
0 on success, negative on failure

Definition at line 165 of file ffi_srp6.cpp.

171 {
172#if defined(BOTAN_HAS_SRP6)
173 return ffi_guard_thunk(__func__, [=]() -> int
174 {
175 if(!identity || !password || !salt || !group_id || !hash_id || !b || !rng_obj)
176 {
178 }
179 try
180 {
181 std::vector<uint8_t> saltv(salt, salt + salt_len);
183 auto b_bn = Botan::BigInt::decode(b, b_len);
184 auto [A_bn, K_sk] = Botan::srp6_client_agree(
185 identity, password, group_id, hash_id, saltv, b_bn, rng);
186 auto ret_a = write_vec_output(A, A_len, Botan::BigInt::encode(A_bn));
187 auto ret_k = write_vec_output(K, K_len, K_sk.bits_of());
188 if(ret_a != BOTAN_FFI_SUCCESS)
189 {
190 return ret_a;
191 }
192 if(ret_k != BOTAN_FFI_SUCCESS)
193 {
194 return ret_k;
195 }
196 return BOTAN_FFI_SUCCESS;
197 }
198 catch(Botan::Lookup_Error&)
199 {
201 }
202 });
203#else
204 BOTAN_UNUSED(identity, password, group_id, hash_id, rng_obj);
205 BOTAN_UNUSED(salt, salt_len, b, b_len, A, A_len, K, K_len);
207#endif
208 }
#define BOTAN_UNUSED(...)
Definition: assert.h:141
static BigInt decode(const uint8_t buf[], size_t length)
Definition: bigint.h:805
static std::vector< uint8_t > encode(const BigInt &n)
Definition: bigint.h:780
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
Definition: ffi.h:91
@ BOTAN_FFI_ERROR_NULL_POINTER
Definition: ffi.h:85
@ BOTAN_FFI_SUCCESS
Definition: ffi.h:70
@ BOTAN_FFI_ERROR_BAD_PARAMETER
Definition: ffi.h:86
T & safe_get(botan_struct< T, M > *p)
Definition: ffi_util.h:69
int ffi_guard_thunk(const char *func_name, const std::function< int()> &thunk)
Definition: ffi.cpp:120
int write_vec_output(uint8_t out[], size_t *out_len, const std::vector< uint8_t, Alloc > &buf)
Definition: ffi_util.h:214
std::pair< BigInt, SymmetricKey > srp6_client_agree(std::string_view identifier, std::string_view password, std::string_view group_id, std::string_view hash_id, const std::vector< uint8_t > &salt, const BigInt &B, RandomNumberGenerator &rng)
Definition: srp6.cpp:74

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan::BigInt::decode(), Botan::BigInt::encode(), Botan_FFI::ffi_guard_thunk(), Botan_FFI::safe_get(), Botan::srp6_client_agree(), and Botan_FFI::write_vec_output().

◆ botan_srp6_generate_verifier()

int botan_srp6_generate_verifier ( const char *  identifier,
const char *  password,
const uint8_t  salt[],
size_t  salt_len,
const char *  group_id,
const char *  hash_id,
uint8_t  verifier[],
size_t *  verifier_len 
)

Generate a new SRP-6 verifier

Parameters
identifiera username or other client identifier
passwordthe secret used to authenticate user
salta randomly chosen value, at least 128 bits long
salt_lenthe length of salt
group_idspecifies the shared SRP group
hash_idspecifies a secure hash function
verifierout buffer to store the SRP-6 verifier value
verifier_lenSRP-6 verifier value length
Returns
0 on success, negative on failure

Definition at line 133 of file ffi_srp6.cpp.

137 {
138#if defined(BOTAN_HAS_SRP6)
139 return ffi_guard_thunk(__func__, [=]() -> int
140 {
141 if(!username || !password || !salt || !group_id || !hash_id)
142 {
144 }
145 try
146 {
147 std::vector<uint8_t> salt_vec(salt, salt + salt_len);
148 auto verifier_bn = Botan::srp6_generate_verifier(
149 username, password, salt_vec, group_id, hash_id);
150 return write_vec_output(verifier, verifier_len,
151 Botan::BigInt::encode(verifier_bn));
152 }
153 catch(Botan::Lookup_Error&)
154 {
156 }
157 });
158#else
159 BOTAN_UNUSED(username, password, group_id, hash_id);
160 BOTAN_UNUSED(salt, salt_len, verifier, verifier_len);
162#endif
163 }
BigInt srp6_generate_verifier(std::string_view identifier, std::string_view password, const std::vector< uint8_t > &salt, std::string_view group_id, std::string_view hash_id)
Definition: srp6.cpp:141

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan::BigInt::encode(), Botan_FFI::ffi_guard_thunk(), Botan::srp6_generate_verifier(), and Botan_FFI::write_vec_output().

◆ botan_srp6_group_size()

int botan_srp6_group_size ( const char *  group_id,
size_t *  group_p_bytes 
)

Return the size, in bytes, of the prime associated with group_id

Definition at line 51 of file ffi_srp6.cpp.

52 {
53#if defined(BOTAN_HAS_SRP6)
54 if(group_id == nullptr || group_p_bytes == nullptr)
56
57 return ffi_guard_thunk(__func__, [=]() -> int
58 {
59 Botan::DL_Group group(group_id);
60 *group_p_bytes = group.p_bytes();
61 return BOTAN_FFI_SUCCESS;
62 });
63#else
64 BOTAN_UNUSED(group_id, group_p_bytes);
66#endif
67 }

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan::DL_Group::p_bytes().

◆ botan_srp6_server_session_destroy()

int botan_srp6_server_session_destroy ( botan_srp6_server_session_t  srp6)

Frees all resources of the SRP-6 server session object

Parameters
srp6SRP-6 server session object
Returns
0 if success, error if invalid object handle

Definition at line 46 of file ffi_srp6.cpp.

47 {
48 return BOTAN_FFI_CHECKED_DELETE(srp6);
49 }
#define BOTAN_FFI_CHECKED_DELETE(o)
Definition: ffi_util.h:145

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_srp6_server_session_init()

int botan_srp6_server_session_init ( botan_srp6_server_session_t srp6)

Initialize an SRP-6 server session object

Parameters
srp6SRP-6 server session object

Definition at line 31 of file ffi_srp6.cpp.

32 {
33#if defined(BOTAN_HAS_SRP6)
34 return ffi_guard_thunk(__func__, [=]() -> int
35 {
36 *srp6 = new botan_srp6_server_session_struct(
37 std::make_unique<Botan::SRP6_Server_Session>());
38 return BOTAN_FFI_SUCCESS;
39 });
40#else
41 BOTAN_UNUSED(srp6);
43#endif
44 }

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, and Botan_FFI::ffi_guard_thunk().

◆ botan_srp6_server_session_step1()

int botan_srp6_server_session_step1 ( botan_srp6_server_session_t  srp6,
const uint8_t *  verifier,
size_t  verifier_len,
const char *  group_id,
const char *  hash_id,
botan_rng_t  rng_obj,
uint8_t  b_pub[],
size_t *  b_pub_len 
)

Definition at line 69 of file ffi_srp6.cpp.

74 {
75#if defined(BOTAN_HAS_SRP6)
76 return BOTAN_FFI_VISIT(srp6, [=](auto& s) -> int
77 {
78 if(!verifier || !group_id || !hash_id || !rng_obj)
79 {
81 }
82 try
83 {
85 auto v_bn = Botan::BigInt::decode(verifier, verifier_len);
86 auto b_pub_bn = s.step1(v_bn, group_id, hash_id, rng);
87 return write_vec_output(b_pub, b_pub_len,
88 Botan::BigInt::encode(b_pub_bn));
89 }
91 {
93 }
95 {
97 }
98 });
99#else
100 BOTAN_UNUSED(srp6, verifier, verifier_len, group_id, hash_id, rng_obj, b_pub, b_pub_len);
102#endif
103 }
#define BOTAN_FFI_VISIT(obj, lambda)
Definition: ffi_util.h:126

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan::BigInt::decode(), Botan::BigInt::encode(), Botan_FFI::safe_get(), and Botan_FFI::write_vec_output().

◆ botan_srp6_server_session_step2()

int botan_srp6_server_session_step2 ( botan_srp6_server_session_t  srp6,
const uint8_t  A[],
size_t  A_len,
uint8_t  key[],
size_t *  key_len 
)

SRP-6 Server side step 2

Parameters
srp6SRP-6 server session object
Athe client's value
A_lenthe client's value length
keyout buffer to store the symmetric key value
key_lensymmetric key length
Returns
0 on success, negative on failure

Definition at line 105 of file ffi_srp6.cpp.

108 {
109#if defined(BOTAN_HAS_SRP6)
110 return BOTAN_FFI_VISIT(srp6, [=](auto& s) -> int
111 {
112 if(!a)
113 {
115 }
116 try
117 {
118 Botan::BigInt a_bn = Botan::BigInt::decode(a, a_len);
119 auto key_sk = s.step2(a_bn);
120 return write_vec_output(key, key_len, key_sk.bits_of());
121 }
123 {
125 }
126 });
127#else
128 BOTAN_UNUSED(srp6, a, a_len, key, key_len);
130#endif
131 }

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan::BigInt::decode(), and Botan_FFI::write_vec_output().