From 41c6591c9cf171d2b5ce6f2f3122aa1ae947de30 Mon Sep 17 00:00:00 2001
From: Per Lindgren <per.lindgren@ltu.se>
Date: Sat, 11 Nov 2017 18:07:26 +0100
Subject: [PATCH] lab4

---
 klee-examples/examples/cc_codegen_eq.rs    |  79 ++++++
 klee-examples/examples/cc_lab4_contract.rs | 276 +++++++++++++++++++++
 2 files changed, 355 insertions(+)
 create mode 100644 klee-examples/examples/cc_codegen_eq.rs
 create mode 100644 klee-examples/examples/cc_lab4_contract.rs

diff --git a/klee-examples/examples/cc_codegen_eq.rs b/klee-examples/examples/cc_codegen_eq.rs
new file mode 100644
index 0000000..3bfb13f
--- /dev/null
+++ b/klee-examples/examples/cc_codegen_eq.rs
@@ -0,0 +1,79 @@
+#![no_std]
+#![allow(dead_code)]
+
+#[macro_use]
+extern crate klee;
+use core::ptr;
+
+//# FUNCTION codgen(): UNSIGNED INTEGER;
+// #  LOCAL SIGNED INTEGER   n;
+// #  LOCAL UNSIGNED INTEGER x, y;
+// #  BEGIN
+// #    n := [count the number of 0's in word "seed"];
+// #    x := [rotate "seed" left by 30 bits];
+// #    y := [shift "seed" right-ARITHMETIC by 6 bits];
+// #    seed := x XOR y XOR n;
+// #   RETURN( seed XOR 0x464b713e );
+// #  END;
+// #
+// # hint:  if "seed" is initialized to 0x3e944b9f,
+// #        the first five calls will generate these values:
+// #        0x891432f9, 0x4aa1dccc, 0xc54270fa, 0x9885155f, 0xce83d1b8, ...
+// # your code is to be written farther down (see comment below).
+
+fn codgen(seed: &mut u32) -> u32 {
+    let mut n: i32 = 32;
+    let lseed: u32 = seed.clone(); // copy value of seed
+    let mut s: u32 = lseed;
+    let x: u32;
+    let y: u32;
+
+    //n = [count the number of 0's in word "seed"];
+    while s != 0 {
+        if s & 1u32 == 1u32 {
+            n -= 1;
+        }
+        s >>= 1; // >> is logic shift
+    }
+
+    // x := [rotate "seed" left by 30 bits];
+    x = lseed << 30 | ((lseed >> 2) & ((1 << (30 + 1)) - 1));
+
+    // y := [shift "seed" right-ARITHMETIC by 6 bits];
+    y = ((lseed as i32) >> 6) as u32;
+
+    // seed := x XOR y XOR n;
+    *seed = x ^ y ^ (n as u32);
+
+    // RETURN( seed XOR 0x464b713e );
+    (*seed) ^ 0x464b713e
+}
+
+fn codgen2(seed: &mut u32) -> u32 {
+    let mut n: i32 = 32;
+    let mut s: u32 = *seed;
+    let x: u32;
+    let y: u32;
+
+    while s != 0 {
+        if s & 1u32 == 1u32 {
+            n -= 1;
+        }
+        s >>= 1;
+    }
+
+    x = *seed << 30 | ((*seed >> 2) & ((1 << (30 + 1)) - 1));
+    y = ((*seed as i32) >> 6) as u32;
+    *seed = x ^ y ^ (n as u32);
+    *seed ^ 0x464b713e
+}
+
+fn main() {
+    // test that codgen works
+    let mut seed = ksymbol!("seed");
+    let mut seed_copy = seed;
+    kassert!(codgen(&mut seed) == codgen2(&mut seed_copy));
+    // unsafe {
+    //     ptr::read_volatile(&codgen(&mut seed));
+    // }
+}
diff --git a/klee-examples/examples/cc_lab4_contract.rs b/klee-examples/examples/cc_lab4_contract.rs
new file mode 100644
index 0000000..4b72936
--- /dev/null
+++ b/klee-examples/examples/cc_lab4_contract.rs
@@ -0,0 +1,276 @@
+//! Prints "Hello, world!" on the OpenOCD console using semihosting
+//!
+//! ---
+
+#![no_std]
+#![allow(dead_code)]
+
+#[macro_use]
+extern crate klee;
+use core::cmp;
+
+static mut PLAIN: [u8; 132] = [0; 132];
+
+static ABC: [u32; 4] = [0x9fdd9158, 0x85715808, 0xac73323a, 0];
+static CODED: [u32; 132] = [
+    0x015e7a47,
+    0x2ef84ebb,
+    0x177a8db4,
+    0x1b722ff9,
+    0x5dc7cff0,
+    0x5dc9dea6,
+    0x1da0c15a,
+    0xe4c236a2,
+    0x3d16b0d0,
+    0x1f397842,
+    0xaae0d2ba,
+    0x11246674,
+    0x0845317f,
+    0xd5512dad,
+    0xb6184977,
+    0xd293a53e,
+    0x7d9c2716,
+    0xd917eae6,
+    0xd8852384,
+    0x286e46f9,
+    0xce566029,
+    0xcefe7daf,
+    0x62d726d4,
+    0x0dbaeb2d,
+    0x95f57c60,
+    0xed515141,
+    0x29b77d0f,
+    0x9f7b8d0c,
+    0x45a8395a,
+    0xfead2b72,
+    0x883d434c,
+    0xed8ddf60,
+    0xe51e65e4,
+    0x19bf6bb1,
+    0xfeb505ec,
+    0x662aa23c,
+    0xf6827cf8,
+    0xd1dc7a5c,
+    0x4fa5b066,
+    0x7ddd25a4,
+    0xa8ba8e8a,
+    0x72846227,
+    0xf8f636fb,
+    0x2b389a9c,
+    0xe4038bf6,
+    0x6e169877,
+    0xad028132,
+    0x84dbfe8c,
+    0x243762ff,
+    0x59c8f80c,
+    0xb6e0db4b,
+    0xedb8cab7,
+    0xcd4b39f6,
+    0xaf263741,
+    0x18d9965f,
+    0x1ab1f037,
+    0x5b458792,
+    0xc94d960d,
+    0xd45cedea,
+    0x2160aca3,
+    0x93c77766,
+    0x2d66e105,
+    0x9ff74d4f,
+    0x6dc22f21,
+    0x6b03d689,
+    0x5fc48de0,
+    0x1138f000,
+    0xccb58e57,
+    0xf9c8e200,
+    0x7ab26e3c,
+    0xc61dcb3e,
+    0x6aefccb0,
+    0x7a452f05,
+    0xa5cf0731,
+    0xa249383f,
+    0x628fe534,
+    0xcad81710,
+    0x7f616276,
+    0x3ce18308,
+    0xed4857ff,
+    0xd1e5b1d1,
+    0xc2e84dc2,
+    0xaa003742,
+    0xaf637488,
+    0x831afc48,
+    0x287a69a0,
+    0x6e04546e,
+    0x13dffa07,
+    0x3232fb10,
+    0xd69e2e09,
+    0x355d8dc7,
+    0xef902301,
+    0x9a89ac15,
+    0x967dc900,
+    0x08dc2b1c,
+    0x6b5be690,
+    0x894b0e02,
+    0xe26af9af,
+    0xa6fd3b23,
+    0xfcf213e5,
+    0x85217608,
+    0x7fd3be8b,
+    0xa2e757fb,
+    0x3717a341,
+    0x85ee426d,
+    0x394bb856,
+    0x12ac98c3,
+    0xec7d4ab5,
+    0x721b6989,
+    0x30e36360,
+    0xaa018403,
+    0x9ee61196,
+    0xa8697adc,
+    0x51e9d65a,
+    0x11023594,
+    0xc4c4b36b,
+    0xda80bf7a,
+    0xbd5a645e,
+    0x18cea918,
+    0xa723dda8,
+    0x0126c05e,
+    0x2962d48a,
+    0xd5f7d312,
+    0xb8947041,
+    0x7c1e2e9a,
+    0x945eeac3,
+    0x7110fb1c,
+    0xa7bc72cc,
+    0xdf47dfbb,
+    0x09a1c6c8,
+    0xc2e41061,
+    0,
+];
+
+//# FUNCTION codgen(): UNSIGNED INTEGER;
+// #  LOCAL SIGNED INTEGER   n;
+// #  LOCAL UNSIGNED INTEGER x, y;
+// #  BEGIN
+// #    n := [count the number of 0's in word "seed"];
+// #    x := [rotate "seed" left by 30 bits];
+// #    y := [shift "seed" right-ARITHMETIC by 6 bits];
+// #    seed := x XOR y XOR n;
+// #   RETURN( seed XOR 0x464b713e );
+// #  END;
+// #
+// # hint:  if "seed" is initialized to 0x3e944b9f,
+// #        the first five calls will generate these values:
+// #        0x891432f9, 0x4aa1dccc, 0xc54270fa, 0x9885155f, 0xce83d1b8, ...
+// # your code is to be written farther down (see comment below).
+//
+
+fn codgen(seed: &mut u32) -> u32 {
+    let mut n: i32 = 32;
+    let lseed: u32 = seed.clone(); // copy value of seed
+    let mut s: u32 = lseed;
+    let x: u32;
+    let y: u32;
+
+    //n = [count the number of 0's in word "seed"];
+    while s != 0 {
+        if s & 1u32 == 1u32 {
+            n -= 1;
+        }
+        s >>= 1; // >> is logic shift
+    }
+
+    // x := [rotate "seed" left by 30 bits];
+    x = lseed << 30 | ((lseed >> 2) & ((1 << (30 + 1)) - 1));
+
+    // y := [shift "seed" right-ARITHMETIC by 6 bits];
+    y = ((lseed as i32) >> 6) as u32;
+
+    // seed := x XOR y XOR n;
+    *seed = x ^ y ^ (n as u32);
+
+    // RETURN( seed XOR 0x464b713e );
+    (*seed) ^ 0x464b713e
+}
+
+//
+fn decode_org(wordarr: &[u32], bytearr: &mut [u8], seed: &mut u32) -> u32 {
+    let m: u32;
+    let mut r: u32;
+    let x: u32;
+    let y: u32;
+
+    x = !codgen(seed);
+    if wordarr[0] == 0 {
+        bytearr[0] = 0;
+        r = x;
+    } else {
+        y = decode(&wordarr[1..], &mut bytearr[1..], seed);
+        m = x.wrapping_sub(y).wrapping_sub(wordarr[0]);
+        bytearr[0] = (m >> 13) as u8;
+        r = (-(codgen(seed) as i32)) as u32;
+        r = x.wrapping_add(y)
+            .wrapping_add(m)
+            .wrapping_add(r)
+            .wrapping_add(5);
+    }
+    r
+}
+
+
+// mod rnd {
+//     use core::mem;
+//     static mut I: usize = 0;
+//     static RND: [u32; 132] = [0; 132]; // unsafe { mem::uninitialized() };
+//     pub fn get() -> u32 {
+//         unsafe {
+//             let r = RND[I];
+//             I += 1;
+//             r
+//         }
+//     }
+//     pub fn ksymbolic() {
+//         unsafe {
+//             make_symbolic(
+//                 &mut RND as *mut [u32; 132] as *mut c_void,
+//                 mem::size_of::<[u32; 132]>(),
+//                 "name".as_ptr(),
+//             )
+//         }
+//     }
+// }
+fn decode(wordarr: &[u32], bytearr: &mut [u8], seed: &mut u32) -> u32 {
+    let m: u32;
+    let mut r: u32;
+    let x: u32;
+    let y: u32;
+
+    // x = !codgen(seed);
+    x = ksymbol!("x");
+    // x = rnd::get();
+
+    if wordarr == [] {
+        bytearr[0] = 0;
+        r = x;
+    } else {
+        y = decode(&wordarr[1..], &mut bytearr[1..], seed);
+        m = x.wrapping_sub(y).wrapping_sub(wordarr[0]);
+        bytearr[0] = (m >> 13) as u8;
+        let cg: u32 = ksymbol!("cg");
+        // let cg: u32 = codgen(seed);
+        // let cg: u32 = rnd::get();
+        r = (-(cg as i32)) as u32;
+        r = x.wrapping_add(y)
+            .wrapping_add(m)
+            .wrapping_add(r)
+            .wrapping_add(5);
+    }
+    r
+}
+
+fn main() {
+    //let mut seed = 0x0e0657c1;
+    let mut seed = ksymbol!("seed");
+    //rnd::ksymbolic();
+    let abc: [u32; 4] = ksymbol!("abc");
+    decode(&abc[..], unsafe { &mut PLAIN }, &mut seed);
+}
-- 
GitLab