summaryrefslogtreecommitdiffstats
path: root/security/nss/automation/saw/poly1305.saw
diff options
context:
space:
mode:
Diffstat (limited to 'security/nss/automation/saw/poly1305.saw')
-rw-r--r--security/nss/automation/saw/poly1305.saw47
1 files changed, 47 insertions, 0 deletions
diff --git a/security/nss/automation/saw/poly1305.saw b/security/nss/automation/saw/poly1305.saw
new file mode 100644
index 000000000..44be1e3e0
--- /dev/null
+++ b/security/nss/automation/saw/poly1305.saw
@@ -0,0 +1,47 @@
+// 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));