# GNUnet

GNUnet è un framework libero per le reti peer-to-peer. È stato progettato per offrire un protocollo peer-to-peer anonimo sicuro e la politica di sicurezza del suo protocollo prevede un livello di sicurezza denominato "paranoico".
Il software è scritto interamente in C, ma sono in corso tentativi di clonarne una versione in Java per incrementarne la portabilità. Il framework GNUnet, nella versione scritta in C funziona su GNU/Linux, BSD, macOS, Solaris e Microsoft Windows. La versione Java è invece per definizione compatibile con qualsiasi sistema operativo, purché dotato di Macchina virtuale Java.
GNUnet è parte ufficiale del Progetto GNU.

## Storia

Il progetto nasce nel 2001, col principale obiettivo di creare una rete di file-sharing completamente anonima, resistente alla censura e che consentisse agli utenti di pubblicare e recuperare informazioni di ogni tipo. Si è trattato sin dall'inizio di un progetto molto complesso e ambizioso poiché intendeva riscrivere interamente tutti i passaggi client-server su cui si basa quello che comunemente viene chiamato Internet. Ciò ha portato alla necessità di scrivere una notevole mole di codice.
Lo sviluppo avviene perlopiù in ambito universitario e accademico, il che se da una parte non ne rende l'evoluzione particolarmente rapida, dall'altra la rende estremamente rigorosa negli obiettivi, nella filosofia e nella documentazione.
Gli sviluppatori hanno sempre avuto particolarmente a cuore l'aspetto didattico e divulgativo, tanto che per ogni manciata di codice aggiunta ne viene subito divulgata la documentazione, in pieno spirito GNU. La sezione Developer Handbook del sito del progetto è tra i più approfonditi manuali di programmazione riguardanti un singolo progetto fortemente in fase di sviluppo che siano mai stati scritti. Ciò indubbiamente si deve anche al fatto che tra le speranze dei programmatori c'è quella di rendere virale non solo l'utilizzo di GNUnet, ma anche il suo stesso sviluppo, concepito a tale scopo in forma modulare sin dal principio. Chiunque sposi la filosofia del progetto e mastichi un po' di linguaggio C è infatti fortemente incoraggiato ad estenderne il più possibile le funzionalità creando nuovi moduli o lavorando su quelli già esistenti.

## Anonimato

La rete è rigorosamente decentralizzata (non esistono server privilegiati in senso assoluto). Ogni scambio di informazione è criptato "al volo" con alto livello di sicurezza e l'utente non ha modo di conoscere l'IP del nodo con cui sta condividendo informazioni, perché il tutto viene moderato da un nodo intermedio. Il nodo intermedio a sua volta può conoscere gli IP dei due nodi che si stanno scambiando informazioni (e questi il suo), ma non può scoprire cosa si stiano effettivamente scambiando, perché solo essi conoscono le chiavi per decriptarne il contenuto. Insomma in una rete GNUnet è possibile conoscere solamente o l'IP di un nodo o i dati che questo condivide.

## File sharing

Il servizio di file-sharing utilizza il protocollo anonimo GNUnet per smistare le richieste e le risposte. Per la ricerca di contenuti e di blocchi di dati sono utilizzati messaggi di richiesta ridondanti: a seconda della lettura da parte del nodo successivo i messaggi vengono infatti ulteriormente inoltrati a zero o a più nodi.
Quando un nodo è sotto stress abbassa le richieste da parte dei nodi vicini col più basso valore interno fiducia.
GNUnet offre inoltre un'opzione "topologia F2F" per restringere le connessioni solo agli utenti di fiducia. Con questa opzione gli amici degli utenti amici (e così via) possono a loro volta interagire e scambiare file direttamente con l'utente, ma mai utilizzando il suo indirizzo IP.

## URI

GNUnet utilizza un Uniform Resource Identifier attualmente non approvato dallo IANA, la cui forma è cambiata diverse volte durante la storia del progetto. La notazione a cui si fa riferimento qui è quella adottata ufficialmente a partire dalla versione 0.7.0.
Gli URI del protocollo GNUnet consistono principalmente in due sezioni: il modulo e l'identificatore del modulo (id). Un tipico URI GNUnet presenta la seguente struttura gnunet://modulo/identificatore, dove modulo è il nome del modulo e identificatore è la stringa specifica del modulo.

