some lease set work

This commit is contained in:
Hayden Parker
2016-02-14 01:24:31 -08:00
parent f409aa79e8
commit a64fe87dbe
4 changed files with 58 additions and 50 deletions

View File

@ -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()
} }

View File

@ -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
View File

@ -0,0 +1,3 @@
package common
type Signature []byte

View File

@ -0,0 +1 @@
package common