net.i2p.data
Class LeaseSet

java.lang.Object
  extended by net.i2p.data.DataStructureImpl
      extended by net.i2p.data.DatabaseEntry
          extended by net.i2p.data.LeaseSet
All Implemented Interfaces:
DataStructure

public class LeaseSet
extends DatabaseEntry

Defines the set of leases a destination currently has. Support encryption and decryption with a supplied key. Only the gateways and tunnel IDs in the individual leases are encrypted. Encrypted leases are not indicated as such. The only way to tell a lease is encrypted is to determine that the listed gateways do not exist. Routers wishing to decrypt a leaseset must have the desthash and key in their keyring. This is required for the local router as well, since the encryption is done on the client side of I2CP, the router must decrypt it back again for local usage (but not for transmission to the floodfills) Decrypted leases are only available through the getLease() method, so that storage and network transmission via writeBytes() will output the original encrypted leases and the original leaseset signature. Revocation (zero leases) isn't used anywhere. In addition: - A revoked leaseset has an EarliestLeaseDate of -1, so it will never be stored successfully. - Revocation of an encrypted leaseset will explode. - So having an included signature at all is pointless?

Author:
jrandom

Field Summary
static int MAX_LEASES
          This seems like plenty
 
Fields inherited from class net.i2p.data.DatabaseEntry
_currentRoutingKey, _routingKeyGenMod, _signature, KEY_TYPE_LEASESET, KEY_TYPE_ROUTERINFO
 
Constructor Summary
LeaseSet()
           
 
Method Summary
 void addLease(Lease lease)
           
 void encrypt(SessionKey key)
          Encrypt the gateway and tunnel ID of each lease, leaving the expire dates unchanged.
 boolean equals(Object object)
           
protected  byte[] getBytes()
          Returns the raw payload data, excluding the signature, to be signed by sign().
 long getDate()
          A common interface to the timestamp of the two subclasses.
 Destination getDestination()
           
 long getEarliestLeaseDate()
          Retrieve the end date of the earliest lease include in this leaseSet.
 PublicKey getEncryptionKey()
           
protected  KeysAndCert getKeysAndCert()
          Get the keys and the cert Identical to getDestination() in LeaseSet, and getIdentity() in RouterInfo.
 Lease getLease(int index)
           
 int getLeaseCount()
           
 boolean getReceivedAsPublished()
          If true, we received this LeaseSet by a remote peer publishing it to us, rather than by searching for it ourselves or locally creating it.
 boolean getReceivedAsReply()
          If true, we received this LeaseSet by searching for it Default false.
 SigningPublicKey getSigningKey()
          Deprecated. unused
 int getType()
          Get the type of the data structure.
 int hashCode()
          the destination has enough randomness in it to use it by itself for speed
 boolean isCurrent(long fudge)
          Determine whether ANY lease is currently valid, at least within a given fudge factor
 void readBytes(InputStream in)
          This does NOT validate the signature
 void setDestination(Destination dest)
           
 void setEncryptionKey(PublicKey encryptionKey)
           
 void setReceivedAsPublished(boolean received)
          Default false
 void setReceivedAsReply()
          set to true @since 0.7.14
 void setSigningKey(SigningPublicKey key)
           
 int size()
           
 String toString()
           
 boolean verifySignature()
          Verify that the signature matches the lease set's destination's signing public key.
 boolean verifySignature(SigningPublicKey signingKey)
          Deprecated. revocation unused
 void writeBytes(OutputStream out)
          This does NOT validate the signature
 
Methods inherited from class net.i2p.data.DatabaseEntry
getHash, getRoutingKey, getSignature, getSigningPublicKey, setRoutingKey, setSignature, sign, validateRoutingKey
 
Methods inherited from class net.i2p.data.DataStructureImpl
calculateHash, fromBase64, fromByteArray, read, toBase64, toByteArray
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

MAX_LEASES

public static final int MAX_LEASES
This seems like plenty

See Also:
Constant Field Values
Constructor Detail

LeaseSet

public LeaseSet()
Method Detail

getDate

public long getDate()
Description copied from class: DatabaseEntry
A common interface to the timestamp of the two subclasses. Identical to getEarliestLeaseData() in LeaseSet, and getPublished() in RouterInfo. Note that for a LeaseSet this will be in the future, and for a RouterInfo it will be in the past. Either way, it's a timestamp.

