(*
Copyright 2008-2018 Microsoft Research
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*)
module Part2.MerkleTreeUpdate_V0
open FStar.String
module L = FStar.List.Tot
//Length-indexed strings
let lstring (n:nat) = s:string{String.length s == n}
//Concatenating strings sums their lengths
let concat #n #m (s0:lstring n) (s1:lstring m)
: lstring (m + n)
= FStar.String.concat_length s0 s1;
s0 ^ s1
//A parameter, lenght of the hash in characters,
//e.g., this would be 32, if a character is 1 byte
//and we're using SHA-256
assume
val hash_size:nat
//The type of a hashed value
let hash_t = lstring hash_size
//The hash function itself
assume
val hash (m:string) : hash_t
//The type of resources stored in the tree
let resource = string
// Merkle tree, indexed by the depth of the tree and hash for the
// node. All data is stored in leaves, trees are complete.
type mtree: nat -> hash_t -> Type =
| L:
res:resource ->
mtree 0 (hash res)
| N:
#n:nat ->
#hl:hash_t ->
#hr:hash_t ->
left:mtree n hl ->
right:mtree n hr ->
mtree (n + 1) (hash (concat hl hr))
type mtree' (n:nat) =
| MTree : h:hash_t -> mtree n h -> mtree' n
let resource_id = list bool
let rec update_mtree' (#h:hash_t)
(rid:resource_id)
(res:resource)
(tree:mtree (L.length rid) h)
: mtree' (L.length rid)
= admit()