DataFlex
DataFlex
How to Tell if a File is .p7m or .p7s
See more Misc Examples
This example explains how to detect if a file is a .p7m or .p7s. It provides as solution to the following problem:
Sometimes people submit P7S/P7M with wrong extensions. Can I check if file is P7S or P7M with Chilkat?
Also see What is a P7M or P7S File?
Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoBd
Handle hoSb
Boolean iCaseSensitive
String sTemp1
Boolean bTemp1
Boolean bTemp2
Boolean bTemp3
Boolean bTemp4
Move False To iSuccess
// A .p7m or .p7s file is binary and contains PKCS7.
// PKCS7 is ASN.1, and always begins with a SEQUENCE tag (a byte equal to 0x30)
// followed by an encoded length.
// If the file is larger than 128 bytes (and it SHOULD be), the encoded length will begin with either 0x80, 0x81, 0x82, or 0x83.
// It can also begin with 0x84, but only for very large files (where the length is too large for 3 bytes).
// See How ASN.1 Encodes Lengths
// Therefore, if we have a file that might be .p7m or .p7s, we can check by
// examining the 1st 2 bytes of the file.
Get Create (RefClass(cComChilkatBinData)) To hoBd
If (Not(IsComObjectCreated(hoBd))) Begin
Send CreateComObject of hoBd
End
Get ComLoadFile Of hoBd "qa_data/p7m/a.p7m" To iSuccess
If (iSuccess = False) Begin
Showln "Failed to load the file."
Procedure_Return
End
Get Create (RefClass(cComChilkatStringBuilder)) To hoSb
If (Not(IsComObjectCreated(hoSb))) Begin
Send CreateComObject of hoSb
End
Get ComGetEncodedChunk Of hoBd 0 2 "hex" To sTemp1
Get ComAppend Of hoSb sTemp1 To iSuccess
Move True To iCaseSensitive
Get ComContentsEqual Of hoSb "3080" iCaseSensitive To bTemp1
Get ComContentsEqual Of hoSb "3081" iCaseSensitive To bTemp2
Get ComContentsEqual Of hoSb "3082" iCaseSensitive To bTemp3
Get ComContentsEqual Of hoSb "3083" iCaseSensitive To bTemp4
If (bTemp1 Or bTemp2 Or bTemp3 Or bTemp4) Begin
Showln "This is a .p7m or .p7s file."
End
Else Begin
Showln "This is not a .p7m or .p7s file."
End
End_Procedure