
/**
* \file CryptoPlatform.c
* \brief Platform independent high level crypto functions.
* \author Nikolay Oleschuk (n.oleschuk@samsung.com)
* \version 0.1
* \date Created March 03, 2014
* \par In Samsung Ukraine R&D Center (SRK) under a contract between
* \par LLC "Samsung Electronics Ukraine Company" (Kharkiv, Ukraine) and
* \par "Samsung Elecrtronics Co", Ltd (Seoul, Republic of Korea)
* \par Copyright: (c) Samsung Electronics Co, Ltd 2014. All rights reserved.
**/

#ifndef __TASTARTUPCODE_H_INCLUDED__
#define __TASTARTUPCODE_H_INCLUDED__

#include <stdint.h>
#include "CommLayerData.h"

int32_t kmLockAndLoadTA(void);
int32_t kmUnloadAndUnlockTA(void);
int32_t kmLoadTA(void);
int32_t kmUnloadTA(void);
int32_t kmSendCmd(uint32_t cmdId, uint8_t* data,  uint32_t len);
int32_t kmSendCmdInOut(uint32_t cmdId,
			uint8_t* inData,  uint32_t inLen,
			uint8_t* outData,  uint32_t* outLen);

/* platform specific functions */

int32_t kmGetTid(uint8_t* tid, uint32_t* tidLen);

int32_t kmSendCmdGen(uint32_t cmdId, const struct KeyInfo* keyInfo,
			const uint8_t* TID, uint32_t TIDLen,
			void* wrappedKey, uint32_t* wrappedKeyLen,
			const void* wrappedDevRootKey,
			uint32_t wrappedDevRootKeyLen,
			const uint8_t* tlv, uint32_t tlvLen);

int32_t kmSendCmdVerify(uint32_t cmdId, const struct KeyInfo* keyInfo,
			const void* wrappedKey, uint32_t wrappedKeyLen);

int32_t kmSendCmdCheckDev(uint32_t cmdId,
			const void* wrappedKey, uint32_t wrappedKeyLen);

int32_t kmSendCmdGetPK(uint8_t *out, uint32_t *outLen);

int32_t kmSendCmdGetOtaSdPk(uint8_t *out, uint32_t *outLen);

int32_t kmSendCmdGetOtaCertWithKey(certType_t certType, uint8_t *out, uint32_t *outLen, uint8_t *wrappedKey, uint32_t wrappedKeyLen);

int32_t kmSendCmdSaveOtaCerts(uint8_t *certMlSD, uint32_t certMlSDLen,
				uint8_t *certMlSM0, uint32_t certMlSM0Len,
				uint8_t *certMlSM1, uint32_t certMlSM1Len,
				uint8_t *wrappedKey, uint32_t wrappedKeyLen,
				uint8_t *keyBlob, uint32_t *keyBlobLen);

int32_t kmVerifySDCert(uint8_t* wrappedKey,
			uint32_t wrappedKeyLen,
			uint8_t* localTime,
			uint32_t localTimeLen);

#ifdef USE_QSEE
int32_t kmSendCmdStoreServiceKey(uint8_t* wrappedKey, uint32_t wrappedKeyLen, uint8_t* outData, uint32_t* outDataLen);
#endif
int32_t kmSendCmdVerifyServiceKey(uint8_t* wrappedKey, uint32_t wrappedKeyLen,
					uint8_t* localTime, uint32_t localTimeLen);

int32_t kmSendCmdSignOtaData(uint8_t* wrappedKey, uint32_t wrappedKeyLen,
				uint8_t* data, uint32_t dataLen,
				uint8_t* signature, uint32_t* signatureLen);
int32_t kmSendCmdSignDapData(uint8_t* wrappedKey, uint32_t wrappedKeyLen,
				uint8_t* data, uint32_t dataLen,
				uint8_t* signature, uint32_t* signatureLen);

#if (defined(INCLUDE_RAW_ACCESSORS) || defined(USE_QSEE))
int32_t kmSendCmdRaw(uint32_t cmdId, const struct KeyInfo* keyInfo,
			const void* wrappedKey, uint32_t wrappedKeyLen,
			uint8_t* out, uint32_t* outLen);
#endif /* INCLUDE_RAW_ACCESSORS */

#endif /* __TASTARTUPCODE_H_INCLUDED__ */