Tài liệu này mô tả một số kiểu dữ liệu chung cho tất cả các giao thức I2P, như I2NP , I2CP , SSU , v.v.
Đặc tả kiểu chung
Số nguyên
Mô tả
Đại diện cho một số nguyên không âm.
Mục lục
1 đến 8 byte theo thứ tự byte mạng (big endian) biểu diễn một số nguyên không dấu.
Ngày
Mô tả
Số mili giây kể từ nửa đêm ngày 1 tháng 1 năm 1970 theo múi giờ GMT. Nếu số này là 0, ngày tháng không được xác định hoặc null.
Nội dung
8 byte Integer
Chuỗi
Mô tả
Biểu diễn một chuỗi được mã hóa UTF-8.
Mục lục
1 hoặc nhiều byte trong đó byte đầu tiên là số lượng byte (không phải ký tự!) trong chuỗi và 0-255 byte còn lại là mảng ký tự được mã hóa UTF-8 không kết thúc bằng null. Giới hạn độ dài là 255 byte (không phải ký tự). Độ dài có thể là 0.
PublicKey
Mô tả
Cấu trúc này được sử dụng trong mã hóa ElGamal hoặc các phương pháp mã hóa bất đối xứng khác, chỉ đại diện cho số mũ, không phải các số nguyên tố, vì chúng là hằng số và được định nghĩa trong đặc tả mật mã ELGAMAL . Các phương pháp mã hóa khác đang trong quá trình được định nghĩa, xem bảng bên dưới.
Nội dung
Loại khóa và độ dài được suy ra từ ngữ cảnh hoặc được chỉ định trong Key Certificate của một Destination hoặc RouterInfo, hoặc các trường trong LeaseSet2 hoặc cấu trúc dữ liệu khác. Loại mặc định là ElGamal. Kể từ phiên bản 0.9.38, các loại khác có thể được hỗ trợ, tùy thuộc vào ngữ cảnh. Các khóa được biểu diễn theo thứ tự big-endian trừ khi có ghi chú khác.
Khóa X25519 được hỗ trợ trong Destinations và LeaseSet2 kể từ phiên bản 0.9.44. Khóa X25519 được hỗ trợ trong RouterIdentities kể từ phiên bản 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
Mô tả
Cấu trúc này được sử dụng trong ElGamal hoặc các phương pháp giải mã bất đối xứng khác, chỉ đại diện cho số mũ, không phải các số nguyên tố vốn là hằng số và được định nghĩa trong đặc tả mật mã học ELGAMAL . Các sơ đồ mã hóa khác đang trong quá trình được định nghĩa, xem bảng dưới đây.
Nội dung
Loại khóa và độ dài được suy ra từ ngữ cảnh hoặc được lưu trữ riêng biệt trong một cấu trúc dữ liệu hoặc tệp khóa riêng tư. Loại mặc định là ElGamal. Kể từ phiên bản 0.9.38, các loại khác có thể được hỗ trợ, tùy thuộc vào ngữ cảnh. Các khóa sử dụng định dạng big-endian trừ khi có ghi chú khác.
| 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
Mô tả
Cấu trúc này được sử dụng cho mã hóa và giải mã đối xứng AES256.
Nội dung
32 byte
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/SessionKey.html
SigningPublicKey
Mô tả
Cấu trúc này được sử dụng để xác minh chữ ký.
Mục lục
Loại khóa và độ dài được suy ra từ ngữ cảnh hoặc được chỉ định trong Key Certificate của một Destination. Loại mặc định là DSA_SHA1. Kể từ phiên bản 0.9.12, các loại khác có thể được hỗ trợ, tùy thuộc vào ngữ cảnh.
| 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 |
Khi một khóa được tạo thành từ hai phần tử (ví dụ các điểm X,Y), nó được tuần tự hóa bằng cách đệm mỗi phần tử đến độ dài/2 với các số 0 đứng đầu nếu cần thiết.
Tất cả các kiểu dữ liệu đều theo định dạng Big Endian, ngoại trừ EdDSA và RedDSA, được lưu trữ và truyền tải theo định dạng Little Endian.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/SigningPublicKey.html
SigningPrivateKey
Mô tả
Cấu trúc này được sử dụng để tạo chữ ký.
Mục lục
Loại và độ dài khóa được chỉ định khi tạo. Loại mặc định là DSA_SHA1. Từ phiên bản 0.9.12, các loại khác có thể được hỗ trợ, tùy thuộc vào ngữ cảnh.
| 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 |
Khi một key được tạo thành từ hai phần tử (ví dụ các điểm X,Y), nó được tuần tự hóa bằng cách đệm mỗi phần tử đến độ dài length/2 với các số 0 đứng đầu nếu cần thiết.
Tất cả các kiểu dữ liệu đều sử dụng Big Endian, ngoại trừ EdDSA và RedDSA, được lưu trữ và truyền tải theo định dạng Little Endian.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/SigningPrivateKey.html
Chữ ký
Mô tả
Cấu trúc này đại diện cho chữ ký của một số dữ liệu.
Mục lục
Loại chữ ký và độ dài được suy ra từ loại khóa được sử dụng. Loại mặc định là DSA_SHA1. Kể từ phiên bản 0.9.12, các loại khác có thể được hỗ trợ, tùy thuộc vào ngữ cảnh.
| 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 |
Khi một chữ ký được cấu thành từ hai phần tử (ví dụ các giá trị R,S), nó được tuần tự hóa bằng cách đệm mỗi phần tử đến độ dài/2 với các số 0 đứng đầu nếu cần thiết.
Tất cả các kiểu dữ liệu đều theo định dạng Big Endian, trừ EdDSA và RedDSA được lưu trữ và truyền tải theo định dạng Little Endian.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/Signature.html
Hash
Mô tả
Đại diện cho SHA256 của một số dữ liệu.
Mục lục
32 byte
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/Hash.html
Thẻ phiên
Lưu ý: Session Tags cho các đích ECIES-X25519 (ratchet) và các router ECIES-X25519 có độ dài 8 byte. Xem ECIES và ECIES-ROUTERS .
Mô tả
Một số ngẫu nhiên
Mục lục
32 byte
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/SessionTag.html
TunnelId
Mô tả
Định nghĩa một định danh duy nhất cho mỗi router trong một tunnel. Tunnel ID thường lớn hơn không; đừng sử dụng giá trị bằng không trừ trong các trường hợp đặc biệt.
Mục lục
4 byte Integer
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/TunnelId.html
Chứng chỉ
Mô tả
Chứng chỉ là một thùng chứa cho các biên lai hoặc bằng chứng công việc khác nhau được sử dụng trên toàn mạng I2P.
Nội dung
1 byte Integer chỉ định loại chứng chỉ, theo sau là 2 byte Integer chỉ định kích thước của payload chứng chỉ, sau đó là số byte tương ứng.
+----+----+----+----+----+-/
|type| length | payload
+----+----+----+----+----+-/
type :: Integer
length -> 1 byte
length :: Integer
length -> 2 bytes
payload :: data
length -> $length bytes
Ghi chú
Đối với Router Identities , Certificate luôn là NULL cho đến phiên bản 0.9.15. Từ phiên bản 0.9.16, Key Certificate được sử dụng để chỉ định các loại khóa. Từ phiên bản 0.9.48, các loại khóa công khai mã hóa X25519 được cho phép. Xem bên dưới.
Đối với Garlic Cloves , Certificate luôn là NULL, hiện tại không có loại nào khác được triển khai.
Đối với Garlic Messages , Certificate luôn là NULL, hiện tại không có triển khai nào khác.
Đối với Destinations , Certificate có thể khác NULL. Từ phiên bản 0.9.12, Key Certificate có thể được sử dụng để chỉ định loại signing public key. Xem bên dưới.
Người triển khai được khuyến cáo cấm dữ liệu thừa trong Certificates. Độ dài phù hợp cho mỗi loại certificate nên được thực thi.
Loại Chứng chỉ
Các loại chứng chỉ sau đây được định nghĩa:
| 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. |
Chứng chỉ khóa được giới thiệu trong phiên bản 0.9.12. Trước phiên bản đó, tất cả PublicKey đều là khóa ElGamal 256-byte, và tất cả SigningPublicKey đều là khóa DSA-SHA1 128-byte. Chứng chỉ khóa cung cấp một cơ chế để chỉ định loại PublicKey và SigningPublicKey trong Destination hoặc RouterIdentity, và để đóng gói bất kỳ dữ liệu khóa nào vượt quá độ dài tiêu chuẩn.
Bằng cách duy trì chính xác 384 byte trước certificate và đặt bất kỳ dữ liệu khóa dư thừa nào bên trong certificate, chúng ta duy trì tính tương thích cho bất kỳ phần mềm nào phân tích cú pháp Destinations và Router Identities.
Tải trọng chứng chỉ khóa chứa:
| 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+ |
Các loại Signing Public Key đã được định nghĩa là:
| 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 |
Hoàn chỉnh hoặc phần đầu tiên của Crypto Public Key
Padding ngẫu nhiên nếu tổng độ dài của hai khóa ít hơn 384 byte
Toàn bộ hoặc phần đầu của Signing Public Key
Crypto Public Key được căn chỉnh ở đầu và Signing Public Key được căn chỉnh ở cuối. Phần đệm (nếu có) nằm ở giữa. Độ dài và ranh giới của dữ liệu khóa ban đầu, phần đệm, và các phần dữ liệu khóa dư thừa trong certificates không được chỉ định rõ ràng, mà được suy ra từ độ dài của các loại khóa đã chỉ định. Nếu tổng độ dài của Crypto và Signing Public Keys vượt quá 384 byte, phần còn lại sẽ được chứa trong Key Certificate. Nếu độ dài Crypto Public Key không phải là 256 byte, phương pháp xác định ranh giới giữa hai khóa sẽ được chỉ định trong phiên bản tương lai của tài liệu này.
Các ví dụ về bố cục sử dụng ElGamal Crypto Public Key và loại Signing Public Key được chỉ định:
| 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 |
Ghi chú
Các nhà phát triển được khuyến cáo nên cấm dữ liệu thừa trong Key Certificates. Độ dài phù hợp cho mỗi loại certificate nên được thực thi.
Chứng chỉ KEY với loại 0,0 (ElGamal,DSA_SHA1) được cho phép nhưng không được khuyến khích. Nó chưa được kiểm tra kỹ lưỡng và có thể gây ra vấn đề trong một số triển khai. Sử dụng chứng chỉ NULL trong biểu diễn chuẩn của một Destination hoặc RouterIdentity (ElGamal,DSA_SHA1), điều này sẽ ngắn hơn 4 byte so với việc sử dụng chứng chỉ KEY.
Ánh xạ
Mô tả
Một tập hợp các ánh xạ khóa/giá trị hoặc thuộc tính
Mục lục
Một số nguyên kích thước 2-byte theo sau bởi một chuỗi các cặp String=String;.
CẢNH BÁO: Hầu hết các sử dụng Mapping đều nằm trong các cấu trúc đã ký, nơi mà các mục Mapping phải được sắp xếp theo khóa, để chữ ký không thể thay đổi. Việc không sắp xếp theo khóa sẽ dẫn đến lỗi chữ ký!
+----+----+----+----+----+----+----+----+
| 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 ';'
Ghi chú
Việc mã hóa không tối ưu - chúng ta cần các ký tự ‘=’ và ‘;’, hoặc độ dài chuỗi, nhưng không cần cả hai
Một số tài liệu nói rằng các chuỗi có thể không bao gồm ‘=’ hoặc ‘;’ nhưng mã hóa này hỗ trợ chúng
Chuỗi được định nghĩa là UTF-8 nhưng trong triển khai hiện tại, I2CP sử dụng UTF-8 còn I2NP thì không. Ví dụ, các chuỗi UTF-8 trong ánh xạ tùy chọn RouterInfo trong một I2NP Database Store Message sẽ bị hỏng.
Mã hóa cho phép các khóa trùng lặp, tuy nhiên trong bất kỳ trường hợp sử dụng nào mà ánh xạ được ký, các khóa trùng lặp có thể gây ra lỗi chữ ký.
Các ánh xạ chứa trong thông điệp I2NP (ví dụ: trong RouterAddress hoặc RouterInfo) phải được sắp xếp theo khóa để chữ ký sẽ không thay đổi. Không cho phép khóa trùng lặp.
Các ánh xạ có trong I2CP SessionConfig phải được sắp xếp theo khóa để chữ ký sẽ không thay đổi. Không cho phép các khóa trùng lặp.
Phương thức sắp xếp được định nghĩa như trong Java String.compareTo(), sử dụng giá trị Unicode của các ký tự.
Mặc dù phụ thuộc vào ứng dụng, các khóa và giá trị thường phân biệt chữ hoa chữ thường.
Giới hạn độ dài chuỗi key và value là 255 byte (không phải ký tự) mỗi cái, cộng thêm byte độ dài. Byte độ dài có thể bằng 0.
Giới hạn tổng chiều dài là 65535 byte, cộng với trường kích thước 2 byte, tức là tổng cộng 65537 byte.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/DataHelper.html
Đặc tả cấu trúc chung
KeysAndCert
Mô tả
Một khóa công khai mã hóa, một khóa công khai ký số và một chứng chỉ, được sử dụng như một RouterIdentity hoặc một Destination.
Nội dung
Một PublicKey theo sau bởi một SigningPublicKey và sau đó là một 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
Những hướng dẫn này được đề xuất trong Đề xuất 161 và được triển khai trong phiên bản API 0.9.57. Những hướng dẫn này tương thích ngược với tất cả các phiên bản từ 0.6 (2005). Xem Đề xuất 161 để biết thêm thông tin cơ bản và chi tiết.
Đối với bất kỳ tổ hợp loại khóa nào hiện đang được sử dụng khác với ElGamal + DSA-SHA1, sẽ có padding. Ngoài ra, đối với các destination, trường public key 256-byte đã không được sử dụng kể từ phiên bản 0.6 (2005).
Các nhà phát triển nên tạo ra dữ liệu ngẫu nhiên cho các khóa công khai Destination và phần đệm cho Destination và Router Identity, sao cho nó có thể nén được trong các giao thức I2P khác nhau trong khi vẫn đảm bảo tính bảo mật, và không làm cho các biểu diễn Base 64 có vẻ bị hỏng hoặc không an toàn. Điều này cung cấp hầu hết các lợi ích của việc loại bỏ các trường đệm mà không cần thay đổi giao thức một cách đột ngột.
Nói một cách chính xác, chỉ riêng signing public key 32-byte (trong cả Destinations và Router Identities) và encryption public key 32-byte (chỉ trong Router Identities) là một số ngẫu nhiên cung cấp tất cả entropy cần thiết để các hash SHA-256 của những cấu trúc này có độ mạnh mã hóa và được phân bố ngẫu nhiên trong DHT của netDb.
Tuy nhiên, để đảm bảo an toàn tối đa, chúng tôi khuyến nghị sử dụng tối thiểu 32 byte dữ liệu ngẫu nhiên trong trường ElG public key và padding. Ngoài ra, nếu các trường đều bằng không, các destination Base 64 sẽ chứa chuỗi dài các ký tự AAAA, điều này có thể gây lo lắng hoặc nhầm lẫn cho người dùng.
Lặp lại 32 byte dữ liệu ngẫu nhiên khi cần thiết để cấu trúc KeysAndCert đầy đủ có thể nén cao trong các giao thức I2P như I2NP Database Store Message, Streaming SYN, SSU2 handshake và repliable Datagrams.
Ví dụ:
Một Router Identity với loại mã hóa X25519 và loại chữ ký Ed25519 sẽ chứa 10 bản sao (320 byte) dữ liệu ngẫu nhiên, tiết kiệm được khoảng 288 byte khi nén.
Một Destination với loại chữ ký Ed25519 sẽ chứa 11 bản sao (352 byte) của dữ liệu ngẫu nhiên, tiết kiệm được khoảng 320 byte khi nén.
Các implementation tất nhiên phải lưu trữ cấu trúc đầy đủ 387+ byte vì hash SHA-256 của cấu trúc bao phủ toàn bộ nội dung.
Ghi chú
Đừng cho rằng những thứ này luôn có độ dài 387 byte! Chúng có độ dài 387 byte cộng với độ dài certificate được chỉ định tại byte 385-386, có thể khác không.
Từ phiên bản 0.9.12, nếu chứng chỉ là Key Certificate, ranh giới của các trường khóa có thể thay đổi. Xem phần Key Certificate ở trên để biết chi tiết.
Crypto Public Key được căn chỉnh ở đầu và Signing Public Key được căn chỉnh ở cuối. Phần đệm (nếu có) nằm ở giữa.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/KeysAndCert.html
RouterIdentity
Mô tả
Định nghĩa cách để xác định duy nhất một router cụ thể
Nội dung
Tương tự với KeysAndCert.
Xem KeysAndCert để biết hướng dẫn về việc tạo dữ liệu ngẫu nhiên cho trường padding.
Ghi chú
Chứng chỉ cho một RouterIdentity luôn luôn là NULL cho đến phiên bản 0.9.12.
Đừng giả định rằng chúng luôn có 387 bytes! Chúng có 387 bytes cộng với độ dài certificate được chỉ định tại bytes 385-386, có thể khác không.
Kể từ phiên bản 0.9.12, nếu chứng chỉ là Key Certificate, các ranh giới của các trường khóa có thể thay đổi. Xem phần Key Certificate ở trên để biết chi tiết.
Crypto Public Key được căn chỉnh ở đầu và Signing Public Key được căn chỉnh ở cuối. Phần đệm (nếu có) nằm ở giữa.
RouterIdentities với key certificate và public key ECIES_X25519 được hỗ trợ từ phiên bản 0.9.48. Trước đó, tất cả RouterIdentities đều là ElGamal.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/router/RouterIdentity.html
Điểm đến
Mô tả
Destination định nghĩa một điểm cuối cụ thể mà các thông điệp có thể được chuyển đến để giao hàng an toàn.
Nội dung
Giống hệt với KeysAndCert , ngoại trừ việc public key không bao giờ được sử dụng và có thể chứa dữ liệu ngẫu nhiên thay vì một ElGamal Public Key hợp lệ.
Xem KeysAndCert để có hướng dẫn về việc tạo dữ liệu ngẫu nhiên cho các trường public key và padding.
Ghi chú
Public key của destination đã được sử dụng cho mã hóa i2cp-to-i2cp cũ đã bị vô hiệu hóa trong phiên bản 0.6 (2005), hiện tại không được sử dụng ngoại trừ cho IV để mã hóa LeaseSet, điều này đã lỗi thời. Thay vào đó, public key trong LeaseSet được sử dụng.
Đừng cho rằng chúng luôn có độ dài 387 bytes! Chúng có độ dài 387 bytes cộng với độ dài certificate được chỉ định tại bytes 385-386, có thể khác không.
Kể từ phiên bản 0.9.12, nếu chứng chỉ là Key Certificate, ranh giới của các trường khóa có thể thay đổi. Xem phần Key Certificate ở trên để biết chi tiết.
Crypto Public Key được căn chỉnh ở đầu và Signing Public Key được căn chỉnh ở cuối. Padding (nếu có) nằm ở giữa.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/Destination.html
Lease
Mô tả
Xác định quyền ủy quyền cho một tunnel cụ thể để nhận các thông điệp nhắm đến một Destination .
Mục lục
SHA256 Hash của RouterIdentity của gateway router, sau đó là TunnelId , và cuối cùng là Date kết thúc.
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
Mô tả
Chứa tất cả các Lease hiện được ủy quyền cho một Destination cụ thể, PublicKey mà các thông điệp garlic có thể được mã hóa, và sau đó là SigningPublicKey có thể được sử dụng để thu hồi phiên bản cụ thể này của cấu trúc. LeaseSet là một trong hai cấu trúc được lưu trữ trong cơ sở dữ liệu mạng (cấu trúc kia là RouterInfo ), và được đánh khóa dưới SHA256 của Destination có chứa.
Mục lục
Destination , tiếp theo là một PublicKey để mã hóa, sau đó là SigningPublicKey có thể được sử dụng để thu hồi phiên bản này của LeaseSet, tiếp theo là 1 byte Integer chỉ định có bao nhiêu cấu trúc Lease trong tập hợp, tiếp theo là các cấu trúc Lease thực tế và cuối cùng là Signature của các byte trước đó được ký bởi SigningPrivateKey của 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
Khóa công khai của đích đến đã được sử dụng cho mã hóa I2CP-to-I2CP cũ đã bị vô hiệu hóa trong phiên bản 0.6, hiện tại không còn được sử dụng.
Khóa mã hóa được sử dụng cho mã hóa ElGamal/AES+SessionTag đầu cuối ELGAMAL-AES . Hiện tại nó được tạo mới mỗi khi router khởi động, không được lưu trữ vĩnh viễn.
Chữ ký có thể được xác minh bằng cách sử dụng khóa công khai ký của đích đến.
Một LeaseSet với số Lease bằng không được cho phép nhưng không được sử dụng. Nó được dự định cho việc thu hồi LeaseSet, nhưng chưa được triển khai. Tất cả các biến thể LeaseSet2 đều yêu cầu ít nhất một Lease.
signing_key hiện tại không được sử dụng. Nó được dự định cho việc thu hồi LeaseSet, nhưng chưa được triển khai. Hiện tại nó được tạo mới mỗi khi router khởi động và không được lưu trữ lâu dài. Loại signing key luôn giống với loại signing key của destination.
Thời điểm hết hạn sớm nhất của tất cả các Lease được coi như timestamp hoặc phiên bản của LeaseSet. Các router thường sẽ không chấp nhận lưu trữ một LeaseSet trừ khi nó “mới hơn” LeaseSet hiện tại. Cần lưu ý khi xuất bản một LeaseSet mới mà Lease cũ nhất giống với Lease cũ nhất trong LeaseSet trước đó. Router xuất bản thường nên tăng thời điểm hết hạn của Lease cũ nhất ít nhất 1 ms trong trường hợp đó.
Trước phiên bản 0.9.7, khi được bao gồm trong DatabaseStore Message được gửi bởi router gốc, router đã đặt tất cả thời gian hết hạn của các lease đã xuất bản thành cùng một giá trị, là giá trị của lease sớm nhất. Kể từ phiên bản 0.9.7, router xuất bản thời gian hết hạn lease thực tế cho từng lease. Đây là chi tiết triển khai và không phải là một phần của đặc tả cấu trúc.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/LeaseSet.html
Lease2
Mô tả
Định nghĩa quyền ủy quyền cho một tunnel cụ thể để nhận tin nhắn hướng đến một Destination . Giống như Lease nhưng có end_date 4 byte. Được sử dụng bởi LeaseSet2 . Được hỗ trợ từ phiên bản 0.9.38; xem đề xuất 123 để biết thêm thông tin.
Nội dung
SHA256 Hash của RouterIdentity của gateway router, sau đó là TunnelId , và cuối cùng là ngày kết thúc 4 byte.
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.
- Tổng kích thước: 40 byte
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/Lease2.html
OfflineSignature
Mô tả
Đây là một phần tùy chọn của LeaseSet2Header . Cũng được sử dụng trong streaming và I2CP. Được hỗ trợ từ phiên bản 0.9.38; xem đề xuất 123 để biết thêm thông tin.
Nội dung
Chứa thời hạn hết hiệu lực, một sigtype và SigningPublicKey tạm thời, và một 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.
- Phần này có thể và nên được tạo offline.
LeaseSet2Header
Mô tả
Đây là phần chung của LeaseSet2 và MetaLeaseSet . Được hỗ trợ từ phiên bản 0.9.38; xem đề xuất 123 để biết thêm thông tin.
Nội dung
Chứa Destination , hai dấu thời gian, và một OfflineSignature tùy chọn.
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 bytes):
- Bit 0: Nếu được thiết lập, offline keys có mặt (xem OfflineSignature )
- Bit 1: Nếu được thiết lập, đây là một leaseset chưa được công bố
- Bit 2: Nếu được thiết lập, đây là một blinded leaseset
- Bits 15-3: Dành riêng, thiết lập thành 0
Tổng kích thước: tối thiểu 395 byte
Thời gian hết hạn thực tế tối đa là khoảng 660 (11 phút) cho LeaseSet2 và 65535 (tổng cộng 18,2 giờ) cho MetaLeaseSet .
LeaseSet (1) không có trường ‘published’, vì vậy việc tạo phiên bản yêu cầu tìm kiếm lease sớm nhất. LeaseSet2 bổ sung trường ‘published’ với độ phân giải một giây. Các router nên giới hạn tốc độ gửi leasesets mới tới floodfills với tốc độ chậm hơn nhiều so với một lần mỗi giây (mỗi đích đến). Nếu điều này không được triển khai, thì mã phải đảm bảo rằng mỗi leaseset mới có thời gian ‘published’ ít nhất một giây muộn hơn so với leaseset trước đó, nếu không các floodfills sẽ không lưu trữ hoặc flood leaseset mới.
LeaseSet2
Mô tả
Được chứa trong thông điệp I2NP DatabaseStore loại 3. Được hỗ trợ từ phiên bản 0.9.38; xem đề xuất 123 để biết thêm thông tin.
Chứa tất cả các Lease2 hiện được ủy quyền cho một Destination cụ thể, và PublicKey mà các tin nhắn garlic encryption có thể được mã hóa. LeaseSet là một trong hai cấu trúc được lưu trữ trong cơ sở dữ liệu mạng (cấu trúc kia là RouterInfo ), và được lập chỉ mục dưới mã SHA256 của Destination chứa trong đó.
Nội dung
LeaseSet2Header , theo sau bởi các tùy chọn, sau đó một hoặc nhiều PublicKey để mã hóa, Integer chỉ định có bao nhiều cấu trúc Lease2 trong tập hợp, theo sau bởi các cấu trúc Lease2 thực tế và cuối cùng là một Signature của các byte trước đó được ký bởi SigningPrivateKey của Destination hoặc khóa tạm thời.
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
Đối với các leaseSet đã được công bố (server), các khóa mã hóa được sắp xếp theo thứ tự ưu tiên của server, khóa được ưu tiên nhất đứng đầu. Nếu client hỗ trợ nhiều hơn một loại mã hóa, khuyến nghị chúng tuân thủ sự ưu tiên của server và chọn loại được hỗ trợ đầu tiên làm phương thức mã hóa để sử dụng khi kết nối tới server. Nhìn chung, các loại khóa mới hơn (có số thứ tự cao hơn) an toàn hơn hoặc hiệu quả hơn và được ưu tiên, vì vậy các khóa nên được liệt kê theo thứ tự ngược của loại khóa.
Tuy nhiên, các client có thể, tùy thuộc vào cách triển khai, lựa chọn dựa trên sở thích của họ thay vì vậy, hoặc sử dụng một số phương pháp để xác định sở thích “kết hợp”. Điều này có thể hữu ích như một tùy chọn cấu hình, hoặc để gỡ lỗi.
Thứ tự khóa trong các leaseSet chưa được xuất bản (client) thực tế không quan trọng, vì các kết nối thường sẽ không được thử nghiệm đến các client chưa được xuất bản. Trừ khi thứ tự này được sử dụng để xác định một ưu tiên kết hợp, như đã mô tả ở trên.
Tùy chọn
Kể từ API 0.9.66, một định dạng chuẩn cho các tùy chọn service record đã được định nghĩa. Xem đề xuất 167 để biết chi tiết. Các tùy chọn khác ngoài service records, sử dụng định dạng khác, có thể được định nghĩa trong tương lai.
Các tùy chọn LS2 PHẢI được sắp xếp theo khóa, do đó chữ ký là bất biến.
Các tùy chọn bản ghi dịch vụ được định nghĩa như sau:
- serviceoption := optionkey optionvalue
- optionkey := _service._proto
- service := Tên ký hiệu của dịch vụ mong muốn. Phải là chữ thường. Ví dụ: “smtp”. Các ký tự được phép là [a-z0-9-] và không được bắt đầu hoặc kết thúc bằng ‘-’. Các định danh chuẩn từ REGISTRY hoặc Linux /etc/services phải được sử dụng nếu được định nghĩa ở đó.
- proto := Giao thức vận chuyển của dịch vụ mong muốn. Phải là chữ thường, là “tcp” hoặc “udp”. “tcp” có nghĩa là streaming và “udp” có nghĩa là repliable datagrams. Các chỉ thị giao thức cho raw datagrams và datagram2 có thể được định nghĩa sau. Các ký tự được phép là [a-z0-9-] và không được bắt đầu hoặc kết thúc bằng ‘-’.
- optionvalue := self | srvrecord[,srvrecord]*
- self := “0” ttl port [appoptions]
- srvrecord := “1” ttl priority weight port target [appoptions]
- ttl := thời gian tồn tại, số giây nguyên. Số nguyên dương. Ví dụ: “86400”. Khuyến nghị tối thiểu là 86400 (một ngày), xem phần Khuyến nghị bên dưới để biết chi tiết.
- priority := Độ ưu tiên của máy chủ đích, giá trị thấp hơn có nghĩa là được ưu tiên hơn. Số nguyên không âm. Ví dụ: “0” Chỉ hữu ích nếu có nhiều hơn một bản ghi, nhưng vẫn bắt buộc ngay cả khi chỉ có một bản ghi.
- weight := Trọng số tương đối cho các bản ghi có cùng độ ưu tiên. Giá trị cao hơn có nghĩa là có nhiều khả năng được chọn hơn. Số nguyên không âm. Ví dụ: “0” Chỉ hữu ích nếu có nhiều hơn một bản ghi, nhưng vẫn bắt buộc ngay cả khi chỉ có một bản ghi.
- port := Cổng I2CP mà dịch vụ có thể được tìm thấy. Số nguyên không âm. Ví dụ: “25” Cổng 0 được hỗ trợ nhưng không khuyến nghị.
- target := Hostname hoặc b32 của đích cung cấp dịch vụ. Một hostname hợp lệ như trong NAMING . Phải là chữ thường. Ví dụ: “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b32.i2p” hoặc “example.i2p”. b32 được khuyến nghị trừ khi hostname là “nổi tiếng”, tức là có trong sổ địa chỉ chính thức hoặc mặc định.
- appoptions := văn bản tùy ý dành riêng cho ứng dụng, không được chứa " " hoặc “,”. Mã hóa là UTF-8.
Ví dụ:
Trong LS2 cho aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b32.i2p, trỏ đến một máy chủ SMTP:
“_smtp._tcp” “1 86400 0 0 25 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.b32.i2p”
Trong LS2 cho aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b32.i2p, trỏ đến hai máy chủ SMTP:
“_smtp._tcp” “1 86400 0 0 25 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.b32.i2p,86400 1 0 25 cccccccccccccccccccccccccccccccccccccccccccc.b32.i2p”
Trong LS2 cho bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.b32.i2p, trỏ đến chính nó như một máy chủ SMTP:
“_smtp._tcp” “0 999999 25”
Ghi chú
Khóa công khai của destination đã được sử dụng cho mã hóa I2CP-to-I2CP cũ đã bị vô hiệu hóa trong phiên bản 0.6, hiện tại nó không được sử dụng.
Các khóa mã hóa được sử dụng cho mã hóa ElGamal/AES+SessionTag đầu cuối đến đầu cuối ELGAMAL-AES (loại 0) hoặc các sơ đồ mã hóa đầu cuối đến đầu cuối khác. Xem ECIES và đề xuất 145 và 156. Chúng có thể được tạo mới mỗi khi router khởi động hoặc chúng có thể được lưu trữ lâu dài. X25519 (loại 4, xem ECIES ) được hỗ trợ từ phiên bản 0.9.44.
Chữ ký được tạo trên dữ liệu ở trên, được THÊM VÀO TRƯỚC với byte đơn chứa loại DatabaseStore (3).
Chữ ký có thể được xác minh bằng khóa công khai ký của destination, hoặc khóa công khai ký tạm thời, nếu chữ ký offline được bao gồm trong header của leaseset2.
Độ dài khóa được cung cấp cho mỗi khóa, để các floodfill và client có thể phân tích cấu trúc ngay cả khi không phải tất cả các loại mã hóa đều được biết hoặc hỗ trợ.
Xem ghi chú về trường ‘published’ trong LeaseSet2Header
Ánh xạ các tùy chọn, nếu kích thước lớn hơn một, phải được sắp xếp theo khóa để chữ ký không đổi.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/LeaseSet2.html
MetaLease
Mô tả
Định nghĩa quyền ủy quyền cho một tunnel cụ thể để nhận tin nhắn nhắm đến một Destination . Giống như Lease2 nhưng với flags và cost thay vì tunnel id. Được sử dụng bởi MetaLeaseSet . Chứa trong tin nhắn I2NP DatabaseStore loại 7. Được hỗ trợ từ phiên bản 0.9.38; xem đề xuất 123 để biết thêm thông tin.
Mục lục
SHA256 Hash của RouterIdentity của gateway router, sau đó là flags và cost, và cuối cùng là ngày kết thúc 4 byte.
+----+----+----+----+----+----+----+----+
| 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.
Ghi chú
- Tổng kích thước: 40 bytes
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/MetaLease.html
MetaLeaseSet
Mô tả
Được chứa trong một thông điệp I2NP DatabaseStore loại 7. Được định nghĩa từ phiên bản 0.9.38; dự kiến hoạt động từ phiên bản 0.9.40; xem đề xuất 123 để biết thêm thông tin.
Chứa tất cả MetaLease hiện được ủy quyền cho một Destination cụ thể, và PublicKey mà các tin nhắn garlic encryption có thể được mã hóa. LeaseSet là một trong hai cấu trúc được lưu trữ trong cơ sở dữ liệu mạng (cấu trúc kia là RouterInfo ), và được đánh khóa dưới SHA256 của Destination chứa trong đó.
Mục lục
LeaseSet2Header , theo sau bởi các tùy chọn, Integer chỉ định có bao nhiêu cấu trúc Lease2 trong tập hợp, tiếp theo là các cấu trúc Lease2 thực tế và cuối cùng là một Signature của các byte trước đó được ký bởi SigningPrivateKey của Destination hoặc khóa tạm thời.
+----+----+----+----+----+----+----+----+
| 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
Ghi chú
Khóa công khai của đích đến đã được sử dụng cho mã hóa I2CP-to-I2CP cũ đã bị vô hiệu hóa trong phiên bản 0.6, hiện tại nó không được sử dụng.
Chữ ký được tạo trên dữ liệu ở trên, được THÊM VÀO TRƯỚC với một byte đơn chứa loại DatabaseStore (7).
Chữ ký có thể được xác minh bằng cách sử dụng khóa công khai ký của destination, hoặc khóa công khai ký tạm thời, nếu một chữ ký offline được bao gồm trong header của leaseset2.
Xem ghi chú về trường ‘published’ trong LeaseSet2Header
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/MetaLeaseSet.html
EncryptedLeaseSet
Mô tả
Được chứa trong thông điệp I2NP DatabaseStore loại 5. Được định nghĩa từ phiên bản 0.9.38; hoạt động từ phiên bản 0.9.39; xem đề xuất 123 để biết thêm thông tin.
Chỉ có blinded key và thời gian hết hạn hiển thị dưới dạng văn bản rõ. LeaseSet thực tế được mã hóa.
Mục lục
Một loại chữ ký hai byte, SigningPrivateKey được làm mù, thời gian xuất bản, thời gian hết hạn và các cờ. Tiếp theo, một độ dài hai byte theo sau là dữ liệu được mã hóa. Cuối cùng, một Signature của các byte trước đó được ký bởi SigningPrivateKey được làm mù hoặc khóa tạm thời.
+----+----+----+----+----+----+----+----+
| 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
Ghi chú
Khóa công khai của đích đã được sử dụng cho mã hóa I2CP-to-I2CP cũ đã bị vô hiệu hóa trong phiên bản 0.6, hiện tại không được sử dụng.
Chữ ký được tính trên dữ liệu ở trên, được THÊM VÀO TRƯỚC với một byte duy nhất chứa loại DatabaseStore (5).
Chữ ký có thể được xác minh bằng cách sử dụng khóa công khai ký của destination, hoặc khóa công khai ký tạm thời, nếu một chữ ký offline được bao gồm trong header của leaseset2.
Blinding và encryption được quy định trong EncryptedLeaseSet
Cấu trúc này không sử dụng LeaseSet2Header .
Thời gian hết hạn thực tế tối đa là khoảng 660 (11 phút), trừ khi đó là một MetaLeaseSet được mã hóa.
Xem đề xuất 123 để biết ghi chú về việc sử dụng chữ ký offline với leaseSet được mã hóa.
Xem ghi chú về trường ‘published’ trong LeaseSet2Header (cùng vấn đề, mặc dù chúng ta không sử dụng định dạng LeaseSet2Header ở đây)
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/EncryptedLeaseSet.html
RouterAddress
Mô tả
Cấu trúc này định nghĩa phương tiện để liên lạc với một router thông qua giao thức truyền tải.
Mục lục
1 byte Integer định nghĩa chi phí tương đối khi sử dụng địa chỉ, trong đó 0 là miễn phí và 255 là đắt đỏ, theo sau là Date hết hạn sau đó địa chỉ không nên được sử dụng, hoặc nếu null thì địa chỉ không bao giờ hết hạn. Sau đó là một String định nghĩa giao thức vận chuyển mà địa chỉ router này sử dụng. Cuối cùng có một Mapping chứa tất cả các tùy chọn cụ thể cho phương thức vận chuyển cần thiết để thiết lập kết nối, như địa chỉ IP, số cổng, địa chỉ email, URL, v.v.
+----+----+----+----+----+----+----+----+
|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`
Ghi chú
Chi phí thường là 5 hoặc 6 cho SSU, và 10 hoặc 11 cho NTCP.
Expiration hiện tại không được sử dụng, luôn null (toàn bộ số không). Kể từ phiên bản 0.9.3, expiration được giả định là zero và không được lưu trữ, do đó bất kỳ expiration khác không nào sẽ thất bại trong quá trình xác minh chữ ký RouterInfo. Việc triển khai expiration (hoặc sử dụng khác cho các byte này) sẽ là một thay đổi không tương thích ngược. Các router PHẢI đặt trường này thành toàn bộ số không. Kể từ phiên bản 0.9.12, trường expiration khác không lại được nhận diện, tuy nhiên chúng ta phải đợi vài phiên bản nữa để sử dụng trường này, cho đến khi phần lớn mạng lưới nhận diện nó.
Các tùy chọn sau, mặc dù không bắt buộc, là tiêu chuẩn và được mong đợi có mặt trong hầu hết các địa chỉ router: “host” (một địa chỉ IPv4 hoặc IPv6 hoặc tên host) và “port”.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/router/RouterAddress.html
RouterInfo
Mô tả
Định nghĩa tất cả dữ liệu mà một router muốn công bố để mạng có thể thấy. RouterInfo là một trong hai cấu trúc được lưu trữ trong cơ sở dữ liệu mạng (cái còn lại là LeaseSet ), và được đánh khóa dưới SHA256 của RouterIdentity chứa bên trong.
Mục lục
RouterIdentity theo sau bởi Date , khi mục này được xuất bản
+----+----+----+----+----+----+----+----+
| 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
Ghi chú
Giá trị peer_size Integer có thể được theo sau bởi một danh sách chứa nhiều router hash tương ứng. Tính năng này hiện tại chưa được sử dụng. Nó được dự định cho một dạng restricted routes, nhưng chưa được triển khai. Một số triển khai có thể yêu cầu danh sách này được sắp xếp để chữ ký không thay đổi. Cần được nghiên cứu thêm trước khi kích hoạt tính năng này.
Chữ ký có thể được xác minh bằng khóa công khai ký của router_ident.
Xem trang cơ sở dữ liệu mạng NETDB-ROUTERINFO để biết các tùy chọn tiêu chuẩn dự kiến sẽ có mặt trong tất cả thông tin router.
Các router rất cũ yêu cầu các địa chỉ phải được sắp xếp theo SHA256 của dữ liệu của chúng để chữ ký không thay đổi. Điều này không còn cần thiết nữa, và không đáng để triển khai cho khả năng tương thích ngược.
JavaDoc: http://docs.i2p-projekt.de/net/i2p/data/router/RouterInfo.html
Hướng Dẫn Giao Hàng
Hướng dẫn Gửi Tin nhắn Tunnel được định nghĩa trong Đặc tả Tin nhắn Tunnel TUNNEL-DELIVERY .
Garlic Message Delivery Instructions được định nghĩa trong I2NP Message Specification GARLIC-DELIVERY .