diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-10-29 15:33:14 +0100 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-10-29 15:33:14 +0100 |
commit | 43567141422b99efed48a529fdef384be607fd78 (patch) | |
tree | 602c05b35423f476f59a7156702f32f3883a8a90 /src/handshake.c | |
parent | bb324029ad442a1f6dd7049a6e6fc1cbe4a05799 (diff) | |
download | fastd-43567141422b99efed48a529fdef384be607fd78.tar fastd-43567141422b99efed48a529fdef384be607fd78.zip |
Handle methods as strings
Diffstat (limited to 'src/handshake.c')
-rw-r--r-- | src/handshake.c | 51 |
1 files changed, 20 insertions, 31 deletions
diff --git a/src/handshake.c b/src/handshake.c index aecce23..5f25646 100644 --- a/src/handshake.c +++ b/src/handshake.c @@ -59,25 +59,17 @@ static const char *const REPLY_TYPES[REPLY_MAX] = { static uint8_t* create_method_list(fastd_context_t *ctx, size_t *len) { - *len = strlen(ctx->conf->methods[0]->name); + *len = strlen(ctx->conf->methods->str); - int i; - for (i = 1; i < MAX_METHODS; i++) { - if (!ctx->conf->methods[i]) - break; - - *len += strlen(ctx->conf->methods[i]->name) + 1; - } + fastd_string_stack_t *method; + for (method = ctx->conf->methods->next; method; method = method->next) + *len += strlen(method->str) + 1; uint8_t *ret = malloc(*len+1); char *ptr = (char*)ret; - for (i = 0; i < MAX_METHODS; i++) { - if (!ctx->conf->methods[i]) - break; - - ptr = stpcpy(ptr, ctx->conf->methods[i]->name) + 1; - } + for (method = ctx->conf->methods; method; method = method->next) + ptr = stpcpy(ptr, method->str) + 1; return ret; } @@ -93,14 +85,11 @@ static inline bool record_equal(const char *str, const fastd_handshake_record_t return string_equal(str, (const char*)record->data, record->length); } -static const fastd_method_t* method_from_name(fastd_context_t *ctx, const char *name, size_t n) { - int i; - for (i = 0; i < MAX_METHODS; i++) { - if (!ctx->conf->methods[i]) - break; - - if (string_equal(ctx->conf->methods[i]->name, name, n)) - return ctx->conf->methods[i]; +static const char* method_from_name(fastd_context_t *ctx, const char *name, size_t n) { + fastd_string_stack_t *method; + for (method = ctx->conf->methods; method; method = method->next) { + if (string_equal(method->str, name, n)) + return method->str; } return NULL; @@ -120,10 +109,10 @@ static fastd_string_stack_t* parse_string_list(const uint8_t *data, size_t len) return ret; } -static fastd_buffer_t new_handshake(fastd_context_t *ctx, uint8_t type, const fastd_method_t *method, bool with_method_list, size_t tail_space) { +static fastd_buffer_t new_handshake(fastd_context_t *ctx, uint8_t type, const char *method, bool with_method_list, size_t tail_space) { size_t version_len = strlen(FASTD_VERSION); size_t protocol_len = strlen(ctx->conf->protocol->name); - size_t method_len = method ? strlen(method->name) : 0; + size_t method_len = method ? strlen(method) : 0; size_t method_list_len = 0; uint8_t *method_list = NULL; @@ -152,7 +141,7 @@ static fastd_buffer_t new_handshake(fastd_context_t *ctx, uint8_t type, const fa fastd_handshake_add(ctx, &buffer, RECORD_PROTOCOL_NAME, protocol_len, ctx->conf->protocol->name); if (method && (!with_method_list || !ctx->conf->secure_handshakes)) - fastd_handshake_add(ctx, &buffer, RECORD_METHOD_NAME, method_len, method->name); + fastd_handshake_add(ctx, &buffer, RECORD_METHOD_NAME, method_len, method); if (with_method_list) { fastd_handshake_add(ctx, &buffer, RECORD_METHOD_LIST, method_list_len, method_list); @@ -166,10 +155,10 @@ fastd_buffer_t fastd_handshake_new_init(fastd_context_t *ctx, size_t tail_space) if (ctx->conf->secure_handshakes) return new_handshake(ctx, 1, NULL, false, tail_space); else - return new_handshake(ctx, 1, ctx->conf->method_default, true, tail_space); + return new_handshake(ctx, 1, "xsalsa20-poly1305" /* for backwards compatiblity with fastd 0.4 */, true, tail_space); } -fastd_buffer_t fastd_handshake_new_reply(fastd_context_t *ctx, const fastd_handshake_t *handshake, const fastd_method_t *method, bool with_method_list, size_t tail_space) { +fastd_buffer_t fastd_handshake_new_reply(fastd_context_t *ctx, const fastd_handshake_t *handshake, const char *method, bool with_method_list, size_t tail_space) { fastd_buffer_t buffer = new_handshake(ctx, handshake->type+1, method, with_method_list, tail_space); fastd_handshake_add_uint8(ctx, &buffer, RECORD_REPLY_CODE, 0); return buffer; @@ -307,15 +296,15 @@ static inline bool check_records(fastd_context_t *ctx, fastd_socket_t *sock, con return true; } -static inline const fastd_method_t* get_method(fastd_context_t *ctx, const fastd_handshake_t *handshake) { +static inline const char* get_method(fastd_context_t *ctx, const fastd_handshake_t *handshake) { if (handshake->records[RECORD_METHOD_LIST].data && handshake->records[RECORD_METHOD_LIST].length) { fastd_string_stack_t *method_list = parse_string_list(handshake->records[RECORD_METHOD_LIST].data, handshake->records[RECORD_METHOD_LIST].length); - const fastd_method_t *method = NULL; + const char *method = NULL; fastd_string_stack_t *method_name = method_list; while (method_name) { - const fastd_method_t *cur_method = method_from_name(ctx, method_name->str, SIZE_MAX); + const char *cur_method = method_from_name(ctx, method_name->str, SIZE_MAX); if (cur_method) method = cur_method; @@ -336,7 +325,7 @@ static inline const fastd_method_t* get_method(fastd_context_t *ctx, const fastd void fastd_handshake_handle(fastd_context_t *ctx, fastd_socket_t *sock, const fastd_peer_address_t *local_addr, const fastd_peer_address_t *remote_addr, fastd_peer_t *peer, fastd_buffer_t buffer) { char *peer_version = NULL; - const fastd_method_t *method = NULL; + const char *method = NULL; fastd_handshake_t handshake = parse_tlvs(&buffer); |