Sample code for 30+ languages & platforms
PureBasic

P7S - Access Signature Information (date/time, certificate used, etc.)

See more Digital Signatures Examples

Examine a PKCS7 signature (.p7s) and get information about it.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkBinData.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkDateTime.pb"
IncludeFile "CkCrypt2.pb"

Procedure ChilkatExample()

    success.i = 0

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

    ; First load the .p7s file into a BinData object..
    bd.i = CkBinData::ckCreate()
    If bd.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkBinData::ckLoadFile(bd,"qa_data/p7s/sample.p7s")
    If success <> 1
        Debug "Failed to load .p7s file."
        CkBinData::ckDispose(bd)
        ProcedureReturn
    EndIf

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

    ; Assuming this is a signature that contains the original data that was signed..
    success = CkCrypt2::ckOpaqueVerifyBd(crypt,bd)
    If success = 0
        Debug CkCrypt2::ckLastErrorText(crypt)
        CkBinData::ckDispose(bd)
        CkCrypt2::ckDispose(crypt)
        ProcedureReturn
    EndIf

    ; Examine the last JSON data after signature verification..
    json.i = CkJsonObject::ckCreate()
    If json.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkCrypt2::ckGetLastJsonData(crypt,json)

    CkJsonObject::setCkEmitCompact(json, 0)
    Debug CkJsonObject::ckEmit(json)

    ; Sample output...
    ; Go to http://tools.chilkat.io/jsonParse.cshtml
    ; and paste the JSON into the online form to generate JSON parsing code.

    ; {
    ;   "pkcs7": {
    ;     "verify": {
    ;       "digestAlgorithms": [
    ;         "sha256"
    ;       ],
    ;       "signerInfo": [
    ;         {
    ;           "cert": {
    ;             "serialNumber": "AAC5FC48C0FD8FBB",
    ;             "issuerCN": "AC ABCDEF RFB v5",
    ;             "issuerDN": "",
    ;             "digestAlgOid": "2.16.840.1.101.3.4.2.1",
    ;             "digestAlgName": "SHA-256"
    ;           },
    ;           "contentType": "1.2.840.113549.1.7.1",
    ;           "signingTime": "180607195054Z",
    ;           "messageDigest": "trzyxXbZ96z2M4mncyZ7BNMV4yIT92+5sS27Fu64iG8=",
    ;           "signingAlgOid": "1.2.840.113549.1.1.11",
    ;           "signerDigest": "trzyxXbZ96z2M4mncyZ7BNMV4yIT92+5sS27Fu64iG8="
    ;         },
    ;         {
    ;           "cert": {
    ;             "serialNumber": "324FB38ABD59723F",
    ;             "issuerCN": "AC ABCDEF RFB v5",
    ;             "issuerDN": "",
    ;             "digestAlgOid": "2.16.840.1.101.3.4.2.1",
    ;             "digestAlgName": "SHA-256"
    ;           },
    ;           "contentType": "1.2.840.113549.1.7.1",
    ;           "signingTime": "180608182517Z",
    ;           "messageDigest": "trzyxXbZ96z2M4mncyZ7BNMV4yIT92+5sS27Fu64iG8=",
    ;           "signingAlgOid": "1.2.840.113549.1.1.11",
    ;           "signerDigest": "trzyxXbZ96z2M4mncyZ7BNMV4yIT92+5sS27Fu64iG8="
    ;         }
    ;       ]
    ;     }
    ;   }
    ; }
    ; 

    i.i
    count_i.i
    strVal.s
    certSerialNumber.s
    certIssuerCN.s
    certIssuerDN.s
    certDigestAlgOid.s
    certDigestAlgName.s
    contentType.s
    signingTime.s
    messageDigest.s
    signingAlgOid.s
    signerDigest.s
    dt.i = CkDateTime::ckCreate()
    If dt.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    i = 0
    count_i = CkJsonObject::ckSizeOfArray(json,"pkcs7.verify.digestAlgorithms")
    While i < count_i
        CkJsonObject::setCkI(json, i)
        strVal = CkJsonObject::ckStringOf(json,"pkcs7.verify.digestAlgorithms[i]")
        i = i + 1
    Wend
    i = 0
    count_i = CkJsonObject::ckSizeOfArray(json,"pkcs7.verify.signerInfo")
    While i < count_i
        CkJsonObject::setCkI(json, i)
        certSerialNumber = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].cert.serialNumber")
        certIssuerCN = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].cert.issuerCN")
        certIssuerDN = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].cert.issuerDN")
        certDigestAlgOid = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].cert.digestAlgOid")
        certDigestAlgName = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].cert.digestAlgName")
        contentType = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].contentType")
        signingTime = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].signingTime")

        ; The signingTime isin UTCTime format.
        ; UTCTime values take the form of either "YYMMDDhhmm[ss]Z" or "YYMMDDhhmm[ss](+|-)hhmm"
        ; Starting in Chilkat v9.5.0.77, the SetFromTimestamp method auto-recognizes the UTCTime format and parses it correctly.
        success = CkDateTime::ckSetFromTimestamp(dt,signingTime)
        ; To get the signingTime in other date/time formats, look at the online reference documentation for CkDateTime.
        ; There are numerous methods such as GetAsDateTime, GetAsIso8601, GetAsUnixTime, GetAsRfc822, etc.

        messageDigest = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].messageDigest")
        signingAlgOid = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].signingAlgOid")
        signerDigest = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].signerDigest")
        i = i + 1
    Wend

    ; println crypt.LastErrorText;
    Debug "Success."


    CkBinData::ckDispose(bd)
    CkCrypt2::ckDispose(crypt)
    CkJsonObject::ckDispose(json)
    CkDateTime::ckDispose(dt)


    ProcedureReturn
EndProcedure