summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2013-08-15 04:03:44 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2013-08-15 04:03:44 +0200
commitd6085504ce305c9cd9e4ac3d2f408dbb9eac8aab (patch)
tree533b29cefd30cd7f009e7783bd0434ac53cbce56
parent1bb34487bfe7ecd074b42bafca055adfe89d14df (diff)
downloadfastd-d6085504ce305c9cd9e4ac3d2f408dbb9eac8aab.tar
fastd-d6085504ce305c9cd9e4ac3d2f408dbb9eac8aab.zip
Align sender key
Unaligned access might be a problem on some architectures, so it's better to copy it to an aligned buffer before further handling the handshake.
-rw-r--r--src/protocol_ec25519_fhmqvc.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/protocol_ec25519_fhmqvc.c b/src/protocol_ec25519_fhmqvc.c
index 75ad055..6f8b3b5 100644
--- a/src/protocol_ec25519_fhmqvc.c
+++ b/src/protocol_ec25519_fhmqvc.c
@@ -679,7 +679,7 @@ static void protocol_handshake_handle(fastd_context_t *ctx, fastd_socket_t *sock
pr_debug(ctx, "received handshake reply without receipient key from %P[%I]", peer, remote_addr);
return;
}
- else if(has_field(handshake, RECORD_RECEIPIENT_KEY, PUBLICKEYBYTES)) {
+ else if (has_field(handshake, RECORD_RECEIPIENT_KEY, PUBLICKEYBYTES)) {
if (memcmp(ctx->conf->protocol_config->public_key.p, handshake->records[RECORD_RECEIPIENT_KEY].data, PUBLICKEYBYTES) != 0) {
pr_debug(ctx, "received protocol handshake with wrong receipient key from %P[%I]", peer, remote_addr);
return;
@@ -691,6 +691,9 @@ static void protocol_handshake_handle(fastd_context_t *ctx, fastd_socket_t *sock
return;
}
+ ecc_int256_t peer_handshake_key;
+ memcpy(peer_handshake_key.p, handshake->records[RECORD_SENDER_HANDSHAKE_KEY].data, PUBLICKEYBYTES);
+
if (handshake->type > 1 && !has_field(handshake, RECORD_RECEIPIENT_HANDSHAKE_KEY, PUBLICKEYBYTES)) {
pr_debug(ctx, "received handshake reply without receipient handshake key from %P[%I]", peer, remote_addr);
return;
@@ -701,7 +704,7 @@ static void protocol_handshake_handle(fastd_context_t *ctx, fastd_socket_t *sock
return;
}
- switch(handshake->type) {
+ switch (handshake->type) {
case 1:
if (timespec_diff(&ctx->now, &peer->last_handshake_response) < ctx->conf->min_handshake_interval*1000
&& fastd_peer_address_equal(remote_addr, &peer->last_handshake_response_address)) {
@@ -717,7 +720,7 @@ static void protocol_handshake_handle(fastd_context_t *ctx, fastd_socket_t *sock
peer->last_handshake_response = ctx->now;
peer->last_handshake_response_address = *remote_addr;
- respond_handshake(ctx, sock, local_addr, remote_addr, peer, &ctx->protocol_state->handshake_key, handshake->records[RECORD_SENDER_HANDSHAKE_KEY].data, handshake, method);
+ respond_handshake(ctx, sock, local_addr, remote_addr, peer, &ctx->protocol_state->handshake_key, &peer_handshake_key, handshake, method);
break;
case 2:
@@ -738,7 +741,7 @@ static void protocol_handshake_handle(fastd_context_t *ctx, fastd_socket_t *sock
pr_verbose(ctx, "received handshake response from %P[%I] using fastd %s", peer, remote_addr, peer_version_name);
free(peer_version_name);
- finish_handshake(ctx, sock, local_addr, remote_addr, peer, handshake_key, handshake->records[RECORD_SENDER_HANDSHAKE_KEY].data, handshake, method);
+ finish_handshake(ctx, sock, local_addr, remote_addr, peer, handshake_key, &peer_handshake_key, handshake, method);
break;
case 3:
@@ -755,7 +758,7 @@ static void protocol_handshake_handle(fastd_context_t *ctx, fastd_socket_t *sock
pr_debug(ctx, "received handshake finish from %P[%I]", peer, remote_addr);
- handle_finish_handshake(ctx, sock, local_addr, remote_addr, peer, handshake_key, handshake->records[RECORD_SENDER_HANDSHAKE_KEY].data, handshake, method);
+ handle_finish_handshake(ctx, sock, local_addr, remote_addr, peer, handshake_key, &peer_handshake_key, handshake, method);
break;
default: