Этот перевод был создан с помощью машинного обучения и может быть не на 100% точным. Просмотреть английскую версию

Спецификация общих структур

Типы данных, общие для всех протоколов I2P

Данный документ описывает некоторые типы данных, общие для всех протоколов 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.

TypeLength (bytes)SinceUsage
ElGamal256Deprecated for Router Identities as of 0.9.58; use for Destinations, as the public key field is unused there; discouraged for leasesets
P25664TBDReserved, see proposal 145
P38496TBDReserved, see proposal 145
P521132TBDReserved, see proposal 145
X25519320.9.38Little-endian. See ECIES and ECIES-ROUTERS
MLKEM512_X25519320.9.67See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations
MLKEM768_X25519320.9.67See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations
MLKEM1024_X25519320.9.67See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations
MLKEM5128000.9.67See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations
MLKEM76811840.9.67See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations
MLKEM102415680.9.67See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations
MLKEM512_CT7680.9.67See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations
MLKEM768_CT10880.9.67See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations
MLKEM1024_CT15680.9.67See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/PublicKey.html

PrivateKey

Описание

Эта структура используется в ElGamal или другой асимметричной расшифровке, представляя только экспоненту, а не простые числа, которые являются константами и определены в спецификации криптографии ELGAMAL . Другие схемы шифрования находятся в процессе определения, см. таблицу ниже.

Содержание

Тип и длина ключа определяются из контекста или хранятся отдельно в структуре данных или файле приватного ключа. Тип по умолчанию — ElGamal. Начиная с версии 0.9.38 могут поддерживаться другие типы в зависимости от контекста. Ключи имеют формат big-endian, если не указано иное.

TypeLength (bytes)SinceUsage
ElGamal256Deprecated for Router Identities as of 0.9.58; use for Destinations, as the public key field is unused there; discouraged for leasesets
P25632TBDReserved, see proposal 145
P38448TBDReserved, see proposal 145
P52166TBDReserved, see proposal 145
X25519320.9.38Little-endian. See ECIES and ECIES-ROUTERS
MLKEM512_X25519320.9.67See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations
MLKEM768_X25519320.9.67See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations
MLKEM1024_X25519320.9.67See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations
MLKEM51216320.9.67See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations
MLKEM76824000.9.67See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations
MLKEM102431680.9.67See ECIES-HYBRID, for handshakes only, not for Leasesets, RIs or Destinations
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/PrivateKey.html

SessionKey

Описание

Эта структура используется для симметричного шифрования и расшифрования AES256.

Содержание

32 байта

JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/SessionKey.html

SigningPublicKey

Описание

Эта структура используется для проверки подписей.

Содержание

Тип и длина ключа выводятся из контекста или указываются в Key Certificate назначения. Тип по умолчанию — DSA_SHA1. Начиная с версии 0.9.12, в зависимости от контекста могут поддерживаться другие типы.

TypeLength (bytes)SinceUsage
DSA_SHA1128Deprecated for Router Identities as of 09.58; discouraged for Destinations
ECDSA_SHA256_P256640.9.12Deprecated Older Destinations
ECDSA_SHA384_P384960.9.12Deprecated Rarely used for Destinations
ECDSA_SHA512_P5211320.9.12Deprecated Rarely used for Destinations
RSA_SHA256_20482560.9.12Deprecated Offline signing, never used for Router Identities or Destinations
RSA_SHA384_30723840.9.12Deprecated Offline signing, never used for Router Identities or Destinations
RSA_SHA512_40965120.9.12Offline signing, never used for Router Identities or Destinations
EdDSA_SHA512_Ed25519320.9.15Recent Router Identities and Destinations
EdDSA_SHA512_Ed25519ph320.9.25Offline signing, never used for Router Identities or Destinations
RedDSA_SHA512_Ed25519320.9.39For 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, могут поддерживаться другие типы, в зависимости от контекста.

TypeLength (bytes)SinceUsage
DSA_SHA120Deprecated for Router Identities as of 09.58; discouraged for Destinations
ECDSA_SHA256_P256320.9.12Deprecated Older Destinations
ECDSA_SHA384_P384480.9.12Deprecated Rarely used for Destinations
ECDSA_SHA512_P521660.9.12Deprecated Rarely used for Destinations
RSA_SHA256_20485120.9.12Deprecated Offline signing, never used for Router Identities or Destinations
RSA_SHA384_30727680.9.12Deprecated Offline signing, never used for Router Identities or Destinations
RSA_SHA512_409610240.9.12Offline signing, never used for Router Identities or Destinations
EdDSA_SHA512_Ed25519320.9.15Recent Router Identities and Destinations
EdDSA_SHA512_Ed25519ph320.9.25Offline signing, never used for Router Identities or Destinations
RedDSA_SHA512_Ed25519320.9.39For 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, могут поддерживаться другие типы, в зависимости от контекста.

TypeLength (bytes)SinceUsage
DSA_SHA140Deprecated for Router Identities as of 09.58; discouraged for Destinations
ECDSA_SHA256_P256640.9.12Deprecated Older Destinations
ECDSA_SHA384_P384960.9.12Deprecated Rarely used for Destinations
ECDSA_SHA512_P5211320.9.12Deprecated Rarely used for Destinations
RSA_SHA256_20482560.9.12Deprecated Offline signing, never used for Router Identities or Destinations
RSA_SHA384_30723840.9.12Deprecated Offline signing, never used for Router Identities or Destinations
RSA_SHA512_40965120.9.12Offline signing, never used for Router Identities or Destinations
EdDSA_SHA512_Ed25519640.9.15Recent Router Identities and Destinations
EdDSA_SHA512_Ed25519ph640.9.25Offline signing, never used for Router Identities or Destinations
RedDSA_SHA512_Ed25519640.9.39For 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 для указания типа открытого ключа подписи. См. ниже.

  • Разработчикам рекомендуется запрещать избыточные данные в сертификатах. Должна обеспечиваться соответствующая длина для каждого типа сертификата.

Типы сертификатов

Определены следующие типы сертификатов:

TypeType CodePayload LengthTotal LengthNotes
Null003
HashCash1variesvariesDeprecated, unused. Payload contains an ASCII colon-separated hashcash string.
Hidden203Deprecated, unused. Hidden routers generally do not announce that they are hidden.
Signed340 or 7243 or 75Deprecated, unused. Payload contains a 40-byte DSA signature, optionally followed by the 32-byte Hash of the signing Destination.
Multiple4variesvariesDeprecated, unused. Payload contains multiple certificates.
Key54+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.

Полезная нагрузка ключевого сертификата содержит:

DataLength
Signing Public Key Type (Integer)2
Crypto Public Key Type (Integer)2
Excess Signing Public Key Data0+
Excess Crypto Public Key Data0+
Внимание: Порядок типов ключей противоположен тому, что вы могли бы ожидать; тип открытого ключа для подписи указывается первым.

Определенные типы открытых ключей подписи:

TypeType CodeTotal Public Key LengthSinceUsage
DSA_SHA101280.9.12Deprecated for Router Identities as of 0.9.58; discouraged for Destinations
ECDSA_SHA256_P2561640.9.12Deprecated Older Destinations
ECDSA_SHA384_P3842960.9.12Deprecated Rarely if ever used for Destinations
ECDSA_SHA512_P52131320.9.12Deprecated Rarely if ever used for Destinations
RSA_SHA256_204842560.9.12Deprecated Offline only; never used in Key Certificates for Router Identities or Destinations
RSA_SHA384_307253840.9.12Deprecated Offline only; never used in Key Certificates for Router Identities or Destinations
RSA_SHA512_409665120.9.12Offline only; never used in Key Certificates for Router Identities or Destinations
EdDSA_SHA512_Ed255197320.9.15Recent Router Identities and Destinations
EdDSA_SHA512_Ed25519ph8320.9.25Offline only; never used in Key Certificates for Router Identities or Destinations
reserved (GOST)964Reserved, see Prop134
reserved (GOST)10128Reserved, see Prop134
RedDSA_SHA512_Ed2551911320.9.39For Destinations and encrypted leasesets only; never used for Router Identities
reserved (MLDSA)12Reserved, see Prop169
reserved (MLDSA)13Reserved, see Prop169
reserved (MLDSA)14Reserved, see Prop169
reserved (MLDSA)15Reserved, see Prop169
reserved (MLDSA)16Reserved, see Prop169
reserved (MLDSA)17Reserved, see Prop169
reserved (MLDSA)18Reserved, see Prop169
reserved (MLDSA)19Reserved, see Prop169
reserved (MLDSA)20Reserved, see Prop169
reserved65280-65534Reserved for experimental use
reserved65535Reserved for future expansion
Определенные типы криптографических открытых ключей:
TypeType CodeTotal Public Key LengthSinceUsage
ElGamal0256Deprecated for Router Identities as of 0.9.58; use for Destinations, as the public key field is unused there
P256164Reserved, see proposal 145
P384296Reserved, see proposal 145
P5213132Reserved, see proposal 145
X255194320.9.38See ECIES and proposal 156
MLKEM512_X255195320.9.67See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations
MLKEM768_X255196320.9.67See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations
MLKEM1024_X255197320.9.67See ECIES-HYBRID, for Leasesets only, not for RIs or Destinations
reserved (NONE)255Reserved, see Prop169
reserved65280-65534Reserved for experimental use
reserved65535Reserved for future expansion
Когда Key Certificate отсутствует, предшествующие 384 байта в Destination или RouterIdentity определяются как 256-байтовый ElGamal PublicKey, за которым следует 128-байтовый DSA-SHA1 SigningPublicKey. Когда Key Certificate присутствует, предшествующие 384 байта переопределяются следующим образом:
  • Полный или первая часть криптографического публичного ключа

  • Случайное заполнение, если общая длина двух ключей составляет менее 384 байт

  • Полный или первая часть открытого ключа подписи

