gnunet-go

GNUnet Bindings for Go
Log | Files | Refs | README | LICENSE

commit 4a543f364b203b6fd491f64fa43495262dba6fde
parent 5ea40b971a196afd4783d64ea1932864c9688030
Author: Bernd Fix <brf@hoi-polloi.org>
Date:   Thu, 29 Jun 2023 21:01:21 +0200

RFC test vectors: adjusted code and test cases with latest version.

Diffstat:
Msrc/gnunet/crypto/gns.go | 4++--
Msrc/gnunet/crypto/gns_edkey.go | 11++++++-----
Msrc/gnunet/crypto/gns_pkey.go | 19+++++++++----------
Msrc/gnunet/crypto/gns_test.go | 12++++++------
Msrc/gnunet/service/dht/blocks/gns.go | 26++++++++++++++++++++++++--
Msrc/gnunet/service/dht/blocks/gns_test.go | 78+++++++++++++++++++++++++++++++++++++++---------------------------------------
Asrc/gnunet/service/gns/rfc-data_test.go | 363+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/gnunet/service/gns/rfc_test.go | 317+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/gnunet/service/revocation/pow_test.go | 71++++++++++++++++++++++++++++++++++++-----------------------------------
Msrc/gnunet/service/zonemaster/zonemaster.go | 8+++-----
Msrc/gnunet/util/base32_test.go | 29+++++++++++++++++++++++++++++
11 files changed, 834 insertions(+), 104 deletions(-)

