net.i2p.data
Class LeaseSet

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

public class LeaseSet
extends DataStructureImpl

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
 
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(java.lang.Object object)
           
 Destination getDestination()
           
 long getEarliestLeaseDate()
          Retrieve the end date of the earliest lease include in this leaseSet.
 PublicKey getEncryptionKey()
           
 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.
 Hash getRoutingKey()
          Get the routing key for the structure using the current modifier in the RoutingKeyGenerator.
 Signature getSignature()
           
 SigningPublicKey getSigningKey()
          Deprecated. unused
 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(java.io.InputStream in)
          Load up the current object with data from the given stream.
 void setDestination(Destination dest)
           
 void setEncryptionKey(PublicKey encryptionKey)
           
 void setReceivedAsPublished(boolean received)
          Default false
 void setReceivedAsReply()
          set to true @since 0.7.14
 void setRoutingKey(Hash key)
           
 void setSignature(Signature sig)
           
 void setSigningKey(SigningPublicKey key)
           
 void sign(SigningPrivateKey key)
          Sign the structure using the supplied signing key
 int size()
           
 java.lang.String toString()
           
 boolean validateRoutingKey()
           
 boolean verifySignature()
          Verify that the signature matches the lease set's destination's signing public key.
 boolean verifySignature(SigningPublicKey signingKey)
          Verify that the signature matches the lease set's destination's signing public key.
 void writeBytes(java.io.OutputStream out)
          Write out the data structure to the stream, using the format defined in the I2P data structure specification.
 
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

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)

getSignature

public Signature getSignature()

setSignature

public void setSignature(Signature sig)

getRoutingKey

public Hash getRoutingKey()
Get the routing key for the structure using the current modifier in the RoutingKeyGenerator. This only calculates a new one when necessary though (if the generator's key modifier changes)


setRoutingKey

public void setRoutingKey(Hash key)

validateRoutingKey

public boolean validateRoutingKey()

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

sign

public void sign(SigningPrivateKey key)
          throws DataFormatException
Sign the structure using the supplied signing key

Throws:
DataFormatException

verifySignature

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

Returns:
true only if the signature matches

verifySignature

public boolean verifySignature(SigningPublicKey signingKey)
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

readBytes

public void readBytes(java.io.InputStream in)
               throws DataFormatException,
                      java.io.IOException
Description copied from interface: DataStructure
Load up the current object with data from the given stream. Data loaded this way must match the I2P data structure specification.

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

writeBytes

public void writeBytes(java.io.OutputStream out)
                throws DataFormatException,
                       java.io.IOException
Description copied from interface: DataStructure
Write out the data structure to the stream, using the format defined in the I2P data structure specification.

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

size

public int size()

equals

public boolean equals(java.lang.Object object)
Overrides:
equals in class java.lang.Object

hashCode

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

Overrides:
hashCode in class java.lang.Object

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.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().