CryptoAuthLib
Microchip CryptoAuthentication Library
atca_command.h
Go to the documentation of this file.
1 
34 #ifndef ATCA_COMMAND_H
35 #define ATCA_COMMAND_H
36 
37 #include "atca_compiler.h"
38 #include "atca_status.h"
39 #include "atca_devtypes.h"
40 #include <stddef.h>
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
53 {
55  uint8_t clock_divider;
57 };
58 
59 /*--- ATCACommand ---------*/
60 typedef struct atca_command* ATCACommand;
61 
64 void deleteATCACommand(ATCACommand *ca_cmd);
65 
66 /* add ATCACommand declarations here
67  *
68  * since these are still C functions, not classes, naming is an important
69  * consideration to keep the namespace from colliding with other 3rd party
70  * libraries or even ourselves/ASF.
71  *
72  * Basic conventions:
73  * all methods start with the prefix 'at'
74  * all method names must be unique, obviously
75  * all method implementations should be proceeded by their Doxygen comment header
76  *
77  **/
78 
79 
80 // this is the ATCACommand parameter structure. The caller to the command method must
81 // initialize param1, param2 and data if appropriate. The command method will fill in the rest
82 // and initialize the packet so it's ready to send via the ATCAIFace.
83 // this particular structure mimics the ATSHA and ATECC family device's command structures
84 
85 // Note: pack @ 2 is required, @ 1 causes word alignment crash (though it should not), a known bug in GCC.
86 // @2, the wire still has the intended byte alignment with arm-eabi. this is likely the least portable part of atca
87 
88 #pragma pack( push, ATCAPacket, 2 )
89 
93 typedef struct
94 {
95 
96  // used for transmit/send
97  uint8_t _reserved; // used by HAL layer as needed (I/O tokens, Word address values)
98 
99  //--- start of packet i/o frame----
100  uint8_t txsize;
101  uint8_t opcode;
102  uint8_t param1; // often same as mode
103  uint16_t param2;
104  uint8_t data[192]; // includes 2-byte CRC. data size is determined by largest possible data section of any
105  // command + crc (see: x08 verify data1 + data2 + data3 + data4)
106  // this is an explicit design trade-off (space) resulting in simplicity in use
107  // and implementation
108  //--- end of packet i/o frame
109 
110  // used for receive
111  uint8_t execTime; // execution time of command by opcode
112 
113  // structure should be packed since it will be transmitted over the wire
114  // this method varies by compiler. As new compilers are supported, add their structure packing method here
115 
116 } ATCAPacket;
117 
118 #pragma pack( pop, ATCAPacket)
119 
120 
123 ATCA_STATUS atDeriveKey(ATCACommand ca_cmd, ATCAPacket *packet, bool has_mac);
124 ATCA_STATUS atECDH(ATCACommand ca_cmd, ATCAPacket *packet);
125 ATCA_STATUS atGenDig(ATCACommand ca_cmd, ATCAPacket *packet, bool is_no_mac_key);
126 ATCA_STATUS atGenKey(ATCACommand ca_cmd, ATCAPacket *packet);
127 ATCA_STATUS atHMAC(ATCACommand ca_cmd, ATCAPacket *packet);
128 ATCA_STATUS atInfo(ATCACommand ca_cmd, ATCAPacket *packet);
129 ATCA_STATUS atLock(ATCACommand ca_cmd, ATCAPacket *packet);
130 ATCA_STATUS atMAC(ATCACommand ca_cmd, ATCAPacket *packet);
131 ATCA_STATUS atNonce(ATCACommand ca_cmd, ATCAPacket *packet);
132 ATCA_STATUS atPause(ATCACommand ca_cmd, ATCAPacket *packet);
134 ATCA_STATUS atRandom(ATCACommand ca_cmd, ATCAPacket *packet);
135 ATCA_STATUS atRead(ATCACommand ca_cmd, ATCAPacket *packet);
137 ATCA_STATUS atSHA(ATCACommand ca_cmd, ATCAPacket *packet, uint16_t write_context_size);
138 ATCA_STATUS atSign(ATCACommand ca_cmd, ATCAPacket *packet);
140 ATCA_STATUS atVerify(ATCACommand ca_cmd, ATCAPacket *packet);
141 ATCA_STATUS atWrite(ATCACommand ca_cmd, ATCAPacket *packet, bool has_mac);
142 ATCA_STATUS atAES(ATCACommand ca_cmd, ATCAPacket *packet);
144 ATCA_STATUS atKDF(ATCACommand ca_cmd, ATCAPacket *packet);
145 
146 bool atIsSHAFamily(ATCADeviceType device_type);
147 bool atIsECCFamily(ATCADeviceType device_type);
148 ATCA_STATUS isATCAError(uint8_t *data);
149 
150 
151 // command helpers
152 void atCRC(size_t length, const uint8_t *data, uint8_t *crc_le);
153 void atCalcCrc(ATCAPacket *pkt);
154 ATCA_STATUS atCheckCrc(const uint8_t *response);
155 
156 
157 /* command definitions */
158 
160 #define ATCA_CMD_SIZE_MIN ((uint8_t)7)
161 #define ATCA_CMD_SIZE_MAX ((uint8_t)4 * 36 + 7)
163 #define CMD_STATUS_SUCCESS ((uint8_t)0x00)
165 #define CMD_STATUS_WAKEUP ((uint8_t)0x11)
167 #define CMD_STATUS_BYTE_PARSE ((uint8_t)0x03)
169 #define CMD_STATUS_BYTE_ECC ((uint8_t)0x05)
171 #define CMD_STATUS_BYTE_EXEC ((uint8_t)0x0F)
173 #define CMD_STATUS_BYTE_COMM ((uint8_t)0xFF)
175 
178 #define ATCA_CHECKMAC ((uint8_t)0x28)
179 #define ATCA_DERIVE_KEY ((uint8_t)0x1C)
180 #define ATCA_INFO ((uint8_t)0x30)
181 #define ATCA_GENDIG ((uint8_t)0x15)
182 #define ATCA_GENKEY ((uint8_t)0x40)
183 #define ATCA_HMAC ((uint8_t)0x11)
184 #define ATCA_LOCK ((uint8_t)0x17)
185 #define ATCA_MAC ((uint8_t)0x08)
186 #define ATCA_NONCE ((uint8_t)0x16)
187 #define ATCA_PAUSE ((uint8_t)0x01)
188 #define ATCA_PRIVWRITE ((uint8_t)0x46)
189 #define ATCA_RANDOM ((uint8_t)0x1B)
190 #define ATCA_READ ((uint8_t)0x02)
191 #define ATCA_SIGN ((uint8_t)0x41)
192 #define ATCA_UPDATE_EXTRA ((uint8_t)0x20)
193 #define ATCA_VERIFY ((uint8_t)0x45)
194 #define ATCA_WRITE ((uint8_t)0x12)
195 #define ATCA_ECDH ((uint8_t)0x43)
196 #define ATCA_COUNTER ((uint8_t)0x24)
197 #define ATCA_SHA ((uint8_t)0x47)
198 #define ATCA_AES ((uint8_t)0x51)
199 #define ATCA_KDF ((uint8_t)0x56)
200 #define ATCA_SECUREBOOT ((uint8_t)0x80)
201 #define ATCA_SELFTEST ((uint8_t)0x77)
202 
203 
204 
205 
211 #define ATCA_BLOCK_SIZE (32)
212 #define ATCA_WORD_SIZE (4)
213 #define ATCA_PUB_KEY_PAD (4)
214 #define ATCA_SERIAL_NUM_SIZE (9)
215 #define ATCA_RSP_SIZE_VAL ((uint8_t)7)
216 #define ATCA_KEY_COUNT (16)
217 #define ATCA_ECC_CONFIG_SIZE (128)
218 #define ATCA_SHA_CONFIG_SIZE (88)
219 #define ATCA_OTP_SIZE (64)
220 #define ATCA_DATA_SIZE (ATCA_KEY_COUNT * ATCA_KEY_SIZE)
221 #define ATCA_AES_GFM_SIZE ATCA_BLOCK_SIZE
222 
223 #define ATCA_CHIPMODE_OFFSET (19)
224 #define ATCA_CHIPMODE_I2C_ADDRESS_FLAG ((uint8_t)0x01)
225 #define ATCA_CHIPMODE_TTL_ENABLE_FLAG ((uint8_t)0x02)
226 #define ATCA_CHIPMODE_WATCHDOG_MASK ((uint8_t)0x04)
227 #define ATCA_CHIPMODE_WATCHDOG_SHORT ((uint8_t)0x00)
228 #define ATCA_CHIPMODE_WATCHDOG_LONG ((uint8_t)0x04)
229 #define ATCA_CHIPMODE_CLOCK_DIV_MASK ((uint8_t)0xF8)
230 #define ATCA_CHIPMODE_CLOCK_DIV_M0 ((uint8_t)0x00)
231 #define ATCA_CHIPMODE_CLOCK_DIV_M1 ((uint8_t)0x28)
232 #define ATCA_CHIPMODE_CLOCK_DIV_M2 ((uint8_t)0x68)
233 
234 #define ATCA_COUNT_SIZE ((uint8_t)1)
235 #define ATCA_CRC_SIZE ((uint8_t)2)
236 #define ATCA_PACKET_OVERHEAD (ATCA_COUNT_SIZE + ATCA_CRC_SIZE)
237 
238 #define ATCA_PUB_KEY_SIZE (64)
239 #define ATCA_PRIV_KEY_SIZE (32)
240 #define ATCA_SIG_SIZE (64)
241 #define ATCA_KEY_SIZE (32)
242 #define RSA2048_KEY_SIZE (256)
243 
244 #define ATCA_RSP_SIZE_MIN ((uint8_t)4)
245 #define ATCA_RSP_SIZE_4 ((uint8_t)7)
246 #define ATCA_RSP_SIZE_72 ((uint8_t)75)
247 #define ATCA_RSP_SIZE_64 ((uint8_t)67)
248 #define ATCA_RSP_SIZE_32 ((uint8_t)35)
249 #define ATCA_RSP_SIZE_16 ((uint8_t)19)
250 #define ATCA_RSP_SIZE_MAX ((uint8_t)75)
251 
252 #define OUTNONCE_SIZE (32)
253 
254 
256 #define ATCA_KEY_ID_MAX ((uint8_t)15)
257 #define ATCA_OTP_BLOCK_MAX ((uint8_t)1)
258 
262 #define ATCA_COUNT_IDX (0)
263 #define ATCA_OPCODE_IDX (1)
264 #define ATCA_PARAM1_IDX (2)
265 #define ATCA_PARAM2_IDX (3)
266 #define ATCA_DATA_IDX (5)
267 #define ATCA_RSP_DATA_IDX (1)
268 
272 #define ATCA_ZONE_CONFIG ((uint8_t)0x00)
273 #define ATCA_ZONE_OTP ((uint8_t)0x01)
274 #define ATCA_ZONE_DATA ((uint8_t)0x02)
275 #define ATCA_ZONE_MASK ((uint8_t)0x03)
276 #define ATCA_ZONE_ENCRYPTED ((uint8_t)0x40)
277 #define ATCA_ZONE_READWRITE_32 ((uint8_t)0x80)
278 #define ATCA_ADDRESS_MASK_CONFIG (0x001F)
279 #define ATCA_ADDRESS_MASK_OTP (0x000F)
280 #define ATCA_ADDRESS_MASK (0x007F)
281 #define ATCA_TEMPKEY_KEYID (0xFFFF)
282 
286 #define ATCA_B283_KEY_TYPE 0
287 #define ATCA_K283_KEY_TYPE 1
288 #define ATCA_P256_KEY_TYPE 4
289 #define ATCA_AES_KEY_TYPE 6
290 #define ATCA_SHA_KEY_TYPE 7
291 
295 #define AES_MODE_IDX ATCA_PARAM1_IDX
296 #define AES_KEYID_IDX ATCA_PARAM2_IDX
297 #define AES_INPUT_IDX ATCA_DATA_IDX
298 #define AES_COUNT (23)
299 #define AES_MODE_MASK ((uint8_t)0xC7)
300 #define AES_MODE_KEY_BLOCK_MASK ((uint8_t)0xC0)
301 #define AES_MODE_OP_MASK ((uint8_t)0x07)
302 #define AES_MODE_ENCRYPT ((uint8_t)0x00)
303 #define AES_MODE_DECRYPT ((uint8_t)0x01)
304 #define AES_MODE_GFM ((uint8_t)0x03)
305 #define AES_MODE_KEY_BLOCK_POS (6)
306 #define AES_DATA_SIZE (16)
307 #define AES_RSP_SIZE ATCA_RSP_SIZE_16
308 
312 #define CHECKMAC_MODE_IDX ATCA_PARAM1_IDX
313 #define CHECKMAC_KEYID_IDX ATCA_PARAM2_IDX
314 #define CHECKMAC_CLIENT_CHALLENGE_IDX ATCA_DATA_IDX
315 #define CHECKMAC_CLIENT_RESPONSE_IDX (37)
316 #define CHECKMAC_DATA_IDX (69)
317 #define CHECKMAC_COUNT (84)
318 #define CHECKMAC_MODE_CHALLENGE ((uint8_t)0x00)
319 #define CHECKMAC_MODE_BLOCK2_TEMPKEY ((uint8_t)0x01)
320 #define CHECKMAC_MODE_BLOCK1_TEMPKEY ((uint8_t)0x02)
321 #define CHECKMAC_MODE_SOURCE_FLAG_MATCH ((uint8_t)0x04)
322 #define CHECKMAC_MODE_INCLUDE_OTP_64 ((uint8_t)0x20)
323 #define CHECKMAC_MODE_MASK ((uint8_t)0x27)
324 #define CHECKMAC_CLIENT_CHALLENGE_SIZE (32)
325 #define CHECKMAC_CLIENT_RESPONSE_SIZE (32)
326 #define CHECKMAC_OTHER_DATA_SIZE (13)
327 #define CHECKMAC_CLIENT_COMMAND_SIZE (4)
328 #define CHECKMAC_CMD_MATCH (0)
329 #define CHECKMAC_CMD_MISMATCH (1)
330 #define CHECKMAC_RSP_SIZE ATCA_RSP_SIZE_MIN
331 
335 #define COUNTER_COUNT ATCA_CMD_SIZE_MIN
336 #define COUNTER_MODE_IDX ATCA_PARAM1_IDX
337 #define COUNTER_KEYID_IDX ATCA_PARAM2_IDX
338 #define COUNTER_MODE_MASK ((uint8_t)0x01)
339 #define COUNTER_MAX_VALUE ((uint32_t)2097151)
340 #define COUNTER_MODE_READ ((uint8_t)0x00)
341 #define COUNTER_MODE_INCREMENT ((uint8_t)0x01)
342 #define COUNTER_RSP_SIZE ATCA_RSP_SIZE_4
343 
347 #define DERIVE_KEY_RANDOM_IDX ATCA_PARAM1_IDX
348 #define DERIVE_KEY_TARGETKEY_IDX ATCA_PARAM2_IDX
349 #define DERIVE_KEY_MAC_IDX ATCA_DATA_IDX
350 #define DERIVE_KEY_COUNT_SMALL ATCA_CMD_SIZE_MIN
351 #define DERIVE_KEY_MODE ((uint8_t)0x04)
352 #define DERIVE_KEY_COUNT_LARGE (39)
353 #define DERIVE_KEY_RANDOM_FLAG ((uint8_t)4)
354 #define DERIVE_KEY_MAC_SIZE (32)
355 #define DERIVE_KEY_RSP_SIZE ATCA_RSP_SIZE_MIN
356 
360 #define ECDH_PREFIX_MODE ((uint8_t)0x00)
361 #define ECDH_COUNT (ATCA_CMD_SIZE_MIN + ATCA_PUB_KEY_SIZE)
362 #define ECDH_MODE_SOURCE_MASK ((uint8_t)0x01)
363 #define ECDH_MODE_SOURCE_EEPROM_SLOT ((uint8_t)0x00)
364 #define ECDH_MODE_SOURCE_TEMPKEY ((uint8_t)0x01)
365 #define ECDH_MODE_OUTPUT_MASK ((uint8_t)0x02)
366 #define ECDH_MODE_OUTPUT_CLEAR ((uint8_t)0x00)
367 #define ECDH_MODE_OUTPUT_ENC ((uint8_t)0x02)
368 #define ECDH_MODE_COPY_MASK ((uint8_t)0x0C)
369 #define ECDH_MODE_COPY_COMPATIBLE ((uint8_t)0x00)
370 #define ECDH_MODE_COPY_EEPROM_SLOT ((uint8_t)0x04)
371 #define ECDH_MODE_COPY_TEMP_KEY ((uint8_t)0x08)
372 #define ECDH_MODE_COPY_OUTPUT_BUFFER ((uint8_t)0x0C)
373 #define ECDH_KEY_SIZE ATCA_BLOCK_SIZE
374 #define ECDH_RSP_SIZE ATCA_RSP_SIZE_64
375 
379 #define GENDIG_ZONE_IDX ATCA_PARAM1_IDX
380 #define GENDIG_KEYID_IDX ATCA_PARAM2_IDX
381 #define GENDIG_DATA_IDX ATCA_DATA_IDX
382 #define GENDIG_COUNT ATCA_CMD_SIZE_MIN
383 #define GENDIG_ZONE_CONFIG ((uint8_t)0)
384 #define GENDIG_ZONE_OTP ((uint8_t)1)
385 #define GENDIG_ZONE_DATA ((uint8_t)2)
386 #define GENDIG_ZONE_SHARED_NONCE ((uint8_t)3)
387 #define GENDIG_ZONE_COUNTER ((uint8_t)4)
388 #define GENDIG_ZONE_KEY_CONFIG ((uint8_t)5)
389 #define GENDIG_RSP_SIZE ATCA_RSP_SIZE_MIN
390 
394 #define GENKEY_MODE_IDX ATCA_PARAM1_IDX
395 #define GENKEY_KEYID_IDX ATCA_PARAM2_IDX
396 #define GENKEY_DATA_IDX (5)
397 #define GENKEY_COUNT ATCA_CMD_SIZE_MIN
398 #define GENKEY_COUNT_DATA (10)
399 #define GENKEY_OTHER_DATA_SIZE (3)
400 #define GENKEY_MODE_MASK ((uint8_t)0x1C)
401 #define GENKEY_MODE_PRIVATE ((uint8_t)0x04)
402 #define GENKEY_MODE_PUBLIC ((uint8_t)0x00)
403 #define GENKEY_MODE_DIGEST ((uint8_t)0x08)
404 #define GENKEY_MODE_PUBKEY_DIGEST ((uint8_t)0x10)
405 #define GENKEY_PRIVATE_TO_TEMPKEY ((uint16_t)0xFFFF)
406 #define GENKEY_RSP_SIZE_SHORT ATCA_RSP_SIZE_MIN
407 #define GENKEY_RSP_SIZE_LONG ATCA_RSP_SIZE_64
408 
412 #define HMAC_MODE_IDX ATCA_PARAM1_IDX
413 #define HMAC_KEYID_IDX ATCA_PARAM2_IDX
414 #define HMAC_COUNT ATCA_CMD_SIZE_MIN
415 #define HMAC_MODE_FLAG_TK_RAND ((uint8_t)0x00)
416 #define HMAC_MODE_FLAG_TK_NORAND ((uint8_t)0x04)
417 #define HMAC_MODE_FLAG_OTP88 ((uint8_t)0x10)
418 #define HMAC_MODE_FLAG_OTP64 ((uint8_t)0x20)
419 #define HMAC_MODE_FLAG_FULLSN ((uint8_t)0x40)
420 #define HMAC_MODE_MASK ((uint8_t)0x74)
421 #define HMAC_DIGEST_SIZE (32)
422 #define HMAC_RSP_SIZE ATCA_RSP_SIZE_32
423 
427 #define INFO_PARAM1_IDX ATCA_PARAM1_IDX
428 #define INFO_PARAM2_IDX ATCA_PARAM2_IDX
429 #define INFO_COUNT ATCA_CMD_SIZE_MIN
430 #define INFO_MODE_REVISION ((uint8_t)0x00)
431 #define INFO_MODE_KEY_VALID ((uint8_t)0x01)
432 #define INFO_MODE_STATE ((uint8_t)0x02)
433 #define INFO_MODE_GPIO ((uint8_t)0x03)
434 #define INFO_MODE_VOL_KEY_PERMIT ((uint8_t)0x04)
435 #define INFO_MODE_MAX ((uint8_t)0x03)
436 #define INFO_NO_STATE ((uint8_t)0x00)
437 #define INFO_OUTPUT_STATE_MASK ((uint8_t)0x01)
438 #define INFO_DRIVER_STATE_MASK ((uint8_t)0x02)
439 #define INFO_PARAM2_SET_LATCH_STATE ((uint16_t)0x0002)
440 #define INFO_PARAM2_LATCH_SET ((uint16_t)0x0001)
441 #define INFO_PARAM2_LATCH_CLEAR ((uint16_t)0x0000)
442 #define INFO_SIZE ((uint8_t)0x04)
443 #define INFO_RSP_SIZE ATCA_RSP_SIZE_VAL
444 
448 #define KDF_MODE_IDX ATCA_PARAM1_IDX
449 #define KDF_KEYID_IDX ATCA_PARAM2_IDX
450 #define KDF_DETAILS_IDX ATCA_DATA_IDX
451 #define KDF_DETAILS_SIZE 4
452 #define KDF_MESSAGE_IDX (ATCA_DATA_IDX + KDF_DETAILS_SIZE)
453 
454 #define KDF_MODE_SOURCE_MASK ((uint8_t)0x03)
455 #define KDF_MODE_SOURCE_TEMPKEY ((uint8_t)0x00)
456 #define KDF_MODE_SOURCE_TEMPKEY_UP ((uint8_t)0x01)
457 #define KDF_MODE_SOURCE_SLOT ((uint8_t)0x02)
458 #define KDF_MODE_SOURCE_ALTKEYBUF ((uint8_t)0x03)
459 
460 #define KDF_MODE_TARGET_MASK ((uint8_t)0x1C)
461 #define KDF_MODE_TARGET_TEMPKEY ((uint8_t)0x00)
462 #define KDF_MODE_TARGET_TEMPKEY_UP ((uint8_t)0x04)
463 #define KDF_MODE_TARGET_SLOT ((uint8_t)0x08)
464 #define KDF_MODE_TARGET_ALTKEYBUF ((uint8_t)0x0C)
465 #define KDF_MODE_TARGET_OUTPUT ((uint8_t)0x10)
466 #define KDF_MODE_TARGET_OUTPUT_ENC ((uint8_t)0x14)
467 
468 #define KDF_MODE_ALG_MASK ((uint8_t)0x60)
469 #define KDF_MODE_ALG_PRF ((uint8_t)0x00)
470 #define KDF_MODE_ALG_AES ((uint8_t)0x20)
471 #define KDF_MODE_ALG_HKDF ((uint8_t)0x40)
472 
473 #define KDF_DETAILS_PRF_KEY_LEN_MASK ((uint32_t)0x00000003)
474 #define KDF_DETAILS_PRF_KEY_LEN_16 ((uint32_t)0x00000000)
475 #define KDF_DETAILS_PRF_KEY_LEN_32 ((uint32_t)0x00000001)
476 #define KDF_DETAILS_PRF_KEY_LEN_48 ((uint32_t)0x00000002)
477 #define KDF_DETAILS_PRF_KEY_LEN_64 ((uint32_t)0x00000003)
478 
479 #define KDF_DETAILS_PRF_TARGET_LEN_MASK ((uint32_t)0x00000100)
480 #define KDF_DETAILS_PRF_TARGET_LEN_32 ((uint32_t)0x00000000)
481 #define KDF_DETAILS_PRF_TARGET_LEN_64 ((uint32_t)0x00000100)
482 
483 #define KDF_DETAILS_PRF_AEAD_MASK ((uint32_t)0x00000600)
484 #define KDF_DETAILS_PRF_AEAD_MODE0 ((uint32_t)0x00000000)
485 #define KDF_DETAILS_PRF_AEAD_MODE1 ((uint32_t)0x00000200)
486 
487 #define KDF_DETAILS_AES_KEY_LOC_MASK ((uint32_t)0x00000003)
488 
489 #define KDF_DETAILS_HKDF_MSG_LOC_MASK ((uint32_t)0x00000003)
490 #define KDF_DETAILS_HKDF_MSG_LOC_SLOT ((uint32_t)0x00000000)
491 #define KDF_DETAILS_HKDF_MSG_LOC_TEMPKEY ((uint32_t)0x00000001)
492 #define KDF_DETAILS_HKDF_MSG_LOC_INPUT ((uint32_t)0x00000002)
493 #define KDF_DETAILS_HKDF_MSG_LOC_IV ((uint32_t)0x00000003)
494 #define KDF_DETAILS_HKDF_ZERO_KEY ((uint32_t)0x00000004)
495 
499 #define LOCK_ZONE_IDX ATCA_PARAM1_IDX
500 #define LOCK_SUMMARY_IDX ATCA_PARAM2_IDX
501 #define LOCK_COUNT ATCA_CMD_SIZE_MIN
502 #define LOCK_ZONE_CONFIG ((uint8_t)0x00)
503 #define LOCK_ZONE_DATA ((uint8_t)0x01)
504 #define LOCK_ZONE_DATA_SLOT ((uint8_t)0x02)
505 #define LOCK_ZONE_NO_CRC ((uint8_t)0x80)
506 #define LOCK_ZONE_MASK (0xBF)
507 #define ATCA_UNLOCKED (0x55)
508 #define ATCA_LOCKED (0x00)
509 #define LOCK_RSP_SIZE ATCA_RSP_SIZE_MIN
510 
514 #define MAC_MODE_IDX ATCA_PARAM1_IDX
515 #define MAC_KEYID_IDX ATCA_PARAM2_IDX
516 #define MAC_CHALLENGE_IDX ATCA_DATA_IDX
517 #define MAC_COUNT_SHORT ATCA_CMD_SIZE_MIN
518 #define MAC_COUNT_LONG (39)
519 #define MAC_MODE_CHALLENGE ((uint8_t)0x00)
520 #define MAC_MODE_BLOCK2_TEMPKEY ((uint8_t)0x01)
521 #define MAC_MODE_BLOCK1_TEMPKEY ((uint8_t)0x02)
522 #define MAC_MODE_SOURCE_FLAG_MATCH ((uint8_t)0x04)
523 #define MAC_MODE_PTNONCE_TEMPKEY ((uint8_t)0x06)
524 #define MAC_MODE_PASSTHROUGH ((uint8_t)0x07)
525 #define MAC_MODE_INCLUDE_OTP_88 ((uint8_t)0x10)
526 #define MAC_MODE_INCLUDE_OTP_64 ((uint8_t)0x20)
527 #define MAC_MODE_INCLUDE_SN ((uint8_t)0x40)
528 #define MAC_CHALLENGE_SIZE (32)
529 #define MAC_SIZE (32)
530 #define MAC_MODE_MASK ((uint8_t)0x77)
531 #define MAC_RSP_SIZE ATCA_RSP_SIZE_32
532 
536 #define NONCE_MODE_IDX ATCA_PARAM1_IDX
537 #define NONCE_PARAM2_IDX ATCA_PARAM2_IDX
538 #define NONCE_INPUT_IDX ATCA_DATA_IDX
539 #define NONCE_COUNT_SHORT (ATCA_CMD_SIZE_MIN + 20)
540 #define NONCE_COUNT_LONG (ATCA_CMD_SIZE_MIN + 32)
541 #define NONCE_COUNT_LONG_64 (ATCA_CMD_SIZE_MIN + 64)
542 #define NONCE_MODE_MASK ((uint8_t)0x03)
543 #define NONCE_MODE_SEED_UPDATE ((uint8_t)0x00)
544 #define NONCE_MODE_NO_SEED_UPDATE ((uint8_t)0x01)
545 #define NONCE_MODE_INVALID ((uint8_t)0x02)
546 #define NONCE_MODE_PASSTHROUGH ((uint8_t)0x03)
547 
548 #define NONCE_MODE_INPUT_LEN_MASK ((uint8_t)0x20)
549 #define NONCE_MODE_INPUT_LEN_32 ((uint8_t)0x00)
550 #define NONCE_MODE_INPUT_LEN_64 ((uint8_t)0x20)
551 
552 #define NONCE_MODE_TARGET_MASK ((uint8_t)0xC0)
553 #define NONCE_MODE_TARGET_TEMPKEY ((uint8_t)0x00)
554 #define NONCE_MODE_TARGET_MSGDIGBUF ((uint8_t)0x40)
555 #define NONCE_MODE_TARGET_ALTKEYBUF ((uint8_t)0x80)
556 
557 #define NONCE_ZERO_CALC_MASK ((uint16_t)0x8000)
558 #define NONCE_ZERO_CALC_RANDOM ((uint16_t)0x0000)
559 #define NONCE_ZERO_CALC_TEMPKEY ((uint16_t)0x8000)
560 
561 #define NONCE_NUMIN_SIZE (20)
562 #define NONCE_NUMIN_SIZE_PASSTHROUGH (32)
563 
564 #define NONCE_RSP_SIZE_SHORT ATCA_RSP_SIZE_MIN
565 #define NONCE_RSP_SIZE_LONG ATCA_RSP_SIZE_32
566 
570 #define PAUSE_SELECT_IDX ATCA_PARAM1_IDX
571 #define PAUSE_PARAM2_IDX ATCA_PARAM2_IDX
572 #define PAUSE_COUNT ATCA_CMD_SIZE_MIN
573 #define PAUSE_RSP_SIZE ATCA_RSP_SIZE_MIN
574 
578 #define PRIVWRITE_ZONE_IDX ATCA_PARAM1_IDX
579 #define PRIVWRITE_KEYID_IDX ATCA_PARAM2_IDX
580 #define PRIVWRITE_VALUE_IDX ( 5)
581 #define PRIVWRITE_MAC_IDX (41)
582 #define PRIVWRITE_COUNT (75)
583 #define PRIVWRITE_ZONE_MASK ((uint8_t)0x40)
584 #define PRIVWRITE_MODE_ENCRYPT ((uint8_t)0x40)
585 #define PRIVWRITE_RSP_SIZE ATCA_RSP_SIZE_MIN
586 
590 #define RANDOM_MODE_IDX ATCA_PARAM1_IDX
591 #define RANDOM_PARAM2_IDX ATCA_PARAM2_IDX
592 #define RANDOM_COUNT ATCA_CMD_SIZE_MIN
593 #define RANDOM_SEED_UPDATE ((uint8_t)0x00)
594 #define RANDOM_NO_SEED_UPDATE ((uint8_t)0x01)
595 #define RANDOM_NUM_SIZE ((uint8_t)32)
596 #define RANDOM_RSP_SIZE ATCA_RSP_SIZE_32
597 
601 #define READ_ZONE_IDX ATCA_PARAM1_IDX
602 #define READ_ADDR_IDX ATCA_PARAM2_IDX
603 #define READ_COUNT ATCA_CMD_SIZE_MIN
604 #define READ_ZONE_MASK ((uint8_t)0x83)
605 #define READ_4_RSP_SIZE ATCA_RSP_SIZE_VAL
606 #define READ_32_RSP_SIZE ATCA_RSP_SIZE_32
607 
611 #define SECUREBOOT_MODE_IDX ATCA_PARAM1_IDX
612 #define SECUREBOOT_DIGEST_SIZE (32)
613 #define SECUREBOOT_SIGNATURE_SIZE (64)
614 #define SECUREBOOT_COUNT_DIG (ATCA_CMD_SIZE_MIN + SECUREBOOT_DIGEST_SIZE)
615 #define SECUREBOOT_COUNT_DIG_SIG (ATCA_CMD_SIZE_MIN + SECUREBOOT_DIGEST_SIZE + SECUREBOOT_SIGNATURE_SIZE)
616 #define SECUREBOOT_MAC_SIZE (32)
617 #define SECUREBOOT_RSP_SIZE_NO_MAC ATCA_RSP_SIZE_MIN
618 #define SECUREBOOT_RSP_SIZE_MAC (ATCA_PACKET_OVERHEAD + SECUREBOOT_MAC_SIZE)
619 
620 #define SECUREBOOT_MODE_MASK ((uint8_t)0x07)
621 #define SECUREBOOT_MODE_FULL ((uint8_t)0x05)
622 #define SECUREBOOT_MODE_FULL_STORE ((uint8_t)0x06)
623 #define SECUREBOOT_MODE_FULL_COPY ((uint8_t)0x07)
624 #define SECUREBOOT_MODE_PROHIBIT_FLAG ((uint8_t)0x40)
625 #define SECUREBOOT_MODE_ENC_MAC_FLAG ((uint8_t)0x80)
626 
627 #define SECUREBOOTCONFIG_OFFSET (70)
628 #define SECUREBOOTCONFIG_MODE_MASK ((uint16_t)0x0003)
629 #define SECUREBOOTCONFIG_MODE_DISABLED ((uint16_t)0x0000)
630 #define SECUREBOOTCONFIG_MODE_FULL_BOTH ((uint16_t)0x0001)
631 #define SECUREBOOTCONFIG_MODE_FULL_SIG ((uint16_t)0x0002)
632 #define SECUREBOOTCONFIG_MODE_FULL_DIG ((uint16_t)0x0003)
633 
637 #define SELFTEST_MODE_IDX ATCA_PARAM1_IDX
638 #define SELFTEST_COUNT ATCA_CMD_SIZE_MIN
639 #define SELFTEST_MODE_RNG ((uint8_t)0x01)
640 #define SELFTEST_MODE_ECDSA_SIGN_VERIFY ((uint8_t)0x02)
641 #define SELFTEST_MODE_ECDH ((uint8_t)0x08)
642 #define SELFTEST_MODE_AES ((uint8_t)0x10)
643 #define SELFTEST_MODE_SHA ((uint8_t)0x20)
644 #define SELFTEST_MODE_ALL ((uint8_t)0x3B)
645 #define SELFTEST_RSP_SIZE ATCA_RSP_SIZE_MIN
646 
650 #define SHA_COUNT_SHORT ATCA_CMD_SIZE_MIN
651 #define SHA_COUNT_LONG ATCA_CMD_SIZE_MIN
652 #define ATCA_SHA_DIGEST_SIZE (32)
653 #define SHA_DATA_MAX (64)
654 #define ATCA_SHA256_BLOCK_SIZE (64)
655 #define SHA_CONTEXT_MAX_SIZE (99)
656 
657 #define SHA_MODE_MASK ((uint8_t)0x07)
658 #define SHA_MODE_SHA256_START ((uint8_t)0x00)
659 #define SHA_MODE_SHA256_UPDATE ((uint8_t)0x01)
660 #define SHA_MODE_SHA256_END ((uint8_t)0x02)
661 #define SHA_MODE_SHA256_PUBLIC ((uint8_t)0x03)
662 #define SHA_MODE_HMAC_START ((uint8_t)0x04)
663 #define SHA_MODE_HMAC_UPDATE ((uint8_t)0x01)
664 #define SHA_MODE_HMAC_END ((uint8_t)0x05)
665 #define SHA_MODE_608_HMAC_END ((uint8_t)0x02)
666 #define SHA_MODE_READ_CONTEXT ((uint8_t)0x06)
667 #define SHA_MODE_WRITE_CONTEXT ((uint8_t)0x07)
668 #define SHA_MODE_TARGET_MASK ((uint8_t)0xC0)
669 #define SHA_MODE_TARGET_TEMPKEY ((uint8_t)0x00)
670 #define SHA_MODE_TARGET_MSGDIGBUF ((uint8_t)0x40)
671 #define SHA_MODE_TARGET_OUT_ONLY ((uint8_t)0xC0)
672 
673 #define SHA_RSP_SIZE ATCA_RSP_SIZE_32
674 #define SHA_RSP_SIZE_SHORT ATCA_RSP_SIZE_MIN
675 #define SHA_RSP_SIZE_LONG ATCA_RSP_SIZE_32
676 
680 #define SIGN_MODE_IDX ATCA_PARAM1_IDX
681 #define SIGN_KEYID_IDX ATCA_PARAM2_IDX
682 #define SIGN_COUNT ATCA_CMD_SIZE_MIN
683 #define SIGN_MODE_MASK ((uint8_t)0xE1)
684 #define SIGN_MODE_INTERNAL ((uint8_t)0x00)
685 #define SIGN_MODE_INVALIDATE ((uint8_t)0x01)
686 #define SIGN_MODE_INCLUDE_SN ((uint8_t)0x40)
687 #define SIGN_MODE_EXTERNAL ((uint8_t)0x80)
688 #define SIGN_MODE_SOURCE_MASK ((uint8_t)0x20)
689 #define SIGN_MODE_SOURCE_TEMPKEY ((uint8_t)0x00)
690 #define SIGN_MODE_SOURCE_MSGDIGBUF ((uint8_t)0x20)
691 #define SIGN_RSP_SIZE ATCA_RSP_SIZE_MAX
692 
696 #define UPDATE_MODE_IDX ATCA_PARAM1_IDX
697 #define UPDATE_VALUE_IDX ATCA_PARAM2_IDX
698 #define UPDATE_COUNT ATCA_CMD_SIZE_MIN
699 #define UPDATE_MODE_USER_EXTRA ((uint8_t)0x00)
700 #define UPDATE_MODE_SELECTOR ((uint8_t)0x01)
701 #define UPDATE_MODE_USER_EXTRA_ADD UPDATE_MODE_SELECTOR
702 #define UPDATE_MODE_DEC_COUNTER ((uint8_t)0x02)
703 #define UPDATE_RSP_SIZE ATCA_RSP_SIZE_MIN
704 
708 #define VERIFY_MODE_IDX ATCA_PARAM1_IDX
709 #define VERIFY_KEYID_IDX ATCA_PARAM2_IDX
710 #define VERIFY_DATA_IDX ( 5)
711 #define VERIFY_256_STORED_COUNT ( 71)
712 #define VERIFY_283_STORED_COUNT ( 79)
713 #define VERIFY_256_VALIDATE_COUNT ( 90)
714 #define VERIFY_283_VALIDATE_COUNT ( 98)
715 #define VERIFY_256_EXTERNAL_COUNT (135)
716 #define VERIFY_283_EXTERNAL_COUNT (151)
717 #define VERIFY_256_KEY_SIZE ( 64)
718 #define VERIFY_283_KEY_SIZE ( 72)
719 #define VERIFY_256_SIGNATURE_SIZE ( 64)
720 #define VERIFY_283_SIGNATURE_SIZE ( 72)
721 #define VERIFY_OTHER_DATA_SIZE ( 19)
722 #define VERIFY_MODE_MASK ((uint8_t)0x03)
723 #define VERIFY_MODE_STORED ((uint8_t)0x00)
724 #define VERIFY_MODE_VALIDATE_EXTERNAL ((uint8_t)0x01)
725 #define VERIFY_MODE_EXTERNAL ((uint8_t)0x02)
726 #define VERIFY_MODE_VALIDATE ((uint8_t)0x03)
727 #define VERIFY_MODE_INVALIDATE ((uint8_t)0x07)
728 #define VERIFY_MODE_SOURCE_MASK ((uint8_t)0x20)
729 #define VERIFY_MODE_SOURCE_TEMPKEY ((uint8_t)0x00)
730 #define VERIFY_MODE_SOURCE_MSGDIGBUF ((uint8_t)0x20)
731 #define VERIFY_MODE_MAC_FLAG ((uint8_t)0x80)
732 #define VERIFY_KEY_B283 ((uint16_t)0x0000)
733 #define VERIFY_KEY_K283 ((uint16_t)0x0001)
734 #define VERIFY_KEY_P256 ((uint16_t)0x0004)
735 #define VERIFY_RSP_SIZE ATCA_RSP_SIZE_MIN
736 #define VERIFY_RSP_SIZE_MAC ATCA_RSP_SIZE_32
737 
741 #define WRITE_ZONE_IDX ATCA_PARAM1_IDX
742 #define WRITE_ADDR_IDX ATCA_PARAM2_IDX
743 #define WRITE_VALUE_IDX ATCA_DATA_IDX
744 #define WRITE_MAC_VS_IDX ( 9)
745 #define WRITE_MAC_VL_IDX (37)
746 #define WRITE_MAC_SIZE (32)
747 #define WRITE_ZONE_MASK ((uint8_t)0xC3)
748 #define WRITE_ZONE_WITH_MAC ((uint8_t)0x40)
749 #define WRITE_ZONE_OTP ((uint8_t)1)
750 #define WRITE_ZONE_DATA ((uint8_t)2)
751 #define WRITE_RSP_SIZE ATCA_RSP_SIZE_MIN
752 
754 #ifdef __cplusplus
755 }
756 #endif
757 #endif
758 
atca_command is the C object backing ATCACommand.
Definition: atca_command.h:52
ATCA_STATUS atCheckMAC(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand CheckMAC method.
Definition: atca_command.c:45
ATCA_STATUS atAES(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand AES method.
Definition: atca_command.c:490
ATCA_STATUS atInfo(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand Info method.
Definition: atca_command.c:175
void atCalcCrc(ATCAPacket *pkt)
This function calculates CRC and adds it to the correct offset in the packet data.
Definition: atca_command.c:647
ATCA_STATUS atSecureBoot(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand SecureBoot method.
Definition: atca_command.c:321
ATCA_STATUS atHMAC(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand HMAC method.
Definition: atca_command.c:161
uint16_t param2
Definition: atca_command.h:103
ATCA_STATUS atLock(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand Lock method.
Definition: atca_command.c:189
ATCA_STATUS isATCAError(uint8_t *data)
checks for basic error frame in data
Definition: atca_command.c:723
ATCA_STATUS
Definition: atca_status.h:41
ATCA_STATUS atPrivWrite(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand PrivWrite method.
Definition: atca_command.c:279
ATCA_STATUS atUpdateExtra(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand UpdateExtra method.
Definition: atca_command.c:410
ATCA_STATUS atMAC(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand MAC method.
Definition: atca_command.c:203
uint8_t _reserved
Definition: atca_command.h:97
ATCA_STATUS atDeriveKey(ATCACommand ca_cmd, ATCAPacket *packet, bool has_mac)
ATCACommand DeriveKey method.
Definition: atca_command.c:74
struct atca_command * ATCACommand
Definition: atca_command.h:60
ATCA_STATUS atGenDig(ATCACommand ca_cmd, ATCAPacket *packet, bool is_no_mac_key)
ATCACommand Generate Digest method.
Definition: atca_command.c:113
ATCA_STATUS atWrite(ATCACommand ca_cmd, ATCAPacket *packet, bool has_mac)
ATCACommand Write method.
Definition: atca_command.c:463
bool atIsSHAFamily(ATCADeviceType device_type)
determines if a given device type is a SHA device or a superset of a SHA device
Definition: atca_command.c:682
bool atIsECCFamily(ATCADeviceType device_type)
determines if a given device type is an ECC device or a superset of a ECC device
Definition: atca_command.c:703
ATCACommand newATCACommand(ATCADeviceType device_type)
constructor for ATCACommand
Definition: atca_command.c:575
ATCA_STATUS atNonce(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand Nonce method.
Definition: atca_command.c:225
ATCA_STATUS atPause(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand Pause method.
Definition: atca_command.c:265
ATCA_STATUS atKDF(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand KDF method.
Definition: atca_command.c:530
ATCA_STATUS atSelfTest(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand AES method.
Definition: atca_command.c:513
ATCA_STATUS atRead(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand Read method.
Definition: atca_command.c:307
void atCRC(size_t length, const uint8_t *data, uint8_t *crc_le)
Calculates CRC over the given raw data and returns the CRC in little-endian byte order.
Definition: atca_command.c:617
ATCA_STATUS atCheckCrc(const uint8_t *response)
This function checks the consistency of a response.
Definition: atca_command.c:665
uint8_t execTime
Definition: atca_command.h:111
ATCADeviceType
The supported Device type in Cryptoauthlib library.
Definition: atca_devtypes.h:41
void deleteATCACommand(ATCACommand *ca_cmd)
ATCACommand destructor.
Definition: atca_command.c:597
ATCA_STATUS atRandom(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand Random method.
Definition: atca_command.c:293
ATCA_STATUS initATCACommand(ATCADeviceType device_type, ATCACommand ca_cmd)
Initializer for ATCACommand.
Definition: atca_command.c:556
ATCA_STATUS atVerify(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand ECDSA Verify method.
Definition: atca_command.c:424
Microchip Crypto Auth.
uint8_t opcode
Definition: atca_command.h:101
uint8_t txsize
Definition: atca_command.h:100
uint8_t clock_divider
Definition: atca_command.h:55
ATCA_STATUS atSign(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand Sign method.
Definition: atca_command.c:396
ATCA_STATUS atCounter(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand Counter method.
Definition: atca_command.c:59
uint16_t execution_time_msec
Definition: atca_command.h:56
ATCA_STATUS atSHA(ATCACommand ca_cmd, ATCAPacket *packet, uint16_t write_context_size)
ATCACommand SHA method.
Definition: atca_command.c:352
ATCADeviceType dt
Definition: atca_command.h:54
ATCA_STATUS atGenKey(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand Generate Key method.
Definition: atca_command.c:139
Microchip Crypto Auth status codes.
an ATCA packet structure. This is a superset of the packet transmitted on the wire. It&#39;s also used as a buffer for receiving the response
Definition: atca_command.h:93
CryptoAuthLiub is meant to be portable across architectures, even non-Microchip architectures and com...
ATCA_STATUS atECDH(ATCACommand ca_cmd, ATCAPacket *packet)
ATCACommand ECDH method.
Definition: atca_command.c:98
uint8_t param1
Definition: atca_command.h:102