Clean up.
authorUmmon <greg.burri@gmail.com>
Sun, 30 Nov 2014 23:12:50 +0000 (00:12 +0100)
committerUmmon <greg.burri@gmail.com>
Sun, 30 Nov 2014 23:12:50 +0000 (00:12 +0100)
labo2-fsharp/CryptoFile/Crypto.fs
rapport/main.tex

index c81475b..8ea0629 100644 (file)
@@ -11,6 +11,9 @@ module internal Crypto =
     let rsaKeySize = 2048
     let aesKeySize = 128
 
+    exception KeySizeError
+    exception IVSizeError
+
     /// Returns a cryptographically strong sequence of bytes.
     let rand size : byte[] =
         let result = Array.zeroCreate size
@@ -47,27 +50,27 @@ module internal Crypto =
 
     /// Returns an encrypted output stream.
     let encryptAES (key: byte[]) (iv: byte[]) (outputStream: Stream) : CryptoStream =
-        assert (key.Length = aesKeySize / 8 && iv.Length = 16)
-        use aes = new AesCryptoServiceProvider () // Default mode is CBC.
-        aes.KeySize <- aesKeySize
+        if key.Length <> aesKeySize / 8 then raise KeySizeError
+        if iv.Length <> 16 then raise IVSizeError
+        use aes = new AesCryptoServiceProvider (KeySize = aesKeySize) // Default mode is CBC.
         let encryptor = aes.CreateEncryptor (key, iv)
         new CryptoStream (outputStream, encryptor, CryptoStreamMode.Write)
 
     /// Returns a decrypted input stream.
     let decryptAES (key: byte[]) (iv: byte[]) (inputStream: Stream) : CryptoStream =
-        assert (key.Length = aesKeySize / 8 && iv.Length = 16)
-        use aes = new AesCryptoServiceProvider ()
-        aes.KeySize <- aesKeySize
+        if key.Length <> aesKeySize / 8 then raise KeySizeError
+        if iv.Length <> 16 then raise IVSizeError
+        use aes = new AesCryptoServiceProvider (KeySize = aesKeySize)
         let decryptor = aes.CreateDecryptor (key, iv)
         new CryptoStream (inputStream, decryptor, CryptoStreamMode.Read)
 
     // Create a stream to compute the HMAC-SHA256 against all data being written.
     let HMACStream (key: byte[]) (outputStream: Stream) : Stream * HMACSHA256 = 
-        assert (key.Length = 32)
+        if key.Length <> 32 then raise KeySizeError
         let hmac = new HMACSHA256 (key)
         new CryptoStream (outputStream, hmac, CryptoStreamMode.Write) :> Stream, hmac
 
     let ComputeHMAC (key: byte[]) (inputStream: Stream) : byte[] =
-        assert (key.Length = 32)
+        if key.Length <> 32 then raise KeySizeError
         let hmac = new HMACSHA256 (key)
         hmac.ComputeHash inputStream
\ No newline at end of file
index 36571ff..9f803c3 100644 (file)
@@ -116,7 +116,7 @@ Ces clefs sont générées aléatoirement à chaque création d'un container.
 
 D'après \cite{wiki-key-size}, la société \emph{RSA Security}\footnote{\rsasecurity} annonce qu'une taille de clefs \emph{RSA} de 2048 bits est suffisante jusqu'en 2030. Cela dépend également du niveau d'importance des documents que l'on souhaite chiffrer dans la mesure ou une attaque demande énormément de moyens.
 
-Toujours d'après \cite{wiki-key-size}, une taille de clef \emph{AES} de 128 bits reste actuellement hors de portée d'une attaque.
+Toujours d'après \cite{wiki-key-size}, une taille de clef \emph{AES} de 128 bits reste, actuellement, hors de portée de toutes attaques.
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -136,7 +136,7 @@ string = size[vint], content-utf8 ;
 
 \texttt{nb-meta-data} est le nombre de paires clef-valeur des méta-données.
 
-\texttt{keys} correspond aux clefs $k_c$ et $k_a$ ainsi qu'à l'\emph{IV}, le tout chiffré avec \emph{RSA-2048}. La taille des données chiffrées est égale à $k_c + k_a + iv = 128 + 256 + 128 = 640\,bits$.
+\texttt{keys} correspond aux clefs $k_c$ et $k_a$ ainsi qu'à l'\emph{IV}, le tout chiffré avec \emph{RSA-2048}. La taille des données chiffrées est égale à $k_c + k_a + iv = 128 + 256 + 128 = 512\,bits$.
 
 Les méta-données (\texttt{meta-data}) peuvent contenir, par exemple, le nom du fichier, sa date de création, ses droits, ou toutes autres données associées.
 
@@ -266,15 +266,15 @@ module API =
 
 Quelques mesures sur un fichier de 871 MiB ont été effectuées sous \emph{Linux} avec \emph{Mono} 3.10.0 ainsi que sous \emph{Windows 8} avec \emph{Visual Studio 2012}. Il est a noter que l'implémentation \emph{AES} de \emph{Mono} est en \emph{C\#} et n'utilise évidemment pas l’accélération matérielle d'\emph{Intel} présente sur la machine : \emph{AES-NI}.
 
-Les tests sous \emph{Windows 8} ont été fait sur une machine ne possédant pas \emph{AES-NI}. Cette fonctionnalité est normalement utilisée par la version de \emph{Microsoft} du \emph{runtime} \emph{.NET}.
+Les tests sous \emph{Windows 8} ont été fait sur une machine ne possédant pas \emph{AES-NI}. Cette fonctionnalité est normalement utilisée par l’implémentation du \emph{runtime} \emph{.NET} de \emph{Microsoft} .
 
 \begin{tabular}{ l | r | r | r | r }
   & \multicolumn{2}{c|}{Chiffrement} & \multicolumn{2}{|c}{Déchiffrement} \\
   \cline{2-5}
   & \multicolumn{1}{c}{\emph{Mono}} & \multicolumn{1}{|c|}{\emph{MS .NET}} & \multicolumn{1}{|c|}{\emph{Mono}} & \multicolumn{1}{c}{\emph{MS .NET}} \\
   \cline{2-5}
-  Temps & 39 s & 21 s & 55 s & 22 s \\
-  Mémoire utilisée & 7.0 MiB & 14 MiB & 14.3 MiB & 13.9 MiB \\
+  Temps & 39 s & 20 s & 48 s & 20 s \\
+  Mémoire utilisée & 7.0 MiB & 14 MiB & 15.2 MiB & 13.9 MiB \\
   Taux \emph{CPU} & 1 x 100 \% & 1 x 100 \% & 1 x 100 \% & 1 x 100 \% \\
 \end{tabular}