Данный документ описывает некоторые типы данных, общие для всех протоколов I2P, таких как I2NP , I2CP , SSU и других.
Спецификация общих типов
Целое число
Описание
Представляет неотрицательное целое число.
Содержание
От 1 до 8 байт в сетевом порядке байт (big endian), представляющие беззнаковое целое число.
Дата
Описание
Количество миллисекунд с полуночи 1 января 1970 года по часовому поясу GMT. Если число равно 0, дата не определена или равна null.
Содержание
8-байтовое целое число
Строка
Описание
Представляет строку в кодировке UTF-8.
Содержание
1 или более байт, где первый байт — это количество байт (не символов!) в строке, а остальные 0-255 байт представляют собой массив символов в кодировке UTF-8 без null-терминатора. Ограничение длины составляет 255 байт (не символов). Длина может быть 0.
PublicKey
Описание
Эта структура используется в ElGamal или другом асимметричном шифровании, представляя только показатель степени, а не простые числа, которые являются константами и определены в спецификации криптографии ELGAMAL . Другие схемы шифрования находятся в процессе определения, см. таблицу ниже.
Содержание
Тип и длина ключа выводятся из контекста или указываются в сертификате ключа Destination или RouterInfo, или в полях LeaseSet2 или другой структуры данных. По умолчанию используется тип ElGamal. Начиная с версии 0.9.38, другие типы могут поддерживаться в зависимости от контекста. Ключи представлены в формате big-endian, если не указано иное.
Ключи X25519 поддерживаются в Destinations и LeaseSet2 начиная с версии 0.9.44. Ключи X25519 поддерживаются в RouterIdentities начиная с версии 0.9.48.
| Type | Length (bytes) | Since | Usage |
|---|---|---|---|
| ElGamal | 256 | Deprecated for Router Identities as of 0.9.58; use for Destinations, as the public key field is unused there; discouraged for leasesets | |
| P256 | 64 | TBD | Reserved, see proposal 145 |
| P384 | 96 | TBD | Reserved, see proposal 145 |
| P521 | 132 | TBD | Reserved, see proposal 145 |
| X25519 | 32 | 0.9.38 | Little-endian. See ECIES and ECIES-ROUTERS |
| MLKEM512_X25519 | 32 | 0.9.67 | See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations |
| MLKEM768_X25519 | 32 | 0.9.67 | See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations |
| MLKEM1024_X25519 | 32 | 0.9.67 | See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations |
| MLKEM512 | 800 | 0.9.67 | See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations |
| MLKEM768 | 1184 | 0.9.67 | See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations |
| MLKEM1024 | 1568 | 0.9.67 | See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations |
| MLKEM512_CT | 768 | 0.9.67 | See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations |
| MLKEM768_CT | 1088 | 0.9.67 | See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations |
| MLKEM1024_CT | 1568 | 0.9.67 | See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations |
PrivateKey
Описание
Эта структура используется в ElGamal или другой асимметричной расшифровке, представляя только экспоненту, а не простые числа, которые являются константами и определены в спецификации криптографии ELGAMAL . Другие схемы шифрования находятся в процессе определения, см. таблицу ниже.
Содержание
Тип и длина ключа определяются из контекста или хранятся отдельно в структуре данных или файле приватного ключа. Тип по умолчанию — ElGamal. Начиная с версии 0.9.38 могут поддерживаться другие типы в зависимости от контекста. Ключи имеют формат big-endian, если не указано иное.
| Type | Length (bytes) | Since | Usage |
|---|---|---|---|
| ElGamal | 256 | Deprecated for Router Identities as of 0.9.58; use for Destinations, as the public key field is unused there; discouraged for leasesets | |
| P256 | 32 | TBD | Reserved, see proposal 145 |
| P384 | 48 | TBD | Reserved, see proposal 145 |
| P521 | 66 | TBD | Reserved, see proposal 145 |
| X25519 | 32 | 0.9.38 | Little-endian. See ECIES and ECIES-ROUTERS |
| MLKEM512_X25519 | 32 | 0.9.67 | See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations |
| MLKEM768_X25519 | 32 | 0.9.67 | See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations |
| MLKEM1024_X25519 | 32 | 0.9.67 | See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations |
| MLKEM512 | 1632 | 0.9.67 | See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations |
| MLKEM768 | 2400 | 0.9.67 | See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations |
| MLKEM1024 | 3168 | 0.9.67 | See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations |
SessionKey
Описание
Эта структура используется для симметричного шифрования и расшифрования AES256.
Содержание
32 байта
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/SessionKey.html
SigningPublicKey
Описание
Эта структура используется для проверки подписей.
Содержание
Тип и длина ключа выводятся из контекста или указываются в Key Certificate назначения. Тип по умолчанию — DSA_SHA1. Начиная с версии 0.9.12, в зависимости от контекста могут поддерживаться другие типы.
| Type | Length (bytes) | Since | Usage |
|---|---|---|---|
| DSA_SHA1 | 128 | Deprecated for Router Identities as of 09.58; discouraged for Destinations | |
| ECDSA_SHA256_P256 | 64 | 0.9.12 | Deprecated Older Destinations |
| ECDSA_SHA384_P384 | 96 | 0.9.12 | Deprecated Rarely used for Destinations |
| ECDSA_SHA512_P521 | 132 | 0.9.12 | Deprecated Rarely used for Destinations |
| RSA_SHA256_2048 | 256 | 0.9.12 | Deprecated Offline signing, never used for Router Identities or Destinations |
| RSA_SHA384_3072 | 384 | 0.9.12 | Deprecated Offline signing, never used for Router Identities or Destinations |
| RSA_SHA512_4096 | 512 | 0.9.12 | Offline signing, never used for Router Identities or Destinations |
| EdDSA_SHA512_Ed25519 | 32 | 0.9.15 | Recent Router Identities and Destinations |
| EdDSA_SHA512_Ed25519ph | 32 | 0.9.25 | Offline signing, never used for Router Identities or Destinations |
| RedDSA_SHA512_Ed25519 | 32 | 0.9.39 | For Destinations and encrypted leasesets only, never used for Router Identities |
Когда ключ состоит из двух элементов (например, точки X,Y), он сериализуется путем дополнения каждого элемента до length/2 ведущими нулями при необходимости.
Все типы имеют формат Big Endian, за исключением EdDSA и RedDSA, которые хранятся и передаются в формате Little Endian.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/SigningPublicKey.html
SigningPrivateKey
Описание
Эта структура используется для создания подписей.
Содержание
Тип и длина ключа указываются при создании. Тип по умолчанию — DSA_SHA1. Начиная с релиза 0.9.12, могут поддерживаться другие типы, в зависимости от контекста.
| Type | Length (bytes) | Since | Usage |
|---|---|---|---|
| DSA_SHA1 | 20 | Deprecated for Router Identities as of 09.58; discouraged for Destinations | |
| ECDSA_SHA256_P256 | 32 | 0.9.12 | Deprecated Older Destinations |
| ECDSA_SHA384_P384 | 48 | 0.9.12 | Deprecated Rarely used for Destinations |
| ECDSA_SHA512_P521 | 66 | 0.9.12 | Deprecated Rarely used for Destinations |
| RSA_SHA256_2048 | 512 | 0.9.12 | Deprecated Offline signing, never used for Router Identities or Destinations |
| RSA_SHA384_3072 | 768 | 0.9.12 | Deprecated Offline signing, never used for Router Identities or Destinations |
| RSA_SHA512_4096 | 1024 | 0.9.12 | Offline signing, never used for Router Identities or Destinations |
| EdDSA_SHA512_Ed25519 | 32 | 0.9.15 | Recent Router Identities and Destinations |
| EdDSA_SHA512_Ed25519ph | 32 | 0.9.25 | Offline signing, never used for Router Identities or Destinations |
| RedDSA_SHA512_Ed25519 | 32 | 0.9.39 | For Destinations and encrypted leasesets only, never used for Router Identities |
Когда ключ состоит из двух элементов (например, точки X,Y), он сериализуется путем дополнения каждого элемента до длины/2 ведущими нулями при необходимости.
Все типы используют порядок байтов Big Endian, за исключением EdDSA и RedDSA, которые хранятся и передаются в формате Little Endian.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/SigningPrivateKey.html
Подпись
Описание
Эта структура представляет подпись некоторых данных.
Содержание
Тип и длина подписи определяются исходя из типа используемого ключа. По умолчанию используется тип DSA_SHA1. Начиная с версии 0.9.12, могут поддерживаться другие типы, в зависимости от контекста.
| Type | Length (bytes) | Since | Usage |
|---|---|---|---|
| DSA_SHA1 | 40 | Deprecated for Router Identities as of 09.58; discouraged for Destinations | |
| ECDSA_SHA256_P256 | 64 | 0.9.12 | Deprecated Older Destinations |
| ECDSA_SHA384_P384 | 96 | 0.9.12 | Deprecated Rarely used for Destinations |
| ECDSA_SHA512_P521 | 132 | 0.9.12 | Deprecated Rarely used for Destinations |
| RSA_SHA256_2048 | 256 | 0.9.12 | Deprecated Offline signing, never used for Router Identities or Destinations |
| RSA_SHA384_3072 | 384 | 0.9.12 | Deprecated Offline signing, never used for Router Identities or Destinations |
| RSA_SHA512_4096 | 512 | 0.9.12 | Offline signing, never used for Router Identities or Destinations |
| EdDSA_SHA512_Ed25519 | 64 | 0.9.15 | Recent Router Identities and Destinations |
| EdDSA_SHA512_Ed25519ph | 64 | 0.9.25 | Offline signing, never used for Router Identities or Destinations |
| RedDSA_SHA512_Ed25519 | 64 | 0.9.39 | For Destinations and encrypted leasesets only, never used for Router Identities |
Когда подпись состоит из двух элементов (например, значения R,S), она сериализуется путем дополнения каждого элемента до длины/2 ведущими нулями при необходимости.
Все типы используют формат Big Endian, за исключением EdDSA и RedDSA, которые хранятся и передаются в формате Little Endian.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/Signature.html
Хеш
Описание
Представляет SHA256 некоторых данных.
Содержание
32 байта
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/Hash.html
Тег сессии
Примечание: Session Tags для ECIES-X25519 назначений (ratchet) и ECIES-X25519 router’ов составляют 8 байт. См. ECIES и ECIES-ROUTERS .
Описание
Случайное число
Содержание
32 байта
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/SessionTag.html
TunnelId
Описание
Определяет идентификатор, который уникален для каждого router в tunnel. Tunnel ID обычно больше нуля; не используйте значение ноль, за исключением особых случаев.
Содержание
4-байтовое целое число
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/TunnelId.html
Сертификат
Описание
Сертификат — это контейнер для различных квитанций или доказательств работы, используемых в сети I2P.
Содержание
1 байт Integer , указывающий тип сертификата, за которым следует 2-байтовый Integer , указывающий размер полезной нагрузки сертификата, затем соответствующее количество байт.
+----+----+----+----+----+-/
|type| length | payload
+----+----+----+----+----+-/
type :: Integer
length -> 1 byte
length :: Integer
length -> 2 bytes
payload :: data
length -> $length bytes
Примечания
Для Router Identities сертификат всегда равен NULL до версии 0.9.15 включительно. Начиная с версии 0.9.16 используется Key Certificate для указания типов ключей. Начиная с версии 0.9.48 разрешены типы открытых ключей шифрования X25519. См. ниже.
Для Garlic Cloves сертификат всегда NULL, другие в настоящее время не реализованы.
Для Garlic Messages , сертификат всегда равен NULL, другие в настоящее время не реализованы.
Для Destinations , Certificate может быть не равен NULL. Начиная с версии 0.9.12, может использоваться Key Certificate для указания типа открытого ключа подписи. См. ниже.
Разработчикам рекомендуется запрещать избыточные данные в сертификатах. Должна обеспечиваться соответствующая длина для каждого типа сертификата.
Типы сертификатов
Определены следующие типы сертификатов:
| Type | Type Code | Payload Length | Total Length | Notes |
|---|---|---|---|---|
| Null | 0 | 0 | 3 | |
| HashCash | 1 | varies | varies | Deprecated, unused. Payload contains an ASCII colon-separated hashcash string. |
| Hidden | 2 | 0 | 3 | Deprecated, unused. Hidden routers generally do not announce that they are hidden. |
| Signed | 3 | 40 or 72 | 43 or 75 | Deprecated, unused. Payload contains a 40-byte DSA signature, optionally followed by the 32-byte Hash of the signing Destination. |
| Multiple | 4 | varies | varies | Deprecated, unused. Payload contains multiple certificates. |
| Key | 5 | 4+ | 7+ | Since 0.9.12. See below for details. |
Сертификаты ключей были введены в релизе 0.9.12. До этого релиза все PublicKeys были 256-байтными ключами ElGamal, а все SigningPublicKeys были 128-байтными ключами DSA-SHA1. Сертификат ключа предоставляет механизм для указания типа PublicKey и SigningPublicKey в Destination или RouterIdentity, а также для упаковки любых данных ключа, превышающих стандартные длины.
Поддерживая ровно 384 байта перед сертификатом и помещая любые избыточные ключевые данные внутрь сертификата, мы сохраняем совместимость с любым программным обеспечением, которое анализирует Destinations и Router Identities.
Полезная нагрузка ключевого сертификата содержит:
| Data | Length |
|---|---|
| Signing Public Key Type (Integer) | 2 |
| Crypto Public Key Type (Integer) | 2 |
| Excess Signing Public Key Data | 0+ |
| Excess Crypto Public Key Data | 0+ |
Определенные типы открытых ключей подписи:
| Type | Type Code | Total Public Key Length | Since | Usage |
|---|---|---|---|---|
| DSA_SHA1 | 0 | 128 | 0.9.12 | Deprecated for Router Identities as of 0.9.58; discouraged for Destinations |
| ECDSA_SHA256_P256 | 1 | 64 | 0.9.12 | Deprecated Older Destinations |
| ECDSA_SHA384_P384 | 2 | 96 | 0.9.12 | Deprecated Rarely if ever used for Destinations |
| ECDSA_SHA512_P521 | 3 | 132 | 0.9.12 | Deprecated Rarely if ever used for Destinations |
| RSA_SHA256_2048 | 4 | 256 | 0.9.12 | Deprecated Offline only; never used in Key Certificates for Router Identities or Destinations |
| RSA_SHA384_3072 | 5 | 384 | 0.9.12 | Deprecated Offline only; never used in Key Certificates for Router Identities or Destinations |
| RSA_SHA512_4096 | 6 | 512 | 0.9.12 | Offline only; never used in Key Certificates for Router Identities or Destinations |
| EdDSA_SHA512_Ed25519 | 7 | 32 | 0.9.15 | Recent Router Identities and Destinations |
| EdDSA_SHA512_Ed25519ph | 8 | 32 | 0.9.25 | Offline only; never used in Key Certificates for Router Identities or Destinations |
| reserved (GOST) | 9 | 64 | Reserved, see Prop134 | |
| reserved (GOST) | 10 | 128 | Reserved, see Prop134 | |
| RedDSA_SHA512_Ed25519 | 11 | 32 | 0.9.39 | For Destinations and encrypted leasesets only; never used for Router Identities |
| reserved (MLDSA) | 12 | Reserved, see Prop169 | ||
| reserved (MLDSA) | 13 | Reserved, see Prop169 | ||
| reserved (MLDSA) | 14 | Reserved, see Prop169 | ||
| reserved (MLDSA) | 15 | Reserved, see Prop169 | ||
| reserved (MLDSA) | 16 | Reserved, see Prop169 | ||
| reserved (MLDSA) | 17 | Reserved, see Prop169 | ||
| reserved (MLDSA) | 18 | Reserved, see Prop169 | ||
| reserved (MLDSA) | 19 | Reserved, see Prop169 | ||
| reserved (MLDSA) | 20 | Reserved, see Prop169 | ||
| reserved | 65280-65534 | Reserved for experimental use | ||
| reserved | 65535 | Reserved for future expansion |
| Type | Type Code | Total Public Key Length | Since | Usage |
|---|---|---|---|---|
| ElGamal | 0 | 256 | Deprecated for Router Identities as of 0.9.58; use for Destinations, as the public key field is unused there | |
| P256 | 1 | 64 | Reserved, see proposal 145 | |
| P384 | 2 | 96 | Reserved, see proposal 145 | |
| P521 | 3 | 132 | Reserved, see proposal 145 | |
| X25519 | 4 | 32 | 0.9.38 | See ECIES and proposal 156 |
| MLKEM512_X25519 | 5 | 32 | 0.9.67 | See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations |
| MLKEM768_X25519 | 6 | 32 | 0.9.67 | See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations |
| MLKEM1024_X25519 | 7 | 32 | 0.9.67 | See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations |
| reserved (NONE) | 255 | Reserved, see Prop169 | ||
| reserved | 65280-65534 | Reserved for experimental use | ||
| reserved | 65535 | Reserved for future expansion |
Полный или первая часть криптографического публичного ключа
Случайное заполнение, если общая длина двух ключей составляет менее 384 байт
Полный или первая часть открытого ключа подписи
Crypto Public Key выравнивается в начале, а Signing Public Key выравнивается в конце. Заполнение (если есть) находится посередине. Длины и границы данных исходного ключа, заполнения и части избыточных данных ключа в сертификатах не указываются явно, а выводятся из длин указанных типов ключей. Если общая длина Crypto и Signing Public Keys превышает 384 байта, остаток будет содержаться в Key Certificate. Если длина Crypto Public Key не составляет 256 байт, метод определения границы между двумя ключами будет указан в будущей редакции этого документа.
Примеры схем размещения с использованием криптографического открытого ключа ElGamal и указанным типом открытого ключа для подписи:
| Signing Key Type | Padding Length | Excess Signing Key Data in Cert |
|---|---|---|
| DSA_SHA1 | 0 | 0 |
| ECDSA_SHA256_P256 | 64 | 0 |
| ECDSA_SHA384_P384 | 32 | 0 |
| ECDSA_SHA512_P521 | 0 | 4 |
| RSA_SHA256_2048 | 0 | 128 |
| RSA_SHA384_3072 | 0 | 256 |
| RSA_SHA512_4096 | 0 | 384 |
| EdDSA_SHA512_Ed25519 | 96 | 0 |
| EdDSA_SHA512_Ed25519ph | 96 | 0 |
Примечания
Разработчикам рекомендуется запретить избыточные данные в Key Certificates. Должна обеспечиваться соответствующая длина для каждого типа сертификата.
KEY сертификат с типами 0,0 (ElGamal,DSA_SHA1) разрешен, но не рекомендуется. Он недостаточно протестирован и может вызывать проблемы в некоторых реализациях. Используйте NULL сертификат в каноническом представлении (ElGamal,DSA_SHA1) Destination или RouterIdentity, который будет на 4 байта короче чем при использовании KEY сертификата.
Сопоставление
Описание
Набор сопоставлений ключ/значение или свойств
Содержание
2-байтовое целое число размера, за которым следует серия пар String=String;.
ПРЕДУПРЕЖДЕНИЕ: Большинство случаев использования Mapping находятся в подписанных структурах, где записи Mapping должны быть отсортированы по ключу, чтобы подпись была неизменяемой. Неспособность отсортировать по ключу приведет к сбоям подписи!
+----+----+----+----+----+----+----+----+
| 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 ';'
Примечания
Кодирование неоптимально - нам нужны либо символы ‘=’ и ‘;’, либо длины строк, но не то и другое одновременно
В некоторой документации говорится, что строки могут не включать ‘=’ или ‘;’, но эта кодировка их поддерживает
Строки определены как UTF-8, но в текущей реализации I2CP использует UTF-8, а I2NP — нет. Например, UTF-8 строки в отображении опций RouterInfo в I2NP Database Store Message будут повреждены.
Кодировка позволяет использовать дублирующиеся ключи, однако при любом использовании, где отображение подписано, дубликаты могут привести к сбою подписи.
Сопоставления, содержащиеся в сообщениях I2NP (например, в RouterAddress или RouterInfo), должны быть отсортированы по ключу, чтобы подпись была инвариантной. Дублирующиеся ключи не допускаются.
Сопоставления, содержащиеся в I2CP SessionConfig , должны быть отсортированы по ключу, чтобы подпись была инвариантной. Дублирующиеся ключи не допускаются.
Метод сортировки определён как в Java String.compareTo(), используя значения Unicode символов.
Хотя это зависит от приложения, ключи и значения, как правило, чувствительны к регистру.
Ограничения длины строк ключа и значения составляют 255 байт (не символов) каждая, плюс байт длины. Байт длины может быть равен 0.
Общее ограничение длины составляет 65535 байт, плюс 2-байтовое поле размера, или 65537 всего.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/DataHelper.html
Спецификация общей структуры
KeysAndCert
Описание
Открытый ключ шифрования, открытый ключ подписи и сертификат, используемые как RouterIdentity или Destination.
Содержание
PublicKey , за которым следует SigningPublicKey , а затем Certificate .
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| public_key |
+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| padding (optional) |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| signing_key |
+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| certificate |
+----+----+----+-/
public_key :: `PublicKey` (partial or full)
length -> 256 bytes or as specified in key certificate
padding :: random data
length -> 0 bytes or as specified in key certificate
public_key length + padding length + signing_key length == 384 bytes
signing__key :: `SigningPublicKey` (partial or full)
length -> 128 bytes or as specified in key certificate
certificate :: `Certificate`
length -> >= 3 bytes
total length: 387+ bytes
Эти рекомендации были предложены в Предложении 161 и реализованы в версии API 0.9.57. Эти рекомендации обратно совместимы со всеми версиями начиная с 0.6 (2005). См. Предложение 161 для получения справочной информации и дополнительных сведений.
Для любой используемой в настоящее время комбинации типов ключей, отличной от ElGamal + DSA-SHA1, будет присутствовать заполнение. Кроме того, для назначений поле открытого ключа размером 256 байт не используется с версии 0.6 (2005).
Разработчики должны генерировать случайные данные для публичных ключей Destination и заполнения Destination и Router Identity таким образом, чтобы они были сжимаемыми в различных протоколах I2P, оставаясь при этом безопасными и не создавая впечатления, что представления Base 64 повреждены или небезопасны. Это обеспечивает большинство преимуществ удаления полей заполнения без каких-либо разрушительных изменений протокола.
Строго говоря, только 32-байтовый открытый ключ подписи (как в Destinations, так и в Router Identities) и 32-байтовый открытый ключ шифрования (только в Router Identities) представляет собой случайное число, которое обеспечивает всю необходимую энтропию для того, чтобы SHA-256 хеши этих структур были криптографически стойкими и случайно распределенными в DHT сетевой базы данных.
Однако из соображений повышенной осторожности мы рекомендуем использовать минимум 32 байта случайных данных в поле публичного ключа ElG и заполнении. Кроме того, если все поля были нулевыми, Base 64 destinations содержали бы длинные последовательности символов AAAA, что может вызвать тревогу или путаницу у пользователей.
Повторяйте 32 байта случайных данных по мере необходимости, чтобы полная структура KeysAndCert была легко сжимаемой в протоколах I2P, таких как I2NP Database Store Message, Streaming SYN, SSU2 handshake и repliable Datagrams.
Примеры:
Router Identity с типом шифрования X25519 и типом подписи Ed25519 будет содержать 10 копий (320 байт) случайных данных, что даёт экономию примерно 288 байт при сжатии.
Destination с типом подписи Ed25519 будет содержать 11 копий (352 байта) случайных данных, что обеспечит экономию примерно 320 байт при сжатии.
Реализации должны, конечно, сохранять полную структуру размером 387+ байт, поскольку SHA-256 хеш структуры покрывает все содержимое.
Примечания
Не предполагайте, что они всегда составляют 387 байт! Они составляют 387 байт плюс длина сертификата, указанная в байтах 385-386, которая может быть не нулевой.
Начиная с релиза 0.9.12, если сертификат является Key Certificate, границы полей ключей могут варьироваться. См. раздел Key Certificate выше для получения подробной информации.
Криптографический открытый ключ выровнен по началу, а открытый ключ для подписи выровнен по концу. Заполнение (если есть) находится посередине.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/KeysAndCert.html
RouterIdentity
Описание
Определяет способ уникальной идентификации конкретного router
Содержание
Идентично KeysAndCert.
См. KeysAndCert для руководства по генерации случайных данных для поля заполнения.
Примечания
Сертификат для RouterIdentity всегда был NULL до релиза 0.9.12.
Не предполагайте, что они всегда имеют размер 387 байт! Они составляют 387 байт плюс длина сертификата, указанная в байтах 385-386, которая может быть ненулевой.
Начиная с версии 0.9.12, если сертификат является Key Certificate, границы полей ключей могут изменяться. См. раздел Key Certificate выше для получения подробной информации.
Криптографический публичный ключ выравнивается в начале, а подписывающий публичный ключ выравнивается в конце. Заполнение (если есть) находится посередине.
RouterIdentities с сертификатом ключа и открытым ключом ECIES_X25519 поддерживаются начиная с версии 0.9.48. До этого все RouterIdentities использовали ElGamal.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/router/RouterIdentity.html
Назначение
Описание
Destination определяет конкретную конечную точку, на которую могут направляться сообщения для безопасной доставки.
Содержание
Идентично KeysAndCert , за исключением того, что публичный ключ никогда не используется и может содержать случайные данные вместо действительного публичного ключа ElGamal.
См. KeysAndCert для рекомендаций по генерации случайных данных для полей открытого ключа и заполнения.
Примечания
Публичный ключ назначения использовался для старого шифрования i2cp-to-i2cp, которое было отключено в версии 0.6 (2005), в настоящее время он не используется, за исключением IV для шифрования LeaseSet, что является устаревшим. Вместо этого используется публичный ключ в LeaseSet.
Не предполагайте, что они всегда составляют 387 байт! Они составляют 387 байт плюс длина сертификата, указанная в байтах 385-386, которая может быть ненулевой.
Начиная с версии 0.9.12, если сертификат является Key Certificate, границы полей ключа могут варьироваться. Подробности см. в разделе Key Certificate выше.
Криптографический открытый ключ выровнен в начале, а открытый ключ подписи выровнен в конце. Заполнение (если есть) находится посередине.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/Destination.html
Lease
Описание
Определяет авторизацию для конкретного tunnel на получение сообщений, предназначенных для Destination .
Содержание
SHA256 Hash от RouterIdentity шлюзового router’а, затем TunnelId , и наконец конечная Date .
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| 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
LeaseSet
Описание
Содержит все текущие авторизованные Leases для конкретного Destination , PublicKey , с помощью которого можно шифровать garlic сообщения, а затем SigningPublicKey , который может использоваться для отзыва данной конкретной версии структуры. LeaseSet является одной из двух структур, хранящихся в сетевой базе данных (другой является RouterInfo ), и индексируется по SHA256 содержащегося Destination .
Содержание
Destination , за которым следует PublicKey для шифрования, затем SigningPublicKey , который может быть использован для отзыва этой версии LeaseSet, затем 1-байтовое Integer , указывающее количество структур Lease в наборе, за которым следуют фактические структуры Lease и, наконец, Signature предыдущих байтов, подписанная SigningPrivateKey Destination .
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| 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 or as specified in destination's key
certificate
num :: `Integer`
length -> 1 byte
Number of leases to follow
value: 0 <= num <= 16
leases :: [`Lease`]
length -> $num*44 bytes
signature :: `Signature`
length -> 40 bytes or as specified in destination's key
certificate
Публичный ключ destination использовался для старого шифрования I2CP-to-I2CP, которое было отключено в версии 0.6, в настоящее время не используется.
Ключ шифрования используется для сквозного шифрования ElGamal/AES+SessionTag ELGAMAL-AES . В настоящее время он генерируется заново при каждом запуске router, он не является постоянным.
Подпись может быть проверена с использованием открытого ключа подписи destination.
LeaseSet с нулевым количеством Lease разрешен, но не используется. Он был предназначен для отзыва LeaseSet, что не реализовано. Все варианты LeaseSet2 требуют как минимум один Lease.
signing_key в настоящее время не используется. Он предназначался для отзыва LeaseSet, который не реализован. В настоящее время он генерируется заново при каждом запуске router и не является постоянным. Тип ключа подписи всегда такой же, как тип ключа подписи назначения.
Самое раннее время истечения среди всех Lease рассматривается как временная метка или версия LeaseSet. Роутеры обычно не принимают сохранение LeaseSet, если он не является “более новым”, чем текущий. Будьте осторожны при публикации нового LeaseSet, где самый старый Lease такой же, как самый старый Lease в предыдущем LeaseSet. В таком случае публикующий роутер должен, как правило, увеличить время истечения самого старого Lease как минимум на 1 мс.
До версии 0.9.7, когда leaseSet включался в сообщение DatabaseStore, отправленное router’ом-источником, router устанавливал все сроки истечения опубликованных lease’ов в одно и то же значение — значение самого раннего lease’а. Начиная с версии 0.9.7, router публикует фактический срок истечения для каждого lease’а. Это деталь реализации, а не часть спецификации структур.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/LeaseSet.html
Lease2
Описание
Определяет авторизацию для конкретного tunnel на получение сообщений, направленных к Destination . То же самое, что и Lease , но с 4-байтовым end_date. Используется в LeaseSet2 . Поддерживается начиная с версии 0.9.38; см. предложение 123 для получения дополнительной информации.
Содержание
SHA256 Hash от RouterIdentity шлюзового router’а, затем TunnelId , и наконец 4-байтная дата окончания.
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| 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 :: 4 byte date
length -> 4 bytes
Seconds since the epoch, rolls over in 2106.
- Общий размер: 40 байт
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/Lease2.html
OfflineSignature
Описание
Это необязательная часть LeaseSet2Header . Также используется в streaming и I2CP. Поддерживается начиная с версии 0.9.38; см. предложение 123 для получения дополнительной информации.
Содержание
Содержит срок действия, тип подписи и временный SigningPublicKey , а также Signature .
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| expires | sigtype | |
+----+----+----+----+----+----+ +
| transient_public_key |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| signature |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
expires :: 4 byte date
length -> 4 bytes
Seconds since the epoch, rolls over in 2106.
sigtype :: 2 byte type of the transient_public_key
length -> 2 bytes
transient_public_key :: `SigningPublicKey`
length -> As inferred from the sigtype
signature :: `Signature`
length -> As inferred from the sigtype of the signing public key
in the `Destination` that preceded this offline signature.
Signature of expires timestamp, transient sig type, and public key,
by the destination public key.
- Этот раздел может и должен быть создан в автономном режиме.
LeaseSet2Header
Описание
Это общая часть LeaseSet2 и MetaLeaseSet . Поддерживается начиная с версии 0.9.38; см. предложение 123 для получения дополнительной информации.
Содержание
Содержит Destination , два временных штампа и необязательную OfflineSignature .
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| destination |
+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| published | expires | flags |
+----+----+----+----+----+----+----+----+
| offline_signature (optional) |
+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
destination :: `Destination`
length -> >= 387+ bytes
published :: 4 byte date
length -> 4 bytes
Seconds since the epoch, rolls over in 2106.
expires :: 2 byte time
length -> 2 bytes
Offset from published timestamp in seconds, 18.2 hours max
flags :: 2 bytes
Bit order: 15 14 ... 3 2 1 0
Bit 0: If 0, no offline keys; if 1, offline keys
Bit 1: If 0, a standard published leaseset.
If 1, an unpublished leaseset.
Bit 2: If 0, a standard published leaseset.
If 1, this unencrypted leaseset will be blinded and encrypted when published.
Bits 15-3: set to 0 for compatibility with future uses
offline_signature :: `OfflineSignature`
length -> varies
Optional, only present if bit 0 is set in the flags.
Flags (2 байта):
- Бит 0: Если установлен, присутствуют офлайн-ключи (см. OfflineSignature )
- Бит 1: Если установлен, это неопубликованный leaseset
- Бит 2: Если установлен, это скрытый leaseset
- Биты 15-3: Зарезервированы, установлены в 0
Общий размер: минимум 395 байт
Максимальное фактическое время истечения составляет около 660 (11 минут) для LeaseSet2 и 65535 (полные 18,2 часа) для MetaLeaseSet .
LeaseSet (1) не имел поле ‘published’, поэтому для версионирования требовался поиск самого раннего lease. LeaseSet2 добавляет поле ‘published’ с разрешением в одну секунду. Роутеры должны ограничивать скорость отправки новых leasesets в floodfills до скорости намного медленнее, чем раз в секунду (на destination). Если это не реализовано, то код должен обеспечить, чтобы каждый новый leaseset имел время ‘published’ как минимум на одну секунду позже предыдущего, иначе floodfills не будут сохранять или распространять новый leaseset.
LeaseSet2
Описание
Содержится в I2NP сообщении DatabaseStore типа 3. Поддерживается начиная с версии 0.9.38; подробную информацию см. в предложении 123.
Содержит все текущие авторизованные Lease2 для конкретного Destination и PublicKey , с помощью которого могут быть зашифрованы garlic сообщения. LeaseSet является одной из двух структур, хранящихся в сетевой базе данных (другой является RouterInfo ), и индексируется по SHA256 хешу содержащегося Destination .
Содержание
LeaseSet2Header , за которым следуют опции, затем один или более PublicKey для шифрования, Integer , указывающий количество структур Lease2 в наборе, за которым следуют фактические структуры Lease2 и, наконец, Signature предыдущих байтов, подписанная SigningPrivateKey Destination или временным ключом.
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| ls2_header |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| options |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
|numk| keytype0| keylen0 | |
+----+----+----+----+----+ +
| encryption_key_0 |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| keytypen| keylenn | |
+----+----+----+----+ +
| encryption_key_n |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| num| Lease2 0 |
+----+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| Lease2($num-1) |
+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| signature |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
ls2header :: `LeaseSet2Header`
length -> varies
options :: `Mapping`
length -> varies, 2 bytes minimum
numk :: `Integer`
length -> 1 byte
Number of key types, key lengths, and `PublicKey`s to follow
value: 1 <= numk <= max TBD
keytype :: The encryption type of the `PublicKey` to follow.
length -> 2 bytes
keylen :: The length of the `PublicKey` to follow.
Must match the specified length of the encryption type.
length -> 2 bytes
encryption_key :: `PublicKey`
length -> keylen bytes
num :: `Integer`
length -> 1 byte
Number of `Lease2`s to follow
value: 0 <= num <= 16
leases :: [`Lease2`]
length -> $num*40 bytes
signature :: `Signature`
length -> 40 bytes or as specified in destination's key
certificate, or by the sigtype of the transient public key,
if present in the header
Для опубликованных (серверных) leaseSet ключи шифрования расположены в порядке предпочтения сервера, наиболее предпочтительный первым. Если клиенты поддерживают более одного типа шифрования, рекомендуется учитывать предпочтения сервера и выбирать первый поддерживаемый тип в качестве метода шифрования для подключения к серверу. Обычно более новые (с более высокими номерами) типы ключей более безопасны или эффективны и являются предпочтительными, поэтому ключи должны быть перечислены в обратном порядке по типу ключа.
Однако клиенты могут, в зависимости от реализации, выбирать основываясь на своих предпочтениях, или использовать некоторый метод для определения “комбинированного” предпочтения. Это может быть полезно как опция конфигурации или для отладки.
Порядок ключей в неопубликованных (клиентских) leaseSet фактически не имеет значения, поскольку подключения обычно не будут предприниматься к неопубликованным клиентам. Если только этот порядок не используется для определения комбинированного предпочтения, как описано выше.
Опции
Начиная с API 0.9.66 определен стандартный формат для опций записей служб. Подробности см. в предложении 167. В будущем могут быть определены опции, отличные от записей служб, использующие другой формат.
Опции LS2 ДОЛЖНЫ быть отсортированы по ключу, чтобы подпись была неизменной.
Опции записи сервиса определяются следующим образом:
- serviceoption := optionkey optionvalue
- optionkey := _service._proto
- service := Символическое имя желаемой службы. Должно быть в нижнем регистре. Пример: “smtp”. Допустимые символы [a-z0-9-] и не должно начинаться или заканчиваться ‘-’. Должны использоваться стандартные идентификаторы из REGISTRY или Linux /etc/services, если они там определены.
- proto := Транспортный протокол желаемой службы. Должен быть в нижнем регистре, либо “tcp”, либо “udp”. “tcp” означает потоковую передачу, а “udp” означает дейтаграммы с ответом. Индикаторы протокола для необработанных дейтаграмм и datagram2 могут быть определены позже. Допустимые символы [a-z0-9-] и не должно начинаться или заканчиваться ‘-’.
- optionvalue := self | srvrecord[,srvrecord]*
- self := “0” ttl port [appoptions]
- srvrecord := “1” ttl priority weight port target [appoptions]
- ttl := время жизни, секунды в виде целого числа. Положительное целое число. Пример: “86400”. Рекомендуется минимум 86400 (один день), подробности см. в разделе Рекомендации ниже.
- priority := Приоритет целевого хоста, меньшее значение означает большее предпочтение. Неотрицательное целое число. Пример: “0” Полезно только при наличии более одной записи, но требуется даже при единственной записи.
- weight := Относительный вес для записей с одинаковым приоритетом. Большее значение означает больше шансов быть выбранным. Неотрицательное целое число. Пример: “0” Полезно только при наличии более одной записи, но требуется даже при единственной записи.
- port := Порт I2CP, на котором должна быть найдена служба. Неотрицательное целое число. Пример: “25” Порт 0 поддерживается, но не рекомендуется.
- target := Имя хоста или b32 назначения, предоставляющего службу. Действительное имя хоста согласно NAMING . Должно быть в нижнем регистре. Пример: “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b32.i2p” или “example.i2p”. b32 рекомендуется, если только имя хоста не является “хорошо известным”, т.е. находится в официальных или стандартных адресных книгах.
- appoptions := произвольный текст, специфичный для приложения, не должен содержать " " или “,”. Кодировка UTF-8.
Примеры:
В LS2 для aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b32.i2p, указывающем на один SMTP-сервер:
“_smtp._tcp” “1 86400 0 0 25 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.b32.i2p”
В LS2 для aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b32.i2p, указывающем на два SMTP-сервера:
“_smtp._tcp” “1 86400 0 0 25 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.b32.i2p,86400 1 0 25 cccccccccccccccccccccccccccccccccccccccccccc.b32.i2p”
В LS2 для bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.b32.i2p, указывающем на себя как SMTP сервер:
“_smtp._tcp” “0 999999 25”
Примечания
Публичный ключ назначения использовался для старого шифрования I2CP-to-I2CP, которое было отключено в версии 0.6, в настоящее время не используется.
Ключи шифрования используются для сквозного шифрования ElGamal/AES+SessionTag ELGAMAL-AES (тип 0) или других схем сквозного шифрования. См. ECIES и предложения 145 и 156. Они могут генерироваться заново при каждом запуске router’а или могут быть постоянными. X25519 (тип 4, см. ECIES ) поддерживается с версии 0.9.44.
Подпись проставляется над данными выше, ПРЕДВАРЯЕМЫМИ одним байтом, содержащим тип DatabaseStore (3).
Подпись может быть проверена с использованием открытого ключа подписи назначения или временного открытого ключа подписи, если автономная подпись включена в заголовок leaseset2.
Длина ключа предоставляется для каждого ключа, чтобы floodfill узлы и клиенты могли разобрать структуру, даже если не все типы шифрования известны или поддерживаются.
См. примечание к полю ‘published’ в LeaseSet2Header
Отображение опций, если размер больше единицы, должно быть отсортировано по ключу, чтобы подпись была инвариантной.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/LeaseSet2.html
MetaLease
Описание
Определяет авторизацию для конкретного tunnel на получение сообщений, нацеленных на Destination . То же самое, что и Lease2 , но с флагами и стоимостью вместо идентификатора tunnel. Используется MetaLeaseSet . Содержится в I2NP DatabaseStore сообщении типа 7. Поддерживается с версии 0.9.38; см. предложение 123 для получения дополнительной информации.
Содержание
SHA256 Hash от RouterIdentity шлюзового router, затем флаги и стоимость, и наконец 4-байтная дата окончания.
+----+----+----+----+----+----+----+----+
| tunnel_gw |
+ +
| |
+ +
| |
+ +
| |
+----+----+----+----+----+----+----+----+
| flags |cost| end_date |
+----+----+----+----+----+----+----+----+
tunnel_gw :: Hash of the `RouterIdentity` of the tunnel gateway,
or the hash of another `MetaLeaseSet`.
length -> 32 bytes
flags :: 3 bytes of flags
Bit order: 23 22 ... 3 2 1 0
Bits 3-0: Type of the entry.
If 0, unknown.
If 1, a `LeaseSet`.
If 3, a `LeaseSet2`.
If 5, a `MetaLeaseSet`.
Bits 23-4: set to 0 for compatibility with future uses
length -> 3 bytes
cost :: 1 byte, 0-255. Lower value is higher priority.
length -> 1 byte
end_date :: 4 byte date
length -> 4 bytes
Seconds since the epoch, rolls over in 2106.
Примечания
- Общий размер: 40 байт
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/MetaLease.html
MetaLeaseSet
Описание
Содержится в I2NP сообщении DatabaseStore типа 7. Определено с версии 0.9.38; планировалось к работе с версии 0.9.40; см. предложение 123 для получения дополнительной информации.
Содержит все текущие авторизованные MetaLease для определённого Destination и PublicKey , с помощью которого можно зашифровать garlic сообщения. LeaseSet является одной из двух структур, хранящихся в сетевой базе данных (вторая — RouterInfo ), и индексируется по SHA256 содержащегося Destination .
Содержание
LeaseSet2Header , за которым следует options, Integer , указывающий количество структур Lease2 в наборе, затем сами структуры Lease2 и, наконец, Signature предыдущих байтов, подписанная SigningPrivateKey Destination или транзитным ключом.
+----+----+----+----+----+----+----+----+
| ls2_header |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| options |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| num| MetaLease 0 |
+----+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| MetaLease($num-1) |
+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
|numr| |
+----+ +
| revocation_0 |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| revocation_n |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| signature |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
ls2header :: `LeaseSet2Header`
length -> varies
options :: `Mapping`
length -> varies, 2 bytes minimum
num :: `Integer`
length -> 1 byte
Number of `MetaLease`s to follow
value: 1 <= num <= max TBD
leases :: `MetaLease`s
length -> $numr*40 bytes
numr :: `Integer`
length -> 1 byte
Number of `Hash`es to follow
value: 0 <= numr <= max TBD
revocations :: [`Hash`]
length -> $numr*32 bytes
signature :: `Signature`
length -> 40 bytes or as specified in destination's key
certificate, or by the sigtype of the transient public key,
if present in the header
Примечания
Публичный ключ назначения использовался для старого шифрования I2CP-to-I2CP, которое было отключено в версии 0.6, в настоящее время не используется.
Подпись распространяется на данные выше, ДОБАВЛЕННЫЕ В НАЧАЛО с одним байтом, содержащим тип DatabaseStore (7).
Подпись может быть проверена с использованием открытого ключа подписи назначения или временного открытого ключа подписи, если автономная подпись включена в заголовок leaseset2.
См. примечание к полю ‘published’ в LeaseSet2Header
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/MetaLeaseSet.html
EncryptedLeaseSet
Описание
Содержится в I2NP сообщении DatabaseStore типа 5. Определено с версии 0.9.38; работает с версии 0.9.39; см. предложение 123 для получения дополнительной информации.
Только затемнённый ключ и время истечения видны в открытом тексте. Сам leaseSet зашифрован.
Содержание
Двухбайтовый тип подписи, скрытый SigningPrivateKey , время публикации, срок действия и флаги. Затем двухбайтовая длина, за которой следуют зашифрованные данные. Наконец, Signature предыдущих байтов, подписанная скрытым SigningPrivateKey или временным ключом.
+----+----+----+----+----+----+----+----+
| sigtype | |
+----+----+ +
| blinded_public_key |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| published | expires | flags |
+----+----+----+----+----+----+----+----+
| offline_signature (optional) |
+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| len | |
+----+----+ +
| encrypted_data |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| signature |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
sigtype :: A two byte signature type of the public key to follow
length -> 2 bytes
blinded_public_key :: `SigningPublicKey`
length -> As inferred from the sigtype
published :: 4 byte date
length -> 4 bytes
Seconds since the epoch, rolls over in 2106.
expires :: 2 byte time
length -> 2 bytes
Offset from published timestamp in seconds, 18.2 hours max
flags :: 2 bytes
Bit order: 15 14 ... 3 2 1 0
Bit 0: If 0, no offline keys; if 1, offline keys
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 15-2: set to 0 for compatibility with future uses
offline_signature :: `OfflineSignature`
length -> varies
Optional, only present if bit 0 is set in the flags.
len :: `Integer`
length -> 2 bytes
length of encrypted_data to follow
value: 1 <= num <= max TBD
encrypted_data :: Data encrypted
length -> len bytes
signature :: `Signature`
length -> As specified by the sigtype of the blinded pubic key,
or by the sigtype of the transient public key,
if present in the header
Примечания
Публичный ключ назначения использовался для старого шифрования I2CP-to-I2CP, которое было отключено в версии 0.6, в настоящее время не используется.
Подпись вычисляется для данных выше, ПРЕДВАРЕННЫХ одним байтом, содержащим тип DatabaseStore (5).
Подпись может быть проверена с использованием публичного ключа подписи назначения или временного публичного ключа подписи, если автономная подпись включена в заголовок leaseset2.
Блайндинг и шифрование описаны в EncryptedLeaseSet
Эта структура не использует LeaseSet2Header .
Максимальное фактическое время истечения составляет около 660 (11 минут), если только это не зашифрованный MetaLeaseSet .
См. предложение 123 для заметок об использовании автономных подписей с зашифрованными leaseSet.
См. примечание к полю ‘published’ в LeaseSet2Header (та же проблема, даже несмотря на то, что мы не используем здесь формат LeaseSet2Header)
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/EncryptedLeaseSet.html
RouterAddress
Описание
Эта структура определяет способы связи с router через транспортный протокол.
Содержание
1 байт Integer , определяющий относительную стоимость использования адреса, где 0 означает бесплатно, а 255 - дорого, за которым следует дата истечения Date , после которой адрес не должен использоваться, или если null, то адрес никогда не истекает. После этого идет String , определяющая транспортный протокол, который использует данный router адрес. Наконец, есть Mapping , содержащий все специфичные для транспорта опции, необходимые для установления соединения, такие как IP-адрес, номер порта, email адрес, URL и т.д.
+----+----+----+----+----+----+----+----+
|cost| expiration
+----+----+----+----+----+----+----+----+
| transport_style |
+----+----+----+----+-/-+----+----+----+
| |
+ +
| options |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
cost :: `Integer`
length -> 1 byte
case 0 -> free
case 255 -> expensive
expiration :: `Date` (must be all zeros, see notes below)
length -> 8 bytes
case null -> never expires
transport_style :: `String`
length -> 1-256 bytes
options :: `Mapping`
Примечания
Стоимость обычно составляет 5 или 6 для SSU и 10 или 11 для NTCP.
Срок действия в настоящее время не используется, всегда null (все нули). Начиная с релиза 0.9.3, срок действия предполагается равным нулю и не сохраняется, поэтому любой ненулевой срок действия приведет к сбою при проверке подписи RouterInfo. Реализация срока действия (или другого использования этих байтов) будет изменением, несовместимым с предыдущими версиями. Router’ы ДОЛЖНЫ устанавливать это поле равным всем нулям. Начиная с релиза 0.9.12, ненулевое поле срока действия снова распознается, однако мы должны подождать несколько релизов, прежде чем использовать это поле, пока подавляющее большинство сети не станет его распознавать.
Следующие опции, хотя и не являются обязательными, являются стандартными и ожидается их наличие в большинстве адресов router: “host” (IPv4 или IPv6 адрес или имя хоста) и “port”.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/router/RouterAddress.html
RouterInfo
Описание
Определяет все данные, которые router хочет опубликовать для просмотра сетью. RouterInfo является одной из двух структур, хранящихся в сетевой базе данных (другой является LeaseSet ), и индексируется по SHA256 от содержащегося RouterIdentity .
Содержание
RouterIdentity , за которым следует Date , когда запись была опубликована
+----+----+----+----+----+----+----+----+
| 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
The number of `RouterAddress`es to follow, 0-255
addresses :: [`RouterAddress`]
length -> varies
peer_size :: `Integer`
length -> 1 byte
The number of peer `Hash`es to follow, 0-255, unused, always zero
value -> 0
options :: `Mapping`
signature :: `Signature`
length -> 40 bytes or as specified in router_ident's key
certificate
Примечания
После peer_size Integer может следовать список хешей router в указанном количестве. В настоящее время не используется. Предназначалось для формы ограниченных маршрутов, которая не реализована. Некоторые реализации могут требовать сортировки списка, чтобы подпись была инвариантной. Требует исследования перед включением этой функции.
Подпись может быть проверена с использованием открытого ключа подписи router_ident.
См. страницу базы данных сети NETDB-ROUTERINFO для стандартных опций, которые ожидаются присутствующими во всех router info.
Очень старые router’ы требовали, чтобы адреса были отсортированы по SHA256 их данных, чтобы подпись была инвариантной. Это больше не требуется и не стоит реализовывать для обратной совместимости.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/router/RouterInfo.html
Инструкции по доставке
Инструкции доставки tunnel сообщений определены в спецификации Tunnel Message TUNNEL-DELIVERY .
Инструкции доставки garlic сообщений определены в спецификации I2NP сообщений GARLIC-DELIVERY .