Skip to main content

El Julia set en un shader

Desde que empezó el tema de los smartphone, siempre sonó interesante la idea de programar desde el propio cacharro. Si bien ya se podía desde (casi?) el principio con SL4A, nunca fué algo demasiado cómodo.

Pues bien, resulta que en F-Droid (market de aplicaciones libres) tienen un entorno que permite programar Shaders en GLSL, programas que permiten generar gráficos desde la GPU, e incluso utilizarlos como fondo de pantalla, Shader Editor.

El programilla es bastante sencillo, y parece un buen método para aprender a hacer shaders, sabiendo por ejemplo C, y a partir de los ejemplos que incluye.

Pues bien, ahí va algo programado cacharreando con esto en el tren, dibuja el conjunto de Julia, moviendose en un par de dimensiones para que quede algo dinámico.

Read more…

Un algoritmo de búsqueda de elementos similares

Es curioso, hay momentos en los que uno tiene que buscar una solución a un problema sencillo, por ejemplo, dadas varias listas de elementos, buscar la más parecida a otra nueva, y encontrar una solución (muy simple!). Pero esta solución no aparece en ningún otro sitio, a alguien se le tuvo que ocurrir! será tan simple (y tan inferior a otras), que no merece la pena documentarla?, simplemente uno no es capaz de encontrarla?... es probable :P...

Después de hacer alguna prueba más... resulta que no escala bien, y con grandes datos pierde ventaja rápidamente xD

Bueno, siendo como fuere, ahí va un algoritmo para buscar la lista (o listas), mas cercana a una dada, sin tener que comparar todos los elementos de todas.

La utilidad es bastante directa, en el campo de la IA (Inteligencia Artificial) hay una serie de algoritmos para hacer clasificación, dado un conjunto de entrenamiento etiquetado (con cada elemento asignado a una categoría) encuentra al conjunto al que pertenece un nuevo elemento.

Read more…

Evolucionando decoders [1]: Brainfuck

Ya va casi un año desde el último post, como pasa el tiempo...

Esta época he estado liado con varios proyectos, he acabado mi Trabajo de Fin de Grado, del que intentaré hablar más adelante, y he participado en algún CTF. Algo que he notado es que en lo que se refiere a pruebas criptográficas suele haber dos tipos, en las que el algoritmo está claro desde el principio y hay que atacarlo. Y en las que se da un texto cifrado y se plantea el reto de obtener el flag que hay en el.

La idea detrás de este segundo tipo de pruebas (supongo) es determinar la capacidad de reconocer similitudes con cifrados ya existentes, de realizar un análisis de los datos (entropía, ...) y extraer conclusiones a partir de ahí. Hay gente que es muy buena haciendo esto...

Yo no.

Otra opción es hacer pruebas hasta que vaya apareciendo algo interesante, pero es un proceso largo y que no necesariamente da frutos, sería interesante poder automatizarlo, verdad?

Read more…

Writeup de inBINcible [NcN CTF Quals]

Lleva un tiempo el blog parado, pero traigo algo interesante, veamos como reversear un binario de los presentados en las quals del CTF de la No Con Name.

Aviso: Soy bastante novato en esto, así que seguro que se podrían obviar muchos pasos o hacer más sencillo con los conocimientos y herramientas adecuadas. Si sabes algo de esto, mejor ve ya a la parte curiosa ;).

El binario en cuestión es “inbincible”, si lo ejecutamos produce el siguiente resultado:

1
2
3
$ ./inbincible
Nope!
$

Obviamente no es el que nos interesa, así que veamos lo que hace, abrimos con gdb y buscamos una función desde la que empezar

Read more…

Extracting .mkv subtitles

Actually this was already posted but it was lost on some migration... so here it is again

All the parsing and extraction is implemented by mkvtoolnix, so first step is installing it...

1
sudo apt-get install mkvtoolnix

After this we can see the tracks in the file

1
mkvinfo video.mkv

Read more…

Making MySQLdumps more friendly

