I2P es un proyecto con muchísimas potencialidades y que no cuenta con una cantidad de routers, usuarios y desarrolladores tan extensa como TOR a pesar de que ambas soluciones tienen un modelo similar (con algunas distinciones) y que han comenzado su desarrollo casi al mismo tiempo (año 2003). Por este motivo realmente merece la pena intentar contribuir con su desarrollo y evolución, además de que como se ha indicado en anteriores publicaciones de este blog, cuenta con una API de Java bastante robusta y que contiene funcionalidades bastante completas relacionadas especialmente con los mecanismos de comunicaciones seguras utilizando algoritmos criptográficos fuertes.
Las principales opciones para contribuir en este proyecto son:
- Traduciendo aplicaciones y documentación a otros lenguajes.
- Desarrollando EEPSITES en el interior de la red y compartiendo información (por ejemplo, el desarrollo de un blog es una buena opción)
- Desarrollando aplicaciones
- Probando la plataforma y detectando errores
- Solucionando problemas en el código.
- Implementando nuevas características
Como puede verse, existen muchas formas de contribuir en el desarrollo de I2P, algunas de las cuales pueden ser llevadas a cabo por casi cualquier persona sin conocimientos en programación, otras de estas tareas requieren un poco más de conocimientos, pero sin lugar a dudas, los aportes que mejor se valoran y que evidentemente ayudan mucho más al desarrollo de esta red, son lo que están relacionados con las corrección de código y desarrollo de funcionalidades, evidentemente es necesario tener conocimientos sólidos sobre programación, especialmente en lenguaje Java, dado que prácticamente todo el código “core” se encuentra escrito en Java.
Dado lo anterior, en esta publicación se intentará explicar como acceder al repositorio de I2P y obtener la última revisión de este software (I2P se encuentra localizado en un repositorio Monotone), así como también algunas pautas para importar los fuentes en Eclipse para un rápido desarrollo. Esta será un guía para comenzar a desarrollar y/o simplemente entender el código de I2P y saber como funciona. No se trata de una guía sobre programación en Java, solamente se pretende indicar cuales son los pasos para obtener el código fuente de I2P y trabajar con él
REPOSITORIO MONOTONE DE I2P
Monotone es un sistema de control de versiones como muchos de los que se encuentran actualmente disponibles, tiene características muy similares a las de CSV, pero esta diseñado de un modo un poco más “seguro” dado que implementa certificados RSA en el lado del cliente, alto nivel de personalización de rutinas, cifrado de revisiones, entre otras características interesantes. Para conocer más sobre el uso de este software:
Instalar este software en sistemas basados en Debian es tan simple como ejecutar el siguiente comando
>apt-get install mtn |
El primer paso para obtener el código fuente almacenado en el repositorio de I2P, es generar las claves de transporte y commiter, las cuales será utilizadas por Monotone para “obtener” el código del servidor en la instancia local de I2P y realizar un “commit” del código si es necesario, para ello se ejecutan los siguientes comandos desde consola (cambiar la dirección puesta aquí, de hecho, no es necesario que sea una dirección real, simplemente sirve para identificar cada clave:
>mtn genkey adastra-transport@mail.i2p enter passphrase for key ID [adastra-transport@mail.i2p] (…): confirm passphrase for key ID [adastra-transport@mail.i2p] (…): mtn: generando el par de llaves ‘adastra-transport@mail.i2p’ mtn: guardando el par de llaves ‘adastra-transport@mail.i2p’ en /home/adastra/.monotone/keys/ mtn: guardando la llave pública ‘adastra-transport@mail.i2p’ en mtn: key ‘adastra-transport@mail.i2p’ has hash ‘c08876ca8a4530a2d0c74a50eee8b07df8698ca4’>mtn genkey adastra-commiter@mail.i2p enter passphrase for key ID [adastra-commiter@mail.i2p] (…): confirm passphrase for key ID [adastra-commiter@mail.i2p] (…): mtn: generando el par de llaves ‘adastra-commiter@mail.i2p’ mtn: guardando el par de llaves ‘adastra-commiter@mail.i2p’ en /home/adastra/.monotone/keys/ mtn: guardando la llave pública ‘adastra-commiter@mail.i2p’ en mtn: key ‘adastra-commiter@mail.i2p’ has hash ‘103cdeee8e3567e96e01f0a2e3896475e0df755c’ |
Cuando se generan las claves, estas son automáticamente almacenadas en /home/<usuario>/.monotone
Ahora es el momento de inicializar monotone para crear el repositorio en una ubicación determinada, para ello, Monotone crea una pequeña base de datos SQLite para almacenar de forma comprimida toda la información del proyecto. Para hacer esto, se puede crear un directorio en donde almacenar todo el código del repositorio (es lo recomendable, en este caso, se asume que el directorio será /opt/i2p_repository
>mkdir /opt/i2p_repository >mtn –db=»i2p.mtn» db init |
Ahora que se ha creado el repositorio, es necesario establecer “la prueba de confianza” para poder commitear código, estas son las claves GPG que monotone necesita para realizar “commit” sobre el código que se desea subir, estas claves corresponden a las firmas de los principales desarrolladores de I2P, Estas claves pueden obtenerse desde estos sitios:
http://www.i2p2.de/monotone.html#monotone-keys-for-zzz http://www.i2p2.de/monotone.html#monotone-keys-for-welterde http://www.i2p2.de/monotone.html#monotone-keys-for-complication |
Se debe crear un fichero de texto con una de las anteriores claves y posteriormente ejecutar el siguiente comando utilizando dicho fichero
>cat keys.txt | mtn –db=»i2p.mtn» read mtn: lee 2 paquetes |
Ahora es necesario establecer las políticas de “confianza” sobre el código que otros desarrolladores suben al repositorio, dado que no es confiable el código de cualquiera, es necesario definir que solamente el código firmado por determinados usuarios es de confianza, para ello se deben crear un par de funciones que serán reconocidas por Monotone, dichas funciones se deben almacenar en un fichero llamado monotonerc que se deberá ubicar en /home/<usuario>/.monotone el contenido de este fichero es el siguiente:
function intersection(a,b) local s={} local t={} for k,v in pairs(a) do s[v.name] = 1 end for k,v in pairs(b) do if s[v] ~= nil then table.insert(t,v) end end return t endfunction get_revision_cert_trust(signers, id, name, val) local trusted_signers = { «jrandom@i2p.net», «complication@mail.i2p», «zzz@mail.i2p», «dev@welterde.de» } local t = intersection(signers, trusted_signers) if t == nil then return false end if table.getn(t) >= 1 then return true end return false end |
Estas funciones solamente realizan una verificación simple sobre los firmantes confiables y el firmante que ha subido una revisión de código, en este caso concreto se asume como confiable el código procedente de los firmantes definidos en el array “trusted_signers”
El siguiente paso, es obtener el código del repositorio Monotone (operación pull) para ello, se puede utilizar I2P para realizar un “pull” anónimo desde el repositorio ubicado en el interior de I2P, este repositorio se encuentra en: mtn.i2p2.i2p este repositorio debe encontrarse registrado en el sistema de nombrado de I2P que como se recordará puede ser fácilmente manipulado utilizando SusiDNS, también es necesario crear un nuevo túnel cliente desde I2P, sin embargo estos dos pasos se encuentran ya realizados por defecto en las ultimas versiones de I2P, por lo tanto posiblemente no sea necesario hacerlo manualmente, solamente que si que es necesario asegurarse que desde I2PTunnel se encuentra en ejecución el túnel I2P.
Una vez hecho esto, se puede obtener el código de forma anónima ejecutando el siguiente comando desde el directorio del repositorio:
>mtn -d i2p.mtn pull 127.0.0.1:8998 i2p.i2p |
Después de esto, es necesario esperar hasta que el proceso de descarga termine, sin embargo, esto puede llevar bastante tiempo así como también se pueden dar interrupciones en la descarga, sin embargo, a pesar de esto, se puede retomar justo en el punto en el que iba la ultima vez en la que se ejecutó.
Es recomendable ejecutar el “pull” de Monotone de forma no “anónima” si solamente se desea obtener el código, para ello se ejecuta el mismo comando anteriormente indicado, pero cambiando el servidor por el siguiente
>mtn -d i2p.mtn pull mtn.i2p2.de i2p.i2p |
Una vez terminado el proceso de descarga se realiza un “CheckOut” del proyecto desde el directorio del repositorio de la siguiente forma
>mtn –db=»i2p.mtn» co –branch=»i2p.i2p» |
Una vez hecho esto, ya se cuenta con todos los directorios y ficheros necesarios para compilar y probar I2P desde el código fuente. Por otro lado, también es posible realizar un “update” del repositorio para obtener los cambios realizados en el mismo de la siguiente forma
>mtn update |
Ahora es el momento de utilizar este código para importarlo en Eclipse y comenzar a probar.
IMPORTANDO EL REPOSITORIO I2P EN ECLIPSE
Desde Eclipse es fácil importar y administrar proyectos que se han creado utilizando ANT, sin embargo en primer lugar es necesario ejecutar los “target” de ANT definidos para compilar y empaquetar cada uno de los módulos de la aplicación, para ello es necesario instalar ANT en primer lugar, para hacerlo dirigirse a: https://ant.apache.org/
Una vez que se ha instalado correctamente ANT, es posible compilar cada uno de los módulos y aplicaciones disponibles en I2P, simplemente ejecutando el comando
>ant pkg |
Sobre el directorio raíz donde se encuentran los módulos principales de I2P, que son core/ y router/ este comando se encargará de compilar y generar los ficheros JAR base que son requeridos en para todas las aplicaciones de I2P, las cuales se encuentran ubicadas en el directorio apps/ entre las que se destacan i2ptunnel/, routerconsole/, streaming/ ministreaming/, susidns/ susimail/ entre otras. En cada uno de los subdirectorios (aplicaciones) que se encuentra en el directorio apps/ se puede ejecutar el mismo comando “ant” indicado anteriormente, dado que cada aplicación continúe su correspondiente fichero build.xml para que la aplicación pueda ser utilizada con ANT.
Posteriormente, se debe importar cada una de las aplicaciones que se desea utilizar desde Eclipse, no es necesario compilar e importarlas todas, solamente aquellas en las que se desee actuar, sin embargo las base de I2P (core/ y router/) es recomendable importarlas. Para hacerlo solamente es necesario ir al menú “File → New → Project …” y seleccionar como tipo de proyecto “Java Project from Existing Ant Buildfile” esto importará las librerías y configuración necesaria al área de trabajo tal como se enseña en las siguientes imágenes.
En esta ultima imagen, se ejecuta el target “compile” del proyecto “core/”
Posteriormente, se pueden ver las propiedades del proyecto en el caso de que exista algún problema
En ocasiones la variable de entorno JRE_LIB aparece como depreciada (especialmente en las ultimas versiones de eclipse, Helios y Indigo) si el entorno se encuentra correctamente configurado y la máquina virtual de Java del sistema se encuentra incluida dentro de las librerías del proyecto, se puede proceder a borrar dicha variable sin problemas tal como enseña la siguiente imagen.
Este mismo procedimiento aplica para cada una de las aplicaciones contenidas en el directorio apps/ importando solamente aquellas con las que se desea trabajar.
Finalmente, si se desea comenzar a programar en I2P, se recomienda comenzar por ejecutar y hacer un seguimiento a las clases principales de I2P, (Router y RouterConext) si se desea solucionar errores o cualquier tipo de fallo encontrado, se puede comenzar por ver los Bugs abiertos en cualquier momento desde aquí: http://trac.i2p2.de/report/1 Sin embargo, sin lugar a dudas la mejor forma de obtener información para comenzar con el desarrollo de I2P es utilizando el canal IRC destinado para tal fin (#i2p), desde aquí se puede ver la página de “bienvenida” a nuevos desarrolladores: http://www.i2p2.de/newdevelopers.html
Bien, si estas interesado en participar, no dudes en integrarte, cualquier ayuda es bien recibida, en el caso de que tengas algún problema relacionado con el desarrollo de aplicaciones o solución de bugs en I2P, puedes contactar conmigo.