Sample code for 30+ languages & platforms
DataFlex

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 DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Variant vBd
    Handle hoBd
    Handle hoCrypt
    Variant vJson
    Handle hoJson
    Integer i
    Integer iCount_i
    String sStrVal
    String sCertSerialNumber
    String sCertIssuerCN
    String sCertIssuerDN
    String sCertDigestAlgOid
    String sCertDigestAlgName
    String sContentType
    String sSigningTime
    String sMessageDigest
    String sSigningAlgOid
    String sSignerDigest
    Handle hoDt
    String sTemp1

    Move False To iSuccess

    // 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..
    Get Create (RefClass(cComChilkatBinData)) To hoBd
    If (Not(IsComObjectCreated(hoBd))) Begin
        Send CreateComObject of hoBd
    End
    Get ComLoadFile Of hoBd "qa_data/p7s/sample.p7s" To iSuccess
    If (iSuccess <> True) Begin
        Showln "Failed to load .p7s file."
        Procedure_Return
    End

    Get Create (RefClass(cComChilkatCrypt2)) To hoCrypt
    If (Not(IsComObjectCreated(hoCrypt))) Begin
        Send CreateComObject of hoCrypt
    End

    // Assuming this is a signature that contains the original data that was signed..
    Get pvComObject of hoBd to vBd
    Get ComOpaqueVerifyBd Of hoCrypt vBd To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoCrypt To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    // Examine the last JSON data after signature verification..
    Get Create (RefClass(cComChilkatJsonObject)) To hoJson
    If (Not(IsComObjectCreated(hoJson))) Begin
        Send CreateComObject of hoJson
    End
    Get pvComObject of hoJson to vJson
    Send ComGetLastJsonData To hoCrypt vJson

    Set ComEmitCompact Of hoJson To False
    Get ComEmit Of hoJson To sTemp1
    Showln sTemp1

    // 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="
    //         }
    //       ]
    //     }
    //   }
    // }
    // 

    Get Create (RefClass(cComCkDateTime)) To hoDt
    If (Not(IsComObjectCreated(hoDt))) Begin
        Send CreateComObject of hoDt
    End

    Move 0 To i
    Get ComSizeOfArray Of hoJson "pkcs7.verify.digestAlgorithms" To iCount_i
    While (i < iCount_i)
        Set ComI Of hoJson To i
        Get ComStringOf Of hoJson "pkcs7.verify.digestAlgorithms[i]" To sStrVal
        Move (i + 1) To i
    Loop

    Move 0 To i
    Get ComSizeOfArray Of hoJson "pkcs7.verify.signerInfo" To iCount_i
    While (i < iCount_i)
        Set ComI Of hoJson To i
        Get ComStringOf Of hoJson "pkcs7.verify.signerInfo[i].cert.serialNumber" To sCertSerialNumber
        Get ComStringOf Of hoJson "pkcs7.verify.signerInfo[i].cert.issuerCN" To sCertIssuerCN
        Get ComStringOf Of hoJson "pkcs7.verify.signerInfo[i].cert.issuerDN" To sCertIssuerDN
        Get ComStringOf Of hoJson "pkcs7.verify.signerInfo[i].cert.digestAlgOid" To sCertDigestAlgOid
        Get ComStringOf Of hoJson "pkcs7.verify.signerInfo[i].cert.digestAlgName" To sCertDigestAlgName
        Get ComStringOf Of hoJson "pkcs7.verify.signerInfo[i].contentType" To sContentType
        Get ComStringOf Of hoJson "pkcs7.verify.signerInfo[i].signingTime" To sSigningTime

        // 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.
        Get ComSetFromTimestamp Of hoDt sSigningTime To iSuccess
        // 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.

        Get ComStringOf Of hoJson "pkcs7.verify.signerInfo[i].messageDigest" To sMessageDigest
        Get ComStringOf Of hoJson "pkcs7.verify.signerInfo[i].signingAlgOid" To sSigningAlgOid
        Get ComStringOf Of hoJson "pkcs7.verify.signerInfo[i].signerDigest" To sSignerDigest
        Move (i + 1) To i
    Loop

    // println crypt.LastErrorText;
    Showln "Success."


End_Procedure