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

       inBytesLeft=%len(data);
       outBytesLeft=inBytesLeft;
       ebcptr=%addr(data:*data);
       // conversion Ebcdic--> ascii
       ToAscii=IConvOpen(%addr(Qascii):%addr(Qebcdic));
       IConv(ToAscii:ebcptr:inBytesLeft:ebcptr:outBytesLeft);
       IConvClose(ToAscii);
       // chargement valeur DATA0200
       datap=%addr(data:*data);
       lgdata=%len(data);
       // cryptage SHA_253 --> type : 3
       Qc3CalculateHash(data0200:1:'DATA0200':3:'ALGD0500':'0':*OMIT:hash:
         apierror);
       // traduction en Hex de la donnée cryptée
       cvthc(%addr(hash_hex):%addr(hash):64);
       // affichage pour control
       dsply %subst(hash_hex:1:32);
       dsply %subst(hash_hex:33:32);
       *inlr=*on; 
Modifié en dernier par monthi le lun. 11 mai 2020, 08:26:37, modifié 1 fois.

cmasse
Site Admin
Messages : 794
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.

jpdlx
Messages : 2
Enregistré le : lun. 27 avr. 2020, 12:27:42

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

Message par jpdlx »

bonjour

je n'arrive vraiment pas à le faire marcher
je suis en rpgle classique
j'ai repris la ds en exemple
Dcl-ds data0200;
datap pointer;
lgdata int&#40;10&#41; inz;
*n char&#40;12&#41; inz&#40;*loval&#41;;
end-ds;
//******
que j'ai codé comme suit
DPtr S *
DD0200 DS based(Ptr)
D datap 1 16*
D Lgdata 17 20B 0
D Reserved 21 32

Puis
avant l'appel

eval datap = %addr(HshDta);
eval Lgdata = %len(HshDta);

CalculateHash( HshDta
: D0200
: 'DATA0200'
: ALGD0100
: 'ALGD0100'
: CSP_SFW
: *Blanks
: RtnDtaStr
: ERRC0100
);

ca plante avec Message ID . . . . . . : RNQ0222

S'il qq'un a un exemple en DATA0200 EN RPGLE standard
je suis preneur

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

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

Message par monthi »

Bonjour

Comment est définie votre variable Hshdta ?
Qu'entendez vous par RGPLE Standard?

Je suppose que vous voulez dire colonné.

voici le même code que celui que j'avais donné en full-free mais en colonné :

