2016-04-10 06:49:58 +00:00
|
|
|
=================
|
|
|
|
New netDB Entries
|
|
|
|
=================
|
|
|
|
.. meta::
|
2018-08-08 18:32:32 +00:00
|
|
|
:author: zzz, orignal, str4d
|
2016-04-10 06:49:58 +00:00
|
|
|
:created: 2016-01-16
|
|
|
|
:thread: http://zzz.i2p/topics/2051
|
2018-10-13 11:09:24 +00:00
|
|
|
:lastupdated: 2018-10-13
|
2016-04-25 06:09:22 +00:00
|
|
|
:status: Open
|
|
|
|
:supercedes: 110, 120, 121, 122
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
.. contents::
|
|
|
|
|
|
|
|
|
2016-04-25 06:09:22 +00:00
|
|
|
Overview
|
|
|
|
========
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
This is an update and aggregation of the following 4 proposals:
|
|
|
|
|
2016-04-25 06:09:22 +00:00
|
|
|
- 110 LS2
|
|
|
|
- 120 Meta LS2 for massive multihoming
|
|
|
|
- 121 Encrypted LS2
|
|
|
|
- 122 Unauthenticated service lookup (anycasting)
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
These proposals are mostly independent, but for sanity we define and use a
|
|
|
|
common format for several of them.
|
|
|
|
|
2018-08-13 20:11:44 +00:00
|
|
|
The following proposals are somewhat related:
|
|
|
|
|
|
|
|
- 140 Invisible Multihoming (incompatible with this proposal)
|
|
|
|
- 142 New Crypto Template (for new symmetric crypto)
|
2018-09-18 12:53:39 +00:00
|
|
|
- ECIES (see zzz.i2p thread)
|
2018-08-13 20:11:44 +00:00
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
Proposal
|
|
|
|
========
|
|
|
|
|
|
|
|
This proposal defines 5 new DatabaseEntry types and the process for
|
|
|
|
storing them to and retrieving them from the network database,
|
|
|
|
as well as the method for signing them and verifying those signatures.
|
|
|
|
|
2018-08-13 20:11:44 +00:00
|
|
|
Goals
|
|
|
|
-----
|
|
|
|
|
|
|
|
- Backwards compatible
|
|
|
|
- LS2 Usable with old-style mulithoming
|
|
|
|
- No new crypto or primitives required for support
|
|
|
|
- Maintain decoupling of crypto and signing; support all current and future versions
|
|
|
|
- Enable optional offline signing keys
|
2018-09-18 12:53:39 +00:00
|
|
|
- Reduce accuracy of timestamps to reduce fingerprinting
|
2018-08-13 20:11:44 +00:00
|
|
|
- Enable new crypto for destinations
|
|
|
|
- Enable massive multihoming
|
|
|
|
- Fix multiple issues with existing encrypted LS
|
|
|
|
- Optional blinding to reduce visibility by floodfills
|
|
|
|
- Encrypted supports both single-key and multiple revocable keys
|
|
|
|
- Service lookup for easier lookup of outproxies, application DHT bootstrap,
|
|
|
|
and other uses
|
|
|
|
- Don't break anything that relies on 32-byte binary destination hashes, e.g. bittorrent
|
|
|
|
- Add flexibility to leasesets via properties, like we have in routerinfos.
|
|
|
|
- Put published timestamp and variable expiration in header, so it works even
|
|
|
|
if contents are encrypted (don't derive timestamp from earliest lease)
|
|
|
|
|
|
|
|
|
2018-10-13 15:19:38 +00:00
|
|
|
Non-Goals / Out-of-scope
|
|
|
|
------------------------
|
2018-08-13 20:11:44 +00:00
|
|
|
|
|
|
|
- New DHT rotation algorithm or shared random generation
|
2018-10-13 15:19:38 +00:00
|
|
|
- The specific new encryption type and end-to-end encryption scheme
|
2018-08-27 19:24:57 +00:00
|
|
|
to use that new type would be in a separate proposal.
|
2018-10-13 15:19:38 +00:00
|
|
|
No new crypto is specified or discussed here.
|
|
|
|
- New encryption for RIs or tunnel building.
|
|
|
|
That would be in a separate proposal.
|
|
|
|
- Methods of encryption, transmission, and reception of I2NP DLM / DSM / DSRM messages.
|
|
|
|
Not changing.
|
|
|
|
- How to generate and support Meta, including backend inter-router communication, management, failover, and coordination.
|
|
|
|
Support may be added to I2CP, or i2pcontrol, or a new protocol.
|
|
|
|
This may or may not be standardized.
|
|
|
|
- How to actually implement and manage longer-expiring tunnels, or cancel existing tunnels.
|
|
|
|
That's extremely difficult, and without it, you can't have a reasonable graceful shutdown.
|
|
|
|
- Threat model changes
|
|
|
|
- Offline storage format, or methods to store/retrieve/share the data.
|
|
|
|
- Implementation details are not discussed here and are left to each project.
|
|
|
|
|
2018-08-13 20:11:44 +00:00
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
Justification
|
|
|
|
-------------
|
|
|
|
|
|
|
|
LS2 adds fields for changing encryption type and for future protocol changes.
|
|
|
|
|
|
|
|
Encrypted LS2 fixes several security issues with the existing encrypted LS by
|
|
|
|
using asymmetric encryption of the entire set of leases.
|
|
|
|
|
|
|
|
Meta LS2 provides flexible, efficient, effective, and large-scale multihoming.
|
|
|
|
|
|
|
|
Service Record and Service List provide anycast services such as naming lookup
|
|
|
|
and DHT bootstrapping.
|
|
|
|
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
NetDB Data Types
|
|
|
|
----------------
|
|
|
|
|
|
|
|
The type numbers are used in the I2NP Database Lookup/Store Messages.
|
|
|
|
|
|
|
|
The end-to-end column means is it sent to a Destination in a Garlic Message.
|
|
|
|
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
Existing types:
|
2018-09-18 12:53:39 +00:00
|
|
|
|
|
|
|
================================== ============= ============
|
|
|
|
NetDB Data Lookup Type Store Type
|
|
|
|
================================== ============= ============
|
2018-10-11 23:20:38 +00:00
|
|
|
any 0 any
|
2018-09-18 12:53:39 +00:00
|
|
|
LS 1 1
|
2018-10-11 23:20:38 +00:00
|
|
|
RI 2 0
|
|
|
|
exploratory 3 DSRM
|
2018-09-18 12:53:39 +00:00
|
|
|
================================== ============= ============
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
New types:
|
2018-09-18 12:53:39 +00:00
|
|
|
|
|
|
|
================================== ============= ============ ================== ==================
|
|
|
|
NetDB Data Lookup Type Store Type Std. LS2 Header? Sent end-to-end?
|
|
|
|
================================== ============= ============ ================== ==================
|
|
|
|
LS2 1 3 yes yes
|
|
|
|
Encrypted LS2 1 5 no no
|
|
|
|
Meta LS2 1 7 yes no
|
|
|
|
Service Record n/a 9 yes no
|
2018-10-11 23:20:38 +00:00
|
|
|
Service List 4 11 no no
|
2018-09-18 12:53:39 +00:00
|
|
|
================================== ============= ============ ================== ==================
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-10-11 23:20:38 +00:00
|
|
|
Notes
|
|
|
|
`````
|
|
|
|
- Lookup types are currently bits 3-2 in the Database Lookup Message.
|
|
|
|
Any additional types would require use of bit 4.
|
|
|
|
|
|
|
|
- All store types are odd since upper bits in the Database Store Message
|
2018-09-18 12:53:39 +00:00
|
|
|
type field are ignored by old routers.
|
|
|
|
We would rather have the parse fail as an LS than as a compressed RI.
|
|
|
|
|
|
|
|
- Should be type be explicit or implicit or neither in the data covered by the signature?
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
|
2018-08-13 20:11:44 +00:00
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
Lookup/Store process
|
|
|
|
--------------------
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
Types 3, 5, and 7 may be returned in response to a standard leaseset lookup (type 1).
|
|
|
|
Type 9 is never returned in response to a lookup.
|
|
|
|
Types 11 is returned in response to a new service lookup type (type 11).
|
2016-04-10 06:49:58 +00:00
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
Only type 3 may be sent in a client-to-client Garlic message.
|
2018-08-06 21:48:47 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
Format
|
|
|
|
------
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
Types 3, 7, and 9 all have a common format::
|
2016-04-10 06:49:58 +00:00
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
Standard LS2 Header
|
|
|
|
- as defined below
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
Type-Specific Part
|
2018-08-06 21:48:47 +00:00
|
|
|
- as defined below in each part
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
Standard LS2 Signature:
|
2018-08-06 21:48:47 +00:00
|
|
|
- Length as implied by sig type of signing key
|
|
|
|
|
2018-10-11 23:23:07 +00:00
|
|
|
Type 5 (Encrypted) does not start with a Destination and has a
|
2018-08-06 21:48:47 +00:00
|
|
|
different format. See below.
|
2016-04-10 06:49:58 +00:00
|
|
|
|
2018-10-11 23:23:07 +00:00
|
|
|
Type 11 (Service List) is an aggregation of several Service Records and has a
|
2016-04-10 06:49:58 +00:00
|
|
|
different format. See below.
|
|
|
|
|
|
|
|
|
2018-08-13 20:11:44 +00:00
|
|
|
Privacy/Security Considerations
|
|
|
|
-------------------------------
|
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
Standard LS2 Header
|
|
|
|
===================
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
Types 3, 7, and 9 use the standard LS2 header, specified below:
|
2018-08-06 21:48:47 +00:00
|
|
|
|
|
|
|
|
|
|
|
Format
|
2018-08-07 10:28:27 +00:00
|
|
|
------
|
2018-08-06 21:48:47 +00:00
|
|
|
::
|
|
|
|
|
|
|
|
Standard LS2 Header:
|
2018-09-18 12:53:39 +00:00
|
|
|
- Type (1 byte)
|
|
|
|
Not actually in header, but part of data covered by signature.
|
|
|
|
Take from field in Database Store Message.
|
|
|
|
TODO to be reviewed/decided.
|
2018-08-06 21:48:47 +00:00
|
|
|
- Destination (387+ bytes)
|
2018-08-13 20:11:44 +00:00
|
|
|
- Published timestamp (4 bytes, seconds since epoch, rolls over in 2106)
|
|
|
|
- Expires (2 bytes) (offset from published timestamp in seconds, 18.2 hours max)
|
2018-08-06 21:48:47 +00:00
|
|
|
- Flags (2 bytes)
|
|
|
|
Bit order: 15 14 ... 3 2 1 0
|
|
|
|
Bit 0: If 0, no offline keys; if 1, offline keys
|
2018-09-18 12:53:39 +00:00
|
|
|
Bit 1: If 0, a standard published leaseset.
|
|
|
|
If 1, an unpublished leaseset. Should not be flooded, published, or
|
|
|
|
sent in response to a query. If this leaseset expires, do not query the
|
|
|
|
netdb for a new one.
|
|
|
|
Bits 2-15: set to 0 for compatibility with future uses
|
|
|
|
- If flag indicates offline keys, the offline signature section:
|
|
|
|
Expires timestamp (4 bytes, seconds since epoch, rolls over in 2106)
|
2018-08-06 21:48:47 +00:00
|
|
|
Transient sig type (2 bytes)
|
|
|
|
Transient signing public key (length as implied by sig type)
|
2018-09-18 12:53:39 +00:00
|
|
|
Signature of expires timestamp, transient sig type, and public key, by the destination public key,
|
|
|
|
length as implied by destination public key sig type.
|
|
|
|
This section can, and should, be generated offline.
|
|
|
|
|
|
|
|
|
|
|
|
Justification
|
|
|
|
`````````````
|
|
|
|
|
|
|
|
- Unpublished/published: For use when sending a database store end-to-end,
|
|
|
|
the sending router may wish to indicate that this leaseset should not be
|
|
|
|
sent to others. We currently use heuristics to maintain this state.
|
|
|
|
|
|
|
|
- Published: Replaces the complex logic required to determine the 'version' of the
|
|
|
|
leaseset. Currently, the version is the expiration of the last-expiring lease,
|
|
|
|
and a publishing router must increment that expiration by at least 1ms when
|
|
|
|
publishing a leaseset that only removes an older lease.
|
|
|
|
|
|
|
|
- Expires: Allows for an expiration of a netdb entry to be earlier than that of
|
|
|
|
its last-expiring leaseset. May not be useful for LS2, where leasesets
|
|
|
|
are expected to remain with a 11-minute maximum expiration, but
|
|
|
|
for other new types, it is necessary (see Meta LS and Service Record below).
|
2018-08-06 21:48:47 +00:00
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
- Offline keys are optional, to reduce initial/required implementation complexity.
|
2018-08-06 21:48:47 +00:00
|
|
|
|
|
|
|
|
2018-08-13 20:11:44 +00:00
|
|
|
Issues
|
|
|
|
------
|
|
|
|
|
|
|
|
- Could reduce timestamp accuracy even more (10 minutes?) but would have to add
|
|
|
|
version number. This could break multihoming, unless we have order preserving encryption?
|
|
|
|
Probably can't do without timestamps at all.
|
|
|
|
|
|
|
|
- Alternative: 3 byte timestamp (epoch / 10 minutes), 1-byte version, 2-byte expires
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
- Is type explicit or implicit in data / signature? "Domain" constants for signature?
|
|
|
|
|
|
|
|
|
2018-08-27 19:24:57 +00:00
|
|
|
Notes
|
|
|
|
`````
|
2018-09-18 12:53:39 +00:00
|
|
|
|
|
|
|
- Routers should not publish a LS more than once a second.
|
|
|
|
If they do, they must artificially increment the published timestamp by 1
|
|
|
|
over the previously published LS.
|
|
|
|
|
2018-08-27 19:24:57 +00:00
|
|
|
- Router implementations could cache the transient keys and signature to
|
|
|
|
avoid verification every time. In particular, floodfills, and routers at
|
|
|
|
both ends of long-lived connections, could benefit from this.
|
2018-08-06 21:48:47 +00:00
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
- Offline keys and signature are only appropriate for long-lived destinations,
|
|
|
|
i.e. servers, not clients.
|
|
|
|
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
New DatabaseEntry types
|
|
|
|
=======================
|
|
|
|
|
|
|
|
|
|
|
|
LeaseSet 2
|
|
|
|
----------
|
|
|
|
|
|
|
|
Changes from existing LeaseSet:
|
|
|
|
|
|
|
|
- Add published timestamp, expires timestamp, flags, and properties
|
|
|
|
- Add encryption type
|
|
|
|
- Remove revocation key
|
|
|
|
|
|
|
|
Lookup with:
|
|
|
|
Standard LS flag (1)
|
|
|
|
Store with:
|
2018-09-18 12:53:39 +00:00
|
|
|
Standard LS2 type (3)
|
2018-08-06 21:48:47 +00:00
|
|
|
Store at:
|
|
|
|
Hash of destination, with daily rotation, as for LS 1
|
2016-04-10 06:49:58 +00:00
|
|
|
Typical expiration:
|
|
|
|
10 minutes, as in a regular LS.
|
|
|
|
Published by:
|
|
|
|
Destination
|
|
|
|
|
|
|
|
Format
|
|
|
|
``````
|
|
|
|
::
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
Standard LS2 Header as specified above
|
2016-04-10 06:49:58 +00:00
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
Properties:
|
|
|
|
- A Mapping, for future use, no current plans.
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
Standard LS2 Type-Specific Part
|
2018-08-27 19:24:57 +00:00
|
|
|
- Properties (Mapping as specified in common structures spec, 2 zero bytes if none)
|
2018-09-18 12:53:39 +00:00
|
|
|
- Encryption type (2 bytes)
|
|
|
|
- Encryption key length (2 bytes)
|
|
|
|
This is explicit, so floodfills can parse LS2 with unknown encryption types.
|
|
|
|
- Encryption key (number of bytes specified)
|
|
|
|
- Number of lease2s (1 byte)
|
|
|
|
- Lease2s (40 bytes each)
|
|
|
|
These are leases, but with a 4-byte instead of an 8-byte expiration,
|
|
|
|
seconds since the epoch (rolls over in 2106)
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
Standard LS2 Signature:
|
2018-08-06 21:48:47 +00:00
|
|
|
- Signature
|
|
|
|
If flag indicates offline keys, this is signed by the transient pubkey, otherwise, by the destination pubkey
|
|
|
|
Length as implied by sig type of signing key
|
2018-09-18 12:53:39 +00:00
|
|
|
The signature is of everything above.
|
2018-08-06 21:48:47 +00:00
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
|
2017-11-12 17:23:38 +00:00
|
|
|
|
|
|
|
Justification
|
|
|
|
`````````````
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
- Properties: Future expansion and flexibility.
|
|
|
|
Placed first in case necessary for parsing of the remaining data.
|
2017-11-12 17:23:38 +00:00
|
|
|
|
|
|
|
|
|
|
|
Discussion
|
|
|
|
``````````
|
|
|
|
|
|
|
|
This proposal continues to use the public key in the leaseset for the
|
|
|
|
end-to-end encryption key, and leaves the public key field in the
|
|
|
|
Destination unused, as it is now. The encryption type is not specified
|
|
|
|
in the Destination key certificate, it will remain 0.
|
|
|
|
|
|
|
|
Possible extension: Optionally include multiple encryption type/public key pairs,
|
2018-08-27 19:24:57 +00:00
|
|
|
to ease transition to new encryption types. The other way to do it
|
|
|
|
is to publish multiple leasesets, possibly using the same tunnels,
|
|
|
|
as we do now for DSA and EdDSA destinations. It's not clear how to
|
|
|
|
identify the incoming encryption type on a shared tunnel.
|
2017-11-12 17:23:38 +00:00
|
|
|
|
2018-08-27 19:24:57 +00:00
|
|
|
A rejected alternative is to specify the encryption type in the Destination key certificate,
|
2017-11-12 17:23:38 +00:00
|
|
|
use the public key in the Destination, and not use the public key
|
2018-08-27 19:24:57 +00:00
|
|
|
in the leaseset. We do not plan to do this.
|
2017-11-12 17:23:38 +00:00
|
|
|
|
|
|
|
Benefits of LS2:
|
2017-11-12 17:50:24 +00:00
|
|
|
|
2017-11-12 17:23:38 +00:00
|
|
|
- Location of actual public key doesn't change.
|
|
|
|
- Encryption type, or public key, may change without changing the Destination.
|
|
|
|
- Removes unused revocation field
|
|
|
|
- Basic compatibility with other DatabaseEntry types in this proposal
|
|
|
|
- Could allow multiple encryption types
|
|
|
|
|
|
|
|
Drawbacks of LS2:
|
2017-11-12 17:50:24 +00:00
|
|
|
|
2017-11-12 17:23:38 +00:00
|
|
|
- Location of public key and encryption type differs from RouterInfo
|
|
|
|
- Maintains unused public key in leaseset
|
|
|
|
- Requires implementation across the network; in the alternative, experimental
|
|
|
|
encryption types may be used, if allowed by floodfills
|
|
|
|
(but see related proposals 136 and 137 about support for experimental sig types).
|
|
|
|
The alternative proposal could be easier to implement and test for experimental encryption types.
|
|
|
|
|
|
|
|
|
2018-08-27 19:24:57 +00:00
|
|
|
New Encryption Issues
|
|
|
|
`````````````````````
|
|
|
|
Some of this is out-of-scope for this proposal,
|
|
|
|
but putting notes here for now as we don't have
|
|
|
|
a separate encryption proposal yet.
|
2018-09-18 12:53:39 +00:00
|
|
|
See also the ECIES thread on zzz.i2p.
|
|
|
|
|
|
|
|
- The encryption type represents the combination
|
|
|
|
of curve, key length, and end-to-end scheme,
|
|
|
|
including KDF and MAC, if any.
|
2018-08-27 19:24:57 +00:00
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
- We have included a key length field, so that the LS2 is
|
|
|
|
parsable and verifiable by the floodfill even for unknown encryption types.
|
2018-08-27 19:24:57 +00:00
|
|
|
|
|
|
|
- Do we want to support multiple encryption types and keys in the same LS?
|
|
|
|
Or is it sufficient to have different b32s for different types,
|
|
|
|
as we do now for sig types.
|
|
|
|
Would it be possible for a router to auto-detect incoming garlic-encrypted
|
|
|
|
messages, if multiple types were supported in the same tunnel?
|
2018-09-18 12:53:39 +00:00
|
|
|
TODO - IMPORTANT TO DECIDE
|
2018-08-27 19:24:57 +00:00
|
|
|
|
|
|
|
- The first new encryption type to be proposed will
|
|
|
|
probably be ECIES/X25519. How it's used end-to-end
|
|
|
|
(either a slightly modified version of ElGamal/AES+SessionTag
|
|
|
|
or something completely new, e.g. ChaCha/Poly) will be specified
|
|
|
|
in one or more separate proposals.
|
2018-09-18 12:53:39 +00:00
|
|
|
See also the ECIES thread on zzz.i2p.
|
2018-08-27 19:24:57 +00:00
|
|
|
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
Notes
|
|
|
|
`````
|
2018-09-18 12:53:39 +00:00
|
|
|
- 8-byte expiration in leases changed to 4 bytes.
|
|
|
|
Alternatives: 2-byte offset from the
|
2016-04-10 06:49:58 +00:00
|
|
|
published timestamp in seconds? Or 4-byte offset in milliseconds?
|
|
|
|
|
|
|
|
- If we ever implement revocation, we can do it with an expires field of zero,
|
|
|
|
or zero leases, or both. No need for a separate revocation key.
|
|
|
|
|
|
|
|
|
|
|
|
Encrypted LS2
|
|
|
|
-------------
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
Goals:
|
|
|
|
|
|
|
|
- Add blinding
|
|
|
|
- Allow multiple sig types
|
|
|
|
- Don't require any new crypto primitives
|
|
|
|
- Optionally encrypt to each recipient, revokable
|
|
|
|
- Support encryption of Standard LS2 and Meta LS2 only
|
|
|
|
|
|
|
|
Encrypted LS2 is never sent in an end-to-end garlic message.
|
|
|
|
Use the standard LS2 as above.
|
|
|
|
|
|
|
|
You can't use a b32 for an encrypted LS2, as you don't have the non-blinded public key.
|
|
|
|
We need a new "b33" format, or use one of the four unused bits at the end of b32 to indicate it's blinded.
|
|
|
|
You can't use an encrypted LS2 for bittorrent, because of compact announce replies.
|
|
|
|
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
Changes from existing encrypted LeaseSet:
|
|
|
|
|
|
|
|
- Encrypt the whole thing for security
|
|
|
|
- Securely encrypt, not with AES only.
|
|
|
|
- Encrypt to each recipient
|
|
|
|
|
|
|
|
Lookup with:
|
|
|
|
Standard LS flag (1)
|
|
|
|
Store with:
|
2018-09-18 12:53:39 +00:00
|
|
|
Encrypted LS2 type (5)
|
2018-08-06 21:48:47 +00:00
|
|
|
Store at:
|
|
|
|
Hash of blinded sig type and public key, with daily rotation
|
2016-04-10 06:49:58 +00:00
|
|
|
Typical expiration:
|
|
|
|
10 minutes, as in a regular LS.
|
|
|
|
Published by:
|
|
|
|
Destination
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
Format
|
|
|
|
``````
|
2018-08-06 21:48:47 +00:00
|
|
|
Note that encrypted LS2 is blinded. The Destination is not in the header.
|
|
|
|
DHT storage location is SHA-256(sig type || blinded public key), and rotated daily.
|
|
|
|
|
|
|
|
Blinding is only defined for Ed25519 signing keys (sig type 7).
|
2018-09-18 12:53:39 +00:00
|
|
|
Blinding is roughly as specified in Tor's rend-spec-v3 appendices A.1 and A.2.
|
2018-08-06 21:48:47 +00:00
|
|
|
Exact specification including KDF is TBD.
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
Does NOT use the standard LS2 header specified above.
|
2018-08-06 21:48:47 +00:00
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
::
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
- Type (1 byte)
|
|
|
|
Not actually in header, but part of data covered by signature.
|
|
|
|
Take from field in Database Store Message.
|
|
|
|
TODO to be reviewed/decided.
|
2018-08-06 21:48:47 +00:00
|
|
|
- Blinded Public Key Sig Type (2 bytes)
|
|
|
|
- Blinded Public Key (length as implied by sig type)
|
|
|
|
- Signature of destination by blinded public key?
|
2018-10-13 11:09:24 +00:00
|
|
|
- Published timestamp (4 bytes, seconds since epoch, rolls over in 2106)
|
|
|
|
- Expires (2 bytes) (offset from published timestamp in seconds, 18.2 hours max)
|
2016-04-10 06:49:58 +00:00
|
|
|
- Flags (2 bytes)
|
2018-08-06 21:48:47 +00:00
|
|
|
Bit order: 15 14 ... 3 2 1 0
|
|
|
|
Bit 0: If 0, no offline keys; if 1, offline keys
|
|
|
|
Other bits: set to 0 for compatibility with future uses
|
|
|
|
- If flag indicates offline keys:
|
2018-09-18 12:53:39 +00:00
|
|
|
Expires timestamp (4 bytes, seconds since epoch, rolls over in 2106)
|
2018-08-06 21:48:47 +00:00
|
|
|
Transient sig type (2 bytes)
|
|
|
|
Transient signing public key (length as implied by sig type)
|
2018-09-18 12:53:39 +00:00
|
|
|
Signature of expires timestamp, transient sig type, and public key, by the destination public key,
|
2018-08-06 21:48:47 +00:00
|
|
|
length as implied by destination public key sig type
|
|
|
|
- Length of IV + encrypted data (2 bytes)
|
|
|
|
- IV (8 bytes)
|
|
|
|
- Outer Encrypted data (AEAD ChaCha/Poly1305)
|
|
|
|
Published timestamp is the nonce
|
|
|
|
Do we need HMAC or ChaCha only? Probably don't need HMAC, everything is signed.
|
|
|
|
KDF TBD, uses Destination
|
|
|
|
When decrypted, contains:
|
|
|
|
1) Flag - per-client or for everybody? (1 byte)
|
|
|
|
If per-client, 2) and 3) are present.
|
|
|
|
2) number of recipients to follow (2 bytes)
|
|
|
|
3) that many entries of [id_i, iv_i, Encrypted cookie]
|
|
|
|
where the recipient looks for his ID, then decrypts the inner.
|
|
|
|
The same cookie is encrypted once for each recipient.
|
|
|
|
Length of each field TBD.
|
|
|
|
KDF and encryption for cookie TBD.
|
|
|
|
- Inner Encrypted data (AEAD ChaCha/Poly1305)
|
|
|
|
Published timestamp is the nonce
|
|
|
|
Do we need HMAC or ChaCha only? Probably don't need HMAC, everything is signed.
|
|
|
|
KDF TBD. Used blinded public key. Uses cookie also if per-client.
|
|
|
|
When decrypted, the data for type 2 or 4, including the header,
|
|
|
|
but without the timestamp and expires fields?
|
|
|
|
- Signature (by blinded public key, length as implied by blinded sig type)
|
2018-09-18 12:53:39 +00:00
|
|
|
The signature is of everything above.
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
Notes
|
|
|
|
`````
|
|
|
|
- For multiple clients, encrypted format is probably like GPG/OpenPGP does.
|
|
|
|
Asymmetrically encrypt a symmetric key for each recipient. Data is decrypted
|
|
|
|
with that asymmetric key. See e.g. [RFC-4880-S5.1]_ IF we can find an
|
|
|
|
algorithm that's small and fast.
|
|
|
|
|
|
|
|
- Can we use a shortened version of our current ElGamal, which is 222 bytes
|
|
|
|
in and 514 bytes out? That's a little long for each record.
|
|
|
|
|
|
|
|
- For a single client, we could just ElG encrypt the whole leaseset, 514 bytes
|
|
|
|
isn't so bad.
|
|
|
|
|
|
|
|
- If we want to specify the encryption format in the clear, we could have an
|
|
|
|
identifier just before the encrypted data, or in the flags.
|
|
|
|
|
|
|
|
- A service using encrypted leasesets would publish the encrypted version to the
|
|
|
|
floodfills. However, for efficiency, it would send unencrypted leasesets to
|
|
|
|
clients in the wrapped garlic message, once authenticated (via whitelist, for
|
|
|
|
example).
|
|
|
|
|
|
|
|
- Floodfills may limit the max size to a reasonable value to prevent abuse.
|
|
|
|
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
Meta LS2
|
|
|
|
--------
|
|
|
|
|
|
|
|
This is used to replace multihoming. Like any leaseset, this is signed by the
|
|
|
|
creator. This is an authenticated list of destination hashes.
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
The Meta LS2 is the top of, and possibly intermediate nodes of,
|
|
|
|
a tree structure.
|
2016-04-10 06:49:58 +00:00
|
|
|
It contains a number of entries, each pointing to a LS, LS2, or another Meta LS2
|
|
|
|
to support massive multihoming.
|
2018-08-06 21:48:47 +00:00
|
|
|
A Meta LS2 may contain a mix of LS, LS2, and Meta LS2 entries.
|
|
|
|
The leaves of the tree are always a LS or LS2.
|
|
|
|
The tree is a DAG; loops are prohibited; clients doing lookups must detect and
|
|
|
|
refuse to follow loops.
|
|
|
|
|
|
|
|
A Meta LS2 may have a much longer expiration than a standard LS or LS2.
|
|
|
|
The top level may have an expiration hours or days after the publication date.
|
|
|
|
Maximum expiration time will be enforced by floodfills and clients, and is TBD.
|
|
|
|
|
|
|
|
The use case for Meta LS2 is massive multihoming, but with no more
|
|
|
|
protection for correlation of routers to leasesets (at router restart time) than
|
|
|
|
is provided now with LS or LS2.
|
|
|
|
This is equivalent to the "facebook" use case, which probably doesn't need
|
|
|
|
correlation protection. This use case probably needs offline keys,
|
|
|
|
which are provided in the standard header at each node of the tree.
|
|
|
|
|
|
|
|
The back-end protocol for coordination between the leaf routers, intermediate and master Meta LS signers
|
|
|
|
is not specified here. The requirements are extremely simple - just verify that the peer is up,
|
|
|
|
and publish a new LS every few hours. The only complexity is for picking new
|
|
|
|
publishers for the top-level or intermediate-level Meta LSes on failure.
|
|
|
|
|
|
|
|
Mix-and-match leasesets where leases from multiple routers are combined, signed, and published
|
|
|
|
in a single leaseset is documented in proposal 140, "invisible multihoming".
|
|
|
|
This proposal is untenable as written, because streaming connections would not be
|
2018-08-08 18:32:32 +00:00
|
|
|
"sticky" to a single router, see http://zzz.i2p/topics/2335 .
|
2018-08-06 21:48:47 +00:00
|
|
|
|
|
|
|
The back-end protocol, and interaction with router and client internals, would be
|
|
|
|
quite complex for invisible multihoming.
|
|
|
|
|
|
|
|
To avoid overloading the floodfill for the top-level Meta LS, the expiration should
|
|
|
|
be several hours at least. Clients must cache the top-level Meta LS, and persist
|
|
|
|
it across restarts if unexpired.
|
|
|
|
|
|
|
|
We need to define some algorithm for clients to traverse the tree, including fallbacks,
|
|
|
|
so that the usage is dispersed. Some function of hash distance and cost.
|
|
|
|
If a node has both LS or LS2 and Meta LS, we need to know when it's allowed
|
|
|
|
to use those leasesets, and when to keep traversing the tree.
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
Lookup with:
|
|
|
|
Standard LS flag (1)
|
|
|
|
Store with:
|
2018-09-18 12:53:39 +00:00
|
|
|
Meta LS2 type (7)
|
2018-08-06 21:48:47 +00:00
|
|
|
Store at:
|
|
|
|
Hash of destination, with daily rotation, as for LS 1
|
2016-04-10 06:49:58 +00:00
|
|
|
Typical expiration:
|
2018-10-13 14:35:09 +00:00
|
|
|
Hours. Max 18.2 hours (65535 seconds)
|
2016-04-10 06:49:58 +00:00
|
|
|
Published by:
|
2018-08-06 21:48:47 +00:00
|
|
|
"master" Destination or coordinator, or intermediate coordinators
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
Format
|
|
|
|
``````
|
|
|
|
::
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
Standard LS2 Header as specified above
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
Meta LS2 Type-Specific Part
|
2018-10-13 12:09:54 +00:00
|
|
|
- Properties (Mapping as specified in common structures spec, 2 zero bytes if none)
|
2018-08-06 21:48:47 +00:00
|
|
|
- Number of entries (1 byte) Maximum TBD
|
2018-10-13 11:32:11 +00:00
|
|
|
- Entries. Each entry contains: (40 bytes)
|
2016-04-10 06:49:58 +00:00
|
|
|
- Hash (32 bytes)
|
2018-10-13 11:32:11 +00:00
|
|
|
- Flags (3 bytes)
|
2018-08-06 21:48:47 +00:00
|
|
|
TBD. Set all to zero for compatibility with future uses.
|
2016-04-10 06:49:58 +00:00
|
|
|
- Cost (priority) (1 byte)
|
2018-10-13 14:35:09 +00:00
|
|
|
- Expires (4 bytes) (4 bytes, seconds since epoch, rolls over in 2106)
|
2018-08-06 21:48:47 +00:00
|
|
|
- Number of revocations (1 byte) Maximum TBD
|
2016-04-10 06:49:58 +00:00
|
|
|
- Revocations: Each revocation contains: (32 bytes)
|
|
|
|
- Hash (32 bytes)
|
|
|
|
|
|
|
|
Standard LS2 Signature:
|
|
|
|
- Signature (40+ bytes)
|
2018-09-18 12:53:39 +00:00
|
|
|
The signature is of everything above.
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
Flags and properties: for future use
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
Notes
|
|
|
|
`````
|
|
|
|
- A distributed service using this would have one or more "masters" with the
|
|
|
|
private key of the service destination. They would (out of band) determine the
|
|
|
|
current list of active destinations and would publish the Meta LS2. For
|
|
|
|
redundancy, multiple masters could multihome (i.e. concurrently publish) the
|
|
|
|
Meta LS2.
|
|
|
|
|
|
|
|
- A distributed service could start with a single destination or use old-style
|
|
|
|
multihoming, then transition to a Meta LS2. A standard LS lookup could return
|
|
|
|
any one of a LS, LS2, or Meta LS2.
|
|
|
|
|
|
|
|
- When a service uses a Meta LS2, it has no tunnels (leases).
|
|
|
|
|
|
|
|
|
|
|
|
Service Record
|
|
|
|
--------------
|
|
|
|
|
|
|
|
This is an individual record saying that a destination is participating in a
|
|
|
|
service. It is sent from the participant to the floodfill. It is not ever sent
|
|
|
|
individually by a floodfill, but only as a part of a Service List. The Service
|
|
|
|
Record is also used to revoke participation in a service, by setting the
|
|
|
|
expiration to zero.
|
|
|
|
|
|
|
|
This is not a LS2 but it uses the standard LS2 header and signature format.
|
|
|
|
|
|
|
|
Lookup with:
|
|
|
|
n/a, see Service List
|
|
|
|
Store with:
|
2018-09-18 12:53:39 +00:00
|
|
|
Service Record type (9)
|
2018-08-06 21:48:47 +00:00
|
|
|
Store at:
|
|
|
|
Hash of service name, with daily rotation
|
2016-04-10 06:49:58 +00:00
|
|
|
Typical expiration:
|
2018-10-13 14:35:09 +00:00
|
|
|
Hours. Max 18.2 hours (65535 seconds)
|
2016-04-10 06:49:58 +00:00
|
|
|
Published by:
|
|
|
|
Destination
|
|
|
|
|
|
|
|
Format
|
|
|
|
``````
|
|
|
|
::
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
Standard LS2 Header as specified above
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
Service Record Type-Specific Part
|
|
|
|
- Port (2 bytes) (0 if unspecified)
|
|
|
|
- Hash of service name (32 bytes)
|
|
|
|
|
|
|
|
Standard LS2 Signature:
|
|
|
|
- Signature (40+ bytes)
|
2018-09-18 12:53:39 +00:00
|
|
|
The signature is of everything above.
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
Notes
|
|
|
|
`````
|
|
|
|
- If expires is all zeros, the floodfill should revoke the record and no longer
|
|
|
|
include it in the service list.
|
|
|
|
|
|
|
|
- Storage: The floodfill may strictly throttle storage of these records and
|
|
|
|
limit the number of records stored per hash and their expiration. A whilelist
|
|
|
|
of hashes may also be used.
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
- Any other netdb type at the same hash has priority, so a service record can never
|
|
|
|
overwrite a LS/RI, but a LS/RI will overwrite all service records at that hash.
|
|
|
|
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
Service List
|
|
|
|
------------
|
|
|
|
|
|
|
|
This is nothing like a LS2 and uses a different format.
|
|
|
|
|
|
|
|
The service list is created and signed by the floodfill. It is unauthenticated
|
|
|
|
in that anybody can join a service by publishing a Service Record to a
|
|
|
|
floodfill.
|
|
|
|
|
|
|
|
A Service List contains Short Service Records, not full Service Records. These
|
|
|
|
contain signatures but only hashes, not full destinations, so they cannot be
|
|
|
|
verified without the full destination.
|
|
|
|
|
2018-08-06 21:48:47 +00:00
|
|
|
The security, if any, and desirability of service lists is TBD.
|
|
|
|
Floodfills could limit publication, and lookups, to a whitelist of services,
|
|
|
|
but that whitelist may vary based on implementation, or operator preference.
|
|
|
|
It may not be possible to achieve consensus on a common, base whitelist
|
|
|
|
across implementations.
|
|
|
|
|
|
|
|
If the service name is included in the service record above,
|
|
|
|
then floodfill operators may object; if only the hash is included,
|
|
|
|
there's no verification, and a service record could "get in" ahead of
|
|
|
|
any other netdb type and get stored in the floodfill.
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
Lookup with:
|
2018-09-18 12:53:39 +00:00
|
|
|
Service List lookup type (11)
|
2016-04-10 06:49:58 +00:00
|
|
|
Store with:
|
2018-09-18 12:53:39 +00:00
|
|
|
Service List type (11)
|
2018-08-06 21:48:47 +00:00
|
|
|
Store at:
|
|
|
|
Hash of service name, with daily rotation
|
2016-04-10 06:49:58 +00:00
|
|
|
Typical expiration:
|
|
|
|
Hours, not specified in the list itself, up to local policy
|
|
|
|
Published by:
|
|
|
|
Nobody, never sent to floodfill, never flooded.
|
|
|
|
|
|
|
|
Format
|
|
|
|
``````
|
2018-09-18 12:53:39 +00:00
|
|
|
Does NOT use the standard LS2 header specified above.
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
::
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
- Type (1 byte)
|
|
|
|
Not actually in header, but part of data covered by signature.
|
|
|
|
Take from field in Database Store Message.
|
|
|
|
TODO to be reviewed/decided.
|
2016-04-10 06:49:58 +00:00
|
|
|
- Hash of the service name (implicit, in the Database Store message)
|
|
|
|
- Hash of the Creator (floodfill) (32 bytes)
|
2018-08-06 21:48:47 +00:00
|
|
|
- Published timestamp (8 bytes)
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
- Number of Short Service Records (1 byte)
|
|
|
|
- List of Short Service Records:
|
|
|
|
Each Short Service Record contains (90+ bytes)
|
|
|
|
- Dest hash (32 bytes)
|
|
|
|
- Published timestamp (8 bytes)
|
|
|
|
- Expires (4 bytes) (offset from published in ms)
|
|
|
|
- Flags (2 bytes)
|
|
|
|
- Port (2 bytes)
|
|
|
|
- Sig length (2 bytes)
|
|
|
|
- Signature of dest (40+ bytes)
|
|
|
|
|
|
|
|
- Number of Revocation Records (1 byte)
|
|
|
|
- List of Revocation Records:
|
|
|
|
Each Revocation Record contains (86+ bytes)
|
|
|
|
- Dest hash (32 bytes)
|
|
|
|
- Published timestamp (8 bytes)
|
|
|
|
- Flags (2 bytes)
|
|
|
|
- Port (2 bytes)
|
|
|
|
- Sig length (2 bytes)
|
|
|
|
- Signature of dest (40+ bytes)
|
|
|
|
|
|
|
|
- Signature of floodfill (40+ bytes)
|
2018-09-18 12:53:39 +00:00
|
|
|
The signature is of everything above.
|
2016-04-10 06:49:58 +00:00
|
|
|
|
|
|
|
To verify signature of the Service List:
|
2016-04-11 02:08:41 +00:00
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
- prepend the hash of the service name
|
|
|
|
- remove the hash of the creator
|
|
|
|
- Check signature of the modified contents
|
|
|
|
|
|
|
|
To verify signature of each Short Service Record:
|
2016-04-11 02:08:41 +00:00
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
- Fetch destination
|
|
|
|
- Check signature of (published timestamp + expires + flags + port + Hash of
|
|
|
|
service name)
|
|
|
|
|
|
|
|
To verify signature of each Revocation Record:
|
2016-04-11 02:08:41 +00:00
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
- Fetch destination
|
|
|
|
- Check signature of (published timestamp + 4 zero bytes + flags + port + Hash
|
|
|
|
of service name)
|
|
|
|
|
|
|
|
Notes
|
|
|
|
`````
|
2018-08-08 18:32:32 +00:00
|
|
|
- We use signature length instead of sig type so we can support unknown signature
|
2016-04-10 06:49:58 +00:00
|
|
|
types.
|
|
|
|
|
|
|
|
- There is no expiration of a service list, recipients may make their own
|
|
|
|
decision based on policy or the expiration of the individual records.
|
|
|
|
|
|
|
|
- Service Lists are not flooded, only individual Service Records are. Each
|
|
|
|
floodfill creates, signs, and caches a Service List. The floodfill uses its
|
|
|
|
own policy for cache time and the maximum number of service and revocation
|
|
|
|
records.
|
|
|
|
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
|
|
|
|
Common Structures Spec Changes Required
|
|
|
|
=======================================
|
|
|
|
|
|
|
|
TODO
|
|
|
|
|
|
|
|
|
|
|
|
Key Certificates
|
|
|
|
----------------
|
|
|
|
|
|
|
|
Out of scope for this proposal.
|
|
|
|
Add to ECIES proposal.
|
|
|
|
|
|
|
|
|
|
|
|
Lease2
|
|
|
|
------
|
|
|
|
|
|
|
|
Add new structure with 4-byte expiration.
|
|
|
|
|
|
|
|
|
|
|
|
New NetDB Types
|
|
|
|
---------------
|
|
|
|
|
|
|
|
Incorporate from above.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Encryption Spec Changes Required
|
|
|
|
================================
|
|
|
|
|
|
|
|
Out of scope for this proposal.
|
|
|
|
Add to ECIES proposal.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
I2NP Changes Required
|
|
|
|
=====================
|
|
|
|
|
|
|
|
TODO
|
|
|
|
Add note: LS2 can only be published to floodfills with a minimum version.
|
|
|
|
|
|
|
|
|
|
|
|
Database Lookup Message
|
|
|
|
-----------------------
|
|
|
|
|
2018-10-12 23:16:34 +00:00
|
|
|
Add the service list lookup type.
|
|
|
|
|
|
|
|
Changes
|
|
|
|
```````
|
|
|
|
::
|
|
|
|
|
|
|
|
Flags byte: Lookup type field, currently bits 3-2, expands to bits 4-2.
|
|
|
|
Lookup type 0x04 is defined as the service list lookup.
|
|
|
|
|
|
|
|
Add note: Service list loookup may only be sent to floodfills with a minimum version.
|
|
|
|
Minimum version is 0.9.38.
|
2018-09-18 12:53:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
Database Store Message
|
|
|
|
----------------------
|
|
|
|
|
2018-10-12 23:16:34 +00:00
|
|
|
Add all the new store types.
|
|
|
|
|
|
|
|
Changes
|
|
|
|
```````
|
|
|
|
::
|
|
|
|
|
|
|
|
Type byte: Type field, currently bit 0, expands to bits 3-0.
|
|
|
|
Type 3 is defined as a LS2 store.
|
|
|
|
Type 5 is defined as a encrypted LS2 store.
|
|
|
|
Type 7 is defined as a meta LS2 store.
|
|
|
|
Type 9 is defined as a service record store.
|
|
|
|
Type 11 is defined as a service list store.
|
|
|
|
Other types are undefined and invalid.
|
|
|
|
|
|
|
|
Add note: All new types may only be published to floodfills with a minimum version.
|
|
|
|
Minimum version is 0.9.38.
|
2018-09-18 12:53:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
I2CP Changes Required
|
|
|
|
=====================
|
|
|
|
|
|
|
|
|
|
|
|
I2CP Options
|
|
|
|
------------
|
|
|
|
|
2018-10-12 23:16:34 +00:00
|
|
|
New options in SessionConfig Mapping:
|
|
|
|
|
|
|
|
::
|
2018-09-18 12:53:39 +00:00
|
|
|
|
2018-10-12 23:16:34 +00:00
|
|
|
crypto.encType=nnn The encryption type to be used.
|
|
|
|
0: ElGamal
|
|
|
|
Other values to be defined in future proposals.
|
|
|
|
i2cp.leaseSetType=nnn The type of leaseset to be sent in the Create Leaseset Message
|
|
|
|
Value is the same as the netdb store type in the table above.
|
2018-09-18 12:53:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2018-10-12 23:16:34 +00:00
|
|
|
Request Leaseset Message
|
|
|
|
------------------------
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
Router to client.
|
2018-10-12 23:16:34 +00:00
|
|
|
No changes.
|
|
|
|
The leases are sent with 8-byte timestamps, even if the
|
|
|
|
returned leaseset will be a LS2 with 4-byte timestamps.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Request Variable Leaseset Message
|
|
|
|
---------------------------------
|
|
|
|
|
|
|
|
Router to client.
|
|
|
|
No changes.
|
|
|
|
The leases are sent with 8-byte timestamps, even if the
|
|
|
|
returned leaseset will be a LS2 with 4-byte timestamps.
|
2018-09-18 12:53:39 +00:00
|
|
|
|
|
|
|
|
2018-10-13 15:19:38 +00:00
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
Create Leaseset Message
|
|
|
|
-----------------------
|
|
|
|
|
|
|
|
Client to router.
|
2018-10-12 23:16:34 +00:00
|
|
|
Private key type and length are specified in the SessionConfig crypto.encType option.
|
|
|
|
Leaseset type is as specified in the SessionConfig i2cp.leaseSetType option.
|
|
|
|
Minimum router version is 0.9.38.
|
2018-09-18 12:53:39 +00:00
|
|
|
|
|
|
|
|
2018-10-13 15:19:38 +00:00
|
|
|
|
|
|
|
Host Reply Message
|
|
|
|
------------------
|
|
|
|
|
|
|
|
Router to client.
|
|
|
|
|
|
|
|
A client doesn't know a priori that a given Hash will resolve
|
|
|
|
to a Meta LS.
|
|
|
|
|
|
|
|
If a Host Lookup Message for a Hash yields a Meta LS,
|
|
|
|
the router needs to return one or more Destinations and expirations to the client.
|
|
|
|
Either the client must to the recursive resolution, or the router can do it.
|
|
|
|
Not clear how it should work.
|
|
|
|
For either method, we either need a new flavor of the Host Reply Message,
|
|
|
|
or define a new result code that means what follows is a list of Destinations
|
|
|
|
and expirations.
|
|
|
|
|
|
|
|
If the router simply returns a single Destination whose Hash doesn't match
|
|
|
|
that of the lookup, it may fail sanity checks on the client side,
|
|
|
|
and the client has no way to get an alternate if that fails,
|
|
|
|
and has no way to know the expiration time.
|
|
|
|
|
|
|
|
Minimum client version is 0.9.38.
|
|
|
|
|
|
|
|
There may be similar issues in BOB and SAM.
|
|
|
|
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
Changes to support Meta
|
|
|
|
-----------------------
|
|
|
|
|
|
|
|
How to generate and support Meta, including inter-router communication and coordination,
|
|
|
|
is out of scope for this proposal.
|
|
|
|
Support may be added to I2CP, or i2pcontrol, or a new protocol.
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-10-13 15:19:38 +00:00
|
|
|
SAM Changes Required
|
|
|
|
====================
|
|
|
|
|
|
|
|
TBD. See I2CP Host Reply Message section above.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOB Changes Required
|
|
|
|
====================
|
|
|
|
|
|
|
|
TBD. See I2CP Host Reply Message section above.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
Publishing, Migration, Compatibility
|
|
|
|
====================================
|
|
|
|
|
2018-10-13 15:19:38 +00:00
|
|
|
LS2 (other than encrypted LS2) is published at the same DHT location as LS1.
|
2018-09-18 12:53:39 +00:00
|
|
|
There is no way to publish both a LS1 and LS2, unless LS2 were at a different location.
|
|
|
|
|
2018-10-13 15:19:38 +00:00
|
|
|
Encrypted LS2 is published at the hash of the blinded key type and key data,
|
|
|
|
with daily rotation as usual.
|
|
|
|
|
2018-09-18 12:53:39 +00:00
|
|
|
LS2 would only be used when new features are required
|
|
|
|
(new crypto, encrypted LS, meta, etc.).
|
|
|
|
LS2 can only be published to floodfills of a specified version or higher.
|
|
|
|
|
|
|
|
Servers publishing LS2 would know that any connecting clients support LS2.
|
|
|
|
They could send LS2 in the garlic.
|
|
|
|
|
|
|
|
Clients would send LS2 in garlics only if using new crypto.
|
|
|
|
Shared clients would use LS1 indefinitely?
|
|
|
|
TODO: How to have a shared clients that supports both old and new crypto?
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-04-10 06:49:58 +00:00
|
|
|
References
|
|
|
|
==========
|
|
|
|
|
|
|
|
.. [RFC-4880-S5.1]
|
|
|
|
https://tools.ietf.org/html/rfc4880#section-5.1
|