{% extends "global/layout.html" %} {% block title %}{% trans %}Common structure Specification{% endtrans %}{% endblock %} {% block lastupdated %}{% trans %}June 2013{% endtrans %}{% endblock %} {% block accuratefor %}0.9.6{% endblock %} {% block content %}

{% trans %}Data types Specification{% endtrans %}

{% trans i2np=site_url('docs/protocol/i2np'), i2cp=site_url('docs/protocol/i2cp'), ssu=site_url('docs/transport/ssu') -%} This document describes some data types common to all I2P protocols, like I2NP, I2CP, SSU, etc. {%- endtrans %}

Integer

{% trans %}Description{% endtrans %}

{% trans -%} Represents a non-negative integer. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 1 to 8 bytes in network byte order representing an unsigned integer {% endtrans %}

Date

{% trans %}Description{% endtrans %}

{% trans -%} The number of milliseconds since midnight on January 1, 1970 in the GMT timezone. If the number is 0, the date is undefined or null. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 8 byte Integer {% endtrans %}

String

{% trans %}Description{% endtrans %}

{% trans -%} Represents a UTF-8 encoded string. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 1 or more bytes where the first byte is the number of bytes (not characters!) in the string and the remaining 0-255 bytes are the non-null terminated UTF-8 encoded character array. Length limit is 255 bytes (not characters). Length may be 0. {% endtrans %}

Boolean

{% trans %}Description{% endtrans %}