Code : Tout sélectionner

     H dftactgrp(*no)
      ********************************************************
      * Data-structures
      *********************************************************
      * ds pour Erreur APi
     DAPIError         DS
     D  suAPIAvail                   10U 0 INZ(%size(APIError))
     D  suAPIRtnd                    10U 0 iNZ(0)
     D  saAPIMsgId                    7
     D                                1
     D  saAPIMsgDta                 256
      * Descripteur  pour api iconv et iconv_close
     DToAscii          DS
     D  ICORV_A                       9B 0
     D  ICOC_A                        9b 0 DIM(12)
      * tocode pour api QtqIconvOpen
     DQascii           DS
     D  asciiCP                      10I 0 inz(819)
     D  asciiCA                      10I 0 inz(0)
     D  asciiSA                      10I 0 inz(0)
     D  asciiSS                      10I 0 inz(1)
     D  asciiIL                      10I 0 inz(0)
     D  asciiEO                      10I 0 inz(1)
     D                                8    inz(*allx'00')
      * Fromcode pour api QtqIconvOpen
     DQebcdic          DS
     D  ebcdicCP                     10I 0 inz(0)
     D  ebcdicCA                     10I 0 inz(0)
     D  ebcdicSA                     10I 0 inz(0)
     D  ebcdicSS                     10I 0 inz(1)
     D  ebcdicIL                     10I 0 inz(0)
     D  ebcdicEO                     10I 0 inz(1)
     D                                8    inz(*allx'00')
      * ds format DATA0200 pour api Qc3CalculateHash
     Ddata0200         DS
     D datap                           *
     D lgdata                        10I 0  inz
     D                               12     inz(*loval)
      ********************************************************
      * Prototypes
      *********************************************************
      *Calculate Hash
     DQc3CalculateHash...
     D                 PR                   extproc('Qc3CalculateHash')
     D                            65535     options(*varsize) const
     D                               10I 0  const
     D                                8     const
     D                               10I 0  const
     D                                8     const
     D                                1     const
     D                               10     const options(*omit)
     D                               64     options(*varsize)
     D                              512     options(*varsize)
      *Code Conversion Allocation API
     DIConvOpen        PR            52     ExtProc('QtqIconvOpen')
     D                                 *    Value options(*string)
     D                                 *    Value options(*string)
      * code connversion
     DIConv            PR            10I 0  ExtProc('iconv')
     D                               52     Value
     D                                 *
     D                               10U 0
     D                                 *
     D                               10U 0
      *Code Conversion Deallocation
     DIConvClose       PR            10I 0  ExtProc('iconv_close')
     D                               52     Value
      *Convert Hex to Character
     Dcvthc            PR                   EXTPROC('cvthc')
     D                                 *     VALUE
     D                                 *     VALUE
     D                               10I 0   VALUE

      ********************************************************
      * Zones isolée
      *********************************************************
     Ddata             S            100      varying                            données a cryptée
     Dhash             S             32                                         données cryptés
     Debcptr           S               *                                        pointeur sur donnée
      *                                                                         à crypeter pour
      *                                                                         conversion
      *                                                                         Ebcdic--> Ascii
     DinBytesLeft      S             10U 0                                      longueur données a
      *                                                                         convertir
     DoutBytesLeft     S             10U 0                                      longeur des donnée
      *                                                                         recevant la
      *                                                                         conversion
     Dhash_hex         S             64                                         donnée cryptée en
      *                                                                         hex
      **********************************************************
      * programme principal
      *********************************************************
      /free
       eval data='TEST{';

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


Attention au initialisation des sous-zones de DS et au type des données


Cdlt

jpdlx
Messages : 2
Enregistré le : lun. 27 avr. 2020, 12:27:42

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

Message par jpdlx »

Bonjour

Pardon pour cette réponse tardive, mais je viens juste de voir votre message. J'ai du rater la notif de volubis.

Bref, votre programme fonctionne très bien et vous venez de me faire gagner des heures de traitements.
Le format DATA0200 permet de charger bien plus d'enregistrement que le DATA0100
du coup au lieu de calculer des blocs de records de 200 000, je charge 999 999 records, soit 5 fois plus;
J'ai pris l'algo SHA512, je débute en chiffrement, mais j'imagine que plus je chiffre de records en 1 coup,
plus je dois prendre un algo puissant. Le but du jeu pour moi est de chiffrer des bases de plusieurs To par portion de 1 millions de records puis de les comparer pour savoir si mes différents bases répliquées sont bien identiques.
Mon checksum sur des bases de 5 à 10 to durent ainsi 10 heures de traitement sur un gros Power 7. Avec votre programme, j'espère réduire par 5 le temps de traitement.

En tout cas, un million de fois MERCI car depuis le temps que je cherchais un exemple en DATA0200 (je pense que vous etes le seul sur le net ou l'un des rares), Je débute aussi en RPGLE et en free RPG (je viens du RPG 3) donc pour moi c'est très compliqué toutes ces nouvelles fonctions de RPGLE.

Maintenant il me reste à tester en long en large et en travers. Je ne sais pas si mon checksum en 1 million de record en SHA512 peut me faire rater des différences entre des bases ... j'imagine que non (enfin j'espère que non) ..;
Si vous avez des recommandations sur ce sujet, je suis preneur mon cher maestro !

Merci beaucoup et prenez soin de vous.

Répondre