This commit is contained in:
崔一鸣
2018-09-14 14:09:37 +08:00
committed by zhengchao
parent c1f8edb75f
commit aa4d83e464
3 changed files with 23 additions and 20 deletions

View File

@@ -181,9 +181,9 @@ char * ssl_wildcardify(const char *);
enum parse_chello_result enum parse_chello_result
{ {
PARSE_CHELLO_INVALID_FORMAT = 0, PARSE_CHELLO_SUCCESS = 0,
PARSE_CHELLO_NOT_ENOUGH_BUFF, PARSE_CHELLO_INVALID_FORMAT = -1,
PARSE_CHELLO_SUCCESS PARSE_CHELLO_NOT_ENOUGH_BUFF = -2
}; };
struct ssl_version struct ssl_version
@@ -194,8 +194,8 @@ struct ssl_version
struct ssl_chello struct ssl_chello
{ {
struct ssl_version record_layer_version; struct ssl_version min_version;
struct ssl_version chello_version; struct ssl_version max_version;
char* sni; char* sni;
char* alpn; char* alpn;
char* cipher_suites; char* cipher_suites;

View File

@@ -1941,7 +1941,7 @@ struct ssl_chello* ssl_chello_parse(const unsigned char* buff, size_t buff_len,
if(buff[0] == 0x80) if(buff[0] == 0x80)
{ {
struct ssl_chello* _chello = (struct ssl_chello*)ALLOC(struct ssl_chello, 1); struct ssl_chello* _chello = (struct ssl_chello*)ALLOC(struct ssl_chello, 1);
_chello->record_layer_version.major = 0x02; _chello->min_version.major = 0x02;
if(buff_len < 2) if(buff_len < 2)
{ {
*result = PARSE_CHELLO_NOT_ENOUGH_BUFF; *result = PARSE_CHELLO_NOT_ENOUGH_BUFF;
@@ -1973,8 +1973,8 @@ struct ssl_chello* ssl_chello_parse(const unsigned char* buff, size_t buff_len,
*result = PARSE_CHELLO_INVALID_FORMAT; *result = PARSE_CHELLO_INVALID_FORMAT;
return _chello; return _chello;
} }
_chello->chello_version.major = buff[pos]; _chello->max_version.major = buff[pos];
_chello->chello_version.minor = buff[pos + 1]; _chello->max_version.minor = buff[pos + 1];
*result = PARSE_CHELLO_SUCCESS; *result = PARSE_CHELLO_SUCCESS;
return _chello; return _chello;
} }
@@ -1991,10 +1991,10 @@ struct ssl_chello* ssl_chello_parse(const unsigned char* buff, size_t buff_len,
return NULL; return NULL;
} }
struct ssl_chello* _chello = (struct ssl_chello*)ALLOC(struct ssl_chello, 1); struct ssl_chello* _chello = (struct ssl_chello*)ALLOC(struct ssl_chello, 1);
_chello->record_layer_version.major = buff[1]; _chello->min_version.major = buff[1];
_chello->record_layer_version.minor = buff[2]; _chello->min_version.minor = buff[2];
_chello->chello_version.major = -1; _chello->max_version.major = -1;
_chello->chello_version.minor = -1; _chello->max_version.minor = -1;
_chello->sni = NULL; _chello->sni = NULL;
_chello->alpn = NULL; _chello->alpn = NULL;
_chello->cipher_suites = NULL; _chello->cipher_suites = NULL;
@@ -2024,8 +2024,8 @@ struct ssl_chello* ssl_chello_parse(const unsigned char* buff, size_t buff_len,
*result = PARSE_CHELLO_INVALID_FORMAT; *result = PARSE_CHELLO_INVALID_FORMAT;
return _chello; return _chello;
} }
_chello->chello_version.major = buff[pos]; _chello->max_version.major = buff[pos];
_chello->chello_version.minor = buff[pos+1]; _chello->max_version.minor = buff[pos+1];
pos += 34; pos += 34;
/* Session ID */ /* Session ID */
if (pos + 1 > buff_len) if (pos + 1 > buff_len)
@@ -2070,7 +2070,7 @@ struct ssl_chello* ssl_chello_parse(const unsigned char* buff, size_t buff_len,
len = (size_t)buff[pos]; len = (size_t)buff[pos];
pos += 1 + len; pos += 1 + len;
/* ssl 3.0, no extensions */ /* ssl 3.0, no extensions */
if(_chello->record_layer_version.major == 3 && _chello->record_layer_version.minor == 0) if(_chello->min_version.major == 3 && _chello->min_version.minor == 0)
{ {
if(pos == buff_len) if(pos == buff_len)
{ {

View File

@@ -46,7 +46,8 @@ int main()
enum parse_chello_result result; enum parse_chello_result result;
struct ssl_chello* chello = ssl_chello_parse(buff, buff_len, &result); struct ssl_chello* chello = ssl_chello_parse(buff, buff_len, &result);
printf("-----------------------------ssl2.0 only parse version --------------------------------\n"); printf("-----------------------------ssl2.0 only parse version --------------------------------\n");
printf("record layer version is %d, %d\n", chello->record_layer_version.major, chello->record_layer_version.minor); printf("result is %d\n", result);
printf("min version is %d, %d\n", chello->min_version.major, chello->min_version.minor);
printf("\n\n"); printf("\n\n");
ssl_chello_free(chello); ssl_chello_free(chello);
chello = NULL; chello = NULL;
@@ -68,8 +69,9 @@ int main()
enum parse_chello_result result1; enum parse_chello_result result1;
struct ssl_chello* chello1 = ssl_chello_parse(buff1, buff1_len, &result1); struct ssl_chello* chello1 = ssl_chello_parse(buff1, buff1_len, &result1);
printf("--------------------------------ssl3.0, no extensions --------------------------------\n"); printf("--------------------------------ssl3.0, no extensions --------------------------------\n");
printf("record layer version is %d, %d\n", chello1->record_layer_version.major, chello1->record_layer_version.minor); printf("result is %d\n", result1);
printf("client hello version: %d, %d\n", chello1->chello_version.major, chello1->chello_version.minor); printf("min version is %d, %d\n", chello1->min_version.major, chello1->min_version.minor);
printf("max version: %d, %d\n", chello1->max_version.major, chello1->max_version.minor);
printf("cipher suites is %s\n", chello1->cipher_suites); printf("cipher suites is %s\n", chello1->cipher_suites);
if(chello1->cipher_suites_tls13) if(chello1->cipher_suites_tls13)
{ {
@@ -139,8 +141,9 @@ int main()
enum parse_chello_result result2; enum parse_chello_result result2;
struct ssl_chello* chello2 = ssl_chello_parse(buff2, buff2_len, &result2); struct ssl_chello* chello2 = ssl_chello_parse(buff2, buff2_len, &result2);
printf("---------------------------tls1.2 --------------------------------\n"); printf("---------------------------tls1.2 --------------------------------\n");
printf("record layer version: %d, %d\n", chello2->record_layer_version.major, chello2->record_layer_version.minor); printf("result is %d\n", result2);
printf("client hello version: %d, %d\n", chello2->chello_version.major, chello2->chello_version.minor); printf("min version: %d, %d\n", chello2->min_version.major, chello2->min_version.minor);
printf("max version: %d, %d\n", chello2->max_version.major, chello2->max_version.minor);
printf("cipher suites: %s\n", chello2->cipher_suites); printf("cipher suites: %s\n", chello2->cipher_suites);
printf("cipher suites for tls1.3: %s\n", chello2->cipher_suites_tls13); printf("cipher suites for tls1.3: %s\n", chello2->cipher_suites_tls13);
printf("sni: %s\n", chello2->sni); printf("sni: %s\n", chello2->sni);