// 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[]
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
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
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
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
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