Aparte de enviar y recibir mensajes de otras personas, una de las cosas más comunes que se quisiera hacer en una aplicación de mensajería es enviar archivos de diferentes tipos. Y, por supuesto, si se está utilizando un cliente de mensajería que permita cifrar toda la comunicación, puede asumirse que debería ser posible enviar archivos y directorios de manera privada y segura. Lamentablemente, los protocolos utilizados en CoyIM (principalmente XMPP) no tienen un buen soporte para enviar contenido encriptado. Y no existe un estándar sobre cómo cifrar archivos y directorios usando OTR. En realidad CoyIM no ofreció soporte a la transferencia de archivos durante mucho tiempo. La razón de esto fue que no queríamos agregar una forma insegura de enviar archivos y directorios, y de esa manera engañar a nuestros usuarios, especialmente cuando existen formas de hacerlo que deberían ser compatibles con XMPP.
Muchos de los clientes que admiten OTR también tenían soporte para la transferencia de archivos. Pero sin previo aviso al usuario, los archivos sería transferidos completamente sin cifrar. Yo mismo, y muchas otras personas conscientes de la seguridad, tuvimos que idear un método en el que primero encriptábamos el archivo con un programa externo, como GPG, y luego enviábamos este archivo encriptado y finalmente enviábamos la clave en la ventana principal de la conversación, asegurándonos de que estuviera encriptada. Pero nosotrxs podíamos usar este método porque sabíamos lo que estábamos haciendo. Lastimosamente este tipo de enfoque simplemente no es posible para la mayoría de las personas, dejando así un peligroso agujero de seguridad en la mayoría de los clientes de escritorio.
En la nueva versión 0.4 de CoyIM que llegará en febrero de 2022, hemos agregado soporte completo para enviar archivos Pero no sólo eso, también permitimos el traspaso de directorios. Puede que no suene muy revolucionario, pero ninguno de los clientes de escritorio existentes te permiten hacer esto. Si estás hablando con una persona que utiliza otro cliente que no admite la transferencia de directorios, CoyIM creará automáticamente un archivo zip con el contenido del directorio y lo enviará. De esta manera, incluso una persona que no tenga un cliente que admita directorios puede recibirlos, eliminando así la molestia de tener que hacer las operaciones manualmente.
CoyIM usa XMPP para el chat y usamos el mismo protocolo para implementar la transferencia de archivos, lo que significa que la aplicación es compatible con otros clientes que admitan la transferencia de archivos. Tenemos un método lento (conocido como IBB) para el que todos los clientes y servidores tienen soporte, pero también admitimos un método significativamente más rápido para la transferencia llamado bytestream proxies. Este método sólo puede ser usado si el servidor lo admite. Todo esto es completamente transparente para el usuario. CoyIM elegirá el método correcto a utilizar. Un detalle adicional, algunos clientes tienen problemas con la implementación de byestream proxies, de modo que podrías terminar revelando tu propia dirección IP al usar esta función. En CoyIM usamos Tor para esta transferencia, evitando también este tipo de riesgo.
Si sabes algo sobre XMPP, es posible que sepas que existen dos formas completamente diferentes de realizar la transferencia de archivos. El antiguo método se llama Stream Initiation (SI) y el nuevo se llama Jingle. En CoyIM decidimos implementar Stream Initiation, y no Jingle. Esto puede sonar como una elección extraña: ¿por qué no usaríamos el nuevo estándar? La respuesta es simple: complejidad. Jingle es un estándar significativamente más complejo, y tendríamos que agregar mucho más código para darle soporte. Pero no habríamos obtenido ninguna funcionalidad adicional en comparación con SI. Entonces, como siempre con CoyIM, cuando podamos eligir reducir la cantidad de complejidad de una característica, lo haremos. Si esta elección hubiera significado que estuvieses restringido en cuanto a los clientes a los que pudieras transferir archivos, es posible que hayamos tomado una decisión diferente, pero la verdad es que todos los clientes XMPP que existen en realidad son compatibles con Stream Initiation, por lo que esta opción no es una limitante.
Entonces, ¿qué pasa con el cifrado? Bueno, aquí es donde las cosas se ponen un poco complejas. Como se mencionó anteriormente, nadie parece haber creado un cliente que admita la transferencia de archivos con cifrado mediante OTR. Pero esto terminó siendo bastante simple. Técnicamente hablando, usamos la función de “clave extra simétrica” de OTR (que se puede encontrar en la sección “Clave extra simétrica” en la descripción del protocolo aquí: https://otr.cypherpunks.ca/Protocol-v3-4.1.1.html), que te permite obtener el material de claves que se deriva del estado actual de la conversación, y que la otra parte en la conversación también puede recuperar. Esta clave se puede usar para cifrar material y luego el otro lado puede descifrarlo usando su copia de la clave simétrica. Para preservar todas las propiedades de seguridad de OTR, encriptamos el archivo usando AES en modo CTR y luego ejecutamos un HMAC-SHA256 sobre el contenido. La clave AES y la clave HMAC se derivan de la clave simétrica. Luego, como paso final, también revelamos la clave MAC, para retener la negación.
Esto puede sonar complicado. Pero la esencia de esto es que puedes enviar y recibir archivos y directorios cómodamente usando CoyIM, y el contenido será privado y estará seguro de la misma manera. De hecho, CoyIM reconoce automáticamente cuándo puede usar encriptación para enviar información. Y si no puede, primero advertirá al usuario y le pedirá confirmación de que desea enviar el material sin cifrar. En general, la experiencia de transferencia de archivos ha sido diseñada para ser tan fácil de entender y usar como sea posible. No deberías tener que trabajar como un profesional de seguridad para transferir archivos con seguridad.
Esta característica es una de las más importantes de la nueva versión 0.4. Es algo de lo que estamos muy orgullosos y te instamos a que lo pruebes. Al mismo tiempo, queremos hacerte una advertencia. No envíes archivos con otros clientes a menos que estés absolutamente segurx de que hacen esto de una manera segura.