More LeaseSet building fixes
This commit is contained in:
@ -8,10 +8,14 @@ Accurate for version 0.9.24
|
||||
|
||||
import (
|
||||
"time"
|
||||
"errors"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type Date [8]byte
|
||||
|
||||
const DATE_SIZE = 8
|
||||
|
||||
//
|
||||
// Time takes the value stored in date as an 8 byte big-endian integer representing the
|
||||
// number of milliseconds since the beginning of unix time and converts it to a Go time.Time
|
||||
@ -22,3 +26,20 @@ func (date Date) Time() (date_time time.Time) {
|
||||
date_time = time.Unix(0, int64(seconds*1000000))
|
||||
return
|
||||
}
|
||||
|
||||
func ReadDate(data []byte) (h Date, remainder []byte, err error) {
|
||||
if len(data) < DATE_SIZE {
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Date) ReadDate",
|
||||
"data_len": len(data),
|
||||
"required_len": "8",
|
||||
"reason": "date missing data",
|
||||
}).Error("date error")
|
||||
err = errors.New("error reading date, insufficient length")
|
||||
copy(h[:], data[0:len(data)-1])
|
||||
}else{
|
||||
copy(h[:], data[0:DATE_SIZE-1])
|
||||
copy(remainder, data[DATE_SIZE-1:])
|
||||
}
|
||||
return
|
||||
}
|
@ -2,9 +2,13 @@ package common
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"errors"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"io"
|
||||
)
|
||||
|
||||
const HASH_SIZE = 32
|
||||
|
||||
// sha256 hash of some data
|
||||
type Hash [32]byte
|
||||
|
||||
@ -25,3 +29,20 @@ func HashReader(r io.Reader) (h Hash, err error) {
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func ReadHash(data []byte) (h Hash, remainder []byte, err error) {
|
||||
if len(data) < HASH_SIZE {
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Hash) ReadHash",
|
||||
"data_len": len(data),
|
||||
"required_len": "32",
|
||||
"reason": "hash missing data",
|
||||
}).Error("hash error")
|
||||
err = errors.New("error reading hash, insufficient length")
|
||||
copy(h[:], data[0:len(data)-1])
|
||||
}else{
|
||||
copy(h[:], data[0:HASH_SIZE-1])
|
||||
copy(remainder, data[HASH_SIZE-1:])
|
||||
}
|
||||
return
|
||||
}
|
||||
|
33
lib/common/ident.go
Normal file
33
lib/common/ident.go
Normal file
@ -0,0 +1,33 @@
|
||||
package common
|
||||
|
||||
/*
|
||||
I2P Tunnel Identity Helpers
|
||||
https://geti2p.net/spec/common-structures#ident
|
||||
Accurate for version 0.9.24
|
||||
*/
|
||||
|
||||
import (
|
||||
"errors"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type Ident [4]byte
|
||||
|
||||
const IDENT_SIZE = 4
|
||||
|
||||
func ReadIdent(data []byte) (h Ident, remainder []byte, err error) {
|
||||
if len(data) < IDENT_SIZE {
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Ident) ReadIdent",
|
||||
"data_len": len(data),
|
||||
"required_len": "8",
|
||||
"reason": "ident missing data",
|
||||
}).Error("ident error")
|
||||
err = errors.New("error reading ident, insufficient length")
|
||||
copy(h[:], data[0:len(data)-1])
|
||||
}else{
|
||||
copy(h[:], data[0:IDENT_SIZE-1])
|
||||
copy(remainder, data[IDENT_SIZE-1:])
|
||||
}
|
||||
return
|
||||
}
|
@ -1,5 +1,10 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"errors"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
/*
|
||||
I2P Lease
|
||||
https://geti2p.net/spec/common-structures#lease
|
||||
@ -84,3 +89,20 @@ func (lease Lease) Bytes() (bytes []byte) {
|
||||
r = append(r, lease.TunnelDate[:]...)
|
||||
return r
|
||||
}
|
||||
|
||||
func ReadLease(data []byte) (lease Lease, remainder []byte, err error) {
|
||||
if len(data) < LEASE_SIZE {
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Lease) ReadLease",
|
||||
"data_len": len(data),
|
||||
"required_len": "44",
|
||||
"reason": "lease missing data",
|
||||
}).Error("error parsnig lease")
|
||||
err = errors.New("error parsing lease: lease missing data")
|
||||
}
|
||||
lease.LeaseHash, remainder, err = ReadHash(data)
|
||||
identbytes, remainder, err := ReadIdent(remainder)
|
||||
lease.TunnelIdent = Integer(identbytes[:])
|
||||
lease.TunnelDate, remainder, err = ReadDate(remainder)
|
||||
return
|
||||
}
|
||||
|
@ -97,10 +97,10 @@ type LeaseSetInterface interface {
|
||||
GetPublicKey() (public_key crypto.ElgPublicKey, err error)
|
||||
GetSigningKey() (signing_public_key crypto.SigningPublicKey, err error)
|
||||
Leases() (leases []Lease, err error)
|
||||
/* LeaseCount() (count int, err error)
|
||||
/* LeaseCount() (count int, err error)*/
|
||||
|
||||
Signature() (signature Signature, err error)
|
||||
Verify() error
|
||||
GetSignature() (signature Signature, err error)
|
||||
/* Verify() error
|
||||
NewestExpiration() (oldest Date, err error)
|
||||
OldestExpiration() (earliest Date, err error)*/
|
||||
}
|
||||
@ -187,45 +187,9 @@ func (lease_set LeaseSet) LeaseCount() (count int, err error) {
|
||||
// Return the Signature data for the LeaseSet, as specified in the Destination's
|
||||
// Key Certificate if present or the 40 bytes following the Leases.
|
||||
//
|
||||
/*func (lease_set LeaseSet) Signature() (signature Signature, err error) {
|
||||
destination, err := lease_set.Destination()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
lease_count, err := lease_set.LeaseCount()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
start := len(destination) +
|
||||
LEASE_SET_PUBKEY_SIZE +
|
||||
LEASE_SET_SPK_SIZE +
|
||||
1 +
|
||||
(LEASE_SIZE * lease_count)
|
||||
cert, err := destination.Certificate()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
cert_type, _ := cert.Type()
|
||||
var end int
|
||||
if cert_type == CERT_KEY {
|
||||
end = start + KeyCertificate(cert).SignatureSize()
|
||||
} else {
|
||||
end = start + LEASE_SET_SIG_SIZE
|
||||
}
|
||||
lease_set_len := len(lease_set)
|
||||
if lease_set_len < end {
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(LeaseSet) Signature",
|
||||
"data_len": lease_set_len,
|
||||
"required_len": end,
|
||||
"reason": "not enough data",
|
||||
}).Error("error parsing signatre")
|
||||
err = errors.New("error parsing signature: not enough data")
|
||||
return
|
||||
}
|
||||
signature = []byte(lease_set[start:end])
|
||||
func (lease_set LeaseSet) GetSignature() (signature Signature, err error) {
|
||||
return
|
||||
}*/
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
@ -247,7 +211,7 @@ func (lease_set LeaseSet) Verify() error {
|
||||
//}
|
||||
return nil // verifier.Verify(data, lease_set.Signature())
|
||||
}
|
||||
|
||||
*/
|
||||
//
|
||||
// Return the oldest date from all the Leases in the LeaseSet.
|
||||
//
|
||||
@ -282,14 +246,35 @@ func (lease_set LeaseSet) OldestExpiration() (earliest Date, err error) {
|
||||
}
|
||||
}
|
||||
return
|
||||
}*/
|
||||
}
|
||||
|
||||
func ReadLeaseCount(bytes []byte) (count int, err error) {
|
||||
_, remainder, err := ReadKeysAndCert(bytes)
|
||||
if err != nil {
|
||||
func ReadLeaseSetSignature(bytes []byte, cert CertificateInterface) (signature Signature, remainder []byte, err error) {
|
||||
start := 0
|
||||
cert_type, _ := cert.Type()
|
||||
var end int
|
||||
if cert_type == CERT_KEY {
|
||||
end = start + cert.SignatureSize()
|
||||
} else {
|
||||
end = start + LEASE_SET_SIG_SIZE
|
||||
}
|
||||
bytes_len := len(bytes)
|
||||
if bytes_len < end {
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(LeaseSet) Signature",
|
||||
"data_len": bytes_len,
|
||||
"required_len": end,
|
||||
"reason": "not enough data",
|
||||
}).Error("error parsing signatre")
|
||||
err = errors.New("error parsing signature: not enough data")
|
||||
signature = []byte(bytes[start:bytes_len])
|
||||
return
|
||||
}
|
||||
remainder_len := len(remainder)
|
||||
signature = []byte(bytes[start:end])
|
||||
return
|
||||
}
|
||||
|
||||
func ReadLeaseCount(bytes []byte) (count int, err error) {
|
||||
remainder_len := len(bytes)
|
||||
if remainder_len < LEASE_SET_PUBKEY_SIZE+LEASE_SET_SPK_SIZE+1 {
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(LeaseSet) LeaseCount",
|
||||
@ -300,7 +285,7 @@ func ReadLeaseCount(bytes []byte) (count int, err error) {
|
||||
err = errors.New("error parsing lease count: not enough data")
|
||||
return
|
||||
}
|
||||
count = Integer([]byte{remainder[LEASE_SET_PUBKEY_SIZE+LEASE_SET_SPK_SIZE]})
|
||||
count = Integer([]byte{bytes[LEASE_SET_PUBKEY_SIZE+LEASE_SET_SPK_SIZE]})
|
||||
if count > 16 {
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(LeaseSet) LeaseCount",
|
||||
@ -315,13 +300,13 @@ func ReadLeaseCount(bytes []byte) (count int, err error) {
|
||||
//
|
||||
// Read the Leases in this LeaseSet, returning a partial set if there is insufficient data.
|
||||
//
|
||||
func ReadLeases(bytes []byte, offset int) (leases []Lease, err error) {
|
||||
func ReadLeases(bytes []byte) (leases []Lease, remainder []byte, err error) {
|
||||
count, err := ReadLeaseCount(bytes)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for i := 0; i < count; i++ {
|
||||
start := offset + (i * LEASE_SIZE)
|
||||
start := 0 //offset + (i * LEASE_SIZE)
|
||||
end := start + LEASE_SIZE
|
||||
lease_set_len := len(bytes)
|
||||
if lease_set_len < end {
|
||||
@ -334,35 +319,32 @@ func ReadLeases(bytes []byte, offset int) (leases []Lease, err error) {
|
||||
err = errors.New("error parsing lease set: some leases missing")
|
||||
return
|
||||
}
|
||||
var lease Lease
|
||||
copy(lease.Bytes(), bytes[start:end])
|
||||
lease, remainder, err := ReadLease(bytes[start:end])
|
||||
leases = append(leases, lease)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func ReadLeaseSet(data []byte) (lease_set LeaseSet, remainder []byte, err error) {
|
||||
destination, remainder, err := ReadDestination(data)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
lease_set.Destination = destination
|
||||
offset := len(destination.Bytes()) + LEASE_SET_PUBKEY_SIZE + LEASE_SET_SPK_SIZE + 1
|
||||
leases, err := ReadLeases(data, offset)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
lease_set.LeaseList = leases
|
||||
spk, pk, remainder, err := ReadKeys(remainder, nil)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
lease_set.SigningPublicKey = spk
|
||||
switch pk.(type) {
|
||||
func ReadLeaseSetKeys(data []byte, cert CertificateInterface) (spk crypto.SigningPublicKey,pk crypto.ElgPublicKey, remainder []byte, err error){
|
||||
spk, ppk, remainder, err := ReadKeys(data, cert)
|
||||
switch ppk.(type) {
|
||||
case crypto.ElgPublicKey:
|
||||
lease_set.ElgPublicKey = pk.(crypto.ElgPublicKey)
|
||||
pk = ppk.(crypto.ElgPublicKey)
|
||||
default:
|
||||
err = errors.New("LeaseSet1 uses Elgamal public keys.")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func ReadLeaseSet(data []byte) (lease_set LeaseSet, remainder []byte, err error) {
|
||||
destination, remainder, err := ReadDestination(data)
|
||||
lease_set.Destination = destination
|
||||
//offset := len(destination.Bytes()) + LEASE_SET_PUBKEY_SIZE + LEASE_SET_SPK_SIZE + 1
|
||||
spk, pk, remainder, err := ReadLeaseSetKeys(remainder, nil)
|
||||
lease_set.SigningPublicKey = spk
|
||||
lease_set.ElgPublicKey = pk
|
||||
leases, remainder, err := ReadLeases(data)
|
||||
lease_set.LeaseList = leases
|
||||
|
||||
return
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ func TestLeasesHaveCorrectData(t *testing.T) {
|
||||
0,
|
||||
bytes.Compare(
|
||||
lease,
|
||||
leases[i][:],
|
||||
leases[i].Bytes()[:],
|
||||
),
|
||||
)
|
||||
}
|
||||
@ -168,7 +168,7 @@ func TestSignatureIsCorrect(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
lease_set := buildFullLeaseSet(1)
|
||||
sig, err := lease_set.Signature()
|
||||
sig, err := lease_set.GetSignature()
|
||||
if assert.Nil(err) {
|
||||
assert.Equal(
|
||||
0,
|
||||
|
Reference in New Issue
Block a user