{% trans -%} A boolean value, supporting null/unknown representation 0=false, 1=true, 2=unknown/null {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 1 byte Integer {% endtrans %}

{% trans %}Notes{% endtrans %}

{% trans -%} Deprecated - unused {% endtrans %}

PublicKey

{% trans %}Description{% endtrans %}

{% trans cryptography=site_url('docs/how/cryptography') -%} This structure is used in ElGamal encryption, representing only the exponent, not the primes, which are constant and defined in the cryptography specification. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 256 bytes {% endtrans %}

Javadoc

PrivateKey

{% trans %}Description{% endtrans %}

{% trans cryptography=site_url('docs/how/cryptography') -%} This structure is used in ElGamal decryption, representing only the exponent, not the primes which are constant and defined in the cryptography specification. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 256 bytes {% endtrans %}

Javadoc

SessionKey

{% trans %}Description{% endtrans %}

{% trans -%} This structure is used for AES256 encryption and decryption. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 32 bytes {% endtrans %}

Javadoc

SigningPublicKey

{% trans %}Description{% endtrans %}

{% trans cryptography=site_url('docs/how/cryptography') -%} This structure is used for verifying DSA signatures. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 128 bytes {% endtrans %}

Javadoc

SigningPrivateKey

{% trans %}Description{% endtrans %}

{% trans cryptography=site_url('docs/how/cryptography') -%} This structure is used for creating DSA signatures. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 20 bytes {% endtrans %}

Javadoc

Signature

{% trans %}Description{% endtrans %}

{% trans cryptography=site_url('docs/how/cryptography') -%} This structure represents the DSA signature of some data. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 40 bytes {% endtrans %}

Javadoc

Hash

{% trans %}Description{% endtrans %}

{% trans -%} Represents the SHA256 of some data. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 32 bytes {% endtrans %}

Javadoc

Session Tag

{% trans %}Description{% endtrans %}

{% trans -%} A random number {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 32 bytes {% endtrans %}

Javadoc

TunnelId

{% trans %}Description{% endtrans %}

{% trans -%} Defines an identifier that is unique to each router in a tunnel. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 4 byte Integer {% endtrans %}

Javadoc

Certificate

{% trans %}Description{% endtrans %}

{% trans -%} A certificate is a container for various receipts or proof of works used throughout the I2P network. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 1 byte Integer specifying certificate type, followed by a 2 Integer specifying the size of the certificate payload, then that many bytes. {% endtrans %}

{% highlight lang='dataspec' %} +----+----+----+----+----+-// |type| length | payload +----+----+----+----+----+-// type :: Integer length -> 1 byte case 0 -> NULL case 1 -> HASHCASH case 2 -> HIDDEN case 3 -> SIGNED case 4 -> MULTIPLE length :: Integer length -> 2 bytes payload :: data length -> $length bytes {% endhighlight %}

{% trans %}Notes{% endtrans %}

Javadoc

Mapping

{% trans %}Description{% endtrans %}

{% trans -%} A set of key/value mappings or properties {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} A 2-byte size Integer followed by a series of String=String; pairs {% endtrans %}

{% highlight lang='dataspec' %} +----+----+----+----+----+----+----+----+ | size |key_string (len + data) | = | +----+----+----+----+----+----+----+----+ | val_string (len + data) | ; | ... +----+----+----+----+----+----+----+ size :: Integer length -> 2 bytes Total number of bytes that follow key_string :: String A string (one byte length followed by UTF-8 encoded characters) = :: A single byte containing '=' val_string :: String A string (one byte length followed by UTF-8 encoded characters) ; :: A single byte containing ';' {% endhighlight %}

{% trans %}Notes{% endtrans %}

Javadoc

{% trans %}Common structure specification{% endtrans %}

RouterIdentity

{% trans %}Description{% endtrans %}

{% trans -%} Defines the way to uniquely identify a particular router {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} PublicKey followed by SigningPublicKey and then a Certificate {% endtrans %}

{% highlight lang='dataspec' %} +----+----+----+----+----+----+----+----+ | public_key | + + | | ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | signing_key | + + | | ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | certificate | +----+----+----+-// public_key :: PublicKey length -> 256 bytes signing_key :: SigningPublicKey length -> 128 bytes certificate :: Certificate length -> >= 3 bytes total length: 387+ bytes {% endhighlight %}

{% trans %}Notes{% endtrans %}

{% trans -%} The certificate for a RouterIdentity is currently unused and is always NULL. {%- endtrans %}

Javadoc

Destination

{% trans %}Description{% endtrans %}

{% trans -%} A Destination defines a particular endpoint to which messages can be directed for secure delivery. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} PublicKey followed by a SigningPublicKey and then a Certificate {% endtrans %}

{% highlight lang='dataspec' %} +----+----+----+----+----+----+----+----+ | public_key | + + | | ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | signing_public_key | + + | | ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | certificate +-// public_key :: PublicKey length -> 256 bytes signing_public_key :: SigningPublicKey length -> 128 bytes certificate :: Certificate length -> >= 3 bytes total length: 387+ bytes {% endhighlight %}

Javadoc

Lease

{% trans %}Description{% endtrans %}

{% trans -%} Defines the authorization for a particular tunnel to receive messages targeting a Destination. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} SHA256 Hash of the RouterIdentity of the gateway router, then the TunnelId, and finally an end Date {% endtrans %}

{% highlight lang='dataspec' %} +----+----+----+----+----+----+----+----+ | tunnel_gw | + + | | + + | | + + | | +----+----+----+----+----+----+----+----+ | tunnel_id | end_date +----+----+----+----+----+----+----+----+ | +----+----+----+----+ tunnel_gw :: Hash of the RouterIdentity of the tunnel gateway length -> >= 32 bytes tunnel_id :: TunnelId length -> 4 bytes end_date :: Date length -> 8 bytes {% endhighlight %}

{% trans %}Notes{% endtrans %}

Javadoc

LeaseSet

{% trans %}Description{% endtrans %}

{% trans -%} Contains all of the currently authorized Leases for a particular Destination, the PublicKey to which garlic messages can be encrypted, and then the public key that can be used to revoke this particular version of the structure. The LeaseSet is one of the two structures stored in the network database( the other being RouterInfo), and is keyed under the SHA256 of the contained Destination. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} Destination, followed by a PublicKey for encryption, then a SigningPublicKey which can be used to revoke this version of the LeaseSet, then a 1 byte Integer specifying how many Lease structures are in the set, followed by the actual Lease structures and finally a Signature of the previous bytes signed by the Destination's SigningPrivateKey {%- endtrans %}