diff --git a/src/gnunet/crypto/gns.go b/src/gnunet/crypto/gns.go @@ -110,7 +110,7 @@ type ZoneKeyImpl interface { Derive(h *math.Int) (ZoneKeyImpl, *math.Int, error) // BlockKey returns the key for block en-/decryption - BlockKey(label string, expires util.AbsoluteTime) (skey []byte) + BlockKey(label string, expires util.AbsoluteTime) (skey []byte, nLen int) // Encrypt binary data (of any size). Output can be larger than input Encrypt(data []byte, label string, expires util.AbsoluteTime) ([]byte, error) @@ -433,7 +433,7 @@ func (zk *ZoneKey) Derive(label, context string) (dzk *ZoneKey, h *math.Int, err } // BlockKey returns the key for block en-/decryption -func (zk *ZoneKey) BlockKey(label string, expires util.AbsoluteTime) (skey []byte) { +func (zk *ZoneKey) BlockKey(label string, expires util.AbsoluteTime) (skey []byte, nLen int) { return zk.impl.BlockKey(label, expires) } diff --git a/src/gnunet/crypto/gns_edkey.go b/src/gnunet/crypto/gns_edkey.go @@ -92,7 +92,7 @@ func (pk *EDKEYPublicImpl) Derive(h *math.Int) (dPk ZoneKeyImpl, hOut *math.Int, // Encrypt binary data (of any size). Output can be larger than input func (pk *EDKEYPublicImpl) Encrypt(data []byte, label string, expires util.AbsoluteTime) (out []byte, err error) { // derive key material for decryption - skey := pk.BlockKey(label, expires) + skey, _ := pk.BlockKey(label, expires) // En-/decrypt with XSalsa20-Poly1305 cipher var key [32]byte @@ -106,7 +106,7 @@ func (pk *EDKEYPublicImpl) Encrypt(data []byte, label string, expires util.Absol // Decrypt binary data (of any size). Output can be smaller than input func (pk *EDKEYPublicImpl) Decrypt(data []byte, label string, expires util.AbsoluteTime) (out []byte, err error) { // derive key material for decryption - skey := pk.BlockKey(label, expires) + skey, _ := pk.BlockKey(label, expires) // En-/decrypt with XSalsa20-Poly1305 cipher var ( @@ -133,7 +133,7 @@ func (pk *EDKEYPublicImpl) Verify(data []byte, zs *ZoneSignature) (ok bool, err // BlockKey return the symmetric key (and initialization vector) based on // label and expiration time. -func (pk *EDKEYPublicImpl) BlockKey(label string, expire util.AbsoluteTime) (skey []byte) { +func (pk *EDKEYPublicImpl) BlockKey(label string, expire util.AbsoluteTime) (skey []byte, nLen int) { // generate symmetric key skey = make([]byte, 56) kd := pk.Bytes() @@ -157,6 +157,7 @@ func (pk *EDKEYPublicImpl) BlockKey(label string, expire util.AbsoluteTime) (ske } buf, _ := data.Marshal(iv) copy(skey[32:], buf) + nLen = 16 return } @@ -203,10 +204,10 @@ func (pk *EDKEYPrivateImpl) Public() ZoneKeyImpl { return &pk.EDKEYPublicImpl } -// Derive a public key from this key based on a big integer +// Derive a private key from this key based on a big integer // (key blinding). Returns the derived key and the blinding value. func (pk *EDKEYPrivateImpl) Derive(h *math.Int) (dPk ZonePrivateImpl, hOut *math.Int, err error) { - // limit to allowed value range (see LSD0001 spec) + // limit to allowed value range (see LSD0001 spec 5.1.2) hOut = h.SetBit(255, 0) // derive private key derived := pk.prv.Mult(hOut) diff --git a/src/gnunet/crypto/gns_pkey.go b/src/gnunet/crypto/gns_pkey.go @@ -110,7 +110,7 @@ func (pk *PKEYPublicImpl) Verify(data []byte, zs *ZoneSignature) (ok bool, err e // BlockKey return the symmetric key (and initialization vector) based on // label and expiration time. -func (pk *PKEYPublicImpl) BlockKey(label string, expires util.AbsoluteTime) (skey []byte) { +func (pk *PKEYPublicImpl) BlockKey(label string, expires util.AbsoluteTime) (skey []byte, nLen int) { // generate symmetric key skey = make([]byte, 48) kd := pk.pub.Bytes() @@ -137,13 +137,14 @@ func (pk *PKEYPublicImpl) BlockKey(label string, expires util.AbsoluteTime) (ske } buf, _ := data.Marshal(iv) copy(skey[32:], buf) + nLen = 4 return } // cipher implements symmetric en/-decryption (for block data). func (pk *PKEYPublicImpl) cipher(encrypt bool, data []byte, label string, expires util.AbsoluteTime) (out []byte, err error) { // derive key material for decryption - skey := pk.BlockKey(label, expires) + skey, _ := pk.BlockKey(label, expires) // En-/decrypt with AES CTR stream cipher var blk cipher.Block @@ -173,10 +174,10 @@ type PKEYPrivateImpl struct { } // Init instance from binary data. The data represents a big integer -// (in little-endian notation) for the private scalar d (clamped). +// (in big-endian notation) for the private scalar d. func (pk *PKEYPrivateImpl) Init(data []byte) error { // generate key material - d := math.NewIntFromBytes(util.Reverse(data)) + d := math.NewIntFromBytes(data) pk.prv = ed25519.NewPrivateKeyFromD(d) pk.ztype = enums.GNS_TYPE_PKEY pk.pub = pk.prv.Public() @@ -185,11 +186,9 @@ func (pk *PKEYPrivateImpl) Init(data []byte) error { // Prepare a random byte array to be used as a random private PKEY func (pk *PKEYPrivateImpl) Prepare(rnd []byte) []byte { - // clamp little-endian skalar - d := util.Clone(rnd) - d[31] = (d[31] & 0x3f) | 0x40 - d[0] &= 0xf8 - return d + md := sha256.Sum256(rnd) + d := math.NewIntFromBytes(md[:]).Mod(ed25519.GetCurve().N) + return util.Reverse(d.Bytes()) } // Bytes returns a binary representation of the instance suitable for @@ -258,7 +257,7 @@ type PKEYSigImpl struct { sig *ed25519.EcSignature } -// Init instance from binary data. The data represents a big integers +// Init instance from binary data. The data represents big integers // R and S of the signature. func (s *PKEYSigImpl) Init(data []byte) (err error) { s.sig, err = ed25519.NewEcSignatureFromBytes(data) diff --git a/src/gnunet/crypto/gns_test.go b/src/gnunet/crypto/gns_test.go @@ -61,7 +61,7 @@ func TestDeriveBlockKey(t *testing.T) { } // derive and check a key for symmetric cipher - skey := zkey.BlockKey(LABEL, EXPIRE) + skey, _ := zkey.BlockKey(LABEL, EXPIRE) if !bytes.Equal(IV, skey[32:]) { t.Logf("AES_IV(computed) = %s\n", hex.EncodeToString(skey[32:])) t.Logf("AES_IV(expected) = %s\n", hex.EncodeToString(IV)) @@ -202,11 +202,11 @@ func TestVerifyBlock(t *testing.T) { func TestDeriveH(t *testing.T) { var ( D = []byte{ - // private scalar (clamped little-endian) - 0xc8, 0x93, 0xb0, 0x5d, 0xac, 0xff, 0x85, 0x1b, - 0xf5, 0xcc, 0x94, 0x24, 0x95, 0x71, 0xaf, 0x0e, - 0xcd, 0x9c, 0x1d, 0xfd, 0x1d, 0x6a, 0x0e, 0xab, - 0xe0, 0x11, 0x64, 0xef, 0x1d, 0xf7, 0x50, 0x74, + // private scalar (clamped big-endian) + 0x74, 0x50, 0xf7, 0x1d, 0xef, 0x64, 0x11, 0xe0, + 0xab, 0x0e, 0x6a, 0x1d, 0xfd, 0x1d, 0x9c, 0xcd, + 0x0e, 0xaf, 0x71, 0x95, 0x24, 0x94, 0xcc, 0xf5, + 0x1b, 0x85, 0xff, 0xac, 0x5d, 0xb0, 0x93, 0xc8, } PUB = []byte{ diff --git a/src/gnunet/service/dht/blocks/gns.go b/src/gnunet/service/dht/blocks/gns.go @@ -151,12 +151,26 @@ func (b *GNSBlock) Payload() []byte { return util.Clone(b.data) } -// Bytes return th binary representation of block +// Bytes return the binary representation of block func (b *GNSBlock) Bytes() []byte { buf, _ := data.Marshal(b) return buf } +// RRBLOCK returns the block according to spec +func (b *GNSBlock) RRBLOCK() []byte { + // compute size of output + size := uint32(16 + b.DerivedKeySig.SigSize() + b.DerivedKeySig.KeySize() + uint(len(b.Body.Data))) + buf := new(bytes.Buffer) + _ = binary.Write(buf, binary.BigEndian, size) + _ = binary.Write(buf, binary.BigEndian, b.DerivedKeySig.Type) + buf.Write(b.DerivedKeySig.KeyData) + buf.Write(b.DerivedKeySig.Bytes()) + _ = binary.Write(buf, binary.BigEndian, b.Body.Expire.Val) + buf.Write(b.Body.Data) + return buf.Bytes() +} + // Expire returns the expiration date of the block. func (b *GNSBlock) Expire() util.AbsoluteTime { return b.Body.Expire @@ -194,7 +208,9 @@ func NewGNSBlock() Block { // Prepare a block to be of given type and expiration. // Not required for GNS blocks -func (b *GNSBlock) Prepare(enums.BlockType, util.AbsoluteTime) {} +func (b *GNSBlock) Prepare(_ enums.BlockType, ts util.AbsoluteTime) { + b.Body.Expire = ts +} // SetData sets the data for the GNS block func (b *GNSBlock) SetData(data []byte) { @@ -286,6 +302,12 @@ func (rs *RecordSet) AddRecord(rec *ResourceRecord) { // SetPadding (re-)calculates and allocates the padding. func (rs *RecordSet) SetPadding() { + // do not add padding to single delegation record + typ := rs.Records[0].RType + if len(rs.Records) == 1 && (typ == enums.GNS_TYPE_PKEY || typ == enums.GNS_TYPE_EDKEY) { + return + } + // compute padding size size := 0 for _, rr := range rs.Records { size += int(rr.Size) + 16 diff --git a/src/gnunet/service/dht/blocks/gns_test.go b/src/gnunet/service/dht/blocks/gns_test.go @@ -128,11 +128,11 @@ func TestGNSBlock(t *testing.T) { func TestRecordsetPKEY(t *testing.T) { var ( D = []byte{ - // PKEY private scalar (clamped little-endian) - 0x98, 0xfd, 0xfa, 0x25, 0x79, 0x90, 0xfa, 0x50, - 0xd4, 0xe7, 0xc8, 0x78, 0x21, 0xa0, 0x71, 0x21, - 0x95, 0xe5, 0x85, 0x97, 0x90, 0x96, 0x73, 0xf3, - 0xdf, 0xea, 0xef, 0xa4, 0x52, 0xb6, 0xd7, 0x50, + // PKEY private scalar (clamped big-endian) + 0x50, 0xd7, 0xb6, 0x52, 0xa4, 0xef, 0xea, 0xdf, + 0xf3, 0x73, 0x96, 0x90, 0x97, 0x85, 0xe5, 0x95, + 0x21, 0x71, 0xa0, 0x21, 0x78, 0xc8, 0xe7, 0xd4, + 0x50, 0xfa, 0x90, 0x79, 0x25, 0xfa, 0xfd, 0x98, } ZKEY = []byte{ // zone type @@ -178,11 +178,10 @@ func TestRecordsetPKEY(t *testing.T) { } RDATA = []byte{ 0x00, 0x00, 0x00, 0x02, 0x00, 0x34, 0xe5, 0x3b, - 0xe1, 0x93, 0x79, 0x91, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x03, 0x04, 0x00, 0x5c, 0xe4, 0xa5, - 0x39, 0x4a, 0xd9, 0x91, 0x00, 0x00, 0x00, 0x24, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0xe1, 0x93, 0x79, 0x91, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x04, + 0x00, 0x5c, 0xe4, 0xa5, 0x39, 0x4a, 0xd9, 0x91, + 0x00, 0x24, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x60, 0x1b, 0xe4, 0x2e, 0xb5, 0x7f, 0xb4, 0x69, 0x76, 0x10, 0xcf, 0x3a, 0x3b, 0x18, 0x34, 0x7b, 0x65, 0xa3, 0x3f, @@ -193,6 +192,7 @@ func TestRecordsetPKEY(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, } NONCE = []byte{ @@ -207,16 +207,16 @@ func TestRecordsetPKEY(t *testing.T) { } BDATA = []byte{ 0x00, 0xe4, 0x83, 0x7e, 0xb5, 0xd0, 0x4f, 0x92, - 0x90, 0x3d, 0xe4, 0xb5, 0x23, 0x4e, 0x8c, 0xca, - 0xc5, 0x73, 0x6c, 0x97, 0x93, 0x37, 0x9a, 0x59, - 0xc3, 0x33, 0x75, 0xfc, 0x89, 0x51, 0xac, 0xa2, - 0xeb, 0x7a, 0xad, 0x06, 0x7b, 0xf9, 0xaf, 0x60, - 0xbf, 0x26, 0x75, 0x86, 0x46, 0xa1, 0x7f, 0x5e, - 0x5c, 0x3b, 0x62, 0x15, 0xf9, 0x40, 0x79, 0x54, - 0x5b, 0x1c, 0x4d, 0x4f, 0x1b, 0x2e, 0xbb, 0x22, - 0xc2, 0xb4, 0xda, 0xd4, 0x41, 0x26, 0x81, 0x7b, - 0x6f, 0x00, 0x15, 0x30, 0xd4, 0x76, 0x40, 0x1d, - 0xd6, 0x7a, 0xc0, 0x14, 0x85, 0x54, 0xe8, 0x06, + 0x90, 0x3d, 0xe4, 0xb5, 0x23, 0x4a, 0x8c, 0xce, + 0xc5, 0x73, 0x6c, 0x97, 0x92, 0x35, 0x99, 0x5d, + 0xc2, 0x6d, 0x92, 0x5d, 0xb0, 0x47, 0x91, 0x96, + 0xd2, 0x14, 0x74, 0x95, 0x7b, 0xf8, 0xaf, 0x44, + 0xbf, 0x26, 0x75, 0x86, 0x48, 0xc1, 0x64, 0xb8, + 0x72, 0x8f, 0x1d, 0xa1, 0x9e, 0x56, 0x72, 0x7f, + 0x4f, 0x92, 0x2a, 0xcf, 0x09, 0x3d, 0x08, 0xd2, + 0xfa, 0xd4, 0x99, 0xf7, 0x70, 0xfd, 0xd9, 0x74, + 0xed, 0x20, 0xb0, 0xe8, 0x9e, 0xc8, 0xbb, 0x2d, + 0x56, 0x01, 0x3e, 0xdb, 0x85, 0x54, 0xe8, 0x06, 0x35, 0x3d, 0xa9, 0xe4, 0x29, 0x80, 0x79, 0xf3, 0xe1, 0xb1, 0x69, 0x42, 0xc4, 0x8d, 0x90, 0xc4, 0x36, 0x0c, 0x61, 0x23, 0x8c, 0x40, 0xd9, 0xd5, @@ -259,7 +259,7 @@ func TestRecordsetPKEY(t *testing.T) { // check symmetric keys and nonce expires := RECSET.Expire() - skey := zk.BlockKey(LABEL, expires) + skey, _ := zk.BlockKey(LABEL, expires) if !bytes.Equal(skey[32:], NONCE) { t.Logf("nonce = %s\n", hex.EncodeToString(skey[32:])) t.Logf("NONCE = %s\n", hex.EncodeToString(NONCE)) @@ -338,11 +338,10 @@ func TestRecordsetEDKEY(t *testing.T) { } RDATA = []byte{ 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0xc0, 0x6f, - 0xb9, 0x28, 0x15, 0x80, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x03, 0x04, 0x00, 0xb0, 0x0f, 0x81, - 0xb7, 0x44, 0x9b, 0x40, 0x00, 0x00, 0x00, 0x24, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, + 0xb9, 0x28, 0x15, 0x80, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x04, + 0x00, 0xb0, 0x0f, 0x81, 0xb7, 0x44, 0x9b, 0x40, + 0x00, 0x24, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x4d, 0x79, 0x20, 0x4e, 0x69, 0x63, 0x6b, 0x00, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x4f, 0x4e, 0x43, 0x45, @@ -353,6 +352,7 @@ func TestRecordsetEDKEY(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, } NONCE = []byte{ @@ -367,19 +367,19 @@ func TestRecordsetEDKEY(t *testing.T) { 0xba, 0x3b, 0x17, 0x91, 0x61, 0x7b, 0xee, 0x69, } BDATA = []byte{ - 0x36, 0x07, 0xf8, 0x62, 0xfc, 0xf4, 0xc6, 0xd4, - 0x86, 0x1c, 0x7a, 0x06, 0x08, 0x81, 0x28, 0xbb, + 0x11, 0x68, 0xd8, 0x7f, 0x88, 0xc4, 0x88, 0x2f, + 0x0e, 0xc8, 0xf8, 0x60, 0x16, 0x8d, 0xad, 0x64, 0x3d, 0x6c, 0xca, 0xe2, 0xb1, 0x4e, 0xf4, 0x25, - 0xe3, 0xd6, 0xbb, 0xd6, 0x27, 0x1a, 0x71, 0xe5, - 0x42, 0x1c, 0x25, 0x1c, 0xfb, 0x5e, 0xb6, 0xd7, - 0xbc, 0x9e, 0x74, 0xb2, 0xe8, 0xc8, 0xd8, 0x6c, - 0xe0, 0x65, 0x37, 0x12, 0x0c, 0x2e, 0xe2, 0x28, - 0x5b, 0x93, 0xc5, 0xaf, 0xb7, 0x79, 0xf9, 0xcf, - 0x50, 0x2e, 0x16, 0xa5, 0xad, 0x30, 0xe6, 0x22, - 0xed, 0x58, 0x92, 0xd2, 0x46, 0xc0, 0x34, 0x11, - 0x70, 0xf0, 0xc5, 0x1c, 0x39, 0x40, 0xab, 0x33, - 0x47, 0xdc, 0x91, 0x56, 0x5f, 0x36, 0x6d, 0xb6, - 0x23, 0x56, 0x73, 0x9a, 0xd8, 0xde, 0x68, 0x21, + 0xe3, 0xd6, 0xbb, 0xd6, 0x27, 0x1e, 0x71, 0xe1, + 0x42, 0x1c, 0x25, 0x1c, 0xfa, 0x5c, 0xb5, 0xd3, + 0xbd, 0x2c, 0x78, 0x37, 0x5f, 0x3c, 0x4c, 0xad, + 0x57, 0x05, 0xac, 0x50, 0x0c, 0x2f, 0xe2, 0x0d, + 0x16, 0xeb, 0xe5, 0xe0, 0xde, 0x1a, 0x92, 0xcd, + 0x58, 0x39, 0x55, 0x99, 0xbd, 0x23, 0xf9, 0x4b, + 0xc7, 0x58, 0xd1, 0xee, 0x70, 0xfe, 0x03, 0x3d, + 0x63, 0xdb, 0xbd, 0x02, 0x3f, 0x5c, 0xa9, 0x22, + 0x72, 0xd6, 0x87, 0x3c, 0x16, 0x64, 0x2c, 0xe2, + 0x6a, 0x19, 0x3d, 0xa0, 0xd8, 0xde, 0x68, 0x21, 0x12, 0x68, 0xf0, 0xc0, 0x44, 0x00, 0x81, 0xd8, 0xaf, 0x8a, 0x6e, 0x16, 0x45, 0xa6, 0x92, 0x46, 0xb4, 0x34, 0xe2, 0xc8, 0x76, 0x9f, 0x00, 0x1b, @@ -422,7 +422,7 @@ func TestRecordsetEDKEY(t *testing.T) { // check symmetric keys and nonce expires := RECSET.Expire() - skey := zk.BlockKey(LABEL, expires) + skey, _ := zk.BlockKey(LABEL, expires) if !bytes.Equal(skey[32:], NONCE) { t.Logf("nonce = %s\n", hex.EncodeToString(skey[32:])) t.Logf("NONCE = %s\n", hex.EncodeToString(NONCE)) diff --git a/src/gnunet/service/gns/rfc-data_test.go b/src/gnunet/service/gns/rfc-data_test.go @@ -0,0 +1,363 @@ +// This file is part of gnunet-go, a GNUnet-implementation in Golang. +// Copyright (C) 2019-2023 Bernd Fix >Y< +// +// gnunet-go is free software: you can redistribute it and/or modify it +// under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// gnunet-go is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// SPDX-License-Identifier: AGPL3.0-or-later + +package gns + +type Rec struct { + Expire []byte + Size []byte + Type []byte + Flags []byte + Data []byte +} + +type Enc struct { + Nonce []byte + Expire []byte + Counter []byte + Key []byte +} + +type TestCase struct { + Zpk []byte + Zid []byte + Ztld string + Label string + Q []byte + Recs []*Rec + Rdata []byte + Enc *Enc + Bdata []byte + RRblock []byte +} + +var tests = []*TestCase{ + // Testcase #1 + { + Zpk: []byte{ + 0x50, 0xd7, 0xb6, 0x52, 0xa4, 0xef, 0xea, 0xdf, 0xf3, 0x73, 0x96, 0x90, 0x97, 0x85, 0xe5, 0x95, + 0x21, 0x71, 0xa0, 0x21, 0x78, 0xc8, 0xe7, 0xd4, 0x50, 0xfa, 0x90, 0x79, 0x25, 0xfa, 0xfd, 0x98, + }, + Zid: []byte{ + 0x00, 0x01, 0x00, 0x00, + 0x67, 0x7c, 0x47, 0x7d, 0x2d, 0x93, 0x09, 0x7c, 0x85, 0xb1, 0x95, 0xc6, 0xf9, 0x6d, 0x84, 0xff, + 0x61, 0xf5, 0x98, 0x2c, 0x2c, 0x4f, 0xe0, 0x2d, 0x5a, 0x11, 0xfe, 0xdf, 0xb0, 0xc2, 0x90, 0x1f, + }, + Ztld: "000G0037FH3QTBCK15Y8BCCNRVWPV17ZC7TSGB1C9ZG2TPGHZVFV1GMG3W", + Label: "testdelegation", + Q: []byte{ + 0x4a, 0xdc, 0x67, 0xc5, 0xec, 0xee, 0x9f, 0x76, 0x98, 0x6a, 0xbd, 0x71, 0xc2, 0x22, 0x4a, 0x3d, + 0xce, 0x2e, 0x91, 0x70, 0x26, 0xc9, 0xa0, 0x9d, 0xfd, 0x44, 0xce, 0xf3, 0xd2, 0x0f, 0x55, 0xa2, + 0x73, 0x32, 0x72, 0x5a, 0x6c, 0x8a, 0xfb, 0xbb, 0xb0, 0xf7, 0xec, 0x9a, 0xf1, 0xcc, 0x42, 0x64, + 0x12, 0x99, 0x40, 0x6b, 0x04, 0xfd, 0x9b, 0x5b, 0x57, 0x91, 0xf8, 0x6c, 0x4b, 0x08, 0xd5, 0xf4, + }, + Recs: []*Rec{ + { + Expire: []byte{0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80}, + Size: []byte{0x00, 0x20}, + Type: []byte{0x00, 0x01, 0x00, 0x00}, + Flags: []byte{0x00, 0x01}, + Data: []byte{ + 0x21, 0xe3, 0xb3, 0x0f, 0xf9, 0x3b, 0xc6, 0xd3, 0x5a, 0xc8, 0xc6, 0xe0, 0xe1, 0x3a, 0xfd, 0xff, + 0x79, 0x4c, 0xb7, 0xb4, 0x4b, 0xbb, 0xc7, 0x48, 0xd2, 0x59, 0xd0, 0xa0, 0x28, 0x4d, 0xbe, 0x84, + }, + }, + }, + Rdata: []byte{ + 0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x21, 0xe3, 0xb3, 0x0f, 0xf9, 0x3b, 0xc6, 0xd3, 0x5a, 0xc8, 0xc6, 0xe0, 0xe1, 0x3a, 0xfd, 0xff, + 0x79, 0x4c, 0xb7, 0xb4, 0x4b, 0xbb, 0xc7, 0x48, 0xd2, 0x59, 0xd0, 0xa0, 0x28, 0x4d, 0xbe, 0x84, + }, + Enc: &Enc{ + Nonce: []byte{0xe9, 0x0a, 0x00, 0x61}, + Expire: []byte{0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80}, + Counter: []byte{0x00, 0x00, 0x00, 0x01}, + Key: []byte{ + 0x86, 0x4e, 0x71, 0x38, 0xea, 0xe7, 0xfd, 0x91, 0xa3, 0x01, 0x36, 0x89, 0x9c, 0x13, 0x2b, 0x23, + 0xac, 0xeb, 0xdb, 0x2c, 0xef, 0x43, 0xcb, 0x19, 0xf6, 0xbf, 0x55, 0xb6, 0x7d, 0xb9, 0xb3, 0xb3, + }, + }, + Bdata: []byte{ + 0x41, 0xdc, 0x7b, 0x5f, 0x21, 0x76, 0xba, 0x59, 0x19, 0x98, 0xaf, 0xb9, 0xe3, 0xc8, 0x25, 0x79, + 0x50, 0x50, 0xaf, 0xc4, 0xb5, 0x3d, 0x68, 0xe4, 0x1e, 0xd9, 0x21, 0xda, 0x89, 0xde, 0x51, 0xe7, + 0xda, 0x35, 0xa2, 0x95, 0xb5, 0x9c, 0x2b, 0x8a, 0xae, 0xa4, 0x39, 0x91, 0x48, 0xd5, 0x0c, 0xff, + }, + RRblock: []byte{ + 0x00, 0x00, 0x00, 0xb0, 0x00, 0x01, 0x00, 0x00, 0x18, 0x2b, 0xb6, 0x36, 0xed, 0xa7, 0x9f, 0x79, + 0x57, 0x11, 0xbc, 0x27, 0x08, 0xad, 0xbb, 0x24, 0x2a, 0x60, 0x44, 0x6a, 0xd3, 0xc3, 0x08, 0x03, + 0x12, 0x1d, 0x03, 0xd3, 0x48, 0xb7, 0xce, 0xb6, 0x01, 0xbe, 0xab, 0x94, 0x4a, 0xff, 0x7c, 0xcc, + 0x51, 0xbf, 0xfb, 0x21, 0x27, 0x79, 0xc3, 0x41, 0x87, 0x66, 0x0c, 0x62, 0x5d, 0x1c, 0xeb, 0x59, + 0xd5, 0xa0, 0xa9, 0xa2, 0xdf, 0xe4, 0x07, 0x2d, 0x0f, 0x08, 0xcd, 0x2a, 0xb1, 0xe9, 0xed, 0x63, + 0xd3, 0x89, 0x8f, 0xf7, 0x32, 0x52, 0x1b, 0x57, 0x31, 0x7a, 0x6c, 0x49, 0x50, 0xe1, 0x98, 0x4d, + 0x74, 0xdf, 0x01, 0x5f, 0x9e, 0xb7, 0x2c, 0x4a, 0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80, + 0x41, 0xdc, 0x7b, 0x5f, 0x21, 0x76, 0xba, 0x59, 0x19, 0x98, 0xaf, 0xb9, 0xe3, 0xc8, 0x25, 0x79, + 0x50, 0x50, 0xaf, 0xc4, 0xb5, 0x3d, 0x68, 0xe4, 0x1e, 0xd9, 0x21, 0xda, 0x89, 0xde, 0x51, 0xe7, + 0xda, 0x35, 0xa2, 0x95, 0xb5, 0x9c, 0x2b, 0x8a, 0xae, 0xa4, 0x39, 0x91, 0x48, 0xd5, 0x0c, 0xff, + 0x68, 0x59, 0x6b, 0x4d, 0xcb, 0x8b, 0xc2, 0xc1, 0x1b, 0xb1, 0x84, 0xd5, 0x90, 0x56, 0x13, 0xe8, + }, + }, + // Testcase #2 + { + Zpk: []byte{ + 0x50, 0xd7, 0xb6, 0x52, 0xa4, 0xef, 0xea, 0xdf, 0xf3, 0x73, 0x96, 0x90, 0x97, 0x85, 0xe5, 0x95, + 0x21, 0x71, 0xa0, 0x21, 0x78, 0xc8, 0xe7, 0xd4, 0x50, 0xfa, 0x90, 0x79, 0x25, 0xfa, 0xfd, 0x98, + }, + Zid: []byte{ + 0x00, 0x01, 0x00, 0x00, + 0x67, 0x7c, 0x47, 0x7d, 0x2d, 0x93, 0x09, 0x7c, 0x85, 0xb1, 0x95, 0xc6, 0xf9, 0x6d, 0x84, 0xff, + 0x61, 0xf5, 0x98, 0x2c, 0x2c, 0x4f, 0xe0, 0x2d, 0x5a, 0x11, 0xfe, 0xdf, 0xb0, 0xc2, 0x90, 0x1f, + }, + Ztld: "000G0037FH3QTBCK15Y8BCCNRVWPV17ZC7TSGB1C9ZG2TPGHZVFV1GMG3W", + Label: "天下無敵", + Q: []byte{ + 0xaf, 0xf0, 0xad, 0x6a, 0x44, 0x09, 0x73, 0x68, 0x42, 0x9a, 0xc4, 0x76, 0xdf, 0xa1, 0xf3, 0x4b, + 0xee, 0x4c, 0x36, 0xe7, 0x47, 0x6d, 0x07, 0xaa, 0x64, 0x63, 0xff, 0x20, 0x91, 0x5b, 0x10, 0x05, + 0xc0, 0x99, 0x1d, 0xef, 0x91, 0xfc, 0x3e, 0x10, 0x90, 0x9f, 0x87, 0x02, 0xc0, 0xbe, 0x40, 0x43, + 0x67, 0x78, 0xc7, 0x11, 0xf2, 0xca, 0x47, 0xd5, 0x5c, 0xf0, 0xb5, 0x4d, 0x23, 0x5d, 0xa9, 0x77, + }, + Recs: []*Rec{ + { + Expire: []byte{0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80}, + Size: []byte{0x00, 0x10}, + Type: []byte{0x00, 0x00, 0x00, 0x1c}, + Flags: []byte{0x00, 0x00}, + Data: []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xad, 0xbe, 0xef}, + }, + { + Expire: []byte{0x00, 0xb0, 0x0f, 0x81, 0xb7, 0x44, 0x9b, 0x40}, + Size: []byte{0x00, 0x06}, + Type: []byte{0x00, 0x01, 0x00, 0x01}, + Flags: []byte{0x80, 0x00}, + Data: []byte{0xe6, 0x84, 0x9b, 0xe7, 0xa7, 0xb0}, + }, + { + Expire: []byte{0x00, 0x98, 0xd7, 0xff, 0x80, 0x4a, 0x39, 0x40}, + Size: []byte{0x00, 0x0b}, + Type: []byte{0x00, 0x00, 0x00, 0x10}, + Flags: []byte{0x00, 0x04}, + Data: []byte{0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64}, + }, + }, + Rdata: []byte{ + 0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xad, 0xbe, 0xef, + 0x00, 0xb0, 0x0f, 0x81, 0xb7, 0x44, 0x9b, 0x40, 0x00, 0x06, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, + 0xe6, 0x84, 0x9b, 0xe7, 0xa7, 0xb0, 0x00, 0x98, 0xd7, 0xff, 0x80, 0x4a, 0x39, 0x40, 0x00, 0x0b, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + Enc: &Enc{ + Nonce: []byte{0xee, 0x96, 0x33, 0xc1}, + Expire: []byte{0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80}, + Counter: []byte{0x00, 0x00, 0x00, 0x01}, + Key: []byte{ + 0xfb, 0x3a, 0xb5, 0xde, 0x23, 0xbd, 0xda, 0xe1, 0x99, 0x7a, 0xaf, 0x7b, 0x92, 0xc2, 0xd2, 0x71, + 0x51, 0x40, 0x8b, 0x77, 0xaf, 0x7a, 0x41, 0xac, 0x79, 0x05, 0x7c, 0x4d, 0xf5, 0x38, 0x3d, 0x01, + }, + }, + Bdata: []byte{ + 0xa1, 0xf9, 0x4f, 0x65, 0xc7, 0x20, 0x2b, 0x86, 0x2b, 0x75, 0x0d, 0x89, 0x53, 0x1c, 0x66, 0x5d, + 0x1b, 0x7f, 0x5e, 0x90, 0x92, 0x9b, 0xd8, 0xa4, 0xd9, 0x24, 0xe6, 0x52, 0x5d, 0xbd, 0x6b, 0x2f, + 0x81, 0x8c, 0x43, 0xb2, 0x2e, 0x2a, 0xc7, 0x08, 0x2b, 0x6e, 0x69, 0x60, 0x27, 0x6f, 0x41, 0xca, + 0xcf, 0x0b, 0x27, 0xb2, 0x50, 0x2b, 0x58, 0x90, 0xc8, 0x03, 0x9e, 0xb6, 0xb5, 0x74, 0x22, 0x06, + 0x88, 0xd5, 0x43, 0xb4, 0xf4, 0x51, 0x9f, 0x4a, 0xc4, 0x76, 0xd2, 0xa5, 0x77, 0xe9, 0xbd, 0x59, + 0xd6, 0xf4, 0x72, 0xbc, 0x93, 0xa2, 0xfe, 0x66, 0x16, 0x11, 0x75, 0x9c, 0xca, 0xf2, 0xd6, 0x72, + 0x60, 0xc1, 0xdb, 0x4a, 0x03, 0x53, 0x1b, 0x86, 0x7d, 0xfa, 0x35, 0xf7, 0xbc, 0x30, 0x02, 0xb8, + 0xf4, 0x00, 0x0e, 0x4e, 0x7c, 0x7d, 0x91, 0x7a, 0xd2, 0x29, 0xf7, 0x9b, 0x2a, 0xee, 0xe3, 0xf1, + }, + RRblock: []byte{ + 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0xa5, 0x12, 0x96, 0xdf, 0x75, 0x7e, 0xe2, 0x75, + 0xca, 0x11, 0x8d, 0x4f, 0x07, 0xfa, 0x7a, 0xae, 0x55, 0x08, 0xbc, 0xf5, 0x12, 0xaa, 0x41, 0x12, + 0x14, 0x29, 0xd4, 0xa0, 0xde, 0x9d, 0x05, 0x7e, 0x05, 0xc0, 0x95, 0x04, 0x0b, 0x10, 0xc7, 0xf8, + 0x18, 0x7a, 0xa5, 0xda, 0x12, 0x28, 0x7d, 0x1c, 0x29, 0x10, 0xff, 0x04, 0xd6, 0xf5, 0x0a, 0xf1, + 0xfa, 0x95, 0x38, 0x2e, 0x9f, 0x00, 0x7f, 0x75, 0x09, 0x8f, 0x62, 0x0d, 0x1f, 0xf7, 0xc9, 0x71, + 0x28, 0xf4, 0x0d, 0x74, 0x58, 0xa2, 0xd3, 0xc7, 0xf0, 0x48, 0xca, 0x38, 0x20, 0x06, 0x4b, 0xdd, + 0xee, 0x94, 0x13, 0xe9, 0x54, 0x8e, 0xc9, 0x94, 0x00, 0x05, 0xdb, 0x3b, 0xcd, 0xbd, 0x61, 0x7c, + 0xa1, 0xf9, 0x4f, 0x65, 0xc7, 0x20, 0x2b, 0x86, 0x2b, 0x75, 0x0d, 0x89, 0x53, 0x1c, 0x66, 0x5d, + 0x1b, 0x7f, 0x5e, 0x90, 0x92, 0x9b, 0xd8, 0xa4, 0xd9, 0x24, 0xe6, 0x52, 0x5d, 0xbd, 0x6b, 0x2f, + 0x81, 0x8c, 0x43, 0xb2, 0x2e, 0x2a, 0xc7, 0x08, 0x2b, 0x6e, 0x69, 0x60, 0x27, 0x6f, 0x41, 0xca, + 0xcf, 0x0b, 0x27, 0xb2, 0x50, 0x2b, 0x58, 0x90, 0xc8, 0x03, 0x9e, 0xb6, 0xb5, 0x74, 0x22, 0x06, + 0x88, 0xd5, 0x43, 0xb4, 0xf4, 0x51, 0x9f, 0x4a, 0xc4, 0x76, 0xd2, 0xa5, 0x77, 0xe9, 0xbd, 0x59, + 0xd6, 0xf4, 0x72, 0xbc, 0x93, 0xa2, 0xfe, 0x66, 0x16, 0x11, 0x75, 0x9c, 0xca, 0xf2, 0xd6, 0x72, + 0x60, 0xc1, 0xdb, 0x4a, 0x03, 0x53, 0x1b, 0x86, 0x7d, 0xfa, 0x35, 0xf7, 0xbc, 0x30, 0x02, 0xb8, + 0xf4, 0x00, 0x0e, 0x4e, 0x7c, 0x7d, 0x91, 0x7a, 0xd2, 0x29, 0xf7, 0x9b, 0x2a, 0xee, 0xe3, 0xf1, + }, + }, + // Testcase #3 + { + Zpk: []byte{ + 0x5a, 0xf7, 0x02, 0x0e, 0xe1, 0x91, 0x60, 0x32, 0x88, 0x32, 0x35, 0x2b, 0xbc, 0x6a, 0x68, 0xa8, + 0xd7, 0x1a, 0x7c, 0xbe, 0x1b, 0x92, 0x99, 0x69, 0xa7, 0xc6, 0x6d, 0x41, 0x5a, 0x0d, 0x8f, 0x65, + }, + Zid: []byte{ + 0x00, 0x01, 0x00, 0x14, + 0x3c, 0xf4, 0xb9, 0x24, 0x03, 0x20, 0x22, 0xf0, 0xdc, 0x50, 0x58, 0x14, 0x53, 0xb8, 0x5d, 0x93, + 0xb0, 0x47, 0xb6, 0x3d, 0x44, 0x6c, 0x58, 0x45, 0xcb, 0x48, 0x44, 0x5d, 0xdb, 0x96, 0x68, 0x8f, + }, + Ztld: "000G051WYJWJ80S04BRDRM2R2H9VGQCKP13VCFA4DHC4BJT88HEXQ5K8HW", + Label: "testdelegation", + Q: []byte{ + 0xab, 0xaa, 0xba, 0xc0, 0xe1, 0x24, 0x94, 0x59, 0x75, 0x98, 0x83, 0x95, 0xaa, 0xc0, 0x24, 0x1e, + 0x55, 0x59, 0xc4, 0x1c, 0x40, 0x74, 0xe2, 0x55, 0x7b, 0x9f, 0xe6, 0xd1, 0x54, 0xb6, 0x14, 0xfb, + 0xcd, 0xd4, 0x7f, 0xc7, 0xf5, 0x1d, 0x78, 0x6d, 0xc2, 0xe0, 0xb1, 0xec, 0xe7, 0x60, 0x37, 0xc0, + 0xa1, 0x57, 0x8c, 0x38, 0x4e, 0xc6, 0x1d, 0x44, 0x56, 0x36, 0xa9, 0x4e, 0x88, 0x03, 0x29, 0xe9, + }, + Recs: []*Rec{ + { + Expire: []byte{0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80}, + Size: []byte{0x00, 0x20}, + Type: []byte{0x00, 0x01, 0x00, 0x00}, + Flags: []byte{0x00, 0x01}, + Data: []byte{ + 0x21, 0xe3, 0xb3, 0x0f, 0xf9, 0x3b, 0xc6, 0xd3, 0x5a, 0xc8, 0xc6, 0xe0, 0xe1, 0x3a, 0xfd, 0xff, + 0x79, 0x4c, 0xb7, 0xb4, 0x4b, 0xbb, 0xc7, 0x48, 0xd2, 0x59, 0xd0, 0xa0, 0x28, 0x4d, 0xbe, 0x84, + }, + }, + }, + Rdata: []byte{ + 0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x21, 0xe3, 0xb3, 0x0f, 0xf9, 0x3b, 0xc6, 0xd3, 0x5a, 0xc8, 0xc6, 0xe0, 0xe1, 0x3a, 0xfd, 0xff, + 0x79, 0x4c, 0xb7, 0xb4, 0x4b, 0xbb, 0xc7, 0x48, 0xd2, 0x59, 0xd0, 0xa0, 0x28, 0x4d, 0xbe, 0x84, + }, + Enc: &Enc{ + Nonce: []byte{ + 0x98, 0x13, 0x2e, 0xa8, 0x68, 0x59, 0xd3, 0x5c, + 0x88, 0xbf, 0xd3, 0x17, 0xfa, 0x99, 0x1b, 0xcb, + }, + Expire: []byte{0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80}, + Key: []byte{ + 0x85, 0xc4, 0x29, 0xa9, 0x56, 0x7a, 0xa6, 0x33, 0x41, 0x1a, 0x96, 0x91, 0xe9, 0x09, 0x4c, 0x45, + 0x28, 0x16, 0x72, 0xbe, 0x58, 0x60, 0x34, 0xaa, 0xe4, 0xa2, 0xa2, 0xcc, 0x71, 0x61, 0x59, 0xe2, + }, + }, + Bdata: []byte{ + 0x9c, 0xc4, 0x55, 0xa1, 0x29, 0x33, 0x19, 0x43, 0x59, 0x93, 0xcb, 0x3d, 0x67, 0x17, 0x9e, 0xc0, + 0x6e, 0xa8, 0xd8, 0x89, 0x4e, 0x90, 0x4a, 0x0c, 0x35, 0xe9, 0x1c, 0x5c, 0x2f, 0xf2, 0xed, 0x93, + 0x9c, 0xc2, 0xf8, 0x30, 0x12, 0x31, 0xf4, 0x4e, 0x59, 0x2a, 0x4a, 0xc8, 0x7e, 0x49, 0x98, 0xb9, + 0x46, 0x25, 0xc6, 0x4a, 0xf5, 0x16, 0x86, 0xa2, 0xb3, 0x6a, 0x2b, 0x28, 0x92, 0xd4, 0x4f, 0x2d, + }, + RRblock: []byte{ + 0x00, 0x00, 0x00, 0xb0, 0x00, 0x01, 0x00, 0x14, 0x9b, 0xf2, 0x33, 0x19, 0x8c, 0x6d, 0x53, 0xbb, + 0xdb, 0xac, 0x49, 0x5c, 0xab, 0xd9, 0x10, 0x49, 0xa6, 0x84, 0xaf, 0x3f, 0x40, 0x51, 0xba, 0xca, + 0xb0, 0xdc, 0xf2, 0x1c, 0x8c, 0xf2, 0x7a, 0x1a, 0x44, 0xd2, 0x40, 0xd0, 0x79, 0x02, 0xf4, 0x90, + 0xb7, 0xc4, 0x3e, 0xf0, 0x07, 0x58, 0xab, 0xce, 0x88, 0x51, 0xc1, 0x8c, 0x70, 0xac, 0x6d, 0xf9, + 0x7a, 0x88, 0xf7, 0x92, 0x11, 0xcf, 0x87, 0x5f, 0x78, 0x48, 0x85, 0xca, 0x3e, 0x34, 0x9e, 0xc4, + 0xca, 0x89, 0x2b, 0x9f, 0xf0, 0x84, 0xc5, 0x35, 0x89, 0x65, 0xb8, 0xe7, 0x4a, 0x23, 0x15, 0x95, + 0x2d, 0x4c, 0x8c, 0x06, 0x52, 0x1c, 0x2f, 0x0c, 0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80, + 0x9c, 0xc4, 0x55, 0xa1, 0x29, 0x33, 0x19, 0x43, 0x59, 0x93, 0xcb, 0x3d, 0x67, 0x17, 0x9e, 0xc0, + 0x6e, 0xa8, 0xd8, 0x89, 0x4e, 0x90, 0x4a, 0x0c, 0x35, 0xe9, 0x1c, 0x5c, 0x2f, 0xf2, 0xed, 0x93, + 0x9c, 0xc2, 0xf8, 0x30, 0x12, 0x31, 0xf4, 0x4e, 0x59, 0x2a, 0x4a, 0xc8, 0x7e, 0x49, 0x98, 0xb9, + 0x46, 0x25, 0xc6, 0x4a, 0xf5, 0x16, 0x86, 0xa2, 0xb3, 0x6a, 0x2b, 0x28, 0x92, 0xd4, 0x4f, 0x2d, + }, + }, + // Testcase #4 + { + Zpk: []byte{ + 0x5a, 0xf7, 0x02, 0x0e, 0xe1, 0x91, 0x60, 0x32, 0x88, 0x32, 0x35, 0x2b, 0xbc, 0x6a, 0x68, 0xa8, + 0xd7, 0x1a, 0x7c, 0xbe, 0x1b, 0x92, 0x99, 0x69, 0xa7, 0xc6, 0x6d, 0x41, 0x5a, 0x0d, 0x8f, 0x65, + }, + Zid: []byte{ + 0x00, 0x01, 0x00, 0x14, + 0x3c, 0xf4, 0xb9, 0x24, 0x03, 0x20, 0x22, 0xf0, 0xdc, 0x50, 0x58, 0x14, 0x53, 0xb8, 0x5d, 0x93, + 0xb0, 0x47, 0xb6, 0x3d, 0x44, 0x6c, 0x58, 0x45, 0xcb, 0x48, 0x44, 0x5d, 0xdb, 0x96, 0x68, 0x8f, + }, + Ztld: "000G051WYJWJ80S04BRDRM2R2H9VGQCKP13VCFA4DHC4BJT88HEXQ5K8HW", + Label: "天下無敵", + Q: []byte{ + 0xba, 0xf8, 0x21, 0x77, 0xee, 0xc0, 0x81, 0xe0, 0x74, 0xa7, 0xda, 0x47, 0xff, 0xc6, 0x48, 0x77, + 0x58, 0xfb, 0x0d, 0xf0, 0x1a, 0x6c, 0x7f, 0xbb, 0x52, 0xfc, 0x8a, 0x31, 0xbe, 0xf0, 0x29, 0xaf, + 0x74, 0xaa, 0x0d, 0xc1, 0x5a, 0xb8, 0xe2, 0xfa, 0x7a, 0x54, 0xb4, 0xf5, 0xf6, 0x37, 0xf6, 0x15, + 0x8f, 0xa7, 0xf0, 0x3c, 0x3f, 0xce, 0xbe, 0x78, 0xd3, 0xf9, 0xd6, 0x40, 0xaa, 0xc0, 0xd1, 0xed, + }, + Recs: []*Rec{ + { + Expire: []byte{0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80}, + Size: []byte{0x00, 0x10}, + Type: []byte{0x00, 0x00, 0x00, 0x1c}, + Flags: []byte{0x00, 0x00}, + Data: []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xad, 0xbe, 0xef}, + }, + { + Expire: []byte{0x00, 0xb0, 0x0f, 0x81, 0xb7, 0x44, 0x9b, 0x40}, + Size: []byte{0x00, 0x06}, + Type: []byte{0x00, 0x01, 0x00, 0x01}, + Flags: []byte{0x80, 0x00}, + Data: []byte{0xe6, 0x84, 0x9b, 0xe7, 0xa7, 0xb0}, + }, + { + Expire: []byte{0x00, 0x98, 0xd7, 0xff, 0x80, 0x4a, 0x39, 0x40}, + Size: []byte{0x00, 0x0b}, + Type: []byte{0x00, 0x00, 0x00, 0x10}, + Flags: []byte{0x00, 0x04}, + Data: []byte{0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64}, + }, + }, + Rdata: []byte{ + 0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xad, 0xbe, 0xef, + 0x00, 0xb0, 0x0f, 0x81, 0xb7, 0x44, 0x9b, 0x40, 0x00, 0x06, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, + 0xe6, 0x84, 0x9b, 0xe7, 0xa7, 0xb0, 0x00, 0x98, 0xd7, 0xff, 0x80, 0x4a, 0x39, 0x40, 0x00, 0x0b, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + Enc: &Enc{ + Nonce: []byte{ + 0xbb, 0x0d, 0x3f, 0x0f, 0xbd, 0x22, 0x42, 0x77, + 0x50, 0xda, 0x5d, 0x69, 0x12, 0x16, 0xe6, 0xc9, + }, + Expire: []byte{0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80}, + Key: []byte{ + 0x3d, 0xf8, 0x05, 0xbd, 0x66, 0x87, 0xaa, 0x14, 0x20, 0x96, 0x28, 0xc2, 0x44, 0xb1, 0x11, 0x91, + 0x88, 0xc3, 0x92, 0x56, 0x37, 0xa4, 0x1e, 0x5d, 0x76, 0x49, 0x6c, 0x29, 0x45, 0xdc, 0x37, 0x7b, + }, + }, + Bdata: []byte{ + 0x70, 0x2a, 0x19, 0x6f, 0x58, 0x2b, 0x72, 0x94, 0x77, 0x71, 0x98, 0xd0, 0xa8, 0xab, 0x30, 0x09, + 0xef, 0xca, 0xb8, 0x15, 0xbe, 0x77, 0xa7, 0x5c, 0x68, 0xc8, 0x00, 0xaa, 0x9f, 0xc2, 0x58, 0x8a, + 0xe9, 0xd7, 0xc7, 0x14, 0x56, 0x54, 0xc4, 0x41, 0xeb, 0x2e, 0x31, 0x88, 0xdb, 0x3d, 0xce, 0xcd, + 0xf3, 0x33, 0x33, 0x25, 0x64, 0xb6, 0xdd, 0xd3, 0xf0, 0x37, 0xa6, 0x78, 0xdd, 0xb7, 0x42, 0x27, + 0x79, 0xaa, 0x89, 0x09, 0xd7, 0x59, 0x29, 0x97, 0x02, 0x1e, 0x5f, 0x7a, 0x43, 0xfa, 0x9c, 0xbc, + 0x73, 0xe4, 0x17, 0x86, 0x5b, 0xec, 0xae, 0x97, 0xdf, 0xc5, 0x26, 0x0f, 0xcc, 0xf5, 0x3c, 0xae, + 0x3f, 0xb1, 0x9b, 0xf1, 0x18, 0x93, 0x17, 0xde, 0x2f, 0xd9, 0xe0, 0x1a, 0x73, 0xea, 0x8e, 0x48, + 0x99, 0xb4, 0x54, 0xd6, 0x73, 0x4c, 0x92, 0xb7, 0x42, 0x5a, 0x8b, 0x87, 0x16, 0x1f, 0xd7, 0x38, + 0x21, 0xc9, 0x58, 0x38, 0x41, 0x86, 0x1d, 0x4d, 0x5a, 0xe8, 0x02, 0xc4, 0x14, 0x14, 0xba, 0x04, + }, + RRblock: []byte{ + 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x14, 0x74, 0xf9, 0x00, 0x68, 0xf1, 0x67, 0x69, 0x53, + 0x52, 0xa8, 0xa6, 0xc2, 0xeb, 0x98, 0x48, 0x98, 0xc5, 0x3a, 0xcc, 0xa0, 0x98, 0x04, 0x70, 0xc6, + 0xc8, 0x12, 0x64, 0xcb, 0xdd, 0x78, 0xad, 0x11, 0x84, 0x61, 0x91, 0x1b, 0x40, 0x65, 0xc1, 0x08, + 0xc6, 0x5d, 0x75, 0x0a, 0x60, 0xd4, 0x32, 0xa3, 0x13, 0x38, 0xb2, 0x02, 0x6c, 0x35, 0x8c, 0x2d, + 0x62, 0x15, 0xe4, 0xa9, 0x0d, 0x48, 0xf1, 0x8c, 0xf2, 0xcf, 0xb1, 0x8d, 0x3d, 0x11, 0x10, 0x41, + 0xcc, 0x0e, 0xee, 0x64, 0x9c, 0xd9, 0x08, 0xb8, 0x28, 0x0e, 0x44, 0x39, 0x3f, 0x4e, 0xbd, 0x98, + 0x7a, 0xd0, 0x2a, 0xb8, 0x4a, 0x8c, 0x61, 0x06, 0x00, 0x08, 0xc0, 0x6f, 0xb9, 0x28, 0x15, 0x80, + 0x70, 0x2a, 0x19, 0x6f, 0x58, 0x2b, 0x72, 0x94, 0x77, 0x71, 0x98, 0xd0, 0xa8, 0xab, 0x30, 0x09, + 0xef, 0xca, 0xb8, 0x15, 0xbe, 0x77, 0xa7, 0x5c, 0x68, 0xc8, 0x00, 0xaa, 0x9f, 0xc2, 0x58, 0x8a, + 0xe9, 0xd7, 0xc7, 0x14, 0x56, 0x54, 0xc4, 0x41, 0xeb, 0x2e, 0x31, 0x88, 0xdb, 0x3d, 0xce, 0xcd, + 0xf3, 0x33, 0x33, 0x25, 0x64, 0xb6, 0xdd, 0xd3, 0xf0, 0x37, 0xa6, 0x78, 0xdd, 0xb7, 0x42, 0x27, + 0x79, 0xaa, 0x89, 0x09, 0xd7, 0x59, 0x29, 0x97, 0x02, 0x1e, 0x5f, 0x7a, 0x43, 0xfa, 0x9c, 0xbc, + 0x73, 0xe4, 0x17, 0x86, 0x5b, 0xec, 0xae, 0x97, 0xdf, 0xc5, 0x26, 0x0f, 0xcc, 0xf5, 0x3c, 0xae, + 0x3f, 0xb1, 0x9b, 0xf1, 0x18, 0x93, 0x17, 0xde, 0x2f, 0xd9, 0xe0, 0x1a, 0x73, 0xea, 0x8e, 0x48, + 0x99, 0xb4, 0x54, 0xd6, 0x73, 0x4c, 0x92, 0xb7, 0x42, 0x5a, 0x8b, 0x87, 0x16, 0x1f, 0xd7, 0x38, + 0x21, 0xc9, 0x58, 0x38, 0x41, 0x86, 0x1d, 0x4d, 0x5a, 0xe8, 0x02, 0xc4, 0x14, 0x14, 0xba, 0x04, + }, + }, +} diff --git a/src/gnunet/service/gns/rfc_test.go b/src/gnunet/service/gns/rfc_test.go @@ -0,0 +1,317 @@ +// This file is part of gnunet-go, a GNUnet-implementation in Golang. +// Copyright (C) 2019-2023 Bernd Fix >Y< +// +// gnunet-go is free software: you can redistribute it and/or modify it +// under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// gnunet-go is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// SPDX-License-Identifier: AGPL3.0-or-later + +package gns + +import ( + "bytes" + "encoding/binary" + "encoding/hex" + "fmt" + "gnunet/crypto" + "gnunet/enums" + "gnunet/service/dht/blocks" + "gnunet/util" + "strings" + "testing" +) + +func TestRFCDump(t *testing.T) { + for _, tc := range tests { + var ztype enums.GNSType + rdInt(tc.Zid, &ztype) + + endian := "" + if ztype == enums.GNS_TYPE_PKEY { + endian = ", big-endian" + } + fmt.Printf("Zone private key (d%s):\n", endian) + dumpHex(" ", tc.Zpk) + + fmt.Println("\n\nZone identifier {") + dumpHex(" ZTYPE: ", tc.Zid[:4]) + dumpType(tc.Zid[:4]) + fmt.Println() + dumpHex(" ZKEY: ", tc.Zid[4:]) + fmt.Println("\n} --> zTLD:") + fmt.Printf(" \"%s\"\n", util.EncodeBinaryToString(tc.Zid)) + + fmt.Println("\nLabel:") + dumpHex(" ", []byte(tc.Label)) + fmt.Println() + dumpTxt(" ", tc.Label) + + fmt.Println("\n\nStorage key (q):") + dumpHex(" ", tc.Q) + fmt.Println() + + for i, rr := range tc.Recs { + fmt.Printf("\nRecord #%d {\n", i+1) + + dumpHex(" Expire: ", rr.Expire) + dumpTime(rr.Expire) + fmt.Println() + + dumpHex(" Size: ", rr.Size) + dumpSize(rr.Size) + fmt.Println() + + dumpHex(" Flags: ", rr.Flags) + dumpFlags(rr.Flags) + fmt.Println() + + dumpHex(" Type: ", rr.Type) + dumpType(rr.Type) + fmt.Println() + + dumpHex(" Data: ", rr.Data) + fmt.Println() + } + + fmt.Println("}\n\nRDATA:") + dumpHex(" ", tc.Rdata) + + fmt.Println("\n\nEncryption spec {") + dumpHex(" Nonce: ", tc.Enc.Nonce) + fmt.Println() + dumpHex(" Expire: ", tc.Enc.Expire) + dumpTime(tc.Enc.Expire) + fmt.Println() + dumpHex(" Key (k): ", tc.Enc.Key) + fmt.Println("\n}\nBDATA:") + dumpHex(" ", tc.Bdata) + fmt.Println("\n\nRRBLOCK:") + dumpHex(" ", tc.RRblock) + fmt.Printf("\n\n----------------\n\n\n") + } +} + +func TestRecordsRFC(t *testing.T) { + for n, tc := range tests { + fmt.Printf("Testcase #%d:\n", n+1) + + // Zonekey type + var ztype enums.GNSType + rdInt(tc.Zid, &ztype) + fmt.Printf(" ztype = %08x (%d)\n", uint32(ztype), ztype) + + // generate private zone key + zprv, err := crypto.NewZonePrivate(ztype, tc.Zpk) + if err != nil { + t.Log("Failed: " + err.Error()) + t.Fail() + continue + } + fmt.Printf(" zprv = %s\n", hex.EncodeToString(zprv.Bytes())) + + // generate zone key (public) + zkey := zprv.Public() + zkb := zkey.Bytes() + fmt.Printf(" zkey = %s\n", hex.EncodeToString(zkb)) + if !bytes.Equal(zkb, tc.Zid) { + fmt.Printf(" != %s\n", hex.EncodeToString(tc.Zid)) + t.Fail() + continue + } + + // check zone identifier + if util.EncodeBinaryToString(tc.Zid) != tc.Ztld { + t.Log("Failed: zTLD mismatch") + t.Fail() + continue + } + + // derive zone key for given label and compute storage key 'q' + pd, _, err := zkey.Derive(tc.Label, blocks.GNSContext) + if err != nil { + t.Log("Failed: " + err.Error()) + t.Fail() + continue + } + pdb := pd.KeyData // pd.Bytes() + q := crypto.Hash(pdb).Data + fmt.Printf(" Q = %s\n", hex.EncodeToString(q)) + if !bytes.Equal(q, tc.Q) { + fmt.Printf(" != %s\n", hex.EncodeToString(tc.Q)) + fmt.Printf(" pd = %s\n", hex.EncodeToString(pdb)) + t.Log("Failed: storage key mismatch") + t.Fail() + } + + // assemble record set and extract RDATA + rs := &blocks.RecordSet{ + Count: uint32(len(tc.Recs)), + Records: make([]*blocks.ResourceRecord, len(tc.Recs)), + } + for i, rr := range tc.Recs { + var ts uint64 + rdInt(rr.Expire, &ts) + var size uint16 + rdInt(rr.Size, &size) + var flags enums.GNSFlag + rdInt(rr.Flags, &flags) + var typ enums.GNSType + rdInt(rr.Type, &typ) + rs.Records[i] = &blocks.ResourceRecord{ + Expire: util.AbsoluteTime{ + Val: uint64(ts), + }, + Size: size, + RType: typ, + Flags: flags, + Data: rr.Data, + } + } + rs.SetPadding() + rdata := rs.RDATA() + if !bytes.Equal(rdata, tc.Rdata) { + fmt.Printf(" rdata = %s\n", hex.EncodeToString(rdata)) + fmt.Printf(" != %s\n", hex.EncodeToString(tc.Rdata)) + t.Log("RDATA mismatch") + t.Fail() + continue + } + + // encrypt RDATA into BDATA + var ts uint64 + rdInt(tc.Enc.Expire, &ts) + expires := util.AbsoluteTime{ + Val: ts, + } + skey, nLen := zkey.BlockKey(tc.Label, expires) + if !bytes.Equal(skey[:32], tc.Enc.Key) { + fmt.Printf("key = %s\n", hex.EncodeToString(skey[:32])) + fmt.Printf("KEY = %s\n", hex.EncodeToString(tc.Enc.Key)) + t.Log("NONCE mismatch") + t.Fail() + continue + } + if !bytes.Equal(skey[32:32+nLen], tc.Enc.Nonce) { + fmt.Printf("nonce = %s\n", hex.EncodeToString(skey[32:32+nLen])) + fmt.Printf("NONCE = %s\n", hex.EncodeToString(tc.Enc.Nonce)) + t.Log("NONCE mismatch") + t.Fail() + continue + } + bdata, err := zkey.Encrypt(rdata, tc.Label, expires) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(bdata, tc.Bdata) { + fmt.Printf("bdata = %s\n", hex.EncodeToString(bdata)) + fmt.Printf("BDATA = %s\n", hex.EncodeToString(tc.Bdata)) + t.Log("BDATA mismatch") + t.Fail() + + rdata, err := zkey.Decrypt(tc.Bdata, tc.Label, expires) + if err != nil { + t.Fatal(err) + } + fmt.Println("RDATA = " + hex.EncodeToString(rdata)) + if bytes.Equal(rdata, tc.Rdata) { + fmt.Println("Oops...") + } + continue + } + + // assemble RRBLOCK (from GNSBlock) + blk := blocks.NewGNSBlock().(*blocks.GNSBlock) + blk.Prepare(enums.BLOCK_TYPE_GNS_NAMERECORD, expires) + blk.SetData(bdata) + dsk, _, _ := zprv.Derive(tc.Label, "gns") + blk.Sign(dsk) + rrblock := blk.RRBLOCK() + if !bytes.Equal(rrblock, tc.RRblock) { + fmt.Printf("rrblock = %s\n", hex.EncodeToString(rrblock)) + fmt.Printf("RRBLOCK = %s\n", hex.EncodeToString(tc.RRblock)) + t.Log("RRblock mismatch") + + // PKEY/ECDSA signatures are currently not identical with + // GNUnet produced signature, so ignore any failures. + if ztype != enums.GNS_TYPE_PKEY { + t.Fail() + } + continue + } + fmt.Println(" ----- passed -----") + } +} + +func rdInt(data []byte, v any) { + _ = binary.Read(bytes.NewReader(data), binary.BigEndian, v) +} + +func dumpTime(s []byte) { + var ts uint64 + rdInt(s, &ts) + t := util.AbsoluteTime{ + Val: ts, + } + fmt.Printf(" // %s", t.String()) +} + +func dumpSize(s []byte) { + var n uint16 + rdInt(s, &n) + fmt.Printf(" // %d bytes", n) +} + +func dumpFlags(s []byte) { + var f enums.GNSFlag + rdInt(s, &f) + fmt.Printf(" // %s", strings.Join(f.List(), "|")) +} + +func dumpType(s []byte) { + var t enums.GNSType + rdInt(s, &t) + fmt.Printf(" // %s", t.String()) +} + +func dumpHex(prefix string, data []byte) { + dumpBlk := func(b []byte) { + for i := 0; i < len(b); i++ { + if i > 0 { + fmt.Printf(" ") + } + fmt.Printf("%02x", b[i]) + } + } + p2 := " "[:len(prefix)] + fmt.Printf("%s", prefix) + for len(data) > 0 { + p := data + if len(data) > 16 { + p = data[:16] + } + dumpBlk(p) + data = data[len(p):] + if len(data) > 0 { + fmt.Printf("\n%s", p2) + } + } +} + +func dumpTxt(prefix string, txt string) { + fmt.Printf("%s", prefix) + for _, r := range txt { + fmt.Printf("%c", r) + i := len([]byte(string(r))) + fmt.Printf(" "[:3*i-1]) + } +} diff --git a/src/gnunet/service/revocation/pow_test.go b/src/gnunet/service/revocation/pow_test.go @@ -13,46 +13,47 @@ import ( // Test revocation with test vector defined in the RFC draft. func TestRevocationRFC(t *testing.T) { var ( - D = "70ed98b9078c47f7d5783b26ccf98b7dd55f6088d1539597fa8bf55ac032ea6f" + D = "6fea32c05af58bfa979553d188605fd57d8bf9cc263b78d5f7478c07b998ed70" ZKEY = "000100002ca223e879ecc4bbdeb5da17319281d63b2e3b6955f1c3775c804a98d5f8ddaa" PROOF = "" + - "0005d66da3598127" + + "0005feb46d865c1c" + "0000395d1827c000" + - "3ab877d07570f2b8" + - "3ab877d07570f332" + - "3ab877d07570f4f5" + - "3ab877d07570f50f" + - "3ab877d07570f537" + - "3ab877d07570f599" + - "3ab877d07570f5cd" + - "3ab877d07570f5d9" + - "3ab877d07570f66a" + - "3ab877d07570f69b" + - "3ab877d07570f72f" + - "3ab877d07570f7c3" + - "3ab877d07570f843" + - "3ab877d07570f8d8" + - "3ab877d07570f91b" + - "3ab877d07570f93a" + - "3ab877d07570f944" + - "3ab877d07570f98a" + - "3ab877d07570f9a7" + - "3ab877d07570f9b0" + - "3ab877d07570f9df" + - "3ab877d07570fa05" + - "3ab877d07570fa3e" + - "3ab877d07570fa63" + - "3ab877d07570fa84" + - "3ab877d07570fa8f" + - "3ab877d07570fa91" + - "3ab877d07570fad6" + - "3ab877d07570fb0a" + - "3ab877d07570fc0f" + - "3ab877d07570fc43" + - "3ab877d07570fca5" + + "e66a570bccd4b393" + + "e66a570bccd4b3ea" + + "e66a570bccd4b536" + + "e66a570bccd4b542" + + "e66a570bccd4b613" + + "e66a570bccd4b65f" + + "e66a570bccd4b672" + + "e66a570bccd4b70a" + + "e66a570bccd4b71a" + + "e66a570bccd4b723" + + "e66a570bccd4b747" + + "e66a570bccd4b777" + + "e66a570bccd4b785" + + "e66a570bccd4b789" + + "e66a570bccd4b7cf" + + "e66a570bccd4b7dc" + + "e66a570bccd4b93a" + + "e66a570bccd4b956" + + "e66a570bccd4ba4a" + + "e66a570bccd4ba9d" + + "e66a570bccd4bb28" + + "e66a570bccd4bb5a" + + "e66a570bccd4bb92" + + "e66a570bccd4bba2" + + "e66a570bccd4bbd8" + + "e66a570bccd4bbe2" + + "e66a570bccd4bc93" + + "e66a570bccd4bc94" + + "e66a570bccd4bd0f" + + "e66a570bccd4bdce" + + "e66a570bccd4be6a" + + "e66a570bccd4be73" + "00010000" + "2ca223e879ecc4bbdeb5da17319281d63b2e3b6955f1c3775c804a98d5f8ddaa" + - "053b0259700039187d1da4613531502bc4a4eeccc69900d24f8aac5430f28fc5092701331f178e290fe06e82ce2498ce7b23a34058e3d6a2f247e92bc9d7b9ab" + "044a878a158b40f0c841d9f978cb1372eaee5199a3d87e5e2bdbc72a6c8c73d0" + + "00181dfc39c3aaa481667b165b5844e450713d8ab6a3b2ba8fef447b65076a0f" ) // construct private/public key pair from test data diff --git a/src/gnunet/service/zonemaster/zonemaster.go b/src/gnunet/service/zonemaster/zonemaster.go @@ -22,6 +22,7 @@ import ( "context" "gnunet/config" "gnunet/core" + "gnunet/crypto" "gnunet/enums" "gnunet/service/dht/blocks" "gnunet/service/store" @@ -295,8 +296,8 @@ func (zm *ZoneMaster) PublishZoneLabel(ctx context.Context, zone *store.Zone, la if err != nil { return err } - dzk, _, err := zone.Key.Derive(label.Name, "gns") - if err != nil { + var dzk *crypto.ZonePrivate + if dzk, _, err = zone.Key.Derive(label.Name, "gns"); err != nil { return err } if err = blkDHT.Sign(dzk); err != nil { @@ -323,9 +324,6 @@ func (zm *ZoneMaster) PublishZoneLabel(ctx context.Context, zone *store.Zone, la blkNC.Body.Expire = expire blkNC.Body.Data = rrSet.RDATA() // sign block - if dzk, _, err = zone.Key.Derive(label.Name, "gns"); err != nil { - return err - } if err = blkNC.Sign(dzk); err != nil { return err } diff --git a/src/gnunet/util/base32_test.go b/src/gnunet/util/base32_test.go @@ -102,3 +102,32 @@ func TestBase32Random(t *testing.T) { } } } + +func TestBase32RFC(t *testing.T) { + var ( + i1 = []byte{0x59, 0x40, 0xB3, 0x2D, 0xB8, 0x86, 0x61, 0xC2} + o1 = "B50B6BDRGSGW4" + i2 = []byte("Hello World") + o2 = "91JPRV3F41BPYWKCCG" + o3 = "91JPRU3F4IBPYWKCCG" + o4 = "91JPR+3F4!BPYWKCCG" + ) + if EncodeBinaryToString(i1) != o1 { + t.Fatal("RFC-1") + } + if i, err := DecodeStringToBinary(o1, 8); err != nil || !bytes.Equal(i, i1) { + t.Fatal("RFC-2") + } + if EncodeBinaryToString(i2) != o2 { + t.Fatal("RFC-3") + } + if i, err := DecodeStringToBinary(o2, 11); err != nil || !bytes.Equal(i, i2) { + t.Fatal("RFC-3") + } + if i, err := DecodeStringToBinary(o3, 11); err != nil || !bytes.Equal(i, i2) { + t.Fatal("RFC-4") + } + if _, err := DecodeStringToBinary(o4, 11); err == nil { + t.Fatal("RFC-5") + } +}