mirror of
https://github.com/go-i2p/go-i2p.git
synced 2025-07-05 06:05:16 -04:00
some lease set work
This commit is contained in:
@ -1,78 +1,82 @@
|
|||||||
package common
|
package common
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"github.com/bounce-chat/go-i2p/lib/crypto"
|
"github.com/bounce-chat/go-i2p/lib/crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
type LeaseSet []byte
|
type LeaseSet []byte
|
||||||
|
|
||||||
func (lease_set LeaseSet) Destination() Destination {
|
func (lease_set LeaseSet) Destination() (destination Destination, err error) {
|
||||||
return Destination(lease_set[:387]) // read a keys and cert, cast to destination
|
keys_and_cert, _, err := ReadKeysAndCert(lease_set)
|
||||||
}
|
destination = Destination(keys_and_cert)
|
||||||
|
|
||||||
func (lease_set LeaseSet) EncryptionKey() (k crypto.ElgPublicKey) {
|
|
||||||
copy(lease_set[387:387+256], k[:])
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lease_set LeaseSet) SigningKey() (k []byte) {
|
func (lease_set LeaseSet) PublicKey() (public_key crypto.ElgPublicKey, err error) {
|
||||||
size := lease_set.signingKeySize()
|
_, remainder, err := ReadKeysAndCert(lease_set)
|
||||||
head := 387 + 256
|
if len(remainder) < 256 {
|
||||||
copy(lease_set[head:head+size], k)
|
err = errors.New("error parsing public key: not enough data")
|
||||||
|
copy(public_key[:], remainder)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
copy(public_key[:], remainder[:256])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lease_set LeaseSet) LeaseCount() int {
|
func (lease_set LeaseSet) SigningKey() (signing_public_key crypto.SigningPublicKey, err error) {
|
||||||
head := 387 + 256 + lease_set.signingKeySize()
|
// check if the destination has a cert, if its a key cert, etc
|
||||||
return Integer([]byte{lease_set[head+1]})
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (lease_set LeaseSet) LeaseCount() (count int, err error) {
|
||||||
|
_, remainder, err := ReadKeysAndCert(lease_set)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(remainder) < 256+128+1 {
|
||||||
|
err = errors.New("error parsing lease count: not enough data")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
count = Integer([]byte{remainder[256+128]})
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lease_set LeaseSet) Leases() []Lease {
|
func (lease_set LeaseSet) Leases() []Lease {
|
||||||
leases := make([]Lease, 0)
|
leases := make([]Lease, 0)
|
||||||
offset := 387 + 256 + lease_set.signingKeySize() + 1
|
offset := 0
|
||||||
for i := 0; i < lease_set.LeaseCount(); i++ {
|
count, err := lease_set.LeaseCount()
|
||||||
|
if err != nil {
|
||||||
|
return leases
|
||||||
|
}
|
||||||
|
// read as many as possible, returning errors
|
||||||
|
for i := 0; i < count; i++ {
|
||||||
start := offset + (i * 44)
|
start := offset + (i * 44)
|
||||||
end := offset + (start + 44)
|
end := offset + (start + 44)
|
||||||
var lease Lease
|
var lease Lease
|
||||||
copy(lease_set[start:end], lease[:])
|
copy(lease[:], lease_set[start:end])
|
||||||
leases = append(leases, lease)
|
leases = append(leases, lease)
|
||||||
}
|
}
|
||||||
return leases
|
return leases
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lease_set LeaseSet) Signature() []byte {
|
func (lease_set LeaseSet) Signature() (signature Signature, err error) {
|
||||||
data_end := 387 +
|
return
|
||||||
256 +
|
|
||||||
lease_set.signingKeySize() +
|
|
||||||
1 +
|
|
||||||
(44 * lease_set.LeaseCount())
|
|
||||||
//sig_cert, _ := lease_set.
|
|
||||||
// Destination().
|
|
||||||
// Certificate()
|
|
||||||
//sig_size, _ := sig_cert.SignatureSize()
|
|
||||||
return lease_set[data_end : data_end+128] //sig_size]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lease_set LeaseSet) Verify() error {
|
func (lease_set LeaseSet) Verify() error {
|
||||||
data_end := 387 +
|
//data_end := 387 +
|
||||||
256 +
|
// 256 +
|
||||||
lease_set.signingKeySize() +
|
// lease_set.signingKeySize() +
|
||||||
1 +
|
// 1 +
|
||||||
(44 * lease_set.LeaseCount())
|
// (44 * lease_set.LeaseCount())
|
||||||
data := lease_set[:data_end]
|
//data := lease_set[:data_end]
|
||||||
spk, _ := lease_set.
|
//spk, _ := lease_set.
|
||||||
Destination().
|
// Destination().
|
||||||
SigningPublicKey()
|
// SigningPublicKey()
|
||||||
verifier, err := spk.NewVerifier()
|
//verifier, err := spk.NewVerifier()
|
||||||
if err != nil {
|
//if err != nil {
|
||||||
return err
|
// return err
|
||||||
}
|
//}
|
||||||
return verifier.Verify(data, lease_set.Signature())
|
return nil // verifier.Verify(data, lease_set.Signature())
|
||||||
}
|
|
||||||
|
|
||||||
func (lease_set LeaseSet) signingKeySize() int {
|
|
||||||
spk, _ := lease_set.
|
|
||||||
Destination().
|
|
||||||
SigningPublicKey()
|
|
||||||
return spk.Len()
|
|
||||||
}
|
}
|
||||||
|
@ -90,10 +90,10 @@ func (router_info RouterInfo) Options() Mapping {
|
|||||||
//
|
//
|
||||||
// Return the 40 bytes that follow the Mapping in the RouterInfo.
|
// Return the 40 bytes that follow the Mapping in the RouterInfo.
|
||||||
//
|
//
|
||||||
func (router_info RouterInfo) Signature() []byte {
|
func (router_info RouterInfo) Signature() Signature {
|
||||||
head := router_info.optionsLocation()
|
head := router_info.optionsLocation()
|
||||||
size := head + router_info.optionsSize()
|
size := head + router_info.optionsSize()
|
||||||
return router_info[head+size : head+size+40]
|
return Signature(router_info[head+size : head+size+40])
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
3
lib/common/signature.go
Normal file
3
lib/common/signature.go
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
type Signature []byte
|
1
lib/common/signature_test.go
Normal file
1
lib/common/signature_test.go
Normal file
@ -0,0 +1 @@
|
|||||||
|
package common
|
Reference in New Issue
Block a user