intiial commit
Dependencies: MAX8614X USBDevice max32630hsp_test
Diff: main.cpp
- Revision:
- 21:0a4f90fb3451
- Parent:
- 20:39857996a7c7
- Child:
- 22:1be3a5f0223e
diff -r 39857996a7c7 -r 0a4f90fb3451 main.cpp
--- a/main.cpp Thu Aug 16 23:46:00 2018 +0000
+++ b/main.cpp Fri Aug 17 00:11:10 2018 +0000
@@ -36,6 +36,9 @@
#include "max32630hsp.h"
#include "MAX8614X.h"
#include "USBSerial.h"
+
+//#define DEBUG_ON 1
+
void executeSha256(MAX8614X &m, uint8_t *challenge, unsigned int challengeLen, bool romID, uint32_t *response);
bool isTheChipAuthenicated(uint32_t *expectedResponse, uint32_t *chipResponse);
@@ -44,7 +47,6 @@
MAX32630HSP icarus(MAX32630HSP::VIO_1V8);
// MAX32630FTHR mbed_board(MAX32630FTHR::VIO_1V8);
SPI spi(P5_1, P5_2, P5_0); /* mosi, miso, sclk */
-//DigitalOut cs(P3_0);
DigitalOut cs(P5_3);
PinName interrupt_pin = P3_2;
// Virtual serial port over USB
@@ -55,8 +57,8 @@
DigitalOut bLED(LED3);
int main()
{
- #define CHALLENGE_SZ_NO_SECRET 20
- uint8_t challenge_A[CHALLENGE_SZ_NO_SECRET] = { // 160 bit, no ROM
+ #define CHALLENGE8_LEN 20
+ uint8_t challenge_A[CHALLENGE8_LEN] = { // 160 bit, no ROM
0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
@@ -73,7 +75,7 @@
0x218e53ee,
0x904e0c6b
};
- uint8_t challenge_1[CHALLENGE_SZ_NO_SECRET] = { // 160 bit
+ uint8_t challenge_1[CHALLENGE8_LEN] = { // 160 bit
0x5e, 0x81, 0x35, 0x24,
0x56, 0x63, 0xd6, 0x09,
0x99, 0x8d, 0x7b, 0x0d,
@@ -91,7 +93,7 @@
0x685981a3
};
- uint8_t challenge_2[CHALLENGE_SZ_NO_SECRET] = { // 160 bit, no ROM
+ uint8_t challenge_2[CHALLENGE8_LEN] = { // 160 bit, no ROM
0xd2, 0xaa, 0x84, 0xc5,
0x72, 0x77, 0xf7, 0xe5,
0xdb, 0x8f, 0xd6, 0x12,
@@ -109,7 +111,7 @@
0x828afe4d,
0x9cb3de6d
};
- uint8_t challenge_3[CHALLENGE_SZ_NO_SECRET] = { // 160 bit
+ uint8_t challenge_3[CHALLENGE8_LEN] = { // 160 bit
0x21, 0x20, 0x22, 0x80,
0xcc, 0x9d, 0x45, 0xaa,
0xb8, 0x13, 0x3e, 0x96,
@@ -126,7 +128,7 @@
0xfb0fc974,
0x2da0781e
};
- uint8_t challenge_4[CHALLENGE_SZ_NO_SECRET] = { // 160 bit, no ROM
+ uint8_t challenge_4[CHALLENGE8_LEN] = { // 160 bit, no ROM
0x4c, 0x3c, 0x0a, 0xca,
0x61, 0x8a, 0xbd, 0xf2,
0x34, 0xd8, 0xb3, 0x41,
@@ -146,25 +148,17 @@
uint32_t chip_response[RESPONSE_LEN32];
bool valid = 0;
- #define MAC_SZ 32
-
-// daplink.printf("daplink serial port\r\n");
-// microUSB.printf("micro USB serial port\r\n");
- rLED = LED_ON;
+ rLED = LED_OFF;
gLED = LED_ON;
bLED = LED_OFF;
- rLED = LED_OFF;
printf("\r\n\rmax86140 authenication software\r\n");
MAX8614X m(spi,cs,interrupt_pin);
m.init();
- // MAX8614X m(spi,cs,interrupt_pin);
-// m.readRegister(MAX8614X::MAX8614X_PART_ID_REG, data, 1);
-// printf("device id should be 0x24, reg %02X = %02X\r\n", MAX8614X::MAX8614X_PART_ID_REG, data[0]);
//● Compare MAC from MAX86140 wth Host's precalculated MAC.
- executeSha256(m, challenge_A, CHALLENGE_SZ_NO_SECRET, 1, chip_response);
+ executeSha256(m, challenge_A, CHALLENGE8_LEN, 1, chip_response);
//● Check PASS or FAIL.
valid = isTheChipAuthenicated(chip_response, expectedResponse_A_romID);
if (valid)
@@ -173,7 +167,7 @@
printf("\r\n Challenge A failed\r\n\r\n");
//● Compare MAC from MAX86140 wth Host's precalculated MAC.
- executeSha256(m, challenge_1, CHALLENGE_SZ_NO_SECRET, 1, chip_response);
+ executeSha256(m, challenge_1, CHALLENGE8_LEN, 1, chip_response);
//● Check PASS or FAIL.
valid = isTheChipAuthenicated(chip_response, expectedResponse_1_romID);
if (valid)
@@ -181,21 +175,21 @@
else
printf("\r\n Challenge 1 failed\r\n\r\n");
- executeSha256(m, challenge_2, CHALLENGE_SZ_NO_SECRET, 0, chip_response);
+ executeSha256(m, challenge_2, CHALLENGE8_LEN, 0, chip_response);
valid = isTheChipAuthenicated(chip_response, expectedResponse_2_noRomID);
if (valid)
printf("\r\n Challenge 2 passed\r\n\r\n");
else
printf("\r\n Challenge 2 failed\r\n\r\n");
- executeSha256(m, challenge_3, CHALLENGE_SZ_NO_SECRET, 1, chip_response);
+ executeSha256(m, challenge_3, CHALLENGE8_LEN, 1, chip_response);
valid = isTheChipAuthenicated(chip_response, expectedResponse_3_romID);
if (valid)
printf("\r\n Challenge 3 passed\r\n\r\n");
else
printf("\r\n Challenge 3 failed\r\n\r\n");
- executeSha256(m, challenge_4, CHALLENGE_SZ_NO_SECRET, 0, chip_response);
+ executeSha256(m, challenge_4, CHALLENGE8_LEN, 0, chip_response);
valid = isTheChipAuthenicated(chip_response, expectedResponse_4_noRomID);
if (valid)
printf("\r\n Challenge 4 passed\r\n\r\n");
@@ -220,7 +214,6 @@
return 1;
}
-#if 0
void transformData(uint8_t *inData, uint8_t *outData, unsigned int challengeLen)
{
int i, j, k;
@@ -232,32 +225,12 @@
}
}
}
-#endif
-void transformData(uint8_t *inData, uint8_t *outData, unsigned int challengeLen)
-{
- int i, j, k;
- k = 0;
- for (i = 0; i < (challengeLen/4); i++) {
- for (j = 3; j >= 0; j--) {
- outData[j+(i*4)] = inData[k];
-// printf("%02X ",inData[k]);
- k++;
- }
-// printf("\r\n");
- }
- for (i=0; i < challengeLen; i++) {
-// if (!(i % 4))
-// printf("\r\n ");
-// printf("%02X ",outData[i]);
- }
-}
void executeSha256(MAX8614X &m, uint8_t *challenge, unsigned int challengeLen, bool romID, uint32_t *response)
{
int i, j, k;
uint8_t macData[256];
- uint8_t inData[256];
uint8_t xData[256];
uint32_t x32Data[64];
uint32_t tmpData;
@@ -276,6 +249,7 @@
// Enable Memory Write, Select Bank 0, address 0x00 to 0xFF
m.writeRegister(MAX8614X::MAX8614X_MEMORY_CONTROL_REG, MAX8614X::MAX8614X_MEMCNTRL_WR_EN_MASK | MAX8614X::MAX8614X_MEMCNTRL_BANK0_MASK);
+#ifdef DEBUG_ON
printf("\r\n Raw Input Data\r\n\r\n");
for (i = 0; i < challengeLen; i++) {
if (!(i % 4))
@@ -283,19 +257,11 @@
printf("%02x", challenge[i]);
}
printf("\r\n");
-#if 0
- k = 0;
- for (i = 0; i < (challengeLen/4); i++) {
- for (j = 3; j >= 0; j--) {
-
- inData[j+(i*4)] = challenge[k];
- k++;
- }
- }
#endif
transformData(challenge, xData, challengeLen);
+#ifdef DEBUG_ON
printf("\r\n Transformed Input Data\r\n\r\n");
for (i = 0; i < challengeLen; i++) {
if (!(i % 4))
@@ -303,45 +269,29 @@
printf("%02x", xData[i]);
}
printf("\r\n ");
- printf("\r\n ");
+#endif
for (i = 0; i < (challengeLen); i++) {
m.writeRegister(MAX8614X::MAX8614X_MEMORY_INDEX_REG, i);
m.writeRegister(MAX8614X::MAX8614X_MEMORY_DATA_REG, xData[i]);
//}
}
- printf("%\r\n");
+
// The message block consists of a 160-bit secret, a 160-bit challenge and 192 bits of constant data. Optionally, the 64-bit
// ROM ID replaces 64 of the 192 bits of constant data used in the hash operation. 16 bits out of the 160-bit secret and 16
// bits of ROM ID are programmable–8 bits each in metal and 8 bits each in OTP bits
- //- Write command, with ROM ID (0x35) or without ROM ID (0x36), to SHA_CMD register
- if (romID) {
- printf("ROMID \r\n");
-// m.writeRegister(MAX8614X::MAX8614X_SHA_CMD_REG, MAX8614X::MAX8614X_SHACMD_MAC_ROM_ID);
+ //● Write command, with ROM ID (0x35) or without ROM ID (0x36), to SHA_CMD register
+ if (romID) {
m.writeRegister(MAX8614X::MAX8614X_SHA_CMD_REG, MAX8614X::MAX8614X_SHACMD_MAC_ROM_ID);
-// wait(1);
-}
+ }
else
-{
- printf("no ROMID \r\n");
-// m.writeRegister(MAX8614X::MAX8614X_SHA_CMD_REG,MAX8614X::MAX8614X_SHACMD_MAC_NO_ROM_ID);
- m.writeRegister(MAX8614X::MAX8614X_SHA_CMD_REG,MAX8614X::MAX8614X_SHACMD_MAC_NO_ROM_ID);
-// wait(1);
-}
-
-
-// m.writeRegister(MAX8614X::MAX8614X_SHA_CMD_REG,MAX8614X::MAX8614X_SHACMD_MAC_ROM_ID);
-// m.writeRegister(MAX8614X::MAX8614X_SHA_CMD_REG,MAX8614X::MAX8614X_SHACMD_MAC_NO_ROM_ID);
-
+ {
+ m.writeRegister(MAX8614X::MAX8614X_SHA_CMD_REG,MAX8614X::MAX8614X_SHACMD_MAC_NO_ROM_ID);
+ }
m.readRegister(MAX8614X::MAX8614X_SHA_CMD_REG, data, 1);
-/// printf("sha cmd reg should be 0x35 mac rom id, reg %02X = %02X\r\n", MAX8614X::MAX8614X_SHA_CMD_REG, data[0]);
- m.readRegister(MAX8614X::MAX8614X_INT_STATUS2_REG, data, 1);
-/// printf("int status2, reg %02X = %X\r\n", MAX8614X::MAX8614X_INT_STATUS2_REG, data[0]);
//● Write 1 to SHA_START and 1 to SHA_EN bit.
m.writeRegister(MAX8614X::MAX8614X_SHA_CFG_REG,MAX8614X::MAX8614X_SHACFG_SHA_EN | MAX8614X::MAX8614X_SHACFG_SHA_START);
- m.readRegister(MAX8614X::MAX8614X_SHA_CFG_REG, data, 1);
-/// printf("sha CFG reg should be 0x3, reg %02X = %02X\r\n", MAX8614X::MAX8614X_SHA_CFG_REG, data[0]);
//● Wait for SHA_DONE.
data[0] = 0;
@@ -351,19 +301,27 @@
k++;
}
// ● Read 256 MAC value from RAM using registers MEM_IDX and MEM_DATA.
+#ifdef DEBUG_ON
printf("\r\n Raw Output\r\n\r\n");
+#endif
for (i = 64; i < 64+32; i++) {
+#ifdef DEBUG_ON
if (!(i % 4))
printf("\r\n ");
+#endif
m.writeRegister(MAX8614X::MAX8614X_MEMORY_INDEX_REG, i);
m.readRegister(MAX8614X::MAX8614X_MEMORY_DATA_REG, data, 1);
xData[i-64] = data[0];
+#ifdef DEBUG_ON
printf("%02x", data[0]);
+#endif
}
+#ifdef DEBUG_ON
printf("%\r\n");
+#endif
transformData(xData,macData, 32);
-#if 0
+#ifdef DEBUG_ON
printf("\r\n Formatted Response\r\n\r\n");
for (i = 0; i < 32; i++) {
if (!(i % 4))
@@ -376,21 +334,21 @@
// transform data to Little-Endian
k = 0;
for (i = 0; i < (responseLen32); i++) {
- tmpData = challenge[i];
x32Data[i] = 0;
for (j = 3; j >= 0; j--) {
x32Data[i] = x32Data[i] << 8;
x32Data[i] |= macData[k] & 0xFF;
k++;
}
-
}
+#ifdef DEBUG_ON
printf("\r\n Formatted Response\r\n\r\n");
+#endif
for (i = 0; i < responseLen32; i++) {
+#ifdef DEBUG_ON
printf(" %08X \r\n",x32Data[i]);
+#endif
response[i] = x32Data[i];
}
-
-
}
\ No newline at end of file