@@ -64,6 +64,7 @@ type Path struct {
6464}
6565
6666// @ requires o.NonInitMem()
67+ // @ requires low(len(data))
6768// @ preserves acc(sl.Bytes(data, 0, len(data)), R42)
6869// @ ensures (len(data) >= PathLen) == (r == nil)
6970// @ ensures r == nil ==> o.Mem(data)
@@ -98,20 +99,25 @@ func (o *Path) DecodeFromBytes(data []byte) (r error) {
9899 return r
99100}
100101
101- // @ preserves acc(o.Mem(ubuf), R1)
102+ // @ requires low(len(b))
103+ // @ requires acc(o.Mem(ubuf), R1) && o.IsLow(ubuf)
102104// @ preserves acc(sl.Bytes(ubuf, 0, len(ubuf)), R1)
103105// @ preserves sl.Bytes(b, 0, len(b))
106+ // @ ensures acc(o.Mem(ubuf), R1)
104107// @ ensures (len(b) >= PathLen) == (err == nil)
105108// @ ensures err != nil ==> err.ErrorMem()
106109// @ ensures err == nil ==> o.LenSpec(ubuf) <= len(b)
107110// @ decreases
108111func (o * Path ) SerializeTo (b []byte /*@, ubuf []byte @*/ ) (err error ) {
112+ //@ o.RevealIsLow(ubuf, R1)
109113 if len (b ) < PathLen {
110114 return serrors .New ("buffer too short for OneHop path" , "expected" , int (PathLen ), "actual" ,
111115 int (len (b )))
112116 }
113117 offset := 0
114118 //@ unfold acc(o.Mem(ubuf), R1)
119+ //@ o.FirstHop.RevealIsLow(R2)
120+ //@ o.SecondHop.RevealIsLow(R2)
115121 //@ sl.SplitRange_Bytes(b, 0, offset+path.InfoLen, writePerm)
116122 if err := o .Info .SerializeTo (b [:offset + path .InfoLen ]); err != nil {
117123 //@ sl.CombineRange_Bytes(b, 0, offset+path.InfoLen, writePerm)
@@ -135,10 +141,13 @@ func (o *Path) SerializeTo(b []byte /*@, ubuf []byte @*/) (err error) {
135141
136142// ToSCIONDecoded converts the one hop path in to a normal SCION path in the
137143// decoded format.
138- // @ preserves o.Mem(ubuf)
144+ // @ requires o.Mem(ubuf)
145+ // @ requires low(o.GetSecondHopConsIngress(ubuf))
139146// @ preserves sl.Bytes(ubuf, 0, len(ubuf))
147+ // @ ensures o.Mem(ubuf)
140148// @ ensures err == nil ==> (sd != nil && sd.Mem(ubuf))
141149// @ ensures err != nil ==> err.ErrorMem()
150+ // @ ensures low(err != nil)
142151// @ decreases
143152func (o * Path ) ToSCIONDecoded ( /*@ ghost ubuf []byte @*/ ) (sd * scion.Decoded , err error ) {
144153 //@ unfold acc(o.Mem(ubuf), R1)
@@ -198,14 +207,15 @@ func (o *Path) ToSCIONDecoded( /*@ ghost ubuf []byte @*/ ) (sd *scion.Decoded, e
198207}
199208
200209// Reverse a OneHop path that returns a reversed SCION path.
201- // @ requires o.Mem(ubuf)
210+ // @ requires o.Mem(ubuf) && o.IsLow (ubuf)
202211// @ preserves sl.Bytes(ubuf, 0, len(ubuf))
203- // @ ensures err == nil ==> p != nil
204- // @ ensures err == nil ==> p.Mem(ubuf)
205- // @ ensures err == nil ==> typeOf(p) == type[*scion.Decoded]
206- // @ ensures err != nil ==> err.ErrorMem()
212+ // @ ensures err == nil ==> p != nil
213+ // @ ensures err == nil ==> p.Mem(ubuf)
214+ // @ ensures err == nil ==> typeOf(p) == type[*scion.Decoded]
215+ // @ ensures err != nil ==> err.ErrorMem()
207216// @ decreases
208217func (o * Path ) Reverse ( /*@ ghost ubuf []byte @*/ ) (p path.Path , err error ) {
218+ //@ o.RevealIsLow(ubuf, writePerm)
209219 sp , err := o .ToSCIONDecoded ( /*@ ubuf @*/ )
210220 if err != nil {
211221 return nil , serrors .WrapStr ("converting to scion path" , err )
0 commit comments