#U      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTSafeU&Replaces multiple WPSs to a single SP.Vblines "foo\r\n\r\nbar\r\nbaz"["foo","","bar","baz"]blines "foo\r\n"["foo"]%WXYZ[\]^_`aUbcdefgVhijklmnopqrstuvwxy%WXYZ[\]^_`aUbcdefgVhijklmnopqrstuvwxy%WXYZ[\]^_`aUbcdefgVhijklmnopqrstuvwxySafeBThe result of domain authentication. For more information, see  #http://www.ietf.org/rfc/rfc5451.txt.     Nonez{|}~z{|}~z{|}~ None None NoneLimit for SPF authentication.5How many "redirect"/"include" should be followed. & is returned if reached to this limit.;Ignoring IPv4 range whose mask length is shorter than this.;Ignoring IPv6 range whose mask length is shorter than this."Whether or not "+all" is rejected.Default value for . defaultLimitPLimit {limit = 10, ipv4_masklen = 16, ipv6_masklen = 48, reject_plus_all = True} NoneProcess SPF authentication. ) is an IP address of an SMTP peer. If I is specified from SMTP MAIL FROM, authentication is based on SPF. If r is specified from the From field of mail header, authentication is based on SenderID. If condition reaches ,  SpfPermError is returned.&rs <- makeResolvSeed defaultResolvConfpass (IPv4 & IPv6):NwithResolver rs $ \rslv -> runSPF defaultLimit rslv "mew.org" "210.130.207.72"pass[withResolver rs $ \rslv -> runSPF defaultLimit rslv "iij.ad.jp" "2001:240:bb42:8010::1:126"pass hardfail:MwithResolver rs $ \rslv -> runSPF defaultLimit rslv "example.org" "192.0.2.1"hardfailredirect and include:MwithResolver rs $ \rslv -> runSPF defaultLimit rslv "gmail.com" "72.14.192.1"passMwithResolver rs $ \rslv -> runSPF defaultLimit rslv "gmail.com" "72.14.128.1"softfaillimit:/let limit1 = defaultLimit { ipv4_masklen = 24 }GwithResolver rs $ \rslv -> runSPF limit1 rslv "gmail.com" "72.14.192.1"softfail'let limit2 = defaultLimit { limit = 2 }HwithResolver rs $ \rslv -> runSPF limit2 rslv "nifty.com" "202.248.88.1" permerror Safe SafejP.parseOnly structured "From: Kazu Yamamoto (=?iso-2022-jp?B?GyRCOzNLXE9CSScbKEI=?=)\n <kazu@example.net>"KRight ["From",":","Kazu","Yamamoto","<","kazu","@","example",".","net",">"]P.parseOnly structured "To:A Group(Some people)\n :Chris Jones <c@(Chris's host.)public.example>,\n joe@example.org,\n John <jdoe@one.test> (my dear friend); (the end of the group)\n"Right ["To",":","A","Group",":","Chris","Jones","<","c","@","public",".","example",">",",","joe","@","example",".","org",",","John","<","jdoe","@","one",".","test",">",";"]P.parseOnly structured "Date: Thu,\n 13\n Feb\n 1969\n 23:32\n -0330 (Newfoundland Time)\n"DRight ["Date",":","Thu",",","13","Feb","1969","23",":","32","-0330"]_P.parseOnly structured "From: Pete(A nice \\) chap) <pete(his account)@silly.test(his host)>\n"?Right ["From",":","Pete","<","pete","@","silly",".","test",">"]Safe 'Type for body of parsed e-mail message..Type for field value of parsed e-mail message.,Type for field key of parsed e-mail message.:Type for canonicalized field key of parsed e-mail message.%Field type for parsed e-mail message."&Header type for parsed e-mail message.#Type for parsed e-mail message.'"Body chunk for raw e-mail message.(#Field value for raw e-mail message.)!Field key for raw e-mail message.*Type for raw e-mail message.,Canonicalizing  for search. !"#$%&'()*+, !"#$%&'()*+, !"#$%&'()*+,Safe-0Type for temporary data to parse e-mail message.1Initial value for -.28Storing field key and field value to the temporary data.3)Storing body chunk to the temporary data.4 Converting - to #.-./01234-./01234-./01234Safe5Obtain # from a file.6Obtain # from *.flet out1 = finalizeMail $ pushBody "body" $ pushField "to" "val" $ pushField "from" "val" initialXMail,getMail "from: val\nto: val\n\nbody" == out1Trueklet out2 = finalizeMail $ pushBody "body" $ pushField "to" "val" $ pushField "from" "val\tval" initialXMail1getMail "from: val\tval\nto: val\n\nbody" == out2Trueblet out3 = finalizeMail $ pushBody "" $ pushField "to" "val" $ pushField "from" "val" initialXMail&getMail "from: val\nto: val\n" == out3True7!Parsing field value of tag=value.<parseTaggedValue " k = rsa ; p= MIGfMA0G; n=A 1024 bit key;"2[("k","rsa"),("p","MIGfMA0G"),("n","A1024bitkey")]AparseTaggedValue " k = \nrsa ;\n p= MIGfMA0G;\n n=A 1024 bit key"2[("k","rsa"),("p","MIGfMA0G"),("n","A1024bitkey")] 567567 567Safe 8 Looking up  from " with .9Obtaining the  of  and all fields under .:Obtaining all fields under .;)Obtaining all fields with DKIM algorithm.<#Obtaining folded (raw) field value.=/Obtaining unfolded (removing CRLF) field value.>Obtaining body.?0Obtaining body with a canonicalization function.@Removing trailing empty lines. 89:;<=>?@ 89:;<=>?@ 89:;<=>?@Safe( !"#$%&'()*+,-./0123456789:;<=>?@(*)('#$%&" !,56-./0123489:;<=+>?@7NoneA0Extract a domain from a value of a header field.5extractDomain "Alice Brown <alice.brown@example.com>"Just "example.com"KextractDomain "\"Alice . Brown\" <alice.brown@example.com> (Nickname here)"Just "example.com"'extractDomain "alice.brown@example.com"Just "example.com")extractDomain "Alice Brown <example.com>"NothingAAANoneB_Abstract type for context to decide PRD(purported responsible domain) according to RFC 4407.CInitial context of PRD.D8Pushing a field key and its value in to the PRD context.E"Deciding PRD from the RPD context.%let maddr1 = "alice@alice.example.jp"!let maddr2 = "bob@bob.example.jp"%let maddr3 = "chris@chris.example.jp"#let maddr4 = "dave@dave.example.jp">decidePRD (pushPRD "from" "alice@alice.example.jp" initialPRD)Just "alice.example.jp":{ decidePRD (pushPRD "from" maddr1, $ pushPRD "from" maddr1 initialPRD):}Nothing:{"decidePRD (pushPRD "sender" maddr2 $ pushPRD "from" maddr1, $ pushPRD "from" maddr1 initialPRD):}Just "bob.example.jp":{"decidePRD (pushPRD "sender" maddr2" $ pushPRD "sender" maddr2 $ pushPRD "from" maddr1, $ pushPRD "from" maddr1 initialPRD):}Nothing:{'decidePRD (pushPRD "resent-from" maddr3" $ pushPRD "sender" maddr2" $ pushPRD "sender" maddr2 $ pushPRD "from" maddr1, $ pushPRD "from" maddr1 initialPRD):}Just "chris.example.jp":{)decidePRD (pushPRD "resent-sender" maddr4( $ pushPRD "resent-from" maddr3# $ pushPRD "sender" maddr2# $ pushPRD "sender" maddr2! $ pushPRD "from" maddr1- $ pushPRD "from" maddr1 initialPRD):}Just "dave.example.jp":{)decidePRD (pushPRD "resent-sender" maddr4' $ pushPRD "resent-from" maddr3" $ pushPRD "sender" maddr2% $ pushPRD "received" "dummy", $ pushPRD "from" maddr1 initialPRD):}Just "dave.example.jp":{)decidePRD (pushPRD "resent-sender" maddr4% $ pushPRD "received" "dummy"' $ pushPRD "resent-from" maddr3" $ pushPRD "sender" maddr2, $ pushPRD "from" maddr1 initialPRD):}Just "chris.example.jp":{%decidePRD (pushPRD "received" "dummy"* $ pushPRD "resent-sender" maddr4( $ pushPRD "resent-from" maddr3# $ pushPRD "sender" maddr2- $ pushPRD "from" maddr1 initialPRD):}Just "dave.example.jp"F/Taking the value of From: from the RPD context.?decideFrom (pushPRD "from" "alice@alice.example.jp" initialPRD)Just "alice.example.jp"BCDEFBCDEF BCDEFNoneABCDEFBCDEFANoneLooking up an RSA public key.rs <- DNS.makeResolvSeed DNS.defaultResolvConfQwithResolver rs $ \rslv -> lookupPublicKey rslv "dk200510._domainkey.yahoo.co.jp"xJust (PublicKey {public_size = 128, public_n = 124495277115430906234131617223399742059624761592171426860362133400468320289284068350453787798555522712914036293436636386707903510390018044090096883314714401752103035965668114514933570840775088208966674120428191313530595210688523478828022953238411688594634270571841869051696953556782155414877029327479844990933, public_e = 65537})OwithResolver rs $ \rslv -> lookupPublicKey rslv "20161025._domainkey.gmail.com"Just (PublicKey {public_size = 256, public_n = 24002918530496096406691035681124918576525139397315303508411989678485471042094243709057313703002506577481962009015943359911855470236184740304869372300375695346466126498491672986773463137306714366250125164042667360646066116764211863426455899157774209331432246892273100824803003088472583507901403747123280231573655315087668569169140244507741538460717772392364103610973022227332742456151275783849571119048507254523999452581754451573432729267867937880516609319975372273089173378196646435625090021348583100824870283641053888848697729241628460935831026221013673635926904278136940569963717548356154570137751386534390787055991, public_e = 65537})NoneH&Canonicalized key for DKIM-Signature:.I7Getting of the value of the "d" tag in DKIM-Signature:.J7Getting of the value of the "s" tag in DKIM-Signature:.GHIJGHIJG HIJNoneKParsing DKIM-Signature:.:{!let dkim = BS8.concat [C "v=1; a=rsa-sha256; s=brisbane; d=example.com;\n"W , " c=relaxed/simple; q=dns/txt; i=joe@football.example.com;\n"T , " h=Received : From : To : Subject : Date : Message-ID;\n"O , " bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;\n"U , " b=AuUoFEfDxTDkHlLXSZEpZj79LICEps6eda7W3deTVFOk4yAUoqOB\n"U , " 4nujc7YopdG5dWLSdNg6xNAZpOPr+kHxt1IrE+NahM6L/LbvaHut\n"U , " KVdkLLkpVaVVQPzeRDI009SO2Il5Lu7rDNH6mZckBdrIx0orEtZV\n"0 , " 4bmp/YzhwvcubU4=;" ]!in pPrintNoColor $ parseDKIM dkim:}Just ( DKIM  { dkimVersion = "1"" , dkimSigAlgo = RSA_SHA256 , dkimSignature = "AuUoFEfDxTDkHlLXSZEpZj79LICEps6eda7W3deTVFOk4yAUoqOB4nujc7YopdG5dWLSdNg6xNAZpOPr+kHxt1IrE+NahM6L/LbvaHutKVdkLLkpVaVVQPzeRDI009SO2Il5Lu7rDNH6mZckBdrIx0orEtZV4bmp/YzhwvcubU4="G , 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 [B "v=1; a=rsa-sha256; s=brisbane; d=example.com;\n"D , " q=dns/txt; i=joe@football.example.com;\n"S , " h=Received : From : To : Subject : Date : Message-ID;\n"N , " bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;\n"T , " b=AuUoFEfDxTDkHlLXSZEpZj79LICEps6eda7W3deTVFOk4yAUoqOB\n"T , " 4nujc7YopdG5dWLSdNg6xNAZpOPr+kHxt1IrE+NahM6L/LbvaHut\n"T , " KVdkLLkpVaVVQPzeRDI009SO2Il5Lu7rDNH6mZckBdrIx0orEtZV\n"/ , " 4bmp/YzhwvcubU4=;" ]!in pPrintNoColor $ parseDKIM dkim:}Just ( DKIM  { dkimVersion = "1"" , dkimSigAlgo = RSA_SHA256 , dkimSignature = "AuUoFEfDxTDkHlLXSZEpZj79LICEps6eda7W3deTVFOk4yAUoqOB4nujc7YopdG5dWLSdNg6xNAZpOPr+kHxt1IrE+NahM6L/LbvaHutKVdkLLkpVaVVQPzeRDI009SO2Il5Lu7rDNH6mZckBdrIx0orEtZV4bmp/YzhwvcubU4="G , dkimBodyHash = "2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8="' , dkimHeaderCanon = DKIM_SIMPLE% , dkimBodyCanon = DKIM_SIMPLE% , dkimDomain0 = "example.com" , dkimFields =  [ "received" , "from" , "to" , "subject" , "date" , "message-id" ]  , dkimLength = Nothing$ , dkimSelector0 = "brisbane" }  )  K   K   K   SaferemoveBtagValue "DKIM-Signature: a=rsa-sha256; d=example.net; s=brisbane;\n c=simple; q=dns/txt; i=@eng.example.net;\n t=1117574938; x=1118006938;\n h=from:to:subject:date;\n z=From:foo@eng.example.net|To:joe@example.com|\n Subject:demo=20run|Date:July=205,=202005=203:44:08=20PM=20-0700;\n bh=MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=;\n b=dzdVyOfAKCdLXdJOc9G2q8LoXSlEniSbav+yuU4zGeeruD00lszZ\n VoG4ZHRNiYzR;\n"\"DKIM-Signature: a=rsa-sha256; d=example.net; s=brisbane;\n c=simple; q=dns/txt; i=@eng.example.net;\n t=1117574938; x=1118006938;\n h=from:to:subject:date;\n z=From:foo@eng.example.net|To:joe@example.com|\n Subject:demo=20run|Date:July=205,=202005=203:44:08=20PM=20-0700;\n bh=MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=;\n b=;\n"NoneNoneL Verifying # with DKIM.&rs <- makeResolvSeed defaultResolvConf:{Blet lst = ["DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;"- ," d=gmail.com; s=20161025;"D ," h=mime-version:from:date:message-id:subject:to;"E ," bh=IQB23UrpTWE7dPV0Ebeqy3ZJyCILT/tw2Ixhmh83FJ0=;"Y ," b=BCZrZwEnJfrdbbNqM+bWHeDrdHKvc6DvjafGCDndUUkHPbfVvvx2RTYfkC3LT1uCZC"Z ," 7vzKmucESLK5PVh4mAGNQjHDmdvhq7GIubOVK8Uoq+MpjZ321SwNI7rck/uLq512bfvO"Z ," NU9nYcUGNIKh+rho6V8XHX/REsfE+a8jGUvywZgV5IoORfTvejEluuy360PN0rAjSmi3"Z ," j5WRFV7XR5pCzAN78hmsUaTzf8zdwQwIlSsnUylnlRmc97xU5Ou3VBzxBV+ScXZsX5jI"Z ," TNv+ujuZcoO0fS0zm7UwmcOzXb01cQpBDqHK8cBvEdQ4+8LSx/Nf1UaOBrecw6GiwN23" ," BFBg==" ,"MIME-Version: 1.0"W ,"Received: by 10.37.15.133 with HTTP; Wed, 20 Sep 2017 01:19:02 -0700 (PDT)": ,"From: Kazu Yamamoto <kazu.yamamoto@gmail.com>"2 ,"Date: Wed, 20 Sep 2017 17:19:02 +0900"] ,"Message-ID: <CAKipW39GqeTzzQzB6WhM86_P==xTHwioa5gE=wZZ96fzf1j3Vw@mail.gmail.com>"# ,"Subject: test for DKIM"/ ,"To: Kazu Yamamoto <kazu@iij.ad.jp>"8 ,"Content-Type: text/plain; charset=\"UTF-8\"" ,"" ,"this is test." ,"" ]/ mail = getMail $ BS8.intercalate "\r\n" lst/in withResolver rs $ \rslv -> runDKIM rslv mail:}passM Verifying #H with DKIM. The value of DKIM-Signature: should be parsed beforehand.LMGHIJKLMLMKGIJHLMNoneN&Abstract type for DomainKey-Signature:O+Canonicalized key for DomainKey-Signature:.P<Getting of the value of the "d" tag in DomainKey-Signature:.Q<Getting of the value of the "s" tag in DomainKey-Signature:.N !"#$%&'()*+,OPQN !"#$%&'()*+,OPQN !"#$%&'()*+,OPQNone-./012-2-./012NoneRParsing DomainKey-Signature:.:{let dk = BS8.concat [C "a=rsa-sha1; s=brisbane; d=football.example.com;\n"& , " c=simple; q=dns;\n"L , " b=dzdVyOfAKCdLXdJOc9G2q8LoXSlEniSbav+yuU4zGeeruD00lszZ\n"# , " VoG4ZHRNiYzR;" ]in pPrintNoColor $ parseDK dk:}Just ( DK # { dkAlgorithm = DK_RSA_SHA1Z , dkSignature = "dzdVyOfAKCdLXdJOc9G2q8LoXSlEniSbav+yuU4zGeeruD00lszZVoG4ZHRNiYzR"! , dkCanonAlgo = DK_SIMPLE, , dkDomain0 = "football.example.com" , dkFields = Nothing" , dkSelector0 = "brisbane" }  )3456789:;R<=>?@ABCR 3456789:;R<=>?@ABCNoneS Verifying # with DomainKeys.T Verifying #S with DomainKeys. The value of DomainKey-Signature: should be parsed beforehand.STNOPQRSTSTRNPQOSTNoneQ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTD !"#$%&'()*+,- . . / 0 1 2 34567899:;<=>>?@ABCDEFGGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~   [`      !"#$%&'()*+,-./0123456789g:;<=>?@ABCDEFGHIJKLMMNOPQRSTUVWXYZ[\(domain-auth-0.2.2-C7Elermh6k1JnVDpAMHl9cNetwork.DomainAuth.TypesNetwork.DomainAuth.SPFNetwork.DomainAuth.MailNetwork.DomainAuth.PRDNetwork.DomainAuth.DKIMNetwork.DomainAuth.DKNetwork.DomainAuth.UtilsNetwork.DomainAuth.SPF.TypesNetwork.DomainAuth.SPF.ParserNetwork.DomainAuth.SPF.ResolverNetwork.DomainAuth.SPF.Eval Network.DomainAuth.Pubkey.Base64Network.DomainAuth.PRD.LexerNetwork.DomainAuth.Mail.TypesNetwork.DomainAuth.Mail.XMailNetwork.DomainAuth.Mail.ParserNetwork.DomainAuth.Mail.MailNetwork.DomainAuth.PRD.DomainNetwork.DomainAuth.PRD.PRD Network.DomainAuth.Pubkey.RSAPubNetwork.DomainAuth.DKIM.TypesNetwork.DomainAuth.DKIM.ParserNetwork.DomainAuth.DKIM.BtagNetwork.DomainAuth.DKIM.VerifyNetwork.DomainAuth.DK.TypesNetwork.DomainAuth.DK.VerifyNetwork.DomainAuth.DK.ParserNetwork.DomainAuthDAResultDAPass DAHardFail DASoftFail DANeutralDAFail DATempError DAPermErrorDANoneDAPolicy DANxDomain DADiscard DAUnknown$fShowDAResult $fEqDAResult$fEnumDAResult$fBoundedDAResultLimitlimit ipv4_masklen ipv6_masklenreject_plus_all defaultLimitrunSPFBody FieldValueFieldKey CanonFieldKeyFieldfieldSearchKeyfieldKey fieldValueHeaderMail mailHeadermailBody RawBodyChunk RawFieldValue RawFieldKeyRawMailisEmptycanonicalizeKeyXMail xmailHeader xmailBody initialXMail pushFieldpushBody finalizeMailreadMailgetMailparseTaggedValue lookupField fieldsFrom fieldsAfter fieldsWithfieldValueFoldedfieldValueUnfoldedfromBody fromBodyWithremoveTrailingEmptyLine extractDomainPRD initialPRDpushPRD decidePRD decideFromDKIM dkimFieldKey dkimDomain dkimSelector parseDKIMrunDKIMrunDKIM'DK dkFieldKeydkDomain dkSelectorparseDKrunDKrunDK' reduceWSPblinesCook FWSRemovercrlf+++empty!!! appendCRLF appendCRLF'appendCRLFWith concatCRLFconcatCRLFWithinSPoutSP removeFWSremoveTrailingWSPhasTrailingWSPchopbreak' isAlphaNumisDigitisUpperisLowerisSpacecCRcLFcSPcTBcPluscSlashcEqualcSmallAcAcZerocColon cSemiColonSpfSeqSS_All SS_IPv4Range SS_IPv6Range SS_IPv4Ranges SS_IPv6Ranges SS_IF_Pass SS_SpfSeqSPF SPF_IPv4Range SPF_IPv6Range SPF_AddressSPF_MX SPF_IncludeSPF_All SPF_Redirect QualifierQ_Pass Q_HardFail Q_Softfail Q_NeutralqualifierSymbol DirectiveparseSPFspaces1spf spfPrefixmodifier directive qualifier mechanismip4ip6alladdressmxincludedomainoptionalDomainmask optionalMaskipv4Maskipv6Mask resolveSPFfilterSPFWithIP exceptIPv4 exceptIPv6toSpfSeqdoit4doit6checkDNSevalSPFevalspfeval#iproute-1.7.1-EJjAtfniBUorobFQnk7lR Data.IP.AddrIP!dns-2.0.13-2uf3hdElqXV7TrTTS9EFv5Network.DNS.InternalDomainspfErrorHandleisBase64decodedecode'decdec'dec1'dec2'fromChar structured concatSpaceskipCharskipWspspecialsatom domainLiteralword8inqtextqcontent quotedString quoted_pairctextccontentcomment'commentRawFieldRawBody RawHeadersplitHeaderBodyfindEOH splitFields findFieldEnd begOfLine isContinued parseFieldisKeyOf isNotKeyOf dropWhileRpraFrom praSender praResentFrompraResentSender praHeaderDSTDST_Zero DST_Invalid DST_ValidHDtoMaybepushFrom pushSenderpushResentFrompushResentSender isFirstBlocklookupPublicKeylookupPublicKey' extractPubdecodeRSAPublicyKey dkimVersion dkimSigAlgo dkimSignature dkimBodyHashdkimHeaderCanon dkimBodyCanon dkimDomain0 dkimFields dkimLength dkimSelector0 DkimCanonAlgo DKIM_SIMPLE DKIM_RELAXED DkimSigAlgoRSA_SHA1 RSA_SHA256 DKIMSetterMDKIM mdkimVersion mdkimSigAlgomdkimSignature mdkimBodyHashmdkimHeaderCanonmdkimBodyCanon mdkimDomain mdkimFields mdkimLength mdkimSelector initialMDKIM dkimTagDBsetDkimVersionsetDkimSigAlgosetDkimSignaturesetDkimBodyHashsetDkimCanonAlgo setDkimDomain setDkimFields setDkimLengthsetDkimSelectorremoveBtagValue remBtagValueinFixbtag prepareDKIMcanonDkimField canonDkimBody verifyDKIMverify' hashAlgo2 dkAlgorithm dkSignature dkCanonAlgo dkDomain0dkFields dkSelector0DkFields DkCanonAlgo DK_SIMPLEDK_NOFWS DkAlgorithm DK_RSA_SHA1 prepareDK canonDkHeader canonDkFieldprepareDkHeader canonDkBodyverifyDKDKSetterMDK mdkAlgorithm mdkSignature mdkCanonAlgo mdkDomain mdkFields mdkSelector initialMDKdkTagDBsetDkAlgorithmsetDkSignaturesetDkCanonAlgo setDkDomain setDkFields setDkSelector