1 // Copyright (c) 2010, Atmel Corporation.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above copyright
9 // notice, this list of conditions and the following disclaimer in the
10 // documentation and/or other materials provided with the distribution.
11 // * Neither the name of Atmel nor the
12 // names of its contributors may be used to endorse or promote products
13 // derived from this software without specific prior written permission.
14 //
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
19 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26 #include <ctype.h>
27 #include <stdio.h>
28 #include <string.h>
29 #include "SHA_Comm.h"
30 #include "SHA_CommMarshalling.h"
31 #include "SHA_Status.h"
32
33
34
35
36 // Data definitions
37 uint8_t sendbuf[SENDBUF_SIZE];
38 uint8_t receicebuf[RECEIVEBUF_SIZE];
39 SHA_CommParameters commparms;
40
41
42
43
SHAC_GetData(void)44 SHA_CommParameters* SHAC_GetData(void) {
45 return &commparms;
46 }
47 /**
48 *
49 * \brief Sends an MAC command to the device.
50 *
51 * \param[in] Mode
52 * \param[in] KeyID key id
53 * \param[in] Challenge
54 * \param[out] 32 bytes of response
55 * \return status of the operation
56 */
SHAC_Mac(uint8_t Mode,uint16_t KeyID,uint8_t * Challenge)57 uint8_t SHAC_Mac(uint8_t Mode, uint16_t KeyID, uint8_t *Challenge) {
58 sendbuf[COUNT_IDX] = MAC_COUNT_SHORT;
59 sendbuf[CMD_ORDINAL_IDX] = MAC;
60 sendbuf[MAC_MODE_IDX] = Mode;
61 memcpy(&sendbuf[MAC_KEYID_IDX], &KeyID, 2);
62 if ((Challenge != NULL) && ((Mode & 0x01) == 0))
63 {
64 memcpy(&sendbuf[MAC_CHALL_IDX], Challenge, 32);
65 sendbuf[COUNT_IDX] = MAC_COUNT_LARGE;
66 }
67
68 commparms.txBuffer = &sendbuf[0];
69 commparms.rxBuffer = &receicebuf[0];
70 commparms.rxSize = 35;
71 commparms.executionDelay = MACDELAY;
72 // Transfer the command to the chip
73 //
74 return SHAC_SendAndReceive(&commparms);
75
76 }
77
78
79
80 /**
81 *
82 * \brief Sends an Read command to the device.
83 *
84 * \param[in] Zone
85 * \param[in] Address
86 * \param[out] 4 or 32 bytes of response
87 * \return status of the operation
88 */
SHAC_Read(uint8_t Zone,uint16_t Address)89 uint8_t SHAC_Read(uint8_t Zone, uint16_t Address) {
90 sendbuf[COUNT_IDX] = READ_COUNT;
91 sendbuf[CMD_ORDINAL_IDX] = READ;
92 sendbuf[READ_ZONE_IDX] = Zone;
93 memcpy(&sendbuf[READ_ADDR_IDX], &Address, 2);
94
95 commparms.txBuffer = &sendbuf[0];
96 commparms.rxBuffer = &receicebuf[0];
97 if (Zone & 0x80) // if bit 7 = 1, 32 bytes
98 commparms.rxSize = 35;
99 else
100 commparms.rxSize = 7;
101 // The execution delay will have to increased for clear text & enc data
102 commparms.executionDelay = GENERALCMDDELAY;
103 // Transfer the command to the chip
104 //
105 return SHAC_SendAndReceive(&commparms);
106
107 }
108
109