DB2 for i 7.3 - Mise à blanc de tous les index recommandés

RPG (3 et 4, free), CL, SQL, etc...
Répondre
CyrilN67
Messages : 4
Enregistré le : mar. 12 juin 2018, 13:38:09

(sans sujet)

Message par CyrilN67 »

Bonjour,

J'ai besoin dans un traitement RPG d'utiliser un cryptage de sécurité d'un texte au format SHA256.
J'ai réussi à faire fonctionner mon programme et d'obtenir le texte au format hexadécimal.
Cependant, j'ai un problème et des valeurs différentes en comparant avec 2 convertisseurs différents en ligne dès lors que j'utilise les caractères "{" et "}".
Auriez-vous une idée de ce qui peut provoquer cela ?

Ci-dessous les résultats de mes tests :

1) Chaine origine : TEST
1er conv : 94EE059335E587E501CC4BF90613E0814F00A7B08BC7C648FD865A2AF6A22CC2
2e conv : 94EE059335E587E501CC4BF90613E0814F00A7B08BC7C648FD865A2AF6A22CC2
AS400 : 94EE059335E587E501CC4BF90613E0814F00A7B08BC7C648FD865A2AF6A22CC2

==> Test concluant car les valeurs hexadécimales sont équivalentes pour les 3.

