@@ -47,19 +47,41 @@ int wh_MessageAuth_TranslateSimpleResponse(uint16_t magic,
4747}
4848
4949int wh_MessageAuth_TranslateLoginRequest (uint16_t magic ,
50- const whMessageAuth_LoginRequest * src ,
51- whMessageAuth_LoginRequest * dest )
50+ const void * src_packet , uint16_t src_size ,
51+ whMessageAuth_LoginRequest * dest_header , uint8_t * dest_auth_data )
5252{
53- if ((src == NULL ) || (dest == NULL )) {
53+ const whMessageAuth_LoginRequest * src_header ;
54+ const uint8_t * src_data ;
55+ uint16_t header_size = sizeof (whMessageAuth_LoginRequest );
56+ uint16_t expected_size ;
57+
58+ if ((src_packet == NULL ) || (dest_header == NULL )) {
5459 return WH_ERROR_BADARGS ;
5560 }
5661
57- WH_T16 (magic , dest , src , method );
58- if (src != dest ) {
59- memcpy (dest -> username , src -> username , sizeof (dest -> username ));
60- memcpy (dest -> auth_data , src -> auth_data , src -> auth_data_len );
62+ if (src_size < header_size ) {
63+ return WH_ERROR_BADARGS ;
64+ }
65+
66+ src_header = (const whMessageAuth_LoginRequest * )src_packet ;
67+ src_data = (const uint8_t * )src_packet + header_size ;
68+
69+ WH_T16 (magic , dest_header , src_header , method );
70+ if (src_header != dest_header ) {
71+ memcpy (dest_header -> username , src_header -> username ,
72+ sizeof (dest_header -> username ));
73+ }
74+ WH_T16 (magic , dest_header , src_header , auth_data_len );
75+
76+ expected_size = (uint16_t )(header_size + dest_header -> auth_data_len );
77+ if (dest_header -> auth_data_len > WH_MESSAGE_AUTH_MAX_CREDENTIALS_LEN ||
78+ src_size < expected_size ) {
79+ return WH_ERROR_BADARGS ;
80+ }
81+
82+ if (dest_auth_data != NULL && dest_header -> auth_data_len > 0 ) {
83+ memcpy (dest_auth_data , src_data , dest_header -> auth_data_len );
6184 }
62- WH_T16 (magic , dest , src , auth_data_len );
6385 return 0 ;
6486}
6587
@@ -173,24 +195,44 @@ int wh_MessageAuth_UnflattenPermissions(uint8_t* buffer, uint16_t buffer_len,
173195
174196
175197int wh_MessageAuth_TranslateUserAddRequest (uint16_t magic ,
176- const whMessageAuth_UserAddRequest * src ,
177- whMessageAuth_UserAddRequest * dest )
198+ const void * src_packet , uint16_t src_size ,
199+ whMessageAuth_UserAddRequest * dest_header , uint8_t * dest_credentials )
178200{
179- if ((src == NULL ) || (dest == NULL )) {
201+ const whMessageAuth_UserAddRequest * src_header ;
202+ const uint8_t * src_data ;
203+ uint16_t header_size = sizeof (whMessageAuth_UserAddRequest );
204+ uint16_t expected_size ;
205+
206+ if ((src_packet == NULL ) || (dest_header == NULL )) {
180207 return WH_ERROR_BADARGS ;
181208 }
182209
183- if (src != dest ) {
184- memcpy (dest -> username , src -> username , sizeof (dest -> username ));
185- if (src -> credentials_len > WH_MESSAGE_AUTH_MAX_CREDENTIALS_LEN ) {
186- return WH_ERROR_BUFFER_SIZE ;
187- }
188- memcpy (dest -> credentials , src -> credentials , src -> credentials_len );
189- memcpy (dest -> permissions , src -> permissions , sizeof (dest -> permissions ));
210+ if (src_size < header_size ) {
211+ return WH_ERROR_BADARGS ;
190212 }
191213
192- WH_T16 (magic , dest , src , method );
193- WH_T16 (magic , dest , src , credentials_len );
214+ src_header = (const whMessageAuth_UserAddRequest * )src_packet ;
215+ src_data = (const uint8_t * )src_packet + header_size ;
216+
217+ if (src_header != dest_header ) {
218+ memcpy (dest_header -> username , src_header -> username ,
219+ sizeof (dest_header -> username ));
220+ memcpy (dest_header -> permissions , src_header -> permissions ,
221+ sizeof (dest_header -> permissions ));
222+ }
223+
224+ WH_T16 (magic , dest_header , src_header , method );
225+ WH_T16 (magic , dest_header , src_header , credentials_len );
226+
227+ expected_size = (uint16_t )(header_size + dest_header -> credentials_len );
228+ if (dest_header -> credentials_len > WH_MESSAGE_AUTH_MAX_CREDENTIALS_LEN ||
229+ src_size < expected_size ) {
230+ return WH_ERROR_BUFFER_SIZE ;
231+ }
232+
233+ if (dest_credentials != NULL && dest_header -> credentials_len > 0 ) {
234+ memcpy (dest_credentials , src_data , dest_header -> credentials_len );
235+ }
194236 return 0 ;
195237}
196238
0 commit comments