PowerBuilder
PowerBuilder
Validate CAdES-T Signature (.p7m)
See more CAdES Examples
Validates a CAdES-T CMS signature and extracts the time-stamp token and gets information about it. Also validates the time-stamp token.Chilkat PowerBuilder Downloads
integer li_rc
integer li_Success
oleobject loo_Crypt
oleobject loo_CmsOptions
oleobject loo_Json
integer i
integer li_Count_i
string ls_StrVal
string ls_CertSerialNumber
string ls_CertIssuerCN
string ls_CertIssuerDN
string ls_CertDigestAlgOid
string ls_CertDigestAlgName
string ls_ContentType
oleobject loo_SigningTime
string ls_MessageDigest
string ls_SigningAlgOid
string ls_SigningAlgName
string ls_AuthAttrContentTypeName
string ls_AuthAttrContentTypeOid
string ls_AuthAttrSigningTimeName
oleobject loo_AuthAttrSigningTimeUtctime
string ls_AuthAttrMessageDigestName
string ls_AuthAttrMessageDigestDigest
string ls_AuthAttrSigningCertificateV2Name
string ls_AuthAttrSigningCertificateV2Der
string ls_UnauthAttrTimestampTokenName
string ls_UnauthAttrTimestampTokenDer
integer li_UnauthAttrTimestampTokenTimestampSignatureVerified
string ls_UnauthAttrTimestampTokenTstInfoTsaPolicyId
string ls_UnauthAttrTimestampTokenTstInfoMessageImprintHashAlg
string ls_UnauthAttrTimestampTokenTstInfoMessageImprintDigest
integer li_UnauthAttrTimestampTokenTstInfoMessageImprintDigestMatches
string ls_UnauthAttrTimestampTokenTstInfoSerialNumber
oleobject loo_UnauthAttrTimestampTokenTstInfoGenTime
integer j
integer li_Count_j
li_Success = 0
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
loo_Crypt = create oleobject
li_rc = loo_Crypt.ConnectToNewObject("Chilkat.Crypt2")
if li_rc < 0 then
destroy loo_Crypt
MessageBox("Error","Connecting to COM object failed")
return
end if
// Indicate that the CAdES-T timestamp tokens must also pass validation for the signature to be validated.
loo_CmsOptions = create oleobject
li_rc = loo_CmsOptions.ConnectToNewObject("Chilkat.JsonObject")
loo_CmsOptions.UpdateBool("ValidateTimestampTokens",1)
loo_Crypt.CmsOptions = loo_CmsOptions.Emit()
// Validate the .p7m and extract the original signed data to an output file.
// Note: The timestampToken is an unauthenticated attribute. See the code below that retrieves and parses the last JSON data.
// for details about examining timestampToken.
li_Success = loo_Crypt.VerifyP7M("qa_data/cades/CAdES-T/Signature-C-T-1.p7m","qa_output/out.dat")
// Get information about the CMS signature in the last JSON data.
// The detailed results of the signature validation are available in the last JSON data.
// (If the non-success return status was caused by an error such as "file not found", then the
// last JSON data would be empty.)
loo_Json = create oleobject
li_rc = loo_Json.ConnectToNewObject("Chilkat.JsonObject")
loo_Crypt.GetLastJsonData(loo_Json)
loo_Json.EmitCompact = 0
Write-Debug loo_Json.Emit()
// Here is a sample result:
// See the parsing code below..
// Use this online tool to generate parsing code from sample JSON:
// Generate Parsing Code from JSON
// {
// "pkcs7": {
// "verify": {
// "digestAlgorithms": [
// "sha256"
// ],
// "signerInfo": [
// {
// "cert": {
// "serialNumber": "00DCB814678CDB",
// "issuerCN": "LevelBCAOK",
// "issuerDN": "",
// "digestAlgOid": "2.16.840.1.101.3.4.2.1",
// "digestAlgName": "SHA256"
// },
// "contentType": "1.2.840.113549.1.7.1",
// "signingTime": "131203065741Z",
// "messageDigest": "JJZt41Nt8VsYahP+Xti4rR3vBDkUfRd6gquItl6R5Os=",
// "signingAlgOid": "1.2.840.113549.1.1.1",
// "signingAlgName": "RSA-PKCSV-1_5",
// "authAttr": {
// "1.2.840.113549.1.9.3": {
// "name": "contentType",
// "oid": "1.2.840.113549.1.7.1"
// },
// "1.2.840.113549.1.9.5": {
// "name": "signingTime",
// "utctime": "131203065741Z"
// },
// "1.2.840.113549.1.9.4": {
// "name": "messageDigest",
// "digest": "JJZt41Nt8VsYahP+Xti4rR3vBDkUfRd6gquItl6R5Os="
// },
// "1.2.840.113549.1.9.16.2.47": {
// "name": "signingCertificateV2",
// "der": "MIGIMIGFMIGCBCBJrxOU0w0dWGsVovjLv9QDH3syB5mLVv3grSYA40x9IDBeMFOkUTBPMQswCQYDVQQGEwJGUjENMAsGA1UEChMERVRTSTEcMBoGA1UECwwTUGx1Z3Rlc3RzXzIwMTMtMjAxNDETMBEGA1UEAxMKTGV2ZWxCQ0FPSwIHANy4FGeM2w=="
// }
// },
// "unauthAttr": {
// "1.2.840.113549.1.9.16.2.14": {
// "name": "timestampToken",
// "der": "MIIL+AYJKoZI...u7CfcjURNTY=",
// "verify": {
// "digestAlgorithms": [
// "sha256"
// ],
// "signerInfo": [
// {
// "cert": {
// "serialNumber": "01AA4592D36C61",
// "issuerCN": "RootCAOK",
// "issuerDN": "",
// "digestAlgOid": "2.16.840.1.101.3.4.2.1",
// "digestAlgName": "SHA256"
// },
// "contentType": "1.2.840.113549.1.9.16.1.4",
// "messageDigest": "NSsMUrfoyCQ0OszPE1YLx1j3EyyCiBmnE5Sua6ghu/Q=",
// "signingAlgOid": "1.2.840.113549.1.1.1",
// "signingAlgName": "RSA-PKCSV-1_5",
// "authAttr": {
// "1.2.840.113549.1.9.3": {
// "name": "contentType",
// "oid": "1.2.840.113549.1.9.16.1.4"
// },
// "1.2.840.113549.1.9.4": {
// "name": "messageDigest",
// "digest": "NSsMUrfoyCQ0OszPE1YLx1j3EyyCiBmnE5Sua6ghu/Q="
// },
// "1.2.840.113549.1.9.16.2.47": {
// "name": "signingCertificateV2",
// "der": "MIGGMIGDMIGABCDB/np5UxvhcPnSxD2Kme+C88uXGCMWLAvFPHNvTApTWDBcMFGkTzBNMQswCQYDVQQGEwJGUjENMAsGA1UEChMERVRTSTEcMBoGA1UECwwTUGx1Z3Rlc3RzXzIwMTMtMjAxNDERMA8GA1UEAxMIUm9vdENBT0sCBwGqRZLTbGE="
// }
// }
// }
// ]
// },
// "timestampSignatureVerified": true,
// "tstInfo": {
// "tsaPolicyId": "1.3.6.1.4.1.2706.2.2.5.2.1.1.1",
// "messageImprint": {
// "hashAlg": "sha256",
// "digest": "C8xEe9NA4X1cUyHGX9zG89ipmQ2byFs3aa+Xe4Fz2P0=",
// "digestMatches": true
// },
// "serialNumber": "313E162121D922",
// "genTime": "20131203065742Z"
// }
// }
// }
// }
// ]
// }
// }
// }
//
loo_SigningTime = create oleobject
li_rc = loo_SigningTime.ConnectToNewObject("Chilkat.DtObj")
loo_AuthAttrSigningTimeUtctime = create oleobject
li_rc = loo_AuthAttrSigningTimeUtctime.ConnectToNewObject("Chilkat.DtObj")
loo_UnauthAttrTimestampTokenTstInfoGenTime = create oleobject
li_rc = loo_UnauthAttrTimestampTokenTstInfoGenTime.ConnectToNewObject("Chilkat.DtObj")
// Iterate over the hash algorithms used in the signature.
i = 0
li_Count_i = loo_Json.SizeOfArray("pkcs7.verify.digestAlgorithms")
do while i < li_Count_i
loo_Json.I = i
ls_StrVal = loo_Json.StringOf("pkcs7.verify.digestAlgorithms[i]")
i = i + 1
loop
// For each signer...
i = 0
li_Count_i = loo_Json.SizeOfArray("pkcs7.verify.signerInfo")
do while i < li_Count_i
loo_Json.I = i
// Get information about the certificate used by this signer.
ls_CertSerialNumber = loo_Json.StringOf("pkcs7.verify.signerInfo[i].cert.serialNumber")
ls_CertIssuerCN = loo_Json.StringOf("pkcs7.verify.signerInfo[i].cert.issuerCN")
ls_CertIssuerDN = loo_Json.StringOf("pkcs7.verify.signerInfo[i].cert.issuerDN")
ls_CertDigestAlgOid = loo_Json.StringOf("pkcs7.verify.signerInfo[i].cert.digestAlgOid")
ls_CertDigestAlgName = loo_Json.StringOf("pkcs7.verify.signerInfo[i].cert.digestAlgName")
// Get additional information for this signer, such as the signingTime, signature algorithm, etc.
ls_ContentType = loo_Json.StringOf("pkcs7.verify.signerInfo[i].contentType")
loo_Json.DtOf("pkcs7.verify.signerInfo[i].signingTime",0,loo_SigningTime)
ls_MessageDigest = loo_Json.StringOf("pkcs7.verify.signerInfo[i].messageDigest")
ls_SigningAlgOid = loo_Json.StringOf("pkcs7.verify.signerInfo[i].signingAlgOid")
ls_SigningAlgName = loo_Json.StringOf("pkcs7.verify.signerInfo[i].signingAlgName")
// --------------------------------
// Examine authenticated attributes.
// --------------------------------
// contentType
if loo_Json.HasMember("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.3~"") = 1 then
ls_AuthAttrContentTypeName = loo_Json.StringOf("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.3~".name")
ls_AuthAttrContentTypeOid = loo_Json.StringOf("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.3~".oid")
end if
// signingTime
if loo_Json.HasMember("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.5~"") = 1 then
ls_AuthAttrSigningTimeName = loo_Json.StringOf("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.5~".name")
loo_Json.DtOf("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.5~".utctime",0,loo_AuthAttrSigningTimeUtctime)
end if
// messageDigest
if loo_Json.HasMember("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.4~"") = 1 then
ls_AuthAttrMessageDigestName = loo_Json.StringOf("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.4~".name")
ls_AuthAttrMessageDigestDigest = loo_Json.StringOf("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.4~".digest")
end if
// signingCertificateV2
if loo_Json.HasMember("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.16.2.47~"") = 1 then
ls_AuthAttrSigningCertificateV2Name = loo_Json.StringOf("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.16.2.47~".name")
ls_AuthAttrSigningCertificateV2Der = loo_Json.StringOf("pkcs7.verify.signerInfo[i].authAttr.~"1.2.840.113549.1.9.16.2.47~".der")
end if
// --------------------------------
// Examine unauthenticated attributes.
// --------------------------------
// timestampToken (the timestampToken is what makes this signature a CAdES-T)
if loo_Json.HasMember("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~"") = 1 then
ls_UnauthAttrTimestampTokenName = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".name")
ls_UnauthAttrTimestampTokenDer = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".der")
// This is where we find out if the timestampToken's signature is valid.
li_UnauthAttrTimestampTokenTimestampSignatureVerified = loo_Json.BoolOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".timestampSignatureVerified")
ls_UnauthAttrTimestampTokenTstInfoTsaPolicyId = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".tstInfo.tsaPolicyId")
ls_UnauthAttrTimestampTokenTstInfoMessageImprintHashAlg = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".tstInfo.messageImprint.hashAlg")
ls_UnauthAttrTimestampTokenTstInfoMessageImprintDigest = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".tstInfo.messageImprint.digest")
// Here is where we check to see if the digest in the timestampToken's messageImprint matches the digest of the signature of this signerInfo
li_UnauthAttrTimestampTokenTstInfoMessageImprintDigestMatches = loo_Json.BoolOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".tstInfo.messageImprint.digestMatches")
ls_UnauthAttrTimestampTokenTstInfoSerialNumber = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".tstInfo.serialNumber")
// Here is where we get the date/time of the timestampToken (i.e. when it was timestamped)
loo_Json.DtOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".tstInfo.genTime",0,loo_UnauthAttrTimestampTokenTstInfoGenTime)
// The following code gets details about the validity of the timestampToken's signature...
j = 0
li_Count_j = loo_Json.SizeOfArray("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.digestAlgorithms")
do while j < li_Count_j
loo_Json.J = j
ls_StrVal = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.digestAlgorithms[j]")
j = j + 1
loop
j = 0
li_Count_j = loo_Json.SizeOfArray("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo")
do while j < li_Count_j
loo_Json.J = j
ls_CertSerialNumber = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].cert.serialNumber")
ls_CertIssuerCN = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].cert.issuerCN")
ls_CertIssuerDN = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].cert.issuerDN")
ls_CertDigestAlgOid = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].cert.digestAlgOid")
ls_CertDigestAlgName = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].cert.digestAlgName")
ls_ContentType = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].contentType")
ls_MessageDigest = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].messageDigest")
ls_SigningAlgOid = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].signingAlgOid")
ls_SigningAlgName = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].signingAlgName")
ls_AuthAttrContentTypeName = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].authAttr.~"1.2.840.113549.1.9.3~".name")
ls_AuthAttrContentTypeOid = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].authAttr.~"1.2.840.113549.1.9.3~".oid")
ls_AuthAttrMessageDigestName = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].authAttr.~"1.2.840.113549.1.9.4~".name")
ls_AuthAttrMessageDigestDigest = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].authAttr.~"1.2.840.113549.1.9.4~".digest")
ls_AuthAttrSigningCertificateV2Name = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].authAttr.~"1.2.840.113549.1.9.16.2.47~".name")
ls_AuthAttrSigningCertificateV2Der = loo_Json.StringOf("pkcs7.verify.signerInfo[i].unauthAttr.~"1.2.840.113549.1.9.16.2.14~".verify.signerInfo[j].authAttr.~"1.2.840.113549.1.9.16.2.47~".der")
j = j + 1
loop
end if
i = i + 1
loop
if li_Success <> 1 then
Write-Debug loo_Crypt.LastErrorText
Write-Debug "CAdES-T verification failed."
else
Write-Debug "CAdES-T signature is valid."
end if
destroy loo_Crypt
destroy loo_CmsOptions
destroy loo_Json
destroy loo_SigningTime
destroy loo_AuthAttrSigningTimeUtctime
destroy loo_UnauthAttrTimestampTokenTstInfoGenTime