[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.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnunet-go] branch master updated: RFC test vectors: adjusted code and test cases with latest version.,
gnunet <=