2) Chaine origine : TEST{
1er conv : 1E36998A4998384D076A7572349A4348D5FE1E8CE2A2B8E490FEDCE3960C2C61
2e conv : 1E36998A4998384D076A7572349A4348D5FE1E8CE2A2B8E490FEDCE3960C2C61
AS400 : 4106D9FB8895849E5F7919ED26DFE15BDA83B0B904E8A73DBFFCC4F766951EE7

==> Test non concluant car la valeur hexadécimale en sortie de mon programme AS400 est différente des 2 autres.

Pour info, j'utilise la procédure "Qc3CalculateHash" exposé par le programme de service QSYS/QC3HASH du répertoire de liage 'QC2LE'.

Voici le code utilisé :

Code : Tout sélectionner

data = 'TEST{';                                        
           len = %len(%trim(data));
           alg.HashAlg = HASH_SHA256;

           //Convert from EBCDIC to ASCII (skip this step if you want Hash in EBCDIC)
           QDCXLATE(len: data: 'QTCPASC');
      
           //API to calculate the SHA256 hash
           Qc3CalculateHash( %addr(data)
                           : len
                           : 'DATA0100'
                           : alg
                           : 'ALGD0500'
                           : '0'
                           : *OMIT   
                           : hash
                           : ErrorNull );
                                     
           cvthc( $hex: hash: %len(hash)*2);
           dsply %subst($hex:1:32);
           dsply %subst($hex:33:32);    
      
           *inlr = *on;
Merci d'avance pour votre aide.

monthi
Messages : 48
Enregistré le : mar. 11 sept. 2018, 15:37:02
Localisation : Paris

(sans sujet)

Message par monthi »

Bonjour

il vaut mieux utiliser les apis Iconv que le la table QTCPASC pour efféctué les conversion EBCDIC <--> ASCII

la table QTCPASC converti le { X'51' en © X'59' au lieu de X'7b'

Code : Tout sélectionner

Table&#58;   QTCPASC        Bibliothèque&#58;   QUSRSYS                        
                                                                       
Entrée  Sortie             Entrée  Sortie             Entrée  Sortie   
 hexa    hexa               hexa    hexa               hexa    hexa    
  2D      05                 3C      14                 4B      2E     
  2E      06                 3D      15                 4C      3C     
  2F      07                 3E      1A                 4D      28     
  30      1A                 3F      1A                 4E      2B     
  31      1A                 40      20                 4F      7C     
  32      16                 41      A6                 50      26     
  33      1A                 42      E1                 51      A9     
voici un exemple basée sur la demande initiale

TEST{
--> 1E36998A4998384D076A7572349A4348D5FE1E8CE2A2B8E490FEDCE3960C2C61

Code : Tout sélectionner

       ctl-opt dftactgrp&#40;*no&#41;;
       //*******************************************************
       // Data-structures
       //********************************************************
       // ds pour Erreur APi
       Dcl-ds APIError;
         suAPIAvail uns&#40;10&#41; INZ&#40;%size&#40;APIError&#41;&#41;;
         suAPIRtnd  uns&#40;10&#41; iNZ&#40;0&#41;;
         saAPIMsgId char&#40;7&#41;;
         *n char&#40;1&#41;;
         saAPIMsgDta char&#40;256&#41;;
       end-ds;
       // Descripteur  pour api iconv et iconv_close
       dcl-ds ToAscii ;
         ICORV_A bindec&#40;9&#41;;
         ICOC_A  bindec&#40;9&#41; DIM&#40;00012&#41;;
       end-ds;
       // tocode pour api QtqIconvOpen
       Dcl-ds  Qascii ;
         asciiCP int&#40;10&#41; inz&#40;819&#41;;
         asciiCA int&#40;10&#41; inz&#40;0&#41;;
         asciiSA int&#40;10&#41; inz&#40;0&#41;;
         asciiSS int&#40;10&#41; inz&#40;1&#41;;
         asciiIL int&#40;10&#41; inz&#40;0&#41;;
         asciiEO int&#40;10&#41; inz&#40;1&#41;;
         *n char&#40;8&#41; inz&#40;*allx'00'&#41;;
       end-ds;
       // Fromcode pour api QtqIconvOpen
       Dcl-ds  Qebcdic ;
         ebcdicCP int&#40;10&#41; inz&#40;0&#41;;
         ebcdicCA int&#40;10&#41; inz&#40;0&#41;;
         ebcdicSA int&#40;10&#41; inz&#40;0&#41;;
         ebcdicSS int&#40;10&#41; inz&#40;1&#41;;
         ebcdicIL int&#40;10&#41; inz&#40;0&#41;;
         ebcdicEO int&#40;10&#41; inz&#40;1&#41;;
         *n char&#40;8&#41; inz&#40;*allx'00'&#41;;
       end-ds;
       // ds format DATA0200 pour api Qc3CalculateHash
       Dcl-ds data0200;
         datap pointer;
         lgdata int&#40;10&#41; inz;
         *n char&#40;12&#41; inz&#40;*loval&#41;;
       end-ds;
       //*******************************************************
       // Prototypes
       //********************************************************
       //Calculate Hash
       dcl-pr Qc3CalculateHash  extproc&#40;'Qc3CalculateHash'&#41;;
        *n char&#40;65535&#41; options&#40;*varsize&#41; const;
         *n int&#40;10&#41; const;
         *n char&#40;8&#41; const;
         *n int&#40;10&#41; const;
         *n char&#40;8&#41; const;
         *n char&#40;1&#41; const;
         *n char&#40;10&#41; const options&#40;*omit&#41;;
         *n char&#40;64&#41; options&#40;*varsize&#41;;
         *n char&#40;512&#41; options&#40;*varsize&#41;;
       end-pr;
       //Code Conversion Allocation API
       Dcl-pr IConvOpen char&#40;52&#41; ExtProc&#40;'QtqIconvOpen'&#41;;
         *n pointer Value options&#40;*string&#41;;
         *n pointer Value options&#40;*string&#41;;
       end-pr;
       // code connversion
       Dcl-pr IConv int&#40;10&#41; ExtProc&#40;'iconv'&#41;;
         *n char&#40;52&#41; Value;
         *n pointer;
         *n uns&#40;10&#41;;
         *n pointer;
         *n uns&#40;10&#41;;
       end-pr;
       //Code Conversion Deallocation
       Dcl-pr IConvClose int&#40;10&#41; ExtProc&#40;'iconv_close'&#41;;
         *n char&#40;52&#41; Value;
       end-pr;
       //Convert Hex to Character
       Dcl-pr cvthc EXTPROC&#40;'cvthc'&#41;;
         *n pointer VALUE;
         *n pointer VALUE;
         *n int&#40;10&#41; VALUE;
       end-pr;
       //*******************************************************
       // Zones isolée
       //********************************************************
       dcl-s data varchar&#40;100&#41;; //données a cryptée
       dcl-s hash char&#40;32&#41;;     // données cryptés
       dcl-s ebcptr pointer;    // pointeur sur donnée a crypter pour conversion
                                // Ebcdic--> Ascii
       dcl-s inBytesLeft uns&#40;10&#41;; // longueur données a convertir
       dcl-s outBytesLeft uns&#40;10&#41;; // longeur des donnée recevant la conversion
       dcl-s hash_hex char&#40;64&#41;;    // donnée cryptée en hex
       //*********************************************************
       // programme principal
       //********************************************************
       data='TEST&#123;';

       inBytesLeft=%len&#40;data&#41;;
       outBytesLeft=inBytesLeft;
       ebcptr=%addr&#40;data&#58;*data&#41;;
       // conversion Ebcdic--> ascii
       ToAscii=IConvOpen&#40;%addr&#40;Qascii&#41;&#58;%addr&#40;Qebcdic&#41;&#41;;
       IConv&#40;ToAscii&#58;ebcptr&#58;inBytesLeft&#58;ebcptr&#58;outBytesLeft&#41;;
       IConvClose&#40;ToAscii&#41;;
       // chargement valeur DATA0200
       datap=%addr&#40;data&#58;*data&#41;;
       lgdata=%len&#40;data&#41;;
       // cryptage SHA_253 --> type &#58; 3
       Qc3CalculateHash&#40;data0200&#58;1&#58;'DATA0200'&#58;3&#58;'ALGD0500'&#58;'0'&#58;*OMIT&#58;hash&#58;
         apierror&#41;;
       // traduction en Hex de la donnée cryptée
       cvthc&#40;%addr&#40;hash_hex&#41;&#58;%addr&#40;hash&#41;&#58;64&#41;;
       // affichage pour control
       dsply %subst&#40;hash_hex&#58;1&#58;32&#41;;
       dsply %subst&#40;hash_hex&#58;33&#58;32&#41;;
       *inlr=*on; 
[/code]

cmasse
Site Admin
Messages : 735
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

iconv

Message par cmasse »

Parfaitement d'accord !

voir, aussi l'exemple IBM (attention qui utilise le CCSID 37) https://www.ibm.com/support/pages/qc3ca ... pi-example
Christian Massé (Volubis.fr)

CyrilN67
Messages : 4
Enregistré le : mar. 12 juin 2018, 13:38:09

iconv

Message par CyrilN67 »

Merci beaucoup pour vos réponses. Je viens d'essayer et cela fonctionne parfaitement bien.
Bonne journée.

Répondre