From d3ab3febb6c1b0250e01315f2942938ce9ed0dcf Mon Sep 17 00:00:00 2001 From: Matt Benke Date: Thu, 2 Jun 2022 12:47:08 -0400 Subject: [PATCH 1/6] Migrated relevant changes to new branch based on main --- labs/Demos/SAW/Salsa20/Salsa20.md | 171 ++++++++++++++++++++++++++++++ misc/Salsa20.cry.dot | 25 +++++ misc/Salsa20.cry.png | Bin 0 -> 48885 bytes misc/salsa20.bc.callgraph.dot | 26 +++++ misc/salsa20.bc.png | Bin 0 -> 37560 bytes misc/salsa20.saw.dot | 111 +++++++++++++++++++ misc/salsa20.saw.png | Bin 0 -> 76755 bytes 7 files changed, 333 insertions(+) create mode 100644 labs/Demos/SAW/Salsa20/Salsa20.md create mode 100644 misc/Salsa20.cry.dot create mode 100644 misc/Salsa20.cry.png create mode 100644 misc/salsa20.bc.callgraph.dot create mode 100644 misc/salsa20.bc.png create mode 100644 misc/salsa20.saw.dot create mode 100644 misc/salsa20.saw.png diff --git a/labs/Demos/SAW/Salsa20/Salsa20.md b/labs/Demos/SAW/Salsa20/Salsa20.md new file mode 100644 index 00000000..f16bc1fd --- /dev/null +++ b/labs/Demos/SAW/Salsa20/Salsa20.md @@ -0,0 +1,171 @@ +# Background + +Before starting this module, we recommend perusing Galois's excellent +tutorial on +[_Program Verification with SAW_](https://saw.galois.com/intro/index.html). +That tutorial + * introduces Cryptol and SAW + (you can skip its setup instructions as their installation test + should work in whichever environment you set up for this course) + * specifies and verifies a simple bitcount implementation + * introduces verification of pointer-based implementations + * describes and motivates a _compositional_ verification of Salsa20 + (feel free to return to our module and revisit the next part later) + * offers an extended exercise on proof maintenance for HMAC + +# Uninterpreted Functions + +_Program Verification with SAW_ demonstrates compositional verification +using _overrides_ that reflect an implementation's _callgraph_ to ease +the burden of proof for SAW: + +> The third argument to `crucible_llvm_verify` is a list of +> `CrucibleMethodSpec` objects. While performing verification, the work +> that was done to construct a `CrucibleMethodSpec` is re-used. +> Specifically, instead of recursively symbolically executing a +> verified function, the prior specification is used as an +> axiomatization of its behavior. + +The term _override_ comes from SAW's docstring for `llvm_verify`: + +```SAW +sawscript> :h llvm_verify +Description +----------- + + llvm_verify : LLVMModule -> String -> [LLVMSpec] -> Bool -> LLVMSetup () -> ProofScript () -> TopLevel LLVMSpec + +Verify the LLVM function named by the second parameter in the module +specified by the first. The third parameter lists the LLVMSpec +values returned by previous calls to use as overrides. The fourth (Bool) +parameter enables or disables path satisfiability checking. The fifth +describes how to set up the symbolic execution engine before verification. +And the last gives the script to use to prove the validity of the resulting +verification conditions. +``` + +One might wonder whether similar hints can ease the burden of proof by +axiomatizing a similarly complex Cryptol specification. Such hints are +called +[_uninterpreted functions_](https://www21.in.tum.de/teaching/sar/SS20/6.pdf), +which instruct an SMT solver or interface ( +[SBV](http://leventerkok.github.io/sbv/) or +[What4](https://github.com/GaloisInc/what4)) to an underlying SMT +solver to treat a function (from the specification) as "uninterpreted". +The solver abstracts away these function definitions as arbitrary +functions satisfying the corresponding type signature. This removes any +other constraints on the function, so uninterpretation alone would +typically break a proof. But in conjunction with overrides (which +reintroduce the implementation's constraints on the specification), +this effectively axiomatizes a Cryptol symbol definition, avoiding +recursively expanding its underlying definitions. This is often +useful for implementations that are derived from or closely match a +Cryptol specification, as is the case for Galois's Salsa20 example +(but there are +[tradeoffs](https://es-static.fbk.eu/people/griggio/papers/lpar06_ack.pdf) +for this approach). + +For instance, the following verification of `s20_doubleround` uses both +overrides and uninterpreted functions: + +```SAW +dr <- llvm_verify m "s20_doubleround" [cr,rr] false doubleround_setup w4_unint_z3(['columnround', 'rowround']); +``` + +`cr` and `rr` refer to previous SAW verification results, whereas +`columnround` and `rowround` refer to definitions imported from +`Salsa20.cry`. Though this just shaves a few more tenths of a second +off verification of Salsa20 (and at worst *increases* proof times), +benefits become obvious for more complex verifications such as that of +AES and others in +[LibCrypto](https://github.com/awslabs/aws-lc-verification/blob/master/SAW/proof/AES/AES.saw), +a formally verified cryptographic library for Amazon Web +Services. (This script provides other advanced instructions to aid +SMT solvers that are beyond the scope of this course.) + + +## Practice with Uninterpreted Functions and Overrides + +Now that we have added uninterpreted functions to our repertoire, let's +apply them to Salsa20...but first, let's more closely examine the +Galois tutorial's implementation and progress toward verifying it... + +Clang/LLVM includes a command line tool called +[`opt`](https://llvm.org/docs/CommandGuide/opt.html). `opt` is +primarily an _optimizer_ (hence its name), but can also be used for +bitcode analysis. For now we are interested in its feature to generate +a _callgraph_: + +``` +> cd labs/Demos/Salsa20 +> mkdir build +> clang -c -g -emit-llvm -Iinclude -o build/salsa20.bc src/salsa20.c +> opt -dot-callgraph -o dev/null build/salsa20.bc +cryptol-course/labs/Demos/SAW/Salsa20$ opt -dot-callgraph -o /dev/null build/salsa20.bc +Writing 'build/salsa20.bc.callgraph.dot'... +``` + +This produces a [dot](https://graphviz.org/doc/info/lang.html) graph, +which can be converted to an image viewable in a web browser: + +``` +> dot -Tpng -o build/salsa20.png build/salsa20.bc.callgraph.dot +``` + + + salsa20.bc call graph + + +(`llvm.*` are LLVM "intrinsics" that we can ignore for now.) + +We are not aware of any similar tool to graphically depict Cryptol +modules, but here is a manually generated graph for `Salsa20.cry`: + + + Salsa20.cry partial dependency graph + + +(These also call numerous functions from the Cryptol prelude, but we +can ignore most of these for now. `rotl` implements `(<<<)`, so we +include it in the graph.) + +Finally, here is another manually generated graph that shows which SAW +method specifications are verified (or not) against which +implementation functions, using which Cryptol definitions, and which +potential overrides (based on the implementation's callgraph) and +function uninterpretations (based on dependencies among Cryptol +definitions) are used, in `salsa20.sw`: + + + salsa20.saw verification/override graph + + +This assumes that each function in the implementation is specified by +one SAW method specification, which in turn refers to one Cryptol +specification that closely reflects the function being verified. This +is often not the case, but if so, shows a close correspondence between +specification and implementation, simplifying the assurance case. + +Support for +[visualizing a SAW Remote API for Python script](https://github.com/GaloisInc/saw-script/issues/1664) +is in early development. This dashboard dynamically visualizes the +override graph of a SAW Remote API for Python proof script. + +Informed by these visualizations, perhaps we can fill in some gaps... + +**EXERCISE**: Add uninterpreted functions to `llvm_verify` instructions +(replace `abc` with `w4_unint_{solver}([{uninterpreted functions}])`) in +`salsa20.saw` that are straightforwardly implemented by functions in +`salsa20.bc`. (`s20_quarterround` implements `quarterround`, `s20_hash` +implements `Salsa20`, etc., as depicted by dashed blue edges in the +above graph.) How does this affect proof times? What happens if you +remove the overrides? + +**EXERCISE**: Based on the above `salsa20.saw` diagram, are any +potential overrides missing from other `llvm_verify` instructions in +`salsa20.saw`? (Unused potential overrides are depicted as dashed red +edges in the above graph.) Are any implementation functions left +unspecified or unused in the compositional verification? (Dashed red +edges to nodes without an entry for a SAW method specification.) How +does specifying, verifying, and adding corresponding overrides and +uninterpreted functions affect proof times? diff --git a/misc/Salsa20.cry.dot b/misc/Salsa20.cry.dot new file mode 100644 index 00000000..44d70d43 --- /dev/null +++ b/misc/Salsa20.cry.dot @@ -0,0 +1,25 @@ +digraph "Salsa20.cry" { + label="Salsa20.cry"; + + rotl [label="(<<<)"]; + quarterround; + rowround; + columnround; + doubleround; + littleendian; + littleendian_inverse; + Salsa20; + Salsa20_expansion; + Salsa20_encrypt; + + quarterround -> rotl; + rowround -> quarterround; + columnround -> quarterround; + doubleround -> columnround; + doubleround -> rowround; + Salsa20 -> littleendian; + Salsa20 -> littleendian_inverse; + Salsa20 -> doubleround; + Salsa20_expansion -> Salsa20; + Salsa20_encrypt -> Salsa20_expansion; +} diff --git a/misc/Salsa20.cry.png b/misc/Salsa20.cry.png new file mode 100644 index 0000000000000000000000000000000000000000..ae51b163391ed0028726170eaa995f8413204bf6 GIT binary patch literal 48885 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 YQrqX27RY}i+zC@B%`iJ{>aywo0E11*(f|Me literal 0 HcmV?d00001 diff --git a/misc/salsa20.bc.callgraph.dot b/misc/salsa20.bc.callgraph.dot new file mode 100644 index 00000000..d71e7bc7 --- /dev/null +++ b/misc/salsa20.bc.callgraph.dot @@ -0,0 +1,26 @@ +strict digraph "salsa20.bc" { + label="salsa20.bc"; + + s20_crypt32; + s20_rev_littleendian; + s20_expand32; + s20_hash; + s20_littleendian; + s20_doubleround; + s20_columnround; + s20_rowround; + s20_quarterround; + rotl; + + s20_crypt32 -> s20_rev_littleendian; + s20_crypt32 -> s20_expand32; + s20_expand32 -> s20_hash; + s20_hash -> s20_littleendian; + s20_hash -> s20_doubleround; + s20_hash -> s20_rev_littleendian; + s20_doubleround -> s20_columnround; + s20_doubleround -> s20_rowround; + s20_columnround -> s20_quarterround; + s20_rowround -> s20_quarterround; + s20_quarterround -> rotl; +} diff --git a/misc/salsa20.bc.png b/misc/salsa20.bc.png new file mode 100644 index 0000000000000000000000000000000000000000..70eedf1c72cd1aff16f56e8b75fc2ded721889f0 GIT binary patch literal 37560 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 l6}Oe{|nSt1AqVk literal 0 HcmV?d00001 diff --git a/misc/salsa20.saw.dot b/misc/salsa20.saw.dot new file mode 100644 index 00000000..783353a5 --- /dev/null +++ b/misc/salsa20.saw.dot @@ -0,0 +1,111 @@ +digraph "salsa20.saw.dot" { + label="salsa20.saw"; + + node [shape="plaintext"]; + r [label=< + + + + +
rotl(<<<)
+ >]; + + qr [label=< + + + +
s20_quarterroundquarterround_setupquarterround
>]; + + rr [label=< + + + +
s20_rowroundrowround_setuprowround
>]; + + cr [label=< + + + +
s20_columnroundcolumnround_setupcolumnround
>]; + + dr [label=< + + + +
s20_doublerounddoubleround_setupdoubleround
>]; + + le [label=< + + + +
s20_littleendianlittleendian
>]; + + rle [label=< + + + +
s20_rev_littleendianlittleendian_inverse
>]; + + s20 [label=< + + + +
s20_hashsalsa20_setupSalsa20
>]; + + s20e32 [label=< + + + +
s20_expand32salsa20_expansion_32Salsa20_expansion
>]; + + s20enc_63 [label=< + + + +
s20_crypt32s20_encrypt32 63Salsa20_encrypt
>]; + + s20enc_64 [label=< + + + +
s20_crypt32s20_encrypt32 64Salsa20_encrypt
>]; + + s20enc_65 [label=< + + + +
s20_crypt32s20_encrypt32 65Salsa20_encrypt
>]; + + edge [color="red", style="solid"]; + rr:i -> qr:i; + cr:i -> qr:i; + dr:i -> cr:i; + dr:i -> rr:i; + s20:i -> dr:i; + s20e32:i -> s20:i; + s20enc_63:i -> s20e32:i; + s20enc_64:i -> s20e32:i; + s20enc_65:i -> s20e32:i; + + edge [style="dashed"]; + qr:i -> r:i; + s20:i -> le:i; + s20:i -> rle:i; + s20enc_63:i -> rle:i; + s20enc_64:i -> rle:i; + s20enc_65:i -> rle:i; + + edge [color="blue", style="dashed"]; + qr:c -> r:c; + rr:c -> qr:c; + cr:c -> qr:c; + dr:c -> cr:c; + dr:c -> rr:c; + s20:c -> le:c; + s20:c -> rle:c; + s20:c -> dr:c; + s20e32:c -> s20:c; + s20enc_63:c -> s20e32:c; + s20enc_64:c -> s20e32:c; + s20enc_65:c -> s20e32:c; +} diff --git a/misc/salsa20.saw.png b/misc/salsa20.saw.png new file mode 100644 index 0000000000000000000000000000000000000000..70f0db6c5ec5cd656fcb865e049dc404bd2c1751 GIT binary patch literal 76755 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 Date: Thu, 2 Jun 2022 12:50:32 -0400 Subject: [PATCH 2/6] Corrected typo in reference to `salsa20.saw` --- labs/Demos/SAW/Salsa20/Salsa20.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/labs/Demos/SAW/Salsa20/Salsa20.md b/labs/Demos/SAW/Salsa20/Salsa20.md index f16bc1fd..dac455e4 100644 --- a/labs/Demos/SAW/Salsa20/Salsa20.md +++ b/labs/Demos/SAW/Salsa20/Salsa20.md @@ -134,7 +134,7 @@ method specifications are verified (or not) against which implementation functions, using which Cryptol definitions, and which potential overrides (based on the implementation's callgraph) and function uninterpretations (based on dependencies among Cryptol -definitions) are used, in `salsa20.sw`: +definitions) are used, in `salsa20.saw`: salsa20.saw verification/override graph From ef4bdfb9ed33cba2bd11f7a59455e530bd881367 Mon Sep 17 00:00:00 2001 From: Matt Benke Date: Thu, 2 Jun 2022 13:47:37 -0400 Subject: [PATCH 3/6] Add boilerplate to SAW Salsa20 (Galois) demo --- labs/Demos/SAW/Salsa20/Salsa20.md | 65 +++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/labs/Demos/SAW/Salsa20/Salsa20.md b/labs/Demos/SAW/Salsa20/Salsa20.md index dac455e4..3b115a08 100644 --- a/labs/Demos/SAW/Salsa20/Salsa20.md +++ b/labs/Demos/SAW/Salsa20/Salsa20.md @@ -1,7 +1,19 @@ -# Background - -Before starting this module, we recommend perusing Galois's excellent -tutorial on +# Introduction + +This demo adapts Galois, Inc.'s existing [SAW script](https://github.com/GaloisInc/saw-script/blob/v0.9/examples/salsa20/salsa.saw) +that verifies their own +[Salsa20 implementation](https://github.com/GaloisInc/saw-script/blob/v0.9/examples/salsa20/salsa20.c). +This example implementation is straightforwardly derived from their +Cryptol spec, which in turn closely matches Dr. Daniel J. Bernstein's +[original Salsa20 specification](http://cr.yp.to/snuffle/spec.pdf), +lending itself nicely to a _compositional_ verification with +_overrides_ and _uninterpreted functions_ that reflects the +implementation and specification. + +## Prerequisites + +Before starting this module, we recommend perusing Galois, Inc.'s +excellent tutorial on [_Program Verification with SAW_](https://saw.galois.com/intro/index.html). That tutorial * introduces Cryptol and SAW @@ -13,6 +25,18 @@ That tutorial (feel free to return to our module and revisit the next part later) * offers an extended exercise on proof maintenance for HMAC +## Skills You'll Learn + +After completing the above tutorial, this module will: + * demonstrate use of the Clang/LLVM command line tool + `opt` and the `dot` language and tool to generate and analyze a + _callgraph_ + * explain the correspondence between a callgraph and SAW overrides + (described in Galois's _Program Verification with SAW_) + * introduce you to uninterpreted functions, which in conjunction + with overrides, decomposes a Cryptol specification to potentially + simplify verification for a solver + # Uninterpreted Functions _Program Verification with SAW_ demonstrates compositional verification @@ -105,6 +129,9 @@ cryptol-course/labs/Demos/SAW/Salsa20$ opt -dot-callgraph -o /dev/null build/sal Writing 'build/salsa20.bc.callgraph.dot'... ``` +(Our Salsa20 source and script are a reorganized copy of Galois's +example. Feel free to work from the copy in your tutorial instead.) + This produces a [dot](https://graphviz.org/doc/info/lang.html) graph, which can be converted to an image viewable in a web browser: @@ -169,3 +196,33 @@ unspecified or unused in the compositional verification? (Dashed red edges to nodes without an entry for a SAW method specification.) How does specifying, verifying, and adding corresponding overrides and uninterpreted functions affect proof times? + +**EXERCISE**: This implementation does not work with 128-bit keys as +described in the specs. Add or redefine functions in `salsa20.c` and +verify them accordingly, remembering to add overrides and +uninterpreted functions to your adapted SAW script to reflect your +modified implementation. + +# Conclusion + +In this demo, you learned about compositional verification and how to +leverage various tools to analyze an implementation and specification, +and produce a "complete" verification script to increase confidence in +not only an implementation, but your understanding of it. You saw how +an implementation based closely on a specification potentially +simplifies and boosts confidence in its verification. How might this +compare to an optimized or third-party implementation that agrees with +a specification but differs substantially in its composition...? + +# Solicitation + +How was your experience with this lab? Suggestions are welcome in the +form of a ticket on the course GitHub page: +https://github.com/weaversa/cryptol-course/issues + +# From here, you can go somewhere! + +|||| +|-:|:-:|-| +|| [ ^ SAW Demos](../Demos.md) || +| [< Bit Twiddling](../Bittwiddling/Bittwiddling.md) | **Salsa20 (Galois)** || From eed440bdd9d63faa681187e72aec8dc0315dd77e Mon Sep 17 00:00:00 2001 From: Sean Weaver Date: Thu, 2 Jun 2022 14:14:50 -0400 Subject: [PATCH 4/6] Added Salsa20 to the diagram --- misc/SAWDemos.gv | 5 +++-- misc/SAWDemos.gv.png | Bin 4686 -> 9905 bytes misc/SAWDemos.gv.svg | 47 +++++++++++++++++++++++++++++-------------- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/misc/SAWDemos.gv b/misc/SAWDemos.gv index ed56b8cd..79fc4cf9 100644 --- a/misc/SAWDemos.gv +++ b/misc/SAWDemos.gv @@ -13,20 +13,21 @@ digraph { ArithmeticVerifications [URL="../labs/Demos/SAW/ArithmeticVerifications/ArithmeticVerifications.html"]; BitTwiddling [URL="../labs/Demos/SAW/Bittwiddling/Bittwiddling.html"]; + Salsa20 [URL="../labs/Demos/SAW/Salsa20/Salsa20.html"]; // branch nodes node [fillcolor="white"]; - // newline/space labels ArithmeticVerifications [label = "Arithmetic\nVerifications"] BitTwiddling [label = "Bit Twiddling"] + Salsa20 [label = "Salsa20"] // recommended flow edge [color=red]; - ArithmeticVerifications -> BitTwiddling; + ArithmeticVerifications -> BitTwiddling -> Salsa20; // branches edge [color=black]; diff --git a/misc/SAWDemos.gv.png b/misc/SAWDemos.gv.png index 3c879684ebac33b3c8463275d8d6c6d8ebae6942..d285d0695178afcad881c1d9adee9b1432ae18d4 100644 GIT binary patch literal 9905 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 A6951J literal 4686 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 - - - + + -%3 -ArithmeticVerifications + +ArithmeticVerifications - -Arithmetic -Verifications + +Arithmetic +Verifications -BitTwiddling + +BitTwiddling - -Bit Twiddling + +Bit Twiddling -ArithmeticVerifications->BitTwiddling - - + +ArithmeticVerifications->BitTwiddling + + + + + +Salsa20 + + +Salsa20 + + + + + +BitTwiddling->Salsa20 + + From 3d212013eb819612fb34402a93ce0f6444624ffe Mon Sep 17 00:00:00 2001 From: Matt Benke Date: Thu, 2 Jun 2022 14:18:15 -0400 Subject: [PATCH 5/6] Added forward link from Bittwiddling to Salsa20 (Galois) --- labs/Demos/SAW/Bittwiddling/Bittwiddling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/labs/Demos/SAW/Bittwiddling/Bittwiddling.md b/labs/Demos/SAW/Bittwiddling/Bittwiddling.md index 8f2a04f4..76d90a18 100644 --- a/labs/Demos/SAW/Bittwiddling/Bittwiddling.md +++ b/labs/Demos/SAW/Bittwiddling/Bittwiddling.md @@ -187,5 +187,5 @@ https://github.com/weaversa/cryptol-course/issues |||| |-:|:-:|-| || [ ^ SAW Demos](../Demos.md) || -| [< Arithmetic Verifications](../ArithmeticVerifications/ArithmeticVerifications.md) | **Bit Twiddling** || +| [< Arithmetic Verifications](../ArithmeticVerifications/ArithmeticVerifications.md) | **Bit Twiddling** | [Salsa20 (Galois) >](../Salsa20/Salsa20.md) | || [! Bit Twiddling (Answers)](./BittwiddlingAnswers.md) || From 65fe8bf669032b32101a5cba8eec717bd4a156b8 Mon Sep 17 00:00:00 2001 From: Matt Benke Date: Thu, 2 Jun 2022 14:23:54 -0400 Subject: [PATCH 6/6] Corrections/clarifications --- labs/Demos/SAW/Salsa20/Salsa20.md | 36 ++++++++++++++++++------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/labs/Demos/SAW/Salsa20/Salsa20.md b/labs/Demos/SAW/Salsa20/Salsa20.md index 3b115a08..b91afcbd 100644 --- a/labs/Demos/SAW/Salsa20/Salsa20.md +++ b/labs/Demos/SAW/Salsa20/Salsa20.md @@ -15,7 +15,7 @@ implementation and specification. Before starting this module, we recommend perusing Galois, Inc.'s excellent tutorial on [_Program Verification with SAW_](https://saw.galois.com/intro/index.html). -That tutorial +That tutorial: * introduces Cryptol and SAW (you can skip its setup instructions as their installation test should work in whichever environment you set up for this course) @@ -33,9 +33,9 @@ After completing the above tutorial, this module will: _callgraph_ * explain the correspondence between a callgraph and SAW overrides (described in Galois's _Program Verification with SAW_) - * introduce you to uninterpreted functions, which in conjunction - with overrides, decomposes a Cryptol specification to potentially - simplify verification for a solver + * introduce you to uninterpreted functions; using these in + conjunction with overrides decomposes a Cryptol specification, + which potentially simplifies verification for a solver # Uninterpreted Functions @@ -50,6 +50,9 @@ the burden of proof for SAW: > verified function, the prior specification is used as an > axiomatization of its behavior. +(Note: Those `Crucible` prefixes are now deprecated, e.g. +`CrucibleMethodSpec` is now `LLVMSpec`.) + The term _override_ comes from SAW's docstring for `llvm_verify`: ```SAW @@ -72,8 +75,8 @@ One might wonder whether similar hints can ease the burden of proof by axiomatizing a similarly complex Cryptol specification. Such hints are called [_uninterpreted functions_](https://www21.in.tum.de/teaching/sar/SS20/6.pdf), -which instruct an SMT solver or interface ( -[SBV](http://leventerkok.github.io/sbv/) or +which instruct an SMT solver or interface +([SBV](http://leventerkok.github.io/sbv/) or [What4](https://github.com/GaloisInc/what4)) to an underlying SMT solver to treat a function (from the specification) as "uninterpreted". The solver abstracts away these function definitions as arbitrary @@ -111,7 +114,7 @@ SMT solvers that are beyond the scope of this course.) ## Practice with Uninterpreted Functions and Overrides Now that we have added uninterpreted functions to our repertoire, let's -apply them to Salsa20...but first, let's more closely examine the +apply them to Salsa20 --- but first, let's more closely examine the Galois tutorial's implementation and progress toward verifying it... Clang/LLVM includes a command line tool called @@ -130,7 +133,8 @@ Writing 'build/salsa20.bc.callgraph.dot'... ``` (Our Salsa20 source and script are a reorganized copy of Galois's -example. Feel free to work from the copy in your tutorial instead.) +example. Feel free to work from the copy in your Galois tutorial +workspace instead.) This produces a [dot](https://graphviz.org/doc/info/lang.html) graph, which can be converted to an image viewable in a web browser: @@ -180,13 +184,15 @@ override graph of a SAW Remote API for Python proof script. Informed by these visualizations, perhaps we can fill in some gaps... -**EXERCISE**: Add uninterpreted functions to `llvm_verify` instructions -(replace `abc` with `w4_unint_{solver}([{uninterpreted functions}])`) in -`salsa20.saw` that are straightforwardly implemented by functions in -`salsa20.bc`. (`s20_quarterround` implements `quarterround`, `s20_hash` -implements `Salsa20`, etc., as depicted by dashed blue edges in the -above graph.) How does this affect proof times? What happens if you -remove the overrides? +**EXERCISE**: Add uninterpreted functions to `llvm_verify` +instructions (replace `abc` with +`{solver}([{uninterpreted functions}])`) (selecting any solver whose +type is `[String] -> ProofScript ()`) in `salsa20.saw` that are +straightforwardly implemented by functions in `salsa20.bc`. +(`s20_quarterround` implements `quarterround`, `s20_hash` implements +`Salsa20`, etc., as depicted by dashed blue edges in the above graph.) +How does this affect proof times? What happens if you remove +overrides? **EXERCISE**: Based on the above `salsa20.saw` diagram, are any potential overrides missing from other `llvm_verify` instructions in