pkcs10 0.1.0.3 → 0.1.0.4
raw patch · 12 files changed
+202/−8 lines, 12 filesdep +QuickCheckdep +tasty-quickcheckPVP ok
version bump matches the API change (PVP)
Dependencies added: QuickCheck, tasty-quickcheck
API changes (from Hackage documentation)
Files
- README.md +1/−1
- pkcs10.cabal +12/−1
- test/Spec.hs +41/−6
- test/fixtures/dsa.pem +12/−0
- test/fixtures/dsa1.csr +18/−0
- test/fixtures/dsa2.csr +17/−0
- test/fixtures/dsa3.csr +13/−0
- test/fixtures/dsaparams +9/−0
- test/fixtures/rsa.pem +27/−0
- test/fixtures/rsa1.csr +19/−0
- test/fixtures/rsa2.csr +18/−0
- test/fixtures/rsa3.csr +15/−0
README.md view
@@ -20,5 +20,5 @@ let extAttrs = PKCS9Attributes [PKCS9Attribute $ ExtBasicConstraints False Nothing, PKCS9Attribute $ ExtKeyUsage [KeyUsage_digitalSignature,KeyUsage_nonRepudiation,KeyUsage_keyEncipherment]] Right req <- generateCSR subjectAttrs extAttrs (KeyPairRSA pubKey privKey) SHA512 putStrLn . show . toPEM $ req -- export in PEM format- putStrLn . show $ verify (csrToSigned req) $ PubKeyRSA pubKey -- sign CSR before verify+ putStrLn . show $ verify (csrToSigned req) $ PubKeyRSA pubKey -- sign CSR before verifying ```
pkcs10.cabal view
@@ -1,5 +1,5 @@ name: pkcs10-version: 0.1.0.3+version: 0.1.0.4 synopsis: PKCS#10 library description: Please see README.md homepage: https://github.com/fcomb/pkcs10-hs#readme@@ -13,6 +13,15 @@ cabal-version: >=1.10 stability: experimental extra-doc-files: README.md+extra-source-files: test/fixtures/dsaparams+ , test/fixtures/dsa.pem+ , test/fixtures/dsa1.csr+ , test/fixtures/dsa2.csr+ , test/fixtures/dsa3.csr+ , test/fixtures/rsa.pem+ , test/fixtures/rsa1.csr+ , test/fixtures/rsa2.csr+ , test/fixtures/rsa3.csr library ghc-options: -W@@ -39,6 +48,8 @@ , pkcs10 , tasty , tasty-hunit+ , tasty-quickcheck+ , QuickCheck , bytestring , cryptonite , pem
test/Spec.hs view
@@ -1,6 +1,7 @@ module Main where import Control.Applicative ((<$>), (<*>))+import Control.Monad import Crypto.Hash import qualified Crypto.PubKey.DSA as DSA import qualified Crypto.PubKey.RSA as RSA@@ -13,16 +14,21 @@ import Data.X509 import Data.X509.PKCS10 import Keys+import Test.QuickCheck.Monadic (monadicIO, run) import Test.Tasty import Test.Tasty.HUnit+import Test.Tasty.QuickCheck main :: IO () main = do defaultMain tests tests :: TestTree-tests = testGroup "Tests" [unitTests]+tests = testGroup "Tests" [properties, unitTests] +properties :: TestTree+properties = testGroup "Properties" [qcProps]+ unitTests = testGroup "Unit tests" [ testCase "CSR with subject and extension (RSA)" $ do req <- defaultRsaCSR subjectAttrs extAttrs@@ -46,6 +52,9 @@ checkRsaFixtureCSR "dsa" "dsa3" emptySubjectAttrs emptyExtAttrs readDSA ] +qcProps = testGroup "(checked by QuickCheck)"+ [ testProperty "CSR" (property_csr) ]+ subjectAttrs = makeX520Attributes [(X520CommonName, "node.fcomb.io"), (X520OrganizationName, "fcomb")] pemSubjectAttrs = X520Attributes [(X520CommonName, asn1CharacterString Printable "api"), (X520CommonName, asn1CharacterString Printable "fcomb"), (X520CommonName, asn1CharacterString Printable "com"), (X520StateOrProvinceName, asn1CharacterString Printable "Moscow"), (X520LocalityName, asn1CharacterString Printable "Moscow"), (X520OrganizationName, asn1CharacterString Printable "End Point"), (X520OrganizationalUnitName, asn1CharacterString Printable "fcomb"), (EmailAddress, asn1CharacterString IA5 "in@fcomb.io"), (X509SubjectAltName, asn1CharacterString Printable "DNS.1=fcomb.com")]@@ -58,13 +67,39 @@ emptyExtAttrs = PKCS9Attributes [] +instance Arbitrary PubKey where+ arbitrary = elements [PubKeyRSA rsaPublicKey, PubKeyDSA dsaPublicKey]++instance Arbitrary ASN1StringEncoding where+ arbitrary = elements [IA5,UTF8,Printable,Visible]++instance Arbitrary X520Attribute where+ arbitrary = elements [X520CommonName,X520SerialNumber,X520Name,X520Surname,X520GivenName,X520Initials,X520GenerationQualifier,X520CountryName,X520LocalityName,X520StateOrProvinceName,X520StreetAddress,X520OrganizationName,X520OrganizationalUnitName,X520Title,X520DNQualifier,X520Pseudonym,X509SubjectAltName,EmailAddress,IPAddress,DomainComponent,UserId,RawAttribute [12,3,4,5]]++arbitraryX520Attrs r1 r2 =+ choose (r1,r2) >>= \l -> replicateM l arbitraryAttr+ where+ arbitraryAttr = (,) <$> arbitrary <*> arbitrary++instance Arbitrary X520Attributes where+ arbitrary = X520Attributes <$> arbitraryX520Attrs 0 15++arbitraryBS r1 r2 = choose (r1,r2) >>= \l -> (B.pack <$> replicateM l arbitrary)++instance Arbitrary ASN1CharacterString where+ arbitrary = ASN1CharacterString <$> arbitrary <*> arbitraryBS 1 36++property_csr subjectAttrs pubKey = monadicIO $ do+ req <- run $ defaultRsaCSR subjectAttrs pemExtAttrs+ return $ checkCSR (csrToSigned req) subjectAttrs pemExtAttrs pubKey+ readRSA pem = PubKeyRSA $ readRsaPubKey pem 256 readDSA pem = PubKeyDSA $ readDsaPubKey pem checkRsaFixtureCSR keyName csrName subjectAttrs extAttrs pkf = do- keyPem <- readPEMFile $ "./test/fixtures/" ++ keyName ++ ".pem"- csrPem <- readPEMFile $ "./test/fixtures/" ++ csrName ++ ".csr"+ keyPem <- readPEMFile $ "test/fixtures/" ++ keyName ++ ".pem"+ csrPem <- readPEMFile $ "test/fixtures/" ++ csrName ++ ".csr" checkCSR (readCSR csrPem) subjectAttrs extAttrs $ pkf keyPem defaultRsaCSR subjectAttrs extAttrs = do@@ -95,13 +130,13 @@ checkDER csr = do let (Right csr') = (fromDER . toDER) csr- assertBool "csr' == csr" $ (certificationRequest csr') == csr+ assertBool "DER: csr' == csr" $ (certificationRequest csr') == csr checkPEM csr = do let (Right csr') = (fromPEM . toPEM) csr- assertBool "csr' == csr" $ (certificationRequest csr') == csr+ assertBool "PEM: csr' == csr" $ (certificationRequest csr') == csr let (Right csr'') = (fromPEM . toNewFormatPEM) csr- assertBool "csr'' == csr" $+ assertBool "PEM: csr'' == csr" $ (certificationRequest csr'') == csr assertBool "pemName == CERTIFICATE REQUEST" $ (pemName . toPEM $ csr) == "CERTIFICATE REQUEST"
+ test/fixtures/dsa.pem view
@@ -0,0 +1,12 @@+-----BEGIN DSA PRIVATE KEY-----+MIIBuwIBAAKBgQCwn7E7CJSxcVw4ywBxTAQzJB8k5z0rVT/SbjuPDCnJCAy68IPU+7EJekWii8HTFvWSh0HKQalCLS+vzg76VY/9wn8oDDtHT7QSptBn9Xc9Ms3OHFRnf+kG/SGRggfJ7CvcZ4FSI870ijSy3NYFJWwfSSFVYttxkZ0GW357iin6uiewIVAKRt+6yDH5JTnplHkAzL4Jhw0LnklAoGAfTz+x2GrElIqHZKle80LVTO0P1fBdhBCHa1h+8ktPTCVLL6XrraDnqk9jgpLVKXu499IMRwTgElf1bK+TWvwXEeanYIQKU63PdkYf+BgZoszrnJyGDY0LTLO4e5GpPhLQNHSvVckmYOXIaNb60TkYRWEoLFoWep1/3iNQ/+EpYmNFsCgYBVZlbcoBHRdjf+VPlx7kZhYt6Y+7GVS8LBc142uuzFW2FIyZQaIYul+/i45y/GUugDEfDbudY5GGr1My7mLFp6ysxmCwrKhzs/W4yTkfDbdbSiDsZ5tGK/t+JmITQmBTaAhaLo4rW5rNW2SI+GgGjpJHZnbaV1NDH2RXtUppE7PvoQIVAIRuQNGz+cdbHbJYTwUj+T+y7t8Xo+-----END DSA PRIVATE KEY-----
+ test/fixtures/dsa1.csr view
@@ -0,0 +1,18 @@+-----BEGIN CERTIFICATE REQUEST-----+MIIC0zCCApMCAQAwgagxDDAKBgNVBAMTA2FwaTEOMAwGA1UEAxMFZmNvbWIxDDAK+BgNVBAMTA2NvbTEPMA0GA1UECBMGTW9zY293MQ8wDQYDVQQHEwZNb3Njb3cxEjAQ+BgNVBAoTCUVuZCBQb2ludDEOMAwGA1UECxMFZmNvbWIxGjAYBgkqhkiG9w0BCQEW+C2luQGZjb21iLmlvMRgwFgYDVR0REw9ETlMuMT1mY29tYi5jb20wggG2MIIBKwYH+KoZIzjgEATCCAR4CgYEAsJ+xOwiUsXFcOMsAcUwEMyQfJOc9K1U/0m47jwwpyQgM+uvCD1OxCXpFoovB0xb1kodBykGpQi0vr84O+lWP/cJ/KAw7R0+0EqbQZ/V3PTLNz+hxUZ35Bv0hkYIHyewr3GeBUiPO9Io0stzWBSVsH0khVWLbcZGdBlt+e4op+ronsC+FQCkbesgx+SU56ZR5AMy+CYcNC55JQKBgH08/sdhqxJSKh2SpXvNC1UztD9XwXYQ+Qh2tYfJLT0wlSy+l662g56pPY4KS1Sl7uPfSDEcE4BJX9Wyvk1r8FxHmp2CEClOt+z3ZGHwYGaLM65ychg2NC0yzuHuRqT4S0DR0r1XJJmDlyGjW+tE5GEVhKCxaFnqdf+94jUPxKWJjRbA4GEAAKBgFVmVtygEdF2N/5U+XHuRmFi3pj7sZVLwsFzXja67MVb+YUjJlBohi6X+LjnL8ZS6AMR8Nu51jkYavUzLuYsWnrKzGYLCsqHOz9bjJOR8Nt1t+KIOxnm0Yr+0mYhNCYFNoCFoujitbms1bZIj4aAaOkkdmdtpXU0MfZFe1SmkTs++h+oCkwJwYJKoZIhvcNAQkOMRowGDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIF4DAJBgcq+hkjOOAQDAy8AMCwCFHE4OUdP8t/FBPo+JU3HOTHog61nAhQD9z9bT36Y7cJ5vBoM+mQnC6ti5aA==+-----END CERTIFICATE REQUEST-----
+ test/fixtures/dsa2.csr view
@@ -0,0 +1,17 @@+-----BEGIN CERTIFICATE REQUEST-----+MIICqjCCAmoCAQAwgagxDDAKBgNVBAMTA2FwaTEOMAwGA1UEAxMFZmNvbWIxDDAK+BgNVBAMTA2NvbTEPMA0GA1UECBMGTW9zY293MQ8wDQYDVQQHEwZNb3Njb3cxEjAQ+BgNVBAoTCUVuZCBQb2ludDEOMAwGA1UECxMFZmNvbWIxGjAYBgkqhkiG9w0BCQEW+C2luQGZjb21iLmlvMRgwFgYDVR0REw9ETlMuMT1mY29tYi5jb20wggG2MIIBKwYH+KoZIzjgEATCCAR4CgYEAsJ+xOwiUsXFcOMsAcUwEMyQfJOc9K1U/0m47jwwpyQgM+uvCD1OxCXpFoovB0xb1kodBykGpQi0vr84O+lWP/cJ/KAw7R0+0EqbQZ/V3PTLNz+hxUZ35Bv0hkYIHyewr3GeBUiPO9Io0stzWBSVsH0khVWLbcZGdBlt+e4op+ronsC+FQCkbesgx+SU56ZR5AMy+CYcNC55JQKBgH08/sdhqxJSKh2SpXvNC1UztD9XwXYQ+Qh2tYfJLT0wlSy+l662g56pPY4KS1Sl7uPfSDEcE4BJX9Wyvk1r8FxHmp2CEClOt+z3ZGHwYGaLM65ychg2NC0yzuHuRqT4S0DR0r1XJJmDlyGjW+tE5GEVhKCxaFnqdf+94jUPxKWJjRbA4GEAAKBgFVmVtygEdF2N/5U+XHuRmFi3pj7sZVLwsFzXja67MVb+YUjJlBohi6X+LjnL8ZS6AMR8Nu51jkYavUzLuYsWnrKzGYLCsqHOz9bjJOR8Nt1t+KIOxnm0Yr+0mYhNCYFNoCFoujitbms1bZIj4aAaOkkdmdtpXU0MfZFe1SmkTs++h+oAAwCQYHKoZIzjgEAwMvADAsAhQ7lDYNBXH4iO4iygdTD9+pKT6VDwIUPFaTXWs6+q9OZq9+YWUXiQILceks=+-----END CERTIFICATE REQUEST-----
+ test/fixtures/dsa3.csr view
@@ -0,0 +1,13 @@+-----BEGIN CERTIFICATE REQUEST-----+MIICATCCAcECAQAwADCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCwn7E7CJSxcVw4+ywBxTAQzJB8k5z0rVT/SbjuPDCnJCAy68IPU7EJekWii8HTFvWSh0HKQalCLS+vz+g76VY/9wn8oDDtHT7QSptBn9Xc9Ms3OHFRnfkG/SGRggfJ7CvcZ4FSI870ijSy3N+YFJWwfSSFVYttxkZ0GW357iin6uiewIVAKRt6yDH5JTnplHkAzL4Jhw0LnklAoGA+fTz+x2GrElIqHZKle80LVTO0P1fBdhBCHa1h8ktPTCVLL6XrraDnqk9jgpLVKXu4+99IMRwTgElf1bK+TWvwXEeanYIQKU63PdkYfBgZoszrnJyGDY0LTLO4e5GpPhLQN+HSvVckmYOXIaNb60TkYRWEoLFoWep1/3iNQ/EpYmNFsDgYQAAoGAVWZW3KAR0XY3+/lT5ce5GYWLemPuxlUvCwXNeNrrsxVthSMmUGiGLpf4uOcvxlLoAxHw27nWORhq9+TMu5ixaesrMZgsKyoc7P1uMk5Hw23W0og7GebRiv7SZiE0JgU2gIWi6OK1uazVtk+iPhoBo6SR2Z22ldTQx9kV7VKaROz76GgADAJBgcqhkjOOAQDAy8AMCwCFGZWWa0n+rsXpsxy7R3vhfpCGIhP3AhRqaLPrraO3Pggf3UTZLMsYhUA+aA==+-----END CERTIFICATE REQUEST-----
+ test/fixtures/dsaparams view
@@ -0,0 +1,9 @@+-----BEGIN DSA PARAMETERS-----+MIIBHgKBgQCwn7E7CJSxcVw4ywBxTAQzJB8k5z0rVT/SbjuPDCnJCAy68IPU7EJe+kWii8HTFvWSh0HKQalCLS+vzg76VY/9wn8oDDtHT7QSptBn9Xc9Ms3OHFRnfkG/S+GRggfJ7CvcZ4FSI870ijSy3NYFJWwfSSFVYttxkZ0GW357iin6uiewIVAKRt6yDH+5JTnplHkAzL4Jhw0LnklAoGAfTz+x2GrElIqHZKle80LVTO0P1fBdhBCHa1h8ktP+TCVLL6XrraDnqk9jgpLVKXu499IMRwTgElf1bK+TWvwXEeanYIQKU63PdkYfBgZo+szrnJyGDY0LTLO4e5GpPhLQNHSvVckmYOXIaNb60TkYRWEoLFoWep1/3iNQ/EpYm+NFs=+-----END DSA PARAMETERS-----
+ test/fixtures/rsa.pem view
@@ -0,0 +1,27 @@+-----BEGIN RSA PRIVATE KEY-----+MIIEogIBAAKCAQEAn1lF/OiYgXK9EK8qK+amvExWH+zOYfYzonoPgt7MBHymNEt9+/ceBWhlEuNLSTDeQQFLrxjIrXOuKveNoa1cHXVqejmWAVs3SqBtJovB0eGa0HNum+mJ9IKTreiGqzXRTXuV/O4J3ZaBoHQuh2OnsJF06MTwZRTBK8hmMHs1RuoZRxomad+cEaVveoqgi6tLE+3Px+WjmAZmOmJ9Uhn0Ae9Zm+GrYGTVnrbMntNS4YA49twDuUv+1EjpKiejr6c6qfH7qrAoqKq83AazAWo8GoclRXnwwlwNwQLRPOU9XxK2g8fwjDCw+Vj0JJDh+dn2FdQ3aQTO31G8XgYj7MMvGMRotVQIDAQABAoIBAAZDbAzU16m+6M+P+EwlGt6cPGROIK1SOaNkqExIBz+MdQysrDHi9Lshr1det8bYtOO5OVBYmQq4UVA/C+sIgHk7KHrVPLiY/f5zfUWsCc0vcokkvQFmxJVnzIY5bZGtO9zfzrVyZdDf6Zh0+J+85u42lKgM8Ona+qhked2XQcfenm/XBOW0LVgysdcNimTvhCnmXrWpxJGXU5lVflI+DxtxCib/y9E813tiECHj9riHhaQHTeGbEdOxgDLVOK33SLFM7XXO1UEyscfkrb+2+TaOsVCvlKmXALwk0pa5NDCJxZU1eE7zII5PT4bogjo10BMkpBHyYMq6rXNxPJVvE+ArLttMECgYEA0uAkSB+HcrYKSoFOVhtR6QOsjwHp7Eoqs7zmQKOT25TOXWCfhFu9+g6a+eBKXOHaIb1jb1oZzj3lUlyUJNq7edKabr14fuektLn/Fm/7JMlIARrzljUd5+aCIqBtZWb4/AbU/CbG40DWuk8P6bg63MQRjPq2niMx9L2ke20XEe1HMCgYEAwXJ3+9+FLC/Wwa1qGiYLpt7qkIbFJsmZVdV0mfLBpyStGP3VdN4DyQntuEGc4G41t2BL1+7U2AsLalYhaL3PdWbuSlqP1uGChFFMQF4eZHgT1HvzKF7UGEwEPNQbcXuyaTVAuM+cNQ2iwZDL9o2Dsd5e/qbxcVg0IpjH9N632O3zRcCgYArktEsbgdo9qCtwIZVWJPW+WEIB0t1pS/IC7deOJ77XsqnptZuAmAxS9dOJsB27NxL+Hxhd/a5HSUTnbmm2+O9S+n1KwK/zWR45ke1Zz43Pjh/oyo7mzNb+qetTAUO3PY57Zd4+vJB5xX3rXqWStEu6P+zPasbtakxaTA1+y43m0GbQKBgCts/vFuaeJtbQUsdTc5ZC4Sf/XwTpL11glat+EV+2SmHxWVJe3uSPtAd1T9pbHcC8L2ow/xZgaIp3kZ+uTcJbyXFvkqJWcWihJ98wbVM+dJDWqNyLAvWX160xi0pNR86Dgl9DmGtbuELNTRfY7Hm03divEXj8LheieU4Ts2mi+gQhRAoGAYNfF2Z7XBktidG6TLt3jMJV15syWgEdxy5ut8irw/8lgAN7dwXsiLu9V+q+43PMARnm9dknlvVgTh7HgCQsZ5j/u36yq5y1I1WG+DCZVpfoInwZFncqsjR1QI+WJvRmhmLeNoqZjDCdXX5Yuc9Vj5gPW7lQda6AzTcyd43KjBVAak=+-----END RSA PRIVATE KEY-----
+ test/fixtures/rsa1.csr view
@@ -0,0 +1,19 @@+-----BEGIN CERTIFICATE REQUEST-----+MIIDFzCCAf8CAQAwgagxDDAKBgNVBAMTA2FwaTEOMAwGA1UEAxMFZmNvbWIxDDAK+BgNVBAMTA2NvbTEPMA0GA1UECBMGTW9zY293MQ8wDQYDVQQHEwZNb3Njb3cxEjAQ+BgNVBAoTCUVuZCBQb2ludDEOMAwGA1UECxMFZmNvbWIxGjAYBgkqhkiG9w0BCQEW+C2luQGZjb21iLmlvMRgwFgYDVR0REw9ETlMuMT1mY29tYi5jb20wggEiMA0GCSqG+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCfWUX86JiBcr0Qryor5qa8TFYf7M5h9jOi+eg+C3swEfKY0S339x4FaGUS40tJMN5BAUuvGMitc64q942hrVwddWp6OZYBWzdKo+G0mi8HR4ZrQc26aYn0gpOt6IarNdFNe5X87gndloGgdC6HY6ewkXToxPBlFMEryG+YwezVG6hlHGiZp1wRpW96iqCLq0sT7c/H5aOYBmY6Yn1SGfQB71mb4atgZNWetsy+e01LhgDj23AO5S/USOkqJ6Ovpzqp8fuqsCioqrzcBrMBajwahyVFefDCXA3BAtE8+5T1fEraDx/CMMLBWPQkkOH52fYV1DdpBM7fUbxeBiPswy8YxGi1VAgMBAAGgKTAn+BgkqhkiG9w0BCQ4xGjAYMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMA0GCSqGSIb3+DQEBBQUAA4IBAQBlD7dYBBcBAXL8Yv9+PtpBoiwREP6tj9EA1SG1e8MzdlHcSiHE+RhMY/sPm2aWEOotzqfpCp32AE4OxhgMrSXrjZCiKvaspb0pXWRZVzen9MnsDFICq+rrp7JQWbH53gIPBx90WE8Rzhs9rVYPGbRqldbXtpUf6zWIwFXr4KYSyJgBkPQMPB+UCxli+PJjCDWRFjW9M9LOLPCQ614LcKckwDA8t+Mvgeki7qT7fVoDRbgb4s6bXCe+5r/66Fp3jIBxyJwIjAV58ayxqjL/CAbAooMQwbRXp64fz7EYmFWnIdvZ9J03doNd+jUI5TrkOpUn5egxWLJDCgoIo9HuDZGFTLDyd+-----END CERTIFICATE REQUEST-----
+ test/fixtures/rsa2.csr view
@@ -0,0 +1,18 @@+-----BEGIN CERTIFICATE REQUEST-----+MIIC7jCCAdYCAQAwgagxDDAKBgNVBAMTA2FwaTEOMAwGA1UEAxMFZmNvbWIxDDAK+BgNVBAMTA2NvbTEPMA0GA1UECBMGTW9zY293MQ8wDQYDVQQHEwZNb3Njb3cxEjAQ+BgNVBAoTCUVuZCBQb2ludDEOMAwGA1UECxMFZmNvbWIxGjAYBgkqhkiG9w0BCQEW+C2luQGZjb21iLmlvMRgwFgYDVR0REw9ETlMuMT1mY29tYi5jb20wggEiMA0GCSqG+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCfWUX86JiBcr0Qryor5qa8TFYf7M5h9jOi+eg+C3swEfKY0S339x4FaGUS40tJMN5BAUuvGMitc64q942hrVwddWp6OZYBWzdKo+G0mi8HR4ZrQc26aYn0gpOt6IarNdFNe5X87gndloGgdC6HY6ewkXToxPBlFMEryG+YwezVG6hlHGiZp1wRpW96iqCLq0sT7c/H5aOYBmY6Yn1SGfQB71mb4atgZNWetsy+e01LhgDj23AO5S/USOkqJ6Ovpzqp8fuqsCioqrzcBrMBajwahyVFefDCXA3BAtE8+5T1fEraDx/CMMLBWPQkkOH52fYV1DdpBM7fUbxeBiPswy8YxGi1VAgMBAAGgADAN+BgkqhkiG9w0BAQUFAAOCAQEANRMh7oNCTUmvq7YMimu7SAK0Rgefc96o7PXZ1btL+xfqyvM/iNB3gZfYKcwa0X5o75x0QOzK3D3E2vx4vPY5/8vGnpBQfu4PtGTK1uR0s+k7VPG77yCyixY+iukiLX+K5gLpeNiCwIMiz2AkS6YzEbk/GXQc0yCQ0FAEQsD1KK+uroNQG9eqsRkGvFyTY/gfEVuyoquAduHc0gC/XzKIbvnrsqnbsu2bxTo+4Rohr5P+l9G/fR1HmqA4UCcCM15K3u/KH68sFhjUDFH+nj/nP8gB2/3uNqcQaxANvB9kFUoT+1YVD/3z1xSBRAJi/p27Rl4/xz51VldOrQymP/ysw+TImTw==+-----END CERTIFICATE REQUEST-----
+ test/fixtures/rsa3.csr view
@@ -0,0 +1,15 @@+-----BEGIN CERTIFICATE REQUEST-----+MIICRTCCAS0CAQAwADCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ9Z+RfzomIFyvRCvKivmprxMVh/szmH2M6J6D4LezAR8pjRLff3HgVoZRLjS0kw3kEBS+68YyK1zrir3jaGtXB11ano5lgFbN0qgbSaLwdHhmtBzbppifSCk63ohqs10U17lf+zuCd2WgaB0Lodjp7CRdOjE8GUUwSvIZjB7NUbqGUcaJmnXBGlb3qKoIurSxPtz8f+lo5gGZjpifVIZ9AHvWZvhq2Bk1Z62zJ7TUuGAOPbcA7lL9RI6Sono6+nOqnx+6qw+KKiqvNwGswFqPBqHJUV58MJcDcEC0TzlPV8StoPH8IwwsFY9CSQ4fnZ9hXUN2kEz+t9RvF4GI+zDLxjEaLVUCAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4IBAQATv3egVLAc+PB5fbwXLvE4l88qF2ygMyg8XSsumE8nPxLKWxXfAzsRhV6qSPlXYJFMKkGP8R1ap+AfrdTEFD/8d1sBrSCW+T2S0xcqDZpBehnunmgB3ud0++zr7A6iiOpbOchf+ZEbPB+IEHjuF5zLXn9Nv8CKFag9uFdJkprqkaDkouPIXiQXYZmn5tevNO3Q5woh7H2mizM+WnNH0Zf+EY/2Lazl4GW4c0J+JzZm01PYuXgSUsWiKGYlCej0pVG/RrBQbSHZqhEi+eeU3kgd+Zf7xRNT2pexwktkklvDE3kGCEye9zwTRjMV/nL/62ConBkzJOVq2kfNc+xKOQMecLdpJ6+-----END CERTIFICATE REQUEST-----