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 incrementByteCipherFileAt position = using (new FileStream (cipherFilename, FileMode.Open, FileAccess.ReadWrite)) (fun fs -> fs.Position <- position let byte = fs.ReadByte () |> byte fs.Position <- position fs.Write ([| byte + 1uy |], 0, 1)) // Automatically modulo 256. encrypt () File.Delete plainFilename decrypt () assert (File.ReadAllText plainFilename = fileContent) printfn "== Altering the MAC..." incrementByteCipherFileAt 0L try decrypt () assert false with | error -> assert (error :? IntegrityError) printfn "== Altering the signature..." encrypt () incrementByteCipherFileAt 32L try decrypt () assert false with | error -> assert (error :? SignatureMismatch) printfn "== Altering the keys..." encrypt () incrementByteCipherFileAt (32L + 256L) try decrypt () assert false with | error -> assert (error :? UnableToDecryptAESKeys) printfn "== Altering the cyphertext..." encrypt () incrementByteCipherFileAt (32L + 256L + 256L) try decrypt () assert false with | error -> assert (error :? IntegrityError) File.Delete cipherFilename File.Delete plainFilename printfn "===== API tests OK"