domain-auth-0.2.4: Domain authentication library
Safe HaskellSafe-Inferred
LanguageHaskell2010

Network.DomainAuth.DKIM

Description

A library for DKIM (http://www.ietf.org/rfc/rfc6376.txt). Currently, only receiver side is implemented.

Synopsis

Documentation

Authentication with DKIM

runDKIM :: Resolver -> Mail -> IO DAResult Source #

Verifying Mail with DKIM.

>>> rs <- makeResolvSeed defaultResolvConf
>>> :{
let lst = ["DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;"
          ,"        d=gmail.com; s=20230601; t=1712195651; x=1712800451; darn=iij.ad.jp;"
          ,"        h=to:subject:message-id:date:from:mime-version:from:to:cc:subject"
          ,"         :date:message-id:reply-to;"
          ,"        bh=g3zLYH4xKxcPrHOD18z9YfpQcnk/GaJedfustWU5uGs=;"
          ,"        b=YXB6AlsJFBYK+32OfzPKYoRHVHL/L01KgEV9YIxIiyF2LiLMgGlIdQdTnFnKKgaOKN"
          ,"         EX/233mgKR3Vn4I9yTdlgli6d5Eni4XU064hJ4b4Xm+/AuiW67LiuZlDkQIHSOXYg7y9"
          ,"         PiBPz5+5FQL2w/svoty7mYkUh59xWmbUCZXXUYoXA+MSnyNvV187TYlx/L6CWeb3Tc4E"
          ,"         EX/DEROnzKST/O0LVrnYzqJWv/H0NTytA+JxE1dT/1/ObHkHWqb/ip4DxPlE6KB2ycOu"
          ,"         vhtPyambWkKEsEtR5UTMcMweVc2qsdFciqupFAYIcJIopFyL4rxai8E32q6V1hZmpdzr"
          ,"         uW/Q=="
          ,"To: kazu@iij.ad.jp"
          ,"Subject: test"
          ,"Message-ID: <CAKipW39hxTzXh28waC4fuu=qVFfy9EF=H8zH_k8wgM9RBR6_dg@mail.gmail.com>"
          ,"Date: Thu, 4 Apr 2024 10:53:59 +0900"
          ,"From: Kazu Yamamoto <kazu.yamamoto@gmail.com>"
          ,"MIME-Version: 1.0"
          ,"Content-Type: text/plain; charset=\"UTF-8\""
          ,""
          ,"test"
          ]
    mail = getMail $ BS8.intercalate "\r\n" lst
in withResolver rs $ \rslv -> runDKIM rslv mail
:}
pass

runDKIM' :: Resolver -> Mail -> DKIM -> IO DAResult Source #

Verifying Mail with DKIM. The value of DKIM-Signature: should be parsed beforehand.

Parsing DKIM-Signature:

parseDKIM :: RawFieldValue -> Maybe DKIM Source #

Parsing DKIM-Signature:.

>>> :{
let dkim = BS8.concat [
                  "v=1; a=rsa-sha256; s=brisbane; d=example.com;\n"
                , "         c=relaxed/simple; q=dns/txt; i=joe@football.example.com;\n"
                , "         h=Received : From : To : Subject : Date : Message-ID;\n"
                , "         bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;\n"
                , "         b=AuUoFEfDxTDkHlLXSZEpZj79LICEps6eda7W3deTVFOk4yAUoqOB\n"
                , "           4nujc7YopdG5dWLSdNg6xNAZpOPr+kHxt1IrE+NahM6L/LbvaHut\n"
                , "           KVdkLLkpVaVVQPzeRDI009SO2Il5Lu7rDNH6mZckBdrIx0orEtZV\n"
                , "           4bmp/YzhwvcubU4=;"
                ]
in pPrintNoColor $ parseDKIM dkim
:}
Just
    ( DKIM
        { dkimVersion = "1"
        , dkimSigAlgo = RSA_SHA256
        , dkimSignature = "AuUoFEfDxTDkHlLXSZEpZj79LICEps6eda7W3deTVFOk4yAUoqOB4nujc7YopdG5dWLSdNg6xNAZpOPr+kHxt1IrE+NahM6L/LbvaHutKVdkLLkpVaVVQPzeRDI009SO2Il5Lu7rDNH6mZckBdrIx0orEtZV4bmp/YzhwvcubU4="
        , dkimBodyHash = "2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8="
        , dkimHeaderCanon = DKIM_RELAXED
        , dkimBodyCanon = DKIM_SIMPLE
        , dkimDomain0 = "example.com"
        , dkimFields =
            [ "received"
            , "from"
            , "to"
            , "subject"
            , "date"
            , "message-id"
            ]
        , dkimLength = Nothing
        , dkimSelector0 = "brisbane"
        }
    )
>>> :{
let dkim = BS8.concat [
                 "v=1; a=rsa-sha256; s=brisbane; d=example.com;\n"
               , "         q=dns/txt; i=joe@football.example.com;\n"
               , "         h=Received : From : To : Subject : Date : Message-ID;\n"
               , "         bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;\n"
               , "         b=AuUoFEfDxTDkHlLXSZEpZj79LICEps6eda7W3deTVFOk4yAUoqOB\n"
               , "           4nujc7YopdG5dWLSdNg6xNAZpOPr+kHxt1IrE+NahM6L/LbvaHut\n"
               , "           KVdkLLkpVaVVQPzeRDI009SO2Il5Lu7rDNH6mZckBdrIx0orEtZV\n"
               , "           4bmp/YzhwvcubU4=;"
               ]
in pPrintNoColor $ parseDKIM dkim
:}
Just
    ( DKIM
        { dkimVersion = "1"
        , dkimSigAlgo = RSA_SHA256
        , dkimSignature = "AuUoFEfDxTDkHlLXSZEpZj79LICEps6eda7W3deTVFOk4yAUoqOB4nujc7YopdG5dWLSdNg6xNAZpOPr+kHxt1IrE+NahM6L/LbvaHutKVdkLLkpVaVVQPzeRDI009SO2Il5Lu7rDNH6mZckBdrIx0orEtZV4bmp/YzhwvcubU4="
        , dkimBodyHash = "2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8="
        , dkimHeaderCanon = DKIM_SIMPLE
        , dkimBodyCanon = DKIM_SIMPLE
        , dkimDomain0 = "example.com"
        , dkimFields =
            [ "received"
            , "from"
            , "to"
            , "subject"
            , "date"
            , "message-id"
            ]
        , dkimLength = Nothing
        , dkimSelector0 = "brisbane"
        }
    )

data DKIM Source #

Instances

Instances details
Show DKIM Source # 
Instance details

Defined in Network.DomainAuth.DKIM.Types

Methods

showsPrec :: Int -> DKIM -> ShowS #

show :: DKIM -> String #

showList :: [DKIM] -> ShowS #

Eq DKIM Source # 
Instance details

Defined in Network.DomainAuth.DKIM.Types

Methods

(==) :: DKIM -> DKIM -> Bool #

(/=) :: DKIM -> DKIM -> Bool #

dkimDomain :: DKIM -> Domain Source #

Getting of the value of the "d" tag in DKIM-Signature:.

dkimSelector :: DKIM -> ByteString Source #

Getting of the value of the "s" tag in DKIM-Signature:.

Field key for DKIM-Signature:

dkimFieldKey :: CanonFieldKey Source #

Canonicalized key for DKIM-Signature:.