module Main where import RSA import System.Environment (getArgs) import Data.Char (toLower) main :: IO () main = do args <- getArgs case args of ["pubkey"] -> do putStrLn . hex $ e mypubkey putStrLn . hex $ m mypubkey ["blind"] -> do r <- getLine c <- getLine putStrLn . hex $ blind (unhex r) (unhex c) ["unblind"] -> do r <- getLine c <- getLine putStrLn . hex $ unblind (unhex r) (unhex c) ["sign"] -> do x <- getLine putStrLn . hex $ expMod (unhex x) (d (private mykey)) mykey ["verify"] -> do x <- getLine putStrLn . hex $ expMod (unhex x) (e mypubkey) mykey ["test"] -> do r <- getLine x <- getLine let x' = unhex x let r' = unhex r let c' = blind r' x' let y' = unblind r' c' putStrLn $ "x = " ++ hex x' putStrLn $ "r = " ++ hex r' putStrLn $ "c = " ++ hex c' putStrLn $ "y = " ++ hex y' _ -> putStrLn "Unknown arguments" unblind :: Integer -> Integer -> Integer unblind r x = case modInvers r (m mypubkey) of (r':_) -> 2^2048 + blind r' x _ -> error "You factorized the server key!" blind :: Integer -> Integer -> Integer blind r x = y where re = expMod r (e mypubkey) mykey n = m mypubkey b = x * re y = b `mod` n hexchars = "0123456789abcdef" unhex :: String -> Integer unhex = foldr1 (\x s -> s*16 + x) . reverse . map unhexify where unhexify x = case lookup (toLower x) (zip hexchars [0..]) of (Just v) -> toInteger v _ -> error "Invalid number" hex :: Integer -> String hex 0 = "0" hex x = map hexify . reverse . split16 $ x where hexify = (hexchars !!) . fromInteger split16 0 = [] split16 x = x `mod` 16 : split16 (x `div` 16) mypubkey = public mykey mykey = KeyPair {public = PubKey {m = 24237754553483255475536157516502463970333077002286613024097759070643491354150918169897901058642185097766538470691423514620589669362868190821316114289836212340473158025475747068812648312792239080097043228788050676207594163981964817121378570753857127852936234389027228782165681918655799356455664299342947789301740500995807880015889239515152730959319066653293077769983821774973220484062801672890431507405550594529452986795828448338149531500303084544467990934848891846404436044805231337759379482665257126132423026481865494460622947232774109126499198064882718447779415014467972606716663398469329360205104733017045718079383 ,e = 65537} ,private = PrivKey {d = ... ,p = ... ,q = ... ,u = ...}}