BoTTom |
**free
ctl-opt nomain BNDDIR('QC2LE');
dcl-ds AlgoDS qualified;
  cipher   INT(10) inz(50) ; //RSA
  PKA      CHAR(1) inz('1'); //PKCS bloc 0 ou 1, 3=ISO 9796-1
  filler   CHAR(3) inz(x'000000');
  // le token doit indiquer RS256(RSA) et non HS256 (HMAC = symétrique)
  hash     int(10) inz(3); // 3=SHA256 5=SHA512
End-Ds;
dcl-ds pemDS qualified;
  keylen INT(10);
  filler char(4) INZ(x'00000000');
  key char(4096) CCSID(65535);
End-Ds;
dcl-s signatureLen int(10); // normalement 512
dcl-s DataLen int(10);
dcl-pr QDCXLATE EXTPGM;
  datalen packed(5:0) CONST;
  data char(4096);
  table char(10) CONST;
End-Pr;
dcl-s dataChar char(4096);
dcl-pr verifyHASH ExtProc('Qc3VerifySignature');
  signature    CHAR(4096)  const; // empreinte
  signatureLen INT(10)     const;
  Data         CHAR(5121)  const; // data d'origine
  Datalen      INT(10)     const;
  Dataformat   CHAR(8)     const; //DATA0100 = données directement
  Algo         likeds(algoDS);    // algo de cryptage -> RSA
  AlgoFormat   CHAR(8)     const; //ALGD0400 = paramètres de clé
  Key          likeds(pemDS);     // contenu du certificat PEM
  KeyFormat    CHAR(8)    const;  //KEYD0600 = utiliser la clé du certificat PEM
  CSP          CHAr(1)    const;  // 1=Soft,2=hard(renseigner DEVICE),0=Any
  CSPDEVICE    CHAr(10)   const;  // blanc si pas de co-processeur
  ErrorCode    CHar(16) ;
end-pr;
 

|
dcl-proc verifySignature export;
  dcl-pi *n ind;
    DatatoCheck  varchar(5121) CONST; // data d'origine     Key          varchar(4096) CONST; // contenu certificat au format DER (PEM)     signature    char(4096) CONST;    // empreinte à vérifier
  End-Pi;
  dcl-ds ErrorCode  qualified;
      bytesProv  INt(10) inz(0); // ou 64 pour voir MSGID
      bytesAvail INt(10) inz(0);
  
    MSGID CHAR(7);
       filler char(1);
   
   data  char(48);
  end-ds;
  //---------------------------------------------------------   //            Verify the SHA512/256  hash
  //---------------------------------------------------------
  pemDS.key = key;   pemDS.keylen = %len(key);
  signatureLen = %len(%trimr(signature));
  dataLen =   %len(%trimr(datatocheck)) ;   datachar = DatatoCheck;// cast varchar -> char
    // il s'agit de vĂ©rifier un jeton JWT, dans ce cas
  // le payload doit être en ASCII, la signature étant en ASCII   // on peut utiliser QDCXLATE, c'est de la base 64 = pas de car. latins   QDCXLATE(datalen:datachar:'QASCII');   // API IBM de crypto.   monitor;     verifyHASH( signature
                : signatureLen
                : datachar
                : dataLen
                : 'DATA0100'
                :  algoDS
                : 'ALGD0400'
                : pemds
                : 'KEYD0600'
                : '0'
                : '          '

                : ErrorCode );
  on-error;
    return *off;
  endmon;
  return *on;
End-Proc;




©AF400