diff options
Diffstat (limited to 'keysafe.hs')
-rw-r--r-- | keysafe.hs | 36 |
1 files changed, 33 insertions, 3 deletions
@@ -15,14 +15,20 @@ import Raaz.Core.Encode import System.IO import System.Posix.ByteString import qualified Data.ByteString as B +import Control.DeepSeq main :: IO () main = do + storedemo + retrievedemo + +storedemo :: IO () +storedemo = do kek <- genKeyEncryptionKey tunables name password let esk = encrypt kek secretkey let sis = shardIdents tunables name keyid shards <- genShards esk tunables - mapM_ (uncurry store) (zip (getIdents sis) shards) + mapM_ (uncurry storeShard) (zip (getIdents sis) shards) where password = Password "foo" name = Name "bar" @@ -30,11 +36,35 @@ main = do keyid = KeyId gpgKey "foobar" secretkey = SecretKey "this is a gpg private key" -store :: StorableObjectIdent -> StorableObject -> IO () -store i o = do +retrievedemo :: IO () +retrievedemo = do + let sis = shardIdents tunables name keyid + shards <- mapM retrieveShard (drop 1 $ getIdents sis) + let esk = combineShards tunables shards + kek <- genKeyEncryptionKey tunables name password + -- TODO: need to solve the encryption puzzle + case decrypt kek esk of + Just (SecretKey sk) -> print sk + Nothing -> print ("Failed" :: String, esk) + where + password = Password "foo" + name = Name "bar" + tunables = testModeTunables -- defaultTunables + keyid = KeyId gpgKey "foobar" + +storeShard :: StorableObjectIdent -> StorableObject -> IO () +storeShard i o = do print $ toByteString i fd <- openFd (toByteString i) WriteOnly (Just 0o666) (defaultFileFlags { exclusive = True } ) h <- fdToHandle fd B.hPut h (fromStorableObject o) hClose h + +retrieveShard :: StorableObjectIdent -> IO StorableObject +retrieveShard i = do + fd <- openFd (toByteString i) ReadOnly Nothing defaultFileFlags + h <- fdToHandle fd + b <- B.hGetContents h + b `deepseq` hClose h + return (StorableObject b) |