{% highlight lang='dataspec' %} +----+----+----+----+----+----+----+----+ | destination | + + | | ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | encryption_key | + + | | ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | signing_key | + + | | ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ |num | Lease 0 | +----+ + | | ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | Lease 1 | + + | | ~ ~ ~ ~ ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | Lease ($num-1) | + + | | ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | signature | + + | | + + | | + + | | + + | | +----+----+----+----+----+----+----+----+ destination :: Destination length -> >= 387 bytes encryption_key :: PublicKey length -> 256 bytes signing_key :: SigningPublicKey length -> 128 bytes num :: Integer length -> 1 byte value: 0 <= num <= 16 leases :: [Lease] length -> >= $num*44 bytes signature :: Signature length -> 40 bytes {% endhighlight %}

{% trans %}Notes{% endtrans %}

Javadoc

RouterAddress

{% trans %}Description{% endtrans %}

{% trans -%} This structure defines the means to contact a router through a transport protocol. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} 1 byte Integer defining the relative cost of using the address, where 0 is free and 255 is expensive, followed by the expiration Date after which the address should not be used, or if null, the address never expires. After that comes a String defining the transport protocol this router address uses. Finally there is a Mapping containing all of the transport specific options necessary to establish the connection, such as IP address, port number, email address, URL, etc. {% endtrans %}

{% highlight lang='dataspec' %} +----+ |cost| +----+----+----+----+----+----+----+----+ | expiration | +----+----+----+----+-//-+----+----+----+ | transport_style | +----+----+----+----+-//-+----+----+----+ | options | +----+----+----+----+-//-+----+----+----+ cost :: Integer length -> 1 byte case 0 -> free case 255 -> expensive expiration :: Date length -> 8 bytes case null -> never expires transport_style :: String length -> 1-256 bytes options :: Mapping {% endhighlight %}

{% trans %}Notes{% endtrans %}

Javadoc

RouterInfo

{% trans %}Description{% endtrans %}

{% trans -%} Defines all of the data that a router wants to publish for the network to see. The RouterInfo is one of two structures stored in the network database(the other being LeaseSet, and is keyed under the SHA256 of the contained RouterIdentity. {% endtrans %}

{% trans %}Contents{% endtrans %}

{% trans -%} RouterIdentity followed by the Date, when the entry was published {% endtrans %}

{% highlight lang='dataspec' %} +----+----+----+----+----+----+----+----+ | router_ident | + + | | ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | published | +----+----+----+----+----+----+----+----+ |size| RouterAddress 0 | +----+ + | | ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | RouterAddress 1 | + + | | ~ ~ ~ ~ ~ ~ ~ ~ | | +----+----+----+----+----+----+----+----+ | RouterAddress ($size-1) | + + | | ~ ~ ~ ~ | | +----+----+----+----+-//-+----+----+----+ |psiz| options | +----+----+----+----+-//-+----+----+----+ | signature | + + | | + + | | + + | | + + | | +----+----+----+----+----+----+----+----+ router_ident :: RouterIdentity length -> >= 387 bytes published :: Date length -> 8 bytes size :: Integer length -> 1 byte addresses :: [RouterAddress] length -> >= $size*267 bytes peer_size :: Integer length -> 1 byte value -> 0 options :: Mapping signature :: Signature length -> 40 bytes {% endhighlight %}

{% trans %}Notes{% endtrans %}

{% trans -%} The peer_size Integer may be followed by a list of that many router hashes. This is currently unused. It was intended for a form of restricted routes, which is unimplemented. {% endtrans %}

{% trans -%} The signature may be verified using the signing public key of the router_ident. {% endtrans %}

Javadoc

Delivery Instructions

{% trans tunnelmessage=site_url('docs/spec/tunnel-message') -%} Defined in the Tunnel Message Specification. {% endtrans %}

{% endblock %}