2016-02-01 01:56:10 -08:00
|
|
|
package common
|
|
|
|
|
|
|
|
import (
|
2016-02-14 01:24:31 -08:00
|
|
|
"errors"
|
2016-02-01 01:56:10 -08:00
|
|
|
"github.com/bounce-chat/go-i2p/lib/crypto"
|
|
|
|
)
|
|
|
|
|
|
|
|
type LeaseSet []byte
|
|
|
|
|
2016-02-14 01:24:31 -08:00
|
|
|
func (lease_set LeaseSet) Destination() (destination Destination, err error) {
|
|
|
|
keys_and_cert, _, err := ReadKeysAndCert(lease_set)
|
|
|
|
destination = Destination(keys_and_cert)
|
|
|
|
return
|
2016-02-01 01:56:10 -08:00
|
|
|
}
|
|
|
|
|
2016-02-14 01:24:31 -08:00
|
|
|
func (lease_set LeaseSet) PublicKey() (public_key crypto.ElgPublicKey, err error) {
|
|
|
|
_, remainder, err := ReadKeysAndCert(lease_set)
|
|
|
|
if len(remainder) < 256 {
|
|
|
|
err = errors.New("error parsing public key: not enough data")
|
|
|
|
copy(public_key[:], remainder)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
copy(public_key[:], remainder[:256])
|
2016-02-01 01:56:10 -08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-02-14 01:24:31 -08:00
|
|
|
func (lease_set LeaseSet) SigningKey() (signing_public_key crypto.SigningPublicKey, err error) {
|
2016-02-14 22:28:20 -08:00
|
|
|
destination, err := lease_set.Destination()
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
offset := len(destination) + 256
|
|
|
|
cert, err := destination.Certificate()
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
cert_len, err := cert.Length()
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if len(lease_set) < offset+128 {
|
|
|
|
err = errors.New("")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if cert_len == 0 {
|
|
|
|
// No Certificate is present, return the 128 byte
|
|
|
|
// SigningPublicKey space as legacy DSA SHA1 SigningPublicKey.
|
|
|
|
var dsa_pk crypto.DSAPublicKey
|
|
|
|
copy(dsa_pk[:], lease_set[offset:offset+128])
|
|
|
|
signing_public_key = dsa_pk
|
|
|
|
} else {
|
|
|
|
// A Certificate is present in this LeaseSet's Destination
|
|
|
|
cert_type, _ := cert.Type()
|
|
|
|
if cert_type == CERT_KEY {
|
|
|
|
// This LeaseSet's Destination's Certificate is a Key Certificate,
|
|
|
|
// create the signing publickey key using any data that might be
|
|
|
|
// contained in the key certificate.
|
|
|
|
signing_public_key = KeyCertificate(cert).ConstructSigningPublicKey(lease_set[offset : offset+128])
|
|
|
|
} else {
|
|
|
|
// No Certificate is present, return the 128 byte
|
|
|
|
// SigningPublicKey space as legacy DSA SHA1 SigningPublicKey.
|
|
|
|
var dsa_pk crypto.DSAPublicKey
|
|
|
|
copy(dsa_pk[:], lease_set[offset:offset+128])
|
|
|
|
signing_public_key = dsa_pk
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2016-02-01 01:56:10 -08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-02-14 01:24:31 -08:00
|
|
|
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
|
2016-02-01 01:56:10 -08:00
|
|
|
}
|
|
|
|
|
2016-02-14 22:28:20 -08:00
|
|
|
func (lease_set LeaseSet) Leases() (leases []Lease, err error) {
|
|
|
|
destination, err := lease_set.Destination()
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
offset := len(destination) + 256 + 128 + 1
|
2016-02-14 01:24:31 -08:00
|
|
|
count, err := lease_set.LeaseCount()
|
|
|
|
if err != nil {
|
2016-02-14 22:28:20 -08:00
|
|
|
return
|
2016-02-14 01:24:31 -08:00
|
|
|
}
|
|
|
|
for i := 0; i < count; i++ {
|
2016-02-07 02:54:02 -08:00
|
|
|
start := offset + (i * 44)
|
2016-02-14 22:28:20 -08:00
|
|
|
end := start + 44
|
|
|
|
if len(lease_set) < end {
|
|
|
|
err = errors.New("")
|
|
|
|
return
|
|
|
|
}
|
2016-02-01 01:56:10 -08:00
|
|
|
var lease Lease
|
2016-02-14 01:24:31 -08:00
|
|
|
copy(lease[:], lease_set[start:end])
|
2016-02-01 01:56:10 -08:00
|
|
|
leases = append(leases, lease)
|
|
|
|
}
|
2016-02-14 22:28:20 -08:00
|
|
|
return
|
2016-02-01 01:56:10 -08:00
|
|
|
}
|
|
|
|
|
2016-02-14 01:24:31 -08:00
|
|
|
func (lease_set LeaseSet) Signature() (signature Signature, err error) {
|
2016-02-14 22:28:20 -08:00
|
|
|
destination, err := lease_set.Destination()
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
lease_count, err := lease_set.LeaseCount()
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
start := len(destination) + 256 + 128 + 1 + (44 * lease_count)
|
|
|
|
cert, err := destination.Certificate()
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
}
|
|
|
|
cert_type, _ := cert.Type()
|
|
|
|
var end int
|
|
|
|
if cert_type == CERT_KEY {
|
|
|
|
end = start + KeyCertificate(cert).SignatureSize()
|
|
|
|
} else {
|
|
|
|
end = start + 40
|
|
|
|
}
|
|
|
|
if len(lease_set) < end {
|
|
|
|
err = errors.New("")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
copy(signature[:], lease_set[start:end])
|
2016-02-14 01:24:31 -08:00
|
|
|
return
|
2016-02-01 01:56:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (lease_set LeaseSet) Verify() error {
|
2016-02-14 22:28:20 -08:00
|
|
|
//data_end := len(destination) +
|
2016-02-14 01:24:31 -08:00
|
|
|
// 256 +
|
2016-02-14 22:28:20 -08:00
|
|
|
// 128 +
|
2016-02-14 01:24:31 -08:00
|
|
|
// 1 +
|
|
|
|
// (44 * lease_set.LeaseCount())
|
|
|
|
//data := lease_set[:data_end]
|
|
|
|
//spk, _ := lease_set.
|
|
|
|
// Destination().
|
|
|
|
// SigningPublicKey()
|
|
|
|
//verifier, err := spk.NewVerifier()
|
|
|
|
//if err != nil {
|
|
|
|
// return err
|
|
|
|
//}
|
|
|
|
return nil // verifier.Verify(data, lease_set.Signature())
|
2016-02-01 01:56:10 -08:00
|
|
|
}
|
2016-02-14 22:28:20 -08:00
|
|
|
|
|
|
|
func (lease_set LeaseSet) OldestExpiration() (date Date, err error) {
|
|
|
|
return
|
|
|
|
}
|