{"id":606273,"date":"2019-09-05T09:01:41","date_gmt":"2019-09-05T16:01:41","guid":{"rendered":"https:\/\/www.microsoft.com\/en-us\/research\/?p=606273"},"modified":"2020-06-08T10:18:25","modified_gmt":"2020-06-08T17:18:25","slug":"project-everest-advancing-the-science-of-program-proof","status":"publish","type":"post","link":"https:\/\/www.microsoft.com\/en-us\/research\/blog\/project-everest-advancing-the-science-of-program-proof\/","title":{"rendered":"Project Everest: Advancing the science of program proof"},"content":{"rendered":"
(opens in new tab)<\/span><\/a><\/p>\n Project Everest (opens in new tab)<\/span><\/a> is a multiyear collaborative effort focused on building a verified, secure communications stack designed to improve the security of HTTPS, a key internet safeguard. This post\u2014about the proving methodology and verification tools of Project Everest\u2014is the third in a series exploring the groundbreaking work, which is available on GitHub (opens in new tab)<\/span><\/a> now.<\/em><\/p>\n Building, deploying, and maintaining software at scale is a large engineering effort, and when that software is intertwined with machine-checked proofs of correctness, the engineering involved is largely without precedent. In Project Everest (opens in new tab)<\/span><\/a>, dozens of researchers and engineers push to five open-source GitHub repositories, building about 600,000 lines of code and proofs, continuously integrated using Azure DevOps, hundreds of times every day. There have been countless hard-won lessons on software and proof-engineering best practices, ranging from developing and maintaining robust proofs in the face of an evolving codebase to tweaking the format of our compilers to enable humans to audit the C and assembly-language code produced by our software verification toolchain.<\/p>\n But this post isn’t about the engineering. It\u2019s about the science that underlies it\u2014the science of program proof. I mean proving deep theorems<\/em> about programs, proofs that establish that the full semantics of a program adhere to a mathematical model of all<\/em> its behaviors, not just theorems proving, say, the absence of specific kinds of bugs (which is, of course, also useful!).<\/p>\n From the early days of computer science, the potential of program proof to eradicate large classes of software errors has been widely recognized; however, until recently, few practical applications were feasible. The proof techniques were difficult to apply to full-fledged programming languages, and proofs were hard to scale to large programs. Oftentimes, the proofs that were done came at the cost of other important aspects of software, such as performance. But today, what seemed impossible just a few years ago is becoming a reality. We can, in certain domains, produce fully verified software at a nontrivial scale and with runtime performance that meets or exceeds the best unverified software.<\/p>\n Project Everest is a case in point: We produce verified cryptographic routines, parsers, and protocols that are deployed in production settings with strong correctness and security guarantees and<\/em> great performance. Our recently released EverCrypt cryptographic provider (opens in new tab)<\/span><\/a> consists of 23,000 lines of verified C code and 18,000 lines of verified assembly code extracted from 107,000 lines of code and proof in the F* programming language and proof assistant\u2014a development effort of roughly three person-years. The chart below shows the throughput of several verified cryptographic routines since 2014. Over the last five years, there\u2019s been slow but steady improvement, but this year, with EverCrypt, we made a noticeable jump to finally verify the fastest assembly code of OpenSSL (opens in new tab)<\/span><\/a> for AES-GCM, a crypto routine used by 90 percent of secure internet connections.<\/p>\nFast\u2014and verified\u2014secure communication code<\/h3>\n