{-# LANGUAGE NamedFieldPuns #-}
module Tahoe.CHK.Capability (CHK (..), Reader (..), Verifier (..), makeReader, pCapability, pVerifier, pReader, dangerRealShow) where
import qualified Data.ByteString as B
import qualified Data.ByteString.Base32 as B
import Data.Serialize (
encode,
)
import qualified Data.Set as Set
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import Data.Void (Void)
import Data.Word (Word16, Word64)
import Text.Megaparsec (ErrorFancy (ErrorFail), Parsec, count, fancyFailure, oneOf, try, (<|>))
import Text.Megaparsec.Char (char, string)
import Text.Megaparsec.Char.Lexer (decimal)
import Crypto.Cipher.AES128 (
AESKey128,
)
import Crypto.Classes (buildKey)
import Tahoe.CHK.Crypto (storageIndexHash)
import qualified Tahoe.CHK.Parsing
type Parser = Parsec Void T.Text
maxShares :: Word16
maxShares :: Word16
maxShares = Word16
256
maxDataSize :: Integer
maxDataSize :: Integer
maxDataSize = Word64 -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
forall a. Bounded a => a
maxBound :: Word64)
data Verifier = Verifier
{
Verifier -> ByteString
storageIndex :: B.ByteString
,
Verifier -> ByteString
fingerprint :: B.ByteString
,
Verifier -> Word16
required :: Word16
,
Verifier -> Word16
total :: Word16
,
Verifier -> Integer
size :: Integer
}
deriving (Eq Verifier
Eq Verifier
-> (Verifier -> Verifier -> Ordering)
-> (Verifier -> Verifier -> Bool)
-> (Verifier -> Verifier -> Bool)
-> (Verifier -> Verifier -> Bool)
-> (Verifier -> Verifier -> Bool)
-> (Verifier -> Verifier -> Verifier)
-> (Verifier -> Verifier -> Verifier)
-> Ord Verifier
Verifier -> Verifier -> Bool
Verifier -> Verifier -> Ordering
Verifier -> Verifier -> Verifier
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Verifier -> Verifier -> Verifier
$cmin :: Verifier -> Verifier -> Verifier
max :: Verifier -> Verifier -> Verifier
$cmax :: Verifier -> Verifier -> Verifier
>= :: Verifier -> Verifier -> Bool
$c>= :: Verifier -> Verifier -> Bool
> :: Verifier -> Verifier -> Bool
$c> :: Verifier -> Verifier -> Bool
<= :: Verifier -> Verifier -> Bool
$c<= :: Verifier -> Verifier -> Bool
< :: Verifier -> Verifier -> Bool
$c< :: Verifier -> Verifier -> Bool
compare :: Verifier -> Verifier -> Ordering
$ccompare :: Verifier -> Verifier -> Ordering
$cp1Ord :: Eq Verifier
Ord, Verifier -> Verifier -> Bool
(Verifier -> Verifier -> Bool)
-> (Verifier -> Verifier -> Bool) -> Eq Verifier
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Verifier -> Verifier -> Bool
$c/= :: Verifier -> Verifier -> Bool
== :: Verifier -> Verifier -> Bool
$c== :: Verifier -> Verifier -> Bool
Eq)
shorten :: Int -> T.Text -> T.Text
shorten :: Int -> Text -> Text
shorten Int
n = (Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"...") (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> Text
T.take Int
n
showT :: Show s => s -> T.Text
showT :: s -> Text
showT = String -> Text
T.pack (String -> Text) -> (s -> String) -> s -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> String
forall a. Show a => a -> String
show
showBase32 :: B.ByteString -> T.Text
showBase32 :: ByteString -> Text
showBase32 = Text -> Text
T.toLower (Text -> Text) -> (ByteString -> Text) -> ByteString -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
B.encodeBase32Unpadded
bounded :: (Ord n, Integral n) => n -> n -> Parser n
bounded :: n -> n -> Parser n
bounded = ParsecT Void Text Identity Integer -> n -> n -> Parser n
forall e s (m :: * -> *) n.
(MonadParsec e s m, Ord n, Integral n) =>
m Integer -> n -> n -> m n
Tahoe.CHK.Parsing.bounded ParsecT Void Text Identity Integer
forall e s (m :: * -> *) a.
(MonadParsec e s m, Token s ~ Char, Num a) =>
m a
decimal
instance Show Verifier where
show :: Verifier -> String
show Verifier{ByteString
storageIndex :: ByteString
storageIndex :: Verifier -> ByteString
storageIndex, ByteString
fingerprint :: ByteString
fingerprint :: Verifier -> ByteString
fingerprint, Word16
required :: Word16
required :: Verifier -> Word16
required, Word16
total :: Word16
total :: Verifier -> Word16
total, Integer
size :: Integer
size :: Verifier -> Integer
size} =
Text -> String
T.unpack (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$
Text -> [Text] -> Text
T.intercalate
Text
":"
[ Text
"URI"
, Text
"CHK-Verifier"
, Int -> Text -> Text
shorten Int
4 (Text -> Text) -> (ByteString -> Text) -> ByteString -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
showBase32 (ByteString -> Text) -> ByteString -> Text
forall a b. (a -> b) -> a -> b
$ ByteString
storageIndex
, Int -> Text -> Text
shorten Int
4 (Text -> Text) -> (ByteString -> Text) -> ByteString -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
showBase32 (ByteString -> Text) -> ByteString -> Text
forall a b. (a -> b) -> a -> b
$ ByteString
fingerprint
, Word16 -> Text
forall s. Show s => s -> Text
showT Word16
required
, Word16 -> Text
forall s. Show s => s -> Text
showT Word16
total
, Integer -> Text
forall s. Show s => s -> Text
showT Integer
size
]
data Reader = Reader
{
Reader -> AESKey128
readKey :: AESKey128
,
Reader -> Verifier
verifier :: Verifier
}
instance Eq Reader where
Reader
left == :: Reader -> Reader -> Bool
== Reader
right = Reader -> (ByteString, Verifier)
readerKey Reader
left (ByteString, Verifier) -> (ByteString, Verifier) -> Bool
forall a. Eq a => a -> a -> Bool
== Reader -> (ByteString, Verifier)
readerKey Reader
right
instance Ord Reader where
compare :: Reader -> Reader -> Ordering
compare Reader
left Reader
right = (ByteString, Verifier) -> (ByteString, Verifier) -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Reader -> (ByteString, Verifier)
readerKey Reader
left) (Reader -> (ByteString, Verifier)
readerKey Reader
right)
instance Show Reader where
show :: Reader -> String
show Reader{AESKey128
readKey :: AESKey128
readKey :: Reader -> AESKey128
readKey, Verifier
verifier :: Verifier
verifier :: Reader -> Verifier
verifier} =
Text -> String
T.unpack (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$
Text -> [Text] -> Text
T.intercalate
Text
":"
[ Text
"URI"
, Text
"CHK"
, Int -> Text -> Text
shorten Int
4 (Text -> Text) -> (AESKey128 -> Text) -> AESKey128 -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
showBase32 (ByteString -> Text)
-> (AESKey128 -> ByteString) -> AESKey128 -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AESKey128 -> ByteString
forall a. Serialize a => a -> ByteString
encode (AESKey128 -> Text) -> AESKey128 -> Text
forall a b. (a -> b) -> a -> b
$ AESKey128
readKey
, Int -> Text -> Text
shorten Int
4 (Text -> Text) -> (Verifier -> Text) -> Verifier -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
showBase32 (ByteString -> Text)
-> (Verifier -> ByteString) -> Verifier -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Verifier -> ByteString
fingerprint (Verifier -> Text) -> Verifier -> Text
forall a b. (a -> b) -> a -> b
$ Verifier
verifier
, Word16 -> Text
forall s. Show s => s -> Text
showT (Word16 -> Text) -> (Verifier -> Word16) -> Verifier -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Verifier -> Word16
required (Verifier -> Text) -> Verifier -> Text
forall a b. (a -> b) -> a -> b
$ Verifier
verifier
, Word16 -> Text
forall s. Show s => s -> Text
showT (Word16 -> Text) -> (Verifier -> Word16) -> Verifier -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Verifier -> Word16
total (Verifier -> Text) -> Verifier -> Text
forall a b. (a -> b) -> a -> b
$ Verifier
verifier
, Integer -> Text
forall s. Show s => s -> Text
showT (Integer -> Text) -> (Verifier -> Integer) -> Verifier -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Verifier -> Integer
size (Verifier -> Text) -> Verifier -> Text
forall a b. (a -> b) -> a -> b
$ Verifier
verifier
]
readerKey :: Reader -> (B.ByteString, Verifier)
readerKey :: Reader -> (ByteString, Verifier)
readerKey Reader
r = (AESKey128 -> ByteString
forall a. Serialize a => a -> ByteString
encode (AESKey128 -> ByteString)
-> (Reader -> AESKey128) -> Reader -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reader -> AESKey128
readKey (Reader -> ByteString) -> Reader -> ByteString
forall a b. (a -> b) -> a -> b
$ Reader
r, Reader -> Verifier
verifier Reader
r)
data CHK = CHKVerifier Verifier | CHKReader Reader deriving (Eq CHK
Eq CHK
-> (CHK -> CHK -> Ordering)
-> (CHK -> CHK -> Bool)
-> (CHK -> CHK -> Bool)
-> (CHK -> CHK -> Bool)
-> (CHK -> CHK -> Bool)
-> (CHK -> CHK -> CHK)
-> (CHK -> CHK -> CHK)
-> Ord CHK
CHK -> CHK -> Bool
CHK -> CHK -> Ordering
CHK -> CHK -> CHK
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CHK -> CHK -> CHK
$cmin :: CHK -> CHK -> CHK
max :: CHK -> CHK -> CHK
$cmax :: CHK -> CHK -> CHK
>= :: CHK -> CHK -> Bool
$c>= :: CHK -> CHK -> Bool
> :: CHK -> CHK -> Bool
$c> :: CHK -> CHK -> Bool
<= :: CHK -> CHK -> Bool
$c<= :: CHK -> CHK -> Bool
< :: CHK -> CHK -> Bool
$c< :: CHK -> CHK -> Bool
compare :: CHK -> CHK -> Ordering
$ccompare :: CHK -> CHK -> Ordering
$cp1Ord :: Eq CHK
Ord, CHK -> CHK -> Bool
(CHK -> CHK -> Bool) -> (CHK -> CHK -> Bool) -> Eq CHK
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CHK -> CHK -> Bool
$c/= :: CHK -> CHK -> Bool
== :: CHK -> CHK -> Bool
$c== :: CHK -> CHK -> Bool
Eq)
dangerRealShow :: CHK -> T.Text
dangerRealShow :: CHK -> Text
dangerRealShow (CHKVerifier (Verifier{ByteString
storageIndex :: ByteString
storageIndex :: Verifier -> ByteString
storageIndex, ByteString
fingerprint :: ByteString
fingerprint :: Verifier -> ByteString
fingerprint, Word16
required :: Word16
required :: Verifier -> Word16
required, Word16
total :: Word16
total :: Verifier -> Word16
total, Integer
size :: Integer
size :: Verifier -> Integer
size})) =
Text -> [Text] -> Text
T.intercalate
Text
":"
[ Text
"URI"
, Text
"CHK-Verifier"
, ByteString -> Text
showBase32 ByteString
storageIndex
, ByteString -> Text
showBase32 ByteString
fingerprint
, Word16 -> Text
forall s. Show s => s -> Text
showT Word16
required
, Word16 -> Text
forall s. Show s => s -> Text
showT Word16
total
, Integer -> Text
forall s. Show s => s -> Text
showT Integer
size
]
dangerRealShow (CHKReader (Reader{AESKey128
readKey :: AESKey128
readKey :: Reader -> AESKey128
readKey, Verifier
verifier :: Verifier
verifier :: Reader -> Verifier
verifier})) =
Text -> [Text] -> Text
T.intercalate
Text
":"
[ Text
"URI"
, Text
"CHK"
, ByteString -> Text
showBase32 (ByteString -> Text)
-> (AESKey128 -> ByteString) -> AESKey128 -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AESKey128 -> ByteString
forall a. Serialize a => a -> ByteString
encode (AESKey128 -> Text) -> AESKey128 -> Text
forall a b. (a -> b) -> a -> b
$ AESKey128
readKey
, ByteString -> Text
showBase32 (ByteString -> Text)
-> (Verifier -> ByteString) -> Verifier -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Verifier -> ByteString
fingerprint (Verifier -> Text) -> Verifier -> Text
forall a b. (a -> b) -> a -> b
$ Verifier
verifier
, Word16 -> Text
forall s. Show s => s -> Text
showT (Word16 -> Text) -> (Verifier -> Word16) -> Verifier -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Verifier -> Word16
required (Verifier -> Text) -> Verifier -> Text
forall a b. (a -> b) -> a -> b
$ Verifier
verifier
, Word16 -> Text
forall s. Show s => s -> Text
showT (Word16 -> Text) -> (Verifier -> Word16) -> Verifier -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Verifier -> Word16
total (Verifier -> Text) -> Verifier -> Text
forall a b. (a -> b) -> a -> b
$ Verifier
verifier
, Integer -> Text
forall s. Show s => s -> Text
showT (Integer -> Text) -> (Verifier -> Integer) -> Verifier -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Verifier -> Integer
size (Verifier -> Text) -> Verifier -> Text
forall a b. (a -> b) -> a -> b
$ Verifier
verifier
]
pCapability :: Parser CHK
pCapability :: Parser CHK
pCapability = Parser CHK -> Parser CHK
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Verifier -> CHK
CHKVerifier (Verifier -> CHK)
-> ParsecT Void Text Identity Verifier -> Parser CHK
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void Text Identity Verifier
pVerifier) Parser CHK -> Parser CHK -> Parser CHK
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Reader -> CHK
CHKReader (Reader -> CHK) -> ParsecT Void Text Identity Reader -> Parser CHK
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void Text Identity Reader
pReader)
pVerifier :: Parser Verifier
pVerifier :: ParsecT Void Text Identity Verifier
pVerifier =
ByteString -> ByteString -> Word16 -> Word16 -> Integer -> Verifier
Verifier
(ByteString
-> ByteString -> Word16 -> Word16 -> Integer -> Verifier)
-> ParsecT Void Text Identity ByteString
-> ParsecT
Void
Text
Identity
(ByteString -> Word16 -> Word16 -> Integer -> Verifier)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Tokens Text -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"URI:CHK-Verifier:" ParsecT Void Text Identity Text
-> ParsecT Void Text Identity ByteString
-> ParsecT Void Text Identity ByteString
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> String -> Word16 -> ParsecT Void Text Identity ByteString
pBase32 String
rfc3548Alphabet Word16
128)
ParsecT
Void
Text
Identity
(ByteString -> Word16 -> Word16 -> Integer -> Verifier)
-> ParsecT Void Text Identity Char
-> ParsecT
Void
Text
Identity
(ByteString -> Word16 -> Word16 -> Integer -> Verifier)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token Text
':'
ParsecT
Void
Text
Identity
(ByteString -> Word16 -> Word16 -> Integer -> Verifier)
-> ParsecT Void Text Identity ByteString
-> ParsecT
Void Text Identity (Word16 -> Word16 -> Integer -> Verifier)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> Word16 -> ParsecT Void Text Identity ByteString
pBase32 String
rfc3548Alphabet Word16
256
ParsecT
Void Text Identity (Word16 -> Word16 -> Integer -> Verifier)
-> ParsecT Void Text Identity Char
-> ParsecT
Void Text Identity (Word16 -> Word16 -> Integer -> Verifier)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token Text
':'
ParsecT
Void Text Identity (Word16 -> Word16 -> Integer -> Verifier)
-> ParsecT Void Text Identity Word16
-> ParsecT Void Text Identity (Word16 -> Integer -> Verifier)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Word16 -> Word16 -> ParsecT Void Text Identity Word16
forall n. (Ord n, Integral n) => n -> n -> Parser n
bounded Word16
1 Word16
maxShares
ParsecT Void Text Identity (Word16 -> Integer -> Verifier)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity (Word16 -> Integer -> Verifier)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token Text
':'
ParsecT Void Text Identity (Word16 -> Integer -> Verifier)
-> ParsecT Void Text Identity Word16
-> ParsecT Void Text Identity (Integer -> Verifier)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Word16 -> Word16 -> ParsecT Void Text Identity Word16
forall n. (Ord n, Integral n) => n -> n -> Parser n
bounded Word16
1 Word16
maxShares
ParsecT Void Text Identity (Integer -> Verifier)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity (Integer -> Verifier)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token Text
':'
ParsecT Void Text Identity (Integer -> Verifier)
-> ParsecT Void Text Identity Integer
-> ParsecT Void Text Identity Verifier
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Integer -> Integer -> ParsecT Void Text Identity Integer
forall n. (Ord n, Integral n) => n -> n -> Parser n
bounded Integer
1 Integer
maxDataSize
pReader :: Parser Reader
pReader :: ParsecT Void Text Identity Reader
pReader =
AESKey128 -> ByteString -> Word16 -> Word16 -> Integer -> Reader
makeReader
(AESKey128 -> ByteString -> Word16 -> Word16 -> Integer -> Reader)
-> ParsecT Void Text Identity AESKey128
-> ParsecT
Void
Text
Identity
(ByteString -> Word16 -> Word16 -> Integer -> Reader)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ( Tokens Text -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
"URI:CHK:"
ParsecT Void Text Identity Text
-> ParsecT Void Text Identity ByteString
-> ParsecT Void Text Identity ByteString
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> String -> Word16 -> ParsecT Void Text Identity ByteString
pBase32 String
rfc3548Alphabet Word16
128
ParsecT Void Text Identity ByteString
-> (ByteString -> ParsecT Void Text Identity AESKey128)
-> ParsecT Void Text Identity AESKey128
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ParsecT Void Text Identity AESKey128
-> (AESKey128 -> ParsecT Void Text Identity AESKey128)
-> Maybe AESKey128
-> ParsecT Void Text Identity AESKey128
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Set (ErrorFancy Void) -> ParsecT Void Text Identity AESKey128
forall e s (m :: * -> *) a.
MonadParsec e s m =>
Set (ErrorFancy e) -> m a
fancyFailure (Set (ErrorFancy Void) -> ParsecT Void Text Identity AESKey128)
-> (Text -> Set (ErrorFancy Void))
-> Text
-> ParsecT Void Text Identity AESKey128
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ErrorFancy Void -> Set (ErrorFancy Void)
forall a. a -> Set a
Set.singleton (ErrorFancy Void -> Set (ErrorFancy Void))
-> (Text -> ErrorFancy Void) -> Text -> Set (ErrorFancy Void)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ErrorFancy Void
forall e. String -> ErrorFancy e
ErrorFail (String -> ErrorFancy Void)
-> (Text -> String) -> Text -> ErrorFancy Void
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack (Text -> ParsecT Void Text Identity AESKey128)
-> Text -> ParsecT Void Text Identity AESKey128
forall a b. (a -> b) -> a -> b
$ Text
"Failed to build AESKey128 from CHK read key bytes") AESKey128 -> ParsecT Void Text Identity AESKey128
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe AESKey128 -> ParsecT Void Text Identity AESKey128)
-> (ByteString -> Maybe AESKey128)
-> ByteString
-> ParsecT Void Text Identity AESKey128
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Maybe AESKey128
forall k. BlockCipher k => ByteString -> Maybe k
buildKey
)
ParsecT
Void
Text
Identity
(ByteString -> Word16 -> Word16 -> Integer -> Reader)
-> ParsecT Void Text Identity Char
-> ParsecT
Void
Text
Identity
(ByteString -> Word16 -> Word16 -> Integer -> Reader)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token Text
':'
ParsecT
Void
Text
Identity
(ByteString -> Word16 -> Word16 -> Integer -> Reader)
-> ParsecT Void Text Identity ByteString
-> ParsecT
Void Text Identity (Word16 -> Word16 -> Integer -> Reader)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> Word16 -> ParsecT Void Text Identity ByteString
pBase32 String
rfc3548Alphabet Word16
256
ParsecT Void Text Identity (Word16 -> Word16 -> Integer -> Reader)
-> ParsecT Void Text Identity Char
-> ParsecT
Void Text Identity (Word16 -> Word16 -> Integer -> Reader)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token Text
':'
ParsecT Void Text Identity (Word16 -> Word16 -> Integer -> Reader)
-> ParsecT Void Text Identity Word16
-> ParsecT Void Text Identity (Word16 -> Integer -> Reader)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Word16 -> Word16 -> ParsecT Void Text Identity Word16
forall n. (Ord n, Integral n) => n -> n -> Parser n
bounded Word16
1 Word16
256
ParsecT Void Text Identity (Word16 -> Integer -> Reader)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity (Word16 -> Integer -> Reader)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token Text
':'
ParsecT Void Text Identity (Word16 -> Integer -> Reader)
-> ParsecT Void Text Identity Word16
-> ParsecT Void Text Identity (Integer -> Reader)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Word16 -> Word16 -> ParsecT Void Text Identity Word16
forall n. (Ord n, Integral n) => n -> n -> Parser n
bounded Word16
1 Word16
256
ParsecT Void Text Identity (Integer -> Reader)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity (Integer -> Reader)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token Text
':'
ParsecT Void Text Identity (Integer -> Reader)
-> ParsecT Void Text Identity Integer
-> ParsecT Void Text Identity Reader
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Integer -> Integer -> ParsecT Void Text Identity Integer
forall n. (Ord n, Integral n) => n -> n -> Parser n
bounded Integer
1 Integer
maxDataSize
makeReader :: AESKey128 -> B.ByteString -> Word16 -> Word16 -> Integer -> Reader
makeReader :: AESKey128 -> ByteString -> Word16 -> Word16 -> Integer -> Reader
makeReader AESKey128
readKey ByteString
fingerprint Word16
required Word16
total Integer
size =
AESKey128 -> Verifier -> Reader
Reader AESKey128
readKey (AESKey128 -> ByteString -> Word16 -> Word16 -> Integer -> Verifier
deriveVerifier AESKey128
readKey ByteString
fingerprint Word16
required Word16
total Integer
size)
deriveVerifier ::
AESKey128 ->
B.ByteString ->
Word16 ->
Word16 ->
Integer ->
Verifier
deriveVerifier :: AESKey128 -> ByteString -> Word16 -> Word16 -> Integer -> Verifier
deriveVerifier = ByteString -> ByteString -> Word16 -> Word16 -> Integer -> Verifier
Verifier (ByteString
-> ByteString -> Word16 -> Word16 -> Integer -> Verifier)
-> (AESKey128 -> ByteString)
-> AESKey128
-> ByteString
-> Word16
-> Word16
-> Integer
-> Verifier
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AESKey128 -> ByteString
storageIndexHash
pBase32 ::
[Char] ->
Word16 ->
Parser B.ByteString
pBase32 :: String -> Word16 -> ParsecT Void Text Identity ByteString
pBase32 String
alpha Word16
bits = do
Text
b32Text <- ParsecT Void Text Identity Text
pBase32Text
(Text -> ParsecT Void Text Identity ByteString)
-> (ByteString -> ParsecT Void Text Identity ByteString)
-> Either Text ByteString
-> ParsecT Void Text Identity ByteString
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Set (ErrorFancy Void) -> ParsecT Void Text Identity ByteString
forall e s (m :: * -> *) a.
MonadParsec e s m =>
Set (ErrorFancy e) -> m a
fancyFailure (Set (ErrorFancy Void) -> ParsecT Void Text Identity ByteString)
-> (Text -> Set (ErrorFancy Void))
-> Text
-> ParsecT Void Text Identity ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ErrorFancy Void -> Set (ErrorFancy Void)
forall a. a -> Set a
Set.singleton (ErrorFancy Void -> Set (ErrorFancy Void))
-> (Text -> ErrorFancy Void) -> Text -> Set (ErrorFancy Void)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ErrorFancy Void
forall e. String -> ErrorFancy e
ErrorFail (String -> ErrorFancy Void)
-> (Text -> String) -> Text -> ErrorFancy Void
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack) ByteString -> ParsecT Void Text Identity ByteString
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> Either Text ByteString
decodeBase32Text Text
b32Text)
where
decodeBase32Text :: Text -> Either Text ByteString
decodeBase32Text = ByteString -> Either Text ByteString
B.decodeBase32Unpadded (ByteString -> Either Text ByteString)
-> (Text -> ByteString) -> Text -> Either Text ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8
pBase32Text :: ParsecT Void Text Identity Text
pBase32Text = Text -> Char -> Text
T.snoc (Text -> Char -> Text)
-> ParsecT Void Text Identity Text
-> ParsecT Void Text Identity (Char -> Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void Text Identity Text
stem ParsecT Void Text Identity (Char -> Text)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Text
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT Void Text Identity Char
trailer
(Word16
full, Word16
extra) = Word16
bits Word16 -> Word16 -> (Word16, Word16)
forall a. Integral a => a -> a -> (a, a)
`divMod` Word16
5
stem :: Parser T.Text
stem :: ParsecT Void Text Identity Text
stem = String -> Text
T.pack (String -> Text)
-> ParsecT Void Text Identity String
-> ParsecT Void Text Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String
forall (m :: * -> *) a. Monad m => Int -> m a -> m [a]
count (Word16 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
full) ([Token Text] -> ParsecT Void Text Identity (Token Text)
forall (f :: * -> *) e s (m :: * -> *).
(Foldable f, MonadParsec e s m) =>
f (Token s) -> m (Token s)
oneOf String
[Token Text]
alpha)
trailer :: Parser Char
trailer :: ParsecT Void Text Identity Char
trailer = [Token Text] -> ParsecT Void Text Identity (Token Text)
forall (f :: * -> *) e s (m :: * -> *).
(Foldable f, MonadParsec e s m) =>
f (Token s) -> m (Token s)
oneOf ([Token Text] -> ParsecT Void Text Identity (Token Text))
-> [Token Text] -> ParsecT Void Text Identity (Token Text)
forall a b. (a -> b) -> a -> b
$ String -> Word16 -> String
trailingChars String
alpha Word16
extra
trailingChars :: [Char] -> Word16 -> [Char]
trailingChars :: String -> Word16 -> String
trailingChars String
alpha' Word16
_ = String
alpha'
rfc3548Alphabet :: [Char]
rfc3548Alphabet :: String
rfc3548Alphabet = String
"abcdefghijklmnopqrstuvwxyz234567"