Add unified checksum type in refs package
Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
parent
556be90818
commit
6787648027
5 changed files with 146 additions and 0 deletions
|
@ -111,3 +111,31 @@ func AddressFromGRPCMessage(m *refs.Address) *Address {
|
||||||
|
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ChecksumToGRPCMessage(c *Checksum) *refs.Checksum {
|
||||||
|
if c == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
m := new(refs.Checksum)
|
||||||
|
|
||||||
|
m.SetChecksumType(refs.ChecksumType(c.GetType()))
|
||||||
|
|
||||||
|
m.SetSum(c.GetSum())
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func ChecksumFromGRPCMessage(m *refs.Checksum) *Checksum {
|
||||||
|
if m == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
c := new(Checksum)
|
||||||
|
|
||||||
|
c.SetType(ChecksumType(m.GetType()))
|
||||||
|
|
||||||
|
c.SetSum(m.GetSum())
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
|
@ -34,3 +34,17 @@ func (m *Address) SetObjectId(v *ObjectID) {
|
||||||
m.ObjectId = v
|
m.ObjectId = v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetChecksumType in generic checksum structure.
|
||||||
|
func (m *Checksum) SetChecksumType(v ChecksumType) {
|
||||||
|
if m != nil {
|
||||||
|
m.Type = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetChecksumSum in generic checksum structure.
|
||||||
|
func (m *Checksum) SetSum(v []byte) {
|
||||||
|
if m != nil {
|
||||||
|
m.Sum = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -13,6 +13,9 @@ const (
|
||||||
|
|
||||||
addressContainerField = 1
|
addressContainerField = 1
|
||||||
addressObjectField = 2
|
addressObjectField = 2
|
||||||
|
|
||||||
|
checksumTypeField = 1
|
||||||
|
checksumValueField = 2
|
||||||
)
|
)
|
||||||
|
|
||||||
func (o *OwnerID) StableMarshal(buf []byte) ([]byte, error) {
|
func (o *OwnerID) StableMarshal(buf []byte) ([]byte, error) {
|
||||||
|
@ -130,3 +133,43 @@ func (a *Address) StableSize() (size int) {
|
||||||
|
|
||||||
return size
|
return size
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Checksum) StableMarshal(buf []byte) ([]byte, error) {
|
||||||
|
if c == nil {
|
||||||
|
return []byte{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, c.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
offset, n int
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
n, err = proto.EnumMarshal(checksumTypeField, buf[offset:], int32(c.typ))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += n
|
||||||
|
|
||||||
|
_, err = proto.BytesMarshal(checksumValueField, buf[offset:], c.sum)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Checksum) StableSize() (size int) {
|
||||||
|
if c == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
size += proto.EnumSize(checksumTypeField, int32(c.typ))
|
||||||
|
size += proto.BytesSize(checksumValueField, c.sum)
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
|
@ -87,3 +87,22 @@ func TestAddress_StableMarshal(t *testing.T) {
|
||||||
require.Equal(t, addressFrom, addressTo)
|
require.Equal(t, addressFrom, addressTo)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestChecksum_StableMarshal(t *testing.T) {
|
||||||
|
checksumFrom := new(refs.Checksum)
|
||||||
|
transport := new(grpc.Checksum)
|
||||||
|
|
||||||
|
t.Run("non empty", func(t *testing.T) {
|
||||||
|
checksumFrom.SetType(refs.TillichZemor)
|
||||||
|
checksumFrom.SetSum([]byte("Homomorphic Hash"))
|
||||||
|
|
||||||
|
wire, err := checksumFrom.StableMarshal(nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = transport.Unmarshal(wire)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
checksumTo := refs.ChecksumFromGRPCMessage(transport)
|
||||||
|
require.Equal(t, checksumFrom, checksumTo)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -18,6 +18,20 @@ type Address struct {
|
||||||
oid *ObjectID
|
oid *ObjectID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Checksum struct {
|
||||||
|
typ ChecksumType
|
||||||
|
|
||||||
|
sum []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type ChecksumType uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
UnknownChecksum ChecksumType = iota
|
||||||
|
TillichZemor
|
||||||
|
SHA256
|
||||||
|
)
|
||||||
|
|
||||||
func (o *OwnerID) GetValue() []byte {
|
func (o *OwnerID) GetValue() []byte {
|
||||||
if o != nil {
|
if o != nil {
|
||||||
return o.val
|
return o.val
|
||||||
|
@ -87,3 +101,31 @@ func (a *Address) SetObjectID(v *ObjectID) {
|
||||||
a.oid = v
|
a.oid = v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Checksum) GetType() ChecksumType {
|
||||||
|
if c != nil {
|
||||||
|
return c.typ
|
||||||
|
}
|
||||||
|
|
||||||
|
return UnknownChecksum
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Checksum) SetType(v ChecksumType) {
|
||||||
|
if c != nil {
|
||||||
|
c.typ = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Checksum) GetSum() []byte {
|
||||||
|
if c != nil {
|
||||||
|
return c.sum
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Checksum) SetSum(v []byte) {
|
||||||
|
if c != nil {
|
||||||
|
c.sum = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue