diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Revision history for cryptostore
 
+## 0.3.1.0 - 2024-05-05
+
+* Strict validation of GCM/CCM authentication tag length
+
 ## 0.3.0.1 - 2023-06-25
 
 * Add optional flag to use crypton instead of cryptonite
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2018-2023, Olivier Chéron
+Copyright (c) 2018-2024, Olivier Chéron
 
 All rights reserved.
 
diff --git a/cryptostore.cabal b/cryptostore.cabal
--- a/cryptostore.cabal
+++ b/cryptostore.cabal
@@ -1,5 +1,5 @@
 name:                cryptostore
-version:             0.3.0.1
+version:             0.3.1.0
 synopsis:            Serialization of cryptographic data types
 description:         Haskell implementation of PKCS \#8, PKCS \#12 and CMS
                      (Cryptographic Message Syntax).
diff --git a/src/Crypto/Store/CMS/Algorithms.hs b/src/Crypto/Store/CMS/Algorithms.hs
--- a/src/Crypto/Store/CMS/Algorithms.hs
+++ b/src/Crypto/Store/CMS/Algorithms.hs
@@ -1127,14 +1127,16 @@
         Params_AUTH_ENC_128 p   -> checkAuthKey 16 key >> authDecrypt p
         Params_AUTH_ENC_256 p   -> checkAuthKey 32 key >> authDecrypt p
         Params_CHACHA20_POLY1305 iv -> ccpInit key iv aad >>= ccpDecrypt
-        ParamsCCM cipher iv m l -> getAEAD cipher key (AEAD_CCM msglen m l) iv >>= decrypt
-        ParamsGCM cipher iv _   -> getAEAD cipher key AEAD_GCM iv >>= decrypt
+        ParamsCCM cipher iv m l -> getAEAD cipher key (AEAD_CCM msglen m l) iv >>= decrypt (getM m)
+        ParamsGCM cipher iv len -> getAEAD cipher key AEAD_GCM iv >>= decrypt len
   where
     msglen  = B.length bs
     badMac  = Left BadContentMAC
 
-    decrypt :: AEAD a -> Either StoreError ba
-    decrypt aead = maybe badMac Right (aeadSimpleDecrypt aead aad bs expected)
+    decrypt :: Int -> AEAD a -> Either StoreError ba
+    decrypt len aead
+        | B.length (unAuthTag expected) /= len = badMac
+        | otherwise = maybe badMac Right (aeadSimpleDecrypt aead aad bs expected)
 
     ccpDecrypt :: ChaChaPoly1305.State -> Either StoreError ba
     ccpDecrypt state
diff --git a/src/Crypto/Store/CMS/Signed.hs b/src/Crypto/Store/CMS/Signed.hs
--- a/src/Crypto/Store/CMS/Signed.hs
+++ b/src/Crypto/Store/CMS/Signed.hs
@@ -172,12 +172,13 @@
            -> Maybe [Attribute]
            -> [Attribute]
            -> ProducerOfSI m
-certSigner alg priv (CertificateChain chain) sAttrsM uAttrs ct msg =
+certSigner _ _ (CertificateChain []) _ _ _ _ =
+    pure $ Left (InvalidInput "Empty certificate chain")
+certSigner alg priv (CertificateChain chain@(cert:_)) sAttrsM uAttrs ct msg =
     fmap build <$> generate
   where
     md   = digest dig msg
     def  = DigestAlgorithm Crypto.Store.CMS.Algorithms.SHA256
-    cert = head chain
     obj  = signedObject (getSigned cert)
     isn  = IssuerAndSerialNumber (certIssuerDN obj) (certSerial obj)
     pub  = certPubKey obj
diff --git a/src/Crypto/Store/PKCS12.hs b/src/Crypto/Store/PKCS12.hs
--- a/src/Crypto/Store/PKCS12.hs
+++ b/src/Crypto/Store/PKCS12.hs
@@ -670,9 +670,10 @@
                 -> ProtectionPassword
                 -> (X509.CertificateChain, X509.PrivKey)
                 -> Either StoreError PKCS12
-fromCredential' trans algChain algKey pwd (X509.CertificateChain certs, key)
-    | null certs = Left (InvalidInput "Empty certificate chain")
-    | otherwise  = (<>) <$> pkcs12Chain <*> pkcs12Key
+fromCredential' _ _ _ _ (X509.CertificateChain [], _) =
+    Left (InvalidInput "Empty certificate chain")
+fromCredential' trans algChain algKey pwd (X509.CertificateChain certs@(leaf:_), key) =
+    (<>) <$> pkcs12Chain <*> pkcs12Key
   where
     pkcs12Key   = unencrypted <$> scKeyOrError
     pkcs12Chain =
@@ -689,7 +690,7 @@
     wrap shrouded = SafeContents [Bag (PKCS8ShroudedKeyBag shrouded) attrs]
     encodedKey    = encodeASN1Object (FormattedKey PKCS8Format key)
 
-    X509.Fingerprint keyId = X509.getFingerprint (head certs) X509.HashSHA1
+    X509.Fingerprint keyId = X509.getFingerprint leaf X509.HashSHA1
     attrs = trans (setLocalKeyId keyId [])
 
 -- Standard attributes
diff --git a/tests/CMS/Tests.hs b/tests/CMS/Tests.hs
--- a/tests/CMS/Tests.hs
+++ b/tests/CMS/Tests.hs
@@ -230,28 +230,70 @@
 
 authEnvelopedDataTests :: TestTree
 authEnvelopedDataTests =
-    testCaseSteps "AuthEnvelopedData" $ \step -> do
-        cms <- readCMSFile path
-        assertEqual "unexpected parse count" count (length cms)
+    testGroup "AuthEnvelopedData"
+        [ testKT "KTRI" path3
+        , testKA "KARI" path4
+        , test "KEKRI" path1 withRecipientKey
+        ]
+  where test caseName path f = testCaseSteps caseName $ \step -> do
+            cms <- readCMSFile path
+            assertEqual "unexpected parse count" (length keys) (length cms)
 
-        forM_ (zip [0..] cms) $ \(index, ci) -> do
-            step ("testing vector " ++ show (index :: Int))
+            forM_ (zip [0..] cms) $ \(index, ci) -> do
+                let (name, key) = keys !! index
+
+                step ("testing " ++ name)
+                ae <- getAuthEnveloppedAttached ci
+                result <- openAuthEnvelopedData (f key) ae
+                assertRight result (verifyInnerMessage message)
+        testKT caseName path = testCaseSteps caseName $ \step -> do
+            let rsaPath = testFile "rsa-unencrypted-pkcs8.pem"
+            [Unprotected priv] <- readKeyFile rsaPath
+
+            cms <- readCMSFile path
+            assertEqual "unexpected parse count" (length modes * length keys) (length cms)
+
+            let pairs = [ (c, m) | c <- map fst keys, m <- modes ]
+            forM_ (zip pairs cms) $ \((c, m), ci) -> do
+                step ("testing " ++ c ++ " with " ++ m)
+                ae <- getAuthEnveloppedAttached ci
+                result <- openAuthEnvelopedData (withRecipientKeyTrans priv) ae
+                assertRight result (verifyInnerMessage message)
+        testKA caseName path = testCaseSteps caseName $ \step -> do
+            let ecdsaKeyPath  = testFile "ecdsa-p256-unencrypted-pkcs8.pem"
+                ecdsaCertPath = testFile "ecdsa-p256-self-signed-cert.pem"
+            [Unprotected priv] <- readKeyFile ecdsaKeyPath
+            [cert] <- readSignedObject ecdsaCertPath
+
+            cms <- readCMSFile path
+            assertEqual "unexpected parse count" (length mds * length keys) (length cms)
+
+            let pairs = [ (c, h) | c <- map fst keys, h <- mds ]
+            forM_ (zip pairs cms) $ \((c, h), ci) -> do
+                step ("testing " ++ c ++ " with " ++ h)
+                ae <- getAuthEnveloppedAttached ci
+                result <- openAuthEnvelopedData (withRecipientKeyAgree priv cert) ae
+                assertRight result (verifyInnerMessage message)
+        getAuthEnveloppedAttached ci = do
             assertBool "unexpected type" (hasType AuthEnvelopedDataType ci)
             let AuthEnvelopedDataCI aeEncap = ci
