Sample code for 30+ languages & platforms
PureBasic

Load .crl, Convert to XML, Get Revoked Serial Numbers and Dates

See more Certificates Examples

Load a binary .crl file (Certificate Revocation List), converts to XML, and then gets the revoked certificate serial numbers and revocation dates.

Note: This example requires Chilkat v9.5.0.77 or greater.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkBinData.pb"
IncludeFile "CkXml.pb"
IncludeFile "CkAsn.pb"
IncludeFile "CkDateTime.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example requires the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    ; Load a binary .crl file.
    bdCrl.i = CkBinData::ckCreate()
    If bdCrl.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkBinData::ckLoadFile(bdCrl,"qa_data/crl/ca1.crl")
    If success <> 1
        Debug "Failed to load CRL file."
        CkBinData::ckDispose(bdCrl)
        ProcedureReturn
    EndIf

    asn.i = CkAsn::ckCreate()
    If asn.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkAsn::ckLoadBd(asn,bdCrl)
    If success <> 1
        Debug CkAsn::ckLastErrorText(asn)
        CkBinData::ckDispose(bdCrl)
        CkAsn::ckDispose(asn)
        ProcedureReturn
    EndIf

    ; Convert ASN.1 to XML and load into xml and re-emit for pretty printing..
    xml.i = CkXml::ckCreate()
    If xml.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkXml::ckLoadXml(xml,CkAsn::ckAsnToXml(asn))
    success = CkXml::ckSaveXml(xml,"qa_output/crl.xml")

    ; Use this online tool to generate parsing code from CRL XML: 
    ; Generate Parsing Code from XML

    ; Here's code to parse the XML.  This code was generated by the above tool,
    ; and then we modified it by removing unneeded code and changing some names
    i.i
    count_i.i
    tagPath.s
    j.i
    count_j.i
    k.i
    count_k.i

    revokedCertSerialHex.s
    dateRevoked.s

    dt.i = CkDateTime::ckCreate()
    If dt.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    i = 0
    count_i = CkXml::ckNumChildrenHavingTag(xml,"sequence")
    While i < count_i
        CkXml::setCkI(xml, i)

        j = 0
        count_j = CkXml::ckNumChildrenHavingTag(xml,"sequence[i]|sequence")
        While j < count_j
            CkXml::setCkJ(xml, j)

            k = 0
            count_k = CkXml::ckNumChildrenHavingTag(xml,"sequence[i]|sequence[j]|sequence")
            While k < count_k
                CkXml::setCkK(xml, k)

                ; Get the revoked certificate's serial number in uppercase hex.
                revokedCertSerialHex = CkXml::ckGetChildContent(xml,"sequence[i]|sequence[j]|sequence[k]|int")
                Debug "serial number: " + revokedCertSerialHex

                ; Get the date/time revoked.  It will be a string formatted as "YYMMDDhhmmssZ", such as "181023093028Z"
                dateRevoked = CkXml::ckGetChildContent(xml,"sequence[i]|sequence[j]|sequence[k]|utctime")

                ; Starting in Chilkat v9.5.0.77, date/time strings formatted as YYMMDDhhmmssZ can be parsed as follows:
                CkDateTime::ckSetFromTimestamp(dt,dateRevoked)
                Debug "date revoked: " + CkDateTime::ckGetAsRfc822(dt,0)

                k = k + 1
            Wend
            j = j + 1
        Wend
        i = i + 1
    Wend


    CkBinData::ckDispose(bdCrl)
    CkAsn::ckDispose(asn)
    CkXml::ckDispose(xml)
    CkDateTime::ckDispose(dt)


    ProcedureReturn
EndProcedure