DataFlex
DataFlex
Extract TSTInfo from RFC3161 Timestamp Reply
See more HTTP Examples
Sends an RFC 3161 timestamp request to a TSA (Timestamp Authority) server and converts the timestamp reply to XML, and then extracts the TSTInfo from the XML and converts it to XML.Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoCrypt
String sBase64Hash
Handle hoHttp
Variant vRequestToken
Handle hoRequestToken
String sOptionalPolicyOid
Boolean iAddNonce
Boolean iRequestTsaCert
String sTsaUrl
Variant vResp
Handle hoResp
Variant vTimestampReply
Handle hoTimestampReply
Handle hoAsn
Handle hoXml
String sTstInfoBase64
Variant vBdTstInfo
Handle hoBdTstInfo
TstInfo Handle hoAsnTstInfo
TstInfo Handle hoXmlTstInfo
Handle hoSbGenTime
String sTemp1
Move False To iSuccess
// 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"
Get Create (RefClass(cComChilkatCrypt2)) To hoCrypt
If (Not(IsComObjectCreated(hoCrypt))) Begin
Send CreateComObject of hoCrypt
End
Set ComHashAlgorithm Of hoCrypt To "sha256"
Set ComEncodingMode Of hoCrypt To "base64"
Get ComHashFileENC Of hoCrypt "qa_data/hamlet.xml" To sBase64Hash
Get Create (RefClass(cComChilkatHttp)) To hoHttp
If (Not(IsComObjectCreated(hoHttp))) Begin
Send CreateComObject of hoHttp
End
Get Create (RefClass(cComChilkatBinData)) To hoRequestToken
If (Not(IsComObjectCreated(hoRequestToken))) Begin
Send CreateComObject of hoRequestToken
End
Move "" To sOptionalPolicyOid
Move False To iAddNonce
Move True To iRequestTsaCert
// Create a time-stamp request token
Get pvComObject of hoRequestToken to vRequestToken
Get ComCreateTimestampRequest Of hoHttp "sha256" sBase64Hash sOptionalPolicyOid iAddNonce iRequestTsaCert vRequestToken To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoHttp To sTemp1
Showln sTemp1
Procedure_Return
End
// 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' http://timestamp.digicert.com > file.tsr
Move "http://timestamp.digicert.com" To sTsaUrl
Get Create (RefClass(cComChilkatHttpResponse)) To hoResp
If (Not(IsComObjectCreated(hoResp))) Begin
Send CreateComObject of hoResp
End
Get pvComObject of hoRequestToken to vRequestToken
Get pvComObject of hoResp to vResp
Get ComHttpBd Of hoHttp "POST" sTsaUrl vRequestToken "application/timestamp-query" vResp To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoHttp To sTemp1
Showln sTemp1
Procedure_Return
End
// Get the timestamp reply from the HTTP response object.
Get Create (RefClass(cComChilkatBinData)) To hoTimestampReply
If (Not(IsComObjectCreated(hoTimestampReply))) Begin
Send CreateComObject of hoTimestampReply
End
Get pvComObject of hoTimestampReply to vTimestampReply
Get ComGetBodyBd Of hoResp vTimestampReply To iSuccess
// Convert the binary timestamp reply to XML
Get Create (RefClass(cComChilkatAsn)) To hoAsn
If (Not(IsComObjectCreated(hoAsn))) Begin
Send CreateComObject of hoAsn
End
Get pvComObject of hoTimestampReply to vTimestampReply
Get ComLoadBd Of hoAsn vTimestampReply To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoAsn To sTemp1
Showln sTemp1
Procedure_Return
End
Get Create (RefClass(cComChilkatXml)) To hoXml
If (Not(IsComObjectCreated(hoXml))) Begin
Send CreateComObject of hoXml
End
Get ComAsnToXml Of hoAsn To sTemp1
Get ComLoadXml Of hoXml sTemp1 To iSuccess
// Extract the TSTInfo from the XML.
// The TSTInfo is this base64 encoded ASN.1
// TSTInfo ::= SEQUENCE {
// version INTEGER { v1(1) },
// policy TSAPolicyId,
// messageImprint MessageImprint,
// -- MUST have the same value as the similar field in
// -- TimeStampReq
// serialNumber INTEGER,
// -- Time-Stamping users MUST be ready to accommodate integers
// -- up to 160 bits.
// genTime GeneralizedTime,
// accuracy Accuracy OPTIONAL,
// ordering BOOLEAN DEFAULT FALSE,
// nonce INTEGER OPTIONAL,
// -- MUST be present if the similar field was present
// -- in TimeStampReq. In that case it MUST have the same value.
// tsa [0] GeneralName OPTIONAL,
// extensions [1] IMPLICIT Extensions OPTIONAL }
Get ComGetChildContent Of hoXml "sequence[1]|contextSpecific|sequence|sequence|contextSpecific|octets" To sTstInfoBase64
Get Create (RefClass(cComChilkatBinData)) To hoBdTstInfo
If (Not(IsComObjectCreated(hoBdTstInfo))) Begin
Send CreateComObject of hoBdTstInfo
End
Get ComAppendEncoded Of hoBdTstInfo sTstInfoBase64 "base64" To iSuccess
Get Create (RefClass(cComChilkatAsn)) To hoAsnTstInfo
If (Not(IsComObjectCreated(hoAsnTstInfo))) Begin
Send CreateComObject of hoAsnTstInfo
End
Get pvComObject of hoBdTstInfo to vBdTstInfo
Get ComLoadBd Of hoAsnTstInfo vBdTstInfo To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoAsnTstInfo To sTemp1
Showln sTemp1
Procedure_Return
End
Get Create (RefClass(cComChilkatXml)) To hoXmlTstInfo
If (Not(IsComObjectCreated(hoXmlTstInfo))) Begin
Send CreateComObject of hoXmlTstInfo
End
Get ComAsnToXml Of hoAsnTstInfo To sTemp1
Get ComLoadXml Of hoXmlTstInfo sTemp1 To iSuccess
Get ComGetXml Of hoXmlTstInfo To sTemp1
Showln sTemp1
// Here's the TSTInfo XML:
// <?xml version="1.0" encoding="utf-8"?>
// <sequence>
// <int>01</int>
// <oid>2.16.840.1.114412.7.1</oid>
// <sequence>
// <sequence>
// <oid>2.16.840.1.101.3.4.2.1</oid>
// <null/>
// </sequence>
// <octets>4sRRyWOzC7EOic4fQ9+Op1pa10DbgoBGjBvkq09LZmE=</octets>
// </sequence>
// <int>00AD2C86E49872597B60F87D5C54BCFFAE</int>
// <universal tag="24" constructed="0">MjAyMzAzMTYxMTQ5NTJa</universal>
// </sequence>
// The genTime (GeneralizedTime) is contained in the final "universal" XML element and is
// in base64. It is the time at which the time-stamp token has been created by
// the TSA. After decoding from base64, it is:
//
// The syntax is: YYYYMMDDhhmmss[.s...]Z
// Example: 19990609001326.34352Z
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbGenTime
If (Not(IsComObjectCreated(hoSbGenTime))) Begin
Send CreateComObject of hoSbGenTime
End
Get ComGetChildContent Of hoXmlTstInfo "universal" To sTemp1
Get ComDecodeAndAppend Of hoSbGenTime sTemp1 "base64" "utf-8" To iSuccess
Get ComGetAsString Of hoSbGenTime To sTemp1
Showln sTemp1
// Result:
// 20230316115718Z
End_Procedure