-            ae <- getAttached aeEncap
-            result <- openAuthEnvelopedData (withRecipientPassword pwd) ae
-            assertRight result (verifyInnerMessage msg)
-
-            step ("testing encoded vector " ++ show index)
-            let [Just ci'] = pemToContentInfo [] (contentInfoToPEM ci)
-                AuthEnvelopedDataCI aeEncap' = ci'
-            ae' <- getAttached aeEncap'
-            result' <- openAuthEnvelopedData (withRecipientPassword pwd) ae'
-            assertRight result' (verifyInnerMessage msg)
-  where path  = testFile "cms-auth-enveloped-data-rfc6476.pem"
-        pwd   = fromString "password"
-        msg   = fromString "Some test data\NUL"
-        count = 2
+            getAttached aeEncap
+        path1 = testFile "cms-auth-enveloped-kekri-data.pem"
+        path3 = testFile "cms-auth-enveloped-ktri-data.pem"
+        path4 = testFile "cms-auth-enveloped-kari-data.pem"
+        keys  = [ ("AES128_GCM",           testKey 16)
+                , ("AES192_GCM",           testKey 24)
+                , ("AES256_GCM",           testKey 32)
+                ]
+        modes = [ "RSAES-PKCS1"
+                , "RSAES-OAEP"
+                ]
+        mds   = [ "SHA1"
+                , "SHA224"
+                , "SHA256"
+                , "SHA384"
+                , "SHA512"
+                ]
 
 propertyTests :: TestTree
 propertyTests = localOption (QuickCheckMaxSize 5) $ testGroup "properties"
diff --git a/tests/PKCS8/Tests.hs b/tests/PKCS8/Tests.hs
--- a/tests/PKCS8/Tests.hs
+++ b/tests/PKCS8/Tests.hs
@@ -13,8 +13,10 @@
 import Util
 import PKCS8.Instances ()
 
-keyTests :: String -> TestTree
-keyTests prefix =
+data KeyTestType = InnerOuter | OnlyOuter
+
+keyTests :: KeyTestType -> String -> TestTree
+keyTests InnerOuter prefix =
     testGroup "PrivateKey"
         [ testCase "read outer" $ do
               kOuter <- readKeyFile fOuter
@@ -43,6 +45,19 @@
   where
     fInner = testFile (prefix ++ "-unencrypted-trad.pem")
     fOuter = testFile (prefix ++ "-unencrypted-pkcs8.pem")
+keyTests OnlyOuter prefix =
+    testGroup "PrivateKey"
+        [ testCase "read" $ do
+              kOuter <- readKeyFile fOuter
+              length kOuter @?= 1
+        , testCase "write" $ do
+              bs <- B.readFile fOuter
+              let kOuter = readKeyFileFromMemory bs
+                  [Unprotected kO] = kOuter
+              writeKeyFileToMemory PKCS8Format [kO] @?= bs
+        ]
+  where
+    fOuter = testFile (prefix ++ "-unencrypted-pkcs8.pem")
 
 encryptedKeyTests :: String -> TestTree
 encryptedKeyTests prefix =
@@ -72,10 +87,10 @@
                            in all (\(Protected getKey) -> getKey pwd == Right key) kE
                 ]
 
-testType :: TestName -> String -> TestTree
-testType name prefix =
+testType :: TestName -> KeyTestType -> String -> TestTree
+testType name ty prefix =
     testGroup name
-        [ keyTests prefix
+        [ keyTests ty prefix
         , encryptedKeyTests prefix
         ]
 
@@ -93,13 +108,13 @@
 pkcs8Tests :: TestTree
 pkcs8Tests =
     testGroup "PKCS8"
-        [ testType "RSA"                        "rsa"
-        , testType "DSA"                        "dsa"
-        , testType "EC (named curve)"           "ecdsa-p256"
-        , testType "EC (explicit prime curve)"  "ecdsa-epc"
-        , testType "X25519"                     "x25519"
-        , testType "X448"                       "x448"
-        , testType "Ed25519"                    "ed25519"
-        , testType "Ed448"                      "ed448"
+        [ testType "RSA"                        InnerOuter  "rsa"
+        , testType "DSA"                        InnerOuter  "dsa"
+        , testType "EC (named curve)"           InnerOuter  "ecdsa-p256"
+        , testType "EC (explicit prime curve)"  InnerOuter  "ecdsa-epc"
+        , testType "X25519"                     OnlyOuter   "x25519"
+        , testType "X448"                       OnlyOuter   "x448"
+        , testType "Ed25519"                    OnlyOuter   "ed25519"
+        , testType "Ed448"                      OnlyOuter   "ed448"
         , propertyTests
         ]
diff --git a/tests/X509/Tests.hs b/tests/X509/Tests.hs
--- a/tests/X509/Tests.hs
+++ b/tests/X509/Tests.hs
@@ -35,7 +35,7 @@
               writeSignedObjectToMemory objs @?= bs
         , testCase "write public key" $ do
               bs <- B.readFile fKey
-              let key = head (readPubKeyFileFromMemory bs)
+              let (key : _) = readPubKeyFileFromMemory bs
               assertBool "first key differs" $
                   writePubKeyFileToMemory [key] `B.isPrefixOf` bs
         ]
diff --git a/tests/files/cms-auth-enveloped-data-rfc6476.pem b/tests/files/cms-auth-enveloped-data-rfc6476.pem
deleted file mode 100644
--- a/tests/files/cms-auth-enveloped-data-rfc6476.pem
+++ /dev/null
@@ -1,15 +0,0 @@
------BEGIN PKCS7-----
-MIHjBgsqhkiG9w0BCRABF6CB0zCB0AIBADFho18CAQCgGwYJKoZIhvcNAQUMMA4E
-CLfrI6dr0gUWAgITiDAjBgsqhkiG9w0BCRADCTAUBggqhkiG9w0DBwQIZpECRWtz
-u5kEGDCjerXY8odQ7EEEromZJvAurk/j81IrozBSBgkqhkiG9w0BBwEwMwYLKoZI
-hvcNAQkQAw8wJDAUBggqhkiG9w0DBwQI0tCBcU09nxEwDAYIKwYBBQUIAQIFAIAQ
-OsYGYUFdAH0RNc1p4VbKEAQUM2Xo8PMHBoYdqEcsbTodlCFAZH4=
------END PKCS7-----
------BEGIN PKCS7-----
-MIH9BgsqhkiG9w0BCRABF6CB7TCB6gIBADFyo3ACAQCgGwYJKoZIhvcNAQUMMA4E
-COe3h9+CHRLMAgITiDAsBgsqhkiG9w0BCRADCTAdBglghkgBZQMEAQIEEBHZXFIK
-Or8isjBw7/R9bvYEIBg5IifDwiwqpp8qsHckdarYWJzNu0yu0w3Cyx2DlGw3MFsG
-CSqGSIb3DQEHATA8BgsqhkiG9w0BCRADDzAtMB0GCWCGSAFlAwQBAgQQtyUCdoQ8
-WBulMOJAJ+7DBjAMBggrBgEFBQgBAgUAgBCYNg8MeWI2tS0tnhxihR4QBBSIpMGy
-ungbyvkUsOX80Y34AuKyng==
------END PKCS7-----
diff --git a/tests/files/cms-auth-enveloped-kari-data.pem b/tests/files/cms-auth-enveloped-kari-data.pem
new file mode 100644
--- /dev/null
+++ b/tests/files/cms-auth-enveloped-kari-data.pem
@@ -0,0 +1,135 @@
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBwaGBvgIBA6BRoU8wCQYHKoZIzj0CAQNC
+AARLFBy9/eI4x8mR5wpZ774i/LeS8/FzuGegHdAo19bTdzUlv9kd69/0GzRF5ntH
+27ueue5YBRmFOKSRnLiU2mq3MBgGCSuBBRCGSD8AAjALBglghkgBZQMEAQUwTDBK
+MC4wITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4A
+BBjXV1HlxJT+Z8o6n5HC4RNRe7j4sP48HpIwgAYJKoZIhvcNAQcBMB4GCWCGSAFl
+AwQBBjARBAypQxH70WFEpg8UWToCARCggAQO6V6dHzqpE6FXmRa7arIAAAAABBCl
+bbL/+bic+x2r79kZpLsSAAAAAAAA
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBvqGBuwIBA6BRoU8wCQYHKoZIzj0CAQNC
+AASJYlJVbYCr1BOjZpCH5hjLV/2X23Xc0Z5eTI8FBqUXlYHH7d1S/jEGJDfCcvIx
+TV9swOSRFK92I9kSVd9XCN1eMBUGBiuBBAELADALBglghkgBZQMEAQUwTDBKMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABBgE
+Xp5V6/AbK9bFcwjRJ3fm20YWgQ2nBowwgAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQB
+BjARBAyFVoCkD/eJA9YqjI8CARCggAQOpQwAlrBtnityfLYqU2sAAAAABBDLM+53
+Uk0Pn3Y7MZ+Mbn5eAAAAAAAA
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBvqGBuwIBA6BRoU8wCQYHKoZIzj0CAQNC
+AASufl1PpqFUZDuTCXzKMaGerIO5843VUFSwBudjyvovjAHTcGwPJjvS+3EH4NEn
+7o/W7P09hwTSZ/rsBbBJPu+QMBUGBiuBBAELATALBglghkgBZQMEAQUwTDBKMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABBie
+ykbOXeqVMmbDWw3Ehn/QTjMlNs1uCL4wgAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQB
+BjARBAxEc1PrzckaDXBkWjgCARCggAQOuyUnmFAV/xahqSadwG8AAAAABBBi++VJ
+NnU5UVDQ6q1zMRqfAAAAAAAA
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBvqGBuwIBA6BRoU8wCQYHKoZIzj0CAQNC
+AATX8MYoU25w7qYU/CFl+JZdFQ1ePZP2yL+FUJeV76Etegb+eeTl0dG70MIpVP3c
+uABRryMgV3jAniwgDnLDcLCrMBUGBiuBBAELAjALBglghkgBZQMEAQUwTDBKMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABBhe
+7wfppjJXy8UnxeR3KYGpjqhss/Vdb/4wgAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQB
+BjARBAyS8HZXcf5oDpq7XSYCARCggAQON5pXJ2YeE3u0Tu/JggsAAAAABBCDUZMb
+f9iObxa0nURyr2uNAAAAAAAA
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBvqGBuwIBA6BRoU8wCQYHKoZIzj0CAQNC
+AAQ50l98gMx9YTsLyif3Aj6ypa+8auXV415+hA7bgI5aXrY+20tvGbUheWAdCUM/
+DVLWcYhsWEwTEmL6Z5dMrQDCMBUGBiuBBAELAzALBglghkgBZQMEAQUwTDBKMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABBjI
+vXtw3gmmAn/yORO1a/NTTGqgmpOQq+swgAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQB
+BjARBAw/RTlPW3aoaAWpb4ACARCggAQO7kbgLubm2M+hoanfMdkAAAAABBAeQyvO
+tOT7PWNiqKaFTu9HAAAAAAAA
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGByaGBxgIBA6BRoU8wCQYHKoZIzj0CAQNC
+AAS/VBtw4zaTtkAb45PJ8cuAYshMXy/F1lKa3ZA4E6u3np+dfQ+kBT5VrxpegvFj
+Q/NdOxV4CTatDnNo8iH5h2d4MBgGCSuBBRCGSD8AAjALBglghkgBZQMEARkwVDBS
+MC4wITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4A
+BCB5X3DkEOElcCL2KEOiVJKcQpTqQWynlMyWeLe805y4YDCABgkqhkiG9w0BBwEw
+HgYJYIZIAWUDBAEaMBEEDPX7veh9yNKL511dCwIBEKCABA5/r2CzelEUDNFaJtk8
+jQAAAAAEEOWvi2b2dguSk94AjnrFBSAAAAAAAAA=
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBxqGBwwIBA6BRoU8wCQYHKoZIzj0CAQNC
+AAQA3+RNupbspd7hUIQg7vXkrzB01ofr/7s7WuASl0OdzgJ3mBt3a5xtW7IqTE+B
+3Vw9J4mkAa9PLi3Iq9SEkZ5aMBUGBiuBBAELADALBglghkgBZQMEARkwVDBSMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABCDl
+4XWpLmEPvdcqjhnf7xp8sDnDIVZ/eKXxzQ8YU7+avTCABgkqhkiG9w0BBwEwHgYJ
+YIZIAWUDBAEaMBEEDIKxljwkGp/uATZNuQIBEKCABA4JT8FfOkbtIUd9TPivOgAA
+AAAEEOTGxEy5JLrS0+nAg5HtSDEAAAAAAAA=
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBxqGBwwIBA6BRoU8wCQYHKoZIzj0CAQNC
+AARJpGAQMIpwZgHJpg2o1wmxGYoNcgtHEhedsOFLpQdou3G69y0eDgX7nB0tvRt7
+oYZEbgLPk7f4AECFVWSxnby9MBUGBiuBBAELATALBglghkgBZQMEARkwVDBSMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABCD0
+HNfAnxgaNrlr1hC6M6O34Vyq1ZZ7MAInchQ6QjW8/TCABgkqhkiG9w0BBwEwHgYJ
+YIZIAWUDBAEaMBEEDDj5sfWnIjCmTf1y9wIBEKCABA5k60PO+CFkHN/evabZmwAA
+AAAEEJCwak43a0Ga4riBRKY9CNsAAAAAAAA=
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBxqGBwwIBA6BRoU8wCQYHKoZIzj0CAQNC
+AAQj7fNzGeluKhvEL1t7QM9hnKiNItc4UEkHFzz3WJqepjx14l057XMAQoiyut9G
++W+Ddqx+ozVQOxu1RO5BHEY/MBUGBiuBBAELAjALBglghkgBZQMEARkwVDBSMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABCBO
+XDmcoiudX6iCODyKyf+kj4ahTrVfH/kWYbocdvgrCzCABgkqhkiG9w0BBwEwHgYJ
+YIZIAWUDBAEaMBEEDL9ZV62lILi166Kr/wIBEKCABA7ayB6TLDk4NOQYpj6kvAAA
+AAAEEOiMHVSsVG7a7WcQp7DQmcgAAAAAAAA=
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBxqGBwwIBA6BRoU8wCQYHKoZIzj0CAQNC
+AAQnuS9ANZe6b7GWHi5qQQozrTubhuGToeFZAdQtiz95z5OrgWkmiX6ERkwaN1xB
+06M7crT9vuG0pX4GoboI4p4nMBUGBiuBBAELAzALBglghkgBZQMEARkwVDBSMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABCA0
+PNagjdeo/KS1G+Y/lqmh3Rvz0T4rIVYChhNdvZWxbzCABgkqhkiG9w0BBwEwHgYJ
+YIZIAWUDBAEaMBEEDInQ2rexl6MGVX7tsgIBEKCABA4yHXaDnnVGt09Ctn67lgAA
+AAAEEGUG2rPiuRtGhTarSuS64uQAAAAAAAA=
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGB0aGBzgIBA6BRoU8wCQYHKoZIzj0CAQNC
+AARnR8BsuxfZyGI8EufwUGDG+XuPF/1XzhhogH1DpHQy9XON4DUyLvlkWP+voIwE
+uMApKF5ESL1IL8T6UnzoN55AMBgGCSuBBRCGSD8AAjALBglghkgBZQMEAS0wXDBa
+MC4wITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4A
+BCgetPskb6M89OJ/Q6C9WwJYZrbT9Upvvktf8EHiRPWPri4BWOc8hcn8MIAGCSqG
+SIb3DQEHATAeBglghkgBZQMEAS4wEQQMxjZlfwz1CXn6KQBeAgEQoIAEDq6U8zcr
+EcjV5QDm7KA0AAAAAAQQruuKaBMv3S7igAIPPQp5jwAAAAAAAA==
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBzqGBywIBA6BRoU8wCQYHKoZIzj0CAQNC
+AAQEtpMiE4i41ln4lBfxorG/Mz7ENYFhI3FFjzvphl+/n58x3AhZHsKdJQfiBgwQ
+NbRjVoSg6gqA1NgwlJfMdC5yMBUGBiuBBAELADALBglghkgBZQMEAS0wXDBaMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABCie
+fGtGheoPu9MlqzfxIkshaxv58mwcvnrO7Zjztbr/Y8iu+mQc6UVHMIAGCSqGSIb3
+DQEHATAeBglghkgBZQMEAS4wEQQMRnxKZZFpluuCvzMUAgEQoIAEDgbHkpLneCpj
+J3kFkjUHAAAAAAQQiRN5pWovrd3DmXkxUfScsgAAAAAAAA==
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBzqGBywIBA6BRoU8wCQYHKoZIzj0CAQNC
+AARK9880f2VoFvmoN8xEHSn68EplcakaakOQgEqIJqYhQtk+jzWcONqFH13Tydf0
+twC6i18Ip33oM4qNO5baDw+/MBUGBiuBBAELATALBglghkgBZQMEAS0wXDBaMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABCgU
+SlctsM4RmvAM189y5SF74X37M5v7amwj7Q2NxcwdqYq/T2Spvjh0MIAGCSqGSIb3
+DQEHATAeBglghkgBZQMEAS4wEQQMMaNatdENR6VvbGKnAgEQoIAEDmuLMPNqEAZV
+4G5072SbAAAAAAQQZil2/HiSIzjZEhj2xQjSCgAAAAAAAA==
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBzqGBywIBA6BRoU8wCQYHKoZIzj0CAQNC
+AASbBeETneRZ79Q5cGBu17gZFZM++ZWzsMvcmx6Z1gYztIKYWtndW+INxVvrln4D
+Of8maq6/IfumffkvZpfqBnKPMBUGBiuBBAELAjALBglghkgBZQMEAS0wXDBaMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABCho
+nDmmA4NRBHpBGIGI0SwDPTw6CO1Adwjz6uhtcKd99duC7o50kQZgMIAGCSqGSIb3
+DQEHATAeBglghkgBZQMEAS4wEQQMJjonwKRKw6ThEDRlAgEQoIAEDs/bEIQQtKP9
+EZOmpMsFAAAAAAQQxCZqg6Ec63VcVAJgsVofaAAAAAAAAA==
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGBzqGBywIBA6BRoU8wCQYHKoZIzj0CAQNC
+AAT0yC7d8EmBaHZecCKf8SOdDqm/o2CJteAk7ICcqbMjBhJc93ckpyE4o1Z/gB1Y
+1zwgerWFeaZXfObcRxh2CxZGMBUGBiuBBAELAzALBglghkgBZQMEAS0wXDBaMC4w
+ITEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJAJf6ZvHS4D4ABChH
+RQJ5OmptF0ap3vq7lknTscDMjwld7FhuDlxurwXb61f/Ubv8RsGAMIAGCSqGSIb3
+DQEHATAeBglghkgBZQMEAS4wEQQMEy1/SaOMEMJCYYB/AgEQoIAEDiDXAvTAGTTP
+4RN37jTOAAAAAAQQEJHRPVxSAJBdZ//YdeM1LQAAAAAAAA==
+-----END CMS-----
diff --git a/tests/files/cms-auth-enveloped-kekri-data.pem b/tests/files/cms-auth-enveloped-kekri-data.pem
new file mode 100644
--- /dev/null
+++ b/tests/files/cms-auth-enveloped-kekri-data.pem
@@ -0,0 +1,18 @@
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADExoi8CAQQwAwQBMDALBglghkgBZQMEAQUE
+GKdm3FAAb+cJzRlmBNrIxZJR/lO7Hl9I9TCABgkqhkiG9w0BBwEwHgYJYIZIAWUD
+BAEGMBEEDBy96EqGGAX5GsRkvgIBEKCABA4/POyH35OvITLf81WHwQAAAAAEEKuM
+jJcreoQAUFYD+Y3HRCkAAAAAAAA=
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADE5ojcCAQQwAwQBMDALBglghkgBZQMEARkE
+IKEh8evpAq55aqYZa5EcwTXkGGFsx9Xljf5YWzLOVzPJMIAGCSqGSIb3DQEHATAe
+BglghkgBZQMEARowEQQM2qmxxSb4nQshdsBZAgEQoIAEDj/eccFTdRRtFS59ge54
+AAAAAAQQlv+TpgF6XXZsjdVzg5uV7wAAAAAAAA==
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADFBoj8CAQQwAwQBMDALBglghkgBZQMEAS0E
+KCp5RYkgCzU42HF7XXOaFQOEsk9bUFFxgV9NDlyVAo+2RrIPgVXXkMEwgAYJKoZI
+hvcNAQcBMB4GCWCGSAFlAwQBLjARBAx/18iNa9gajkGa3qYCARCggAQOZ0Hn+848
+qApi912KpsQAAAAABBBpz1K5ojGHJznVxTUAWfD9AAAAAAAA
+-----END CMS-----
diff --git a/tests/files/cms-auth-enveloped-ktri-data.pem b/tests/files/cms-auth-enveloped-ktri-data.pem
new file mode 100644
--- /dev/null
+++ b/tests/files/cms-auth-enveloped-ktri-data.pem
@@ -0,0 +1,54 @@
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGByDCBxQIBADAuMCExHzAdBgkqhkiG9w0B
+CQEWEHRlc3RAZXhhbXBsZS5jb20CCQD3DetZLCk3mzANBgkqhkiG9w0BAQEFAASB
+gA/maH0B5EK0DLU5rfbTGet4uBklSW9TkEfAskjNJ6C1KfePfy20oNfnsKMS5Mp1
+q/3Bz77LgH8+TWBZ5LKbgOT6AiMpWlUuUqzuchxmC9nx5P/ew0WJPQME5igMaV0z
+1rstr7dMZtIMa8aTQMzJ+LgguRNOYBuBLvB1w1vaxrc+MIAGCSqGSIb3DQEHATAe
+BglghkgBZQMEAQYwEQQMlYZ0LFrSPPCSCobkAgEQoIAEDpNaDCywbuuvs15vS6S7
+AAAAAAQQGLodMaocucmqaveg0fT5xQAAAAAAAA==
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGByDCBxQIBADAuMCExHzAdBgkqhkiG9w0B
+CQEWEHRlc3RAZXhhbXBsZS5jb20CCQD3DetZLCk3mzANBgkqhkiG9w0BAQcwAASB
+gFrnvmHQe5ja0uvf6ni5ea0Jkss11cJ62lpyq41AYD52AwaoCC+FFdykgQBxgpO+
+1Byj0cUzzpxFoV354aZg2xUKu7RrN2ogUlei8TdEctfe5imOHPaD+W94xSipT46+
+VEXs+k7LsrJMtqBHmNvSZGIz/r6PpJMB0+Q5m1dqJQ8gMIAGCSqGSIb3DQEHATAe
+BglghkgBZQMEAQYwEQQM44g5NAyvNtg1f7IhAgEQoIAEDvxH9L2wJAxh02F+yTgv
+AAAAAAQQa+rmrc/5NDP5/kB9FDvnkwAAAAAAAA==
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGByDCBxQIBADAuMCExHzAdBgkqhkiG9w0B
+CQEWEHRlc3RAZXhhbXBsZS5jb20CCQD3DetZLCk3mzANBgkqhkiG9w0BAQEFAASB
+gBiKzwAxQcgNfC5I/jsSWn559jU2f/ndZE4he3ojQua1HHrVVJUFVbwUC7bYs3Vf
+nHjo5AHi0i408asv4l2BgH3JWVkhnaUtHEajnipWkBEF2Bipb5u2i5NpeCMATdnX
+vUuUL6UAarWQttcWu+/J+73ZtV0ecrd8ybTIlcOx0QrtMIAGCSqGSIb3DQEHATAe
+BglghkgBZQMEARowEQQM+TWtLNHBl3EU+JUdAgEQoIAEDtXaoIj5rEJLWljHXk0e
+AAAAAAQQjXRzifuEu8tEWisIQkPk6QAAAAAAAA==
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGByDCBxQIBADAuMCExHzAdBgkqhkiG9w0B
+CQEWEHRlc3RAZXhhbXBsZS5jb20CCQD3DetZLCk3mzANBgkqhkiG9w0BAQcwAASB
+gDBMbmVbY3ghH4Pc9N/kDCoYVb6Mp93oUOjLhVpx71Bqxv8xoWXzT4NV2Z3ssE/F
+k3RG1Y7LMYfv2I0QVZetuWJIehRBqouY/uW4RM7WWemuLT46M7Qszoi3vMnZ7Tuj
+8tbxQUeie4dBO0+MMluNYj4hc/gzaCxsy0nqISG6ERGFMIAGCSqGSIb3DQEHATAe
+BglghkgBZQMEARowEQQM8zQfTdCgHG5KfkebAgEQoIAEDoJVmSUFhPA5dLsML5F9
+AAAAAAQQE3SXLSthb+rnxYrwohzIvQAAAAAAAA==
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGByDCBxQIBADAuMCExHzAdBgkqhkiG9w0B
+CQEWEHRlc3RAZXhhbXBsZS5jb20CCQD3DetZLCk3mzANBgkqhkiG9w0BAQEFAASB
+gIIv6EsKwGSUU0M4EHjI8mgYF1mm32nPIHf4xwYuKcgE9Klu8/Dob2k+Q5705aAc
+0mQvGiA8iaguiveGzvXegyuv/LVjl7bz1aTYkXwo22+5J3YstFJPrum+S1FbBdvI
+cKPzkUjaJDus1R0j36Zej2wYnTUJNSo4SE1lolcyAUj/MIAGCSqGSIb3DQEHATAe
+BglghkgBZQMEAS4wEQQMtwUSL7+j+tyKBlp3AgEQoIAEDp3QpaI+/etoalZIMW+G
+AAAAAAQQ99WOo5xvNPX1CYu/2b9LoQAAAAAAAA==
+-----END CMS-----
+-----BEGIN CMS-----
+MIAGCyqGSIb3DQEJEAEXoIAwgAIBADGByDCBxQIBADAuMCExHzAdBgkqhkiG9w0B
+CQEWEHRlc3RAZXhhbXBsZS5jb20CCQD3DetZLCk3mzANBgkqhkiG9w0BAQcwAASB
+gC5UFYfqMeb1SoHKS3G2dr+ofYwU4+JzVrqCJnE6WKSQI3a50MN63TTpjuiOxnWU
+TCzo7QUIFCUms+NIFNR1FGmV58SycQqs/9gQcR0Xp9mnL0LkGte6pIIEnro+dHES
+aY+6eRViwFOZ6GO0qOODUgLHfYdotcqnuKEs8oV3IJb1MIAGCSqGSIb3DQEHATAe
+BglghkgBZQMEAS4wEQQMnJh28SAHjbT8F2U3AgEQoIAEDkcXXJq6tkKrY3tI5ecW
+AAAAAAQQK2+jlHbQwEjmeP0vQxBRZwAAAAAAAA==
+-----END CMS-----
diff --git a/tests/files/ed25519-unencrypted-trad.pem b/tests/files/ed25519-unencrypted-trad.pem
deleted file mode 100644
--- a/tests/files/ed25519-unencrypted-trad.pem
+++ /dev/null
@@ -1,3 +0,0 @@
------BEGIN ED25519 PRIVATE KEY-----
-MC4CAQAwBQYDK2VwBCIEIOrKOPQUqxCUeZnZKJi5EmoEjxnDSSGp45U/t1evy/3v
------END ED25519 PRIVATE KEY-----
diff --git a/tests/files/ed448-unencrypted-trad.pem b/tests/files/ed448-unencrypted-trad.pem
deleted file mode 100644
--- a/tests/files/ed448-unencrypted-trad.pem
+++ /dev/null
@@ -1,4 +0,0 @@
------BEGIN ED448 PRIVATE KEY-----
-MEcCAQAwBQYDK2VxBDsEOceJ7Mc21YZq6/qusCHA5d3wARXuJxMKSRkvsyD4GEKq
-hlubDZL0FQiS3OgjbeuKN+63xa+OVVz9XA==
------END ED448 PRIVATE KEY-----
diff --git a/tests/files/x25519-unencrypted-trad.pem b/tests/files/x25519-unencrypted-trad.pem
deleted file mode 100644
--- a/tests/files/x25519-unencrypted-trad.pem
+++ /dev/null
@@ -1,3 +0,0 @@
------BEGIN X25519 PRIVATE KEY-----
-MC4CAQAwBQYDK2VuBCIEIIhgx84XP3vLVdFwZWT88BG/gGRXl6YYUeo0lWX2E8RY
------END X25519 PRIVATE KEY-----
diff --git a/tests/files/x448-unencrypted-trad.pem b/tests/files/x448-unencrypted-trad.pem
deleted file mode 100644
--- a/tests/files/x448-unencrypted-trad.pem
+++ /dev/null
@@ -1,4 +0,0 @@
------BEGIN X448 PRIVATE KEY-----
-MEYCAQAwBQYDK2VvBDoEOOC8GlnbqcOSJ+ISHV8HJTD3WGdC1sQdZ+0Gkx7sUvL0
-Bm0KxY3cO9Rg9MQb3qkfVngRes0sb86Q
------END X448 PRIVATE KEY-----
