module CryptoFileTests.Tests open System.IO open CryptoFile let doSomeTests () = printfn "===== Unit tests" 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 = use fs = new FileStream (cipherFilename, FileMode.Open, FileAccess.ReadWrite) fs.Position <- position let byte = fs.ReadByte () |> byte fs.Position <- position fs.Write ([| byte + 1uy |], 0, 1) // Modulo 256. encrypt () File.Delete plainFilename decrypt () assert (File.ReadAllText plainFilename = fileContent) printfn "== Altering the MAC... (%d bytes)" (API.hmacSize - 1) for i in 0 .. API.hmacSize - 1 do printf "." encrypt () incrementByteCipherFileAt (int64 i) try decrypt () assert false with | error -> assert (error :? IntegrityError) printfn "" printfn "== Altering the signature... (%d bytes)" (API.signatureSize - 1) for i in 0 .. API.signatureSize - 1 do printf "." encrypt () incrementByteCipherFileAt (int64 <| API.hmacSize + i) try decrypt () assert false with | error -> assert (error :? SignatureMismatch) printfn "" printfn "== Altering the keys... (%d bytes)" (API.keysSize - 1) for i in 0 .. API.keysSize - 1 do printf "." encrypt () incrementByteCipherFileAt (int64 <| API.hmacSize + API.signatureSize + i) try decrypt () assert false with | error -> assert (error :? UnableToDecryptKeys) printfn "" let cyphertextLength = (int (FileInfo (cipherFilename)).Length) + API.hmacSize + API.signatureSize + API.keysSize printfn "== Altering the cyphertext... (%d bytes)" cyphertextLength for i in 0 .. cyphertextLength do printf "." encrypt () incrementByteCipherFileAt (int64 <| API.hmacSize + API.signatureSize + API.keysSize + i) try decrypt () assert false with | error -> assert (error :? IntegrityError) printfn "" File.Delete cipherFilename File.Delete plainFilename printfn "===== API tests OK"