3 #ifndef sha204_library_H 
    4 #define sha204_library_H 
    8 #define PORT_ACCESS_TIME        (630)    
    9 #define START_PULSE_WIDTH       (4340)   
   11 #define RX_TX_DELAY             (15)         
   12 #define START_PULSE_TIME_OUT    (255)    
   13 #define ZERO_PULSE_TIME_OUT     (26)     
   17 #define SWI_FUNCTION_RETCODE_SUCCESS     ((uint8_t) 0x00)  
   18 #define SWI_FUNCTION_RETCODE_TIMEOUT     ((uint8_t) 0xF1)  
   19 #define SWI_FUNCTION_RETCODE_RX_FAIL     ((uint8_t) 0xF9)  
   23 #define SHA204_RSP_SIZE_MIN          ((uint8_t)  4)   
   24 #define SHA204_RSP_SIZE_MAX          ((uint8_t) 35)   
   25 #define SHA204_BUFFER_POS_COUNT      (0)              
   26 #define SHA204_BUFFER_POS_DATA       (1)              
   27 #define SHA204_WAKEUP_PULSE_WIDTH    (uint8_t) (6.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)    
   28 #define SHA204_WAKEUP_DELAY          (uint8_t) (3.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)    
   31 #define SHA204_SWI_FLAG_CMD     ((uint8_t) 0x77)  
   32 #define SHA204_SWI_FLAG_TX      ((uint8_t) 0x88)  
   33 #define SHA204_SWI_FLAG_IDLE    ((uint8_t) 0xBB)  
   34 #define SHA204_SWI_FLAG_SLEEP   ((uint8_t) 0xCC)  
   38 #define SHA204_CHECKMAC                 ((uint8_t) 0x28)        
   39 #define SHA204_DERIVE_KEY               ((uint8_t) 0x1C)        
   40 #define SHA204_DEVREV                   ((uint8_t) 0x30)        
   41 #define SHA204_GENDIG                   ((uint8_t) 0x15)        
   42 #define SHA204_HMAC                     ((uint8_t) 0x11)        
   43 #define SHA204_LOCK                     ((uint8_t) 0x17)        
   44 #define SHA204_MAC                      ((uint8_t) 0x08)        
   45 #define SHA204_NONCE                    ((uint8_t) 0x16)        
   46 #define SHA204_PAUSE                    ((uint8_t) 0x01)        
   47 #define SHA204_RANDOM                   ((uint8_t) 0x1B)        
   48 #define SHA204_READ                     ((uint8_t) 0x02)        
   49 #define SHA204_UPDATE_EXTRA             ((uint8_t) 0x20)        
   50 #define SHA204_WRITE                    ((uint8_t) 0x12)        
   53 #define SHA204_RSP_SIZE_VAL             ((uint8_t)  7)          
   56 #define SHA204_KEY_ID_MAX               ((uint8_t) 15)          
   57 #define SHA204_OTP_BLOCK_MAX            ((uint8_t)  1)          
   60 #define SHA204_COUNT_IDX                ( 0)                    
   61 #define SHA204_OPCODE_IDX               ( 1)                    
   62 #define SHA204_PARAM1_IDX               ( 2)                    
   63 #define SHA204_PARAM2_IDX               ( 3)                    
   64 #define SHA204_DATA_IDX                 ( 5)                    
   67 #define SHA204_ZONE_CONFIG              ((uint8_t)  0x00)       
   68 #define SHA204_ZONE_OTP                 ((uint8_t)  0x01)       
   69 #define SHA204_ZONE_DATA                ((uint8_t)  0x02)       
   70 #define SHA204_ZONE_MASK                ((uint8_t)  0x03)       
   71 #define SHA204_ZONE_COUNT_FLAG          ((uint8_t)  0x80)       
   72 #define SHA204_ZONE_ACCESS_4            ((uint8_t)     4)       
   73 #define SHA204_ZONE_ACCESS_32           ((uint8_t)    32)       
   74 #define SHA204_ADDRESS_MASK_CONFIG      (         0x001F)       
   75 #define SHA204_ADDRESS_MASK_OTP         (         0x000F)       
   76 #define SHA204_ADDRESS_MASK             (         0x007F)       
   79 #define CHECKMAC_MODE_IDX               SHA204_PARAM1_IDX       
   80 #define CHECKMAC_KEYID_IDX              SHA204_PARAM2_IDX       
   81 #define CHECKMAC_CLIENT_CHALLENGE_IDX   SHA204_DATA_IDX         
   82 #define CHECKMAC_CLIENT_RESPONSE_IDX    (37)                    
   83 #define CHECKMAC_DATA_IDX               (69)                    
   84 #define CHECKMAC_COUNT                  (84)                    
   85 #define CHECKMAC_MODE_MASK              ((uint8_t) 0x27)        
   86 #define CHECKMAC_CLIENT_CHALLENGE_SIZE  (32)                    
   87 #define CHECKMAC_CLIENT_RESPONSE_SIZE   (32)                    
   88 #define CHECKMAC_OTHER_DATA_SIZE        (13)                    
   91 #define DERIVE_KEY_RANDOM_IDX           SHA204_PARAM1_IDX       
   92 #define DERIVE_KEY_TARGETKEY_IDX        SHA204_PARAM2_IDX       
   93 #define DERIVE_KEY_MAC_IDX              SHA204_DATA_IDX         
   94 #define DERIVE_KEY_COUNT_SMALL          SHA204_CMD_SIZE_MIN     
   95 #define DERIVE_KEY_COUNT_LARGE          (39)                    
   96 #define DERIVE_KEY_RANDOM_FLAG          ((uint8_t) 4)           
   97 #define DERIVE_KEY_MAC_SIZE             (32)                    
  100 #define DEVREV_PARAM1_IDX               SHA204_PARAM1_IDX       
  101 #define DEVREV_PARAM2_IDX               SHA204_PARAM2_IDX       
  102 #define DEVREV_COUNT                    SHA204_CMD_SIZE_MIN     
  105 #define GENDIG_ZONE_IDX                 SHA204_PARAM1_IDX       
  106 #define GENDIG_KEYID_IDX                SHA204_PARAM2_IDX       
  107 #define GENDIG_DATA_IDX                 SHA204_DATA_IDX         
  108 #define GENDIG_COUNT                    SHA204_CMD_SIZE_MIN     
  109 #define GENDIG_COUNT_DATA               (11)                    
  110 #define GENDIG_OTHER_DATA_SIZE          (4)                     
  111 #define GENDIG_ZONE_CONFIG              ((uint8_t) 0)           
  112 #define GENDIG_ZONE_OTP                 ((uint8_t) 1)           
  113 #define GENDIG_ZONE_DATA                ((uint8_t) 2)           
  116 #define HMAC_MODE_IDX                   SHA204_PARAM1_IDX       
  117 #define HMAC_KEYID_IDX                  SHA204_PARAM2_IDX       
  118 #define HMAC_COUNT                      SHA204_CMD_SIZE_MIN     
  119 #define HMAC_MODE_MASK                  ((uint8_t) 0x74)        
  122 #define LOCK_ZONE_IDX                   SHA204_PARAM1_IDX       
  123 #define LOCK_SUMMARY_IDX                SHA204_PARAM2_IDX       
  124 #define LOCK_COUNT                      SHA204_CMD_SIZE_MIN     
  125 #define LOCK_ZONE_NO_CONFIG             ((uint8_t) 0x01)        
  126 #define LOCK_ZONE_NO_CRC                ((uint8_t) 0x80)        
  127 #define LOCK_ZONE_MASK                  (0x81)                  
  130 #define MAC_MODE_IDX                    SHA204_PARAM1_IDX       
  131 #define MAC_KEYID_IDX                   SHA204_PARAM2_IDX       
  132 #define MAC_CHALLENGE_IDX               SHA204_DATA_IDX         
  133 #define MAC_COUNT_SHORT                 SHA204_CMD_SIZE_MIN     
  134 #define MAC_COUNT_LONG                  (39)                    
  135 #define MAC_MODE_BLOCK2_TEMPKEY         ((uint8_t) 0x01)        
  136 #define MAC_MODE_BLOCK1_TEMPKEY         ((uint8_t) 0x02)        
  137 #define MAC_MODE_SOURCE_FLAG_MATCH      ((uint8_t) 0x04)        
  138 #define MAC_MODE_PASSTHROUGH            ((uint8_t) 0x07)        
  139 #define MAC_MODE_INCLUDE_OTP_88         ((uint8_t) 0x10)        
  140 #define MAC_MODE_INCLUDE_OTP_64         ((uint8_t) 0x20)        
  141 #define MAC_MODE_INCLUDE_SN             ((uint8_t) 0x40)        
  142 #define MAC_CHALLENGE_SIZE              (32)                    
  143 #define MAC_MODE_MASK                   ((uint8_t) 0x77)        
  146 #define NONCE_MODE_IDX                  SHA204_PARAM1_IDX       
  147 #define NONCE_PARAM2_IDX                SHA204_PARAM2_IDX       
  148 #define NONCE_INPUT_IDX                 SHA204_DATA_IDX         
  149 #define NONCE_COUNT_SHORT               (27)                    
  150 #define NONCE_COUNT_LONG                (39)                    
  151 #define NONCE_MODE_MASK                 ((uint8_t) 3)           
  152 #define NONCE_MODE_SEED_UPDATE          ((uint8_t) 0x00)        
  153 #define NONCE_MODE_NO_SEED_UPDATE       ((uint8_t) 0x01)        
  154 #define NONCE_MODE_INVALID              ((uint8_t) 0x02)        
  155 #define NONCE_MODE_PASSTHROUGH          ((uint8_t) 0x03)        
  156 #define NONCE_NUMIN_SIZE                (20)                    
  157 #define NONCE_NUMIN_SIZE_PASSTHROUGH    (32)                    
  160 #define PAUSE_SELECT_IDX                SHA204_PARAM1_IDX       
  161 #define PAUSE_PARAM2_IDX                SHA204_PARAM2_IDX       
  162 #define PAUSE_COUNT                     SHA204_CMD_SIZE_MIN     
  165 #define RANDOM_MODE_IDX                 SHA204_PARAM1_IDX       
  166 #define RANDOM_PARAM2_IDX               SHA204_PARAM2_IDX       
  167 #define RANDOM_COUNT                    SHA204_CMD_SIZE_MIN     
  168 #define RANDOM_SEED_UPDATE              ((uint8_t) 0x00)        
  169 #define RANDOM_NO_SEED_UPDATE           ((uint8_t) 0x01)        
  172 #define READ_ZONE_IDX                   SHA204_PARAM1_IDX       
  173 #define READ_ADDR_IDX                   SHA204_PARAM2_IDX       
  174 #define READ_COUNT                      SHA204_CMD_SIZE_MIN     
  175 #define READ_ZONE_MASK                  ((uint8_t) 0x83)        
  176 #define READ_ZONE_MODE_32_BYTES         ((uint8_t) 0x80)        
  179 #define UPDATE_MODE_IDX                  SHA204_PARAM1_IDX      
  180 #define UPDATE_VALUE_IDX                 SHA204_PARAM2_IDX      
  181 #define UPDATE_COUNT                     SHA204_CMD_SIZE_MIN    
  182 #define UPDATE_CONFIG_BYTE_86            ((uint8_t) 0x01)       
  185 #define WRITE_ZONE_IDX                  SHA204_PARAM1_IDX       
  186 #define WRITE_ADDR_IDX                  SHA204_PARAM2_IDX       
  187 #define WRITE_VALUE_IDX                 SHA204_DATA_IDX         
  188 #define WRITE_MAC_VS_IDX                ( 9)                    
  189 #define WRITE_MAC_VL_IDX                (37)                    
  190 #define WRITE_COUNT_SHORT               (11)                    
  191 #define WRITE_COUNT_LONG                (39)                    
  192 #define WRITE_COUNT_SHORT_MAC           (43)                    
  193 #define WRITE_COUNT_LONG_MAC            (71)                    
  194 #define WRITE_MAC_SIZE                  (32)                    
  195 #define WRITE_ZONE_MASK                 ((uint8_t) 0xC3)        
  196 #define WRITE_ZONE_WITH_MAC             ((uint8_t) 0x40)        
  199 #define CHECKMAC_RSP_SIZE               SHA204_RSP_SIZE_MIN     
  200 #define DERIVE_KEY_RSP_SIZE             SHA204_RSP_SIZE_MIN     
  201 #define DEVREV_RSP_SIZE                 SHA204_RSP_SIZE_VAL     
  202 #define GENDIG_RSP_SIZE                 SHA204_RSP_SIZE_MIN     
  203 #define HMAC_RSP_SIZE                   SHA204_RSP_SIZE_MAX     
  204 #define LOCK_RSP_SIZE                   SHA204_RSP_SIZE_MIN     
  205 #define MAC_RSP_SIZE                    SHA204_RSP_SIZE_MAX     
  206 #define NONCE_RSP_SIZE_SHORT            SHA204_RSP_SIZE_MIN     
  207 #define NONCE_RSP_SIZE_LONG             SHA204_RSP_SIZE_MAX     
  208 #define PAUSE_RSP_SIZE                  SHA204_RSP_SIZE_MIN     
  209 #define RANDOM_RSP_SIZE                 SHA204_RSP_SIZE_MAX     
  210 #define READ_4_RSP_SIZE                 SHA204_RSP_SIZE_VAL     
  211 #define READ_32_RSP_SIZE                SHA204_RSP_SIZE_MAX     
  212 #define TEMP_SENSE_RSP_SIZE             SHA204_RSP_SIZE_VAL     
  213 #define UPDATE_RSP_SIZE                 SHA204_RSP_SIZE_MIN     
  214 #define WRITE_RSP_SIZE                  SHA204_RSP_SIZE_MIN     
  217 #define CHECKMAC_DELAY                  ((uint8_t) (12.0 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  218 #define DERIVE_KEY_DELAY                ((uint8_t) (14.0 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  219 #define DEVREV_DELAY                    ((uint8_t) ( 0.4 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  220 #define GENDIG_DELAY                    ((uint8_t) (11.0 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  221 #define HMAC_DELAY                      ((uint8_t) (27.0 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  222 #define LOCK_DELAY                      ((uint8_t) ( 5.0 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  223 #define MAC_DELAY                       ((uint8_t) (12.0 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  224 #define NONCE_DELAY                     ((uint8_t) (22.0 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  225 #define PAUSE_DELAY                     ((uint8_t) ( 0.4 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  226 #define RANDOM_DELAY                    ((uint8_t) (11.0 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  227 #define READ_DELAY                      ((uint8_t) ( 0.4 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  228 #define TEMP_SENSE_DELAY                ((uint8_t) ( 4.0 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  229 #define UPDATE_DELAY                    ((uint8_t) ( 4.0 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  230 #define WRITE_DELAY                     ((uint8_t) ( 4.0 * CPU_CLOCK_DEVIATION_NEGATIVE - 0.5)) 
  233 #define CHECKMAC_EXEC_MAX                ((uint8_t) (38.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  234 #define DERIVE_KEY_EXEC_MAX              ((uint8_t) (62.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  235 #define DEVREV_EXEC_MAX                  ((uint8_t) ( 2.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  236 #define GENDIG_EXEC_MAX                  ((uint8_t) (43.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  237 #define HMAC_EXEC_MAX                    ((uint8_t) (69.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  238 #define LOCK_EXEC_MAX                    ((uint8_t) (24.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  239 #define MAC_EXEC_MAX                     ((uint8_t) (35.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  240 #define NONCE_EXEC_MAX                   ((uint8_t) (60.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  241 #define PAUSE_EXEC_MAX                   ((uint8_t) ( 2.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  242 #define RANDOM_EXEC_MAX                  ((uint8_t) (50.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  243 #define READ_EXEC_MAX                    ((uint8_t) ( 4.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  244 #define TEMP_SENSE_EXEC_MAX              ((uint8_t) (11.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  245 #define UPDATE_EXEC_MAX                  ((uint8_t) ( 6.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  246 #define WRITE_EXEC_MAX                   ((uint8_t) (42.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5)) 
  250 #define CPU_CLOCK_DEVIATION_POSITIVE   (1.01) 
  251 #define CPU_CLOCK_DEVIATION_NEGATIVE   (0.99) 
  252 #define SHA204_RETRY_COUNT           (1) 
  253 #define SWI_RECEIVE_TIME_OUT      ((uint16_t) 163)   
  254 #define SWI_US_PER_BYTE           ((uint16_t) 313)   
  255 #define SHA204_SYNC_TIMEOUT       ((uint8_t) 85) 
  256 #define SHA204_RESPONSE_TIMEOUT   ((uint16_t) SWI_RECEIVE_TIME_OUT + SWI_US_PER_BYTE)   
  260 #define SHA204_COMMAND_EXEC_MAX      ((uint8_t) (69.0 * CPU_CLOCK_DEVIATION_POSITIVE + 0.5))   
  261 #define SHA204_CMD_SIZE_MIN          ((uint8_t)  7)   
  262 #ifndef SHA204_CMD_SIZE_MAX 
  263 #define SHA204_CMD_SIZE_MAX          ((uint8_t) 84)   
  265 #define SHA204_CRC_SIZE              ((uint8_t)  2)   
  266 #define SHA204_BUFFER_POS_STATUS     (1)   
  267 #define SHA204_BUFFER_POS_DATA       (1)   
  268 #define SHA204_STATUS_BYTE_WAKEUP    ((uint8_t) 0x11)   
  269 #define SHA204_STATUS_BYTE_PARSE     ((uint8_t) 0x03)   
  270 #define SHA204_STATUS_BYTE_EXEC      ((uint8_t) 0x0F)   
  271 #define SHA204_STATUS_BYTE_COMM      ((uint8_t) 0xFF)   
  275 #define ADDRESS_SN03        0   // SN[0:3] are bytes 0->3 of configuration zone 
  276 #define ADDRESS_RevNum      4   // bytes 4->7 of config zone are RevNum 
  277 #define ADDRESS_SN47        8   // SN[4:7] are bytes 8->11 of config zone 
  278 #define ADDRESS_SN8         12  // SN[8] is byte 12 of config zone, should be 0xEE 
  279 #define ADDRESS_I2CEN       14  // I2C Enable, bit 0 represents I2C enable status 
  280 #define ADDRESS_I2CADD      16  // Defines I2C address of SHA204 
  281 #define ADDRESS_OTPMODE     18  // Sets the One-time-programmable mode 
  282 #define ADDRESS_SELECTOR    19  // Controls writability of Selector 
  286 #if !defined(ARDUINO_ARCH_AVR) && !defined(ARDUINO_ARCH_MEGAAVR) // For everything else than AVR use pinMode / digitalWrite 
  287 #define SHA204_SET_OUTPUT() pinMode(device_pin, OUTPUT) 
  288 #define SHA204_SET_INPUT() pinMode(device_pin, INPUT) 
  289 #define SHA204_POUT_HIGH() digitalWrite(device_pin, HIGH) 
  290 #define SHA204_POUT_LOW() digitalWrite(device_pin, LOW) 
  291 #define SHA204_PIN_READ() digitalRead(device_pin) 
  293 #define SHA204_SET_INPUT()  *device_port_DDR &= ~device_pin 
  294 #define SHA204_SET_OUTPUT() *device_port_DDR |= device_pin 
  295 #define SHA204_POUT_HIGH() *device_port_OUT |= device_pin 
  296 #define SHA204_POUT_LOW() *device_port_OUT &= ~device_pin 
  297 #define SHA204_PIN_READ() (*device_port_IN & device_pin) 
  307 #if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR) 
  308     volatile uint8_t *device_port_DDR, *device_port_OUT, *device_port_IN;
 
  310     void sha204c_calculate_crc(uint8_t length, uint8_t *
data, uint8_t *crc);
 
  311     uint8_t sha204c_check_crc(uint8_t *response);
 
  312     void swi_set_signal_pin(uint8_t is_high);
 
  313     uint8_t swi_receive_bytes(uint8_t count, uint8_t *buffer);
 
  314     uint8_t swi_send_bytes(uint8_t count, uint8_t *buffer);
 
  315     uint8_t swi_send_byte(uint8_t value);
 
  316     uint8_t sha204p_receive_response(uint8_t size, uint8_t *response);
 
  317     uint8_t sha204p_wakeup();
 
  318     uint8_t sha204p_send_command(uint8_t count, uint8_t * command);
 
  319     uint8_t sha204p_sleep();
 
  320     uint8_t sha204p_resync(uint8_t size, uint8_t *response);
 
  352                                      uint8_t execution_delay, uint8_t execution_timeout);
 
  373     uint8_t 
sha204m_random(uint8_t * tx_buffer, uint8_t * rx_buffer, uint8_t mode);
 
  395     uint8_t 
sha204m_read(uint8_t *tx_buffer, uint8_t *rx_buffer, uint8_t zone, uint16_t address);
 
  416     uint8_t 
sha204m_execute(uint8_t op_code, uint8_t param1, uint16_t param2,
 
  417                             uint8_t datalen1, uint8_t *data1, uint8_t datalen2, uint8_t *data2, uint8_t datalen3,
 
  419                             uint8_t tx_size, uint8_t *tx_buffer, uint8_t rx_size, uint8_t *rx_buffer);
 
  441                                      uint8_t datalen1, uint8_t *data1, uint8_t datalen2, uint8_t *data2, uint8_t datalen3,
 
  443                                      uint8_t tx_size, uint8_t *tx_buffer, uint8_t rx_size, uint8_t *rx_buffer);