Software-Emulated Pointer Authentication for Control-Flow Integrity Protection