Bu belge, I2NP , I2CP , SSU vb. gibi tüm I2P protokollerinde ortak olan bazı veri türlerini açıklar.
Ortak tür belirtimi
Tamsayı
Açıklama
Negatif olmayan bir tamsayıyı temsil eder.
İçindekiler
Network byte order (big endian) ile işaretsiz bir tamsayıyı temsil eden 1 ila 8 bayt.
Tarih
Açıklama
GMT saat diliminde 1 Ocak 1970 gece yarısından bu yana geçen milisaniye sayısı. Sayı 0 ise, tarih tanımsız veya null’dur.
İçindekiler
8 bayt Integer
Dize
Açıklama
UTF-8 kodlanmış bir dizeyi temsil eder.
İçindekiler
İlk baytın string’deki bayt sayısını (karakter sayısını değil!) belirttiği ve kalan 0-255 baytın null ile sonlandırılmamış UTF-8 kodlanmış karakter dizisi olduğu 1 veya daha fazla bayt. Uzunluk sınırı 255 bayttır (karakter değil). Uzunluk 0 olabilir.
PublicKey
Açıklama
Bu yapı ElGamal veya diğer asimetrik şifreleme yöntemlerinde kullanılır ve yalnızca üssü temsil eder, sabit olan ve kriptografi spesifikasyonunda ELGAMAL tanımlanan asal sayıları değil. Diğer şifreleme şemaları tanımlanma sürecindedir, aşağıdaki tabloyu görün.
İçindekiler
Anahtar türü ve uzunluğu bağlamdan çıkarılır veya bir Destination ya da RouterInfo’nun Key Certificate’ında veya bir LeaseSet2 ya da diğer veri yapılarındaki alanlarda belirtilir. Varsayılan tür ElGamal’dır. 0.9.38 sürümünden itibaren, bağlama bağlı olarak diğer türler de desteklenebilir. Aksi belirtilmedikçe anahtarlar big-endian formatındadır.
X25519 anahtarları, 0.9.44 sürümünden itibaren Destination’larda ve LeaseSet2’de desteklenmektedir. X25519 anahtarları, 0.9.48 sürümünden itibaren RouterIdentity’lerde desteklenmektedir.
| 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
Açıklama
Bu yapı ElGamal veya diğer asimetrik şifre çözmede kullanılır ve yalnızca üssü temsil eder, kriptografi spesifikasyonunda ELGAMAL sabit olarak tanımlanan asal sayıları değil. Diğer şifreleme şemaları tanımlanma sürecindedir, aşağıdaki tabloya bakın.
İçindekiler
Anahtar tipi ve uzunluğu bağlamdan çıkarılır veya bir veri yapısında ya da özel anahtar dosyasında ayrı olarak saklanır. Varsayılan tip ElGamal’dır. 0.9.38 sürümünden itibaren, bağlama bağlı olarak diğer tipler desteklenebilir. Aksi belirtilmedikçe anahtarlar big-endian formatındadır.
| 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
Açıklama
Bu yapı simetrik AES256 şifreleme ve şifre çözme için kullanılır.
İçindekiler
32 bayt
JavaDoc: net.i2p.data.SessionKey
SigningPublicKey
Açıklama
Bu yapı imzaları doğrulamak için kullanılır.
İçindekiler
Anahtar türü ve uzunluğu bağlamdan çıkarılır veya bir Destination’ın Key Certificate’inde belirtilir. Varsayılan tür DSA_SHA1’dir. 0.9.12 sürümünden itibaren, bağlama bağlı olarak diğer türler desteklenebilir.
| 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 |
Bir anahtar iki elemandan oluştuğunda (örneğin X,Y noktaları), her eleman gerekirse önünde sıfırlar eklenerek uzunluk/2’ye tamamlanarak serileştirilir.
EdDSA ve RedDSA hariç tüm türler Big Endian formatındadır; EdDSA ve RedDSA Little Endian formatında saklanır ve iletilir.
JavaDoc: net.i2p.data.SigningPublicKey
SigningPrivateKey
Açıklama
Bu yapı imza oluşturmak için kullanılır.
İçindekiler
Anahtar türü ve uzunluğu oluşturulurken belirtilir. Varsayılan tür DSA_SHA1’dir. 0.9.12 sürümü itibariyle, bağlama bağlı olarak diğer türler de desteklenebilir.
| 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 |
Bir anahtar iki elementten oluştuğunda (örneğin X,Y noktaları), gerekirse her element başına sıfırlar eklenerek uzunluk/2’ye tamamlanarak serileştirilir.
Tüm türler Big Endian formatındadır, EdDSA ve RedDSA hariç - bunlar Little Endian formatında saklanır ve iletilir.
JavaDoc: net.i2p.data.SigningPrivateKey
İmza
Açıklama
Bu yapı, bazı verilerin imzasını temsil eder.
İçindekiler
İmza türü ve uzunluğu kullanılan anahtarın türünden çıkarılır. Varsayılan tür DSA_SHA1’dir. 0.9.12 sürümünden itibaren, bağlama bağlı olarak diğer türler de desteklenebilir.
| 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 |
Bir imza iki elemandan oluştuğunda (örneğin R,S değerleri), her eleman gerekirse başına sıfırlar eklenerek length/2 uzunluğuna doldurularak serileştirilir.
Tüm türler Big Endian formatındadır, EdDSA ve RedDSA hariç; bunlar Little Endian formatında saklanır ve iletilir.
JavaDoc: net.i2p.data.Signature
Hash
Açıklama
Bazı verilerin SHA256 değerini temsil eder.
İçindekiler
32 bayt
JavaDoc: net.i2p.data.Hash
Oturum Etiketi
Not: ECIES-X25519 hedefleri (ratchet) ve ECIES-X25519 router’ları için Session Tag’ler 8 bayttır. Bkz. ECIES ve ECIES-ROUTERS .
Açıklama
Rastgele bir sayı
İçindekiler
32 bayt
JavaDoc: net.i2p.data.SessionTag
TunnelId
Açıklama
Bir tunnel içindeki her router için benzersiz olan bir tanımlayıcı belirler. Tunnel ID genellikle sıfırdan büyüktür; özel durumlar dışında sıfır değeri kullanmayın.
İçindekiler
4 bayt Integer
JavaDoc: net.i2p.data.TunnelId
Sertifika
Açıklama
Sertifika, I2P ağı boyunca kullanılan çeşitli makbuzlar veya iş kanıtları için bir kapsayıcıdır.
İçindekiler
Sertifika türünü belirten 1 bayt Integer , ardından sertifika yük boyutunu belirten 2 bayt Integer , sonra o kadar bayt.
+----+----+----+----+----+-/
|type| length | payload
+----+----+----+----+----+-/
type :: Integer
length -> 1 byte
length :: Integer
length -> 2 bytes
payload :: data
length -> $length bytes
Notlar
Router Identities için, Certificate 0.9.15 sürümü dahil olmak üzere her zaman NULL’dur. 0.9.16 sürümünden itibaren, anahtar türlerini belirtmek için bir Key Certificate kullanılır. 0.9.48 sürümünden itibaren, X25519 şifreleme public key türlerine izin verilir. Aşağıya bakınız.
Garlic Cloves için, Certificate her zaman NULL’dur, şu anda başka hiçbiri uygulanmamıştır.
Garlic Messages için, Certificate her zaman NULL’dur, şu anda başka hiçbiri uygulanmamıştır.
Destinations için, Sertifika NULL olmayabilir. 0.9.12 sürümünden itibaren, imzalama genel anahtar türünü belirtmek için bir Anahtar Sertifikası kullanılabilir. Aşağıya bakınız.
Geliştiriciler, Sertifikalarda fazla veri bulunmasını yasaklamaları konusunda uyarılır. Her sertifika türü için uygun uzunluk zorlanmalıdır.
Sertifika Türleri
Aşağıdaki sertifika türleri tanımlanmıştır:
| 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. |
Key certificate’lar 0.9.12 sürümüyle tanıtıldı. Bu sürümden önce, tüm PublicKey’ler 256 baytlık ElGamal anahtarlarıydı ve tüm SigningPublicKey’ler 128 baytlık DSA-SHA1 anahtarlarıydı. Key certificate, Destination veya RouterIdentity içindeki PublicKey ve SigningPublicKey türünü belirtmek ve standart uzunlukları aşan herhangi bir anahtar verisini paketlemek için bir mekanizma sağlar.
Sertifikadan önce tam olarak 384 bayt koruyarak ve fazla anahtar verilerini sertifikanın içine koyarak, Destination’ları ve Router Identity’lerini ayrıştıran herhangi bir yazılım için uyumluluğu korumuş oluruz.
Anahtar sertifikası yükü şunları içerir:
| 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+ |
Tanımlanmış İmzalama Genel Anahtarı türleri şunlardır:
| 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 |
Crypto Public Key’in tamamı veya ilk kısmı
İki anahtarın toplam uzunluğu 384 bayttan azsa rastgele dolgu
İmza Public Key’inin tamamı veya ilk kısmı
Crypto Public Key başlangıçta hizalanır ve Signing Public Key sonunda hizalanır. Dolgu (varsa) ortadadır. Sertifikalardaki başlangıç anahtar verisi, dolgu ve fazla anahtar verisi bölümlerinin uzunlukları ve sınırları açıkça belirtilmez, ancak belirtilen anahtar türlerinin uzunluklarından türetilir. Crypto ve Signing Public Key’lerin toplam uzunlukları 384 baytı aşarsa, geri kalanı Key Certificate’te yer alacaktır. Crypto Public Key uzunluğu 256 bayt değilse, iki anahtar arasındaki sınırı belirleme yöntemi bu belgenin gelecekteki bir revizyonunda belirtilecektir.
Belirtilen ElGamal Crypto Public Key ve Signing Public Key türünü kullanan örnek düzenler:
| 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 |
Notlar
Uygulayıcıların Key Certificate’larda fazla veri bulunmasını yasaklaması tavsiye edilir. Her sertifika türü için uygun uzunluk zorlanmalıdır.
0,0 (ElGamal,DSA_SHA1) türlerindeki bir KEY sertifikası izin veriliyor ancak önerilmiyor. İyi test edilmemiştir ve bazı uygulamalarda sorunlara neden olabilir. (ElGamal,DSA_SHA1) Destination veya RouterIdentity’nin kanonik temsilinde KEY sertifikası kullanmaktan 4 bayt daha kısa olacak bir NULL sertifikası kullanın.
Eşleme
Açıklama
Bir anahtar/değer eşlemeleri veya özellikler kümesi
İçindekiler
2-byte boyutunda Integer ardından String=String; çiftleri serisi.
UYARI: Mapping kullanımlarının çoğu imzalı yapılarda olup, Mapping girdilerinin anahtar değerine göre sıralanması gerekir, böylece imza değiştirilemez hale gelir. Anahtar değerine göre sıralama yapılmaması imza hatalarına neden olacaktır!
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| size | key_string (len + data)| = |
+----+----+----+----+----+----+----+----+
| val_string (len + data) | ; | ...
+----+----+----+----+----+----+----+
- Kodlama optimal değil - ya ‘=’ ve ‘;’ karakterlerine ya da string uzunluklarına ihtiyacımız var, ikisine birden değil
Açıklama
Bazı belgelerde dizgelerin ‘=’ veya ‘;’ karakterlerini içeremeyeceği belirtilse de bu kodlama bunları destekler
String’ler UTF-8 olarak tanımlanmıştır ancak mevcut uygulamada I2CP UTF-8 kullanır fakat I2NP kullanmaz. Örneğin, bir I2NP Database Store Message içindeki RouterInfo seçenekleri eşlemesindeki UTF-8 string’ler bozulacaktır.
Kodlama duplicate anahtarlara izin verir, ancak eşlemenin imzalandığı herhangi bir kullanımda, duplicate’lar imza hatasına neden olabilir.
I2NP mesajlarında bulunan eşlemeler (örneğin RouterAddress veya RouterInfo’da) imzanın değişmez olması için anahtara göre sıralanmalıdır. Yinelenen anahtarlara izin verilmez.
Bir I2CP SessionConfig içinde bulunan eşlemeler, imzanın değişmez olması için anahtar bazında sıralanmış olmalıdır. Yinelenen anahtarlara izin verilmez.
Sıralama yöntemi, karakterlerin Unicode değerlerini kullanarak Java String.compareTo() metodunda olduğu gibi tanımlanır.
Uygulamaya bağlı olmakla birlikte, anahtarlar ve değerler genellikle büyük/küçük harf duyarlıdır.
Anahtar ve değer dizesi uzunluk limitleri her biri için 255 bayt (karakter değil) artı uzunluk baytıdır. Uzunluk baytı 0 olabilir.
Toplam uzunluk sınırı 65535 bayt artı 2 baytlık boyut alanı, yani toplamda 65537’dir.
X25519 şifreleme türü ve Ed25519 imza türüne sahip bir Router Identity, rastgele verinin 10 kopyasını (320 bayt) içerecektir ve sıkıştırıldığında yaklaşık 288 bayt tasarruf sağlayacaktır.
JavaDoc: net.i2p.data.DataHelper
Ortak yapı spesifikasyonu
KeysAndCert
İçindekiler
Bir şifreleme public key’i, bir imzalama public key’i ve RouterIdentity ya da Destination olarak kullanılan bir sertifika.
Dolgu Oluşturma Yönergeleri
Bir PublicKey ardından bir SigningPublicKey ve sonra bir 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
Bu kılavuzlar Öneri 161’de önerilmiş ve API sürüm 0.9.57’de uygulanmıştır. Bu kılavuzlar 0.6 (2005) sürümünden itibaren tüm sürümlerle geriye dönük uyumludur. Geçmiş bilgi ve daha fazla ayrıntı için Öneri 161’e bakınız.
ElGamal + DSA-SHA1 dışında şu anda kullanılan herhangi bir anahtar türü kombinasyonu için dolgu mevcut olacaktır. Ayrıca, hedefler için 256-bayt’lık genel anahtar alanı sürüm 0.6’dan (2005) beri kullanılmamaktadır.
Uygulayıcılar, Destination genel anahtarları ve Destination ile Router Identity dolgusu için rastgele veri üretirken, çeşitli I2P protokollerinde sıkıştırılabilir olmasını sağlamalı, güvenliği koruyarak Base 64 temsillerinin bozuk veya güvensiz görünmesini önlemelidir. Bu yaklaşım, dolgu alanlarını kaldırmanın faydalarının çoğunu disruptif protokol değişiklikleri olmadan sağlar.
Kesin olarak konuşmak gerekirse, tek başına 32-byte’lık imzalama public key’i (hem Destination’larda hem de Router Identity’lerde) ve 32-byte’lık şifreleme public key’i (sadece Router Identity’lerde) bu yapıların SHA-256 hash’lerinin kriptografik olarak güçlü olması ve network database DHT’sinde rastgele dağıtılması için gerekli tüm entropi’yi sağlayan rastgele bir sayıdır.
Ancak, aşırı ihtiyatlı olmak adına, ElG public key alanında ve padding’de minimum 32 bayt rastgele veri kullanılmasını öneriyoruz. Ayrıca, alanların hepsi sıfır olsaydı, Base 64 hedefleri uzun AAAA karakter dizileri içerecekti ve bu da kullanıcılarda alarm veya karışıklığa neden olabilirdi.
Tam KeysAndCert yapısının I2NP Database Store Message, Streaming SYN, SSU2 handshake ve yanıtlanabilir Datagrams gibi I2P protokollerinde yüksek oranda sıkıştırılabilir olması için gerektiği kadar 32 baytlık rastgele veriyi tekrarlayın.
Örnekler:
Ed25519 imza türüne sahip bir Destination, rastgele verinin 11 kopyasını (352 bayt) içerecek ve sıkıştırıldığında yaklaşık 320 bayt tasarruf sağlayacaktır.
Bunların her zaman 387 bayt olduğunu varsaymayın! Bunlar 387 bayt artı 385-386 baytlarında belirtilen sertifika uzunluğudur ve bu uzunluk sıfırdan farklı olabilir.
Uygulamalar, elbette, tam 387+ bayt yapısını saklamalıdır çünkü yapının SHA-256 hash’i tüm içeriği kapsar.
Açıklama
0.9.12 sürümünden itibaren, sertifika bir Key Certificate ise, anahtar alanlarının sınırları değişebilir. Ayrıntılar için yukarıdaki Key Certificate bölümüne bakın.
Crypto Public Key başlangıçta hizalanır ve Signing Public Key sonunda hizalanır. Dolgu (varsa) ortadadır.
RouterIdentity için sertifika 0.9.12 sürümüne kadar her zaman NULL idi.
JavaDoc: net.i2p.data.KeysAndCert
RouterIdentity
İçindekiler
Belirli bir router’ı benzersiz şekilde tanımlamanın yolunu belirler
Notlar
KeysAndCert ile aynı.
Padding alanı için rastgele veri üretme konusunda yönergeler için KeysAndCert bölümüne bakın.
Açıklama
Bunların her zaman 387 bayt olduğunu varsaymayın! Bunlar 387 bayt artı 385-386 baytlarında belirtilen sertifika uzunluğudur ve bu uzunluk sıfır olmayabilir.
0.9.12 sürümü itibariyle, eğer sertifika bir Key Certificate ise, anahtar alanlarının sınırları değişebilir. Ayrıntılar için yukarıdaki Key Certificate bölümüne bakın.
Crypto Public Key başlangıçta hizalanır ve Signing Public Key sonunda hizalanır. Dolgu (varsa) ortadadır.
Key certificate (anahtar sertifikası) ve ECIES_X25519 public key içeren RouterIdentity’ler 0.9.48 sürümünden itibaren desteklenmektedir. Bundan önce, tüm RouterIdentity’ler ElGamal idi.
Hedefin public key’i, 0.6 sürümünde (2005) devre dışı bırakılan eski i2cp-to-i2cp şifrelemesi için kullanılıyordu, şu anda kullanımdan kaldırılan LeaseSet şifrelemesi için IV dışında kullanılmamaktadır. Bunun yerine LeaseSet içindeki public key kullanılır.
JavaDoc: net.i2p.data.router.RouterIdentity
Hedef
İçindekiler
Bir Destination, mesajların güvenli teslimat için yönlendirilebileceği belirli bir uç noktayı tanımlar.
Notlar
KeysAndCert ile aynıdır, ancak public key hiçbir zaman kullanılmaz ve geçerli bir ElGamal Public Key yerine rastgele veri içerebilir.
Public key ve padding alanları için rastgele veri üretme yönergeleri için KeysAndCert bölümüne bakın.
Açıklama
Bunların her zaman 387 bayt olduğunu varsaymayın! Bu değerler 387 bayt artı 385-386 baytlarında belirtilen sertifika uzunluğudur ve bu uzunluk sıfır olmayabilir.
Sürüm 0.9.12 itibariyle, sertifika bir Key Certificate ise, anahtar alanlarının sınırları değişebilir. Ayrıntılar için yukarıdaki Key Certificate bölümüne bakın.
Crypto Public Key başlangıçta hizalanır ve Signing Public Key sonunda hizalanır. Dolgu (varsa) ortadadır.
Hedefin genel anahtarı, sürüm 0.6’da devre dışı bırakılan eski I2CP-to-I2CP şifrelemesi için kullanılıyordu, şu anda kullanılmıyor.
JavaDoc: net.i2p.data.Destination
Lease
İçindekiler
Belirli bir tunnel’ın bir Destination ‘ı hedefleyen mesajları almak için yetkilendirmesini tanımlar.
Açıklama
Gateway router’ın RouterIdentity ‘sinin SHA256 Hash ‘i, ardından TunnelId ve son olarak bitiş Date ‘i.
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
İçindekiler
Belirli bir Destination için şu anda yetkilendirilmiş tüm Lease ’leri, garlic mesajlarının şifrelenebileceği PublicKey ‘i ve ardından yapının bu belirli sürümünü iptal etmek için kullanılabilecek SigningPublicKey ‘i içerir. LeaseSet, ağ veritabanında saklanan iki yapıdan biridir (diğeri RouterInfo ‘dur) ve içerdiği Destination ‘ın SHA256’sı altında anahtarlanır.
Notlar
Destination , ardından şifreleme için bir PublicKey , sonra LeaseSet’in bu sürümünü iptal etmek için kullanılabilecek bir SigningPublicKey , ardından kümede kaç tane Lease yapısı olduğunu belirten 1 byte’lık bir Integer , bunu takip eden gerçek Lease yapıları ve son olarak Destination ‘ın SigningPrivateKey ‘i ile imzalanmış önceki byte’ların Signature ‘ı.
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
Şifreleme anahtarı uçtan uca ElGamal/AES+SessionTag şifrelemesi ELGAMAL-AES için kullanılır. Şu anda her router başlangıcında yeniden oluşturulur, kalıcı değildir.
İmza, hedefin imzalama genel anahtarı kullanılarak doğrulanabilir.
Sıfır Lease içeren bir LeaseSet’e izin verilir ancak kullanılmaz. Bu, uygulanmamış olan LeaseSet iptali için tasarlanmıştı. Tüm LeaseSet2 varyantları en az bir Lease gerektirir.
signing_key şu anda kullanılmamaktadır. LeaseSet iptal işlemi için tasarlanmıştı ancak bu özellik henüz uygulanmamıştır. Şu anda her router başlatılışında yeniden oluşturulur ve kalıcı değildir. Signing key türü her zaman hedefin signing key türüyle aynıdır.
Tüm Lease’lerin en erken sona erme tarihi, LeaseSet’in zaman damgası veya sürümü olarak kabul edilir. Router’lar genellikle bir LeaseSet’in saklanmasını, mevcut olandan “daha yeni” olmadığı sürece kabul etmezler. En eski Lease’in önceki LeaseSet’teki en eski Lease ile aynı olduğu yeni bir LeaseSet yayınlarken dikkatli olun. Yayınlayan router bu durumda genellikle en eski Lease’in sona erme süresini en az 1 ms artırmalıdır.
0.9.7 sürümünden önce, kaynak router tarafından gönderilen bir DatabaseStore Mesajına dahil edildiğinde, router tüm yayınlanan lease’lerin sona erme sürelerini aynı değere, yani en erken lease’in süresine ayarlıyordu. 0.9.7 sürümünden itibaren, router her lease için gerçek lease sona erme süresini yayınlar. Bu bir uygulama detayıdır ve yapı spesifikasyonunun bir parçası değildir.
Toplam boyut: 40 bayt
JavaDoc: net.i2p.data.LeaseSet
Lease2
İçindekiler
Belirli bir tunnel’ın bir Destination ‘ı hedefleyen mesajları alması için yetkilendirmeyi tanımlar. Lease ile aynıdır ancak 4-byte end_date içerir. LeaseSet2 tarafından kullanılır. 0.9.38 sürümünden itibaren desteklenir; daha fazla bilgi için proposal 123’e bakın.
Notlar
Gateway router’ın RouterIdentity ‘sinin SHA256 Hash ‘i, ardından TunnelId ve son olarak 4 byte’lık bitiş tarihi.
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.
- Bu bölüm çevrimdışı oluşturulabilir ve oluşturulmalıdır.
JavaDoc: net.i2p.data.Lease2
OfflineSignature
İçindekiler
Bu, LeaseSet2Header ‘ın isteğe bağlı bir parçasıdır. Ayrıca streaming ve I2CP’de de kullanılır. 0.9.38 sürümünden itibaren desteklenir; daha fazla bilgi için proposal 123’e bakın.
Notlar
Bir son kullanma tarihi, bir sigtype ve geçici SigningPublicKey ile bir Signature içerir.
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.
- Bayraklar (2 bayt):
- Bit 0: Ayarlanmışsa, çevrimdışı anahtarlar mevcut (OfflineSignature bölümüne bakın)
- Bit 1: Ayarlanmışsa, bu yayınlanmamış bir leaseset
- Bit 2: Ayarlanmışsa, bu köreltilmiş bir leaseset
- Bit 15-3: Ayrılmış, 0’a ayarlanır
LeaseSet2Header
İçindekiler
Bu, LeaseSet2 ve MetaLeaseSet ‘in ortak kısmıdır. 0.9.38 sürümünden itibaren desteklenmektedir; daha fazla bilgi için 123 numaralı öneriyi inceleyin.
Notlar
Destination , iki zaman damgası ve isteğe bağlı bir OfflineSignature içerir.
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.
Toplam boyut: minimum 395 bayt
Maksimum gerçek son kullanma süresi LeaseSet2 için yaklaşık 660 (11 dakika) ve MetaLeaseSet için 65535’tir (tam 18,2 saat).
LeaseSet (1) bir ‘published’ alanına sahip değildi, bu nedenle sürüm kontrolü için en erken lease’in aranması gerekiyordu. LeaseSet2 bir saniyelik çözünürlüğe sahip bir ‘published’ alanı ekler. Router’lar yeni leaseset’leri floodfill’lere gönderme hızını saniyede bir defadan çok daha yavaş bir hızla sınırlamalıdır (her destination için). Bu uygulanmazsa, kod her yeni leaseset’in ‘published’ zamanının bir öncekinden en az bir saniye sonra olduğundan emin olmalıdır, aksi halde floodill’ler yeni leaseset’i saklamaz veya flood etmez.
- serviceoption := optionkey optionvalue
- optionkey := _service._proto
- service := İstenen hizmetin sembolik adı. Küçük harf olmalıdır. Örnek: “smtp”. İzin verilen karakterler [a-z0-9-] ve ‘-’ ile başlayamaz veya bitemez. REGISTRY veya Linux /etc/services’den standart tanımlayıcılar orada tanımlanmışsa kullanılmalıdır.
- proto := İstenen hizmetin aktarım protokolü. Küçük harf olmalıdır, “tcp” veya “udp” olabilir. “tcp” akış demektir ve “udp” yanıtlanabilir datagram’lar demektir. Ham datagram’lar ve datagram2 için protokol göstergeleri daha sonra tanımlanabilir. İzin verilen karakterler [a-z0-9-] ve ‘-’ ile başlayamaz veya bitemez.
- optionvalue := self | srvrecord[,srvrecord]*
- self := “0” ttl port [appoptions]
- srvrecord := “1” ttl priority weight port target [appoptions]
- ttl := yaşam süresi, saniye cinsinden tamsayı. Pozitif tamsayı. Örnek: “86400”. En az 86400 (bir gün) önerilir, ayrıntılar için aşağıdaki Öneriler bölümüne bakın.
- priority := Hedef ana bilgisayarın önceliği, düşük değer daha tercih edilir demektir. Negatif olmayan tamsayı. Örnek: “0” Sadece birden fazla kayıt varsa yararlıdır, ancak tek kayıt olsa bile gereklidir.
- weight := Aynı önceliğe sahip kayıtlar için göreceli ağırlık. Yüksek değer seçilme şansının daha fazla olması demektir. Negatif olmayan tamsayı. Örnek: “0” Sadece birden fazla kayıt varsa yararlıdır, ancak tek kayıt olsa bile gereklidir.
- port := Hizmetin bulunacağı I2CP portu. Negatif olmayan tamsayı. Örnek: “25” Port 0 desteklenir ancak önerilmez.
- target := Hizmeti sağlayan hedefin ana bilgisayar adı veya b32’si. NAMING bölümündeki gibi geçerli bir ana bilgisayar adı. Küçük harf olmalıdır. Örnek: “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b32.i2p” veya “example.i2p”. Ana bilgisayar adı “iyi bilinen”, yani resmi veya varsayılan adres defterlerinde olmadığı sürece b32 önerilir.
- appoptions := uygulamaya özgü keyfi metin, " " veya “,” içeremez. Kodlama UTF-8’dir.
LeaseSet2
İçindekiler
Tip 3 I2NP DatabaseStore mesajında bulunur. 0.9.38 sürümünden itibaren desteklenir; daha fazla bilgi için 123 numaralı öneriyi inceleyin.
Belirli bir Destination için şu anda yetkilendirilmiş tüm Lease2 ’leri ve garlic mesajlarının şifrelenebileceği PublicKey ‘i içerir. LeaseSet, ağ veritabanında saklanan iki yapıdan biridir (diğeri RouterInfo ), ve içerdiği Destination ‘ın SHA256 değeri altında anahtarlanır.
Şifreleme Anahtarı Tercihi
LeaseSet2Header , ardından seçenekler, sonra şifreleme için bir veya daha fazla PublicKey , kümede kaç Lease2 yapısı bulunduğunu belirten Integer , ardından gerçek Lease2 yapıları ve son olarak önceki baytların Destination ‘ın SigningPrivateKey veya geçici anahtarı tarafından imzalandığı bir Signature .
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
Yayınlanmış (sunucu) leaseSet’ler için, şifreleme anahtarları sunucu tercihine göre sıralanır, en tercih edilen ilk sırada yer alır. İstemciler birden fazla şifreleme türünü destekliyorsa, sunucu tercihini gözetmeleri ve sunucuya bağlanmak için destekledikleri ilk türü şifreleme yöntemi olarak seçmeleri önerilir. Genel olarak, daha yeni (daha yüksek numaralı) anahtar türleri daha güvenli veya verimlidir ve tercih edilir, bu nedenle anahtarlar anahtar türünün ters sırasına göre listelenmelidir.
Ancak, istemciler uygulama-bağımlı olarak bunun yerine kendi tercihlerine göre seçim yapabilir veya “birleşik” tercihi belirlemek için bazı yöntemler kullanabilir. Bu, bir yapılandırma seçeneği olarak veya hata ayıklama için yararlı olabilir.
Yayınlanmamış (istemci) leaseset’lerdeki anahtar sırası etkili bir şekilde önemli değildir, çünkü yayınlanmamış istemcilere genellikle bağlantı girişiminde bulunulmaz. Bu sıra, yukarıda açıklandığı gibi birleşik bir tercihi belirlemek için kullanılmadığı sürece.
Notlar
API 0.9.66 itibariyle, servis kaydı seçenekleri için standart bir format tanımlanmıştır. Ayrıntılar için öneri 167’ye bakınız. Farklı bir format kullanan servis kayıtları dışındaki seçenekler gelecekte tanımlanabilir.
LS2 seçenekleri anahtar değerine göre sıralanmalıdır, böylece imza değişmez kalır.
Servis kaydı seçenekleri aşağıdaki gibi tanımlanır:
- Hedefin public key’i, 0.6 sürümünde devre dışı bırakılan eski I2CP-to-I2CP şifrelemesi için kullanılıyordu, şu anda kullanılmıyor.
Örnekler:
LS2’de aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b32.i2p için, bir SMTP sunucusuna işaret ederek:
“_smtp._tcp” “1 86400 0 0 25 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.b32.i2p”
LS2’de aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b32.i2p için, iki SMTP sunucusuna işaret eden:
“_smtp._tcp” “1 86400 0 0 25 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.b32.i2p,86400 1 0 25 cccccccccccccccccccccccccccccccccccccccccccc.b32.i2p”
LS2’de bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.b32.i2p için, kendisini bir SMTP sunucusu olarak gösteren:
“_smtp._tcp” “0 999999 25”
Açıklama
Şifreleme anahtarları uçtan uca ElGamal/AES+SessionTag şifrelemesi ELGAMAL-AES (tip 0) veya diğer uçtan uca şifreleme şemaları için kullanılır. ECIES ve 145 ve 156 numaralı tekliflere bakın. Her router başlangıcında yeniden oluşturulabilir veya kalıcı olabilirler. X25519 (tip 4, ECIES bakın) 0.9.44 sürümü itibariyle desteklenmektedir.
İmza, yukarıdaki verinin ÖNCESİNE DatabaseStore türünü içeren tek bayt (3) EKLENMİŞ haliyle yapılır.
İmza, hedefin imzalama genel anahtarı veya leaseset2 başlığında çevrimdışı bir imza bulunuyorsa geçici imzalama genel anahtarı kullanılarak doğrulanabilir.
Her anahtar için anahtar uzunluğu sağlanır, böylece floodfill’ler ve istemciler tüm şifreleme türleri bilinmese veya desteklenmese bile yapıyı ayrıştırabilir.
LeaseSet2Header içindeki ‘published’ alanıyla ilgili nota bakın
Seçenekler eşlemesi, boyut birden büyükse, anahtar tarafından sıralanmalıdır, böylece imza değişmez olur.
Toplam boyut: 40 bayt
JavaDoc: net.i2p.data.LeaseSet2
MetaLease
İçindekiler
Belirli bir tunnel’ın bir Destination ‘ı hedefleyen mesajları alması için yetkilendirmeyi tanımlar. Lease2 ile aynıdır ancak tunnel id yerine bayraklar ve maliyet içerir. MetaLeaseSet tarafından kullanılır. Tip 7 I2NP DatabaseStore mesajında bulunur. 0.9.38 sürümünden itibaren desteklenir; daha fazla bilgi için proposal 123’e bakın.
Notlar
Gateway router’ın RouterIdentity ‘sinin SHA256 Hash ‘i, ardından bayraklar ve maliyet, ve son olarak 4 byte’lık bitiş tarihi.
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| 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.
- Hedefin genel anahtarı, 0.6 sürümünde devre dışı bırakılan eski I2CP-to-I2CP şifrelemesi için kullanılıyordu, şu anda kullanılmamaktadır.
JavaDoc: net.i2p.data.MetaLease
MetaLeaseSet
İçindekiler
Tip 7’li bir I2NP DatabaseStore mesajında bulunur. 0.9.38 sürümünden itibaren tanımlanmıştır; 0.9.40 sürümünden itibaren çalışması planlanmıştır; daha fazla bilgi için 123 numaralı öneriye bakınız.
Belirli bir Destination için şu anda yetkilendirilmiş tüm MetaLease ve garlic mesajlarının şifrelenebileceği PublicKey içerir. LeaseSet, ağ veritabanında saklanan iki yapıdan biridir (diğeri RouterInfo olan) ve içerdiği Destination ‘ın SHA256’sı altında anahtarlanır.
Notlar
LeaseSet2Header , ardından seçenekler, sette kaç tane Lease2 yapısı olduğunu belirten bir Integer , ardından gerçek Lease2 yapıları ve son olarak önceki baytların Destination ‘ın SigningPrivateKey ‘i veya geçici anahtar tarafından imzalanmış Signature ‘ı.
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| 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
İmza, yukarıdaki verilerin üzerinde olup, DatabaseStore türünü (7) içeren tek baytın BAŞINA EKLENMESİ ile oluşturulur.
İmza, hedefin imzalama genel anahtarı kullanılarak doğrulanabilir veya leaseset2 başlığında çevrimdışı bir imza bulunuyorsa geçici imzalama genel anahtarı kullanılarak doğrulanabilir.
LeaseSet2Header içindeki ‘published’ alanına ilişkin nota bakın
Hedefin genel anahtarı, 0.6 sürümünde devre dışı bırakılan eski I2CP-to-I2CP şifrelemesi için kullanılıyordu, şu anda kullanılmıyor.
JavaDoc: net.i2p.data.MetaLeaseSet
EncryptedLeaseSet
İçindekiler
Tip 5 I2NP DatabaseStore mesajında bulunur. 0.9.38 sürümünden itibaren tanımlanmıştır; 0.9.39 sürümünden itibaren çalışmaktadır; daha fazla bilgi için öneri 123’e bakın.
Sadece blinded key ve son kullanma tarihi açık metin olarak görülebilir. Gerçek lease set şifrelidir.
Notlar
İki baytlık imza türü, kör edilmiş SigningPrivateKey , yayınlanma zamanı, son kullanma tarihi ve bayraklar. Ardından, iki baytlık uzunluk ve şifrelenmiş veri. Son olarak, kör edilmiş SigningPrivateKey veya geçici anahtar tarafından imzalanmış önceki baytların Signature ‘ı.
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| sigtype | |
+----+----+ +
| blinded_public_key |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| published | expires | flags |
+----+----+----+----+----+----+----+----+
| offline_signature (optional) |
+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| len | |
+----+----+ +
| encrypted_data |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| signature |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
İmza, yukarıdaki veriler üzerindedir ve DatabaseStore türünü (5) içeren tek bayt ile BAŞINA EKLENMİŞTİR.
İmza, hedefin imzalama public key’i kullanılarak doğrulanabilir veya leaseset2 başlığında çevrimdışı imza bulunuyorsa geçici imzalama public key’i kullanılarak doğrulanabilir.
Kör etme ve şifreleme EncryptedLeaseSet içinde belirtilmiştir
Bu yapı LeaseSet2Header kullanmaz.
Maksimum gerçek sona erme süresi yaklaşık 660’tır (11 dakika), şifreli bir MetaLeaseSet olmadığı sürece.
Şifrelenmiş leaseSet’ler ile çevrimdışı imzaların kullanımına ilişkin notlar için 123 numaralı öneriyi inceleyin.
LeaseSet2Header içindeki ‘published’ alanı hakkındaki nota bakın (aynı sorun, burada LeaseSet2Header formatını kullanmasak bile)
Maliyet genellikle SSU için 5 veya 6, NTCP için 10 veya 11’dir.
Expiration şu anda kullanılmamaktadır, her zaman null’dur (tüm sıfırlar). 0.9.3 sürümünden itibaren, expiration sıfır olarak varsayılır ve saklanmaz, bu nedenle sıfır olmayan herhangi bir expiration RouterInfo imza doğrulamasında başarısız olacaktır. Expiration’ın uygulanması (veya bu byte’lar için başka bir kullanım) geriye dönük uyumsuz bir değişiklik olacaktır. Router’lar bu alanı tüm sıfırlar olarak ayarlamalıdır (MUST). 0.9.12 sürümünden itibaren, sıfır olmayan expiration alanı tekrar tanınmaktadır, ancak ağın büyük çoğunluğu bunu tanıyana kadar bu alanı kullanmak için birkaç sürüm beklemeliyiz.
JavaDoc: net.i2p.data.EncryptedLeaseSet
RouterAddress
İçindekiler
Bu yapı, bir router ile taşıma protokolü aracılığıyla iletişim kurma yöntemlerini tanımlar.
Notlar
Adresi kullanmanın göreceli maliyetini tanımlayan 1 byte Integer , burada 0 ücretsiz ve 255 pahalı anlamına gelir, ardından adresin kullanılmaması gereken son kullanma Date tarihi gelir, veya null ise adresin süresi asla dolmaz. Bundan sonra bu router adresinin kullandığı taşıma protokolünü tanımlayan bir String gelir. Son olarak, IP adresi, port numarası, e-posta adresi, URL vb. gibi bağlantıyı kurmak için gerekli tüm taşıma protokolüne özgü seçenekleri içeren bir Mapping bulunur.
View original ASCII diagram
+----+----+----+----+----+----+----+----+
|cost| expiration
+----+----+----+----+----+----+----+----+
| transport_style |
+----+----+----+----+-/-+----+----+----+
| |
+ +
| options |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
Aşağıdaki seçenekler zorunlu olmamakla birlikte standart kabul edilir ve çoğu router adresinde bulunması beklenir: “host” (bir IPv4 veya IPv6 adresi ya da host adı) ve “port”.
peer_size Integer değerini, o kadar router hash’inin listesi takip edebilir. Bu şu anda kullanılmamaktadır. Henüz uygulanmamış olan kısıtlı rotalar (restricted routes) için tasarlanmıştı. Belirli uygulamalar, imzanın değişmez olması için listenin sıralanmasını gerektirebilir. Bu özelliği etkinleştirmeden önce araştırılmalıdır.
İmza, router_ident’in imzalama genel anahtarı kullanılarak doğrulanabilir.
Tüm router bilgilerinde bulunması beklenen standart seçenekler için network veritabanı sayfasındaki NETDB-ROUTERINFO bölümüne bakın.
JavaDoc: net.i2p.data.router.RouterAddress
RouterInfo
İçindekiler
Bir router’ın ağın görmesi için yayınlamak istediği tüm verileri tanımlar. RouterInfo , ağ veritabanında saklanan iki yapıdan biridir (diğeri LeaseSet ) ve içerdiği RouterIdentity ’nin SHA256’sı altında anahtarlanır.
Notlar
RouterIdentity ardından girişin yayınlandığı Date
View original ASCII diagram
+----+----+----+----+----+----+----+----+
| router_ident |
+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| published |
+----+----+----+----+----+----+----+----+
|size| RouterAddress 0 |
+----+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| RouterAddress 1 |
+ +
| |
~ ~
~ ~
| |
+----+----+----+----+----+----+----+----+
| RouterAddress ($size-1) |
+ +
| |
~ ~
~ ~
| |
+----+----+----+----+-/-+----+----+----+
|psiz| options |
+----+----+----+----+-/-+----+----+----+
| signature |
+ +
| |
+ +
| |
+ +
| |
+ +
| |
+----+----+----+----+----+----+----+----+
- Çok eski router’lar, imzanın değişmez olması için adreslerin verilerinin SHA256’sına göre sıralanmasını gerektiriyordu. Bu artık gerekli değil ve geriye dönük uyumluluk için uygulanmaya değmez.
- ECIES
- ECIES-HYBRID
- ECIES-ROUTERS
- ELGAMAL
- ELGAMAL-AES
- GARLIC-DELIVERY
- I2CP
- I2NP
- NAMING
- NETDB-ROUTERINFO
- Prop134
- Prop169
- REGISTRY
- SSU
- TUNNEL-DELIVERY
İmza, router_ident’in imzalama ortak anahtarı kullanılarak doğrulanabilir.
Tüm yönlendirici bilgilerinde bulunması beklenen standart seçenekler için ağ veritabanı sayfasına bakın NETDB-ROUTERINFO .
Çok eski yönlendiriciler, adreslerin verilerinin SHA256’ına göre sıralanmasını gerektiriyordu böylece imza değişmez olurdu. Bu artık gerekli değildir ve geriye dönük uyumluluk için uygulamaya değmez.
JavaDoc: net.i2p.data.router.RouterInfo
Teslimat Talimatları
Tunnel Message Delivery Instructions, Tunnel Message Specification TUNNEL-DELIVERY belgesinde tanımlanmıştır.
Garlic Message Delivery Instructions, I2NP Mesaj Spesifikasyonunda GARLIC-DELIVERY tanımlanmıştır.