// Copyright (c) 2010, Atmel Corporation. // 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 Atmel 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 SHA_COMMMARSHALLING_H #define SHA_COMMMARSHALLING_H #include <ctype.h> #include "SHA_Comm.h" // General Definitions #define SENDBUF_SIZE 128 #define RECEIVEBUF_SIZE 128 // Command ordinal definitions #define DERIVE_KEY 0x1C #define DEVREV 0x30 #define GENDIG 0x15 #define HMAC 0x11 #define HOSTHMAC 0x21 #define HOSTMAC 0x28 #define LOCK 0x17 #define MAC 0x08 #define NONCE 0x16 #define PAUSE 0x01 #define RANDOM 0x1B #define READ 0x02 #define TEMPSENSE 0x18 #define WRITE 0x12 /* Command Packet definition Byte # Name Meaning ------ ---- ------- 0 Count Number of bytes in the packet, includes the byte count, body and the checksum 1 Ordinal Command Opcode (Ordinal) 2 -> n Cmd Parameters Parameters for specific command n+1 & n+2 Checksum Checksum of the command packet */ ////////////////////////////////////////////////////////////////////// // General command indexes #define COUNT_IDX 0 #define CMD_ORDINAL_IDX 1 ////////////////////////////////////////////////////////////////////// // DriveKey command #define DK_RANDOM_IDX 2 #define DK_TARGETKEY_IDX 3 #define DK_MAC_IDX 5 #define DK_COUNT_SMALL 7 #define DK_COUNT_LARGE 39 ////////////////////////////////////////////////////////////////////// // DevRev command #define DR_PARAM1_IDX 2 #define DR_PARAM2_IDX 3 #define DR_COUNT 7 ////////////////////////////////////////////////////////////////////// // GenDig command #define GD_ZONE_IDX 2 #define GD_KEYID_IDX 3 #define GD_DATA_IDX 5 #define GD_COUNT 7 #define GD_COUNT_DATA 11 ////////////////////////////////////////////////////////////////////// // HMAC command #define HM_MODE_IDX 2 #define HM_KEYID_IDX 3 #define HM_COUNT 7 ////////////////////////////////////////////////////////////////////// // HostHMAC command #define HHMAC_MODE_IDX 2 #define HHMAC_KEYID_IDX 3 #define HHMAC_CLIENTRSP 5 #define HHMAC_DATA 37 #define HHMAC_COUNT 52 ////////////////////////////////////////////////////////////////////// // HostMAC command #define HOSTMAC_MODE_IDX 2 #define HOSTMAC_KEYID_IDX 3 #define HOSTMAC_CLIENCHALL 5 #define HOSTMAC_CLIENTRSP 37 #define HOSTMAC_DATA 69 #define HOSTMAC_COUNT 84 ////////////////////////////////////////////////////////////////////// // Lock command #define LK_ZONE_IDX 2 #define LK_SUMMARY_IDX 3 #define LK_COUNT 5 ////////////////////////////////////////////////////////////////////// // Mac command #define MAC_MODE_IDX 2 #define MAC_KEYID_IDX 3 #define MAC_CHALL_IDX 5 #define MAC_COUNT_SHORT 7 #define MAC_COUNT_LARGE 39 ////////////////////////////////////////////////////////////////////// // Nonce command #define N_MODE_IDX 2 #define N_ZERO_IDX 3 #define N_NUMIN_IDX 5 #define N_COUNT_SHORT 27 #define N_COUNT_LONG 39 ////////////////////////////////////////////////////////////////////// // Pause command #define P_SELECT_IDX 2 #define P_ZERO_IDX 3 #define P_COUNT 7 ////////////////////////////////////////////////////////////////////// // Random command #define RAN_MODE_IDX 2 #define RAN_ZERO_IDX 3 #define RAN_COUNT 7 ////////////////////////////////////////////////////////////////////// // Read command #define READ_ZONE_IDX 2 #define READ_ADDR_IDX 3 #define READ_COUNT 7 ////////////////////////////////////////////////////////////////////// // TempSense command #define TS_ZERO1_IDX 2 #define TS_ZERO2_IDX 3 #define TS_COUNT 7 ////////////////////////////////////////////////////////////////////// // Write command #define W_ZONE_IDX 2 #define W_ADDR_IDX 3 #define W_VALUE_IDX 5 #define W_MAC_VS_IDX 9 #define W_MAC_VL_IDX 37 #define W_COUNT_SHORT 11 #define W_COUNT_LONG 39 #define W_COUNT_SHORT_MAC 43 #define W_COUNT_LONG_MAC 71 ////////////////////////////////////////////////////////////////////// // Command Timming definitions #define MACDELAY 30000 #define READDELAY 100000 #define ENCREADDELAY 100000 #define GENDIGDELAY 15000 #define WRITEDELAY 15000 #define ENCWRITEDELAY 15000 #define HMACDELAY 30000 #define SHORTRANDDELAY 15000 #define LONGRANDDELAY 15000 #define LOCKDELAY 15000 #define TEMPDELAY 10000 #define GENERALCMDDELAY 1000 ////////////////////////////////////////////////////////////////////// // Function definitions uint8_t SHAC_DeriveKey(uint8_t Random, uint16_t TargetKey, uint8_t *Data); uint8_t SHAC_DevRev(); uint8_t SHAC_GenDig(uint8_t Zone, uint16_t KeyID, uint8_t *Data); uint8_t SHAC_HMAC(uint8_t Mode, uint16_t KeyID); uint8_t SHAC_HostHMAC(uint8_t Mode, uint16_t KeyID, uint8_t *ClietResponse, uint8_t *OtherData); uint8_t SHAC_HostMAC(uint8_t Mode, uint16_t KeyID, uint8_t *ClietChallenge, uint8_t *ClietResponse, uint8_t *OtherData); uint8_t SHAC_Lock(uint8_t Zone, uint16_t Summary); uint8_t SHAC_Mac(uint8_t Mode, uint16_t KeyID, uint8_t *Challenge); uint8_t SHAC_Nonce(uint8_t Mode, uint8_t *Numin); uint8_t SHAC_Pause(uint8_t Selector); uint8_t SHAC_Random(uint8_t Mode); uint8_t SHAC_Read(uint8_t Zone, uint16_t Address); uint8_t SHAC_TempSense(uint8_t *Temp); uint8_t SHAC_Write(uint8_t Zone, uint16_t Address, uint8_t *Value, uint8_t *MACData); SHA_CommParameters* SHAC_GetData(void); #endif