mirror of
https://gitlab.com/openconnect/ocserv.git
synced 2026-10-13 18:12:03 +08:00
use strtok() to parse client provided string.
This commit is contained in:
@@ -43,7 +43,8 @@ void str_clear(str_st * str)
|
||||
}
|
||||
|
||||
#define MIN_CHUNK 64
|
||||
|
||||
/* This function always null terminates the string in dest.
|
||||
*/
|
||||
int str_append_data(str_st * dest, const void *data, size_t data_size)
|
||||
{
|
||||
size_t tot_len = data_size + dest->length;
|
||||
@@ -51,7 +52,7 @@ int str_append_data(str_st * dest, const void *data, size_t data_size)
|
||||
if (data_size == 0)
|
||||
return 0;
|
||||
|
||||
if (dest->max_length >= tot_len) {
|
||||
if (dest->max_length >= tot_len+1) {
|
||||
size_t unused = MEMSUB(dest->data, dest->allocd);
|
||||
|
||||
if (dest->max_length - unused <= tot_len) {
|
||||
@@ -63,6 +64,7 @@ int str_append_data(str_st * dest, const void *data, size_t data_size)
|
||||
}
|
||||
memmove(&dest->data[dest->length], data, data_size);
|
||||
dest->length = tot_len;
|
||||
dest->data[dest->length] = 0;
|
||||
|
||||
return tot_len;
|
||||
} else {
|
||||
@@ -71,7 +73,7 @@ int str_append_data(str_st * dest, const void *data, size_t data_size)
|
||||
MAX(data_size, MIN_CHUNK) + MAX(dest->max_length,
|
||||
MIN_CHUNK);
|
||||
|
||||
dest->allocd = realloc(dest->allocd, new_len);
|
||||
dest->allocd = realloc(dest->allocd, new_len+1);
|
||||
if (dest->allocd == NULL)
|
||||
return ERR_MEM;
|
||||
dest->max_length = new_len;
|
||||
@@ -83,6 +85,7 @@ int str_append_data(str_st * dest, const void *data, size_t data_size)
|
||||
|
||||
memcpy(&dest->data[dest->length], data, data_size);
|
||||
dest->length = tot_len;
|
||||
dest->data[dest->length] = 0;
|
||||
|
||||
return tot_len;
|
||||
}
|
||||
|
||||
+32
-22
@@ -261,6 +261,8 @@ static void value_check(struct worker_st *ws, struct http_req_st *req)
|
||||
unsigned length;
|
||||
size_t nlen;
|
||||
uint8_t* p;
|
||||
char * token;
|
||||
char * str;
|
||||
|
||||
if (req->value.length <= 0)
|
||||
return;
|
||||
@@ -293,30 +295,38 @@ uint8_t* p;
|
||||
break;
|
||||
|
||||
case HEADER_DTLS_CIPHERSUITE:
|
||||
str = (char*)req->value.data;
|
||||
while ((token = strtok(str, ":")) != NULL) {
|
||||
#if GNUTLS_VERSION_NUMBER >= 0x030201
|
||||
if (memmem(req->value.data, req->value.length, "ESTREAM-SALSA20-UMAC96", 21) != NULL) {
|
||||
req->selected_ciphersuite = "ESTREAM-SALSA20-UMAC96";
|
||||
req->gnutls_ciphersuite = "NONE:+VERS-DTLS0.9:+COMP-NULL:+ESTREAM-SALSA20-256:+UMAC-96:+RSA:%COMPAT:%DISABLE_SAFE_RENEGOTIATION";
|
||||
req->gnutls_cipher = GNUTLS_CIPHER_ESTREAM_SALSA20_256;
|
||||
req->gnutls_mac = GNUTLS_MAC_UMAC_96;
|
||||
} else if (memmem(req->value.data, req->value.length, "SALSA20-UMAC96", 14) != NULL) {
|
||||
req->gnutls_ciphersuite = "NONE:+VERS-DTLS0.9:+COMP-NULL:+SALSA20-256:+UMAC-96:+RSA:%COMPAT:%DISABLE_SAFE_RENEGOTIATION";
|
||||
req->selected_ciphersuite = "SALSA20-UMAC96";
|
||||
req->gnutls_cipher = GNUTLS_CIPHER_SALSA20_256;
|
||||
req->gnutls_mac = GNUTLS_MAC_UMAC_96;
|
||||
} else
|
||||
if (strcmp(token, "ESTREAM-SALSA20-UMAC96") == 0) {
|
||||
req->selected_ciphersuite = "ESTREAM-SALSA20-UMAC96";
|
||||
req->gnutls_ciphersuite = "NONE:+VERS-DTLS0.9:+COMP-NULL:+ESTREAM-SALSA20-256:+UMAC-96:+RSA:%COMPAT:%DISABLE_SAFE_RENEGOTIATION";
|
||||
req->gnutls_cipher = GNUTLS_CIPHER_ESTREAM_SALSA20_256;
|
||||
req->gnutls_mac = GNUTLS_MAC_UMAC_96;
|
||||
break;
|
||||
} else if (strcmp(token, "SALSA20-UMAC96") == 0) {
|
||||
req->gnutls_ciphersuite = "NONE:+VERS-DTLS0.9:+COMP-NULL:+SALSA20-256:+UMAC-96:+RSA:%COMPAT:%DISABLE_SAFE_RENEGOTIATION";
|
||||
req->selected_ciphersuite = "SALSA20-UMAC96";
|
||||
req->gnutls_cipher = GNUTLS_CIPHER_SALSA20_256;
|
||||
req->gnutls_mac = GNUTLS_MAC_UMAC_96;
|
||||
break;
|
||||
} else
|
||||
#endif
|
||||
if (memmem(req->value.data, req->value.length, "AES128-SHA", 10) != NULL) {
|
||||
req->gnutls_ciphersuite = "NONE:+VERS-DTLS0.9:+COMP-NULL:+AES-128-CBC:+SHA1:+RSA:%COMPAT:%DISABLE_SAFE_RENEGOTIATION";
|
||||
req->selected_ciphersuite = "AES128-SHA";
|
||||
req->gnutls_cipher = GNUTLS_CIPHER_AES_128_CBC;
|
||||
req->gnutls_mac = GNUTLS_MAC_SHA1;
|
||||
} else if (memmem(req->value.data, req->value.length, "DES-CBC3-SHA", 11) != NULL) {
|
||||
req->gnutls_ciphersuite = "NONE:+VERS-DTLS0.9:+COMP-NULL:+3DES-CBC:+SHA1:+RSA:%COMPAT:%DISABLE_SAFE_RENEGOTIATION";
|
||||
req->selected_ciphersuite = "DES-CBC3-SHA";
|
||||
req->gnutls_cipher = GNUTLS_CIPHER_3DES_CBC;
|
||||
req->gnutls_mac = GNUTLS_MAC_SHA1;
|
||||
}
|
||||
if (strcmp(token, "AES128-SHA") == 0) {
|
||||
req->gnutls_ciphersuite = "NONE:+VERS-DTLS0.9:+COMP-NULL:+AES-128-CBC:+SHA1:+RSA:%COMPAT:%DISABLE_SAFE_RENEGOTIATION";
|
||||
req->selected_ciphersuite = "AES128-SHA";
|
||||
req->gnutls_cipher = GNUTLS_CIPHER_AES_128_CBC;
|
||||
req->gnutls_mac = GNUTLS_MAC_SHA1;
|
||||
break;
|
||||
} else if (strcmp(token, "DES-CBC3-SHA") == 0) {
|
||||
req->gnutls_ciphersuite = "NONE:+VERS-DTLS0.9:+COMP-NULL:+3DES-CBC:+SHA1:+RSA:%COMPAT:%DISABLE_SAFE_RENEGOTIATION";
|
||||
req->selected_ciphersuite = "DES-CBC3-SHA";
|
||||
req->gnutls_cipher = GNUTLS_CIPHER_3DES_CBC;
|
||||
req->gnutls_mac = GNUTLS_MAC_SHA1;
|
||||
break;
|
||||
}
|
||||
str = NULL;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user