Chilkat HOME Android™ Classic ASP C C++ C# Mono C# .NET Core C# C# UWP/WinRT DataFlex Delphi ActiveX Delphi DLL Visual FoxPro Java Lianja MFC Objective-C Perl PHP ActiveX PHP Extension PowerBuilder PowerShell PureBasic CkPython Chilkat2-Python Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ Visual Basic 6.0 VB.NET VB.NET UWP/WinRT VBScript Xojo Plugin Node.js Excel Go
(Excel) RFC3161 Timestamp Client - Fetch from Timestamp Authority (TSA) and VerifySends an RFC 3161 timestamp request to a TSA (Timestamp Authority) server and validates the timestamp token response. Note: This example requires Chilkat v9.5.0.75 or greater.
' Note: Requires Chilkat v9.5.0.75 or greater. ' This requires the Chilkat API to have been previously unlocked. ' See Global Unlock Sample for sample code. ' First sha-256 hash the data that is to be timestamped. ' In this example, the data is the string "Hello World" Dim crypt As Chilkat.Crypt2 Set crypt = Chilkat.NewCrypt2 crypt.HashAlgorithm = "sha256" crypt.EncodingMode = "base64" base64Hash = crypt.HashStringENC("Hello World") Dim http As Chilkat.Http Set http = Chilkat.NewHttp Dim requestToken As Chilkat.BinData Set requestToken = Chilkat.NewBinData optionalPolicyOid = "" addNonce = False requestTsaCert = True ' Create a time-stamp request token success = http.CreateTimestampRequest("sha256",base64Hash,optionalPolicyOid,addNonce,requestTsaCert,requestToken) If (success <> True) Then Debug.Print http.LastErrorText Exit Sub End If ' Send the time-stamp request token to the TSA. ' This is the equivalent of the following CURL command: ' curl -H "Content-Type: application/timestamp-query" --data-binary '@file.tsq' https://freetsa.org/tsr > file.tsr tsaUrl = "https://freetsa.org/tsr" ' Another timestamp server you could try is: http://timestamp.digicert.com tsaUrl = "http://timestamp.digicert.com" Set resp = http.PBinaryBd("POST",tsaUrl,requestToken,"application/timestamp-query",False,False) If (http.LastMethodSuccess <> True) Then Debug.Print http.LastErrorText Exit Sub End If ' Get the timestamp reply from the HTTP response object. Dim timestampReply As Chilkat.BinData Set timestampReply = Chilkat.NewBinData Dim success As Boolean success = resp.GetBodyBd(timestampReply) ' Show the base64 encoded timestamp reply. Debug.Print timestampReply.GetEncoded("base64") ' Let's verify the timestamp reply against the TSA's cert, which we've previously downloaded. ' See https://freetsa.org/index_en.php Dim tsaCert As Chilkat.Cert Set tsaCert = Chilkat.NewCert success = tsaCert.LoadFromFile("qa_data/certs/freetsa.org.cer") If (success <> True) Then Debug.Print tsaCert.LastErrorText Exit Sub End If ' The VerifyTimestampReply method will return one of the following values: ' -1: The timestampReply does not contain a valid timestamp reply. ' -2: The timestampReply is a valid timestamp reply, but failed verification using the public key of the tsaCert. ' 0: Granted and verified. ' 1: Granted and verified, with mods (see RFC 3161) ' 2: Rejected. ' 3: Waiting. ' 4: Revocation Warning ' 5: Revocation Notification pkiStatus = http.VerifyTimestampReply(timestampReply,tsaCert) If (pkiStatus < 0) Then Debug.Print http.LastErrorText Exit Sub End If Debug.Print "pkiStatus = "; pkiStatus Set json = http.LastJsonData() json.EmitCompact = False Debug.Print json.Emit() ' The LastJsonData looks like the following. ' Note: The "timestampReply.pkiStatus" portion of the LastJsonData was added in Chilkat v9.5.0.83 ' Use this online tool to generate parsing code from sample JSON: ' Generate Parsing Code from JSON ' { ' "timestampReply": { ' "pkiStatus": { ' "value": 0, ' "meaning": "granted" ' } ' }, ' "pkcs7": { ' "verify": { ' "digestAlgorithms": [ ' "sha256" ' ], ' "signerInfo": [ ' { ' "cert": { ' "serialNumber": "04CD3F8568AE76C61BB0FE7160CCA76D", ' "issuerCN": "DigiCert SHA2 Assured ID Timestamping CA", ' "digestAlgOid": "2.16.840.1.101.3.4.2.1", ' "digestAlgName": "SHA256" ' }, ' "contentType": "1.2.840.113549.1.9.16.1.4", ' "signingTime": "200405023019Z", ' "messageDigest": "f14zOsdnN9vyyV3HjjBiLzNDi1PF28hAFMODxNkNRZs=", ' "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.5": { ' "name": "signingTime", ' "utctime": "200405023019Z" ' }, ' "1.2.840.113549.1.9.16.2.12": { ' "name": "signingCertificate", ' "der": "MBowGDAWBBQDJb1QXtqWMC3CL0+gHkwovig0xQ==" ' }, ' "1.2.840.113549.1.9.4": { ' "name": "messageDigest", ' "digest": "f14zOsdnN9vyyV3HjjBiLzNDi1PF28hAFMODxNkNRZs=" ' } ' } ' } ' ] ' } ' } ' } Dim signingTime As Chilkat.DtObj Set signingTime = Chilkat.NewDtObj Dim authAttrSigningTimeUtctime As Chilkat.DtObj Set authAttrSigningTimeUtctime = Chilkat.NewDtObj timestampReplyPkiStatusValue = json.IntOf("timestampReply.pkiStatus.value") timestampReplyPkiStatusMeaning = json.StringOf("timestampReply.pkiStatus.meaning") i = 0 count_i = json.SizeOfArray("pkcs7.verify.digestAlgorithms") Do While i < count_i json.I = i strVal = json.StringOf("pkcs7.verify.digestAlgorithms[i]") i = i + 1 Loop i = 0 count_i = json.SizeOfArray("pkcs7.verify.signerInfo") Do While i < count_i json.I = i certSerialNumber = json.StringOf("pkcs7.verify.signerInfo[i].cert.serialNumber") certIssuerCN = json.StringOf("pkcs7.verify.signerInfo[i].cert.issuerCN") certDigestAlgOid = json.StringOf("pkcs7.verify.signerInfo[i].cert.digestAlgOid") certDigestAlgName = json.StringOf("pkcs7.verify.signerInfo[i].cert.digestAlgName") contentType = json.StringOf("pkcs7.verify.signerInfo[i].contentType") success = json.DtOf("pkcs7.verify.signerInfo[i].signingTime",False,signingTime) messageDigest = json.StringOf("pkcs7.verify.signerInfo[i].messageDigest") signingAlgOid = json.StringOf("pkcs7.verify.signerInfo[i].signingAlgOid") signingAlgName = json.StringOf("pkcs7.verify.signerInfo[i].signingAlgName") authAttrContentTypeName = json.StringOf("pkcs7.verify.signerInfo[i].authAttr.""1.2.840.113549.1.9.3"".name") authAttrContentTypeOid = json.StringOf("pkcs7.verify.signerInfo[i].authAttr.""1.2.840.113549.1.9.3"".oid") authAttrSigningTimeName = json.StringOf("pkcs7.verify.signerInfo[i].authAttr.""1.2.840.113549.1.9.5"".name") success = json.DtOf("pkcs7.verify.signerInfo[i].authAttr.""1.2.840.113549.1.9.5"".utctime",False,authAttrSigningTimeUtctime) authAttrSigningCertificateName = json.StringOf("pkcs7.verify.signerInfo[i].authAttr.""1.2.840.113549.1.9.16.2.12"".name") authAttrSigningCertificateDer = json.StringOf("pkcs7.verify.signerInfo[i].authAttr.""1.2.840.113549.1.9.16.2.12"".der") authAttrMessageDigestName = json.StringOf("pkcs7.verify.signerInfo[i].authAttr.""1.2.840.113549.1.9.4"".name") authAttrMessageDigestDigest = json.StringOf("pkcs7.verify.signerInfo[i].authAttr.""1.2.840.113549.1.9.4"".digest") i = i + 1 Loop |
© 2000-2022 Chilkat Software, Inc. All Rights Reserved.