X-Git-Url: http://git.euphorik.ch/?p=crypto_lab2.git;a=blobdiff_plain;f=labo2-fsharp%2FCryptoFile%2FCrypto.fs;h=836d636af67b37e72fabf38ed5984659b518b75a;hp=34d54fa68cf04673424479a57e91c095bb60c4fe;hb=137157b6dbd5efb99b486a30da6e10b0a175f530;hpb=beda8d83dc421c479bdcf5ee626ec85ee8555a80 diff --git a/labo2-fsharp/CryptoFile/Crypto.fs b/labo2-fsharp/CryptoFile/Crypto.fs index 34d54fa..836d636 100644 --- a/labo2-fsharp/CryptoFile/Crypto.fs +++ b/labo2-fsharp/CryptoFile/Crypto.fs @@ -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