@@ -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+ 
4956static  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