1 /* 2 * WARNING: do not edit! 3 * Generated by Makefile from include/openssl/srp.h.in 4 * 5 * Copyright 2004-2021 The OpenSSL Project Authors. All Rights Reserved. 6 * Copyright (c) 2004, EdelKey Project. All Rights Reserved. 7 * 8 * Licensed under the Apache License 2.0 (the "License"). You may not use 9 * this file except in compliance with the License. You can obtain a copy 10 * in the file LICENSE in the source distribution or at 11 * https://www.openssl.org/source/license.html 12 * 13 * Originally written by Christophe Renou and Peter Sylvester, 14 * for the EdelKey project. 15 */ 16 17 /* clang-format off */ 18 19 /* clang-format on */ 20 21 #ifndef OPENSSL_SRP_H 22 #define OPENSSL_SRP_H 23 #pragma once 24 25 #include <openssl/macros.h> 26 #ifndef OPENSSL_NO_DEPRECATED_3_0 27 #define HEADER_SRP_H 28 #endif 29 30 #include <openssl/opensslconf.h> 31 32 #ifndef OPENSSL_NO_SRP 33 #include <stdio.h> 34 #include <string.h> 35 #include <openssl/safestack.h> 36 #include <openssl/bn.h> 37 #include <openssl/crypto.h> 38 39 #ifdef __cplusplus 40 extern "C" { 41 #endif 42 43 #ifndef OPENSSL_NO_DEPRECATED_3_0 44 45 typedef struct SRP_gN_cache_st { 46 char *b64_bn; 47 BIGNUM *bn; 48 } SRP_gN_cache; 49 /* clang-format off */ 50 SKM_DEFINE_STACK_OF_INTERNAL(SRP_gN_cache, SRP_gN_cache, SRP_gN_cache) 51 #define sk_SRP_gN_cache_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_gN_cache_sk_type(sk)) 52 #define sk_SRP_gN_cache_value(sk, idx) ((SRP_gN_cache *)OPENSSL_sk_value(ossl_check_const_SRP_gN_cache_sk_type(sk), (idx))) 53 #define sk_SRP_gN_cache_new(cmp) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new(ossl_check_SRP_gN_cache_compfunc_type(cmp))) 54 #define sk_SRP_gN_cache_new_null() ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new_null()) 55 #define sk_SRP_gN_cache_new_reserve(cmp, n) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new_reserve(ossl_check_SRP_gN_cache_compfunc_type(cmp), (n))) 56 #define sk_SRP_gN_cache_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_gN_cache_sk_type(sk), (n)) 57 #define sk_SRP_gN_cache_free(sk) OPENSSL_sk_free(ossl_check_SRP_gN_cache_sk_type(sk)) 58 #define sk_SRP_gN_cache_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_gN_cache_sk_type(sk)) 59 #define sk_SRP_gN_cache_delete(sk, i) ((SRP_gN_cache *)OPENSSL_sk_delete(ossl_check_SRP_gN_cache_sk_type(sk), (i))) 60 #define sk_SRP_gN_cache_delete_ptr(sk, ptr) ((SRP_gN_cache *)OPENSSL_sk_delete_ptr(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr))) 61 #define sk_SRP_gN_cache_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) 62 #define sk_SRP_gN_cache_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) 63 #define sk_SRP_gN_cache_pop(sk) ((SRP_gN_cache *)OPENSSL_sk_pop(ossl_check_SRP_gN_cache_sk_type(sk))) 64 #define sk_SRP_gN_cache_shift(sk) ((SRP_gN_cache *)OPENSSL_sk_shift(ossl_check_SRP_gN_cache_sk_type(sk))) 65 #define sk_SRP_gN_cache_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_gN_cache_sk_type(sk),ossl_check_SRP_gN_cache_freefunc_type(freefunc)) 66 #define sk_SRP_gN_cache_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr), (idx)) 67 #define sk_SRP_gN_cache_set(sk, idx, ptr) ((SRP_gN_cache *)OPENSSL_sk_set(ossl_check_SRP_gN_cache_sk_type(sk), (idx), ossl_check_SRP_gN_cache_type(ptr))) 68 #define sk_SRP_gN_cache_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) 69 #define sk_SRP_gN_cache_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) 70 #define sk_SRP_gN_cache_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr), pnum) 71 #define sk_SRP_gN_cache_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_gN_cache_sk_type(sk)) 72 #define sk_SRP_gN_cache_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_gN_cache_sk_type(sk)) 73 #define sk_SRP_gN_cache_dup(sk) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_dup(ossl_check_const_SRP_gN_cache_sk_type(sk))) 74 #define sk_SRP_gN_cache_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_copyfunc_type(copyfunc), ossl_check_SRP_gN_cache_freefunc_type(freefunc))) 75 #define sk_SRP_gN_cache_set_cmp_func(sk, cmp) ((sk_SRP_gN_cache_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_compfunc_type(cmp))) 76 77 /* clang-format on */ 78 79 typedef struct SRP_user_pwd_st { 80 /* Owned by us. */ 81 char *id; 82 BIGNUM *s; 83 BIGNUM *v; 84 /* Not owned by us. */ 85 const BIGNUM *g; 86 const BIGNUM *N; 87 /* Owned by us. */ 88 char *info; 89 } SRP_user_pwd; 90 /* clang-format off */ 91 SKM_DEFINE_STACK_OF_INTERNAL(SRP_user_pwd, SRP_user_pwd, SRP_user_pwd) 92 #define sk_SRP_user_pwd_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_user_pwd_sk_type(sk)) 93 #define sk_SRP_user_pwd_value(sk, idx) ((SRP_user_pwd *)OPENSSL_sk_value(ossl_check_const_SRP_user_pwd_sk_type(sk), (idx))) 94 #define sk_SRP_user_pwd_new(cmp) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new(ossl_check_SRP_user_pwd_compfunc_type(cmp))) 95 #define sk_SRP_user_pwd_new_null() ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new_null()) 96 #define sk_SRP_user_pwd_new_reserve(cmp, n) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new_reserve(ossl_check_SRP_user_pwd_compfunc_type(cmp), (n))) 97 #define sk_SRP_user_pwd_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_user_pwd_sk_type(sk), (n)) 98 #define sk_SRP_user_pwd_free(sk) OPENSSL_sk_free(ossl_check_SRP_user_pwd_sk_type(sk)) 99 #define sk_SRP_user_pwd_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_user_pwd_sk_type(sk)) 100 #define sk_SRP_user_pwd_delete(sk, i) ((SRP_user_pwd *)OPENSSL_sk_delete(ossl_check_SRP_user_pwd_sk_type(sk), (i))) 101 #define sk_SRP_user_pwd_delete_ptr(sk, ptr) ((SRP_user_pwd *)OPENSSL_sk_delete_ptr(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr))) 102 #define sk_SRP_user_pwd_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) 103 #define sk_SRP_user_pwd_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) 104 #define sk_SRP_user_pwd_pop(sk) ((SRP_user_pwd *)OPENSSL_sk_pop(ossl_check_SRP_user_pwd_sk_type(sk))) 105 #define sk_SRP_user_pwd_shift(sk) ((SRP_user_pwd *)OPENSSL_sk_shift(ossl_check_SRP_user_pwd_sk_type(sk))) 106 #define sk_SRP_user_pwd_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_user_pwd_sk_type(sk),ossl_check_SRP_user_pwd_freefunc_type(freefunc)) 107 #define sk_SRP_user_pwd_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr), (idx)) 108 #define sk_SRP_user_pwd_set(sk, idx, ptr) ((SRP_user_pwd *)OPENSSL_sk_set(ossl_check_SRP_user_pwd_sk_type(sk), (idx), ossl_check_SRP_user_pwd_type(ptr))) 109 #define sk_SRP_user_pwd_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) 110 #define sk_SRP_user_pwd_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) 111 #define sk_SRP_user_pwd_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr), pnum) 112 #define sk_SRP_user_pwd_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_user_pwd_sk_type(sk)) 113 #define sk_SRP_user_pwd_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_user_pwd_sk_type(sk)) 114 #define sk_SRP_user_pwd_dup(sk) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_dup(ossl_check_const_SRP_user_pwd_sk_type(sk))) 115 #define sk_SRP_user_pwd_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_copyfunc_type(copyfunc), ossl_check_SRP_user_pwd_freefunc_type(freefunc))) 116 #define sk_SRP_user_pwd_set_cmp_func(sk, cmp) ((sk_SRP_user_pwd_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_compfunc_type(cmp))) 117 118 /* clang-format on */ 119 120 OSSL_DEPRECATEDIN_3_0 121 SRP_user_pwd *SRP_user_pwd_new(void); 122 OSSL_DEPRECATEDIN_3_0 123 void SRP_user_pwd_free(SRP_user_pwd *user_pwd); 124 125 OSSL_DEPRECATEDIN_3_0 126 void SRP_user_pwd_set_gN(SRP_user_pwd *user_pwd, const BIGNUM *g, 127 const BIGNUM *N); 128 OSSL_DEPRECATEDIN_3_0 129 int SRP_user_pwd_set1_ids(SRP_user_pwd *user_pwd, const char *id, 130 const char *info); 131 OSSL_DEPRECATEDIN_3_0 132 int SRP_user_pwd_set0_sv(SRP_user_pwd *user_pwd, BIGNUM *s, BIGNUM *v); 133 134 typedef struct SRP_VBASE_st { 135 STACK_OF(SRP_user_pwd) *users_pwd; 136 STACK_OF(SRP_gN_cache) *gN_cache; 137 /* to simulate a user */ 138 char *seed_key; 139 const BIGNUM *default_g; 140 const BIGNUM *default_N; 141 } SRP_VBASE; 142 143 /* 144 * Internal structure storing N and g pair 145 */ 146 typedef struct SRP_gN_st { 147 char *id; 148 const BIGNUM *g; 149 const BIGNUM *N; 150 } SRP_gN; 151 /* clang-format off */ 152 SKM_DEFINE_STACK_OF_INTERNAL(SRP_gN, SRP_gN, SRP_gN) 153 #define sk_SRP_gN_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_gN_sk_type(sk)) 154 #define sk_SRP_gN_value(sk, idx) ((SRP_gN *)OPENSSL_sk_value(ossl_check_const_SRP_gN_sk_type(sk), (idx))) 155 #define sk_SRP_gN_new(cmp) ((STACK_OF(SRP_gN) *)OPENSSL_sk_new(ossl_check_SRP_gN_compfunc_type(cmp))) 156 #define sk_SRP_gN_new_null() ((STACK_OF(SRP_gN) *)OPENSSL_sk_new_null()) 157 #define sk_SRP_gN_new_reserve(cmp, n) ((STACK_OF(SRP_gN) *)OPENSSL_sk_new_reserve(ossl_check_SRP_gN_compfunc_type(cmp), (n))) 158 #define sk_SRP_gN_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_gN_sk_type(sk), (n)) 159 #define sk_SRP_gN_free(sk) OPENSSL_sk_free(ossl_check_SRP_gN_sk_type(sk)) 160 #define sk_SRP_gN_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_gN_sk_type(sk)) 161 #define sk_SRP_gN_delete(sk, i) ((SRP_gN *)OPENSSL_sk_delete(ossl_check_SRP_gN_sk_type(sk), (i))) 162 #define sk_SRP_gN_delete_ptr(sk, ptr) ((SRP_gN *)OPENSSL_sk_delete_ptr(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr))) 163 #define sk_SRP_gN_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) 164 #define sk_SRP_gN_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) 165 #define sk_SRP_gN_pop(sk) ((SRP_gN *)OPENSSL_sk_pop(ossl_check_SRP_gN_sk_type(sk))) 166 #define sk_SRP_gN_shift(sk) ((SRP_gN *)OPENSSL_sk_shift(ossl_check_SRP_gN_sk_type(sk))) 167 #define sk_SRP_gN_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_gN_sk_type(sk),ossl_check_SRP_gN_freefunc_type(freefunc)) 168 #define sk_SRP_gN_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr), (idx)) 169 #define sk_SRP_gN_set(sk, idx, ptr) ((SRP_gN *)OPENSSL_sk_set(ossl_check_SRP_gN_sk_type(sk), (idx), ossl_check_SRP_gN_type(ptr))) 170 #define sk_SRP_gN_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) 171 #define sk_SRP_gN_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) 172 #define sk_SRP_gN_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr), pnum) 173 #define sk_SRP_gN_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_gN_sk_type(sk)) 174 #define sk_SRP_gN_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_gN_sk_type(sk)) 175 #define sk_SRP_gN_dup(sk) ((STACK_OF(SRP_gN) *)OPENSSL_sk_dup(ossl_check_const_SRP_gN_sk_type(sk))) 176 #define sk_SRP_gN_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_gN) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_gN_sk_type(sk), ossl_check_SRP_gN_copyfunc_type(copyfunc), ossl_check_SRP_gN_freefunc_type(freefunc))) 177 #define sk_SRP_gN_set_cmp_func(sk, cmp) ((sk_SRP_gN_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_compfunc_type(cmp))) 178 179 /* clang-format on */ 180 181 OSSL_DEPRECATEDIN_3_0 182 SRP_VBASE *SRP_VBASE_new(char *seed_key); 183 OSSL_DEPRECATEDIN_3_0 184 void SRP_VBASE_free(SRP_VBASE *vb); 185 OSSL_DEPRECATEDIN_3_0 186 int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); 187 188 OSSL_DEPRECATEDIN_3_0 189 int SRP_VBASE_add0_user(SRP_VBASE *vb, SRP_user_pwd *user_pwd); 190 191 /* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/ 192 OSSL_DEPRECATEDIN_3_0 193 SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username); 194 195 OSSL_DEPRECATEDIN_3_0 196 char *SRP_create_verifier_ex(const char *user, const char *pass, char **salt, 197 char **verifier, const char *N, const char *g, 198 OSSL_LIB_CTX *libctx, const char *propq); 199 OSSL_DEPRECATEDIN_3_0 200 char *SRP_create_verifier(const char *user, const char *pass, char **salt, 201 char **verifier, const char *N, const char *g); 202 OSSL_DEPRECATEDIN_3_0 203 int SRP_create_verifier_BN_ex(const char *user, const char *pass, BIGNUM **salt, 204 BIGNUM **verifier, const BIGNUM *N, 205 const BIGNUM *g, OSSL_LIB_CTX *libctx, 206 const char *propq); 207 OSSL_DEPRECATEDIN_3_0 208 int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, 209 BIGNUM **verifier, const BIGNUM *N, 210 const BIGNUM *g); 211 212 #define SRP_NO_ERROR 0 213 #define SRP_ERR_VBASE_INCOMPLETE_FILE 1 214 #define SRP_ERR_VBASE_BN_LIB 2 215 #define SRP_ERR_OPEN_FILE 3 216 #define SRP_ERR_MEMORY 4 217 218 #define DB_srptype 0 219 #define DB_srpverifier 1 220 #define DB_srpsalt 2 221 #define DB_srpid 3 222 #define DB_srpgN 4 223 #define DB_srpinfo 5 224 #undef DB_NUMBER 225 #define DB_NUMBER 6 226 227 #define DB_SRP_INDEX 'I' 228 #define DB_SRP_VALID 'V' 229 #define DB_SRP_REVOKED 'R' 230 #define DB_SRP_MODIF 'v' 231 232 /* see srp.c */ 233 OSSL_DEPRECATEDIN_3_0 234 char *SRP_check_known_gN_param(const BIGNUM *g, const BIGNUM *N); 235 OSSL_DEPRECATEDIN_3_0 236 SRP_gN *SRP_get_default_gN(const char *id); 237 238 /* server side .... */ 239 OSSL_DEPRECATEDIN_3_0 240 BIGNUM *SRP_Calc_server_key(const BIGNUM *A, const BIGNUM *v, const BIGNUM *u, 241 const BIGNUM *b, const BIGNUM *N); 242 OSSL_DEPRECATEDIN_3_0 243 BIGNUM *SRP_Calc_B_ex(const BIGNUM *b, const BIGNUM *N, const BIGNUM *g, 244 const BIGNUM *v, OSSL_LIB_CTX *libctx, const char *propq); 245 OSSL_DEPRECATEDIN_3_0 246 BIGNUM *SRP_Calc_B(const BIGNUM *b, const BIGNUM *N, const BIGNUM *g, 247 const BIGNUM *v); 248 249 OSSL_DEPRECATEDIN_3_0 250 int SRP_Verify_A_mod_N(const BIGNUM *A, const BIGNUM *N); 251 OSSL_DEPRECATEDIN_3_0 252 BIGNUM *SRP_Calc_u_ex(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N, 253 OSSL_LIB_CTX *libctx, const char *propq); 254 OSSL_DEPRECATEDIN_3_0 255 BIGNUM *SRP_Calc_u(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N); 256 257 /* client side .... */ 258 259 OSSL_DEPRECATEDIN_3_0 260 BIGNUM *SRP_Calc_x_ex(const BIGNUM *s, const char *user, const char *pass, 261 OSSL_LIB_CTX *libctx, const char *propq); 262 OSSL_DEPRECATEDIN_3_0 263 BIGNUM *SRP_Calc_x(const BIGNUM *s, const char *user, const char *pass); 264 OSSL_DEPRECATEDIN_3_0 265 BIGNUM *SRP_Calc_A(const BIGNUM *a, const BIGNUM *N, const BIGNUM *g); 266 OSSL_DEPRECATEDIN_3_0 267 BIGNUM *SRP_Calc_client_key_ex(const BIGNUM *N, const BIGNUM *B, const BIGNUM *g, 268 const BIGNUM *x, const BIGNUM *a, const BIGNUM *u, 269 OSSL_LIB_CTX *libctx, const char *propq); 270 OSSL_DEPRECATEDIN_3_0 271 BIGNUM *SRP_Calc_client_key(const BIGNUM *N, const BIGNUM *B, const BIGNUM *g, 272 const BIGNUM *x, const BIGNUM *a, const BIGNUM *u); 273 OSSL_DEPRECATEDIN_3_0 274 int SRP_Verify_B_mod_N(const BIGNUM *B, const BIGNUM *N); 275 276 #define SRP_MINIMAL_N 1024 277 278 #endif /* OPENSSL_NO_DEPRECATED_3_0 */ 279 280 /* This method ignores the configured seed and fails for an unknown user. */ 281 #ifndef OPENSSL_NO_DEPRECATED_1_1_0 282 OSSL_DEPRECATEDIN_1_1_0 283 SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username); 284 #endif 285 286 #ifdef __cplusplus 287 } 288 #endif 289 #endif 290 291 #endif 292