cryptostore 0.3.0.1 → 0.3.1.0
raw patch · 17 files changed
+317/−74 lines, 17 filesdep ~cryptondep ~crypton-x509PVP ok
version bump matches the API change (PVP)
Dependency ranges changed: crypton, crypton-x509
API changes (from Hackage documentation)
Files
- ChangeLog.md +4/−0
- LICENSE +1/−1
- cryptostore.cabal +1/−1
- src/Crypto/Store/CMS/Algorithms.hs +6/−4
- src/Crypto/Store/CMS/Signed.hs +3/−2
- src/Crypto/Store/PKCS12.hs +5/−4
- tests/CMS/Tests.hs +61/−19
- tests/PKCS8/Tests.hs +28/−13
- tests/X509/Tests.hs +1/−1
- tests/files/cms-auth-enveloped-data-rfc6476.pem +0/−15
- tests/files/cms-auth-enveloped-kari-data.pem +135/−0
- tests/files/cms-auth-enveloped-kekri-data.pem +18/−0
- tests/files/cms-auth-enveloped-ktri-data.pem +54/−0
- tests/files/ed25519-unencrypted-trad.pem +0/−3
- tests/files/ed448-unencrypted-trad.pem +0/−4
- tests/files/x25519-unencrypted-trad.pem +0/−3
- tests/files/x448-unencrypted-trad.pem +0/−4
ChangeLog.md view
@@ -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
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2018-2023, Olivier Chéron+Copyright (c) 2018-2024, Olivier Chéron All rights reserved.
cryptostore.cabal view
@@ -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).
src/Crypto/Store/CMS/Algorithms.hs view
@@ -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
src/Crypto/Store/CMS/Signed.hs view
@@ -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
src/Crypto/Store/PKCS12.hs view
@@ -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
tests/CMS/Tests.hs view
@@ -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"
tests/PKCS8/Tests.hs view
@@ -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 ]
tests/X509/Tests.hs view
@@ -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 ]
− tests/files/cms-auth-enveloped-data-rfc6476.pem
@@ -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-----
+ tests/files/cms-auth-enveloped-kari-data.pem view
@@ -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-----
+ tests/files/cms-auth-enveloped-kekri-data.pem view
@@ -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-----
+ tests/files/cms-auth-enveloped-ktri-data.pem view
@@ -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-----
− tests/files/ed25519-unencrypted-trad.pem
@@ -1,3 +0,0 @@------BEGIN ED25519 PRIVATE KEY------MC4CAQAwBQYDK2VwBCIEIOrKOPQUqxCUeZnZKJi5EmoEjxnDSSGp45U/t1evy/3v------END ED25519 PRIVATE KEY-----
− tests/files/ed448-unencrypted-trad.pem
@@ -1,4 +0,0 @@------BEGIN ED448 PRIVATE KEY------MEcCAQAwBQYDK2VxBDsEOceJ7Mc21YZq6/qusCHA5d3wARXuJxMKSRkvsyD4GEKq-hlubDZL0FQiS3OgjbeuKN+63xa+OVVz9XA==------END ED448 PRIVATE KEY-----
− tests/files/x25519-unencrypted-trad.pem
@@ -1,3 +0,0 @@------BEGIN X25519 PRIVATE KEY------MC4CAQAwBQYDK2VuBCIEIIhgx84XP3vLVdFwZWT88BG/gGRXl6YYUeo0lWX2E8RY------END X25519 PRIVATE KEY-----
− tests/files/x448-unencrypted-trad.pem
@@ -1,4 +0,0 @@------BEGIN X448 PRIVATE KEY------MEYCAQAwBQYDK2VvBDoEOOC8GlnbqcOSJ+ISHV8HJTD3WGdC1sQdZ+0Gkx7sUvL0-Bm0KxY3cO9Rg9MQb3qkfVngRes0sb86Q------END X448 PRIVATE KEY-----