Skip to content

Commit c64f0f2

Browse files
updates for dynmaic size of credentials and auth data
1 parent 412e41e commit c64f0f2

5 files changed

Lines changed: 146 additions & 81 deletions

File tree

src/wh_client_auth.c

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,34 @@ int wh_Client_AuthLoginRequest(whClientContext* c,
4646
whAuthMethod method, const char* username, const void* auth_data,
4747
uint16_t auth_data_len)
4848
{
49-
whMessageAuth_LoginRequest msg = {0};
49+
uint8_t buffer[WOLFHSM_CFG_COMM_DATA_LEN] = {0};
50+
whMessageAuth_LoginRequest* msg = (whMessageAuth_LoginRequest*)buffer;
51+
uint8_t* msg_auth_data = buffer + sizeof(*msg);
52+
int msg_size;
5053

5154
if (c == NULL){
5255
return WH_ERROR_BADARGS;
5356
}
5457

55-
strncpy(msg.username, username, sizeof(msg.username));
56-
msg.method = method;
57-
msg.auth_data_len = auth_data_len;
58-
memcpy(msg.auth_data, auth_data, auth_data_len);
58+
if (auth_data_len > WH_MESSAGE_AUTH_MAX_CREDENTIALS_LEN) {
59+
return WH_ERROR_BADARGS;
60+
}
61+
62+
msg_size = (int)sizeof(*msg) + (int)auth_data_len;
63+
if (msg_size > WOLFHSM_CFG_COMM_DATA_LEN) {
64+
return WH_ERROR_BADARGS;
65+
}
66+
67+
strncpy(msg->username, username, sizeof(msg->username));
68+
msg->method = method;
69+
msg->auth_data_len = auth_data_len;
70+
if (auth_data_len > 0 && auth_data != NULL) {
71+
memcpy(msg_auth_data, auth_data, auth_data_len);
72+
}
73+
5974
return wh_Client_SendRequest(c,
6075
WH_MESSAGE_GROUP_AUTH, WH_MESSAGE_AUTH_ACTION_LOGIN,
61-
sizeof(msg), &msg);
76+
(uint16_t)msg_size, buffer);
6277
}
6378

