Add some tests.
[crypto_lab2.git] / labo2-fsharp / CryptoFileTests / Tests.fs
diff --git a/labo2-fsharp/CryptoFileTests/Tests.fs b/labo2-fsharp/CryptoFileTests/Tests.fs
new file mode 100644 (file)
index 0000000..dd1b3e0
--- /dev/null
@@ -0,0 +1,75 @@
+module CryptoFileTests.Tests
+
+open System.IO
+open CryptoFile
+
+let doSomeTests () =
+    printfn "===== Unit tests"
+    CryptoFile.UnitTests.runAllUnitTests ()
+    printfn "===== Unit tests OK"
+
+    printfn "===== API tests"
+    let plainFilename = "test.txt"
+    let cipherFilename = "test.cipher"
+    let fileContent = "Screw the NSA"
+
+    File.WriteAllText (plainFilename, fileContent)
+
+    let keyCryptPub, keyCryptPriv = API.generatKeysPair
+    let keySigPub, keySigPriv = API.generatKeysPair
+
+    let encrypt () = 
+        API.encryptFile plainFilename cipherFilename keySigPriv keyCryptPub
+
+    let decrypt () = 
+        API.decryptFile cipherFilename "." keySigPub keyCryptPriv
+
+    let writeByteToCipherFileAt byte position = 
+        using (new FileStream (cipherFilename, FileMode.Open, FileAccess.Write))
+              (fun fs -> fs.Position <- position
+                         fs.Write ([| byte |], 0, 1))
+
+    encrypt ()
+    File.Delete plainFilename
+    decrypt ()
+    assert (File.ReadAllText plainFilename = fileContent)
+
+    printfn "== Altering the MAC..."
+    writeByteToCipherFileAt 0uy 0L
+    try
+        decrypt ()
+        assert false
+    with 
+        | error -> assert (error :? IntegrityError)
+
+    printfn "== Altering the signature..."
+    encrypt ()
+    writeByteToCipherFileAt 0uy 32L
+    try
+        decrypt ()
+        assert false
+    with
+        | error -> assert (error :? SignatureMismatch)
+
+    printfn "== Altering the keys..."
+    encrypt ()
+    writeByteToCipherFileAt 0uy (32L + 256L)
+    try
+        decrypt ()
+        assert false
+    with
+        | error -> assert (error :? UnableToDecryptAESKeys)
+
+    printfn "== Altering the cyphering..."
+    encrypt ()
+    writeByteToCipherFileAt 0uy (32L + 256L + 256L)
+    try
+        decrypt ()
+        assert false
+    with 
+        | error -> assert (error :? IntegrityError)
+
+    File.Delete cipherFilename
+    File.Delete plainFilename
+
+    printfn "===== API tests OK"