/*
 * =====================================================================================
 *
 *       Filename:  commonConfig.h
 *
 *    Description:  Common definitions.
 *
 *        Version:  1.0
 *        Created:  03/10/2017 03:27:17 PM
 *        Updated:  22/01/2020 04:14:18 PM
 *       Compiler:  arm/g++
 *
 *        Company:  Samsung Electronics
 *
 *        Copyright (c) 2020 by Samsung Electronics, All rights reserved.
 *
 * =====================================================================================
 */

#ifndef __COMMON_CONFIG_H__
#define __COMMON_CONFIG_H__

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "errorCode.h"
#include "commandList.h"

/*******************************************
 *
 * Macro functions.
 *
 *******************************************/

/* uint16_t <-> bytes */
#define GET_UINT16(x, y) (uint16_t)(((uint16_t)x[y+1] << 8) | (uint16_t)(x[y]))

#define SET_UINT16_FROM_U16(x, y, z) \
    do { \
        x[y+1] = (uint8_t)(((z) >> 8) & 0xFF); \
        x[y]   = (uint8_t)((z) & 0xFF); \
    } while (0);

#define SET_UINT16_FROM_U32(x, y, z) \
    do { \
        x[y+1] = (uint8_t)((z >> 24) & 0xFF); \
        x[y]   = (uint8_t)((z >> 16) & 0xFF); \
    } while(0)

/* uint32_t <-> bytes */
#define GET_UINT32(x, y) (uint32_t)(((uint32_t)x[y+3] << 24) | ((uint32_t)x[y+2] << 16) | ((uint32_t)x[y+1] << 8) | (uint32_t)(x[y]))
#define SET_UINT32(x, y, z) \
    do { \
        x[y+3] = (uint8_t)((z >> 24) & 0xFF); \
        x[y+2] = (uint8_t)((z >> 16) & 0xFF); \
        x[y+1] = (uint8_t)((z >> 8) & 0xFF); \
        x[y]   = (uint8_t)((z) & 0xFF); \
    } while(0)

/* array size */
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(arr)   (sizeof(arr) / sizeof((arr)[0]))
#endif

/*******************************************
 *
 * Constants Definitions.
 *
 *******************************************/
// Max size of buffers.
#define MAX_SKM_BUF_SIZE                  8192
// P180110-05678 Grace-R.
// Order 4(64KB) page allocation can be failed in kernel by page allcator policy - cmlaika.kim 2018.01.16
// Request to change allocation memory size to 32KB under. - jt1217.kim in S.LSI 2018.01.18
// Prov and Keymaster - 32KB include header(8B).
#define MAX_PROV_BUF_SIZE                 32760
#define MAX_VND_SPU_SIZE                  512
#define MAX_FILE_PATH_LEN                 256
#define MAX_CERT_LEN                      2048
#define MAX_SERIALNO_SIZE                 32
#define MAX_MODEL_SIZE                    32
#define MAX_BODY_SIZE                     0x100000
#define MAX_BIGDATA_SIZE                  256
#define MAX_DRK_UID_SIZE                  128
#define MAX_SERVICE_NAME                  8

// CSR related length.
#define CSR_TIMESTAMP_LEN                 14
#define CSR_BRANCH_ID_LEN                 3
#define CSR_PREFIX_LEN                    6
#define CSR_DATA_MAX_SIZE                 4096

//system related value.
#define CID_SIZE_MAX     33

// Crypto related value.
#define IV_SIZE                           16
#define RSA_ENCRYPTED_KEY_SIZE            256
#define RSA_BIT_SIZE_DEFAULT              2048
// Requested by b.venkataram in MPS Lab-B2B Engineering to support Master card.
#define RSA_BIT_SIZE_MASTER_CARD          1984
#define RSA_DEFAULT_EXPONENT              65537
#define EC_BIT_SIZE_DEFAULT               256

// time log's length
// 06-12 09:32:17  => 14
#define TIME_LOG_LEN     17

// SPU ID
#define PDP_GET_STATUS_ALL        0
#define PDP_CHECK_STATUS          1
#define PDP_SET_ARI_ENABLED       2
#define PDP_CHECK_STATUS_KEYSTORE 3

