summaryrefslogtreecommitdiffstats
path: root/3rd_party/libsrp6a-sha512/srp.h
diff options
context:
space:
mode:
Diffstat (limited to '3rd_party/libsrp6a-sha512/srp.h')
-rw-r--r--3rd_party/libsrp6a-sha512/srp.h372
1 files changed, 372 insertions, 0 deletions
diff --git a/3rd_party/libsrp6a-sha512/srp.h b/3rd_party/libsrp6a-sha512/srp.h
new file mode 100644
index 0000000..b1d46af
--- /dev/null
+++ b/3rd_party/libsrp6a-sha512/srp.h
@@ -0,0 +1,372 @@
1/*
2 * Copyright (c) 1997-2007 The Stanford SRP Authentication Project
3 * All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be
14 * included in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
18 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
19 *
20 * IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
21 * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
22 * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
23 * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
24 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
25 *
26 * Redistributions in source or binary form must retain an intact copy
27 * of this copyright notice.
28 */
29#ifndef _SRP_H_
30#define _SRP_H_
31
32#include "cstr.h"
33#include "srp_aux.h"
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
39/* SRP library version identification */
40#define SRP_VERSION_MAJOR 2
41#define SRP_VERSION_MINOR 0
42#define SRP_VERSION_PATCHLEVEL 1
43
44typedef int SRP_RESULT;
45/* Returned codes for SRP API functions */
46#define SRP_OK(v) ((v) == SRP_SUCCESS)
47#define SRP_SUCCESS 0
48#define SRP_ERROR -1
49
50/* Set the minimum number of bits acceptable in an SRP modulus */
51#define SRP_DEFAULT_MIN_BITS 512
52_TYPE( SRP_RESULT ) SRP_set_modulus_min_bits P((int minbits));
53_TYPE( int ) SRP_get_modulus_min_bits P((void));
54
55/*
56 * Sets the "secret size callback" function.
57 * This function is called with the modulus size in bits,
58 * and returns the size of the secret exponent in bits.
59 * The default function always returns 256 bits.
60 */
61typedef int (_CDECL * SRP_SECRET_BITS_CB)(int modsize);
62_TYPE( SRP_RESULT ) SRP_set_secret_bits_cb P((SRP_SECRET_BITS_CB cb));
63_TYPE( int ) SRP_get_secret_bits P((int modsize));
64
65typedef struct srp_st SRP;
66
67#if 0
68/* Server Lookup API */
69typedef struct srp_server_lu_st SRP_SERVER_LOOKUP;
70
71typedef struct srp_s_lu_meth_st {
72 const char * name;
73
74 SRP_RESULT (_CDECL * init)(SRP_SERVER_LOOKUP * slu);
75 SRP_RESULT (_CDECL * finish)(SRP_SERVER_LOOKUP * slu);
76
77 SRP_RESULT (_CDECL * lookup)(SRP_SERVER_LOOKUP * slu, SRP * srp, cstr * username);
78
79 void * meth_data;
80} SRP_SERVER_LOOKUP_METHOD;
81
82struct srp_server_lu_st {
83 SRP_SERVER_LOOKUP_METHOD * meth;
84 void * data;
85};
86
87/*
88 * The Server Lookup API deals with the server-side issue of
89 * mapping usernames to verifiers. Given a username, a lookup
90 * mechanism needs to provide parameters (N, g), salt (s), and
91 * password verifier (v) for that user.
92 *
93 * A SRP_SERVER_LOOKUP_METHOD describes the general mechanism
94 * for performing lookups (e.g. files, LDAP, database, etc.)
95 * A SRP_SERVER_LOOKUP is an active "object" that is actually
96 * called to do lookups.
97 */
98_TYPE( SRP_SERVER_LOOKUP * )
99 SRP_SERVER_LOOKUP_new P((SRP_SERVER_LOOKUP_METHOD * meth));
100_TYPE( SRP_RESULT ) SRP_SERVER_LOOKUP_free P((SRP_SERVER_LOOKUP * slu));
101_TYPE( SRP_RESULT ) SRP_SERVER_do_lookup P((SRP_SERVER_LOOKUP * slu,
102 SRP * srp, cstr * username));
103
104/*
105 * SRP_SERVER_system_lookup supercedes SRP_server_init_user.
106 */
107_TYPE( SRP_SERVER_LOOKUP * ) SRP_SERVER_system_lookup P((void));
108#endif
109
110/*
111 * Client Parameter Verification API
112 *
113 * This callback is called from the SRP client when the
114 * parameters (modulus and generator) are set. The callback
115 * should return SRP_SUCCESS if the parameters are okay,
116 * otherwise some error code to indicate that the parameters
117 * should be rejected.
118 */
119typedef SRP_RESULT (_CDECL * SRP_CLIENT_PARAM_VERIFY_CB)(SRP * srp, const unsigned char * mod, int modlen, const unsigned char * gen, int genlen);
120
121#if 0
122/* The default parameter verifier function */
123_TYPE( SRP_RESULT ) SRP_CLIENT_default_param_verify_cb(SRP * srp, const unsigned char * mod, int modlen, const unsigned char * gen, int genlen);
124/* A parameter verifier that only accepts builtin params (no prime test) */
125_TYPE( SRP_RESULT ) SRP_CLIENT_builtin_param_verify_cb(SRP * srp, const unsigned char * mod, int modlen, const unsigned char * gen, int genlen);
126/* The "classic" parameter verifier that accepts either builtin params
127 * immediately, and performs safe-prime tests on N and primitive-root
128 * tests on g otherwise. SECURITY WARNING: This may allow for certain
129 * attacks based on "trapdoor" moduli, so this is not recommended. */
130_TYPE( SRP_RESULT ) SRP_CLIENT_compat_param_verify_cb(SRP * srp, const unsigned char * mod, int modlen, const unsigned char * gen, int genlen);
131
132#endif
133
134/*
135 * Main SRP API - SRP and SRP_METHOD
136 */
137
138/* SRP method definitions */
139typedef struct srp_meth_st {
140 const char * name;
141
142 SRP_RESULT (_CDECL * init)(SRP * srp);
143 SRP_RESULT (_CDECL * finish)(SRP * srp);
144
145 SRP_RESULT (_CDECL * params)(SRP * srp,
146 const unsigned char * modulus, int modlen,
147 const unsigned char * generator, int genlen,
148 const unsigned char * salt, int saltlen);
149 SRP_RESULT (_CDECL * auth)(SRP * srp, const unsigned char * a, int alen);
150 SRP_RESULT (_CDECL * passwd)(SRP * srp,
151 const unsigned char * pass, int passlen);
152 SRP_RESULT (_CDECL * genpub)(SRP * srp, cstr ** result);
153 SRP_RESULT (_CDECL * key)(SRP * srp, cstr ** result,
154 const unsigned char * pubkey, int pubkeylen);
155 SRP_RESULT (_CDECL * verify)(SRP * srp,
156 const unsigned char * proof, int prooflen);
157 SRP_RESULT (_CDECL * respond)(SRP * srp, cstr ** proof);
158
159 void * data;
160} SRP_METHOD;
161
162/* Magic numbers for the SRP context header */
163#define SRP_MAGIC_CLIENT 12
164#define SRP_MAGIC_SERVER 28
165
166/* Flag bits for SRP struct */
167#define SRP_FLAG_MOD_ACCEL 0x1 /* accelerate modexp operations */
168#define SRP_FLAG_LEFT_PAD 0x2 /* left-pad to length-of-N inside hashes */
169
170/*
171 * A hybrid structure that represents either client or server state.
172 */
173struct srp_st {
174 int magic; /* To distinguish client from server (and for sanity) */
175
176 int flags;
177
178 cstr * username;
179
180 BigInteger modulus;
181 BigInteger generator;
182 cstr * salt;
183
184 BigInteger verifier;
185 BigInteger password;
186
187 BigInteger pubkey;
188 BigInteger secret;
189 BigInteger u;
190
191 BigInteger key;
192
193 cstr * ex_data;
194
195 SRP_METHOD * meth;
196 void * meth_data;
197
198 BigIntegerCtx bctx; /* to cache temporaries if available */
199 BigIntegerModAccel accel; /* to accelerate modexp if available */
200
201 SRP_CLIENT_PARAM_VERIFY_CB param_cb; /* to verify params */
202 //SRP_SERVER_LOOKUP * slu; /* to look up users */
203};
204
205/*
206 * Global initialization/de-initialization functions.
207 * Call SRP_initialize_library before using the library,
208 * and SRP_finalize_library when done.
209 */
210_TYPE( SRP_RESULT ) SRP_initialize_library();
211_TYPE( SRP_RESULT ) SRP_finalize_library();
212
213/*
214 * SRP_new() creates a new SRP context object -
215 * the method determines which "sense" (client or server)
216 * the object operates in. SRP_free() frees it.
217 * (See RFC2945 method definitions below.)
218 */
219_TYPE( SRP * ) SRP_new P((SRP_METHOD * meth));
220_TYPE( SRP_RESULT ) SRP_free P((SRP * srp));
221
222#if 0
223/*
224 * Use the supplied lookup object to look up user parameters and
225 * password verifier. The lookup function gets called during
226 * SRP_set_username/SRP_set_user_raw below. Using this function
227 * means that the server can avoid calling SRP_set_params and
228 * SRP_set_authenticator, since the lookup function handles that
229 * internally.
230 */
231_TYPE( SRP_RESULT ) SRP_set_server_lookup P((SRP * srp,
232 SRP_SERVER_LOOKUP * lookup));
233#endif
234
235/*
236 * Use the supplied callback function to verify parameters
237 * (modulus, generator) given to the client.
238 */
239_TYPE( SRP_RESULT )
240 SRP_set_client_param_verify_cb P((SRP * srp,
241 SRP_CLIENT_PARAM_VERIFY_CB cb));
242
243/*
244 * Both client and server must call both SRP_set_username and
245 * SRP_set_params, in that order, before calling anything else.
246 * SRP_set_user_raw is an alternative to SRP_set_username that
247 * accepts an arbitrary length-bounded octet string as input.
248 */
249_TYPE( SRP_RESULT ) SRP_set_username P((SRP * srp, const char * username));
250_TYPE( SRP_RESULT ) SRP_set_user_raw P((SRP * srp, const unsigned char * user,
251 int userlen));
252_TYPE( SRP_RESULT )
253 SRP_set_params P((SRP * srp,
254 const unsigned char * modulus, int modlen,
255 const unsigned char * generator, int genlen,
256 const unsigned char * salt, int saltlen));
257
258/*
259 * On the client, SRP_set_authenticator, SRP_gen_exp, and
260 * SRP_add_ex_data can be called in any order.
261 * On the server, SRP_set_authenticator must come first,
262 * followed by SRP_gen_exp and SRP_add_ex_data in either order.
263 */
264/*
265 * The authenticator is the secret possessed by either side.
266 * For the server, this is the bigendian verifier, as an octet string.
267 * For the client, this is the bigendian raw secret, as an octet string.
268 * The server's authenticator must be the generator raised to the power
269 * of the client's raw secret modulo the common modulus for authentication
270 * to succeed.
271 *
272 * SRP_set_auth_password computes the authenticator from a plaintext
273 * password and then calls SRP_set_authenticator automatically. This is
274 * usually used on the client side, while the server usually uses
275 * SRP_set_authenticator (since it doesn't know the plaintext password).
276 */
277_TYPE( SRP_RESULT )
278 SRP_set_authenticator P((SRP * srp, const unsigned char * a, int alen));
279_TYPE( SRP_RESULT )
280 SRP_set_auth_password P((SRP * srp, const char * password));
281_TYPE( SRP_RESULT )
282 SRP_set_auth_password_raw P((SRP * srp,
283 const unsigned char * password,
284 int passlen));
285
286/*
287 * SRP_gen_pub generates the random exponential residue to send
288 * to the other side. If using SRP-3/RFC2945, the server must
289 * withhold its result until it receives the client's number.
290 * If using SRP-6, the server can send its value immediately
291 * without waiting for the client.
292 *
293 * If "result" points to a NULL pointer, a new cstr object will be
294 * created to hold the result, and "result" will point to it.
295 * If "result" points to a non-NULL cstr pointer, the result will be
296 * placed there.
297 * If "result" itself is NULL, no result will be returned,
298 * although the big integer value will still be available
299 * through srp->pubkey in the SRP struct.
300 */
301_TYPE( SRP_RESULT ) SRP_gen_pub P((SRP * srp, cstr ** result));
302/*
303 * Append the data to the extra data segment. Authentication will
304 * not succeed unless both sides add precisely the same data in
305 * the same order.
306 */
307_TYPE( SRP_RESULT ) SRP_add_ex_data P((SRP * srp, const unsigned char * data,
308 int datalen));
309
310/*
311 * SRP_compute_key must be called after the previous three methods.
312 */
313_TYPE( SRP_RESULT ) SRP_compute_key P((SRP * srp, cstr ** result,
314 const unsigned char * pubkey,
315 int pubkeylen));
316
317/*
318 * On the client, call SRP_respond first to get the response to send
319 * to the server, and call SRP_verify to verify the server's response.
320 * On the server, call SRP_verify first to verify the client's response,
321 * and call SRP_respond ONLY if verification succeeds.
322 *
323 * It is an error to call SRP_respond with a NULL pointer.
324 */
325_TYPE( SRP_RESULT ) SRP_verify P((SRP * srp,
326 const unsigned char * proof, int prooflen));
327_TYPE( SRP_RESULT ) SRP_respond P((SRP * srp, cstr ** response));
328
329/* RFC2945-style SRP authentication */
330
331#define RFC2945_KEY_LEN 40 /* length of session key (bytes) */
332#define RFC2945_RESP_LEN 20 /* length of proof hashes (bytes) */
333
334/*
335 * RFC2945-style SRP authentication methods. Use these like:
336 * SRP * srp = SRP_new(SRP_RFC2945_client_method());
337 */
338_TYPE( SRP_METHOD * ) SRP_RFC2945_client_method P((void));
339_TYPE( SRP_METHOD * ) SRP_RFC2945_server_method P((void));
340
341/*
342 * SRP-6 and SRP-6a authentication methods.
343 * SRP-6a is recommended for better resistance to 2-for-1 attacks.
344 */
345_TYPE( SRP_METHOD * ) SRP6_client_method P((void));
346_TYPE( SRP_METHOD * ) SRP6_server_method P((void));
347_TYPE( SRP_METHOD * ) SRP6a_client_method P((void));
348_TYPE( SRP_METHOD * ) SRP6a_server_method P((void));
349
350_TYPE( SRP_METHOD * ) SRP6a_sha512_client_method P((void));
351
352/*
353 * Convenience function - SRP_server_init_user
354 * Looks up the username from the system EPS configuration and calls
355 * SRP_set_username, SRP_set_params, and SRP_set_authenticator to
356 * initialize server state for that user.
357 *
358 * This is deprecated in favor of SRP_SERVER_system_lookup() and
359 * the Server Lookup API.
360 */
361_TYPE( SRP_RESULT ) SRP_server_init_user P((SRP * srp, const char * username));
362
363/*
364 * Use the named engine for acceleration.
365 */
366_TYPE( SRP_RESULT ) SRP_use_engine P((const char * engine));
367
368#ifdef __cplusplus
369}
370#endif
371
372#endif /* _SRP_H_ */