Pascal (Lazarus/Delphi)
Pascal (Lazarus/Delphi)
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 Pascal (Lazarus/Delphi) Downloads
program ChilkatDemo;
// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
SysUtils,
CkDllLoader,
Chilkat.BinData,
Chilkat.StringBuilder;
// ---------------------------------------------------------------------------
procedure RunDemo;
var
success: Boolean;
bd: TBinData;
sb: TStringBuilder;
caseSensitive: Boolean;
begin
success := False;
// 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.
bd := TBinData.Create;
success := bd.LoadFile('qa_data/p7m/a.p7m');
if (success = False) then
begin
WriteLn('Failed to load the file.');
Exit;
end;
sb := TStringBuilder.Create;
sb.Append(bd.GetEncodedChunk(0,2,'hex'));
caseSensitive := True;
if (sb.ContentsEqual('3080',caseSensitive) or sb.ContentsEqual('3081',caseSensitive) or sb.ContentsEqual('3082',caseSensitive) or sb.ContentsEqual('3083',caseSensitive)) then
begin
WriteLn('This is a .p7m or .p7s file.');
end
else
begin
WriteLn('This is not a .p7m or .p7s file.');
end;
bd.Free;
sb.Free;
end;
// ---------------------------------------------------------------------------
begin
try
RunDemo;
except
on E: Exception do
WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
end;
WriteLn;
{$IFDEF MSWINDOWS}
WriteLn('Press Enter to exit...');
ReadLn;
{$ENDIF}
end.