CEBF746 Module.. with TPM

Dependencies:   cube_CEBF746 cube_crypto cube_crc_16

Revision:
5:79ea2d57baf3
Parent:
4:85dda8d9a528
Child:
6:210b1bb7442b
--- a/main.cpp	Wed Oct 19 08:53:08 2016 +0000
+++ b/main.cpp	Thu Oct 20 08:18:41 2016 +0000
@@ -47,13 +47,16 @@
 SPISlave spi_slave(SPI_MOSI, SPI_MISO, SPI_SCLK, SPI_SSEL); // MOSI, MISO, SCLK(CLK), SSEL(CS)=NC
 
 
-uint8_t cebStatus;                  // 1byte Status Register
+uint8_t cebf746_status_reg;                  // 1byte Status Register
 uint8_t cebBufEncrypt[CEB_BUF_SIZE] = {};     // 암호화 예정 버퍼
 uint8_t cebBufEncrypted[CEB_BUF_SIZE] = {};   // 암호화 완료된 버퍼 
 
 uint8_t cebBufDecrypt[CEB_BUF_SIZE] = {};     // 복호화 예정 버퍼
 uint8_t cebBufDecrypted[CEB_BUF_SIZE] = {};   // 복호화 완료된 버퍼 
 
+uint8_t spiTXBuf[255];     // SPI TX 버퍼
+uint8_t spiRXBuf[255];     // SPI RX 버퍼
+
 extern uint8_t readSelfTestValidateData[CEB_BUF_SIZE];
 extern uint8_t writeSelfTestValidateData[CEB_BUF_SIZE];
 
@@ -67,7 +70,6 @@
     MENU_EXIT_Program = 9
 };
 
-static char cebf746_status_reg = 0xAA;
 
 
 bool spi_receive_wait(void)
@@ -304,13 +306,13 @@
 
 uint8_t slave_read_byte()
 {    
-    while(!spi_slave.receive());    
+    while(!spi_slave.receive());        // ★★★★  마스터 쪽에서 패킷이 수신 안됐을 경우 loop에서 나오지 못함. 예외 처리(time out) 적용 해야함.
     return spi_slave.read();    
 }
 void slave_write_byte(uint8_t txData)
 {
     spi_slave.reply( txData );
-    while(!spi_slave.receive());
+    while(!spi_slave.receive());        // ★★★★   마스터 쪽에서 패킷이 수신 안됐을 경우 loop에서 나오지 못함. 예외 처리(time out) 적용 해야함.
     spi_slave.read();
 }
 
@@ -339,6 +341,15 @@
 }
 
 
+void slave_write_packet(spiDataStr* packet)
+{    
+    slave_write_byte((packet->size >> 8) & 0xFF);
+    slave_write_byte((packet->size     ) & 0xFF);      
+    slave_write_multi_byte(packet->buf, packet->size);
+    slave_write_byte((packet->crc16 >> 8) & 0xFF);
+    slave_write_byte((packet->crc16     ) & 0xFF);    
+}
+
 #define YSH_CODE    1
 #if YSH_CODE
 typedef struct      // #include <aes.h> -> mbed tls lib
@@ -466,6 +477,7 @@
 #endif
 
 
+
 /** @brief main function ###################################################################
  *
  */
@@ -477,7 +489,7 @@
     char eepAddr = 0;
     char eepData = 0;
 
-    int packetLength = 0;
+    uint16_t packetLength = 0;
 
     uint8_t  spiRxTempBuf = 0;
     
@@ -487,6 +499,7 @@
     uint16_t readCrc = 0;
     uint16_t genCrc = 0;
 
+    spiDataStr txData; 
     spiDataStr rxData; 
     
     pc_serial.printf("\n\n========== KSS SPI Slave1 [Start] ==========\n");
@@ -507,8 +520,6 @@
     {
         pc_serial.printf("\n\nwaiting CEBF746 cmd...\n");    
         
-         
-        
         
         spiRxTempBuf = slave_read_byte();        
         printf("menu[%02X]\n", spiRxTempBuf);
@@ -526,7 +537,7 @@
                 uint8_t tempBuf[CEB_BUF_SIZE] = {0, };
                 uint16_t retCrc = 0;
                 
-                                
+                packetSize = 0;
                 slave_read_uint16(&packetSize);                
                 if(packetSize != CEB_BUF_SIZE)
                 {
@@ -547,8 +558,10 @@
                 
                 if(true == crcCheck )
                 {
+                    /// ★★★여기서 윤주임코드 암호화 스레드 동작할수 있게 flag setting 해야함!!
                     cube_crypt_spi_cmd_set(&tempContext, 0x02,tempBuf, 0);
                     pc_serial.printf("call \"cube_crypt_spi_cmd_set()\"\n");
+                    cebf746_status_reg = 0x00;       // will delete code
                 }
                 else
                 {
@@ -558,6 +571,28 @@
             break;
             
             case FUNC_READ_ENC_DATA:
+                uint16_t keyCrc = 0xAABB;               // ★★★★ 윤주임 코드 들어오면 keyCrc 참조 변경 해야함 
+                packetLength = CEB_BUF_SIZE+2;
+               
+                
+                if(0 == (cebf746_status_reg & 0x02))   // 암호화가 완료 되었으면 
+                {
+                    memcpy(spiTXBuf, cebBufEncrypted, CEB_BUF_SIZE);        // encrypted data copy
+                    spiTXBuf[CEB_BUF_SIZE + 0] = ((keyCrc >> 8) & 0xFF);    // upper key crc copy 
+                    spiTXBuf[CEB_BUF_SIZE + 1] = ((keyCrc     ) & 0xFF);    // lower key crc copy                    
+                    
+                    
+                    cebf746_set_packet(&txData, packetLength, spiTXBuf);
+                    slave_write_packet(&txData);
+                    
+                    
+                    _cebf746_print_packet(packetLength, spiTXBuf, genCrc);
+                    
+                }
+                else
+                {
+                    
+                }
             break;
             
             case FUNC_WRITE_DEC_DATA:
@@ -600,31 +635,14 @@
                 
             break;
             
-            case FUNC_READ_SELF_TEST:         // 161017_KSS_Test OK
-                //printf("FUNC_READ_SELF_TEST\n");
-                // TODO check status reg
-                
-                cube_crc_16(CEB_BUF_SIZE, readSelfTestValidateData, &genCrc);
-            
+            case FUNC_READ_SELF_TEST:         // 161017_KSS_Test OK                
                 
-                slave_write_byte((CEB_BUF_SIZE >> 8) & 0xFF);
-                slave_write_byte((CEB_BUF_SIZE     ) & 0xFF);      
-                slave_write_multi_byte(readSelfTestValidateData, CEB_BUF_SIZE);
-                slave_write_byte((genCrc >> 8) & 0xFF);
-                slave_write_byte((genCrc     ) & 0xFF);
-                
-                
+                cebf746_set_packet(&txData, CEB_BUF_SIZE, readSelfTestValidateData);
+                slave_write_packet(&txData);
                 
-                printf("--send end\n");
-                
-                wait_ms(100);
-                
+                printf("--FUNC_READ_SELF_TEST end\n");
             break;
 
-            
-
-
-
         }