6479
int wh_Client_AuthLoginResponse(whClientContext* c, int32_t *out_rc,
@@ -200,30 +215,38 @@ int wh_Client_AuthUserAddRequest(whClientContext* c, const char* username,
200215
whAuthPermissions permissions, whAuthMethod method,
201216
const void* credentials, uint16_t credentials_len)
202217
{
203-
whMessageAuth_UserAddRequest msg = {0};
218+
uint8_t buffer[WOLFHSM_CFG_COMM_DATA_LEN] = {0};
219+
whMessageAuth_UserAddRequest* msg = (whMessageAuth_UserAddRequest*)buffer;
220+
uint8_t* msg_credentials = buffer + sizeof(*msg);
221+
int msg_size;
204222

205223
if (c == NULL){
206224
return WH_ERROR_BADARGS;
207225
}
208226

209-
strncpy(msg.username, username, sizeof(msg.username));
227+
strncpy(msg->username, username, sizeof(msg->username));
210228

211-
if (wh_MessageAuth_FlattenPermissions(&permissions, msg.permissions,
212-
sizeof(msg.permissions)) != 0) {
229+
if (wh_MessageAuth_FlattenPermissions(&permissions, msg->permissions,
230+
sizeof(msg->permissions)) != 0) {
213231
return WH_ERROR_BUFFER_SIZE;
214232
}
215233

216-
msg.method = method;
217-
msg.credentials_len = credentials_len;
234+
msg->method = method;
235+
msg->credentials_len = credentials_len;
218236
if (credentials != NULL && credentials_len > 0) {
219237
if (credentials_len > WH_MESSAGE_AUTH_MAX_CREDENTIALS_LEN) {
220238
return WH_ERROR_BUFFER_SIZE;
221239
}
222-
memcpy(msg.credentials, credentials, credentials_len);
240+
memcpy(msg_credentials, credentials, credentials_len);
241+
}
242+
243+
msg_size = (int)sizeof(*msg) + (int)credentials_len;
244+
if (msg_size > WOLFHSM_CFG_COMM_DATA_LEN) {
245+
return WH_ERROR_BUFFER_SIZE;
223246
}
224247
return wh_Client_SendRequest(c,
225248
WH_MESSAGE_GROUP_AUTH, WH_MESSAGE_AUTH_ACTION_USER_ADD,
226-
sizeof(msg), &msg);
249+
(uint16_t)msg_size, buffer);
227250
}
228251

229252
int wh_Client_AuthUserAddResponse(whClientContext* c, int32_t *out_rc,

src/wh_message_auth.c

Lines changed: 62 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,41 @@ int wh_MessageAuth_TranslateSimpleResponse(uint16_t magic,
4747
}
4848

4949
int 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

175197
int 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

src/wh_server.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -355,11 +355,13 @@ int wh_Server_HandleRequestMessage(whServerContext* server)
355355
* group and action requested. When dealing with key ID's there should
356356
* be an additional authorization check after parsing the request and
357357
* translating the key ID and before it is used. */
358-
rc = wh_Auth_CheckRequestAuthorization(server->auth, group, action);
359-
if (rc != WH_ERROR_OK) {
360-
/* Authorization failed - send error response to client but keep server running */
361-
int32_t error_response = (int32_t)WH_AUTH_PERMISSION_ERROR;
362-
uint16_t resp_size = sizeof(error_response);
358+
/* Check authorization if auth context is configured */
359+
if (server->auth != NULL) {
360+
rc = wh_Auth_CheckRequestAuthorization(server->auth, group, action);
361+
if (rc != WH_ERROR_OK) {
362+
/* Authorization failed - send error response to client but keep server running */
363+
int32_t error_response = (int32_t)WH_AUTH_PERMISSION_ERROR;
364+
uint16_t resp_size = sizeof(error_response);
363365

364366
/* Translate the error response for endian conversion */
365367
error_response = (int32_t)wh_Translate32(magic, (uint32_t)error_response);
@@ -375,7 +377,8 @@ int wh_Server_HandleRequestMessage(whServerContext* server)
375377
"Authorization failed for (group=%d, action=%d, seq=%d)",
376378
group, action, seq);
377379

378-
return rc;
380+
return rc;
381+
}
379382
}
380383
#endif /* WOLFHSM_CFG_NO_AUTHENTICATION */
381384

src/wh_server_auth.c

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -72,27 +72,29 @@ int wh_Server_HandleAuthRequest(whServerContext* server,
7272
whMessageAuth_LoginRequest req = {0};
7373
whMessageAuth_LoginResponse resp = {0};
7474
int loggedIn = 0;
75-
76-
if (req_size != sizeof(req)) {
77-
/* Request is malformed */
78-
resp.rc = WH_ERROR_ABORTED;
79-
}
75+
uint8_t auth_data[WH_MESSAGE_AUTH_MAX_CREDENTIALS_LEN] = {0};
8076

8177
/* Parse the request */
82-
wh_MessageAuth_TranslateLoginRequest(magic, req_packet, &req);
78+
rc = wh_MessageAuth_TranslateLoginRequest(magic, req_packet, req_size,
79+
&req, auth_data);
80+
if (rc != WH_ERROR_OK) {
81+
resp.rc = rc;
82+
}
8383

8484
/* Login the user */
85-
rc = wh_Auth_Login(server->auth, server->comm->client_id, req.method,
86-
req.username, req.auth_data, req.auth_data_len, &loggedIn);
87-
resp.rc = rc;
88-
if (rc == WH_ERROR_OK) {
89-
if (loggedIn == 0) {
90-
resp.rc = WH_AUTH_LOGIN_FAILED;
91-
resp.user_id = WH_USER_ID_INVALID;
92-
}
93-
else {
94-
/* return the current logged in user info */
95-
resp.user_id = server->auth->user.user_id;
85+
if (resp.rc == WH_ERROR_OK) {
86+
rc = wh_Auth_Login(server->auth, server->comm->client_id, req.method,
87+
req.username, auth_data, req.auth_data_len, &loggedIn);
88+
resp.rc = rc;
89+
if (rc == WH_ERROR_OK) {
90+
if (loggedIn == 0) {
91+
resp.rc = WH_AUTH_LOGIN_FAILED;
92+
resp.user_id = WH_USER_ID_INVALID;
93+
}
94+
else {
95+
/* return the current logged in user info */
96+
resp.user_id = server->auth->user.user_id;
97+
}
9698
}
9799
}
98100
/* @TODO setting of permissions */
@@ -129,27 +131,22 @@ int wh_Server_HandleAuthRequest(whServerContext* server,
129131
whMessageAuth_UserAddRequest req = {0};
130132
whMessageAuth_UserAddResponse resp = {0};
131133
whAuthPermissions permissions = {0};
134+
uint8_t credentials[WH_MESSAGE_AUTH_MAX_CREDENTIALS_LEN] = {0};
132135

133-
if (req_size != sizeof(whMessageAuth_UserAddRequest)) {
134-
/* Request is malformed */
135-
resp.rc = WH_ERROR_BADARGS;
136-
} else {
137-
/* Parse the request */
138-
wh_MessageAuth_TranslateUserAddRequest(magic, req_packet, &req);
139-
140-
/* Validate credentials length */
141-
if (req.credentials_len > WH_MESSAGE_AUTH_MAX_CREDENTIALS_LEN) {
136+
/* Parse the request */
137+
rc = wh_MessageAuth_TranslateUserAddRequest(magic, req_packet, req_size,
138+
&req, credentials);
139+
if (rc != WH_ERROR_OK) {
140+
resp.rc = rc;
141+
} else {
142+
if (wh_MessageAuth_UnflattenPermissions(req.permissions,
143+
sizeof(req.permissions), &permissions) != 0) {
142144
resp.rc = WH_ERROR_BADARGS;
143145
} else {
144-
if (wh_MessageAuth_UnflattenPermissions(req.permissions,
145-
sizeof(req.permissions), &permissions) != 0) {
146-
resp.rc = WH_ERROR_BADARGS;
147-
} else {
148-
/* Add the user with credentials @TODO setting permissions */
149-
rc = wh_Auth_UserAdd(server->auth, req.username, &resp.user_id, permissions,
150-
req.method, req.credentials, req.credentials_len);
151-
resp.rc = rc;
152-
}
146+
/* Add the user with credentials @TODO setting permissions */
147+
rc = wh_Auth_UserAdd(server->auth, req.username, &resp.user_id, permissions,
148+
req.method, credentials, req.credentials_len);
149+
resp.rc = rc;
153150
}
154151
}
155152

wolfhsm/wh_message_auth.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,12 @@ typedef struct {
6767
uint16_t method;
6868
char username[WH_MESSAGE_AUTH_MAX_USERNAME_LEN];
6969
uint16_t auth_data_len;
70-
uint8_t auth_data[WH_MESSAGE_AUTH_MAX_CREDENTIALS_LEN];
70+
/* auth_data follows */
7171
} whMessageAuth_LoginRequest;
7272

7373
int wh_MessageAuth_TranslateLoginRequest(uint16_t magic,
74-
const whMessageAuth_LoginRequest* src,
75-
whMessageAuth_LoginRequest* dest);
74+
const void* src_packet, uint16_t src_size,
75+
whMessageAuth_LoginRequest* dest_header, uint8_t* dest_auth_data);
7676

7777
/** Login Response */
7878
typedef struct {
@@ -114,12 +114,12 @@ typedef struct {
114114
uint8_t permissions[WH_FLAT_PERRMISIONS_LEN];
115115
uint16_t method;
116116
uint16_t credentials_len;
117-
uint8_t credentials[WH_MESSAGE_AUTH_MAX_CREDENTIALS_LEN];
117+
/* credentials follow */
118118
} whMessageAuth_UserAddRequest;
119119

120120
int wh_MessageAuth_TranslateUserAddRequest(uint16_t magic,
121-
const whMessageAuth_UserAddRequest* src,
122-
whMessageAuth_UserAddRequest* dest);
121+
const void* src_packet, uint16_t src_size,
122+
whMessageAuth_UserAddRequest* dest_header, uint8_t* dest_credentials);
123123

124124
/** User Add Response */
125125
typedef struct {

0 commit comments

Comments
 (0)