gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet-go] branch master updated: RFC test vectors: adjusted code and t


From: gnunet
Subject: [gnunet-go] branch master updated: RFC test vectors: adjusted code and test cases with latest version.
Date: Thu, 29 Jun 2023 21:02:12 +0200

This is an automated email from the git hooks/post-receive script.

bernd-fix pushed a commit to branch master
in repository gnunet-go.

The following commit(s) were added to refs/heads/master by this push:
     new 4a543f3  RFC test vectors: adjusted code and test cases with latest 
version.
4a543f3 is described below

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

    RFC test vectors: adjusted code and test cases with latest version.
---
 src/gnunet/crypto/gns.go                    |   4 +-
 src/gnunet/crypto/gns_edkey.go              |  11 +-
 src/gnunet/crypto/gns_pkey.go               |  19 +-
 src/gnunet/crypto/gns_test.go               |  12 +-
 src/gnunet/service/dht/blocks/gns.go        |  26 +-
 src/gnunet/service/dht/blocks/gns_test.go   |  78 +++---
 src/gnunet/service/gns/rfc-data_test.go     | 363 ++++++++++++++++++++++++++++
 src/gnunet/service/gns/rfc_test.go          | 317 ++++++++++++++++++++++++
 src/gnunet/service/revocation/pow_test.go   |  71 +++---
 src/gnunet/service/zonemaster/zonemaster.go |   8 +-
 src/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
index 6021d98..fe12b09 100644
--- 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
index 0054ca5..b7e88b3 100644
--- 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
index d2c08ba..f1bb110 100644
--- 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
index f910dcf..e5e483b 100644
--- 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
index e08488c..83373de 100644
--- 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
index bc1703b..6e6c09a 100644
--- 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
new file mode 100644
index 0000000..bb876e1
--- /dev/null
+++ 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
new file mode 100644
index 0000000..e42d5ad
--- /dev/null
+++ 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
index a3bd5e6..1c8d3b9 100644
--- 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
index 01204d4..ae6f1b8 100644
--- 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
index 32ea2de..3ae7314 100644
--- 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")
+       }
+}

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]