### Il modulo ECRS

I file condivisi tramite il protocollo GNUnet sono codificati in ECRS (An Encoding for Censorship-Resistant Sharing). L'identificatore del modulo ecrs consiste in una delle seguenti istruzioni: chk, sks, ksk o loc seguita da uno slash e da un valore specifico per ciascuna categoria.
* chk identifica file, tipicamente: gnunet://ecrs/chk/[file hash, utilizzando 0-9A-V].[query hash, utilizzando 0-9A-V].[dimensione in byte]
* sks identifica file all'interno dei namespaces, tipicamente: gnunet://ecrs/sks/NAMESPACE/IDENTIFICATORE
* ksk identifica richieste di ricerca, tipicamente: gnunet://ecrs/ksk/KEYWORD[+KEYWORD]*
* loc identifica un dato su una specifica macchina, tipicamente: gnunet://ecrs/loc/PEER/RICHIESTA.TIPO.KEYWORD.DIMENSIONE

#### Esempi

Un tipico URI di file-sharing per GNUnet che punta a una specifica copia del testo della licenza GPL:
Un'altra tipologia di URI di file-sharing per GNUnet che punta più genericamente a tutti i risultati della ricerca della parola chiave "gpl":

### GNU Name System

GNUnet include un'implementazione di GNS (GNU Name System), un sostituto decentrato e resistente alla censura dell'attuale DNS. In GNS, ogni utente gestisce autonomamente e arbitrariamente la propria zona principale che verrà poi mappata nello spazio comune dei nomi DNS residenti sotto il dominio di primo livello .gnu. Gli utenti possono anche delegare sottodomini a zone gestite da altri utenti. La ricerca dei sottodomini gestiti da altri utenti viene eseguita utilizzando il modulo DHT di GNUnet.
Il problema principale di questo approccio è che non è possibile garantire l'univocità dei nomi a livello globale, il che richiede l'uso di proxy o altre soluzioni affini per soddisfare le molte esigenze delle vecchie applicazioni create per funzionare sotto DNS e non sotto GNS.
Per quanto riguarda gli altri domini di primo livello già esistenti (.com, .org, .it, etc.) GNS garantisce le stesse identiche funzionalità dell'attuale DNS.

## Social API

Nei primi giorni di settembre del 2013 Gabor X Toth pubblicò una tesi con la quale presentava il progetto di un servizio di messaggistica sociale per il framework peer-to-peer GNUnet in grado di offrire scalabilità, estensibilità e comunicazione cifrata end-to-end. La scalabilità sarebbe stata ottenuta per mezzo della consegna multicast dei messaggi, mentre l'uso di PSYC (Protocol for SYnchronous Communication), che fornisce una chiamata di procedura remota dalla sintassi estensibile e che può evolvere nel tempo senza la necessità di dover aggiornare il software su tutti i nodi nella rete, avrebbe garantito forte estensibilità. Un'altra caratteristica chiave fornita dall'integrazione col framework PSYC sarebbero stati i canali multicast con le informazioni sullo stato, utilizzati per memorizzare, ad esempio, i profili utente. La comunicazione criptata end-to-end sarebbe stata garantita dal servizio mesh di GNUnet stesso, sul quale si sarebbero basati i canali multicast. Gli utenti e i luoghi sociali nel sistema avrebbero avuto identità criptata – identificati cioè dalla loro chiave pubblica – quindi il tutto sarebbe stato mappato in nomi umanamente memorizzabili per mezzo di GNS (GNU Name System), dove ogni pseudonimo possiede una zona che punta ai propri luoghi. Questo modulo trasformerebbe il framework GNUnet in una piattaforma di social networking decentralizzata, completa e fortemente anonima.

## Chat

Le ultime versioni del framework implementano anche un modulo sperimentale per la chat. Parallelamente, i programmatori di PSYC (il framework su cui si basa anche il modulo di notifica multiprotocollo di Wikipedia) hanno annunciato di voler fondere il loro framework all'interno della rete GNUNet, offrendo così al protocollo GNUnet uno dei sistemi di messaggistica più complessi e strutturati in circolazione.