Skip to content

Commit

Permalink
Merge branch 'mac' into 'develop'
Browse files Browse the repository at this point in the history
MAC-and-destroy l3 commands

See merge request internal/sw-design/libtropic!52
  • Loading branch information
Pavel Polach committed Nov 27, 2024
2 parents bc186c3 + d084830 commit 51a9a93
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 19 deletions.
20 changes: 19 additions & 1 deletion examples/hw_wallet/TROPIC01_hw_wallet.c
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ static uint32_t TROPIC01_config[27] = {
TO_LT_MCOUNTER_8_11(SESSION_H3_HAS_ACCESS) |
TO_LT_MCOUNTER_12_15(SESSION_H3_HAS_ACCESS)),
//------- CONFIGURATION_OBJECTS_TODO -----------------------
(0),
(0xffffffff),
//------- CONFIGURATION_OBJECTS_CFG_UAP_SERIAL_CODE_GET -----------------------
(0),
};
Expand Down Expand Up @@ -490,6 +490,12 @@ static int session_H1(void)
LOG_OUT_SESSION("%s", "lt_ping() ");
LT_ASSERT(LT_OK, lt_ping(&h, out, in, 100));

LOG_OUT_SESSION("%s", "Macand: ");
uint8_t data_in[32] = {0};
uint8_t data_out[32] = {0};
memset(data_out, 0xab, 32);
LT_ASSERT(LT_OK, lt_mac_and_destroy(&h, MAC_AND_DESTROY_SLOT_0, data_out, data_in));

uint8_t attestation_key[32] = {0x22,0x57,0xa8,0x2f,0x85,0x8f,0x13,0x32,0xfa,0x0f,0xf6,0x0c,0x76,0x29,0x42,0x70,0xa9,0x58,0x9d,0xfd,0x47,0xa5,0x23,0x78,0x18,0x4d,0x2d,0x38,0xf0,0xa7,0xc4,0x01};
LOG_OUT_SESSION("%s", "Storing attestation key into slot 0");
LT_ASSERT(LT_OK, lt_ecc_key_store(&h, ECC_SLOT_0, CURVE_ED25519, attestation_key));
Expand Down Expand Up @@ -537,6 +543,12 @@ static int session_H2(void)
LOG_OUT_SESSION("%s", "lt_ping() ");
LT_ASSERT(LT_OK, lt_ping(&h, out, in, 100));

LOG_OUT_SESSION("%s", "Macand: ");
uint8_t data_in[32] = {0};
uint8_t data_out[32] = {0};
memset(data_out, 0xab, 32);
LT_ASSERT(LT_OK, lt_mac_and_destroy(&h, MAC_AND_DESTROY_SLOT_0, data_out, data_in));

uint8_t serial_code[SERIAL_CODE_SIZE] = {0};
LOG_OUT_SESSION("%s","Serial code get must fail");
LT_ASSERT(LT_L3_UNAUTHORIZED, lt_serial_code_get(&h, serial_code, SERIAL_CODE_SIZE));
Expand Down Expand Up @@ -595,6 +607,12 @@ static int session_H3(void)
uint8_t out[100];
LT_ASSERT(LT_OK, lt_ping(&h, out, in, 100));

LOG_OUT_SESSION("%s", "Macand: ");
uint8_t data_in[32] = {0};
uint8_t data_out[32] = {0};
memset(data_out, 0xab, 32);
LT_ASSERT(LT_OK, lt_mac_and_destroy(&h, MAC_AND_DESTROY_SLOT_0, data_out, data_in));