Specified by:
getDate in class DatabaseEntry

getKeysAndCert

protected KeysAndCert getKeysAndCert()
Description copied from class: DatabaseEntry
Get the keys and the cert Identical to getDestination() in LeaseSet, and getIdentity() in RouterInfo.

Specified by:
getKeysAndCert in class DatabaseEntry
Returns:
KAC or null

getType

public int getType()
Description copied from class: DatabaseEntry
Get the type of the data structure. This should be faster than instanceof.

Specified by:
getType in class DatabaseEntry
Returns:
KEY_TYPE_ROUTERINFO or KEY_TYPE_LEASESET

getDestination

public Destination getDestination()

setDestination

public void setDestination(Destination dest)

getEncryptionKey

public PublicKey getEncryptionKey()

setEncryptionKey

public void setEncryptionKey(PublicKey encryptionKey)

getSigningKey

public SigningPublicKey getSigningKey()
Deprecated. unused


setSigningKey

public void setSigningKey(SigningPublicKey key)

getReceivedAsPublished

public boolean getReceivedAsPublished()
If true, we received this LeaseSet by a remote peer publishing it to us, rather than by searching for it ourselves or locally creating it. Default false.


setReceivedAsPublished

public void setReceivedAsPublished(boolean received)
Default false


getReceivedAsReply

public boolean getReceivedAsReply()
If true, we received this LeaseSet by searching for it Default false.

Since:
0.7.14

setReceivedAsReply

public void setReceivedAsReply()
set to true @since 0.7.14


addLease

public void addLease(Lease lease)

getLeaseCount

public int getLeaseCount()
Returns:
0-6 A LeaseSet with no leases is revoked.

getLease

public Lease getLease(int index)

getEarliestLeaseDate

public long getEarliestLeaseDate()
Retrieve the end date of the earliest lease include in this leaseSet. This is the date that should be used in comparisons for leaseSet age - to determine which LeaseSet was published more recently (later earliestLeaseSetDate means it was published later)

Returns:
earliest end date of any lease in the set, or -1 if there are no leases

verifySignature

public boolean verifySignature()
Verify that the signature matches the lease set's destination's signing public key. OR the included revocation key.

Overrides:
verifySignature in class DatabaseEntry
Returns:
true only if the signature matches

verifySignature

public boolean verifySignature(SigningPublicKey signingKey)
Deprecated. revocation unused

Verify that the signature matches the lease set's destination's signing public key. OR the specified revocation key.

Returns:
true only if the signature matches

isCurrent

public boolean isCurrent(long fudge)
Determine whether ANY lease is currently valid, at least within a given fudge factor

Parameters:
fudge - milliseconds fudge factor to allow between the current time
Returns:
true if there are current leases, false otherwise

getBytes

protected byte[] getBytes()
Description copied from class: DatabaseEntry
Returns the raw payload data, excluding the signature, to be signed by sign(). FIXME RouterInfo throws DFE and LeaseSet returns null

Specified by:
getBytes in class DatabaseEntry
Returns:
null on error ???????????????????????

readBytes

public void readBytes(InputStream in)
               throws DataFormatException,
                      IOException
This does NOT validate the signature

Parameters:
in - stream to read from
Throws:
DataFormatException - if the data is improperly formatted
IOException - if there was a problem reading the stream

writeBytes

public void writeBytes(OutputStream out)
                throws DataFormatException,
                       IOException
This does NOT validate the signature

Parameters:
out - stream to write to
Throws:
DataFormatException - if the data was incomplete or not yet ready to be written
IOException - if there was a problem writing to the stream

size

public int size()

equals

public boolean equals(Object object)
Overrides:
equals in class Object

hashCode

public int hashCode()
the destination has enough randomness in it to use it by itself for speed

Overrides:
hashCode in class Object

toString

public String toString()
Overrides:
toString in class Object

encrypt

public void encrypt(SessionKey key)
Encrypt the gateway and tunnel ID of each lease, leaving the expire dates unchanged. This adds an extra dummy lease, because AES data must be padded to 16 bytes. The fact that it is encrypted is not stored anywhere. Must be called after all the leases are in place, but before sign().