acme-not-a-joke-0.1.0.0: src/Acme/NotAJoke/Api/Validation.hs
-- | Helper to build a ValidationProof out of some token
module Acme.NotAJoke.Api.Validation where
import Control.Lens hiding ((.=))
import Data.Coerce (coerce)
import Data.Text (Text)
import qualified Data.Text.Encoding as Encoding
import qualified Crypto.JOSE.JWK as JWK
import Acme.NotAJoke.Api.Challenge
-- | RFC-defined key authorizations.
newtype KeyAuthorization = KeyAuthorization Text
deriving (Eq, Ord)
keyAuthorization :: Token -> JWK.JWK -> KeyAuthorization
keyAuthorization tok jwk =
KeyAuthorization txt
where
txt, tok', b64thumbprint :: Text
txt = tok' <> "." <> b64thumbprint
tok' = coerce tok
b64thumbprint = Encoding.decodeUtf8 $ review (JWK.base64url . JWK.digest) tprint
tprint :: JWK.Digest JWK.SHA256
tprint = view JWK.thumbprint jwk
newtype ValidationProof = ValidationProof Text
deriving (Eq)
sha256digest :: KeyAuthorization -> ValidationProof
sha256digest (KeyAuthorization kauth) =
ValidationProof $
Encoding.decodeUtf8 $
review
(JWK.base64url . JWK.digest)
hash
where
hash :: JWK.Digest JWK.SHA256
hash = JWK.hash $ Encoding.encodeUtf8 kauth