Some time ago I had to work with some MySQL database dumps generated by mysqldump(1), lacking a version control software (which fortunately hasn't been needed) more specific, the one used was git(7). Now, git allows to make diff across versions, but this (at least by default) is made line by line so mysqldumps get a lot of data changes even if only a row is the one changed to solve this issue this program was written sqlsplit.c.

The program isn't too polished, it has a main function that only opens the file and another which (with the help of two macro *_*) simulates something like a state automata (actually with a stack), the compilation is simple

1
gcc sqlsplit.c -o sqlsplit

So, for example, if the imput where

1
2
3
4
5
set autocommit=0;
INSERT INTO `input_table` VALUES (1,'Title 1','File 1','Type','NULL','Date 1'),(2,'Another title','Another file, too','Type, you know','Language','9999'),(3,'A third title','File with \' too.heh','Some, types','NULL','Tomorrow');
/*!40000 ALTER TABLE `input_table` ENABLE KEYS */;
UNLOCK TABLES;
commit;

Doing this...

1
./sqlsplit intput.sql output.sql

We'd get something more legible

1
2
3
4
5
6
7
8
set autocommit=0;
INSERT INTO `input_table` VALUES
    (1,'Title 1','File 1','Type','NULL','Date 1'),
    (2,'Another title','Another file, too','Type, you know','Language','9999'),
    (3,'A third title','File with \' too.heh','Some, types','NULL','Tomorrow');
/*!40000 ALTER TABLE `input_table` ENABLE KEYS */;
UNLOCK TABLES;
commit;

And thats all, of course if we'd want to take or show data on the terminal (for example to take or return compressed files) the files to use would be /dev/stdin for the input and/or /dev/stdout for the output.

Using andEngine from emacs

I was trying to test some game programming in android, a good looking library is AndEngine, the tutorials I found were Eclipse centered, but after trying and ending a couple of times with a segfault, importing a project! it's time to go back to the classics, so let's see how to do it with emacs.

Read more…

Migrando ownCloud de MySQL a SQLite

En su momento realicé una instalación de ownCloud utilizando MySQL como base de datos, más tarde se hizo obvio que esta no era la opción correcta y que la necesidad de ahorrar toda la memoria RAM posible y el hecho de que no hubiera más accesos que los míos apuntaron a que debía haber optado por SQLite, el proceso es algo complicado la primera vez así que aquí queda explicado por si hay que repetirlo...

Lo primero es convertir la propia base de datos a SQlite, idealmente esto supondría sacar un mysqdump, pasárselo a SQLite y el estándar del lenguaje haría el resto...

Pero esto no es tan sencillo, resulta que hay incompatibilidades entre estos dos dialectos y resolverlas a mano requeriría un tiempo del que probablemente no dispongamos, para esto podemos recurrir a sequel, con Ruby y las librerías de desarrollo de los clientes de MySQL y SQLite instaladas podemos conseguirlo haciendo

1
2
3
gem sqlite3
gem mysql
gem sequel

Una vez instalado para convertir la base de datos solo habría que hacer

1
sequel 'mysql://db_username:db_pass@db_host/db_name' -C "sqlite://db.sqlite"

Y tendremos la base de daños migrada a SQLite en db.sqlite, solo falta la configuración.

En el directorio de instalación de ownCloud hay uno llamado config, dentro, el archivo a editar para pasar a la nueva base de datos es config.php, el significado de cada línea se puede ver en config.sample.php, concretamente habría que cambiar las líneas "dbtype" de mysql a sqlite.

Por último queda añadir la nueva base de datos a la carpeta data con el nombre que tomaba la base de datos y la extensión .db y listo, tras asignar los permisos para que ownCloud pueda acceder y modificar el archivo ya podemos usar de nuevo la plataforma.

Writting an Erlang port

This quarter we had an subject with a an assignment to be developed in Erlang, a functional language which oriented to concurrent programming and interprocess communication through message passing. The result is a crawler where each domain has an assigned “thread” which has to make the requests to the web server, plus another one to download the images and index them using pHash, the program is composed of more parts but now we'll center in this.

(By the way, the project has been developed on the open, the code is available at it's GitHub repository, EPC).

At the beggining each thread simply made a call httpc:request, which is the way that the standard library offers to make this requests, but it seems that the concurrency is not very well handled, this produced starvation on the indexation process.

Further down on the specification a possible solution is shown:

Option (option()) details:
sync
     Shall the request be synchronous or asynchronous.
     Defaults to true.

Anyway, at that moment that solution wasn't checked, instead another two where implemented, one was a dedicated process which will make sure that the indexer downloads had priority and it won't suffer starvation, this won't happen to the crawlers because it'd take some time to the indexer to obtain the features of the downloaded image (not much, but some time), this was implemented in pure Erlang and it was the one merged in the master branch.

Another option was to implement the download as a port, an external program written in C and that will be called from an Erlang process, this possibility was kept in the GET-by-port branch.

C - Erlang Communication

The port is composed of two components, the C part an the Erlang part, the communication can be made in multiple ways, and is defined along with PortSettings on open_port, the possibilities are

  • {packet, N}

    Messages are preceded by their length, sent in N bytes, with the most significant byte first. Valid values for N are 1, 2, or 4.

  • stream

    Output messages are sent without packet lengths. A user-defined protocol must be used between the Erlang process and the external object.

  • {line, L}

    Messages are delivered on a per line basis. Each line (delimited by the OS-dependent newline sequence) is delivered in one single message. The message data format is {Flag, Line}, where Flag is either eol or noeol and Line is the actual data delivered (without the newline sequence).

    L specifies the maximum line length in bytes. Lines longer than this will be delivered in more than one message, with the Flag set to noeol for all but the last message. If end of file is encountered anywhere else than immediately following a newline sequence, the last line will also be delivered with the Flag set to noeol. In all other cases, lines are delivered with Flag set to eol.

    The {packet, N} and {line, L} settings are mutually exclusive.

In this case we'll use {packet, 4}, enough to send whole web pages.

Communication - The C side

Lo let's focus in what happens in the program written in C when it receives the data, the function which manages this is char* read_url()

The process is simple, read 4 bytes from stdin and save it as a uint32_t

1
2
3
4
uint32_t length;
if (fread(&length, 4, 1, stdin) != 1){
    return NULL;
}

The it converts the data from big-endian to the host endianness, this is done through the function ntohl()

1
length = ntohl(length);

The rest is simply read a string from stdin, without any transformation and knowing it's length

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
char *url = malloc(sizeof(char) * (length + 1));
if (url == NULL){
    return NULL;
}

unsigned int already_read = 0;
while (already_read < length){
    already_read += fread(&url[already_read], sizeof(uint8_t),
                          length - already_read, stdin);
}
url[length] = '\0';

Returning the data to Erlang doesn't need much more effort, as it can be read in the void show_result(headers, body) procedure. The data is sent in two groups, first the headers and then the result body, sending the headers means converting it's size to big-endian using htonl and writting it to stdout, to then write the whole string directly

1
2
3
4
5
6
7
8
9
/* Strange things can happen if we forget this */
uint32_t headers_size = htonl(headers.size);
fwrite(&headers_size, 4, 1, stdout);

unsigned int written_head = 0;
while (written_head < headers.size){
    written_head += fwrite(&(headers.memory[written_head]), sizeof(uint8_t),
                           headers.size - written_head, stdout);
}

... and repeat this for the response body

1
2
3
4
5
6
7
8
uint32_t body_size = htonl(body.size);
fwrite(&body_size, 4, 1, stdout);

unsigned int written_body = 0;
while (written_body < body.size){
    written_body += fwrite(&(body.memory[written_body]), sizeof(uint8_t),
                           body.size - written_body, stdout);
}

This is all it takes to complete the interface with Erlang, the rest is common C logic, in this case would be to make HTTP requests, something easy using cURL, and each time we may want to receive a URL from Erlang we'll only need to call read_url(), and of course the compilation is made the usual way.

Communication - The Erlang side

The logic managed for the Erlang side isn't complex either, it's only to call open_port, which returns the PID where to send the data, assuming that we have defined HTTP_GET_BINARY_PATH with the path of the compiled binary that completes the port

1
Port = open_port({spawn, ?HTTP_GET_BINARY_PATH}, [{packet, 4}])

When sending the data to the binary is needed, it should be sent through this PID, sending a tuple like

1
{Actual_process_PID, {command, Message}}

For example

1
Port ! {self(), {command, Msg}},

This is converted to the data which the binary receives, in the same way when it sends data back it'll be received as a message like

1
{Port_PID, {data, Received_message}}

Since we're receiving two, the headers and the message body...

1
2
3
4
5
6
7
8
9
receive
    {Port, {data, Headers}} ->
        receive
            {Port, {data, Body}} ->
                From ! {self(), {http_get, {ok, {200,
                                                 process_headers(Headers),
                                                 Body}}}}
        end
end,

The result is sent as a message, this is because it's made to run inside a loop and keep the port active in an isolated process until the process which created it terminates, but it's not a need to use it this way, there's no reason it couldn't return the result directly as a “normal” function, though ¿maybe? it can have problems coordinating the access to the input/output if multiple process are using it.

... and that's all, we have a piece of C code running from Erlang, of course since the interface is stdin/stdout any language can be used, it's a very flexible design :)

Entrevista de Edward Snowden para Der Spiegel

Leyendo darkernet.in me enteré de que Edward Snowden había hecho una entrevista anónima para Der Spiegel antes de que se destapara todo lo de PRISM, he aquí la traducción en castellano de la versión en inglés (exceptuando el de la nota al pie nº8, los enlaces no estaban incluídos en la versión original):

Poco antes de convertirse en un nombre familiar alrededor del mundo como informante, Edward Snowden respondió una exhaustiva lista de preguntas. Estas salieron de Jacob Appelbaum, de 30 años, un desarrollador de cifrados y software de seguridad. Appelbaum provee de entrenamiento sobre como usar Internet de forma anónima a grupos internacionales por los derechos humanos y periodistas.

Appelbaum se hizo ampliamente conocido por primera vez después de hablar en nombre del fundador de WikiLeaks Julian Assange en una conferencia de hackers en Nueva York en 2010. Junto con Assange y otros co-autores, Appelbaum liberó recientemente una recopilación de entrevistas en forma de libro bajo el título "Cypherpunks: Freedom and the Future of the Internet".

Appelbaum terminó en el radar de las autoridades americanas durante el transcurso de su inverstigación sobre las revelaciónes de WikiLeaks. Desde entoces estas han presentado órdenes legales a Twitter, Google y Sonic para entregar información sobre sus cuentas. Pero Appelbaum describe su relación con WikiLeaks como "ambigua", y explica aquí como fué capaz de plantear preguntas a Snowden.

"A mediados de mayo, la realizadora de documentales Laura Poitras contactó conmigo", dijo Appelbaum. "Ella me dijo que estaba en contacto con una posible fuente de la Agencia de Seguridad Nacional (NSA) que había aceptado entrevistarse con ella".

"Ella estaba en proceso de reunir preguntas y pensó que hacer algunas preguntas específicamente técnicas era una parte importante del proceso de verificación de la fuente. Uno de los objetivos era determinar si estábamos o no realmente tratando con un informante de la NSA. Estaba profundamente preocupado por una trampa del estilo de COINTELPRO. Enviamos las preguntas cifradas de forma segura a nuestra fuente. No tenía conocimente de la identidad de Edward Snowden antes de que fuera revelada al mundo en Hong Kong. El tampoco sabía quien era yo. Esperaba que cuando el anonimato fuera eliminado, encontraramos a una persona de unos sesenta años."

"Las siguientes preguntas son un extracto de una entrevista mayor que cubrió numerosos temas, varios de ellos de una naturaleza altamente técnica. Algunas de las preguntas han sido reordenadas para proveer el contexto necesario. Las preguntas se centran casi exclusivamente en las capacidades y actividades de la NSA. Es crítico entender que estas preguntas no fueron hechas en un contexto reactivo a los eventos de la última semana o incluso el último mes. Fueron hechas en un periodo relativamente calmado, cuando Snowden probablemente estaba disfrutando de sus últimos momentos en el paraiso Hawaiano -- un paraíso que abandonó para que todas las personas en el planeta pudieran entender la situación actual como el lo hace.

"En un punto posterior, también tuve contacto directo con Edward Snowden en el que revelé my propia identidad. En ese momento, el expresó su deseo de que sus sentimiento y observaciones sobre ese tema fueran publicadas cuando pensara que el momento era el adecuado."

Nota del editor: Los extractos siguientes han sido temados de la versión original en inglés de la entrevista. Las potenciales diferencias entre las versiones alemanas e inglesas pueden ser explicadas por el hecho de que hemos preservado la mayoría de los términos técnicos utilizados por Snowden en la transcipción. Las explicaciones sobre la terminología usada por Snowden, así como las notas del editor están provistas en forma de notas al pie.

Entrevistador: ¿Cual es la misión de la Agencia de Seguridad Nacional (NSA) -- y como es el trabajo que hace compatible con la aplicación de la ley?

Snowden: Ellos tienen la tarea de saber todo lo que tenga importancia que ocurra fuera de los Estados Unidos. Ese es un reto significativo. Cuando se le hace aparentar que no sabe todo sobre todo el mundo se hace una crisis existencial, entonces piensas que está bien doblar las reglas. Una vez que la gente de ódia por doblar las reglas, romperlas se convierte en una cuestión de supervivencia.

Entrevistador: ¿Están las autoridades alemanas o sus políticos involucrados con el sistema de vigilancia de la NSA?

Snowden: Sí, claro. Nosotros 1 dormimos en la misma cama que los alemanos, de la misma forma que la mayoría de los países occidentales. Por ejemplo, nosotros 2 les avisamos cuando alguien que queremos vuela a través de uno de sus aeropuertos (que por ejemplo, hemos descubierto a través del teléfono de la novia de un hacker sospechoso en un tercer país sin ninguna relación) -- y ellos nos lo mandan. Ellos 3 no piden explicaciones sobre como sabemos algo, y viceversa, para aislar sus líderes políticos del golpe de saber de lo seriamente que se viola la privacidad global.

Entrevistador: ¿Pero si los detalles de este sistema son expuestos ahora, a quién se culpará?

Snowden: ¿Frente a una corte de los EEUU? No estoy seguro de que hables en serio. Una investigación encontró la gente concreate que autorizó la escucha de millones y millones de comunicaciones, lo que debería resultar en la mayor de las sentencias en la historia del mundo, y uno de nuestros altos oficiales simplemente pidió que la investigación se detuviera. Quién "puede" ser culpado es inmaterial cuando la aplicación de la ley no se respeta. Las leyes son para vosostros, no para ellos.

Entrevistador: ¿Hace equipo la NSA con otras naciones, como Israel?

Snowden: Sí. Continuamente. La NSA tiene un enorme cuerpo responsable de esto: FAD, la junta directiva de asuntos extranjeros (Foreign Affairs Directorate).

Entrevistador: ¿Ayudó la NSA a crear Stuxnet? (Stuxnet es el gusando informático desplegado contra el programa nuclear iraní.)

Snowden: La NSA e Israel lo co-escribieron.

Entrevistador: ¿Cuáles son algunos de los grandes programas de vigilancia activos hoy en día y como ayudan los socios internacionales a la NSA?

Snowden: En algunos casos, los llamados "Socios de Cinco Ojos"4 (Five eye partners) van más allá de lo que hace la propia NSA. Por ejemplo, el Cuarter General de Comunicaciones de Reino Unido tiene un sistema llamado TEMPORA. TEMPORA es el primer buffer "full-take"" de Intenet de la comunidad de inteligencia de señales que no se preocupa del tipo de los contenidos y solo presta una atención marginal al Humans Right Act. Husmea en todo, en un buffer giratorio para permitir una investigación retroactiva sin perder un solo bit. Ahora mismo el buffer puede mantener tres días de tráfico, pero esto está siendo mejorado. Tres días puede no parecer mucho, pero recuerda que no son metadatos. "Full-take" significa que no se deja nada, e ingiere la totalidad de la capacidad de cada circuito. Si envías in solo paquete ICMP 5 y este hace su ruta a través del Reino Unido, lo tenemos. Si Descargas algo y resulta que el CDN (red de distribución de contenidos) sirve los contenidos desde el Reino Unido, lo tenemos. Si los registros médicos de tu hija enferma son procesados en un centro de llamadas en Londres … bien, ya entiendes la idea.

Entrevistador: ¿Hay alguna forma de esquivarlo?

Snowden: Como regla general, mientras tengas alguna opción, tu tráfico nunca debe pasar o comunicarse con el Reino Unido bajo ninguna circunstancia. Sus fibras son radioactivas, e incluso las "auto-fotos" (¿selfies?) de la reina al chico de la piscina son registradas.

Entrevistador: ¿Hacen la NSA y sus socios una red de recolección de datos para llamadas de teléfono, texto y datos?

Snowden: Sí, pero cuanto consiguen depende de las capacidades de los sitios de recolección individuales -- por ejemplo, algunos circuítos tienen tubos anchos pero pequeños sistemas de recolección, así que tienen que ser selectivos. Este es más un problema en la recolección de datos del otro lado del mar que domésticos 6, lo que hace la recolección de datos domésticos tan terrorífica. La NSA no está limitada por problemas de electricidad, espacio y refrigaración PSC.

Entrevistador: La NSA está construyendo un nuevo centro de datos gigantesco en Utah. ¿Cual es su propósito?

Snowden: Los repositorios masivos de datos.

Entrevistador: ¿Por cuanto tiempo se almacenan los datos recojidos?

Snowden: Ahora mismo, la recolección de datos completos envejece rápidamente (unos pocos días) debido a su tamaño a menos que un analista 7 haya encargado un objetivo o comunicación, en ese momento la comunicación encargada es almacenada "por siempre jamás", sin tener en cuenta la política, por que siempre puedes conseguir una renuncia. Los metadatos 8 también envejecen, aunque más lentamente. La NSA quiere llegar a un punto donde al menos todos los metadatos son almacenados permanentemente. En la mayoría de los casos, el contenido no vale tanto como los metadatos por que siempre puedes recuperar el contenido basandote en sus metadatos o, sino, simplemente encargar la recojida permanente de todas las comunicaciones de interes futuras dado que los metadatos te dicen lo que necesitas de sus propios datos.

Entrevistador: ¿Ayudan empresas privadas a la NSA?

Snowden: Sí. La prueba definitiva de esto es lo más dificil por que la NSA considera la identidad de los colaboradores de telecomunicaciones como joyas en su corona de omnisciencia. Como regla general, las multinacionales basadas en el Reino Unido no son fiables hasta que hayan probado lo contrario. Esto es triste, por que tendrían la capacidad de proveer los mejores y más fiables servicios en el mundo si de verdad quisieran hacerlo. Para facilitar esto, las organicaciones por los derechos civiles deberían usar esta publicación para animarlos a actualizar sus contratos para incluir cláusulas que se puedan hacer cumplir indicando que no son espiadas, y que daben implementar cambios técnicos. Si ellos consiguien que al menos una que una compañía entre en su juego, puede cambiar la seguridad de las comunicaciones globales para siempre. Si no, considera comenzar esa compañía.

Entrevistador: ¿Hay compañías que rechazan cooperar con la NSA?

Snowden: También si, pero no soy consciente de ninguna lista. Esta categoría será mucho mayor si los colaboradores son castigados por los consumidores en el mercado, lo que debería ser considerada la mayor priodidad para alguien que cree en la libertad del pensamiento.

Entrevistador: ¿Que páginas web debería evitar una persona si no quiere ser un objetivo de la NSA?

Snowden: Normalmente serías elegido como objetivo basándose en, por ejemplo, el contenido de tu Facebook o tu webmail. Lo único que sé personalmente que te puede dar sin estar en el objetivo son foros jihadistas.

Entrevistador: ¿Que pasa cuando un usuario se convierte en el objetivo de la NSA?

Snowden: Que son owneados. Un analista tendrá un informe diario (o programado basandose en un resumen de filtraciones anteriores) sobre que cambió en el sistema, PCAPs9 de restos de datos que no fueron comprendidos por analizadores automáticos, y demás. Depende del analista hacer lo que quieran en ese momento -- la máquina del objetivo no le pertenece ya, pertenece al gobierno de los Estados Unidos.

Notas al pie:

[1] "Nosotros" se refiera a la NSA.

[2] "Nosotros" se refiere a la maquinaria del servicio de inteligencia delos EEUU.

[3] "Ellos" se refiere a otras autoridades.

[4] Los "Socios de Cinco Ojos" (Five Eye Partners) es una referencia a los servicios de inteligencia de los Estados Unidos, Gran Bretaña, Australia, Nueva Zelanda y Canada.

[5] "ICMP" se refiere a Protocolo de Mensajes de Control de Internet (Internet Control Message Protocol). La respuesta privosta aquí por Snowden era áltamente técnica, pero claramente se refería a todos los paquetes de datos enviados a o desde Gran Bretaña.

[6] "Doméstico" se refiere a los Estados Unidos.

[7] En este contexto, "encargado" se refiere a la completa recolección y almacenamiento de metadatos y contenido para cualquier de los identificadores coincidentes por la NSA o sus socios.

[8] "Metadatos" puede incluir números de teléfono, direcciones IP y tiempos de conexión entre otras cosas. La revista Wired ofrece una sólida introducción a los metadatos.

[9] "PCAPS" es una abreviación del término "packet capture".

Entrevista conducida por Jacob Appelbaum y Laura Poitras

PS: también hay una copia de los artículos en cryptome.org