Latest update
This commit is contained in:
@@ -44,13 +44,13 @@ static BIGNUM *srp_Calc_xy(const BIGNUM *x, const BIGNUM *y, const BIGNUM *N)
|
||||
|
||||
static BIGNUM *srp_Calc_k(const BIGNUM *N, const BIGNUM *g)
|
||||
{
|
||||
/* k = SHA1(N | PAD(g)) -- tls-srp draft 8 */
|
||||
/* k = SHA1(N | PAD(g)) -- tls-srp RFC 5054 */
|
||||
return srp_Calc_xy(N, g, N);
|
||||
}
|
||||
|
||||
BIGNUM *SRP_Calc_u(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N)
|
||||
{
|
||||
/* k = SHA1(PAD(A) || PAD(B) ) -- tls-srp draft 8 */
|
||||
/* u = SHA1(PAD(A) || PAD(B) ) -- tls-srp RFC 5054 */
|
||||
return srp_Calc_xy(A, B, N);
|
||||
}
|
||||
|
||||
@@ -254,13 +254,13 @@ static SRP_gN knowngN[] = {
|
||||
|
||||
/*
|
||||
* Check if G and N are known parameters. The values have been generated
|
||||
* from the ietf-tls-srp draft version 8
|
||||
* from the IETF RFC 5054
|
||||
*/
|
||||
char *SRP_check_known_gN_param(const BIGNUM *g, const BIGNUM *N)
|
||||
{
|
||||
size_t i;
|
||||
if ((g == NULL) || (N == NULL))
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < KNOWN_GN_NUMBER; i++) {
|
||||
if (BN_cmp(knowngN[i].g, g) == 0 && BN_cmp(knowngN[i].N, N) == 0)
|
||||
|
||||
+32
-16
@@ -184,7 +184,7 @@ void SRP_user_pwd_free(SRP_user_pwd *user_pwd)
|
||||
OPENSSL_free(user_pwd);
|
||||
}
|
||||
|
||||
static SRP_user_pwd *SRP_user_pwd_new(void)
|
||||
SRP_user_pwd *SRP_user_pwd_new(void)
|
||||
{
|
||||
SRP_user_pwd *ret;
|
||||
|
||||
@@ -201,16 +201,18 @@ static SRP_user_pwd *SRP_user_pwd_new(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void SRP_user_pwd_set_gN(SRP_user_pwd *vinfo, const BIGNUM *g,
|
||||
const BIGNUM *N)
|
||||
void SRP_user_pwd_set_gN(SRP_user_pwd *vinfo, const BIGNUM *g,
|
||||
const BIGNUM *N)
|
||||
{
|
||||
vinfo->N = N;
|
||||
vinfo->g = g;
|
||||
}
|
||||
|
||||
static int SRP_user_pwd_set_ids(SRP_user_pwd *vinfo, const char *id,
|
||||
const char *info)
|
||||
int SRP_user_pwd_set1_ids(SRP_user_pwd *vinfo, const char *id,
|
||||
const char *info)
|
||||
{
|
||||
OPENSSL_free(vinfo->id);
|
||||
OPENSSL_free(vinfo->info);
|
||||
if (id != NULL && NULL == (vinfo->id = OPENSSL_strdup(id)))
|
||||
return 0;
|
||||
return (info == NULL || NULL != (vinfo->info = OPENSSL_strdup(info)));
|
||||
@@ -243,8 +245,10 @@ static int SRP_user_pwd_set_sv(SRP_user_pwd *vinfo, const char *s,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int SRP_user_pwd_set_sv_BN(SRP_user_pwd *vinfo, BIGNUM *s, BIGNUM *v)
|
||||
int SRP_user_pwd_set0_sv(SRP_user_pwd *vinfo, BIGNUM *s, BIGNUM *v)
|
||||
{
|
||||
BN_free(vinfo->s);
|
||||
BN_clear_free(vinfo->v);
|
||||
vinfo->v = v;
|
||||
vinfo->s = s;
|
||||
return (vinfo->s != NULL && vinfo->v != NULL);
|
||||
@@ -260,8 +264,8 @@ static SRP_user_pwd *srp_user_pwd_dup(SRP_user_pwd *src)
|
||||
return NULL;
|
||||
|
||||
SRP_user_pwd_set_gN(ret, src->g, src->N);
|
||||
if (!SRP_user_pwd_set_ids(ret, src->id, src->info)
|
||||
|| !SRP_user_pwd_set_sv_BN(ret, BN_dup(src->s), BN_dup(src->v))) {
|
||||
if (!SRP_user_pwd_set1_ids(ret, src->id, src->info)
|
||||
|| !SRP_user_pwd_set0_sv(ret, BN_dup(src->s), BN_dup(src->v))) {
|
||||
SRP_user_pwd_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
@@ -340,12 +344,13 @@ static SRP_gN *SRP_get_gN_by_id(const char *id, STACK_OF(SRP_gN) *gN_tab)
|
||||
int i;
|
||||
|
||||
SRP_gN *gN;
|
||||
if (gN_tab != NULL)
|
||||
if (gN_tab != NULL) {
|
||||
for (i = 0; i < sk_SRP_gN_num(gN_tab); i++) {
|
||||
gN = sk_SRP_gN_value(gN_tab, i);
|
||||
if (gN && (id == NULL || strcmp(gN->id, id) == 0))
|
||||
return gN;
|
||||
}
|
||||
}
|
||||
|
||||
return SRP_get_default_gN(id);
|
||||
}
|
||||
@@ -374,9 +379,13 @@ static BIGNUM *SRP_gN_place_bn(STACK_OF(SRP_gN_cache) *gN_cache, char *ch)
|
||||
}
|
||||
|
||||
/*
|
||||
* this function parses verifier file. Format is:
|
||||
* string(index):base64(N):base64(g):0
|
||||
* string(username):base64(v):base64(salt):int(index)
|
||||
* This function parses the verifier file generated by the srp app.
|
||||
* The format for each entry is:
|
||||
* V base64(verifier) base64(salt) username gNid userinfo(optional)
|
||||
* or
|
||||
* I base64(N) base64(g)
|
||||
* Note that base64 is the SRP variant of base64 encoding described
|
||||
* in t_fromb64().
|
||||
*/
|
||||
|
||||
int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file)
|
||||
@@ -441,7 +450,7 @@ int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file)
|
||||
goto err;
|
||||
|
||||
SRP_user_pwd_set_gN(user_pwd, lgN->g, lgN->N);
|
||||
if (!SRP_user_pwd_set_ids
|
||||
if (!SRP_user_pwd_set1_ids
|
||||
(user_pwd, pp[DB_srpid], pp[DB_srpinfo]))
|
||||
goto err;
|
||||
|
||||
@@ -509,6 +518,13 @@ static SRP_user_pwd *find_user(SRP_VBASE *vb, char *username)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int SRP_VBASE_add0_user(SRP_VBASE *vb, SRP_user_pwd *user_pwd)
|
||||
{
|
||||
if (sk_SRP_user_pwd_push(vb->users_pwd, user_pwd) <= 0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
# if OPENSSL_API_COMPAT < 0x10100000L
|
||||
/*
|
||||
* DEPRECATED: use SRP_VBASE_get1_by_user instead.
|
||||
@@ -550,7 +566,7 @@ SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username)
|
||||
|
||||
SRP_user_pwd_set_gN(user, vb->default_g, vb->default_N);
|
||||
|
||||
if (!SRP_user_pwd_set_ids(user, username, NULL))
|
||||
if (!SRP_user_pwd_set1_ids(user, username, NULL))
|
||||
goto err;
|
||||
|
||||
if (RAND_priv_bytes(digv, SHA_DIGEST_LENGTH) <= 0)
|
||||
@@ -564,7 +580,7 @@ SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username)
|
||||
goto err;
|
||||
EVP_MD_CTX_free(ctxt);
|
||||
ctxt = NULL;
|
||||
if (SRP_user_pwd_set_sv_BN(user,
|
||||
if (SRP_user_pwd_set0_sv(user,
|
||||
BN_bin2bn(digs, SHA_DIGEST_LENGTH, NULL),
|
||||
BN_bin2bn(digv, SHA_DIGEST_LENGTH, NULL)))
|
||||
return user;
|
||||
@@ -605,7 +621,7 @@ char *SRP_create_verifier(const char *user, const char *pass, char **salt,
|
||||
g_bn = g_bn_alloc;
|
||||
defgNid = "*";
|
||||
} else {
|
||||
SRP_gN *gN = SRP_get_gN_by_id(g, NULL);
|
||||
SRP_gN *gN = SRP_get_default_gN(g);
|
||||
if (gN == NULL)
|
||||
goto err;
|
||||
N_bn = gN->N;
|
||||
|
||||
Reference in New Issue
Block a user