// Sign with attestation key which was updated through session keys H1
LOG_OUT_SESSION("%s", "lt_ecc_eddsa_sign() ");
uint8_t msg[] = {'a', 'h', 'o', 'j'};
Expand Down
51 changes: 51 additions & 0 deletions include/libtropic.h
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,57 @@ lt_ret_t lt_mcounter_update(lt_handle_t *h, const enum lt_mcounter_index_t mcou
*/
lt_ret_t lt_mcounter_get(lt_handle_t *h, const enum lt_mcounter_index_t mcounter_index, uint32_t *mcounter_value);

//--------------------------------------------------------------------------------------------------------------------//
/** @brief Maximal size of returned MAC-and-Destroy data */
#define MAC_AND_DESTROY_DATA_SIZE 32u

/** @brief Mac-and-Destroy slot indexes */
typedef enum {
MAC_AND_DESTROY_SLOT_0 = 0, MAC_AND_DESTROY_SLOT_1, MAC_AND_DESTROY_SLOT_2, MAC_AND_DESTROY_SLOT_3,
MAC_AND_DESTROY_SLOT_4, MAC_AND_DESTROY_SLOT_5, MAC_AND_DESTROY_SLOT_6, MAC_AND_DESTROY_SLOT_7,
MAC_AND_DESTROY_SLOT_8, MAC_AND_DESTROY_SLOT_9, MAC_AND_DESTROY_SLOT_10, MAC_AND_DESTROY_SLOT_11,
MAC_AND_DESTROY_SLOT_12, MAC_AND_DESTROY_SLOT_13, MAC_AND_DESTROY_SLOT_14, MAC_AND_DESTROY_SLOT_15,
MAC_AND_DESTROY_SLOT_16, MAC_AND_DESTROY_SLOT_17, MAC_AND_DESTROY_SLOT_18, MAC_AND_DESTROY_SLOT_19,
MAC_AND_DESTROY_SLOT_20, MAC_AND_DESTROY_SLOT_21, MAC_AND_DESTROY_SLOT_22, MAC_AND_DESTROY_SLOT_23,
MAC_AND_DESTROY_SLOT_24, MAC_AND_DESTROY_SLOT_25, MAC_AND_DESTROY_SLOT_26, MAC_AND_DESTROY_SLOT_27,
MAC_AND_DESTROY_SLOT_28, MAC_AND_DESTROY_SLOT_29, MAC_AND_DESTROY_SLOT_30, MAC_AND_DESTROY_SLOT_31,
MAC_AND_DESTROY_SLOT_32, MAC_AND_DESTROY_SLOT_33, MAC_AND_DESTROY_SLOT_34, MAC_AND_DESTROY_SLOT_35,
MAC_AND_DESTROY_SLOT_36, MAC_AND_DESTROY_SLOT_37, MAC_AND_DESTROY_SLOT_38, MAC_AND_DESTROY_SLOT_39,
MAC_AND_DESTROY_SLOT_40, MAC_AND_DESTROY_SLOT_41, MAC_AND_DESTROY_SLOT_42, MAC_AND_DESTROY_SLOT_43,
MAC_AND_DESTROY_SLOT_44, MAC_AND_DESTROY_SLOT_45, MAC_AND_DESTROY_SLOT_46, MAC_AND_DESTROY_SLOT_47,
MAC_AND_DESTROY_SLOT_48, MAC_AND_DESTROY_SLOT_49, MAC_AND_DESTROY_SLOT_50, MAC_AND_DESTROY_SLOT_51,
MAC_AND_DESTROY_SLOT_52, MAC_AND_DESTROY_SLOT_53, MAC_AND_DESTROY_SLOT_54, MAC_AND_DESTROY_SLOT_55,
MAC_AND_DESTROY_SLOT_56, MAC_AND_DESTROY_SLOT_57, MAC_AND_DESTROY_SLOT_58, MAC_AND_DESTROY_SLOT_59,
MAC_AND_DESTROY_SLOT_60, MAC_AND_DESTROY_SLOT_61, MAC_AND_DESTROY_SLOT_62, MAC_AND_DESTROY_SLOT_63,
MAC_AND_DESTROY_SLOT_64, MAC_AND_DESTROY_SLOT_65, MAC_AND_DESTROY_SLOT_66, MAC_AND_DESTROY_SLOT_67,
MAC_AND_DESTROY_SLOT_68, MAC_AND_DESTROY_SLOT_69, MAC_AND_DESTROY_SLOT_70, MAC_AND_DESTROY_SLOT_71,
MAC_AND_DESTROY_SLOT_72, MAC_AND_DESTROY_SLOT_73, MAC_AND_DESTROY_SLOT_74, MAC_AND_DESTROY_SLOT_75,
MAC_AND_DESTROY_SLOT_76, MAC_AND_DESTROY_SLOT_77, MAC_AND_DESTROY_SLOT_78, MAC_AND_DESTROY_SLOT_79,
MAC_AND_DESTROY_SLOT_80, MAC_AND_DESTROY_SLOT_81, MAC_AND_DESTROY_SLOT_82, MAC_AND_DESTROY_SLOT_83,
MAC_AND_DESTROY_SLOT_84, MAC_AND_DESTROY_SLOT_85, MAC_AND_DESTROY_SLOT_86, MAC_AND_DESTROY_SLOT_87,
MAC_AND_DESTROY_SLOT_88, MAC_AND_DESTROY_SLOT_89, MAC_AND_DESTROY_SLOT_90, MAC_AND_DESTROY_SLOT_91,
MAC_AND_DESTROY_SLOT_92, MAC_AND_DESTROY_SLOT_93, MAC_AND_DESTROY_SLOT_94, MAC_AND_DESTROY_SLOT_95,
MAC_AND_DESTROY_SLOT_96, MAC_AND_DESTROY_SLOT_97, MAC_AND_DESTROY_SLOT_98, MAC_AND_DESTROY_SLOT_99,
MAC_AND_DESTROY_SLOT_100, MAC_AND_DESTROY_SLOT_101, MAC_AND_DESTROY_SLOT_102, MAC_AND_DESTROY_SLOT_103,
MAC_AND_DESTROY_SLOT_104, MAC_AND_DESTROY_SLOT_105, MAC_AND_DESTROY_SLOT_106, MAC_AND_DESTROY_SLOT_107,
MAC_AND_DESTROY_SLOT_108, MAC_AND_DESTROY_SLOT_109, MAC_AND_DESTROY_SLOT_110, MAC_AND_DESTROY_SLOT_111,
MAC_AND_DESTROY_SLOT_112, MAC_AND_DESTROY_SLOT_113, MAC_AND_DESTROY_SLOT_114, MAC_AND_DESTROY_SLOT_115,
MAC_AND_DESTROY_SLOT_116, MAC_AND_DESTROY_SLOT_117, MAC_AND_DESTROY_SLOT_118, MAC_AND_DESTROY_SLOT_119,
MAC_AND_DESTROY_SLOT_120, MAC_AND_DESTROY_SLOT_121, MAC_AND_DESTROY_SLOT_122, MAC_AND_DESTROY_SLOT_123,
MAC_AND_DESTROY_SLOT_124, MAC_AND_DESTROY_SLOT_125, MAC_AND_DESTROY_SLOT_126, MAC_AND_DESTROY_SLOT_127
} mac_and_destroy_slot_t;

/**
* @brief Execute the MAC-and-Destroy sequence.
*
* @param h Device's handle
* @param slot Mac-and-Destroy slot index, valid values are 0-127
* @param data_out Data to be sent into chip
* @param data_in Mac and destroy returned data
* @return LT_OK if success, otherwise returns other error code.
*/
lt_ret_t lt_mac_and_destroy(lt_handle_t *h, mac_and_destroy_slot_t slot, const uint8_t *data_out, uint8_t *data_in);

//--------------------------------------------------------------------------------------------------------------------//
/** @brief Maximal size of returned serial code */
#define SERIAL_CODE_SIZE 32u
Expand Down
73 changes: 55 additions & 18 deletions src/libtropic.c
Original file line number Diff line number Diff line change
Expand Up @@ -528,7 +528,7 @@ lt_ret_t lt_ping(lt_handle_t *h, const uint8_t *msg_out, uint8_t *msg_in, const

// Pointer to access l3 buffer when it contains command data
struct lt_l3_ping_cmd_t* p_l3_cmd = (struct lt_l3_ping_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_ping_res_t* p_l3_res = (struct lt_l3_ping_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -566,7 +566,7 @@ lt_ret_t lt_pairing_key_write(lt_handle_t *h, const uint8_t *pubkey, const uint8

// Pointer to access l3 buffer when it contains command data
struct lt_l3_pairing_key_write_cmd_t * p_l3_cmd = (struct lt_l3_pairing_key_write_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_pairing_key_write_res_t* p_l3_res = (struct lt_l3_pairing_key_write_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -602,7 +602,7 @@ lt_ret_t lt_pairing_key_read(lt_handle_t *h, uint8_t *pubkey, const uint8_t slot

// Pointer to access l3 buffer when it contains command data
struct lt_l3_pairing_key_read_cmd_t * p_l3_cmd = (struct lt_l3_pairing_key_read_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_pairing_key_read_res_t* p_l3_res = (struct lt_l3_pairing_key_read_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -638,7 +638,7 @@ lt_ret_t lt_pairing_key_invalidate(lt_handle_t *h, const uint8_t slot)

// Pointer to access l3 buffer when it contains command data
struct lt_l3_pairing_key_invalidate_cmd_t * p_l3_cmd = (struct lt_l3_pairing_key_invalidate_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_pairing_key_invalidate_res_t* p_l3_res = (struct lt_l3_pairing_key_invalidate_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -889,7 +889,7 @@ lt_ret_t lt_r_mem_data_write(lt_handle_t *h, const uint16_t udata_slot, uint8_t

// Pointer to access l3 buffer when it contains command data
struct lt_l3_r_mem_data_write_cmd_t * p_l3_cmd = (struct lt_l3_r_mem_data_write_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_r_mem_data_write_res_t* p_l3_res = (struct lt_l3_r_mem_data_write_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -926,7 +926,7 @@ lt_ret_t lt_r_mem_data_read(lt_handle_t *h, const uint16_t udata_slot, uint8_t *

// Pointer to access l3 buffer when it contains command data
struct lt_l3_r_mem_data_read_cmd_t * p_l3_cmd = (struct lt_l3_r_mem_data_read_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_r_mem_data_read_res_t* p_l3_res = (struct lt_l3_r_mem_data_read_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -961,7 +961,7 @@ lt_ret_t lt_r_mem_data_erase(lt_handle_t *h, const uint16_t udata_slot)

// Pointer to access l3 buffer when it contains command data
struct lt_l3_r_mem_data_erase_cmd_t * p_l3_cmd = (struct lt_l3_r_mem_data_erase_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_r_mem_data_erase_res_t* p_l3_res = (struct lt_l3_r_mem_data_erase_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -996,7 +996,7 @@ lt_ret_t lt_random_get(lt_handle_t *h, uint8_t *buff, const uint16_t len)

// Pointer to access l3 buffer when it contains command data
struct lt_l3_random_value_get_cmd_t* p_l3_cmd = (struct lt_l3_random_value_get_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_random_value_get_res_t* p_l3_res = (struct lt_l3_random_value_get_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -1034,7 +1034,7 @@ lt_ret_t lt_ecc_key_generate(lt_handle_t *h, const ecc_slot_t slot, const lt_ecc

// Pointer to access l3 buffer when it contains command data
struct lt_l3_ecc_key_generate_cmd_t* p_l3_cmd = (struct lt_l3_ecc_key_generate_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_ecc_key_generate_res_t* p_l3_res = (struct lt_l3_ecc_key_generate_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -1072,7 +1072,7 @@ lt_ret_t lt_ecc_key_store(lt_handle_t *h, const ecc_slot_t slot, const lt_ecc_cu

// Pointer to access l3 buffer when it contains command data
struct lt_l3_ecc_key_store_cmd_t* p_l3_cmd = (struct lt_l3_ecc_key_store_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_ecc_key_store_res_t* p_l3_res = (struct lt_l3_ecc_key_store_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -1115,7 +1115,7 @@ lt_ret_t lt_ecc_key_read(lt_handle_t *h, const ecc_slot_t slot, uint8_t *key, co

// Pointer to access l3 buffer when it contains command data
struct lt_l3_ecc_key_read_cmd_t* p_l3_cmd = (struct lt_l3_ecc_key_read_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_ecc_key_read_res_t* p_l3_res = (struct lt_l3_ecc_key_read_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -1164,7 +1164,7 @@ lt_ret_t lt_ecc_key_erase(lt_handle_t *h, const ecc_slot_t slot)

// Setup a pointer to l3 buffer, which is placed in handle
struct lt_l3_ecc_key_erase_cmd_t* p_l3_cmd = (struct lt_l3_ecc_key_erase_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_ecc_key_erase_res_t* p_l3_res = (struct lt_l3_ecc_key_erase_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -1210,7 +1210,7 @@ lt_ret_t lt_ecc_ecdsa_sign(lt_handle_t *h, const ecc_slot_t slot, const uint8_t

// Pointer to access l3 buffer when it contains command data
struct lt_l3_ecdsa_sign_cmd_t* p_l3_cmd = (struct lt_l3_ecdsa_sign_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_ecdsa_sign_res_t* p_l3_res = (struct lt_l3_ecdsa_sign_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -1253,7 +1253,7 @@ lt_ret_t lt_ecc_eddsa_sign(lt_handle_t *h, const ecc_slot_t slot, const uint8_t

// Pointer to access l3 buffer when it contains command data
struct lt_l3_eddsa_sign_cmd_t* p_l3_cmd = (struct lt_l3_eddsa_sign_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_eddsa_sign_res_t* p_l3_res = (struct lt_l3_eddsa_sign_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -1309,7 +1309,7 @@ lt_ret_t lt_mcounter_init(lt_handle_t *h, const enum lt_mcounter_index_t mcount

// Setup a pointer to l3 buffer, which is placed in handle
struct lt_l3_mcounter_init_cmd_t* p_l3_cmd = (struct lt_l3_mcounter_init_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_mcounter_init_res_t* p_l3_res = (struct lt_l3_mcounter_init_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -1343,7 +1343,7 @@ lt_ret_t lt_mcounter_update(lt_handle_t *h, const enum lt_mcounter_index_t mcou

// Setup a pointer to l3 buffer, which is placed in handle
struct lt_l3_mcounter_update_cmd_t* p_l3_cmd = (struct lt_l3_mcounter_update_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_mcounter_update_res_t* p_l3_res = (struct lt_l3_mcounter_update_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down Expand Up @@ -1378,7 +1378,7 @@ lt_ret_t lt_mcounter_get(lt_handle_t *h, const enum lt_mcounter_index_t mcounte

// Setup a pointer to l3 buffer, which is placed in handle
struct lt_l3_mcounter_get_cmd_t* p_l3_cmd = (struct lt_l3_mcounter_get_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_mcounter_get_res_t* p_l3_res = (struct lt_l3_mcounter_get_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand All @@ -1401,6 +1401,43 @@ lt_ret_t lt_mcounter_get(lt_handle_t *h, const enum lt_mcounter_index_t mcounte
return LT_OK;
}

lt_ret_t lt_mac_and_destroy(lt_handle_t *h, mac_and_destroy_slot_t slot, const uint8_t *data_out, uint8_t *data_in)
{
if( !h
|| !data_out
|| !data_in
|| slot > MAC_AND_DESTROY_SLOT_127
) {
return LT_PARAM_ERR;
}
if(h->session != SESSION_ON) {
return LT_HOST_NO_SESSION;
}

// Setup a pointer to l3 buffer, which is placed in handle
struct lt_l3_mac_and_destroy_cmd_t * p_l3_cmd = (struct lt_l3_mac_and_destroy_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result's data
struct lt_l3_mac_and_destroy_res_t* p_l3_res = (struct lt_l3_mac_and_destroy_res_t*)&h->l3_buff;

// Fill l3 buffer
p_l3_cmd->cmd_size = LT_L3_MAC_AND_DESTROY_CMD_SIZE;
p_l3_cmd->cmd_id = LT_L3_MAC_AND_DESTROY_CMD_ID;
memcpy(p_l3_cmd->data_in, data_out, MAC_AND_DESTROY_DATA_SIZE);
lt_ret_t ret = lt_l3_cmd(h);
if(ret != LT_OK) {
return ret;
}

// Check incomming l3 length
if(LT_L3_MAC_AND_DESTROY_RES_SIZE != (p_l3_res->res_size)) {
return LT_FAIL;
}

memcpy(data_in, p_l3_res->data_out, MAC_AND_DESTROY_DATA_SIZE);

return LT_OK;
}

lt_ret_t lt_serial_code_get(lt_handle_t *h, uint8_t *serial_code, const uint16_t size)
{
if( !h
Expand All @@ -1415,7 +1452,7 @@ lt_ret_t lt_serial_code_get(lt_handle_t *h, uint8_t *serial_code, const uint16_t

// Setup a pointer to l3 buffer, which is placed in handle
struct lt_l3_serial_code_get_cmd_t* p_l3_cmd = (struct lt_l3_serial_code_get_cmd_t*)&h->l3_buff;
// Pointer to access l3 buffer with result data
// Pointer to access l3 buffer with result's data
struct lt_l3_serial_code_get_res_t* p_l3_res = (struct lt_l3_serial_code_get_res_t*)&h->l3_buff;

// Fill l3 buffer
Expand Down

0 comments on commit 51a9a93

Please sign in to comment.