C++程序  |  223行  |  7.64 KB

// 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