Estado
Partes de esta propuesta están completas e implementadas en las versiones 0.9.38 y 0.9.39. Las estructuras comunes, I2CP, I2NP y otras especificaciones ahora están actualizadas para reflejar los cambios que actualmente se admiten.
Las partes completadas aún están sujetas a revisiones menores. Otras partes de esta propuesta aún están en desarrollo y están sujetas a revisiones sustanciales.
La búsqueda de servicios (tipos 9 y 11) tiene baja prioridad, no está programada y podría separarse en una propuesta distinta.
Visión general
Esta es una actualización y agregación de las siguientes 4 propuestas:
- 110 LS2
- 120 Meta LS2 para multihoming masivo
- 121 LS2 Cifrado
- 122 Búsqueda de servicio sin autenticación (anycasting)
Estas propuestas son mayormente independientes, pero por coherencia definimos y usamos un formato común para varias de ellas.
Las siguientes propuestas están relacionadas:
- 140 Multihoming Invisible (incompatible con esta propuesta)
- 142 Nueva Plantilla de Criptografía (para nueva criptografía simétrica)
- 144 ECIES-X25519-AEAD-Ratchet
- 145 ECIES-P256
- 146 Red25519
- 148 EdDSA-BLAKE2b-Ed25519
- 149 B32 para LS2 Cifrado
- 150 Protocolo Garlic Farm
- 151 ECDSA Blinding
Propuesta
Esta propuesta define 5 nuevos tipos de DatabaseEntry y el proceso para almacenarlos y recuperarlos desde la base de datos de red, así como el método para firmarlos y verificar esas firmas.
Objetivos
- Compatibilidad hacia atrás
- LS2 usable con multihoming de estilo antiguo
- No se requiere nueva criptografía ni primitivas para el soporte
- Mantener la desacoplación entre criptografía y firma; soportar todas las versiones actuales y futuras
- Habilitar claves de firma opcionales fuera de línea
- Reducir la precisión de las marcas de tiempo para reducir el rastreo por huellas
- Habilitar nueva criptografía para destinos
- Habilitar multihoming masivo
- Corregir múltiples problemas con el LS cifrado existente
- Ofuscar opcionalmente para reducir la visibilidad por floodfills
- Cifrado soporta tanto claves únicas como múltiples claves revocables
- Búsqueda de servicios para facilitar la búsqueda de outproxies, arranque de DHT de aplicaciones,
y otros usos - No romper nada que dependa de hashes binarios de destino de 32 bytes, por ejemplo bittorrent
- Añadir flexibilidad a leasesets mediante propiedades, como tenemos en routerinfos.
- Poner la marca de tiempo de publicación y expiración variable en el encabezado, para que funcione incluso
si el contenido está cifrado (no derivar la marca de tiempo de la primera lease) - Todos los nuevos tipos viven en el mismo espacio DHT y ubicaciones que los leasesets existentes,
para que los usuarios puedan migrar del antiguo LS a LS2,
o cambiar entre LS2, Meta y Cifrado,
sin cambiar el Destino o el hash. - Un Destino existente puede convertirse para usar claves fuera de línea,
o volver a claves en línea, sin cambiar el Destino o el hash.
No objetivos / Fuera de alcance
- Nuevo algoritmo de rotación DHT o generación compartida de números aleatorios
- El tipo específico de nueva encriptación y esquema de cifrado extremo a extremo
para usar ese nuevo tipo estaría en una propuesta separada.
No se especifica ni discute nueva criptografía aquí. - Nueva encriptación para RIs o construcción de túneles.
Eso estaría en una propuesta separada. - Métodos de encriptación, transmisión y recepción de mensajes I2NP DLM / DSM / DSRM.
No cambia. - Cómo generar y soportar Meta, incluyendo comunicación inter-routers, gestión, conmutación por error y coordinación.
El soporte podría añadirse a I2CP, o i2pcontrol, o un nuevo protocolo.
Esto podría o no estandarizarse. - Cómo implementar y gestionar realmente túneles de expiración más larga, o cancelar túneles existentes.
Es extremadamente difícil, y sin ello, no puedes tener un apagado ordenado razonable. - Cambios en el modelo de amenazas
- Formato de almacenamiento fuera de línea, o métodos para almacenar/recuperar/compartir los datos.
- Los detalles de implementación no se discuten aquí y se dejan a cada proyecto.
Justificación
LS2 añade campos para cambiar el tipo de encriptación y para futuros cambios de protocolo.
LS2 Cifrado corrige varios problemas de seguridad del LS cifrado existente mediante el uso de encriptación asimétrica de todo el conjunto de leases.
Meta LS2 proporciona multihoming flexible, eficiente, efectivo y a gran escala.
El Registro de Servicio y la Lista de Servicios proporcionan servicios anycast como búsqueda de nombres y arranque de DHT.
Tipos de Datos NetDB
Los números de tipo se usan en los mensajes I2NP de Búsqueda/Almacenamiento en la Base de Datos.
La columna de extremo a extremo indica si las consultas/respuestas se envían a un Destino en un mensaje Garlic.
Tipos existentes:
| NetDB Data | Lookup Type | Store Type |
|---|---|---|
| any | 0 | any |
| LS | 1 | 1 |
| RI | 2 | 0 |
| exploratory | 3 | DSRM |
| Nuevos tipos: |
| NetDB Data | Lookup Type | Store Type | Std. LS2 Header? | Sent end-to-end? |
|---|---|---|---|---|
| LS2 | 1 | 3 | yes | yes |
| Encrypted LS2 | 1 | 5 | no | no |
| Meta LS2 | 1 | 7 | yes | no |
| Service Record | n/a | 9 | yes | no |
| Service List | 4 | 11 | no | no |
Notas
Los tipos de búsqueda actualmente usan los bits 3-2 en el mensaje de Búsqueda en la Base de Datos.
Cualquier tipo adicional requeriría el uso del bit 4.Todos los tipos de almacenamiento son impares, ya que los bits superiores en el campo de tipo del mensaje de Almacenamiento en la Base de Datos
son ignorados por routers antiguos.
Preferimos que el análisis falle como un LS que como un RI comprimido.¿Debe el tipo ser explícito, implícito o ninguno en los datos cubiertos por la firma?
Proceso de Búsqueda/Almacenamiento
Los tipos 3, 5 y 7 pueden devolverse como respuesta a una búsqueda estándar de leaseset (tipo 1). El tipo 9 nunca se devuelve como respuesta a una búsqueda. El tipo 11 se devuelve como respuesta a un nuevo tipo de búsqueda de servicio (tipo 11).
Solo el tipo 3 puede enviarse en un mensaje Garlic de cliente a cliente.
Formato
Los tipos 3, 7 y 9 tienen un formato común::
Standard LS2 Header
- as defined below
Type-Specific Part
- as defined below in each part
Standard LS2 Signature:
- Length as implied by sig type of signing key
Encabezado Estándar LS2
Parte Específica del Tipo
Consideraciones de Privacidad/Seguridad
Firma Estándar LS2:
Encabezado Estándar LS2
El tipo 5 (Cifrado) no comienza con un Destino y tiene un formato diferente. Ver más abajo.
Formato
Standard LS2 Header:
- Type (1 byte)
Not actually in header, but part of data covered by signature.
Take from field in Database Store Message.
- Destination (387+ bytes)
- Published timestamp (4 bytes, big endian, seconds since epoch, rolls over in 2106)
- Expires (2 bytes, big endian) (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, unless bit 2 is set.
Bit 2: If 0, a standard published leaseset.
If 1, this unencrypted leaseset will be blinded and encrypted when published.
If this leaseset expires, query the blinded location in the netdb for a new one.
If this bit is set to 1, set bit 1 to 1 also.
As of release 0.9.42.
Bits 3-15: set to 0 for compatibility with future uses
- If flag indicates offline keys, the offline signature section:
Expires timestamp (4 bytes, big endian, seconds since epoch, rolls over in 2106)
Transient sig type (2 bytes, big endian)
Transient signing public key (length as implied by sig type)
Signature of expires timestamp, transient sig type, and public key,
by the destination public key,
length as implied by destination public key sig type.
This section can, and should, be generated offline.
Justificación
como se define a continuación
como se define a continuación en cada parte
Longitud según el tipo de firma de la clave de firma
No publicado/publicado: Para uso al enviar un almacenamiento de base de datos extremo a extremo,
el router emisor puede desear indicar que este leaseset no debería enviarse a otros. Actualmente usamos heurísticas para mantener este estado.
Problemas
Publicado: Reemplaza la lógica compleja necesaria para determinar la ‘versión’ del
leaseset. Actualmente, la versión es la expiración de la última lease,
y un router publicador debe incrementar esa expiración al menos 1ms al
publicar un leaseset que solo elimina una lease más antigua.Expira: Permite que la expiración de una entrada de base de datos sea anterior a la de
su última lease. Puede no ser útil para LS2, donde se espera que los leasesets
permanezcan con una expiración máxima de 11 minutos, pero
para otros nuevos tipos, es necesario (ver Meta LS y Registro de Servicio más abajo).Las claves fuera de línea son opcionales, para reducir la complejidad inicial/obligatoria de implementación.
Notas
Podría reducirse aún más la precisión de la marca de tiempo (¿10 minutos?) pero habría que añadir
un número de versión. Esto podría romper el multihoming, a menos que tengamos encriptación que preserve el orden?
Probablemente no se pueda hacer sin marcas de tiempo.Alternativa: marca de tiempo de 3 bytes (época / 10 minutos), versión de 1 byte, expiración de 2 bytes
¿Es el tipo explícito o implícito en los datos / firma? ¿Constantes de “dominio” para la firma?
Nuevos tipos DatabaseEntry
LeaseSet 2
El tipo 11 (Lista de Servicios) es una agregación de varios Registros de Servicio y tiene un formato diferente. Ver más abajo.
- Los routers no deberían publicar un LS más de una vez por segundo.
Si lo hacen, deben incrementar artificialmente la marca de tiempo publicada en 1
sobre el LS publicado anteriormente.
TBD
Standard LS flag (1)
Los tipos 3, 7 y 9 usan el encabezado estándar LS2, especificado a continuación:
Standard LS2 type (3)
Cambios respecto al LeaseSet existente:
Hash of destination
This hash is then used to generate the daily "routing key", as in LS1
Buscar con
10 minutes, as in a regular LS.
Almacenar con
Destination
Formato
Standard LS2 Header as specified above
Standard LS2 Type-Specific Part
- Properties (Mapping as specified in common structures spec, 2 zero bytes if none)
- Number of key sections to follow (1 byte, max TBD)
- Key sections:
- Encryption type (2 bytes, big endian)
- Encryption key length (2 bytes, big endian)
This is explicit, so floodfills can parse LS2 with unknown encryption types.
- Encryption key (number of bytes specified)
- Number of lease2s (1 byte)
- Lease2s (40 bytes each)
These are leases, but with a 4-byte instead of an 8-byte expiration,
seconds since the epoch (rolls over in 2106)
Standard LS2 Signature:
- Signature
If flag indicates offline keys, this is signed by the transient pubkey,
otherwise, by the destination pubkey
Length as implied by sig type of signing key
The signature is of everything above.
Justificación
Las implementaciones de routers podrían almacenar en caché las claves y firma transitorias para
evitar la verificación cada vez. En particular, los floodfills y los routers en
ambos extremos de conexiones de larga duración podrían beneficiarse de esto.Las claves y firma fuera de línea solo son apropiadas para destinos de larga duración,
es decir, servidores, no clientes.
Discusión
Almacenar en
Expiración típica
Publicado por
- Añadir marca de tiempo de publicación, marca de tiempo de expiración, flags y propiedades
- Añadir tipo de encriptación
- Eliminar clave de revocación
Esta propuesta continúa usando la clave pública en el leaseset para la clave de encriptación extremo a extremo, y deja el campo de clave pública en el Destino sin usar, como está ahora. El tipo de encriptación no se especifica en el certificado de clave del Destino, seguirá siendo 0.
- Propiedades: Expansión futura y flexibilidad.
Colocadas primero por si son necesarias para el análisis de los datos restantes.
Nuevos Problemas de Encriptación
Una alternativa rechazada es especificar el tipo de encriptación en el certificado de clave del Destino, usar la clave pública en el Destino, y no usar la clave pública en el leaseset. No tenemos previsto hacer esto.
Múltiples pares tipo de encriptación/clave pública son
para facilitar la transición a nuevos tipos de encriptación. La otra forma de hacerlo
es publicar múltiples leasesets, posiblemente usando los mismos túneles,
como hacemos ahora para destinos DSA y EdDSA.
La identificación del tipo de encriptación entrante en un túnel
puede hacerse con el mecanismo existente de etiqueta de sesión,
y/o descifrado de prueba usando cada clave. Las longitudes de los mensajes
entrantes también pueden proporcionar una pista.La ubicación de la clave pública real no cambia.
El tipo de encriptación o la clave pública pueden cambiar sin cambiar el Destino.
Elimina el campo de revocación no utilizado
Compatibilidad básica con otros tipos DatabaseEntry en esta propuesta
Permite múltiples tipos de encriptación
La ubicación de la clave pública y el tipo de encriptación difiere de RouterInfo
Mantiene la clave pública no utilizada en el leaseset
Requiere implementación en toda la red; en la alternativa, tipos de encriptación experimentales pueden usarse, si los permiten los floodfills
(pero ver propuestas relacionadas 136 y 137 sobre soporte para tipos de firma experimentales).
La propuesta alternativa podría ser más fácil de implementar y probar para tipos de encriptación experimentales.
Notas
El tipo de encriptación representa la combinación
de curva, longitud de clave y esquema extremo a extremo,
incluyendo KDF y MAC, si los hay.Hemos incluido un campo de longitud de clave, para que el LS2 sea
analizable y verificable por el floodfill incluso para tipos de encriptación desconocidos.El primer nuevo tipo de encriptación que se propondrá será
probablemente ECIES/X25519. Cómo se usa extremo a extremo
(ya sea una versión ligeramente modificada de ElGamal/AES+SessionTag
o algo completamente nuevo, por ejemplo ChaCha/Poly) se especificará
en una o más propuestas separadas.
Ver también las propuestas ECIES 144 y 145.
LS2 Cifrado
Beneficios de LS2:
- La expiración de 8 bytes en leases cambia a 4 bytes.
Desventajas de LS2:
Algunas partes están fuera del alcance de esta propuesta, pero ponemos notas aquí por ahora ya que no tenemos una propuesta de encriptación separada todavía. Ver también las propuestas ECIES 144 y 145.
- Si alguna vez implementamos revocación, podemos hacerlo con un campo de expiración de cero,
o leases de cero, o ambos. No necesitamos una clave de revocación separada.
Objetivos:
Standard LS flag (1)
LS2 Cifrado nunca se envía en un mensaje garlic extremo a extremo. Usa el LS2 Estándar como arriba.
Encrypted LS2 type (5)
Cambios respecto al LeaseSet cifrado existente:
Hash of blinded sig type and blinded public key
Two byte sig type (big endian, e.g. 0x000b) || blinded public key
This hash is then used to generate the daily "routing key", as in LS1
Buscar con
10 minutes, as in a regular LS, or hours, as in a meta LS.
Almacenar con
Destination
Definiciones
Almacenar en
Expiración típica
n-byte output from a cryptographically-secure random number generator.
In addition to the requirement of CSRNG being cryptographically-secure (and thus
suitable for generating key material), it MUST be safe
for some n-byte output to be used for key material when the byte sequences immediately
preceding and following it are exposed on the network (such as in a salt, or encrypted
padding). Implementations that rely on a potentially-untrustworthy source should hash
any output that is to be exposed on the network. See [PRNG references](http://projectbullrun.org/dual-ec/ext-rand.html) and [Tor dev discussion](https://lists.torproject.org/pipermail/tor-dev/2015-November/009954.html).
Publicado por
SHA-256 hash function that takes a personalization string p and data d, and
produces an output of length 32 bytes.
Use SHA-256 as follows::
H(p, d) := SHA-256(p || d)
Definimos las siguientes funciones correspondientes a los bloques criptográficos usados para LS2 Cifrado:
The ChaCha20 stream cipher as specified in [RFC 7539 Section 2.4](https://tools.ietf.org/html/rfc7539#section-2.4), with the initial counter
set to 1. S_KEY_LEN = 32 and S_IV_LEN = 12.
ENCRYPT(k, iv, plaintext)
Encrypts plaintext using the cipher key k, and nonce iv which MUST be unique for
the key k. Returns a ciphertext that is the same size as the plaintext.
The entire ciphertext must be indistinguishable from random if the key is secret.
DECRYPT(k, iv, ciphertext)
Decrypts ciphertext using the cipher key k, and nonce iv. Returns the plaintext.
CSRNG(n)
The RedDSA signature scheme (corresponding to SigType 11) with key blinding.
It has the following functions:
DERIVE_PUBLIC(privkey)
Returns the public key corresponding to the given private key.
SIGN(privkey, m)
Returns a signature by the private key privkey over the given message m.
VERIFY(pubkey, m, sig)
Verifies the signature sig against the public key pubkey and message m. Returns
true if the signature is valid, false otherwise.
It must also support the following key blinding operations:
GENERATE_ALPHA(data, secret)
Generate alpha for those who know the data and an optional secret.
The result must be identically distributed as the private keys.
BLIND_PRIVKEY(privkey, alpha)
Blinds a private key, using a secret alpha.
BLIND_PUBKEY(pubkey, alpha)
Blinds a public key, using a secret alpha.
For a given keypair (privkey, pubkey) the following relationship holds::
BLIND_PUBKEY(pubkey, alpha) ==
DERIVE_PUBLIC(BLIND_PRIVKEY(privkey, alpha))
H(p, d)
X25519 public key agreement system. Private keys of 32 bytes, public keys of 32
bytes, produces outputs of 32 bytes. It has the following
functions:
GENERATE_PRIVATE()
Generates a new private key.
DERIVE_PUBLIC(privkey)
Returns the public key corresponding to the given private key.
DH(privkey, pubkey)
Generates a shared secret from the given private and public keys.
STREAM
A cryptographic key derivation function which takes some input key material ikm (which
should have good entropy but is not required to be a uniformly random string), a salt
of length 32 bytes, and a context-specific 'info' value, and produces an output
of n bytes suitable for use as key material.
Use HKDF as specified in [RFC 5869](https://tools.ietf.org/html/rfc5869), using the HMAC hash function SHA-256
as specified in [RFC 2104](https://tools.ietf.org/html/rfc2104). This means that SALT_LEN is 32 bytes max.
Formato
SIG
- Las claves de encriptación están en orden de preferencia del servidor, la más preferida primero.
El comportamiento predeterminado del cliente es seleccionar la primera clave con
un tipo de encriptación soportado. Los clientes pueden usar otros algoritmos de selección
basados en soporte de encriptación, rendimiento relativo y otros factores.
DH
Layer 0 data + Enc(layer 1 data + Enc(layer 2 data)) + Signature
HKDF(salt, ikm, info, n)
El formato de LS2 cifrado consta de tres capas anidadas:
Capa 0 (externa)
El formato general es::
1 byte
Not actually in header, but part of data covered by signature.
Take from field in Database Store Message.
Nota que LS2 cifrado está ofuscado. El Destino no está en el encabezado. La ubicación de almacenamiento DHT es SHA-256(tipo de firma || clave pública ofuscada), y se rota diariamente.
2 bytes, big endian
This will always be type 11, identifying a Red25519 blinded key.
NO usa el encabezado LS2 estándar especificado anteriormente.
Length as implied by sig type
Tipo
4 bytes, big endian
Seconds since epoch, rolls over in 2106
Tipo de Firma de Clave Pública Ofuscada
2 bytes, big endian
Offset from published timestamp in seconds, 18.2 hours max
Clave Pública Ofuscada
2 bytes
Bit order: 15 14 ... 3 2 1 0
Bit 0: If 0, no offline keys; if 1, offline keys
Other bits: set to 0 for compatibility with future uses
Marca de tiempo de publicación
Present if flag indicates offline keys
Expires timestamp
4 bytes, big endian
Seconds since epoch, rolls over in 2106
Transient sig type
2 bytes, big endian
Transient signing public key
Length as implied by sig type
Signature
Length as implied by blinded public key sig type
Over expires timestamp, transient sig type, and transient public key.
Verified with the blinded public key.
Expira
2 bytes, big endian
Flags
lenOuterCiphertext bytes
Encrypted layer 1 data. See below for key derivation and encryption algorithms.
Datos de clave transitoria
Length as implied by sig type of the signing key used
The signature is of everything above.
If the flag indicates offline keys, the signature is verified with the transient
public key. Otherwise, the signature is verified with the blinded public key.
Capa 1 (intermedia)
lenOuterCiphertext
1 byte
Bit order: 76543210
Bit 0: 0 for everybody, 1 for per-client, auth section to follow
Bits 3-1: Authentication scheme, only if bit 0 is set to 1 for per-client, otherwise 000
000: DH client authentication (or no per-client authentication)
001: PSK client authentication
Bits 7-4: Unused, set to 0 for future compatibility
outerCiphertext
Present if flag bit 0 is set to 1 and flag bits 3-1 are set to 000.
ephemeralPublicKey
32 bytes
clients
2 bytes, big endian
Number of authClient entries to follow, 40 bytes each
authClient
Authorization data for a single client.
See below for the per-client authorization algorithm.
clientID_i
8 bytes
clientCookie_i
32 bytes
Firma
Present if flag bit 0 is set to 1 and flag bits 3-1 are set to 001.
authSalt
32 bytes
clients
2 bytes, big endian
Number of authClient entries to follow, 40 bytes each
authClient
Authorization data for a single client.
See below for the per-client authorization algorithm.
clientID_i
8 bytes
clientCookie_i
32 bytes
Flags
Length implied by lenOuterCiphertext (whatever data remains)
Encrypted layer 2 data. See below for key derivation and encryption algorithms.
Capa 2 (interna)
Datos de autenticación de cliente DH
1 byte
Either 3 (LS2) or 7 (Meta LS2)
Datos de autenticación de cliente PSK
LeaseSet2 data for the given type.
Includes the header and signature.
Derivación de Clave Ofuscada
innerCiphertext
Tipo
Objetivos
- Añadir ofuscación
- Permitir múltiples tipos de firma
- No requerir nuevas primitivas criptográficas
- Opcionalmente cifrar a cada destinatario, revocable
- Soportar cifrado solo de LS2 Estándar y Meta LS2
Seguridad
Datos
Definiciones
Usamos el siguiente esquema para ofuscar claves, basado en Ed25519 y ZCash RedDSA . Las firmas Re25519 son sobre la curva Ed25519, usando SHA-512 para el hash.
The Ed25519 base point (generator) 2^255 - 19 as in [Ed25519](http://cr.yp.to/papers.html#ed25519)
No usamos Tor’s rend-spec-v3.txt appendix A.2 , que tiene objetivos de diseño similares, porque sus claves públicas ofuscadas pueden estar fuera del subgrupo de orden primo, con implicaciones de seguridad desconocidas.
The Ed25519 order 2^252 + 27742317777372353535851937790883648493
as in [Ed25519](http://cr.yp.to/papers.html#ed25519)
La seguridad de un esquema de ofuscación requiere que la distribución de alpha sea la misma que las claves privadas sin ofuscar. Sin embargo, cuando ofuscamos una clave privada Ed25519 (tipo de firma 7) a una clave privada Red25519 (tipo de firma 11), la distribución es diferente. Para cumplir con los requisitos de zcash sección 4.1.6.1 , se debería usar Red25519 (tipo de firma 11) también para las claves sin ofuscar, para que “la combinación de una clave pública realeatorizada y firma(s) bajo esa clave no revele la clave de la cual fue realeatorizada”. Permitimos el tipo 7 para destinos existentes, pero recomendamos el tipo 11 para nuevos destinos que serán cifrados.
Convert a private key to public, as in Ed25519 (mulitply by G)
B
A 32-byte random number known to those who know the destination.
L
Generate alpha for the current date, for those who know the destination and the secret.
The result must be identically distributed as Ed25519 private keys.
DERIVE_PUBLIC(a)
The unblinded 32-byte EdDSA or RedDSA signing private key used to sign the destination
alpha
The unblinded 32-byte EdDSA or RedDSA signing public key in the destination,
= DERIVE_PUBLIC(a), as in Ed25519
GENERATE_ALPHA(destination, date, secret)
The blinded 32-byte EdDSA signing private key used to sign the encrypted leaseset
This is a valid EdDSA private key.
a
The blinded 32-byte EdDSA signing public key in the Destination,
may be generated with DERIVE_PUBLIC(a'), or from A and alpha.
This is a valid EdDSA public key, on the curve and on the prime-order subgroup.
A
Flip the order of the input bytes to little-endian
a’
32 bytes = (LEOS2IP(SHA512(x))) mod B, same as in Ed25519 hash-and-reduce
Cálculos de Ofuscación
A'
LEOS2IP(x)
// GENERATE_ALPHA(destination, date, secret)
// secret is optional, else zero-length
A = destination's signing public key
stA = signature type of A, 2 bytes big endian (0x0007 or 0x000b)
stA' = signature type of blinded public key A', 2 bytes big endian (0x000b)
keydata = A || stA || stA'
datestring = 8 bytes ASCII YYYYMMDD from the current date UTC
secret = UTF-8 encoded string
seed = HKDF(H("I2PGenerateAlpha", keydata), datestring || secret, "i2pblinding1", 64)
// treat seed as a 64 byte little-endian value
alpha = seed mod L
H*(x)
// BLIND_PRIVKEY()
alpha = GENERATE_ALPHA(destination, date, secret)
// If for a Ed25519 private key (type 7)
seed = destination's signing private key
a = left half of SHA512(seed) and clamped as usual for Ed25519
// else, for a Red25519 private key (type 11)
a = destination's signing private key
// Addition using scalar arithmentic
blinded signing private key = a' = BLIND_PRIVKEY(a, alpha) = (a + alpha) mod L
blinded signing public key = A' = DERIVE_PUBLIC(a')
Una nueva clave secreta alpha y claves ofuscadas deben generarse cada día (UTC). La clave secreta alpha y las claves ofuscadas se calculan como sigue.
// BLIND_PUBKEY()
alpha = GENERATE_ALPHA(destination, date, secret)
A = destination's signing public key
// Addition using group elements (points on the curve)
blinded public key = A' = BLIND_PUBKEY(A, alpha) = A + DERIVE_PUBLIC(alpha)
GENERATE_ALPHA(destination, date, secret), para todas las partes:
Firmado
BLIND_PRIVKEY(), para el propietario que publica el leaseset:
BLIND_PUBKEY(), para los clientes que recuperan el leaseset:
Ambos métodos de cálculo de A’ producen el mismo resultado, como se requiere.
El leaseset sin ofuscar está firmado por la clave privada de firma Ed25519 o Red25519 sin ofuscar y verificado con la clave pública de firma Ed25519 o Red25519 sin ofuscar (tipos de firma 7 u 11) como de costumbre.
Cálculos de Firma/Verificación
Si la clave pública de firma está fuera de línea, el leaseset sin ofuscar está firmado por la clave privada de firma transitoria Ed25519 o Red25519 sin ofuscar y verificado con la clave pública de firma transitoria Ed25519 o Red25519 sin ofuscar (tipos de firma 7 u 11) como de costumbre. Ver más abajo para notas adicionales sobre claves fuera de línea para leasesets cifrados.
Para la firma del leaseset cifrado, usamos Red25519, basado en RedDSA para firmar y verificar con claves ofuscadas. Las firmas Red25519 son sobre la curva Ed25519, usando SHA-512 para el hash.
Red25519 es idéntico a Ed25519 estándar excepto como se especifica a continuación.
La parte externa del leaseset cifrado usa claves y firmas Red25519.
Red25519 es casi idéntico a Ed25519. Hay dos diferencias:
T = 80 random bytes
r = H*(T || publickey || message)
// rest is the same as in Ed25519
Las claves privadas Red25519 se generan a partir de números aleatorios y luego deben reducirse mod L, donde L se define arriba. Las claves privadas Ed25519 se generan a partir de números aleatorios y luego “ajustan” usando enmascaramiento bit a bit a los bytes 0 y 31. Esto no se hace para Red25519. Las funciones GENERATE_ALPHA() y BLIND_PRIVKEY() definidas arriba generan claves privadas Red25519 adecuadas usando mod L.
// same as in Ed25519
Encriptación y procesamiento
Derivación de subcredenciales
En Red25519, el cálculo de r para la firma usa datos aleatorios adicionales, y usa el valor de la clave pública en lugar del hash de la clave privada. Debido a los datos aleatorios, cada firma Red25519 es diferente, incluso al firmar los mismos datos con la misma clave.
A = destination's signing public key
stA = signature type of A, 2 bytes big endian (0x0007 or 0x000b)
stA' = signature type of A', 2 bytes big endian (0x000b)
keydata = A || stA || stA'
credential = H("credential", keydata)
Firmado:
Verificación:
subcredential = H("subcredential", credential || blindedPublicKey)
Como parte del proceso de ofuscación, necesitamos asegurar que un LS2 cifrado solo pueda ser descifrado por alguien que conozca la clave pública de firma del Destino correspondiente. No se requiere el Destino completo. Para lograr esto, derivamos una credencial de la clave pública de firma:
Encriptación de capa 1
La cadena de personalización asegura que la credencial no colisione con ningún hash usado como clave de búsqueda DHT, como el hash simple del Destino.
outerInput = subcredential || publishedTimestamp
Para una clave ofuscada dada, podemos derivar una subcredencial:
outerSalt = CSRNG(32)
La subcredencial se incluye en los procesos de derivación de clave más abajo, lo que enlaza esas claves al conocimiento de la clave pública de firma del Destino.
keys = HKDF(outerSalt, outerInput, "ELS2_L1K", 44)
outerKey = keys[0:31]
outerIV = keys[32:43]
Primero, se prepara la entrada para el proceso de derivación de clave:
outerCiphertext = outerSalt || ENCRYPT(outerKey, outerIV, outerPlaintext)
Descifrado de capa 1
Luego, se genera una sal aleatoria:
outerSalt = outerCiphertext[0:31]
Luego, se deriva la clave usada para cifrar la capa 1:
outerInput = subcredential || publishedTimestamp
keys = HKDF(outerSalt, outerInput, "ELS2_L1K", 44)
outerKey = keys[0:31]
outerIV = keys[32:43]
Finalmente, se cifra y serializa el texto plano de la capa 1:
outerPlaintext = DECRYPT(outerKey, outerIV, outerCiphertext[32:end])
Encriptación de capa 2
La sal se analiza desde el texto cifrado de la capa 1:
Luego, se deriva la clave usada para cifrar la capa 1:
innerInput = authCookie || subcredential || publishedTimestamp
innerSalt = CSRNG(32)
keys = HKDF(innerSalt, innerInput, "ELS2_L2K", 44)
innerKey = keys[0:31]
innerIV = keys[32:43]
innerCiphertext = innerSalt || ENCRYPT(innerKey, innerIV, innerPlaintext)
Descifrado de capa 2
Finalmente, se descifra el texto cifrado de la capa 1:
Cuando la autorización de cliente está habilitada, se calcula authCookie como se describe más abajo. Cuando la autorización de cliente está deshabilitada, authCookie es el array de bytes de longitud cero.
innerInput = authCookie || subcredential || publishedTimestamp
innerSalt = innerCiphertext[0:31]
keys = HKDF(innerSalt, innerInput, "ELS2_L2K", 44)
innerKey = keys[0:31]
innerIV = keys[32:43]
innerPlaintext = DECRYPT(innerKey, innerIV, innerCiphertext[32:end])
Autorización por cliente
El cifrado procede de forma similar a la capa 1:
Cuando la autorización de cliente está habilitada, se calcula authCookie como se describe más abajo. Cuando la autorización de cliente está deshabilitada, authCookie es el array de bytes de longitud cero.
Autorización de cliente DH
El descifrado procede de forma similar a la capa 1:
Cuando la autorización de cliente está habilitada para un Destino, el servidor mantiene una lista de clientes a los que autoriza para descifrar los datos del LS2 cifrado. Los datos almacenados por cliente dependen del mecanismo de autorización, e incluyen alguna forma de material de clave que cada cliente genera y envía al servidor mediante un mecanismo seguro fuera de banda.
authCookie = CSRNG(32)
esk = GENERATE_PRIVATE()
epk = DERIVE_PUBLIC(esk)
Hay dos alternativas para implementar la autorización por cliente:
sharedSecret = DH(esk, cpk_i)
authInput = sharedSecret || cpk_i || subcredential || publishedTimestamp
okm = HKDF(epk, authInput, "ELS2_XCA", 52)
clientKey_i = okm[0:31]
clientIV_i = okm[32:43]
clientID_i = okm[44:51]
clientCookie_i = ENCRYPT(clientKey_i, clientIV_i, authCookie)
Cada cliente genera un par de claves DH [csk_i, cpk_i], y envía la clave pública cpk_i al servidor.
Procesamiento del servidor ^^^^^^^^^^^^^^^^^ El servidor genera un nuevo authCookie y un par de claves DH efímero:
sharedSecret = DH(csk_i, epk)
authInput = sharedSecret || cpk_i || subcredential || publishedTimestamp
okm = HKDF(epk, authInput, "ELS2_XCA", 52)
clientKey_i = okm[0:31]
clientIV_i = okm[32:43]
clientID_i = okm[44:51]
Luego, para cada cliente autorizado, el servidor cifra authCookie con su clave pública:
authCookie = DECRYPT(clientKey_i, clientIV_i, clientCookie_i)
Autorización de cliente con clave precompartida
El servidor coloca cada tupla [idCliente_i, cookieCliente_i] en la capa 1 del LS2 cifrado, junto con epk.
Procesamiento del cliente ^^^^^^^^^^^^^^^^^ El cliente usa su clave privada para derivar su identificador de cliente esperado idCliente_i, clave de cifrado claveCliente_i, y IV de cifrado ivCliente_i:
authCookie = CSRNG(32)
authSalt = CSRNG(32)
Luego, el cliente busca en los datos de autorización de la capa 1 una entrada que contenga idCliente_i. Si existe una entrada coincidente, el cliente la descifra para obtener authCookie:
authInput = psk_i || subcredential || publishedTimestamp
okm = HKDF(authSalt, authInput, "ELS2PSKA", 52)
clientKey_i = okm[0:31]
clientIV_i = okm[32:43]
clientID_i = okm[44:51]
clientCookie_i = ENCRYPT(clientKey_i, clientIV_i, authCookie)
Cada cliente genera una clave secreta de 32 bytes psk_i, y la envía al servidor. Alternativamente, el servidor puede generar la clave secreta, y enviársela a uno o más clientes.
Procesamiento del servidor ^^^^^^^^^^^^^^^^^ El servidor genera un nuevo authCookie y una sal:
authInput = psk_i || subcredential || publishedTimestamp
okm = HKDF(authSalt, authInput, "ELS2PSKA", 52)
clientKey_i = okm[0:31]
clientIV_i = okm[32:43]
clientID_i = okm[44:51]
Luego, para cada cliente autorizado, el servidor cifra authCookie con su clave precompartida:
authCookie = DECRYPT(clientKey_i, clientIV_i, clientCookie_i)
Consideraciones de seguridad
El servidor coloca cada tupla [idCliente_i, cookieCliente_i] en la capa 1 del LS2 cifrado, junto con authSalt.
Procesamiento del cliente ^^^^^^^^^^^^^^^^^ El cliente usa su clave precompartida para derivar su identificador de cliente esperado idCliente_i, clave de cifrado claveCliente_i, y IV de cifrado ivCliente_i:
Luego, el cliente busca en los datos de autorización de la capa 1 una entrada que contenga idCliente_i. Si existe una entrada coincidente, el cliente la descifra para obtener authCookie:
Ambos mecanismos de autorización de cliente anteriores proporcionan privacidad para la membresía de clientes. Una entidad que solo conozca el Destino puede ver cuántos clientes están suscritos en cualquier momento, pero no puede rastrear qué clientes se están añadiendo o revocando.
- Cifrar todo por seguridad
- Cifrar de forma segura, no solo con AES.
- Cifrar a cada destinatario
Los servidores DEBERÍAN aleatorizar el orden de los clientes cada vez que generen un LS2 cifrado, para evitar que los clientes aprendan su posición en la lista e infieran cuándo se han añadido o revocado otros clientes.
- Una capa externa que contiene la información en texto claro necesaria para almacenamiento y recuperación.
- Una capa intermedia que maneja la autenticación del cliente.
- Una capa interna que contiene los datos reales de LS2.
Un servidor PUEDE optar por ocultar el número de clientes suscritos insertando entradas aleatorias en la lista de datos de autorización.
- La clave pública de firma en el destino sin ofuscar debe ser
Ed25519 (tipo de firma 7) o Red25519 (tipo de firma 11);
no se admiten otros tipos de firma - Si la clave pública de firma está fuera de línea, la clave pública de firma transitoria también debe ser Ed25519
- La ofuscación es computacionalmente simple
- Usar primitivas criptográficas existentes
- Las claves públicas ofuscadas no pueden desofuscarse
- Las claves públicas ofuscadas deben estar en la curva Ed25519 y en el subgrupo de orden primo
- Debe conocerse la clave pública de firma del destino
(no se requiere el destino completo) para derivar la clave pública ofuscada - Opcionalmente proporcionar un secreto adicional requerido para derivar la clave pública ofuscada
Ventajas de la autorización de cliente DH ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- La seguridad del esquema no depende únicamente del intercambio fuera de banda del material de clave del cliente.
La clave privada del cliente nunca necesita salir de su dispositivo, y por tanto un
adversario que pueda interceptar el intercambio fuera de banda, pero no pueda romper el algoritmo DH,
no puede descifrar el LS2 cifrado, ni determinar cuánto tiempo se le da acceso al cliente.
LS Cifrado con Direcciones Base 32
Desventajas de la autorización de cliente DH ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Ventajas de la autorización de cliente PSK ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LS Cifrado con Claves Fuera de Línea
Desventajas de la autorización de cliente PSK ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Ver propuesta 149.
No puedes usar un LS2 cifrado para bittorrent, debido a las respuestas compactas de anuncio que son de 32 bytes. Los 32 bytes contienen solo el hash. No hay espacio para indicar que el leaseset está cifrado, o los tipos de firma.
Notas
Requiere N + 1 operaciones DH en el lado del servidor para N clientes.
Requiere una operación DH en el lado del cliente.
Requiere que el cliente genere la clave secreta.
No requiere operaciones DH.
Permite que el servidor genere la clave secreta.
Permite que el servidor comparta la misma clave con múltiples clientes, si se desea.
La seguridad del esquema depende críticamente del intercambio fuera de banda del material de clave del cliente.
Un adversario que intercepte el intercambio para un cliente particular puede descifrar
cualquier LS2 cifrado posterior para el cual ese cliente esté autorizado, así como determinar
cuándo se revoca el acceso del cliente.Un servicio que use leasesets cifrados publicaría la versión cifrada a los
floodfills. Sin embargo, por eficiencia, enviaría leasesets sin cifrar a
clientes en el mensaje garlic envuelto, una vez autenticado (por ejemplo, mediante lista blanca).Los floodfills pueden limitar el tamaño máximo a un valor razonable para prevenir abusos.
Meta LS2
Para leasesets cifrados con claves fuera de línea, las claves privadas ofuscadas también deben generarse fuera de línea, una por cada día.
Como el bloque opcional de firma fuera de línea está en la parte en texto claro del leaseset cifrado, cualquiera que rastree los floodfills podría usar esto para rastrear el leaseset (pero no descifrarlo) durante varios días. Para evitar esto, el propietario de las claves debería generar nuevas claves transitorias para cada día también. Tanto las claves transitorias como las ofuscadas pueden generarse por adelantado, y entregarse al router por lotes.
No se define en esta propuesta un formato de archivo para empaquetar múltiples claves transitorias y ofuscadas y proporcionarlas al cliente o router. No se define en esta propuesta una mejora del protocolo I2CP para soportar leasesets cifrados con claves fuera de línea.
Se usa para reemplazar el multihoming. Como cualquier leaseset, está firmado por el creador. Es una lista autenticada de hashes de destino.
Meta LS2 es la parte superior, y posiblemente nodos intermedios, de una estructura de árbol. Contiene un número de entradas, cada una apuntando a un LS, LS2 o otro Meta LS2 para soportar multihoming masivo. Un Meta LS2 puede contener una mezcla de entradas LS, LS2 y Meta LS2. Las hojas del árbol siempre son un LS o LS2. El árbol es un DAG; se prohíben bucles; los clientes que hacen búsquedas deben detectar y rechazar seguir bucles.
Un Meta LS2 puede tener una expiración mucho más larga que un LS o LS2 estándar. El nivel superior puede tener una expiración varias horas después de la fecha de publicación. El tiempo máximo de expiración será aplicado por floodfills y clientes, y está por determinar.
El caso de uso para Meta LS2 es multihoming masivo, pero sin más protección para la correlación de routers con leasesets (en el reinicio del router) que la proporcionada actualmente con LS o LS2. Esto es equivalente al caso de uso de “facebook”, que probablemente no necesita protección contra correlación. Este caso de uso probablemente necesita claves fuera de línea, que se proporcionan en el encabezado estándar en cada nodo del árbol.
El protocolo de back-end para coordinación entre los routers hoja, firmantes intermedios y maestros de Meta LS no se especifica aquí. Los requisitos son extremadamente simples: solo verificar que el par está activo, y publicar un nuevo LS cada pocas horas. La única complejidad es para elegir nuevos publicadores para los Meta LS de nivel superior o intermedio en caso de fallo.
Leasesets mixtos donde leases de múltiples routers se combinan, firman y publican en un solo leaseset se documentan en la propuesta 140, “multihoming invisible”. Esta propuesta es inviable tal como está escrita, porque las conexiones de streaming no serían “pegajosas” a un solo router, ver http://zzz.i 2p/topics/2335 .
El protocolo de back-end, y la interacción con los componentes internos del router y cliente, sería bastante complejo para el multihoming invisible.
Standard LS flag (1)
Para evitar sobrecargar el floodfill para el Meta LS de nivel superior, la expiración debería ser de varias horas como mínimo. Los clientes deben almacenar en caché el Meta LS de nivel superior, y persistirlo entre reinicios si no ha expirado.
Meta LS2 type (7)
Necesitamos definir algún algoritmo para que los clientes recorran el árbol, incluyendo alternativas, para que el uso se disperse. Alguna función de distancia de hash, costo y aleatoriedad. Si un nodo tiene tanto LS o LS2 como Meta LS, necesitamos saber cuándo está permitido usar esos leasesets, y cuándo seguir recorriendo el árbol.
Hash of destination
This hash is then used to generate the daily "routing key", as in LS1
Buscar con
Hours. Max 18.2 hours (65535 seconds)
Almacenar con
"master" Destination or coordinator, or intermediate coordinators
Formato
Standard LS2 Header as specified above
Meta LS2 Type-Specific Part
- Properties (Mapping as specified in common structures spec, 2 zero bytes if none)
- Number of entries (1 byte) Maximum TBD
- Entries. Each entry contains: (40 bytes)
- Hash (32 bytes)
- Flags (2 bytes)
TBD. Set all to zero for compatibility with future uses.
- Type (1 byte) The type of LS it is referencing;
1 for LS, 3 for LS2, 5 for encrypted, 7 for meta, 0 for unknown.
- Cost (priority) (1 byte)
- Expires (4 bytes) (4 bytes, big endian, seconds since epoch, rolls over in 2106)
- Number of revocations (1 byte) Maximum TBD
- Revocations: Each revocation contains: (32 bytes)
- Hash (32 bytes)
Standard LS2 Signature:
- Signature (40+ bytes)
The signature is of everything above.
Almacenar en
Notas
Después del descifrado, se deben hacer varias comprobaciones, incluyendo que
la marca de tiempo interna y la expiración coincidan con las del nivel superior.ChaCha20 fue seleccionado sobre AES. Aunque las velocidades son similares si
el soporte de hardware AES está disponible, ChaCha20 es 2.5-3 veces más rápido cuando
el soporte de hardware AES no está disponible, como en dispositivos ARM de gama baja.No nos importa lo suficiente la velocidad como para usar BLAKE2b con clave. Tiene un tamaño de salida
lo suficientemente grande para acomodar el mayor n que requerimos (o podemos llamarlo una vez por
clave deseada con un argumento contador). BLAKE2b es mucho más rápido que SHA-256, y
BLAKE2b con clave reduciría el número total de llamadas a funciones hash.
Sin embargo, ver propuesta 148, donde se propone que cambiemos a BLAKE2b por otras razones.
Ver rendimiento de derivación segura de claves .
Registro de Servicio
Expiración típica
Publicado por
Flags y propiedades: para uso futuro
n/a, see Service List
Este es un registro individual que indica que un destino está participando en un servicio. Se envía desde el participante al floodfill. Nunca se envía individualmente por un floodfill, sino solo como parte de una Lista de Servicios. El Registro de Servicio también se usa para revocar la participación en un servicio, estableciendo la expiración en cero.
Service Record type (9)
Esto no es un LS2 pero usa el formato estándar de encabezado y firma LS2.
Hash of service name
This hash is then used to generate the daily "routing key", as in LS1
Buscar con
Hours. Max 18.2 hours (65535 seconds)
Almacenar con
Destination
Formato
Standard LS2 Header as specified above
Service Record Type-Specific Part
- Port (2 bytes, big endian) (0 if unspecified)
- Hash of service name (32 bytes)
Standard LS2 Signature:
- Signature (40+ bytes)
The signature is of everything above.
Notas
Un servicio distribuido que use esto tendría uno o más “maestros” con la
clave privada del destino del servicio. Determinarían (fuera de banda) la
lista actual de destinos activos y publicarían el Meta LS2. Para
redundancia, múltiples maestros podrían hacer multihoming (es decir, publicar simultáneamente) el
Meta LS2.Un servicio distribuido podría comenzar con un solo destino o usar multihoming de estilo antiguo,
luego pasar a un Meta LS2. Una búsqueda LS estándar podría devolver
cualquiera de un LS, LS2 o Meta LS2.Cuando un servicio usa un Meta LS2, no tiene túneles (leases).
Lista de Servicios
Almacenar en
Expiración típica
Publicado por
Esto no es nada parecido a un LS2 y usa un formato diferente.
La lista de servicios es creada y firmada por el floodfill. Es no autenticada en el sentido de que cualquiera puede unirse a un servicio publicando un Registro de Servicio a un floodfill.
Una Lista de Servicios contiene Registros de Servicio Cortos, no Registros de Servicio completos. Estos contienen firmas pero solo hashes, no destinos completos, por lo que no pueden verificarse sin el destino completo.
Service List lookup type (11)
La seguridad, si la hay, y la conveniencia de las listas de servicios está por determinar. Los floodfills podrían limitar la publicación y búsquedas a una lista blanca de servicios, pero esa lista blanca puede variar según la implementación o preferencia del operador. Puede no ser posible lograr consenso sobre una lista blanca común y básica entre implementaciones.
Service List type (11)
Si el nombre del servicio se incluye en el registro de servicio anterior, entonces los operadores de floodfill pueden objetar; si solo se incluye el hash, no hay verificación, y un registro de servicio podría “entrar” antes que cualquier otro tipo netdb y almacenarse en el floodfill.
Hash of service name
This hash is then used to generate the daily "routing key", as in LS1
Buscar con
Hours, not specified in the list itself, up to local policy
Almacenar con
Nobody, never sent to floodfill, never flooded.
Formato
Almacenar en
- Type (1 byte)
Not actually in header, but part of data covered by signature.
Take from field in Database Store Message.
- Hash of the service name (implicit, in the Database Store message)
- Hash of the Creator (floodfill) (32 bytes)
- Published timestamp (8 bytes, big endian)
- Number of Short Service Records (1 byte)
- List of Short Service Records:
Each Short Service Record contains (90+ bytes)
- Dest hash (32 bytes)
- Published timestamp (8 bytes, big endian)
- Expires (4 bytes, big endian) (offset from published in ms)
- Flags (2 bytes)
- Port (2 bytes, big endian)
- Sig length (2 bytes, big endian)
- Signature of dest (40+ bytes)
- Number of Revocation Records (1 byte)
- List of Revocation Records:
Each Revocation Record contains (86+ bytes)
- Dest hash (32 bytes)
- Published timestamp (8 bytes, big endian)
- Flags (2 bytes)
- Port (2 bytes, big endian)
- Sig length (2 bytes, big endian)
- Signature of dest (40+ bytes)
- Signature of floodfill (40+ bytes)
The signature is of everything above.
Expiración típica
- Si expira es todo cero, el floodfill debería revocar el registro y ya no
incluirlo en la lista de servicios.
Publicado por
- Almacenamiento: El floodfill puede limitar estrictamente el almacenamiento de estos registros y
limitar el número de registros almacenados por hash y su expiración. También puede usarse
una lista blanca de hashes.
NO usa el encabezado LS2 estándar especificado anteriormente.
- Cualquier otro tipo netdb en el mismo hash tiene prioridad, por lo que un registro de servicio nunca puede
sobrescribir un LS/RI, pero un LS/RI sobrescribirá todos los registros de servicio en ese hash.
Notas
anteponer el hash del nombre del servicio
eliminar el hash del creador
Verificar la firma del contenido modificado
Obtener el destino
Verificar la firma de (marca de tiempo de publicación + expira + flags + puerto + Hash del
nombre del servicio)Obtener el destino
Verificar la firma de (marca de tiempo de publicación + 4 bytes cero + flags + puerto + Hash
del nombre del servicio)
Cambios Requeridos en la Especificación de Estructuras Comunes
Certificados de Clave
Para verificar la firma de la Lista de Servicios:
Nuevas Estructuras Intermedias
Para verificar la firma de cada Registro de Servicio Corto:
Nuevos Tipos NetDB
Para verificar la firma de cada Registro de Revocación:
Nuevo Tipo de Firma
Fuera del alcance de esta propuesta. Añadir a las propuestas ECIES 144 y 145.
Cambios requeridos en la especificación de cifrado
Añadir nuevas estructuras para Lease2, MetaLease, LeaseSet2Header y OfflineSignature. Efectivo a partir de la versión 0.9.38.
Cambios requeridos en I2NP
Añadir estructuras para cada nuevo tipo de leaseset, incorporadas de arriba. Para LeaseSet2, EncryptedLeaseSet y MetaLeaseSet, efectivo a partir de la versión 0.9.38. Para Registro de Servicio y Lista de Servicios, preliminar y no programado.
Mensaje de búsqueda en la base de datos
Añadir RedDSA_SHA512_Ed25519 Tipo 11. Clave pública de 32 bytes; clave privada de 32 bytes; hash de 64 bytes; firma de
Cambios
Flags byte: Lookup type field, currently bits 3-2, expands to bits 4-2.
Lookup type 0x04 is defined as the service list lookup.
Add note: Service list loookup may only be sent to floodfills with a minimum version.
Minimum version is 0.9.38.
Mensaje de almacenamiento de base de datos
Añada todos los nuevos tipos de almacenamiento.
Cambios
Type byte: Type field, currently bit 0, expands to bits 3-0.
Type 3 is defined as a LS2 store.
Type 5 is defined as a encrypted LS2 store.
Type 7 is defined as a meta LS2 store.
Type 9 is defined as a service record store.
Type 11 is defined as a service list store.
Other types are undefined and invalid.
Add note: All new types may only be published to floodfills with a minimum version.
Minimum version is 0.9.38.
Cambios requeridos en I2CP
Opciones de I2CP
Nuevas opciones interpretadas del lado del router, enviadas en el SessionConfig Mapping:
i2cp.leaseSetType=nnn The type of leaseset to be sent in the Create Leaseset Message
Value is the same as the netdb store type in the table above.
Interpreted client-side, but also passed to the router in the
SessionConfig, to declare intent and check support.
i2cp.leaseSetEncType=nnn[,nnn] The encryption types to be used.
Interpreted client-side, but also passed to the router in
the SessionConfig, to declare intent and check support.
See proposals 144 and 145.
i2cp.leaseSetOfflineExpiration=nnn The expiration of the offline signature, ASCII,
seconds since the epoch.
i2cp.leaseSetTransientPublicKey=[type:]b64 The base 64 of the transient private key,
prefixed by an optional sig type number
or name, default DSA_SHA1.
Length as inferred from the sig type
i2cp.leaseSetOfflineSignature=b64 The base 64 of the offline signature.
Length as inferred from the destination
signing public key type
i2cp.leaseSetSecret=b64 The base 64 of a secret used to blind the
address of the leaseset, default ""
i2cp.leaseSetAuthType=nnn The type of authentication for encrypted LS2.
0 for no per-client authentication (the default)
1 for DH per-client authentication
2 for PSK per-client authentication
i2cp.leaseSetPrivKey=b64 A base 64 private key for the router to use to
decrypt the encrypted LS2,
only if per-client authentication is enabled
Nuevas opciones interpretadas del lado del cliente:
i2cp.leaseSetType=nnn The type of leaseset to be sent in the Create Leaseset Message
Value is the same as the netdb store type in the table above.
Interpreted client-side, but also passed to the router in the
SessionConfig, to declare intent and check support.
i2cp.leaseSetEncType=nnn[,nnn] The encryption types to be used.
Interpreted client-side, but also passed to the router in
the SessionConfig, to declare intent and check support.
See proposals 144 and 145.
i2cp.leaseSetSecret=b64 The base 64 of a secret used to blind the
address of the leaseset, default ""
i2cp.leaseSetAuthType=nnn The type of authentication for encrypted LS2.
0 for no per-client authentication (the default)
1 for DH per-client authentication
2 for PSK per-client authentication
i2cp.leaseSetBlindedType=nnn The sig type of the blinded key for encrypted LS2.
Default depends on the destination sig type.
i2cp.leaseSetClient.dh.nnn=b64name:b64pubkey The base 64 of the client name (ignored, UI use only),
followed by a ':', followed by the base 64 of the public
key to use for DH per-client auth. nnn starts with 0
i2cp.leaseSetClient.psk.nnn=b64name:b64privkey The base 64 of the client name (ignored, UI use only),
followed by a ':', followed by the base 64 of the private
key to use for PSK per-client auth. nnn starts with 0
Configuración de sesión
Tenga en cuenta que para las firmas offline se requieren las opciones i2cp.leaseSetOfflineExpiration, i2cp.leaseSetTransientPublicKey e i2cp.leaseSetOfflineSignature, y la firma la realiza la clave privada de firma transitoria.
Mensaje de solicitud de leaseSet
Del router al cliente. Sin cambios. Los leases se envían con timestamps de 8 bytes, incluso si el leaseset devuelto será un LS2 con timestamps de 4 bytes. Tenga en cuenta que la respuesta puede ser un mensaje Create Leaseset o Create Leaseset2.
Mensaje de solicitud de leaseSet variable
Del router al cliente. Sin cambios. Los leases se envían con timestamps de 8 bytes, incluso si el leaseset devuelto será un LS2 con timestamps de 4 bytes. Tenga en cuenta que la respuesta puede ser un mensaje Create Leaseset o Create Leaseset2.
Crear mensaje Leaseset2
De cliente a router. Mensaje nuevo, para usar en lugar de Create Leaseset Message.
Justificación
Usamos longitud de firma en lugar de tipo de firma para soportar tipos de firma desconocidos.
No hay expiración de una lista de servicios, los receptores pueden tomar su propia
decisión según política o la expiración de los registros individuales.Las Listas de Servicios no se inundan, solo los Registros de Servicio individuales lo son. Cada
floodfill crea, firma y almacena en caché una Lista de Servicios. El floodfill usa su
propia política para el tiempo de caché y el número máximo de registros de servicio y revocación.
Tipo de mensaje
El tipo de mensaje para el mensaje Create Leaseset2 es 41.
Formato
Session ID
Type byte: Type of lease set to follow
Type 1 is a LS
Type 3 is a LS2
Type 5 is a encrypted LS2
Type 7 is a meta LS2
LeaseSet: type specified above
Number of private keys to follow (1 byte)
Encryption Private Keys: For each public key in the lease set,
in the same order
(Not present for Meta LS2)
- Encryption type (2 bytes, big endian)
- Encryption key length (2 bytes, big endian)
- Encryption key (number of bytes specified)
Notas
- La versión mínima del router es 0.9.39.
- La versión preliminar con el tipo de mensaje 40 estaba en 0.9.38, pero el formato fue cambiado. El tipo 40 está abandonado y no es compatible.
Problemas
- Se necesitan más cambios para admitir LS cifrados y meta LS.
Mensaje de información de blinding
Cliente a router. Nuevo mensaje.
Justificación
El router necesita saber si un destino está cegado. Si está cegado y utiliza autenticación secreta o por cliente, también necesita tener esa información.
Un Host Lookup de una dirección b32 de formato nuevo (“b33”) indica al router que la dirección está blinded, pero no hay ningún mecanismo para pasar la clave secreta o privada al router en el mensaje de Host Lookup. Si bien podríamos extender el mensaje de Host Lookup para añadir esa información, es más limpio definir un mensaje nuevo.
Necesitamos una forma programática para que el cliente se lo indique al router. De lo contrario, el usuario tendría que configurar manualmente cada destino.
Uso
Antes de que un cliente envíe un mensaje a un destino cegado, debe consultar el “b33” en un mensaje Host Lookup o enviar un mensaje Blinding Info. Si el destino cegado requiere un secreto o autenticación por cliente, el cliente debe enviar un mensaje Blinding Info.
El router no envía una respuesta a este mensaje.
Tipo de mensaje
El tipo de mensaje para el Blinding Info Message es 42.
Formato
Session ID
Flags: 1 byte
Bit order: 76543210
Bit 0: 0 for everybody, 1 for per-client
Bits 3-1: Authentication scheme, if bit 0 is set to 1 for per-client, otherwise 000
000: DH client authentication (or no per-client authentication)
001: PSK client authentication
Bit 4: 1 if secret required, 0 if no secret required
Bits 7-5: Unused, set to 0 for future compatibility
Type byte: Endpoint type to follow
Type 0 is a Hash
Type 1 is a host name String
Type 2 is a Destination
Type 3 is a Sig Type and Signing Public Key
Blind Type: 2 byte blinded sig type (big endian)
Expiration: 4 bytes, big endian, seconds since epoch
Endpoint: Data as specified above
For type 0: 32 byte binary hash
For type 1: host name String
For type 2: binary Destination
For type 3: 2 byte sig type (big endian)
Signing Public Key (length as implied by sig type)
Private Key: Only if flag bit 0 is set to 1
A 32-byte ECIES_X25519 private key
Secret: Only if flag bit 4 is set to 1
A secret String
Notas
- La versión mínima del router es 0.9.43
Problemas
Mensaje de respuesta del host (enc)
Para admitir búsquedas de hostnames “b33” y devolver una indicación si el router no dispone de la información requerida, definimos códigos de resultado adicionales para el Host Reply Message, como se indica a continuación:
2: Lookup password required
3: Private key required
4: Lookup password and private key required
5: Leaseset decryption failure
Los valores 1-255 ya están definidos como errores, por lo que no existe ningún problema de compatibilidad hacia atrás.
Mensaje de redirección meta
Router a cliente. Mensaje nuevo.
Justificación
Un cliente no sabe a priori que un Hash dado resolverá a un Meta LS.
Si una búsqueda de leaseset para un Destination devuelve un Meta LS, el router realizará la resolución recursiva. Para los datagramas, el lado del cliente no necesita saberlo; sin embargo, para streaming, donde el protocolo verifica el destino en el SYN ACK, debe saber cuál es el destino “real”. Por lo tanto, necesitamos un nuevo mensaje.
Uso
El router mantiene una caché para el destino real que se utiliza a partir de un meta LS. Cuando el cliente envía un mensaje a un destino que se resuelve a un meta LS, el router comprueba en la caché el último destino real utilizado. Si la caché está vacía, el router selecciona un destino del meta LS y busca el leaseset. Si la búsqueda del leaseset tiene éxito, el router añade ese destino a la caché y envía al cliente un Meta Redirect Message. Esto solo se hace una vez, a menos que el destino caduque y deba cambiarse. El cliente también debe almacenar en caché la información si es necesario. El Meta Redirect Message NO se envía como respuesta a cada SendMessage.
El router solo envía este mensaje a los clientes con versión 0.9.47 o superior.
El cliente no envía una respuesta a este mensaje.
Tipo de mensaje
El tipo de mensaje para el Meta Redirect Message es 43.
Formato
Session ID (2 bytes) The value from the Send Message.
Message ID generated by the router (4 bytes)
4 byte nonce previously generated by the client
(the value from the Send Message, may be zero)
Flags: 2 bytes, bit order 15...0
Unused, set to 0 for future compatibility
Bit 0: 0 - the destination is no longer meta
1 - the destination is now meta
Bits 15-1: Unused, set to 0 for future compatibility
Original Destination (387+ bytes)
(following fields only present if flags bit 0 is 1)
MFlags: 2 bytes
Unused, set to 0 for future compatibility
From the Meta Lease for the actual Destination
Expiration: 4 bytes, big endian, seconds since epoch
From the Meta Lease for the actual Destination
Cost (priority) 1 byte
From the Meta Lease for the actual Destination
Actual (real) Destination (387+ bytes)
Cambios para admitir Meta
Cómo generar y dar soporte a Meta, incluida la comunicación y coordinación entre routers, está fuera del alcance de esta propuesta. Véase la propuesta relacionada 150.
Cambios para admitir claves offline
Las firmas offline no se pueden verificar en streaming ni en datagramas repliables. Véanse las secciones siguientes.
Se requieren cambios en el archivo de clave privada
El formato del archivo de clave privada (eepPriv.dat) no forma parte oficial de nuestras especificaciones, pero está documentado en los javadocs de Java I2P y otras implementaciones sí lo admiten. Esto permite la portabilidad de las claves privadas entre distintas implementaciones.
Son necesarios cambios para almacenar la clave pública transitoria y la información de firma sin conexión.
Cambios
If the signing private key is all zeros, the offline information section follows:
- Expires timestamp
(4 bytes, big endian, seconds since epoch, rolls over in 2106)
- Sig type of transient Signing Public Key (2 bytes, big endian)
- Transient Signing Public key
(length as specified by transient sig type)
- Signature of above three fields by offline key
(length as specified by destination sig type)
- Transient Signing Private key
(length as specified by transient sig type)
Cambios necesarios en la CLI del archivo de clave privada
Añada soporte para las siguientes opciones:
-d days (specify expiration in days of offline sig, default 365)
-o offlinedestfile (generate the online key file,
using the offline key file specified)
-r sigtype (specify sig type of transient key, default Ed25519)
Cambios necesarios en streaming
Actualmente, las firmas offline no se pueden verificar en streaming. El cambio siguiente añade el bloque de firma offline a las opciones. Esto evita tener que recuperar esta información mediante I2CP.
Cambios
Add new option:
Bit: 11
Flag: OFFLINE_SIGNATURE
Option order: 4
Option data: Variable bytes
Function: Contains the offline signature section from LS2.
FROM_INCLUDED must also be set.
Expires timestamp
(4 bytes, big endian, seconds since epoch, rolls over in 2106)
Transient sig type (2 bytes, big endian)
Transient signing public key (length as implied by sig type)
Signature of expires timestamp, transient sig type,
and public key, by the destination public key,
length as implied by destination public key sig type.
Change option:
Bit: 3
Flag: SIGNATURE_INCLUDED
Option order: Change from 4 to 5
Add information about transient keys to the
Variable Length Signature Notes section:
The offline signature option does not needed to be added for a CLOSE packet if
a SYN packet containing the option was previously acked.
More info TODO
Notas
- La alternativa es simplemente añadir un flag y recuperar la clave pública transitoria mediante I2CP (Véanse las secciones Host Lookup / Host Reply Message anteriores)
Cambios necesarios en los datagramas con respuesta
Las firmas offline no se pueden verificar en el procesamiento de datagramas repliables. Se necesita un flag para indicar que están firmadas offline, pero no hay dónde colocar el flag. Requerirá un número y formato de protocolo completamente nuevos.
Cambios
Define new protocol 19 - Repliable datagram with options?
- Destination (387+ bytes)
- Flags (2 bytes)
Bit order: 15 14 ... 3 2 1 0
Bit 0: If 0, no offline keys; if 1, offline keys
Bits 1-15: set to 0 for compatibility with future uses
- If flag indicates offline keys, the offline signature section:
Expires timestamp
(4 bytes, big endian, seconds since epoch, rolls over in 2106)
Transient sig type (2 bytes, big endian)
Transient signing public key (length as implied by sig type)
Signature of expires timestamp, transient sig type,
and public key, by the destination public key,
length as implied by destination public key sig type.
This section can, and should, be generated offline.
- Data
Notas
- La alternativa es simplemente añadir un flag y obtener la clave pública transitoria mediante I2CP (Véanse las secciones Host Lookup / Host Reply Message anteriores)
- ¿Alguna otra opción que debamos añadir ahora que tenemos bytes de flag?
Cambios requeridos en SAM V3
Se debe mejorar SAM para admitir firmas offline en el DESTINATION base 64.
Cambios
Note that in the SESSION CREATE DESTINATION=$privkey,
the $privkey raw data (before base64 conversion)
may be optionally followed by the Offline Signature as specified in the
Common Structures Specification.
If the signing private key is all zeros, the offline information section follows:
- Expires timestamp
(4 bytes, big endian, seconds since epoch, rolls over in 2106)
- Sig type of transient Signing Public Key (2 bytes, big endian)
- Transient Signing Public key
(length as specified by transient sig type)
- Signature of above three fields by offline key
(length as specified by destination sig type)
- Transient Signing Private key (length as specified by transient sig type)
Tenga en cuenta que las firmas offline solo son compatibles con STREAM y RAW, no con DATAGRAM (hasta que definamos un nuevo protocolo DATAGRAM).
Tenga en cuenta que SESSION STATUS devolverá una Signing Private Key de todos ceros y los datos de Offline Signature exactamente como se suministraron en SESSION CREATE.
Tenga en cuenta que DEST GENERATE y SESSION CREATE DESTINATION=TRANSIENT no pueden usarse para crear un destino firmado offline.
Problemas
¿Actualizar la versión a 3.4, o dejarla en 3.1/3.2/3.3 de modo que pueda añadirse sin requerir todo lo de 3.2/3.3?
Otros cambios por determinar. Consulte la sección I2CP Host Reply Message anterior.
Cambios requeridos en BOB
Habría que mejorar BOB para admitir firmas offline y/o Meta LS. Esto es de baja prioridad y probablemente nunca se especifique ni se implemente. SAM V3 es la interfaz preferida.
Publicación, Migración, Compatibilidad
LS2 (excepto LS2 cifrado) se publica en la misma ubicación de la DHT que LS1. No hay forma de publicar tanto un LS1 como un LS2, a menos que LS2 estuviera en una ubicación diferente.
El LS2 cifrado se publica en el hash del tipo de clave y los datos de clave cegados. Este hash se usa luego para generar la «routing key» diaria, como en LS1.
LS2 solo se usaría cuando se requieran nuevas funcionalidades (nueva criptografía, LS cifrado, metadatos, etc.). LS2 solo se puede publicar en floodfills de una versión especificada o superior.
Los servidores que publican LS2 sabrían que cualquier cliente que se conecte soporta LS2. Podrían enviar LS2 en el garlic.
Los clientes enviarían LS2 en garlics solo si usan criptografía nueva. ¿Los clientes compartidos usarían LS1 indefinidamente? TODO: ¿Cómo tener clientes compartidos que admitan tanto criptografía antigua como nueva?
Despliegue
0.9.38 incluye soporte floodfill para LS2 estándar, incluidas las claves offline.
0.9.39 incluye soporte de I2CP para LS2 y Encrypted LS2, firma/verificación con sig type 11, soporte de floodfill para Encrypted LS2 (sig types 7 y 11, sin offline keys) y cifrado/descifrado de LS2 (sin autorización por cliente).
Está previsto que la versión 0.9.40 incluya soporte para cifrar/descifrar LS2 con autorización por cliente, soporte de floodfill e I2CP para Meta LS2, soporte para LS2 cifrado con claves offline y soporte de b32 para LS2 cifrado.
Agradecimientos
El diseño cifrado de LS2 está fuertemente influenciado por los descriptores de servicios ocultos v3 de Tor , que tenían objetivos de diseño similares.