A Formal Methodology for Verifying Side-Channel Vulnerabilities in Cache Architectures