Vérifier une signature au format XAdES, PAdES ou CAdES avec TMS Cryptography Pack.

Aujourd’hui est sortie la version 3.2 du TMS Cryptography Pack. Les nouveautés sont listées dans l’image ci-dessous.

CAdES, XAdES et PAdES signifient respectivement CMS, XML et PDF Advanced Electronics Signatures. Ce sont des formats de signatures maintenus par l’ETSI (European Telecommunications Standards Institute). Ce sont des extensions de formats de signatures CMS, XML et PDF pour les rendre conformes au règlement européen eIDAS (electronic IDentification, Authentication and trust Services), qui est un règlement de l’UE sur l’identification électronique et les services de confiance pour les transactions électroniques au sein de l’Union Européenne.

Petit point sur chaque format :

Comme TMS Cryptography Pack est une bibliothèque de composants graphiques, il suffit d’ajouter TXAdES, TCAdES et TPAdES sur votre palette. Vous avez donc un fichier dont vous voulez vérifier la signature. L’idée est de juste fournir le fichier original OriginalFile, le fichier de signature SignatureFile s’il est séparé, et que la fonction vous retourne si la signature est valide ou non.

Si votre fichier est une signature CAdES, le code serait le suivant (on ne sait pas à l’avance si la signature est détachée ou non, donc on précise le nom du fichier original) :

err := CAdES.VerifySignature(SignatureFile, OriginalFile);

Si votre fichier est une signature XAdES, le code serait dans ce cas (il faut le chemin du fichier original pour le mode detached) :

XAdES.PathToOriginalFile := ExtractFilePath(OriginalFile);
err := XAdES.VerifySignature(SignatureFile);

Si votre fichier est une signature PAdES, alors le code est :

err := PAdES.VerifySignature(SignatureFile);

Maintenant, comment savoir si le fichier est une signature CAdES, XAdES ou PAdES ?

On va utiliser la fonction GetFileMIMEType présente dans chacune des classes TXAdES, TCAdES et TPAdES. Elle utilise la fonction GetFileMIMEType d’Indy.

filetype := XAdES.GetFileMimeType(SignatureFile);

Quels sont les types possibles dans notre cas ?

XAdES c’est text/xml et PAdES c’est application/pdf. Pour CAdES, c’est plus compliqué, c’est un fichier binaire, il pourrait avoir n’importe quelle extension. Dans les faits, il a souvent l’extension pkcs7 ou p7m, ce qui donne comme type : application/octet-stream ou application/pkcs7-mime.

Notre fonction est donc :

function VerifySignatureFile(SignatureFile, OriginalFile: string): string;
var
 filetype: string;
 err: Integer;
begin
 filetype := XAdES.GetFileMimeType(SignatureFile);

 if filetype = 'application/pdf' then
 begin
  err := PAdES.VerifySignature(SignatureFile);
  if err = 0 then
   Result := 'Signature valide'
  else
   Result := PAdES.VerifyError(err) + '\n' + PAdES.ErrorDetails;
 end
 else if (filetype = 'application/octet-stream') or (filetype = 'application/pkcs7-mime') then
 begin
  err := CAdES.VerifySignature(SignatureFile, OriginalFile);
  if err = 0 then
   Result := 'Signature valide'
  else
   Result := CAdES.VerifyError(err) + '\n' + CAdES.ErrorDetails;
 end
 else if filetype = 'text/xml' then
 begin
  XAdES.PathToOriginalFile := ExtractFilePath(OriginalFile);
  err := XAdES.VerifySignature(SignatureFile);
  if err = 0 then
   Result := 'Signature valide'
  else
   Result := XAdES.VerifyError(err) + '\n' + XAdES.ErrorDetails;
 end
 else
  raise Exception.Create('Format de signature non reconnu');
end;

Vous pouvez aussi signer des documents avec TXAdES, TCAdES et TPAdES. Si votre signature n’est pas reconnu par TMS CP (notamment pour le format XML-enveloped, pour lequel il est plus délicat de traiter tous les cas), n’hésitez pas à me contacter à marion [at] tmssoftware.com.

Laisser un commentaire