mirror of
https://github.com/3proxy/3proxy.git
synced 2026-05-01 08:20:12 +08:00
110 lines
4.3 KiB
C
110 lines
4.3 KiB
C
#include "proxy.h"
|
|
#include "blake2_compat.h"
|
|
|
|
|
|
static void char_index2hash(const struct hashtable *ht, void *index, uint8_t *hash){
|
|
blake2b_state S;
|
|
|
|
blake2b_init(&S, ht->hash_size);
|
|
blake2b_update(&S, index, strlen((const char*)index) + 1);
|
|
blake2b_final(&S, hash, ht->hash_size);
|
|
}
|
|
|
|
static void param2hash_add(const struct hashtable *ht, void *index, uint8_t *hash){
|
|
blake2b_state S;
|
|
struct clientparam *param = (struct clientparam *)index;
|
|
unsigned type = param->srv->authcachetype;
|
|
|
|
blake2b_init(&S, ht->hash_size);
|
|
if((type & 2) && param->username)blake2b_update(&S, param->username, strlen((const char *)param->username) + 1);
|
|
if((type & 4) && param->password)blake2b_update(&S, param->password, strlen((const char *)param->password) + 1);
|
|
if((type & 1) && !(type & 8))blake2b_update(&S, SAADDR(¶m->sincr), SAADDRLEN(¶m->sincr));
|
|
if((type & 16))blake2b_update(&S, ¶m->srv->acl, sizeof(param->srv->acl));
|
|
if((type & 64))blake2b_update(&S, SAADDR(¶m->req), SAADDRLEN(¶m->req));
|
|
if((type & 128))blake2b_update(&S, SAPORT(¶m->req), 2);
|
|
if((type & 256) && param->hostname)blake2b_update(&S, param->hostname, strlen((const char *)param->hostname) + 1);
|
|
if((type & 512))blake2b_update(&S, ¶m->operation, sizeof(param->operation));
|
|
if((type & 1024))blake2b_update(&S, SAADDR(¶m->srv->intsa), SAADDRLEN(¶m->srv->intsa));
|
|
if((type & 2048))blake2b_update(&S, SAPORT(¶m->srv->intsa), 2);
|
|
blake2b_final(&S, hash, ht->hash_size);
|
|
memcpy(param->hash, hash, ht->hash_size);
|
|
}
|
|
|
|
void param2hash_search(const struct hashtable *ht, void *index, uint8_t *hash){
|
|
struct clientparam *param = (struct clientparam *)index;
|
|
|
|
memcpy(hash, param->hash, ht->hash_size);
|
|
}
|
|
|
|
static void user2hash_search(const struct hashtable *ht, void *index, uint8_t *hash){
|
|
struct clientparam *param = (struct clientparam *)index;
|
|
blake2b_state S;
|
|
|
|
blake2b_init(&S, ht->hash_size);
|
|
blake2b_update(&S, param->username, strlen((const char *)param->username) + 1);
|
|
blake2b_final(&S, hash, ht->hash_size);
|
|
}
|
|
|
|
static void udpparam2hash(const struct hashtable *ht, void *index, uint8_t *hash){
|
|
struct clientparam *param = (struct clientparam *)index;
|
|
blake2b_state S;
|
|
blake2b_init(&S, ht->hash_size);
|
|
blake2b_update(&S, SAADDR(¶m->srv->intsa), SAADDRLEN(¶m->srv->intsa));
|
|
blake2b_update(&S, SAPORT(¶m->srv->intsa), 2);
|
|
blake2b_update(&S, SAADDR(¶m->sincr), SAADDRLEN(¶m->sincr));
|
|
blake2b_update(&S, SAPORT(¶m->sincr), 2);
|
|
blake2b_final(&S, hash, ht->hash_size);
|
|
}
|
|
|
|
static void pw2hash_add(const struct hashtable *ht, void *index, uint8_t *hash){
|
|
char ** pw = (char **)index;
|
|
blake2b_state S;
|
|
|
|
blake2b_init(&S, ht->hash_size);
|
|
if(pw[0])blake2b_update(&S, pw[0], strlen(pw[0]) + 1);
|
|
if(pw[1])blake2b_update(&S, pw[1], strlen(pw[1]) + 1);
|
|
blake2b_final(&S, hash, ht->hash_size);
|
|
}
|
|
|
|
|
|
static void pw2hash_search(const struct hashtable *ht, void *index, uint8_t *hash){
|
|
struct clientparam *param = (struct clientparam *)index;
|
|
|
|
char *pw[2] = {(char *)param->username, (char *)param->password};
|
|
|
|
pw2hash_add(ht, pw, hash);
|
|
}
|
|
|
|
static void pwnt2hash_add(const struct hashtable *ht, void *index, uint8_t *hash){
|
|
char ** pw = (char **)index;
|
|
blake2b_state S;
|
|
|
|
blake2b_init(&S, ht->hash_size);
|
|
if(pw[0])blake2b_update(&S, pw[0], strlen(pw[0]) + 1);
|
|
if(pw[1])blake2b_update(&S, pw[1], strlen(pw[1]) + 1);
|
|
blake2b_final(&S, hash, ht->hash_size);
|
|
}
|
|
|
|
|
|
#ifdef WITH_SSL
|
|
static void pwnt2hash_search(const struct hashtable *ht, void *index, uint8_t *hash){
|
|
struct clientparam *param = (struct clientparam *)index;
|
|
unsigned char pass[40];
|
|
char *pw[2] = {(char *)param->username, (char *)pass};
|
|
|
|
ntpwdhash(pass, param->password, 1);
|
|
pwnt2hash_add(ht, pw, hash);
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
struct hashtable dns_table = {char_index2hash, char_index2hash, 4, 12};
|
|
struct hashtable dns6_table = {char_index2hash, char_index2hash, 16, 12};
|
|
struct hashtable auth_table = {param2hash_add, param2hash_search, sizeof(struct authcache), 12};
|
|
struct hashtable pw_table = {pw2hash_add, pw2hash_search, 0, 12};
|
|
#ifdef WITH_SSL
|
|
struct hashtable pwnt_table = {pwnt2hash_add, pwnt2hash_search, 0, 12};
|
|
#endif
|
|
struct hashtable pwcr_table = {char_index2hash, user2hash_search, 64, 12};
|