diff --git a/README.md b/README.md
index e4639099c2cc45d5f595ce42a757c7c4d4a428e8..1a0253913d9e326c3ed21dc996c751ecd49dec97 100644
--- a/README.md
+++ b/README.md
@@ -26,3 +26,47 @@ se fait à partir des données du script sans passer par le disque (script `JS`)
  * `vp12.php` : valide les informations reçues, puis effectue les conversions vers le format P12 en
  utilisant l'extension `openssl`. Au final propose de télécharger le résultat
 
+# Technique
+
+## Zones de saisie / upload de données
+
+Ce sont des `textarea` sur lesquelles un bouton (en fait un `input` de type `file`) permet de lancer
+une sélection et un chargement de fichier.
+
+Voir dans le `JS` la fonction `getFile()` (associé à l'événement `change` de l'`input` `file`) qui utilise
+la fonction `placeFileContent()` qui utilise `readFileContent()`.
+
+## Zone de récupération / download du résultat
+
+Le résultat (format P12) étant binaire, il n'est pas possible de passer par une `textarea`.
+
+La récupération passe par un lien (`a`, avec le type `application/octet-stream`, et dont l'aspect est « maquillé »
+en bouton via la classe `btn`). Le script `JS` qui suit crée un `Blob` à partir des données du certificat P12,
+et fait pointer le `href` du `a` dessus (URL virtuelle).
+
+La création du `Blob` passe par une conversion de/vers le format base64, car il n'est pas possible de mettre
+une chaîne binaire dans du code `HTML` / `JS`.
+
+## Commandes openssl
+
+La conversion utilise l'extension `openssl`. Les commandes :
+ * `openssl_pkey_get_private($key, $password)` : charge la clé (`$key`, format PEM) protégée par le mot de passe
+ `$password` et retourne une « ressource de clé » (format anonyme interne à `openssl`)
+ * `openssl_pkcs12_export($cert, $cres, $skey, $password2)` : exporte le certificat PEM `$cert` et sa clé associée
+ `$skey` (voir juste au dessus) au format P12 (PKCS12) en le protégeant avec le mot de passe `$password2`. Le
+ résultat (binaire, format P12) est rangé dans `$cres`
+
+## Général
+
+Cet outil utilise l'authentification Apache via le LDAP du LIRIS. La vérification du _login_ n'est pas strictement
+nécessaire. Toutefois ça permet :
+ * de limiter l'accès aux membres du laboratoire (ce n'est pas un outil public actuellement)
+ * de pouvoir proposer un nom de fichier pour la récupération du résultat (`$login.p12`)
+
+# Licence
+
+Copyright Yannick Perret / LIRIS, 2019-2020.
+GPLv3. Ce code est réutilisable, sans garantie quelconque (à vos risques et périls… :)). Si vous réutilisez ce code
+merci de m'en informer (yannick.perret@liris.cnrs.fr).
+
+
diff --git a/vp12.php b/vp12.php
index 5b2fd31e84409100291cfe6fdf061d370a308f71..2861e8fd31c97ab9fa56de259420c659473393fa 100644
--- a/vp12.php
+++ b/vp12.php
@@ -55,12 +55,12 @@ importer votre certificat dans un outil (navigateur…).</p>
 <p>Vous référer à la documentation pour l'import d'un certificat :
 <a href='https://INSEREZ.VOTRE.DOC'>https://INSEREZ.VOTRE.DOC</a></p>
 <a id='a' class='btn' download='$login.p12' type='application/octet-stream'>Télécharger le certificat format P12</a>
-<script>
 _EOT_;
 
 // partie pour encoder le contenu ($cres) en base64 (on ne peut pas mettre du binaire directement
 //  dans le code HTML) puis inversement, et permet le téléchargement
 echo <<<EOF
+<script>
 /**
  * Convert a base64 string to an ArrayBuffer
  */