/*
 * * Copyright (c) 2011,2014-2015, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 *  * Neither the name of The Linux Foundation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _DEVINFO_H_
#define _DEVINFO_H_

typedef struct device_info device_info;

#define DEVICE_MAGIC "ANDROID-BOOT!"
#define DEVICE_MAGIC_SIZE 13
#define MAX_PANEL_ID_LEN 64
#define MAX_VERSION_LEN  64
#define MAX_VB_PARTITIONS 32
#define MAX_USER_KEY_SIZE 2048
#define SHA256_DIGEST_LENGTH 32

enum unlock_type {
	UNLOCK = 0,
	UNLOCK_CRITICAL,
};

struct device_info
{
	unsigned char magic[DEVICE_MAGIC_SIZE];
	bool is_unlocked;
	bool is_tampered;
	bool is_unlock_critical;
	bool charger_screen_enabled;
	char display_panel[MAX_PANEL_ID_LEN];
	char bootloader_version[MAX_VERSION_LEN];
	char radio_version[MAX_VERSION_LEN];
	bool verity_mode; // 1 = enforcing, 0 = logging
	uint64_t rollback_index[MAX_VB_PARTITIONS];
	uint32_t user_public_key_length;
	uint8_t user_public_key[MAX_USER_KEY_SIZE];
};
/*[20200605][TracyChui] Implement get Serial Number start*/
#if defined(ENABLE_PRODINFO_ACCESS)
typedef struct prod_info prod_info;

#define PRODINFO_MAGIC "ANDROID!PRODINFO"
#define PRODINFO_MAGIC_SIZE 16  
#define PRODINFO_MAX_ISN_LEN 32 
#define PRODINFO_MAX_SSN_LEN 32 
struct prod_info
{
	unsigned char magic[PRODINFO_MAGIC_SIZE];
	unsigned char isn[PRODINFO_MAX_ISN_LEN];
	unsigned char ssn[PRODINFO_MAX_SSN_LEN];
	bool is_adb_enabled;
};

void read_prod_info(prod_info *dev);
#endif
/*[20200605][TracyChui] Implement get Serial Number end*/
#endif
