From 095ee1a65f18365a52d48dd404645814c7234817 Mon Sep 17 00:00:00 2001 From: Dmitry Zuikov Date: Thu, 22 Aug 2024 13:19:41 +0300 Subject: [PATCH] wip --- hbs2-cli/lib/HBS2/CLI/Run/GroupKey.hs | 19 +++++++++++++++++++ hbs2-core/lib/HBS2/Net/Auth/GroupKeySymm.hs | 11 ++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/hbs2-cli/lib/HBS2/CLI/Run/GroupKey.hs b/hbs2-cli/lib/HBS2/CLI/Run/GroupKey.hs index 52fe9b15..5b986a57 100644 --- a/hbs2-cli/lib/HBS2/CLI/Run/GroupKey.hs +++ b/hbs2-cli/lib/HBS2/CLI/Run/GroupKey.hs @@ -123,6 +123,25 @@ groupKeyEntries = do _ -> throwIO $ BadFormException @C nil + entry $ bindMatch "hbs2:groupkey:dump" $ nil_ $ \syn -> do + case syn of + + [StringLike "--file", StringLike fn] -> do + notice "READ-FROM-FILE" + + [HashLike gkh] -> do + sto <- getStorage + + lbs <- runExceptT (readFromMerkle sto (SimpleKey (fromHashRef gkh))) + >>= orThrowUser "can't read merkle tree" + + gk <- deserialiseOrFail @(GroupKey 'Symm HBS2Basic) lbs & orThrowUser "invalid group key" + + liftIO $ print $ pretty gk + + _ -> do + notice "READ-FROM-STDIN" + entry $ bindMatch "hbs2:groupkey:list-public-keys" $ \syn -> do case syn of [LitStrVal s] -> do diff --git a/hbs2-core/lib/HBS2/Net/Auth/GroupKeySymm.hs b/hbs2-core/lib/HBS2/Net/Auth/GroupKeySymm.hs index 5cf5faea..7c4d8767 100644 --- a/hbs2-core/lib/HBS2/Net/Auth/GroupKeySymm.hs +++ b/hbs2-core/lib/HBS2/Net/Auth/GroupKeySymm.hs @@ -97,6 +97,10 @@ newtype GroupKeyId = GroupKeyId N.ByteString instance Pretty GroupKeyId where pretty what = pretty (AsBase58 (coerce @_ @N.ByteString what)) +instance Pretty GroupKeyIdScheme where + pretty = \case + GroupKeyIdJustHash -> "just-hash" + -- NOTE: not-a-monoid -- это моноид, но опасный, потому, что секретные ключи у двух разных -- групповых ключей могут быть разными, и если @@ -207,9 +211,14 @@ instance (ForGroupKeySymm s) => Serialise (GroupKey 'Symm s) where instance (Pretty (AsBase58 (PubKey 'Encrypt s)) ) => Pretty (GroupKey 'Symm s) where - pretty g = vcat (fmap prettyEntry (HashMap.toList (recipients @s g))) + pretty g = gkType <> line <> vcat (fmap prettyEntry (HashMap.toList (recipients @s g))) where prettyEntry (pk, _) = "member" <+> dquotes (pretty (AsBase58 pk)) + gkType = case g of + GroupKeySymmPlain{} -> ";" <+> "plain group key" <> line + GroupKeySymmFancy{} -> ";" <+> "fancy group key" <> line + <> "group-key-id" <+> pretty (getGroupKeyId g) <> line + <> "group-key-id-scheme" <+> pretty (getGroupKeyIdScheme g) <> line instance ForGroupKeySymm s => FromStringMaybe (GroupKey 'Symm s) where