SPRACT3A September 2020 – June 2026 F29H850TU , F29H859TU-Q1 , F29P329SM-Q1 , TMS320F2800132 , TMS320F2800133 , TMS320F2800135 , TMS320F2800137 , TMS320F280033 , TMS320F280034 , TMS320F280034-Q1 , TMS320F280036-Q1 , TMS320F280036C-Q1 , TMS320F280037 , TMS320F280037-Q1 , TMS320F280037C , TMS320F280037C-Q1 , TMS320F280038-Q1 , TMS320F280038C-Q1 , TMS320F280039 , TMS320F280039-Q1 , TMS320F280039C , TMS320F280039C-Q1 , TMS320F28384D , TMS320F28384D-Q1 , TMS320F28384S , TMS320F28384S-Q1 , TMS320F28386D , TMS320F28386D-Q1 , TMS320F28386S , TMS320F28386S-Q1 , TMS320F28388D , TMS320F28388S , TMS320F28P550SG , TMS320F28P550SJ , TMS320F28P559SG-Q1 , TMS320F28P559SJ-Q1 , TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1
The hex2000 utility does not feed the flash binary directly to the AES-128-CMAC algorithm. Before computing the authentication tag, it applies the swapwords transform, which swaps the two 16-bit words within each 32-bit group of the binary data.
For each group of 4 consecutive bytes [b0, b1, b2, b3] in the binary, where:
swapwords([b0, b1, b2, b3]) = [b2, b3, b0, b1]
This swaps the two 16-bit words within each 32-bit group, keeping each word's bytes in their natural (little-endian) order. This is equivalent to reading each pair of C28x words in reverse order (high word at N+1 before low word at N). This operation is self-invertible, meaning that applying the transformation twice to any input returns the original data unchanged.
After the AES-128-CMAC tag has been computed over the transformed data, hex2000 applies the same swapwords transform a second time to the 16-byte tag itself before embedding it in the flash image at the golden CMAC tag location (byte offset +0x4 from the flash bank entry address, corresponding to C28x word address +0x2). Both of these transforms must be replicated when using OpenSSL in order to produce a stored tag that is byte-for-byte identical to the one generated by hex2000.