off by 1 fix, a little more serdes check

This commit is contained in:
Tadge Dryja 2016-01-18 21:26:28 -08:00
parent 2b66c234c6
commit c1212d1369
3 changed files with 41 additions and 6 deletions

@ -123,7 +123,7 @@ func (e *ElkremReceiver) AddNext(sha *wire.ShaHash) error {
var n ElkremNode
n.sha = sha
t := len(e.s) - 1 // top of stack
if t > 0 { // if this is not the first hash
if t >= 0 { // if this is not the first hash (>= because we -1'd)
n.i = e.s[t].i + 1 // incoming index is tip of stack index + 1
}
if t > 0 && e.s[t-1].h == e.s[t].h { // top 2 elements are equal height

@ -45,7 +45,11 @@ func (e *ElkremSender) ToBytes() ([]byte, error) {
// the index where it left off.
func ElkremSenderFromBytes(b []byte) (ElkremSender, error) {
var e ElkremSender
e.root = new(wire.ShaHash)
buf := bytes.NewBuffer(b)
if buf.Len() != 41 {
return e, fmt.Errorf("Got %d bytes for sender, expect 41")
}
// read 1 byte height
err := binary.Read(buf, binary.BigEndian, &e.treeHeight)
if err != nil {
@ -139,7 +143,6 @@ func ElkremReceiverFromBytes(b []byte) (ElkremReceiver, error) {
if e.treeHeight < 1 || e.treeHeight > 63 {
return e, fmt.Errorf("Read invalid receiver height: %d", e.treeHeight)
}
var max uint64 // maximum possible given height
for j := uint8(0); j <= e.treeHeight; j++ {
max = max<<1 | 1
@ -154,9 +157,10 @@ func ElkremReceiverFromBytes(b []byte) (ElkremReceiver, error) {
if numOfNodes < 1 || numOfNodes > 64 {
return e, fmt.Errorf("Read invalid number of nodes: %d", numOfNodes)
}
if buf.Len() != (int(numOfNodes)*41)+2 {
return e, fmt.Errorf("Input buf wrong size, expect %d got %d",
(numOfNodes*41)+2, buf.Len())
if buf.Len() != (int(numOfNodes) * 41) {
return e, fmt.Errorf("Remaining buf wrong size, expect %d got %d",
(numOfNodes * 41), buf.Len())
}
for i := uint8(0); i < numOfNodes; i++ {

@ -1,6 +1,9 @@
package elkrem
import "testing"
import (
"bytes"
"testing"
)
func ReceiverSerdesTest(t *testing.T, er ElkremReceiver) {
b, err := er.ToBytes()
@ -8,6 +11,20 @@ func ReceiverSerdesTest(t *testing.T, er ElkremReceiver) {
t.Fatal(err)
}
t.Logf("Serialized receiver; %d bytes, hex:\n%x\n", len(b), b)
rcv2, err := ElkremReceiverFromBytes(b)
if err != nil {
t.Fatal(err)
}
b2, err := rcv2.ToBytes()
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, b2) {
t.Fatalf("First and second serializations different")
}
}
func SenderSerdesTest(t *testing.T, es ElkremSender) {
@ -16,4 +33,18 @@ func SenderSerdesTest(t *testing.T, es ElkremSender) {
t.Fatal(err)
}
t.Logf("Serialized sender; %d bytes, hex:\n%x\n", len(b), b)
sndr2, err := ElkremSenderFromBytes(b)
if err != nil {
t.Fatal(err)
}
b2, err := sndr2.ToBytes()
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, b2) {
t.Fatalf("First and second serializations different")
}
}