#define KEYBLOB_VERSION           0x00
#define KEYBLOB_DRK               0xF0
#define KEYBLOB_KEYMASTER         0xA0
#define KEYBLOB_RSA_TYPE          0x10

#define KEYBLOB_HEADER_LEN        4 // Version(1B) + Type(1B) + Length(2B).

#define UID_PREFIX_DRK            "DRK_V2"
#define UID_PREFIX_SAK_V1         "SAK_V1"
#define MCPAY_SERV_NAME           "MC_PAY"

/* vaultkeeper related value */
#define MAX_VK_DRK_LEN          4768
#define MAX_DRK_INTEGRITY_SIZE  32
#define VK_DRK_MAGIC_CODE       "SMSTPIKA"
#define HWVAULT_DRK_MAGIC_CODE  "SSEHPIKA"

#define PACKAGE_NAME_LEN        64
/*******************************************
 *
 * System Definitions.
 *
 *******************************************/

#if (defined SYSTEM_ROOT_IMAGE_ENABLED)
#define ROOT_DIR                    "/mnt/vendor"
#else
#define ROOT_DIR                    ""
#endif  // End of SYSTEM_ROOT_IMAGE_ENABLED

//Android
#if (defined USE_ANDROID)
#define COMMON_DIR                  "/efs"

#define OLD_RAON_LOG_DIR            "/data/log"             //~ Q os
#define OLD_ISSUED_LOG_DIR          "/efs/prov"

#define COMMON_RAON_LOG_DIR         "/data/vendor/log/drk"  //R os ~
#define COMMON_ISSUED_LOG_DIR       "/mnt/vendor/efs/prov"

#define UID_SYSTEM                   1000

#define SPU_STATUS_FILE_PATH         ROOT_DIR"/efs/spu.dat"

#define PROPERTY_BASE_MODEL         "ro.product.base_model"
#define PROPERTY_MODEL              "ro.product.model"

#define PROPERTY_CARRIER             "ro.carrier"
#define PROPERTY_SALESCODE           "ro.csc.sales_code"
#define PROPERTY_VALUE_WIFI_ONLY     "wifi-only"
#define PROPERTY_VALUE_LDU           "PAP"
#endif

//Tizen
#if (defined USE_TIZEN)
#define COMMON_DIR                  "/csa"
#define COMMON_RAON_LOG_DIR         "/opt/usr/data/drkservice"

#define SERIAL_PATH                 COMMON_DIR"/imei/serialno.dat"

#define PROPERTY_MODEL              "tizen.org/system/model_name"

#define BUILD_TYPE                  "tizen.org/system/build.type"
#define BUILD_TYPE_ENG              "eng"
#define BUILD_TYPE_USER             "user"

#define PROP_VALUE_MAX              96
#endif  // End of USE_ANDROID

// common definition.
#define DRK_DIR                      ROOT_DIR COMMON_DIR "/prov_data"
#define DRK_SAVE_FILE_PATH           DRK_DIR"/dev_root/dev_root.dat"
#define DRK_DATA_DIR                 ROOT_DIR COMMON_DIR "/prov"

#define EMMC_CID_PATH                "/sys/block/mmcblk0/device/cid"
#define EMMC_CID_PATH_V2             "/sys/class/sec/mmc/un"
#define WIFI_MAC_PATH                ROOT_DIR"/efs/wifi/.mac.info"

// VaultKeeper property. If vaultkeeper is alive it will be set by "1".
#if (defined SUPPORT_VENDOR_VAULTKEEPER)
#define PROP_VK "vendor.security.vaultkeeper.native"
#else
#define PROP_VK "ro.security.vaultkeeper.native"
#endif

typedef enum {
    KEY_DRK_V1 = 0,
    KEY_GOOGLE_ATTESTATION,
    KEY_DRK_V2,
    KEY_SAMSUNG_ATTESTATION,
    KEY_STRONGBOX_ATTESTATION,
    KEY_MAX,
} INSTALLKEYTYPE;

typedef enum {
    KEY_TYPE_NONE = 0,
    KEY_TYPE_RSA  = 0x01,
    KEY_TYPE_EC   = 0x04,
    KEY_TYPE_MAX
} KEYTYPE;

#endif  // End of __COMMON_CONFIG_H
