Add mbtk_otad

Change-Id: I472a8f3acdc6207a17800352bf7ce5e6fff167a9
diff --git a/mbtk/mbtk_otad/inc/tim.h b/mbtk/mbtk_otad/inc/tim.h
new file mode 100755
index 0000000..5cd20ec
--- /dev/null
+++ b/mbtk/mbtk_otad/inc/tim.h
@@ -0,0 +1,334 @@
+#ifndef __TIM_H__
+#define __TIM_H__
+
+enum {
+	IMAGE_ID_DTIM_A = 0x54494D31, /* dtim primary */
+	IMAGE_ID_DTIM_B = 0x54494d32, /* dtim recovery */
+	IMAGE_ID_UBOOT  = 0x4F534C4F,
+	IMAGE_ID_KERNEL = 0x5A494D47,
+	IMAGE_ID_ROOTFS = 0x5359534A,
+	IMAGE_ID_ARBEL  = 0x41524249,
+	IMAGE_ID_MSA	= 0x47524249,
+	IMAGE_ID_RF		= 0x52464249,
+	IMAGE_ID_OEMD	= 0x4F454D44,
+	IMAGE_ID_OBM	= 0x4f424d49,
+	IMAGE_ID_TIMH	= 0x54494d48,
+
+    // Add by liubin
+    IMAGE_ID_DEVICE	= 0x4F454D55,
+};
+
+#define TIMIDENTIFIER		0x54494D48		// "TIMH"
+// TIM Versions
+#define TIM_3_2_00			0x30200			// Support for Partitioning
+#define TIM_3_3_00			0x30300			// Support for ECDSA-256
+#define TIM_3_4_00			0x30400			// Support for ECDSA-521
+
+// Defined for DTIM support
+typedef enum
+{
+	TIMH_NOTINC				= 0,
+	TIMH_INC				= 1,
+	DTIM_PRIMARY_INC		= 2,
+	DTIM_RECOVERY_INC		= 3,
+	DTIM_CP_INC				= 4,
+	TIMH_RECOVERY_INC		= 5,
+	DTIM_PPSETTING_INC		= 6,
+	// 7-9 reserved
+	DTIM_CUSTMOZIEDTYPE1	= 10,
+	DTIM_CUSTMOZIEDTYPE2	= 11,
+	DTIM_CUSTMOZIEDTYPE3	= 12,
+	DTIM_CUSTMOZIEDTYPE4	= 13,
+	DTIM_CUSTMOZIEDTYPE5	= 14,
+	DTIM_CUSTMOZIEDTYPE6	= 15,
+	DTIM_CUSTMOZIEDTYPE7	= 16,
+	DTIM_CUSTMOZIEDTYPE8	= 17,
+	DTIM_CUSTMOZIEDTYPE9	= 18,
+	DTIM_CUSTMOZIEDTYPE10	= 19,
+	DTIM_CUSTMOZIEDTYPE11	= 20,
+	DTIM_CUSTMOZIEDTYPE12	= 21,
+	DTIM_CUSTMOZIEDTYPE13	= 22,
+	DTIM_CUSTMOZIEDTYPE14	= 23,
+	DTIM_CUSTMOZIEDTYPE15	= 24,
+	DTIM_CUSTMOZIEDTYPE16	= 25,
+	DTIM_CUSTMOZIEDTYPE17	= 26,
+	DTIM_CUSTMOZIEDTYPE18	= 27,
+	DTIM_CUSTMOZIEDTYPE19	= 28,
+	DTIM_CUSTMOZIEDTYPE20	= 29,
+
+	DTIM_CUSTMOZIED_MAX		= 50
+} TIMIncluded_Type;
+
+typedef unsigned int UINT_T, *PUINT;
+typedef unsigned char UINT8_T;
+
+typedef enum
+{
+	SHA160 = 0x00000014,   //20
+	SHA256 = 0x00000020,   //32
+	SHA512 = 0x00000040,   //64
+	DUMMY_HASH = 0x7FFFFFFF
+}
+HASHALGORITHMID_T;
+
+typedef struct
+{
+ UINT_T Version;
+ UINT_T	Identifier;					// "TIMH"
+ UINT_T Trusted;					// 1- Trusted, 0 Non
+ UINT_T IssueDate;
+ UINT_T OEMUniqueID;
+} VERSION_I, *pVERSION_I;			// 0x10 bytes
+
+typedef struct
+{
+ UINT_T WTMFlashSign;
+ UINT_T WTMEntryAddr;
+ UINT_T WTMEntryAddrBack;
+ UINT_T WTMPatchSign;
+ UINT_T WTMPatchAddr;
+ UINT_T BootFlashSign;
+} FLASH_I, *pFLASH_I;				// 0x10 bytes
+
+typedef struct
+{
+	UINT_T PartitionNumber	: 4;
+	UINT_T ImageType		: 8;
+	UINT_T Reserved			: 20;
+}TIM_INT;
+
+typedef union{
+	TIM_INT bits;
+	UINT_T value;
+}PN, *pPN;
+
+typedef struct
+{
+ UINT_T ImageID;					// Indicate which Image
+ UINT_T NextImageID;				// Indicate next image in the chain
+ UINT_T FlashEntryAddr;			 	// Block numbers for NAND
+ UINT_T LoadAddr;
+ UINT_T ImageSize;
+ UINT_T ImageSizeToHash;
+ HASHALGORITHMID_T HashAlgorithmID;            // See HASHALGORITHMID_T
+ UINT_T Hash[16];					// Reserve 512 bits for the hash
+ PN PartitionNumber;
+} IMAGE_INFO_3_4_0, *pIMAGE_INFO_3_4_0;			// 0x60 bytes
+
+typedef struct
+{
+ UINT_T ImageID;					// Indicate which Image
+ UINT_T NextImageID;				// Indicate next image in the chain
+ UINT_T FlashEntryAddr;			 	// Block numbers for NAND
+ UINT_T LoadAddr;
+ UINT_T ImageSize;
+ UINT_T ImageSizeToHash;
+ HASHALGORITHMID_T HashAlgorithmID;			// See HASHALGORITHMID_T
+ UINT_T Hash[8];					// Reserve 256 bits for the hash
+ UINT_T PartitionNumber;			// This is new for V3.2.0
+} IMAGE_INFO_3_2_0, *pIMAGE_INFO_3_2_0;			// 0x40 bytes
+
+// Constant part of the TIMs
+typedef struct
+{
+ VERSION_I      VersionBind;         			// 0
+ FLASH_I        FlashInfo;           			// 0x10
+ UINT_T         NumImages;           			// 0x20
+ UINT_T         NumKeys;						// 0x24
+ UINT_T         SizeOfReserved;					// 0x28
+} CTIM, *pCTIM;									// 0x2C
+
+// TIM structure for use by DKB/OBM/BootROM
+typedef struct
+{
+ pCTIM 				pConsTIM;			// Constant part
+ pIMAGE_INFO_3_4_0	pImg;				// Pointer to Images
+ void				*pKey;				// Pointer to Keys
+ PUINT				pReserved;			// Pointer to Reserved Area
+ void       		*pTBTIM_DS;			// Pointer to Digital Signature
+} TIM, *pTIM;
+
+/**
+ * General error code definitions			0x0 - 0x1F
+ **/
+#define NoError								0x0
+#define NotFoundError						0x1
+#define TIMNotFound							0x6D
+
+// WTP Format Recognized Reserved Area Indicator
+#define WTPRESERVEDAREAID	0x4F505448	  // "OPTH"
+
+// Reserved Area Package Headers
+#define TERMINATORID		0x5465726D		// "Term"
+
+/********** WTP Recognized Reserved Area Layout ********************************
+*
+*	WTPTP_Defined_Reserved_Format_ID	\	  This clues BR, OBM and DKB that the reserved area is in a known format
+*	Number of Reserved Area Packages	/	  For each package there is a header, payload size and payload
+*
+*	Header	 	 		\	  Indicates what type of a Reserved Area Package
+*	Size		  		 \	  Size Comprises a single Reserved Area Package
+*	Payload		  		 /	  There may be any number of Packages so long as TIM/NTIM < 4KB
+*			 			/
+*
+*	Header		 		\	  The Last one should be a Package with a Terminator Header
+*	Size		 		/	  The size should be 8 bytes (the size of this package)
+*
+**********************************************************************************/
+typedef struct
+{
+ UINT_T WTPTP_Reserved_Area_ID;	  	// This clues BR, OBM and DKB that the reserved area is in a known format
+ UINT_T	NumReservedPackages;	  	// For each package there is a header, payload size and payload
+}WTP_RESERVED_AREA, *pWTP_RESERVED_AREA;
+
+typedef struct
+{
+ UINT_T Identifier;					// Identification of this reserved area entry
+ UINT_T Size;						// Size  = Payload Size + 2 words (8 bytes).
+}WTP_RESERVED_AREA_HEADER, *pWTP_RESERVED_AREA_HEADER;
+
+#define DDR_FLASH_MCP_PACKAGE_ID  0X44464D50 // "DFMP"
+typedef struct
+{
+			unsigned int	 VendorDdrPid;
+			unsigned int	 FlashInfo; //for eMMC, FlashInfo is flash size, MB; for nand, FlashInfo is NandID
+} VendorDdrFlashSpec, *pVendorDdrFlashSpec;
+
+
+typedef struct
+{
+			WTP_RESERVED_AREA_HEADER WRAH;
+			unsigned int NumberVendorDdrFlashSpec;
+			VendorDdrFlashSpec  ddrFlashSpec[2];
+} DDR_FLASH_MCP_PACKAGE, *pDDR_FLASH_MCP_PACKAGE;
+
+#define MAXRSAKEYSIZEWORDS	 	64				// 2048 bits
+#define MAXECCKEYSIZEWORDS 		17				// 521 bits+
+
+typedef enum
+{
+	Marvell_DS =		0x00000000,
+	PKCS1_v1_5_Caddo =	0x00000001,
+	PKCS1_v2_1_Caddo =	0x00000002,
+	PKCS1_v1_5_Ippcp =	0x00000003,
+	PKCS1_v2_1_Ippcp =	0x00000004,
+	ECDSA_256 =			0x00000005,
+	ECDSA_521 =			0x00000006,
+	PKCS1_v2_2_Ippcp =	0x00000007,
+	DUMMY_ENALG = 0x7FFFFFFF   // See _Cryptographic_Scheme for additional id's
+}
+ENCRYPTALGORITHMID_T;
+
+typedef struct
+{
+ UINT_T	KeyID;						// Associate an ID with this key
+ HASHALGORITHMID_T HashAlgorithmID;	// See HASHALGORITHMID_T
+ UINT_T KeySize;					// Specified in bits
+ UINT_T PublicKeySize;				// Specified in bits
+ UINT_T RSAPublicExponent[MAXRSAKEYSIZEWORDS]; // Contents depend on PublicKeySize
+ UINT_T RSAModulus[MAXRSAKEYSIZEWORDS]; // Up to 2K bits
+ UINT_T KeyHash[8]; 				// Reserve 256 bits for the hash
+} KEY_MOD_3_2_0, *pKEY_MOD_3_2_0;				// 0x22C bytes
+
+typedef struct
+{
+ UINT_T KeyID;				// Associate an ID with this key
+ HASHALGORITHMID_T HashAlgorithmID;	 // See HASHALGORITHMID_T
+ UINT_T KeySize;			// Specified in bits
+ UINT_T PublicKeySize;		// Specified in bits
+ ENCRYPTALGORITHMID_T EncryptAlgorithmID;	// See ENCRYPTALGORITHMID_T;
+ union
+ {
+	struct
+	{
+ 		UINT_T RSAPublicExponent[MAXRSAKEYSIZEWORDS];	// Contents depend on PublicKeySize
+		UINT_T RSAModulus[MAXRSAKEYSIZEWORDS];			// Up to 2K bits
+	}Rsa;
+
+	struct
+	{
+		UINT_T PublicKeyCompX[MAXECCKEYSIZEWORDS]; // Contents depend on PublicKeySize
+		UINT_T PublicKeyCompY[MAXECCKEYSIZEWORDS]; // Up to 521 bits
+		// Pad this struct so it remains consistent with RSA struct
+		UINT_T Reserved[(2*MAXRSAKEYSIZEWORDS)-(2*MAXECCKEYSIZEWORDS)];
+	}Ecdsa;
+ };
+
+ UINT_T KeyHash[8]; 				// Reserve 256 bits for the hash
+} KEY_MOD_3_3_0, *pKEY_MOD_3_3_0;		//
+
+typedef struct
+{
+ UINT_T KeyID;				// Associate an ID with this key
+ HASHALGORITHMID_T HashAlgorithmID;	// See HASHALGORITHMID_T
+ UINT_T KeySize;			// Specified in bits
+ UINT_T PublicKeySize;		// Specified in bits
+ ENCRYPTALGORITHMID_T EncryptAlgorithmID; // See ENCRYPTALGORITHMID_T;
+ union
+ {
+	struct
+	{
+ 		UINT_T RSAPublicExponent[MAXRSAKEYSIZEWORDS];	// Contents depend on PublicKeySize
+		UINT_T RSAModulus[MAXRSAKEYSIZEWORDS];			// Up to 2K bits
+	}Rsa;
+
+	struct
+	{
+		UINT_T PublicKeyCompX[MAXECCKEYSIZEWORDS]; // Contents depend on PublicKeySize
+		UINT_T PublicKeyCompY[MAXECCKEYSIZEWORDS]; // Up to 521 bits
+		// Pad this struct so it remains consistent with RSA struct
+		UINT_T Reserved[(2*MAXRSAKEYSIZEWORDS)-(2*MAXECCKEYSIZEWORDS)];
+	}Ecdsa;
+
+	struct
+	{
+		UINT_T EncryptedHashRSAPublicExponent[MAXRSAKEYSIZEWORDS];  // Contents depend on PublicKeySize
+		UINT_T EncryptedHashRSAModulus[MAXRSAKEYSIZEWORDS];		 // Up to 2K bits
+	}EncryptedRsa;
+
+	struct
+	{
+		UINT_T EncryptedHashPublicKeyCompX_R[MAXECCKEYSIZEWORDS]; // Contents depend on PublicKeySize
+		UINT_T EncryptedHashPublicKeyCompX_S[MAXECCKEYSIZEWORDS]; // Contents depend on PublicKeySize
+
+		UINT_T EncryptedHashPublicKeyCompY_R[MAXECCKEYSIZEWORDS]; // Up to 521 bits
+		UINT_T EncryptedHashPublicKeyCompY_S[MAXECCKEYSIZEWORDS]; // Up to 521 bits
+
+		// Pad this struct so it remains consistent with encrypted RSA struct
+		UINT_T Reserved[(2 * MAXRSAKEYSIZEWORDS)-(4 * MAXECCKEYSIZEWORDS)];
+	}EncryptedEcdsa;
+ };
+
+ UINT_T KeyHash[16]; 				// Reserve 512 bits for the hash
+} KEY_MOD_3_4_0, *pKEY_MOD_3_4_0;		//
+
+
+typedef struct
+{
+ ENCRYPTALGORITHMID_T DSAlgorithmID;   // See ENCRYPTALGORITHMID_T
+ HASHALGORITHMID_T HashAlgorithmID; // See HASHALGORITHMID_T
+ UINT_T KeySize;			  // Specified in bits
+ UINT_T Hash[8];			  // Reserve 256 bits for optional key hash
+ union 	// Note that this union should not be included as part of the hash for TIM in the Digital Signature
+ {
+	struct
+	{
+		UINT_T RSAPublicExponent[MAXRSAKEYSIZEWORDS];
+		UINT_T RSAModulus[MAXRSAKEYSIZEWORDS];		   	// Up to 2K bits
+		UINT_T RSADigS[MAXRSAKEYSIZEWORDS];				// Contains TIM Hash
+	}Rsa;
+
+	struct
+	{
+		UINT_T ECDSAPublicKeyCompX[MAXECCKEYSIZEWORDS]; // Allow for 544 bits (17 words, 68 bytes for use with EC-521)
+		UINT_T ECDSAPublicKeyCompY[MAXECCKEYSIZEWORDS];
+		UINT_T ECDSADigS_R[MAXECCKEYSIZEWORDS];
+		UINT_T ECDSADigS_S[MAXECCKEYSIZEWORDS];
+		// Pad this struct so it remains consistent with RSA struct
+		UINT_T Reserved[(MAXRSAKEYSIZEWORDS*3)-(MAXECCKEYSIZEWORDS*4)];
+	} Ecdsa;
+ };
+} PLAT_DS, *pPLAT_DS;
+
+#endif
+