Raw File
Hacl.Impl.Poly1305.fsti
module Hacl.Impl.Poly1305

open FStar.HyperStack
open FStar.HyperStack.All
open FStar.Mul

open Lib.IntTypes
open Lib.Buffer

open Hacl.Impl.Poly1305.Fields

module S = Spec.Poly1305


#reset-options "--z3rlimit 50 --max_fuel 0 --max_ifuel 1"

inline_for_extraction noextract
let poly1305_ctx (s:field_spec) = lbuffer (limb s) (nlimb s +! precomplen s)


noextract
val as_get_acc: #s:field_spec -> h:mem -> ctx:poly1305_ctx s -> GTot S.felem

noextract
val as_get_r: #s:field_spec -> h:mem -> ctx:poly1305_ctx s -> GTot S.felem

noextract
val state_inv_t: #s:field_spec -> h:mem -> ctx:poly1305_ctx s -> Type0


// If the ctx is not modified, all the components and invariants are preserved
val reveal_ctx_inv': #s:field_spec -> ctx:poly1305_ctx s -> ctx':poly1305_ctx s -> h0:mem -> h1:mem ->
  Lemma
  (requires Seq.equal (as_seq h0 ctx) (as_seq h1 ctx') /\ state_inv_t h0 ctx)
  (ensures
    as_get_r h0 ctx == as_get_r h1 ctx' /\
    as_get_acc h0 ctx == as_get_acc h1 ctx' /\
    state_inv_t h1 ctx')

let reveal_ctx_inv #s ctx h0 h1: Lemma
  (requires Seq.equal (as_seq h0 ctx) (as_seq h1 ctx) /\ state_inv_t h0 ctx)
  (ensures
    as_get_r h0 ctx == as_get_r h1 ctx /\
    as_get_acc h0 ctx == as_get_acc h1 ctx /\
    state_inv_t h1 ctx)
=
  reveal_ctx_inv' #s ctx ctx h0 h1

val ctx_inv_zeros: #s:field_spec -> ctx:poly1305_ctx s -> h:mem ->
  Lemma
  (requires as_seq h ctx == Lib.Sequence.create (v (nlimb s +! precomplen s)) (limb_zero s))
  (ensures  state_inv_t #s h ctx)


inline_for_extraction noextract
let poly1305_init_st (s:field_spec) =
    ctx:poly1305_ctx s
  -> key:lbuffer uint8 32ul ->
  Stack unit
  (requires fun h ->
    live h ctx /\ live h key /\ disjoint ctx key)
  (ensures  fun h0 _ h1 ->
    modifies (loc ctx) h0 h1 /\
    state_inv_t #s h1 ctx /\
    (as_get_acc h1 ctx, as_get_r h1 ctx) == S.poly1305_init (as_seq h0 key))

[@ Meta.Attribute.specialize ]
inline_for_extraction noextract
val poly1305_init: #s:field_spec -> poly1305_init_st s


inline_for_extraction noextract
let poly1305_update1_st (s:field_spec) =
    ctx:poly1305_ctx s
  -> b:lbuffer uint8 16ul ->
  Stack unit
  (requires fun h ->
    live h ctx /\ live h b /\ disjoint b ctx /\
    state_inv_t #s h ctx)
  (ensures  fun h0 _ h1 ->
    modifies (loc ctx) h0 h1 /\
    state_inv_t #s h1 ctx /\
    as_get_r h0 ctx == as_get_r h1 ctx /\
    as_get_acc h1 ctx == S.poly1305_update1 (as_get_r h0 ctx) 16 (as_seq h0 b) (as_get_acc h0 ctx))


inline_for_extraction noextract
val poly1305_update1: (#s:field_spec) -> poly1305_update1_st s


inline_for_extraction noextract
let poly1305_update_st (s:field_spec) =
    ctx:poly1305_ctx s
  -> len:size_t
  -> text:lbuffer uint8 len ->
  Stack unit
  (requires fun h ->
    live h text /\ live h ctx /\ disjoint ctx text /\
    state_inv_t #s h ctx)
  (ensures  fun h0 _ h1 ->
    modifies (loc ctx) h0 h1 /\
    state_inv_t #s h1 ctx /\
    as_get_r h0 ctx == as_get_r h1 ctx /\
    as_get_acc h1 ctx == S.poly1305_update (as_seq h0 text) (as_get_acc h0 ctx) (as_get_r h0 ctx))


inline_for_extraction noextract
[@ Meta.Attribute.specialize ]
val poly1305_update: #s:field_spec -> poly1305_update_st s


inline_for_extraction noextract
let poly1305_finish_st (s:field_spec) =
    tag:lbuffer uint8 16ul
  -> key:lbuffer uint8 32ul
  -> ctx:poly1305_ctx s ->
  Stack unit
  (requires fun h ->
    live h tag /\ live h key /\ live h ctx /\
    disjoint tag key /\ disjoint tag ctx /\ disjoint key ctx /\
    state_inv_t #s h ctx)
  (ensures  fun h0 _ h1 ->
    modifies (loc tag |+| loc ctx) h0 h1 /\
    as_seq h1 tag == S.poly1305_finish (as_seq h0 key) (as_get_acc h0 ctx))

[@ Meta.Attribute.specialize ]
noextract inline_for_extraction
val poly1305_finish: #s:field_spec -> poly1305_finish_st s


inline_for_extraction noextract
let poly1305_mac_st (s:field_spec) =
    tag:lbuffer uint8 16ul
  -> len:size_t
  -> text:lbuffer uint8 len
  -> key:lbuffer uint8 32ul ->
  Stack unit
  (requires fun h ->
    live h text /\ live h tag /\ live h key /\
    disjoint tag text /\ disjoint tag key)
  (ensures  fun h0 _ h1 ->
    modifies (loc tag) h0 h1 /\
    as_seq h1 tag == S.poly1305_mac (as_seq h0 text) (as_seq h0 key))

noextract
[@ Meta.Attribute.specialize ]
val poly1305_mac: #s:field_spec ->
  poly1305_mac_st s
back to top