From aa097a787d8ad39d5fcee3b6b9ded6407b14af15 Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Thu, 1 Jun 2023 12:24:37 -0400
Subject: [PATCH] add a command-line tool for encoding data to SDMF shares

---
 encode-ssk/Main.hs | 29 +++++++++++++++++++++++++++++
 tahoe-ssk.cabal    | 16 ++++++++++++++++
 2 files changed, 45 insertions(+)
 create mode 100644 encode-ssk/Main.hs

diff --git a/encode-ssk/Main.hs b/encode-ssk/Main.hs
new file mode 100644
index 0000000..cc50fb6
--- /dev/null
+++ b/encode-ssk/Main.hs
@@ -0,0 +1,29 @@
+module Main where
+
+import qualified Crypto.PubKey.RSA as RSA
+import Data.Binary (encode)
+import Data.ByteString.Base32 (encodeBase32Unpadded)
+import qualified Data.ByteString.Lazy as LB
+import qualified Data.Text as T
+import qualified Data.Text.IO as T
+import System.IO (stdin)
+import qualified Tahoe.SDMF as SDMF
+import qualified Tahoe.SDMF.Keys as SDMF.Keys
+
+main :: IO ()
+main = do
+    plaintext <- LB.hGetContents stdin
+    keypair <- SDMF.Keys.KeyPair . snd <$> RSA.generate (2048 `div` 8) e
+    Just iv <- SDMF.randomIV
+
+    let ciphertext = SDMF.encrypt keypair iv plaintext
+    (shares, writeCap) <- SDMF.encode keypair iv 1 3 5 ciphertext
+    let shareBytes = encode <$> shares
+
+    let si = SDMF.Keys.unStorageIndex . SDMF.verifierStorageIndex . SDMF.readerVerifier . SDMF.writerReader $ writeCap
+
+    mapM_ (uncurry (writeShare si)) (zip [0 :: Int ..] shareBytes)
+    T.putStrLn (SDMF.dangerRealShow (SDMF.SDMFWriter writeCap))
+  where
+    e = 0x10001
+    writeShare si shnum = LB.writeFile $ (T.unpack . T.toLower . encodeBase32Unpadded $ si) <> "." <> show shnum
diff --git a/tahoe-ssk.cabal b/tahoe-ssk.cabal
index 68fbb5a..bd04c33 100644
--- a/tahoe-ssk.cabal
+++ b/tahoe-ssk.cabal
@@ -164,3 +164,19 @@ executable make-keypairs
     , cryptonite
     , tahoe-ssk
     , x509
+
+executable encode-ssk
+  import:
+    warnings
+    , language
+
+  main-is:        Main.hs
+  hs-source-dirs: encode-ssk
+  build-depends:
+    , base
+    , base32
+    , binary
+    , bytestring
+    , cryptonite
+    , tahoe-ssk
+    , text
-- 
GitLab