HsOpenSSL-0.5.1: examples/GenRSAKey.hs
import Control.Monad hiding (join)
import OpenSSL
import OpenSSL.EVP.PKey
import OpenSSL.PEM
import OpenSSL.RSA
import System.IO
import Text.Printf
main = withOpenSSL $
do let keyBits = 512
keyE = 65537
printf "Generating RSA key-pair, nbits = %d, e = %d:\n" keyBits keyE
rsa <- generateKey keyBits keyE $ Just $ \ phase _ ->
do hPutChar stdout $ case phase of
0 -> '.'
1 -> '+'
2 -> '*'
3 -> '\n'
n -> head $ show n
hFlush stdout
printf "Done.\n"
n <- rsaN rsa
e <- rsaE rsa
d <- rsaD rsa
p <- rsaP rsa
q <- rsaQ rsa
dmp1 <- rsaDMP1 rsa
dmq1 <- rsaDMQ1 rsa
iqmp <- rsaIQMP rsa
printf "n (public modulus) = %s\n" (show n)
printf "e (public exponent) = %s\n" (show e)
printf "d (private exponent) = %s\n" (show d)
printf "p (secret prime factor) = %s\n" (show p)
printf "q (secret prime factor) = %s\n" (show q)
printf "dmp1 (d mod (p-1)) = %s\n" (show dmp1)
printf "dmq1 (d mod (q-1)) = %s\n" (show dmq1)
printf "iqmp (q^-1 mod p) = %s\n" (show iqmp)
let pkey = newPKeyRSA rsa
writePKCS8PrivateKey pkey Nothing >>= putStr
writePublicKey pkey >>= putStr