Skip to content

Commit 637af70

Browse files
[api/core/service] Verify frame overflow at frame transfer layer
1 parent 1419aef commit 637af70

19 files changed

Lines changed: 57 additions & 35 deletions

.pre-commit-config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ repos:
1010
rev: v5.0.0
1111
hooks:
1212
- id: trailing-whitespace
13+
exclude: doc
1314
- id: end-of-file-fixer
1415
- id: mixed-line-ending
1516
args: [--fix=lf]

api/stse_device_management.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,7 @@ stse_ReturnCode_t stse_device_power_on(stse_Handler_t *pSTSE) {
149149
pSTSE->io.PowerLineOn(pSTSE->io.busID, pSTSE->io.Devaddr);
150150

151151
/* - Wait for device to boot (tboot) */
152-
switch (pSTSE->device_type)
153-
{
152+
switch (pSTSE->device_type) {
154153
#ifdef STSE_CONF_STSAFE_A_SUPPORT
155154
case STSAFE_A100:
156155
case STSAFE_A110:

api/stse_hash.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*****************************************************************************/
1717

1818
#include "api/stse_hash.h"
19+
#include "services/stsafea/stsafea_frame_transfer.h"
1920
#include "services/stsafea/stsafea_hash.h"
2021

2122
#if defined(STSE_CONF_HASH_SHA_1) || defined(STSE_CONF_HASH_SHA_224) || \

core/stse_platform.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ stse_ReturnCode_t stse_platform_ecc_generate_key_pair(stse_ecc_key_type_t key_ty
167167
* \param[in] digestLen Length of the digest
168168
* \param[out] pSignature Pointer to the signature buffer
169169
* \return \ref STSE_OK on success; \ref stse_ReturnCode_t error code otherwise
170+
* \warning Few specific cryptographic library required to have public key concatenated to private key for EdDSA mechanism. In such case, pPrivKey pointer shall reference concatenated key pair buffer's address.
170171
*/
171172
stse_ReturnCode_t stse_platform_ecc_sign(stse_ecc_key_type_t key_type,
172173
PLAT_UI8 *pPrivKey,

core/stse_return_codes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ enum stse_ReturnCode_t {
101101
STSE_SERVICE_INVALID_PARAMETER = 0x0301, /*!< STSE Wrong function parameters */
102102
STSE_SERVICE_HANDLER_NOT_INITIALISED, /*!< STSE is not initialized please run stsafe_init function first */
103103
STSE_SERVICE_SESSION_ERROR,
104-
STSE_SERVICE_BUFFER_OVERFLOW,
104+
STSE_SERVICE_FRAME_SIZE_ERROR,
105105
STSE_SERVICE_INVALID_CONFIGURATION,
106106

107107
/* - STSE API layer response code (MSB Mask 0x04xx)*/

services/stsafea/stsafea_commands.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,6 @@
2323

2424
#ifdef STSE_CONF_STSAFE_A_SUPPORT
2525

26-
const PLAT_UI16 stsafea_maximum_frame_length[STSAFEA_PRODUCT_COUNT] = {
27-
STSAFEA_MAX_FRAME_LENGTH_A100,
28-
STSAFEA_MAX_FRAME_LENGTH_A110,
29-
STSAFEA_MAX_FRAME_LENGTH_A120,
30-
STSAFEA_MAX_FRAME_LENGTH_A200,
31-
};
32-
3326
stse_ReturnCode_t stsafea_get_command_count(stse_Handler_t *pSTSE, PLAT_UI8 *pCommand_count) {
3427
PLAT_UI8 cmd_header = STSAFEA_CMD_QUERY;
3528
PLAT_UI8 tag = STSAFEA_SUBJECT_TAG_COMMAND_AUTHORIZATION_CONFIG;

services/stsafea/stsafea_commands.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@
3838
#define STSAFEA_TRUE 0b1
3939
#define STSAFEA_FALSE 0b0
4040

41-
#define STSAFEA_PRODUCT_COUNT 4U
42-
4341
#define STSAFEA_EXT_HEADER_SIZE 2U
4442
#define STSAFEA_HEADER_SIZE 1U
4543
#define STSAFEA_CMD_EXTENSION_SIZE 1U
@@ -132,8 +130,6 @@ typedef enum stsafea_extended_cmd_code_t {
132130
STSAFEA_EXTENDED_CMD_DECOMPRESS_PUBLIC_KEY /*!< STSAFE-A Decompress command code */
133131
} stsafea_extended_cmd_code_t;
134132

135-
extern const PLAT_UI16 stsafea_maximum_frame_length[STSAFEA_PRODUCT_COUNT];
136-
137133
stse_ReturnCode_t stsafea_get_command_count(stse_Handler_t *pSTSE, PLAT_UI8 *pCommand_count);
138134

139135
/**

services/stsafea/stsafea_data_partition.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ stse_ReturnCode_t stsafea_decrement_counter_zone(stse_Handler_t *pSTSE,
170170
stse_frame_element_allocate_push(&CmdFrame, eData, data_length, pData);
171171

172172
if (data_length >= stsafea_maximum_frame_length[pSTSE->device_type]) {
173-
return STSE_SERVICE_BUFFER_OVERFLOW;
173+
return STSE_SERVICE_FRAME_SIZE_ERROR;
174174
}
175175

176176
/*- Create Rsp frame and populate elements*/
@@ -239,7 +239,7 @@ stse_ReturnCode_t stsafea_read_counter_zone(stse_Handler_t *pSTSE,
239239
stse_frame_element_allocate_push(&CmdFrame, eLength, STSAFEA_ZONE_ACCESS_LENGTH_SIZE, (PLAT_UI8 *)&Associated_data_length);
240240

241241
if (Associated_data_length >= stsafea_maximum_frame_length[pSTSE->device_type]) {
242-
return STSE_SERVICE_BUFFER_OVERFLOW;
242+
return STSE_SERVICE_FRAME_SIZE_ERROR;
243243
}
244244

245245
/*- Create Rsp frame and populate elements*/
@@ -308,7 +308,7 @@ stse_ReturnCode_t stsafea_read_data_zone(stse_Handler_t *pSTSE,
308308
stse_frame_element_allocate_push(&CmdFrame, eLength, STSAFEA_ZONE_ACCESS_LENGTH_SIZE, (PLAT_UI8 *)&read_length);
309309

310310
if (read_length >= stsafea_maximum_frame_length[pSTSE->device_type]) {
311-
return STSE_SERVICE_BUFFER_OVERFLOW;
311+
return STSE_SERVICE_FRAME_SIZE_ERROR;
312312
}
313313

314314
/*- Create Rsp frame and populate elements*/
@@ -376,7 +376,7 @@ stse_ReturnCode_t stsafea_update_data_zone(stse_Handler_t *pSTSE,
376376
stse_frame_element_allocate_push(&CmdFrame, eData, data_length, pData);
377377

378378
if (data_length >= stsafea_maximum_frame_length[pSTSE->device_type]) {
379-
return STSE_SERVICE_BUFFER_OVERFLOW;
379+
return STSE_SERVICE_FRAME_SIZE_ERROR;
380380
}
381381

382382
/*- Create Rsp frame and populate elements*/

services/stsafea/stsafea_frame_transfer.c

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323

2424
#ifdef STSE_CONF_STSAFE_A_SUPPORT
2525

26+
const PLAT_UI16 stsafea_maximum_frame_length[STSAFEA_PRODUCT_COUNT] = {
27+
STSAFEA_MAX_FRAME_LENGTH_A100,
28+
STSAFEA_MAX_FRAME_LENGTH_A110,
29+
STSAFEA_MAX_FRAME_LENGTH_A120,
30+
STSAFEA_MAX_FRAME_LENGTH_A200,
31+
};
32+
2633
stse_ReturnCode_t stsafea_frame_transmit(stse_Handler_t *pSTSE, stse_frame_t *pFrame) {
2734
stse_ReturnCode_t ret = STSE_PLATFORM_BUS_ACK_ERROR;
2835
PLAT_UI16 retry_count = STSE_MAX_POLLING_RETRY;
@@ -32,11 +39,15 @@ stse_ReturnCode_t stsafea_frame_transmit(stse_Handler_t *pSTSE, stse_frame_t *pF
3239

3340
/*- Verify Parameters */
3441
if ((pSTSE == NULL) || (pFrame == NULL)) {
35-
return STSE_CORE_INVALID_PARAMETER;
42+
return STSE_SERVICE_INVALID_PARAMETER;
3643
}
3744
/*- Verify Frame length */
3845
if (pFrame->element_count == 0) {
39-
return STSE_CORE_INVALID_PARAMETER;
46+
return STSE_SERVICE_INVALID_PARAMETER;
47+
}
48+
/*- Verify Frame overflow */
49+
if (pFrame->length > stsafea_maximum_frame_length[pSTSE->device_type - STSAFE_A100]) {
50+
return STSE_SERVICE_FRAME_SIZE_ERROR;
4051
}
4152
/*- Compute frame crc */
4253
ret = stse_frame_crc16_compute(pFrame, &crc_ret);
@@ -162,6 +173,11 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
162173
/* - Store response Length */
163174
received_length = ((length_value[0] << 8) + length_value[1]) - STSE_FRAME_CRC_SIZE + STSE_RSP_FRAME_HEADER_SIZE;
164175

176+
/*- Verify Frame overflow */
177+
if (received_length > stsafea_maximum_frame_length[pSTSE->device_type - STSAFE_A100]) {
178+
return STSE_SERVICE_FRAME_SIZE_ERROR;
179+
}
180+
165181
if ((received_header & STSE_STSAFEA_RSP_STATUS_MASK) != STSE_OK) {
166182
while (pFrame->element_count > 1) {
167183
stse_frame_pop_element(pFrame);

services/stsafea/stsafea_frame_transfer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
#include "core/stse_return_codes.h"
3030
#include "core/stse_util.h"
3131

32+
#define STSAFEA_PRODUCT_COUNT 4U
33+
34+
extern const PLAT_UI16 stsafea_maximum_frame_length[STSAFEA_PRODUCT_COUNT];
35+
3236
/**
3337
* \brief Transmit frame from target STSAFE-Axxx
3438
* \details This core function prepare frame CRC and send frame to target STSAFE-Axxx device

0 commit comments

Comments
 (0)