Skip to content

Commit fe6c01b

Browse files
Refactor STUN mask generation to use memcpy
1 parent c3b8f1d commit fe6c01b

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

src/stun.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ static size_t align32(size_t len) {
4646
return len;
4747
}
4848

49+
static void generate_mask(const uint8_t *transaction_id, uint8_t *mask) {
50+
// mask is 16 bytes
51+
const uint32_t magic = htonl(STUN_MAGIC);
52+
memcpy(mask, (const uint8_t*)&magic, 4);
53+
memcpy(mask + 4, transaction_id, 12);
54+
}
55+
4956
static size_t generate_hmac_key(const stun_message_t *msg, const char *password, void *key) {
5057
if (*msg->credentials.realm != '\0') {
5158
// long-term credentials
@@ -127,8 +134,7 @@ int stun_write(void *buf, size_t size, const stun_message_t *msg, const char *pa
127134
JLOG_VERBOSE("Writing XOR mapped address");
128135
uint8_t value[32];
129136
uint8_t mask[16];
130-
*((uint32_t *)mask) = htonl(STUN_MAGIC);
131-
memcpy(mask + 4, msg->transaction_id, 12);
137+
generate_mask(msg->transaction_id, mask);
132138
int value_len = stun_write_value_mapped_address(
133139
value, 32, (const struct sockaddr *)&msg->mapped.addr, msg->mapped.len, mask);
134140
if (value_len > 0) {
@@ -188,8 +194,7 @@ int stun_write(void *buf, size_t size, const stun_message_t *msg, const char *pa
188194
JLOG_VERBOSE("Writing XOR peer address");
189195
uint8_t value[32];
190196
uint8_t mask[16];
191-
*((uint32_t *)mask) = htonl(STUN_MAGIC);
192-
memcpy(mask + 4, msg->transaction_id, 12);
197+
generate_mask(msg->transaction_id, mask);
193198
int value_len = stun_write_value_mapped_address(
194199
value, 32, (const struct sockaddr *)&peer->addr, peer->len, mask);
195200
if (value_len > 0) {
@@ -204,8 +209,7 @@ int stun_write(void *buf, size_t size, const stun_message_t *msg, const char *pa
204209
JLOG_VERBOSE("Writing XOR relay address");
205210
uint8_t value[32];
206211
uint8_t mask[16];
207-
*((uint32_t *)mask) = htonl(STUN_MAGIC);
208-
memcpy(mask + 4, msg->transaction_id, 12);
212+
generate_mask(msg->transaction_id, mask);
209213
int value_len = stun_write_value_mapped_address(
210214
value, 32, (const struct sockaddr *)&msg->relayed.addr, msg->relayed.len, mask);
211215
if (value_len > 0) {
@@ -650,8 +654,7 @@ int stun_read_attr(const void *data, size_t size, stun_message_t *msg, uint8_t *
650654
case STUN_ATTR_XOR_MAPPED_ADDRESS: {
651655
JLOG_VERBOSE("Reading XOR mapped address");
652656
uint8_t mask[16];
653-
*((uint32_t *)mask) = htonl(STUN_MAGIC);
654-
memcpy(mask + 4, msg->transaction_id, 12);
657+
generate_mask(msg->transaction_id, mask);
655658
if (stun_read_value_mapped_address(attr->value, length, &msg->mapped, mask) < 0)
656659
return -1;
657660
break;
@@ -950,8 +953,7 @@ int stun_read_attr(const void *data, size_t size, stun_message_t *msg, uint8_t *
950953
JLOG_VERBOSE("Reading XOR peer address");
951954
if (msg->peers_size < STUN_MAX_PEER_ADDRESSES) {
952955
uint8_t mask[16];
953-
*((uint32_t *)mask) = htonl(STUN_MAGIC);
954-
memcpy(mask + 4, msg->transaction_id, 12);
956+
generate_mask(msg->transaction_id, mask);
955957
addr_record_t *peer = msg->peers + msg->peers_size;
956958
if (stun_read_value_mapped_address(attr->value, length, peer, mask) < 0)
957959
return -1;
@@ -965,8 +967,7 @@ int stun_read_attr(const void *data, size_t size, stun_message_t *msg, uint8_t *
965967
case STUN_ATTR_XOR_RELAYED_ADDRESS: {
966968
JLOG_VERBOSE("Reading XOR relayed address");
967969
uint8_t mask[16];
968-
*((uint32_t *)mask) = htonl(STUN_MAGIC);
969-
memcpy(mask + 4, msg->transaction_id, 12);
970+
generate_mask(msg->transaction_id, mask);
970971
if (stun_read_value_mapped_address(attr->value, length, &msg->relayed, mask) < 0)
971972
return -1;
972973
break;

0 commit comments

Comments
 (0)