packages feed

botan-low-0.2.0.0: test/Test/Botan/Low/X509.hs

{-# LANGUAGE OverloadedStrings #-}

module Test.Botan.Low.X509 (tests) where

import           Botan.Low.X509
import           Data.ByteString
import           Data.Word
import           Paths_botan_low
import           Test.Hspec
import           Test.Tasty
import           Test.Tasty.Hspec
import           Test.Util.Hspec

tests :: IO TestTree
tests = do
    specs <- testSpec "spec_x509" spec_x509
    -- TODO: implement pending tests
    pure $ localOption TreatPendingAsSuccess
         $ testGroup "Test.Botan.Low.X509" [
        specs
      ]

-- NOTE: Taken from https://fm4dd.com/openssl/certexamples.shtm
testCert :: ByteString
testCert = "-----BEGIN CERTIFICATE-----\
\MIID2jCCA0MCAg39MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG\
\A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE\
\MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl\
\YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw\
\ODIyMDUyODAwWhcNMTcwODIxMDUyODAwWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE\
\CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs\
\ZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwvWITOLeyTbS1\
\Q/UacqeILIK16UHLvSymIlbbiT7mpD4SMwB343xpIlXN64fC0Y1ylT6LLeX4St7A\
\cJrGIV3AMmJcsDsNzgo577LqtNvnOkLH0GojisFEKQiREX6gOgq9tWSqwaENccTE\
\sAXuV6AQ1ST+G16s00iN92hjX9V/V66snRwTsJ/p4WRpLSdAj4272hiM19qIg9zr\
\h92e2rQy7E/UShW4gpOrhg2f6fcCBm+aXIga+qxaSLchcDUvPXrpIxTd/OWQ23Qh\
\vIEzkGbPlBA8J7Nw9KCyaxbYMBFb1i0lBjwKLjmcoihiI7PVthAOu/B71D2hKcFj\
\Kpfv4D1Uam/0VumKwhwuhZVNjLq1BR1FKRJ1CioLG4wCTr0LVgtvvUyhFrS+3PdU\
\R0T5HlAQWPMyQDHgCpbOHW0wc0hbuNeO/lS82LjieGNFxKmMBFF9lsN2zsA6Qw32\
\Xkb2/EFltXCtpuOwVztdk4MDrnaDXy9zMZuqFHpv5lWTbDVwDdyEQNclYlbAEbDe\
\vEQo/rAOZFl94Mu63rAgLiPeZN4IdS/48or5KaQaCOe0DuAb4GWNIQ42cYQ5TsEH\
\Wt+FIOAMSpf9hNPjDeu1uff40DOtsiyGeX9NViqKtttaHpvd7rb2zsasbcAGUl+f\
\NQJj4qImPSB9ThqZqPTukEcM/NtbeQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAIAi\
\gU3My8kYYniDuKEXSJmbVB+K1upHxWDA8R6KMZGXfbe5BRd8s40cY6JBYL52Tgqd\
\l8z5Ek8dC4NNpfpcZc/teT1WqiO2wnpGHjgMDuDL1mxCZNL422jHpiPWkWp3AuDI\
\c7tL1QjbfAUHAQYwmHkWgPP+T2wAv0pOt36GgMCM\
\-----END CERTIFICATE-----\
\"

-- NOTE: Taken from https://fm4dd.com/openssl/certexamples.shtm
testCertFile :: FilePath
testCertFile = "test-data/4096b-rsa-example-cert.pem"

{-
Version: 1
Subject: C="JP",X520.State="Tokyo",O="Frank4DD",CN="www.example.com"
Issuer: C="JP",X520.State="Tokyo",X520.Locality="Chuo-ku",O="Frank4DD",OU="WebCert Support",CN="Frank4DD Web CA",PKCS9.EmailAddress="support@frank4dd.com"
Issued: 2012/08/22 05:28:00 UTC
Expires: 2017/08/21 05:28:00 UTC
Constraints:
 None
Signature algorithm: RSA/EMSA3(SHA-1)
Serial number: 0DFD
Public Key [RSA-4096]

-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsL1iEzi3sk20tUP1GnKn
iCyCtelBy70spiJW24k+5qQ+EjMAd+N8aSJVzeuHwtGNcpU+iy3l+ErewHCaxiFd
wDJiXLA7Dc4KOe+y6rTb5zpCx9BqI4rBRCkIkRF+oDoKvbVkqsGhDXHExLAF7leg
ENUk/hterNNIjfdoY1/Vf1eurJ0cE7Cf6eFkaS0nQI+Nu9oYjNfaiIPc64fdntq0
MuxP1EoVuIKTq4YNn+n3AgZvmlyIGvqsWki3IXA1Lz166SMU3fzlkNt0IbyBM5Bm
z5QQPCezcPSgsmsW2DARW9YtJQY8Ci45nKIoYiOz1bYQDrvwe9Q9oSnBYyqX7+A9
VGpv9FbpisIcLoWVTYy6tQUdRSkSdQoqCxuMAk69C1YLb71MoRa0vtz3VEdE+R5Q
EFjzMkAx4AqWzh1tMHNIW7jXjv5UvNi44nhjRcSpjARRfZbDds7AOkMN9l5G9vxB
ZbVwrabjsFc7XZODA652g18vczGbqhR6b+ZVk2w1cA3chEDXJWJWwBGw3rxEKP6w
DmRZfeDLut6wIC4j3mTeCHUv+PKK+SmkGgjntA7gG+BljSEONnGEOU7BB1rfhSDg
DEqX/YTT4w3rtbn3+NAzrbIshnl/TVYqirbbWh6b3e629s7GrG3ABlJfnzUCY+Ki
Jj0gfU4amaj07pBHDPzbW3kCAwEAAQ==
-----END PUBLIC KEY-----

-}

testCertHostname :: ByteString
testCertHostname = "www.example.com"

testCertValidTimestamp :: Word64
testCertValidTimestamp = 1420092000

spec_x509 :: Spec
spec_x509 = do
    it "x509CertLoad" $ do
        _cert <- x509CertLoad testCert
        pass
    it "x509CertLoadFile" $ do
        _cert <- x509CertLoadFile =<< getDataFileName testCertFile
        pass
    it "x509CertDup" $ do
        cert <- x509CertLoad testCert
        _dup <- x509CertDup cert
        -- TODO: parity check, eg:  x509CertGetPublicKey cert == x509CertGetPublicKey dup
        pass
    it "x509CertGetTimeStarts" $ do
        cert <- x509CertLoad testCert
        _ts <- x509CertGetTimeStarts cert
        pass
    it "x509CertGetTimeExpires" $ do
        cert <- x509CertLoad testCert
        _te <- x509CertGetTimeExpires cert
        pass
    it "x509CertNotBefore" $ do
        cert <- x509CertLoad testCert
        _nb <- x509CertNotBefore cert
        pass
    it "x509CertNotAfter" $ do
        cert <- x509CertLoad testCert
        _na <- x509CertNotAfter cert
        pass
    it "x509CertGetPubKeyFingerprint" $ do
        cert <- x509CertLoad testCert
        _fp <- x509CertGetPubKeyFingerprint cert "SHA-256" -- TODO: HashName
        pass
    it "x509CertGetSerialNumber" $ do
        cert <- x509CertLoad testCert
        _sn <- x509CertGetSerialNumber cert
        pass
    it "x509CertGetAuthorityKeyId" $ do
        cert <- x509CertLoad testCert
        _akid <- x509CertGetAuthorityKeyId cert
        pass
    it "x509CertGetSubjectKeyId" $ do
        cert <- x509CertLoad testCert
        _sid <- x509CertGetSubjectKeyId cert
        pass
    it "x509CertGetPublicKeyBits" $ do
        cert <- x509CertLoad testCert
        _pkbits <- x509CertGetPublicKeyBits cert
        pass
    it "x509CertGetPublicKey" $ do
        cert <- x509CertLoad testCert
        _pk <- x509CertGetPublicKey cert
        pass
    it "x509CertGetIssuerDN" $ do
        cert <- x509CertLoad testCert
        _ <- x509CertGetIssuerDN cert "CN" 0 -- TODO: Distinguished names, etc
        pass
    it "x509CertGetSubjectDN" $ do
        cert <- x509CertLoad testCert
        _ <- x509CertGetSubjectDN cert "CN" 0 -- TODO: Distinguished names, etc
        pass
    it "x509CertToString" $ do
        _cert <- x509CertLoad testCert
        pass
    it "x509CertAllowedUsage" $ do
        cert <- x509CertLoad testCert
        _allowed <- x509CertAllowedUsage cert []
        pass
    it "x509CertHostnameMatch" $ do
        cert <- x509CertLoad testCert
        _matched <- x509CertHostnameMatch cert testCertHostname
        pass
    it "x509CertVerify" $ do
        cert <- x509CertLoad testCert
        (_success, _status) <- x509CertVerify cert [] [] Nothing 0 testCertHostname testCertValidTimestamp
        pass
    it "x509CertValidationStatus" $ do
        _cert <- x509CertLoad testCert
        _ <- x509CertValidationStatus 0
        pending
    -- NOTE: May need to generate a proper test cert with CA and CRL
    it "x509CRLLoad" $ do
        _cert <- x509CertLoad testCert
        -- x509CRLLoad cert
        pending
    it "x509CRLLoadFile" $ do
        _cert <- x509CertLoad testCert
        -- x509CRLLoadFile cert
        pending
    it "x509IsRevoked" $ do
        _cert <- x509CertLoad testCert
        -- x509IsRevoked cert
        pending
    it "x509CertVerifyWithCLR" $ do
        _cert <- x509CertLoad testCert
        -- x509CertVerifyWithCLR cert
        pending