cryptobyte: add ReadUint64 and AddUint64
Fixes golang/go#53481.
Change-Id: Ic00eef498d1d3b5b0ca5c9c526fac7c26de30cf2
Reviewed-on: https://go-review.googlesource.com/c/crypto/+/421014
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Filippo Valsorda <filippo@golang.org>
Run-TryBot: hopehook <hopehook@qq.com>
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Roland Shoemaker <roland@golang.org>
diff --git a/cryptobyte/builder.go b/cryptobyte/builder.go
index c7ded75..2a90c59 100644
--- a/cryptobyte/builder.go
+++ b/cryptobyte/builder.go
@@ -95,6 +95,11 @@
b.add(byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
}
+// AddUint64 appends a big-endian, 64-bit value to the byte string.
+func (b *Builder) AddUint64(v uint64) {
+ b.add(byte(v>>56), byte(v>>48), byte(v>>40), byte(v>>32), byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
+}
+
// AddBytes appends a sequence of bytes to the byte string.
func (b *Builder) AddBytes(v []byte) {
b.add(v...)
diff --git a/cryptobyte/cryptobyte_test.go b/cryptobyte/cryptobyte_test.go
index fb63709..dc90e81 100644
--- a/cryptobyte/cryptobyte_test.go
+++ b/cryptobyte/cryptobyte_test.go
@@ -141,7 +141,7 @@
var s String = b.BytesOrPanic()
var v uint32
if !s.ReadUint24(&v) {
- t.Error("ReadUint8() = false, want true")
+ t.Error("ReadUint24() = false, want true")
}
if v != 0xfffefd {
t.Errorf("v = %d, want fffefd", v)
@@ -169,7 +169,7 @@
var s String = b.BytesOrPanic()
var v uint32
if !s.ReadUint32(&v) {
- t.Error("ReadUint8() = false, want true")
+ t.Error("ReadUint32() = false, want true")
}
if v != 0xfffefdfc {
t.Errorf("v = %x, want fffefdfc", v)
@@ -179,6 +179,26 @@
}
}
+func TestUint64(t *testing.T) {
+ var b Builder
+ b.AddUint64(0xf2fefefcff3cfdfc)
+ if err := builderBytesEq(&b, 242, 254, 254, 252, 255, 60, 253, 252); err != nil {
+ t.Error(err)
+ }
+
+ var s String = b.BytesOrPanic()
+ var v uint64
+ if !s.ReadUint64(&v) {
+ t.Error("ReadUint64() = false, want true")
+ }
+ if v != 0xf2fefefcff3cfdfc {
+ t.Errorf("v = %x, want f2fefefcff3cfdfc", v)
+ }
+ if len(s) != 0 {
+ t.Errorf("len(s) = %d, want 0", len(s))
+ }
+}
+
func TestUMultiple(t *testing.T) {
var b Builder
b.AddUint8(23)
diff --git a/cryptobyte/string.go b/cryptobyte/string.go
index 589d297..0531a3d 100644
--- a/cryptobyte/string.go
+++ b/cryptobyte/string.go
@@ -81,6 +81,17 @@
return true
}
+// ReadUint64 decodes a big-endian, 64-bit value into out and advances over it.
+// It reports whether the read was successful.
+func (s *String) ReadUint64(out *uint64) bool {
+ v := s.read(8)
+ if v == nil {
+ return false
+ }
+ *out = uint64(v[0])<<56 | uint64(v[1])<<48 | uint64(v[2])<<40 | uint64(v[3])<<32 | uint64(v[4])<<24 | uint64(v[5])<<16 | uint64(v[6])<<8 | uint64(v[7])
+ return true
+}
+
func (s *String) readUnsigned(out *uint32, length int) bool {
v := s.read(length)
if v == nil {