Improve the report.
[crypto_lab2.git] / labo2-fsharp / CryptoFileTests / Tests.fs
1 module CryptoFileTests.Tests
2
3 open System.IO
4 open CryptoFile
5
6 let doSomeTests () =
7 printfn "===== Unit tests"
8 CryptoFile.UnitTests.runAllUnitTests ()
9 printfn "===== Unit tests OK"
10
11 printfn "===== API tests"
12 let plainFilename = "test.txt"
13 let cipherFilename = "test.cipher"
14 let fileContent = "Screw the NSA"
15
16 File.WriteAllText (plainFilename, fileContent)
17
18 let keyCryptPub, keyCryptPriv = API.generatKeysPair
19 let keySigPub, keySigPriv = API.generatKeysPair
20
21 let encrypt () =
22 API.encryptFile plainFilename cipherFilename keySigPriv keyCryptPub
23
24 let decrypt () =
25 API.decryptFile cipherFilename "." keySigPub keyCryptPriv
26
27 let incrementByteCipherFileAt position =
28 using (new FileStream (cipherFilename, FileMode.Open, FileAccess.ReadWrite))
29 (fun fs -> fs.Position <- position
30 let byte = fs.ReadByte () |> byte
31 fs.Position <- position
32 fs.Write ([| byte + 1uy |], 0, 1)) // Automatically modulo 256.
33
34 encrypt ()
35 File.Delete plainFilename
36 decrypt ()
37 assert (File.ReadAllText plainFilename = fileContent)
38
39 printfn "== Altering the MAC..."
40 incrementByteCipherFileAt 0L
41 try
42 decrypt ()
43 assert false
44 with
45 | error -> assert (error :? IntegrityError)
46
47 printfn "== Altering the signature..."
48 encrypt ()
49 incrementByteCipherFileAt 32L
50 try
51 decrypt ()
52 assert false
53 with
54 | error -> assert (error :? SignatureMismatch)
55
56 printfn "== Altering the keys..."
57 encrypt ()
58 incrementByteCipherFileAt (32L + 256L)
59 try
60 decrypt ()
61 assert false
62 with
63 | error -> assert (error :? UnableToDecryptAESKeys)
64
65 printfn "== Altering the cyphertext..."
66 encrypt ()
67 incrementByteCipherFileAt (32L + 256L + 256L)
68 try
69 decrypt ()
70 assert false
71 with
72 | error -> assert (error :? IntegrityError)
73
74 File.Delete cipherFilename
75 File.Delete plainFilename
76
77 printfn "===== API tests OK"