So... our devices end up in locations that are really only accessible to the end users. We need to provide the ability to do firmware updates in the field, without compromising code security.
The user receives an Intel HEX file of the firmware which has been rewritten with all the data regions XOR'd with a fixed pseudorandom sequence from a modified RNG. We have a bootloader in the devices that descrambles the incoming firmware image as it's received. There are unlikely to be many updates... so there aren't going to be many samples to work with if anyone wants to figure out the RNG sequence.
We are next going to work on configuring DCSM zone 1 to secure all RAM, FLASH and JTAG access.
Are we missing anything? This is obviously not GREAT security, but we just want to make it difficult enough that our customers are unlikely to attempt to copy our product.