https://github.com/project-everest/hacl-star
Raw File
Tip revision: 7b8ff286676eb6022b8c24474916188a857b53c3 authored by Aseem Rastogi on 27 September 2018, 16:08:56 UTC
hints
Tip revision: 7b8ff28
Hacl.UInt32x4.fsti
module Hacl.UInt32x4

module ST = FStar.HyperStack.ST

open FStar.HyperStack.All


open FStar.Mul
open FStar.HyperStack
open FStar.HyperStack.ST
open FStar.Buffer
open FStar.Seq

open Hacl.Cast
open Hacl.UInt32
open Hacl.Spec.Endianness
open Hacl.Endianness

open Spec.Loops

module U32 = FStar.UInt32
module H8  = Hacl.UInt8
module H32 = Hacl.UInt32

let u32 = U32.t
let h32 = H32.t
let uint8_p = buffer H8.t

val vec: Type0

#reset-options "--max_fuel 0"

let vec_size = 4ul

val vec_as_seq: vec -> GTot Spec.Chacha20_vec.vec

val vec_load_le: b:uint8_p{Buffer.length b = 16} -> Stack vec
              (requires (fun h -> live h b))
	      (ensures  (fun h0 r h1 -> live h1 b /\ h0 == h1 /\ live h0 b /\
	      		    (let s = Spec.Lib.uint32s_from_le 4 (reveal_sbytes (as_seq h0 b)) in
			     s == vec_as_seq r)))


val vec_store_le: b:uint8_p{Buffer.length b = 16} -> r:vec -> Stack unit
              (requires (fun h -> live h b))
	      (ensures  (fun h0 _ h1 -> live h1 b /\ modifies_1 b h0 h1 /\
	      		    (let s = Spec.Lib.uint32s_from_le 4 (reveal_sbytes (as_seq h1 b)) in
			     s == vec_as_seq r)))


val vec_load128_le: b:uint8_p{Buffer.length b = 16} -> Stack vec 
              (requires (fun h -> live h b))
	      (ensures  (fun h0 r h1 -> live h1 b /\ h0 == h1 /\ live h0 b /\
	      		    (let s = Spec.Lib.uint32s_from_le 4 (reveal_sbytes (as_seq h0 b)) in
			     let rs = vec_as_seq r in rs == s)))

val vec_load_32x4: x1:h32 -> x2:h32 -> x3:h32 -> x4:h32 -> Tot (s:vec{vec_as_seq s == reveal_h32s (Seq.Create.create_4 x1 x2 x3 x4)})
val vec_shuffle_right: s0:vec -> r:u32{U32.v r < 4} -> Tot (s1:vec{vec_as_seq s1 == Spec.Chacha20_vec.shuffle_right (vec_as_seq s0) (U32.v r)})
val vec_rotate_left: s0:vec -> r:u32{U32.v r < 32} -> Tot (s1:vec{
  vec_as_seq s1 == Spec.Chacha20_vec.op_Less_Less_Less (vec_as_seq s0) r})
val vec_rotate_left_8: s0:vec -> Tot (s1:vec{
  vec_as_seq s1 == Spec.Chacha20_vec.op_Less_Less_Less (vec_as_seq s0) 8ul})
val vec_rotate_left_16: s0:vec -> Tot (s1:vec{
  vec_as_seq s1 == Spec.Chacha20_vec.op_Less_Less_Less (vec_as_seq s0) 16ul})
val vec_add: s0:vec -> s0':vec -> Tot (s1:vec{
  vec_as_seq s1 == Spec.Chacha20_vec.op_Plus_Percent_Hat (vec_as_seq s0) (vec_as_seq s0')})
val vec_xor: s0:vec -> s0':vec -> Tot (s1:vec{
  vec_as_seq s1 == Spec.Chacha20_vec.op_Hat_Hat (vec_as_seq s0) (vec_as_seq s0')})

private val zero:  zero:vec{vec_as_seq zero == Seq.Create.create_4 0ul 0ul 0ul 0ul}
private val one_le:  one:vec{vec_as_seq one == Seq.Create.create_4 1ul 0ul 0ul 0ul}
private val two_le:  two:vec{vec_as_seq two == Seq.Create.create_4 2ul 0ul 0ul 0ul}

val vec_increment: s0:vec -> Tot (s1:vec{
  vec_as_seq s1 == Spec.Chacha20_vec.op_Plus_Percent_Hat (vec_as_seq s0) (vec_as_seq one_le)})

val vec_zero: unit -> Tot (s1:vec{vec_as_seq s1 == vec_as_seq zero})

inline_for_extraction let ( <<< ) (v:vec) (r:u32{U32.v r < 32}): Tot (vec) = vec_rotate_left v r
inline_for_extraction let ( +%^ ) (v1:vec) (v2:vec): Tot (vec) = vec_add v1 v2
inline_for_extraction let ( ^^ ) (v1:vec) (v2:vec): Tot (vec) = vec_xor v1 v2

back to top