Files
Go_I2p/lib/common/lease.go

109 lines
2.5 KiB
Go
Raw Normal View History

package common
2021-05-18 09:06:24 -04:00
import (
"errors"
log "github.com/sirupsen/logrus"
)
2016-02-14 23:10:37 -08:00
/*
I2P Lease
2016-06-16 23:17:21 -07:00
https://geti2p.net/spec/common-structures#lease
2016-02-14 23:10:37 -08:00
Accurate for version 0.9.24
+----+----+----+----+----+----+----+----+
| tunnel_gw |
+ +
| |
+ +
| |
+ +
| |
+----+----+----+----+----+----+----+----+
| tunnel_id | end_date
+----+----+----+----+----+----+----+----+
|
+----+----+----+----+
tunnel_gw :: Hash of the RouterIdentity of the tunnel gateway
length -> 32 bytes
tunnel_id :: TunnelId
length -> 4 bytes
end_date :: Date
length -> 8 bytes
*/
// Sizes or various components of a Lease
2016-02-14 23:10:37 -08:00
const (
2021-04-22 23:47:15 -04:00
LEASE_SIZE = 44
LEASE_HASH_SIZE = 32
LEASE_TUNNEL_ID_SIZE = 4
LEASE_TUNNEL_DATE_SIZE = 8
2016-02-14 23:10:37 -08:00
)
type LeaseInterface interface {
TunnelGateway() (hash Hash)
TunnelID() uint32
Date() (date Date)
}
2021-04-22 23:47:15 -04:00
type Lease struct {
2021-04-24 18:36:57 -04:00
LeaseHash Hash
2021-07-27 11:42:46 -04:00
TunnelIdent *Integer
2021-04-24 18:36:57 -04:00
TunnelDate Date
} //[LEASE_SIZE]byte
var li LeaseInterface = &Lease{}
2016-02-14 23:10:37 -08:00
//
// Return the first 32 bytes of the Lease as a Hash.
//
func (lease Lease) TunnelGateway() (hash Hash) {
copy(hash[:], lease.LeaseHash[:])
return
}
2016-02-14 23:10:37 -08:00
//
// Return the TunnelID Integer in the Lease.
2016-02-14 23:10:37 -08:00
//
func (lease Lease) TunnelID() uint32 {
return uint32(lease.TunnelIdent.Value())
}
2016-02-14 23:10:37 -08:00
//
// Return the Date inside the Lease.
//
func (lease Lease) Date() (date Date) {
copy(date[:], lease.TunnelDate[:])
return
}
//
// Possibly temporary? Just to make it compile for now
//
func (lease Lease) Bytes() (bytes []byte) {
var r []byte
r = append(r, lease.LeaseHash[:]...)
r = append(r, lease.TunnelIdent.Bytes()...)
r = append(r, lease.TunnelDate[:]...)
return r
}
2021-05-18 09:06:24 -04:00
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, err = NewInteger(identbytes[:])
2021-05-18 09:06:24 -04:00
lease.TunnelDate, remainder, err = ReadDate(remainder)
return
}