net.i2p.data

## Class LeaseSet

- java.lang.Object
- - net.i2p.data.DataStructureImpl
  - - net.i2p.data.DatabaseEntry
    - - 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

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `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

    Constructors
    Constructor and Description
    `LeaseSet()`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `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().