This commit is contained in:
Dmitry Zuikov 2023-02-09 07:43:00 +03:00
parent 26f4796cbe
commit 887ff91b80
5 changed files with 73 additions and 14 deletions

View File

@ -1,3 +1,45 @@
## 2023-02-09
TODO: encryption-keys-into-credentials-file
дизайн данных:
```
data Credentials = Credentials SignKey [(KeyId, KeyMetadata, KeyPair)]
```
он же "keyring", это буквально связка ключей.
операции:
```
hbs2 keyring list <keyring-file>
```
показывает публичные ключи в связке и их типы и прочее
```
hbs2 keyring add-new [-n key-id] <keyring-file>
```
добавляет ключ
```
hbs2 keyring del -n key-id <keyring-file>
```
удаляет ключ
Этот же формат ключ можно использовать и самому пиру,
т.к. ему тоже нужны будут потом ключи шифрования.
Единственное, пир должен знать какой ключ из связки
использовать, но это может быть либо по умолчанию
первый ключ, либо передавать как-то в конфиге
или же аргументах.
## 2023-02-07
FIXME: suckless-conf

View File

@ -1,10 +1,10 @@
{-# Language TemplateHaskell #-}
{-# Language UndecidableInstances #-}
module HBS2.Net.Auth.Credentials where
import HBS2.Prelude.Plated
import HBS2.Net.Proto.Types
import HBS2.Base58
import HBS2.Net.Messaging.UDP (UDP)
import Codec.Serialise
import Crypto.Saltine.Core.Sign (Keypair(..))
@ -16,8 +16,30 @@ import Data.ByteString.Char8 qualified as B8
import Data.ByteString.Char8 (ByteString)
import Data.Function
import Data.List.Split (chunksOf)
import Data.Text (Text)
import Lens.Micro.Platform
import Prettyprinter
class HasCredentials e m where
getCredentials :: m (PeerCredentials e)
data KeyringEntry e =
KeyringEntry
{ _krPk :: PubKey 'Encrypt e
, _krSk :: PrivKey 'Encrypt e
, _krDesc :: Text
}
data PeerCredentials e =
PeerCredentials
{ _peerSignSk :: PrivKey 'Sign e
, _peerSignPk :: PubKey 'Sign e
, _peerKeyring :: [KeyringEntry e]
}
makeLenses 'KeyringEntry
makeLenses 'PeerCredentials
newtype AsCredFile a = AsCredFile a
@ -28,7 +50,7 @@ newCredentials :: forall e m . ( MonadIO m
) => m (PeerCredentials e)
newCredentials = do
pair <- liftIO Sign.newKeypair
pure $ PeerCredentials @e (secretKey pair) (publicKey pair)
pure $ PeerCredentials @e (secretKey pair) (publicKey pair) mempty
parseCredentials :: forall e . ( Signatures e
@ -45,6 +67,7 @@ parseCredentials (AsCredFile bs) = maybe1 b58_1 Nothing fromCbor
fromPair (s1,s2) = PeerCredentials <$> Crypto.decode s1
<*> Crypto.decode s2
<*> pure mempty
b58_1 = B8.lines bs & dropWhile hdr
& filter ( not . B8.null )
@ -59,7 +82,7 @@ instance ( IsEncoding (PrivKey 'Sign e)
)
=> Pretty (AsBase58 (PeerCredentials e)) where
pretty (AsBase58 (PeerCredentials s p)) = pretty $ B8.unpack (toBase58 bs)
pretty (AsBase58 (PeerCredentials s p _)) = pretty $ B8.unpack (toBase58 bs)
where
sk = Crypto.encode s
pk = Crypto.encode p

View File

@ -2,15 +2,16 @@
{-# Language UndecidableInstances #-}
module HBS2.Net.Proto.Peer where
import HBS2.Base58
-- import HBS2.Base58
import HBS2.Data.Types
import HBS2.Events
import HBS2.Net.Proto
import HBS2.Clock
import HBS2.Net.Proto.Sessions
import HBS2.Prelude.Plated
import HBS2.Net.Auth.Credentials
import HBS2.System.Logger.Simple
-- import HBS2.System.Logger.Simple
import Data.Maybe
import Codec.Serialise()

View File

@ -18,6 +18,7 @@ import System.Random qualified as Random
import Data.Digest.Murmur32
import Data.ByteString (ByteString)
import Lens.Micro.Platform
import Data.Text (Text)
-- e -> Transport (like, UDP or TChan)
-- p -> L4 Protocol (like Ping/Pong)
@ -41,8 +42,6 @@ class Signatures e where
makeSign :: PrivKey 'Sign e -> ByteString -> Signature e
verifySign :: PubKey 'Sign e -> Signature e -> ByteString -> Bool
class HasCredentials e m where
getCredentials :: m (PeerCredentials e)
class HasCookie e p | p -> e where
type family Cookie e :: Type
@ -54,13 +53,6 @@ type PeerNonce = Nonce ()
class HasPeerNonce e m where
peerNonce :: m PeerNonce
data PeerCredentials e =
PeerCredentials
{ _peerSignSk :: PrivKey 'Sign e
, _peerSignPk :: PubKey 'Sign e
}
makeLenses 'PeerCredentials
data WithCookie e p = WithCookie (Cookie e) p

View File

@ -204,3 +204,4 @@ removeFromWip h = do
liftIO $ Cache.delete wip h
liftIO $ Cache.delete po h
liftIO $ atomically $ modifyTVar' st (HashMap.delete h)