#ifndef __KG_READ_DATA_H__
#define __KG_READ_DATA_H__

#include <stdint.h>
#include <kg_rpmb.h>
#define KG_ACTION_NAME_MAX      30

typedef struct kg_rpmb_info {
    // block index : 0 [0]
    uint32_t    magic;                                // 0 /* 0xEA030000 */
    uint32_t    version;                              // 4 /* RPMB version number */
    uint8_t     reserved[108];                        // 8
    uint32_t    kg_state;                             // 
    uint32_t    action_name_len;                      // 
    uint8_t     action_name[KG_ACTION_NAME_MAX];      // 
    uint32_t    lock_object_len;                      // 
    uint32_t    client_data_len;                      // 
    uint32_t    policy_file_len;                      // 
    uint32_t    kg_wrap_data_len;                     // 
    uint32_t    kg_reserve_data_len;                  // 
    uint8_t     reserved2[82];
} __attribute__((packed)) kg_rpmb_info_t;

uint32_t read_info_object(kg_rpmb_info_t **info);
uint32_t read_wrap_data(uint32_t* length, uint8_t** pData);
uint32_t read_policy_file(uint32_t* length, uint8_t** pData);
uint32_t read_lock_object(uint32_t* length, uint8_t** pData);
uint32_t read_client_data(uint32_t* length, uint8_t** pData);
uint32_t read_complete_token(kg_rpmb_complete_token_t **token);

uint32_t write_info_object(kg_rpmb_info_t *info);
uint32_t write_wrap_data(uint32_t length, uint8_t* pData);
uint32_t write_policy_file(uint32_t length, uint8_t* pData);
uint32_t write_lock_object(uint32_t length, uint8_t* pData);
uint32_t write_client_data(uint32_t length, uint8_t* pData);
uint32_t write_complete_token(kg_rpmb_complete_token_t* token);

uint32_t clear_rpmb(void);

#endif // __KG_READ_DATA_H__