Encrypting should be OK.
[crypto_lab2.git] / labo2-fsharp / CryptoFile / Crypto.fs
index 34d54fa..836d636 100644 (file)
@@ -2,8 +2,9 @@
 
 // Some cryptography primitives specific to CryptoFile.
 module internal Crypto =
-    open System.Security.Cryptography
+    open System
     open System.IO
+    open System.Security.Cryptography
 
     type Data = byte[]
 
@@ -24,7 +25,7 @@ module internal Crypto =
         finally
             rsa.PersistKeyInCsp <- false
 
-    let encryptRSA (publicKey : Key) (plaindata : Data) : Data =
+    let encryptRSA (publicKey: Key) (plaindata: Data) : Data =
         use rsa = new RSACryptoServiceProvider (rsaKeySize)
         try
             rsa.FromXmlString publicKey
@@ -32,7 +33,7 @@ module internal Crypto =
         finally
             rsa.PersistKeyInCsp <- false
 
-    let decryptRSA (privateKey : Key) (cipherdata : Data) : Data =
+    let decryptRSA (privateKey: Key) (cipherdata: Data) : Data =
         use rsa = new RSACryptoServiceProvider (rsaKeySize)
         try
             rsa.FromXmlString privateKey
@@ -41,7 +42,7 @@ module internal Crypto =
             rsa.PersistKeyInCsp <- false
 
     /// Produces a signature from a given hash.
-    let signRSA (privKey : Key) (sha256 : Data) : Data = 
+    let signRSA (privKey: Key) (sha256: Data) : Data = 
         use rsa = new RSACryptoServiceProvider (rsaKeySize)
         try
             rsa.FromXmlString privKey
@@ -50,7 +51,7 @@ module internal Crypto =
             rsa.PersistKeyInCsp <- false
 
     /// Verify a signature against a given hash.
-    let verifySignRSA (pubKey : Key) (sha256 : Data) (signature : Data) : bool =
+    let verifySignRSA (pubKey: Key) (sha256: Data) (signature: Data) : bool =
         use rsa = new RSACryptoServiceProvider (rsaKeySize)
         try
             rsa.FromXmlString pubKey
@@ -59,17 +60,34 @@ module internal Crypto =
             rsa.PersistKeyInCsp <- false
 
     /// Returns an encrypted output stream.
-    let encryptAES (key : byte[]) (iv : byte[]) (outputStream : Stream) : Stream =
+    let encryptAES (key: byte[]) (iv: byte[]) (outputStream: Stream) : CryptoStream =
         assert (key.Length = 32 && iv.Length = 16)
         use aes = new AesManaged ()
         aes.KeySize <- 256
         let encryptor = aes.CreateEncryptor (key, iv)
-        new CryptoStream (outputStream, encryptor, CryptoStreamMode.Write) :> Stream
+        new CryptoStream (outputStream, encryptor, CryptoStreamMode.Write)
 
     /// Returns a decrypted input stream.
-    let decryptAES (key : byte[]) (iv : byte[]) (inputStream : Stream) : Stream =
+    let decryptAES (key: byte[]) (iv: byte[]) (inputStream: Stream) : CryptoStream =
         assert (key.Length = 32 && iv.Length = 16)
         use aes = new AesManaged ()
         aes.KeySize <- 256
         let decryptor = aes.CreateDecryptor (key, iv)
-        new CryptoStream (inputStream, decryptor, CryptoStreamMode.Read) :> Stream
+        new CryptoStream (inputStream, decryptor, CryptoStreamMode.Read)
+
+    let HMACStream (key: byte[]) (outputStream: Stream) : Stream * HMACSHA256 = 
+        assert (key.Length = 32)
+        let hmac = new HMACSHA256 (key)
+        new CryptoStream (outputStream, hmac, CryptoStreamMode.Write) :> Stream, hmac
+
+    (*type HMACStream (buffer: byte[], output: Stream) =
+        inherit Stream () 
+        override this.CanRead with get () = false
+        override this.CanSeek with get () = false
+        override this.CanWrite with get () = true
+        override this.Length with get () = raise <| new NotSupportedException ()
+        override this.Position with get () = raise <| new NotSupportedException ()
+                               and set _ = raise <| new NotSupportedException ()
+        override this.Flush () =
+            output.Flush ()
+        override this.Read (_: byte[], _: int, _: int) = raise <| new NotSupportedException ()*)
\ No newline at end of file