First commit.
[crypto_lab2.git] / labo2-fsharp / labo2-fsharp / Crypto.fs
1 module Labo2.Crypto
2
3 open System.Security.Cryptography
4 open System.IO
5
6 type Key = string
7 type Data = byte[]
8
9 let rsaKeySize = 2048
10
11 let generate256Key : Key =
12 null
13
14 /// Generate a new RSA key pair: (public * private).
15 let generateRSAKeysPair : Key * Key =
16 use rsa = new RSACryptoServiceProvider (rsaKeySize)
17 try
18 rsa.ToXmlString false, rsa.ToXmlString true
19 finally
20 rsa.PersistKeyInCsp <- false
21
22 let encryptRSA (publicKey : Key) (plaindata : Data) : Data =
23 use rsa = new RSACryptoServiceProvider (rsaKeySize)
24 try
25 rsa.FromXmlString publicKey
26 rsa.Encrypt (plaindata, false) // Uses PKCS#1 v1.5 padding.
27 finally
28 rsa.PersistKeyInCsp <- false
29
30 let decryptRSA (privateKey : Key) (cipherdata : Data) : Data =
31 use rsa = new RSACryptoServiceProvider (rsaKeySize)
32 try
33 rsa.FromXmlString privateKey
34 rsa.Decrypt (cipherdata, false) // Uses PKCS#1 v1.5 padding.
35 finally
36 rsa.PersistKeyInCsp <- false
37
38 /// Produces a signature from a given hash.
39 let signRSA (privKey : Key) (sha256 : Data) : Data =
40 use rsa = new RSACryptoServiceProvider (rsaKeySize)
41 try
42 rsa.FromXmlString privKey
43 rsa.SignHash (sha256, CryptoConfig.MapNameToOID "SHA256")
44 finally
45 rsa.PersistKeyInCsp <- false
46
47 /// Verify a signature against a given hash.
48 let verifySignRSA (pubKey : Key) (sha256 : Data) (signature : Data) : bool =
49 use rsa = new RSACryptoServiceProvider (rsaKeySize)
50 try
51 rsa.FromXmlString pubKey
52 rsa.VerifyHash (sha256, CryptoConfig.MapNameToOID "SHA256", signature)
53 finally
54 rsa.PersistKeyInCsp <- false
55
56 let decryptAES (key : Key) (inputStream : Stream) (outputStream : Stream) =
57 ()
58
59 open System.Text
60
61 let testRSA = lazy (
62 let kpub, kpriv = generateRSAKeysPair
63 let plaintext = "Hello, World!"
64 printfn "plaintext: %A" plaintext
65 let cipherdata = encryptRSA kpub (Encoding.UTF8.GetBytes plaintext)
66 printfn "cipherdata: (size: %A) %A" cipherdata.Length cipherdata
67 let decryptedData = decryptRSA kpriv cipherdata
68 let decryptedText = Encoding.UTF8.GetString decryptedData
69 printfn "decryptedtext: %A" decryptedText
70 assert (plaintext = decryptedText)
71 printfn "testRSA OK"
72 )
73
74 let testRSASignature = lazy (
75 let kpub, kpriv = generateRSAKeysPair
76 let plaintext = "Hello, World!"
77 let sha256 = new SHA256Managed ()
78 let signature = signRSA kpriv (sha256.ComputeHash (Encoding.UTF8.GetBytes plaintext))
79 assert verifySignRSA kpub (sha256.ComputeHash (Encoding.UTF8.GetBytes plaintext)) signature
80 assert not (verifySignRSA kpub (sha256.ComputeHash (Encoding.UTF8.GetBytes "Hello!")) signature)
81 printfn "testRSASignature OK"
82 )