Hardware Mechanisms for Memory Authentication: A Survey of Existing Techniques and Engines