Crypto Public Key выравнивается в начале, а Signing Public Key выравнивается в конце. Заполнение (если есть) находится посередине. Длины и границы данных исходного ключа, заполнения и части избыточных данных ключа в сертификатах не указываются явно, а выводятся из длин указанных типов ключей. Если общая длина Crypto и Signing Public Keys превышает 384 байта, остаток будет содержаться в Key Certificate. Если длина Crypto Public Key не составляет 256 байт, метод определения границы между двумя ключами будет указан в будущей редакции этого документа.

Примеры схем размещения с использованием криптографического открытого ключа ElGamal и указанным типом открытого ключа для подписи:

Signing Key TypePadding LengthExcess Signing Key Data in Cert
DSA_SHA100
ECDSA_SHA256_P256640
ECDSA_SHA384_P384320
ECDSA_SHA512_P52104
RSA_SHA256_20480128
RSA_SHA384_30720256
RSA_SHA512_40960384
EdDSA_SHA512_Ed25519960
EdDSA_SHA512_Ed25519ph960
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/Certificate.html

Примечания

  • Разработчикам рекомендуется запретить избыточные данные в 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 .

public_keyPublicKey (partial or full), 256 bytes or as specified in key cert
padding (optional)random data, pub + pad + sig == 384 bytes
signing_keySigningPublicKey (partial or full), 128 bytes or as specified
certificateCertificate, >= 3 bytes
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 .

tunnel_gwHash of the RouterIdentity of the tunnel gateway, 32 bytes
tunnel_idTunnelId, 4 bytes
end_dateDate, 8 bytes
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
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/Lease.html

LeaseSet

Описание

Содержит все текущие авторизованные Leases для конкретного Destination , PublicKey , с помощью которого можно шифровать garlic сообщения, а затем SigningPublicKey , который может использоваться для отзыва данной конкретной версии структуры. LeaseSet является одной из двух структур, хранящихся в сетевой базе данных (другой является RouterInfo ), и индексируется по SHA256 содержащегося Destination .

Содержание

Destination , за которым следует PublicKey для шифрования, затем SigningPublicKey , который может быть использован для отзыва этой версии LeaseSet, затем 1-байтовое Integer , указывающее количество структур Lease в наборе, за которым следуют фактические структуры Lease и, наконец, Signature предыдущих байтов, подписанная SigningPrivateKey Destination .

destinationDestination, >= 387+ bytes
encryption_keyPublicKey, 256 bytes
signing_keySigningPublicKey, 128 bytes or as specified in destination's key cert
numInteger, 1 byte, number of leases (0-16)
Lease 0Lease, 44 bytes
Lease 1Lease, 44 bytes
Lease ($num-1)Lease, 44 bytes
signatureSignature, 40 bytes or as specified in destination's key cert
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-байтная дата окончания.

tunnel_gwHash of the RouterIdentity of the tunnel gateway, 32 bytes
tunnel_idTunnelId, 4 bytes
end_date4 byte date, seconds since epoch, rolls over in 2106
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 .

expires4 byte date, seconds since epoch, rolls over in 2106
sigtype2 byte type of the transient_public_key
transient_public_keySigningPublicKey, as inferred from sigtype
signatureSignature, as inferred from sigtype of the Destination's key
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 .

destinationDestination, >= 387+ bytes
published4 byte date, seconds since epoch, rolls over in 2106
expires2 byte time, offset from published in seconds, 18.2 hours max
flags
offline_signatureOfflineSignature, varies, optional (present if flags bit 0 set
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 или временным ключом.

ls2_headerLeaseSet2Header, varies
optionsMapping, varies, 2 bytes minimum
numkInteger, 1 byte, number of encryption keys (1 <= numk <= max TBD)
keytype0Encryption type of PublicKey, 2 bytes
keylen0Length of PublicKey, 2 bytes
encryption_key_0PublicKey, keylen bytes
keytypenEncryption type of PublicKey, 2 bytes
keylennLength of PublicKey, 2 bytes
encryption_key_nPublicKey, keylen bytes
numInteger, 1 byte, number of Lease2s (0-16)
Lease2 0Lease2, 40 bytes
Lease2 ($num-1)Lease2, 40 bytes
signatureSignature, 40 bytes or as specified in destination's key cert
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 .

Ссылки

Was this page helpful?