Ejemplo n.º 1
0
void srp_verifier_delete( struct SRPVerifier * ver )
{
    delete_ng( ver->ng );
    free( (char *) ver->username );
    free( (unsigned char *) ver->bytes_B );
    free( ver );
}
Ejemplo n.º 2
0
static NGConstant *new_ng(SRP_NGType ng_type, const char *n_hex, const char *g_hex)
{
	NGConstant *ng = (NGConstant *)srp_alloc(sizeof(NGConstant));

	if (!ng) return 0;

	mpz_init(ng->N);
	mpz_init(ng->g);

	if (ng_type != SRP_NG_CUSTOM) {
		n_hex = global_Ng_constants[ng_type].n_hex;
		g_hex = global_Ng_constants[ng_type].g_hex;
	}

	int rv = 0;
	rv = mpz_set_str(ng->N, n_hex, 16);
	rv = rv | mpz_set_str(ng->g, g_hex, 16);

	if (rv) {
		delete_ng(ng);
		return 0;
	}

	return ng;
}
Ejemplo n.º 3
0
struct SRPUser *srp_user_new(SRP_HashAlgorithm alg, SRP_NGType ng_type,
	const char *username, const char *username_for_verifier,
	const unsigned char *bytes_password, size_t len_password, const char *n_hex,
	const char *g_hex)
{
	struct SRPUser *usr = (struct SRPUser *)srp_alloc(sizeof(struct SRPUser));
	size_t ulen = strlen(username) + 1;
	size_t uvlen = strlen(username_for_verifier) + 1;

	if (!usr) goto err_exit;

	if (init_random() != SRP_OK) /* Only happens once */
		goto err_exit;

	usr->hash_alg = alg;
	usr->ng = new_ng(ng_type, n_hex, g_hex);

	mpz_init(usr->a);
	mpz_init(usr->A);
	mpz_init(usr->S);

	if (!usr->ng) goto err_exit;

	usr->username = (char *)srp_alloc(ulen);
	usr->username_verifier = (char *)srp_alloc(uvlen);
	usr->password = (unsigned char *)srp_alloc(len_password);
	usr->password_len = len_password;

	if (!usr->username || !usr->password || !usr->username_verifier) goto err_exit;

	memcpy(usr->username, username, ulen);
	memcpy(usr->username_verifier, username_for_verifier, uvlen);
	memcpy(usr->password, bytes_password, len_password);

	usr->authenticated = 0;

	usr->bytes_A = 0;

	return usr;

err_exit:
	if (usr) {
		mpz_clear(usr->a);
		mpz_clear(usr->A);
		mpz_clear(usr->S);
		if (usr->ng) delete_ng(usr->ng);
		srp_free(usr->username);
		srp_free(usr->username_verifier);
		if (usr->password) {
			memset(usr->password, 0, usr->password_len);
			srp_free(usr->password);
		}
		srp_free(usr);
	}

	return 0;
}
Ejemplo n.º 4
0
// clang-format off
SRP_Result srp_create_salted_verification_key( SRP_HashAlgorithm alg,
	SRP_NGType ng_type, const char *username_for_verifier,
	const unsigned char *password, size_t len_password,
	unsigned char **bytes_s,  size_t *len_s,
	unsigned char **bytes_v, size_t *len_v,
	const char *n_hex, const char *g_hex )
{
	SRP_Result ret = SRP_OK;

	mpz_t v; mpz_init(v);
	mpz_t x; mpz_init(x);
	// clang-format on

	NGConstant *ng = new_ng(ng_type, n_hex, g_hex);

	if (!ng) goto error_and_exit;

	if (init_random() != SRP_OK) /* Only happens once */
		goto error_and_exit;

	if (*bytes_s == NULL) {
		size_t size_to_fill = 16;
		*len_s = size_to_fill;
		if (RAND_BUFF_MAX - g_rand_idx < size_to_fill)
			if (fill_buff() != SRP_OK) goto error_and_exit;
		*bytes_s = (unsigned char *)srp_alloc(size_to_fill);
		if (!*bytes_s) goto error_and_exit;
		memcpy(*bytes_s, g_rand_buff + g_rand_idx, size_to_fill);
		g_rand_idx += size_to_fill;
	}

	if (!calculate_x(
			x, alg, *bytes_s, *len_s, username_for_verifier, password, len_password))
		goto error_and_exit;

	srp_dbg_num(x, "Server calculated x: ");

	mpz_powm(v, ng->g, x, ng->N);

	*len_v = mpz_num_bytes(v);

	*bytes_v = (unsigned char *)srp_alloc(*len_v);

	if (!*bytes_v) goto error_and_exit;

	mpz_to_bin(v, *bytes_v);

cleanup_and_exit:
	delete_ng(ng);
	mpz_clear(v);
	mpz_clear(x);
	return ret;
error_and_exit:
	ret = SRP_ERR;
	goto cleanup_and_exit;
}
Ejemplo n.º 5
0
void srp_verifier_delete(struct SRPVerifier *ver)
{
	if (ver) {
		delete_ng(ver->ng);
		srp_free(ver->username);
		srp_free(ver->bytes_B);
		memset(ver, 0, sizeof(*ver));
		srp_free(ver);
	}
}
Ejemplo n.º 6
0
void srp_user_delete( struct SRPUser * usr )
{
    BN_free( usr->a );
    BN_free( usr->A );
    BN_free( usr->S );
    
    delete_ng( usr->ng );
    
    free((char *)usr->username);
    free((char *)usr->password);
    
    if (usr->bytes_A) 
        free( (char *)usr->bytes_A );
    
    free( usr );
}
Ejemplo n.º 7
0
void srp_create_salted_verification_key( SRP_HashAlgorithm alg, 
                                         SRP_NGType ng_type, const char * username,
                                         const unsigned char * password, int len_password,
                                         const unsigned char ** bytes_s, int * len_s, 
                                         const unsigned char ** bytes_v, int * len_v,
                                         const char * n_hex, const char * g_hex )
{
    BIGNUM     * s   = BN_new();
    BIGNUM     * v   = BN_new();
    BIGNUM     * x   = 0;
    BN_CTX     * ctx = BN_CTX_new();
    NGConstant * ng  = new_ng( ng_type, n_hex, g_hex );

    if( !s || !v || !ctx || !ng )
       goto cleanup_and_exit;

    init_random(); /* Only happens once */
    
    BN_rand(s, 32, -1, 0);
    
    x = calculate_x( alg, s, username, password, len_password );

    if( !x )
       goto cleanup_and_exit;

    BN_mod_exp(v, ng->g, x, ng->N, ctx);
        
    *len_s   = BN_num_bytes(s);
    *len_v   = BN_num_bytes(v);
    
    *bytes_s = (const unsigned char *) malloc( *len_s );
    *bytes_v = (const unsigned char *) malloc( *len_v );

    if (!bytes_s || !bytes_v)
       goto cleanup_and_exit;
    
    BN_bn2bin(s, (unsigned char *) *bytes_s);
    BN_bn2bin(v, (unsigned char *) *bytes_v);
    
 cleanup_and_exit:
    delete_ng( ng );
    BN_free(s);
    BN_free(v);
    BN_free(x);
    BN_CTX_free(ctx);
}
Ejemplo n.º 8
0
void srp_user_delete( struct SRPUser * usr )
{
   if( usr )
   {
      BN_free( usr->a );
      BN_free( usr->A );
      BN_free( usr->S );
      delete_ng( usr->ng );

      memset((void*)usr->password, 0, usr->password_len);
      free((char *)usr->username);
      free((char *)usr->password);
      if (usr->bytes_A)
         free( (char *)usr->bytes_A );

      memset(usr, 0, sizeof(*usr));
      free( usr );
   }
}
Ejemplo n.º 9
0
void srp_user_delete(struct SRPUser *usr)
{
	if (usr) {
		mpz_clear(usr->a);
		mpz_clear(usr->A);
		mpz_clear(usr->S);

		delete_ng(usr->ng);

		memset(usr->password, 0, usr->password_len);

		srp_free(usr->username);
		srp_free(usr->username_verifier);
		srp_free(usr->password);

		if (usr->bytes_A) srp_free(usr->bytes_A);

		memset(usr, 0, sizeof(*usr));
		srp_free(usr);
	}
}
Ejemplo n.º 10
0
void srp_user_delete( SRPUser * usr ) {
    if(usr) {
        delete_ng(usr->ng);
        BN_free(usr->a);
        BN_free(usr->A);
        BN_free(usr->S);
        memset((void*)usr->password, 0, usr->password_len);
        free((char *)usr->password);
        usr->password = NULL;
        free((char *)usr->username);
        usr->username = NULL;
        free((char *)usr->HAMK);
        usr->HAMK = NULL;
        free((char *)usr->Astr);
        usr->Astr = NULL;
        free((char *)usr->Sstr);
        usr->Sstr = NULL;
        free(usr);
        usr = NULL;
    }
}