| // This Source Code Form is subject to the terms of the Mozilla Public |
| // License, v. 2.0. If a copy of the MPL was not distributed with this |
| // file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| import "poly1305.cry" as poly1305; |
| |
| print "Proving Poly1305 spec..."; |
| prove_print abc {{ poly1305::allTestsPass }}; |
| |
| print "Loading LLVM bitcode..."; |
| m <- llvm_load_module "../../../dist/Debug/lib/libfreeblpriv3.so.bc"; |
| |
| let SpecPoly1305 n = do { |
| llvm_ptr "out" (llvm_array 16 (llvm_int 8)); |
| out <- llvm_var "*out" (llvm_array 16 (llvm_int 8)); |
| |
| llvm_ptr "ad" (llvm_array 16 (llvm_int 8)); |
| ad <- llvm_var "*ad" (llvm_array 16 (llvm_int 8)); |
| |
| adLen <- llvm_var "adLen" (llvm_int 32); |
| |
| llvm_ptr "ciphertext" (llvm_array n (llvm_int 8)); |
| ciphertext <- llvm_var "*ciphertext" (llvm_array n (llvm_int 8)); |
| |
| ciphertextLen <- llvm_var "ciphertextLen" (llvm_int 32); |
| |
| llvm_ptr "key" (llvm_array 32 (llvm_int 8)); |
| key <- llvm_var "*key" (llvm_array 32 (llvm_int 8)); |
| |
| llvm_assert_eq "*ad" {{ zero : [16][8] }}; |
| llvm_assert_eq "adLen" {{ 16 : [32] }}; |
| |
| llvm_assert_eq "*ciphertext" {{ zero : [n][8] }}; |
| llvm_assert_eq "ciphertextLen" {{ `n : [32] }}; |
| |
| llvm_assert_eq "*key" {{ zero : [32][8] }}; |
| |
| let res = {{ poly1305::Poly1305 (ad # ciphertext # [16, 0, 0, 0, 0, 0, 0, 0] # [`n, 0, 0, 0, 0, 0, 0, 0]) (take`{16} key) (drop`{16} key) }}; |
| llvm_ensure_eq "*out" {{ res }}; |
| |
| llvm_verify_tactic abc; |
| }; |
| |
| print "Proving equality for a single block..."; |
| // This is currently disabled as it takes way too long. We need to help Z3 |
| // prove this before we can enable it on Taskcluster. |
| //time (llvm_verify m "Poly1305Do" [] (SpecPoly1305 16)); |