Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(PureBasic) Verify a CAdES-BES Signature and Examine Signature ContentsDemonstrates how to validate a .p7m (.p7s) signature and examine the contents of the signature.
IncludeFile "CkDtObj.pb" IncludeFile "CkJsonObject.pb" IncludeFile "CkCrypt2.pb" Procedure ChilkatExample() ; This example requires the Chilkat API to have been previously unlocked. ; See Global Unlock Sample for sample code. crypt.i = CkCrypt2::ckCreate() If crypt.i = 0 Debug "Failed to create object." ProcedureReturn EndIf outputFile.s = "qa_output/original.xml" inFile.s = "qa_data/p7m/fattura_signature.xml.p7m" ; Verify the signature and extract the contained file, which in this case is XML. success.i = CkCrypt2::ckVerifyP7M(crypt,inFile,outputFile) If success = 0 Debug CkCrypt2::ckLastErrorText(crypt) CkCrypt2::ckDispose(crypt) ProcedureReturn EndIf Debug "Signature validated." ; Now let's examine the information about the signature. json.i = CkCrypt2::ckLastJsonData(crypt) If CkCrypt2::ckLastMethodSuccess(crypt) = 0 ; This should never be the case... Debug "No information available." CkCrypt2::ckDispose(crypt) ProcedureReturn EndIf CkJsonObject::setCkEmitCompact(json, 0) Debug CkJsonObject::ckEmit(json) ; Here's an example of the information about the signature: ; { ; "pkcs7": { ; "verify": { ; "certs": [ ; { ; "issuerCN": "Xyz EU Qualified Certificates CA G1", ; "serial": "99A28A51AC389999" ; } ; ], ; "useConstructedOctets": true, ; "digestAlgorithms": [ ; "sha256" ; ], ; "signerInfo": [ ; { ; "cert": { ; "subjectKeyIdentifier": "5VM4x8AWnXf07yzbXuLtbb0U3yY=", ; "digestAlgOid": "2.16.840.1.101.3.4.2.1", ; "digestAlgName": "SHA256" ; }, ; "signingAlgOid": "1.2.840.113549.1.1.11", ; "signingAlgName": "RSA-SHA256-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": "190901152340Z" ; }, ; "1.2.840.113549.1.9.4": { ; "name": "messageDigest", ; "digest": "y+gd/zAQK33A//HInhaZba7w1fUJleV9AHbP1Ntx6U0=" ; }, ; "1.2.840.113549.1.9.16.2.47": { ; "name": "signingCertificateV2", ; "der": "MIH4MI..w4vv0=" ; } ; } ; } ; ] ; } ; } ; } ; Use this online tool to generate parsing code from sample JSON: ; Generate Parsing Code from JSON authAttrSigningTimeUtctime.i = CkDtObj::ckCreate() If authAttrSigningTimeUtctime.i = 0 Debug "Failed to create object." ProcedureReturn EndIf issuerCN.s serial.s strVal.s certSubjectKeyIdentifier.s certDigestAlgOid.s certDigestAlgName.s signingAlgOid.s signingAlgName.s authAttrContentTypeName.s authAttrContentTypeOid.s authAttrSigningTimeName.s authAttrMessageDigestName.s authAttrMessageDigestDigest.s authAttrSigningCertificateV2Name.s authAttrSigningCertificateV2Der.s i.i = 0 count_i.i = CkJsonObject::ckSizeOfArray(json,"pkcs7.verify.certs") While i < count_i CkJsonObject::setCkI(json, i) issuerCN = CkJsonObject::ckStringOf(json,"pkcs7.verify.certs[i].issuerCN") serial = CkJsonObject::ckStringOf(json,"pkcs7.verify.certs[i].serial") i = i + 1 Wend 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) certSubjectKeyIdentifier = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].cert.subjectKeyIdentifier") certDigestAlgOid = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].cert.digestAlgOid") certDigestAlgName = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].cert.digestAlgName") signingAlgOid = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].signingAlgOid") signingAlgName = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].signingAlgName") authAttrContentTypeName = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].authAttr." + Chr(34) + "1.2.840.113549.1.9.3" + Chr(34) + ".name") authAttrContentTypeOid = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].authAttr." + Chr(34) + "1.2.840.113549.1.9.3" + Chr(34) + ".oid") authAttrSigningTimeName = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].authAttr." + Chr(34) + "1.2.840.113549.1.9.5" + Chr(34) + ".name") CkJsonObject::ckDtOf(json,"pkcs7.verify.signerInfo[i].authAttr." + Chr(34) + "1.2.840.113549.1.9.5" + Chr(34) + ".utctime",0,authAttrSigningTimeUtctime) authAttrMessageDigestName = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].authAttr." + Chr(34) + "1.2.840.113549.1.9.4" + Chr(34) + ".name") authAttrMessageDigestDigest = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].authAttr." + Chr(34) + "1.2.840.113549.1.9.4" + Chr(34) + ".digest") authAttrSigningCertificateV2Name = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].authAttr." + Chr(34) + "1.2.840.113549.1.9.16.2.47" + Chr(34) + ".name") authAttrSigningCertificateV2Der = CkJsonObject::ckStringOf(json,"pkcs7.verify.signerInfo[i].authAttr." + Chr(34) + "1.2.840.113549.1.9.16.2.47" + Chr(34) + ".der") i = i + 1 Wend CkJsonObject::ckDispose(json) CkCrypt2::ckDispose(crypt) CkDtObj::ckDispose(authAttrSigningTimeUtctime) ProcedureReturn EndProcedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.