/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P E R M U T A T I O N   " A L E A T O I R E "   E T   R E V E R S I B L E   D ' O C T E T S  :                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        ATTENTION :                                                                                                                */
/*                                                                                                                                   */
/*                    Le 20041207150048, cette commande a ete                                                                        */
/*                  deplacee de '$xcg' a '$xcS' pour des raisons                                                                     */
/*                  de securite. Etant donc dans '$xcS', son source                                                                  */
/*                  '$K' peut etre crypte (par exemple sur '$CMAP??').                                                               */
/*                  Il convient alors de le decrypter dans '$DStemporaires'                                                          */
/*                  (afin de'eviter qu'ils puissent apparaitre dans les                                                              */
/*                  "snapshots"s) et de deplacer ensuite le '$X' dans '$xcS'                                                         */
/*                  "a la main" (cela explique les modifications 'v $xcc/cpp$Z 20050110150327'                                       */
/*                  destinees a automatiser cela...).                                                                                */
/*                                                                                                                                   */
/*                    Le 20070309101750, cette commande a ete                                                                        */
/*                  redeplacee de '$xcS' a '$xcg' pour eviter des                                                                    */
/*                  problemes dans le cas ou pour une raison ou pour                                                                 */
/*                  une autre il deviendrait impossible de la compiler                                                               */
/*                  parce que son '$X' ne fonctionnerait plus (problemes                                                             */
/*                  de librairies par exemple...).                                                                                   */
/*                                                                                                                                   */
/*                    Le 20050915101021, je note qu'il y a une                                                                       */
/*                  difficulte du type "l'oeuf et la poule" en ce                                                                    */
/*                  qui concerne le demarrage a froid d'une nouvelle                                                                 */
/*                  MACHINE sur laquelle un fichier tel '$xcg/ShufBytes.01$K'                                                        */
/*                  doit etre crypte. En effet comment le crypter et le                                                              */
/*                  compiler, tant qu'il n'est pas compile ? Le probleme                                                             */
/*                  est resolu grace a 'v $Falias_fcrypte 20050915102252'                                                            */
/*                  et grace a 'v $Falias_fdecrypte 20050915102516'                                                                  */
/*                  ou l'on peut donner un nom vide en ce qui concerne                                                               */
/*                  l'outil Prive de Cryptage, ce qui signifie alors                                                                 */
/*                  qu'il est absent. Alors seul sera utilise l'outil                                                                */
/*                  Systeme de Cryptage (pour crypter et decrypter...).                                                              */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xcg/ShufBytes.01$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20041202091715).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
@define   PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES
                                        /* Introduit le 20061110085954 lors des "grandes manoeuvres" concernant le nom de nombreux   */
                                        /* symboles de type 'Common'. Sur '$CMAP28' la commande '$xcg/ShufBytes.01$X' ne pouvait     */
                                        /* plus s'executer car, en effet, elle reclamait dynamiquement des symboles qui n'existaient */
                                        /* plus, or pour 'v $xcg/ShufBytes.01$K', il fallait '$xcg/ShufBytes.01$X' pour decrypter... */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_MINI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   EDITER_LA_TABLE_DES_PERMUTATIONS                                                                                              \
                    FAUX                                                                                                                \
                                        /* Faut-il seulement editer la table des permutations ('VRAI') ou bien faire un              */ \
                                        /* cryptage/decryptage ('FAUX') ?                                                            */
#define   C_EST_L_OPERATION_DIRECTE                                                                                                     \
                    VRAI                                                                                                                \
                                        /* Est-ce l'operation directe dite "chiffrage" ('VRAI') ou l'operation inverse dite          */ \
                                        /* "dechiffrage" ('FAUX') ?                                                                  */
#define   GENERER_UNE_OPERATION_NEUTRE                                                                                                  \
                    FAUX                                                                                                                \
                                        /* Doit-on faire du cryptage/decryptage ('FAUX') ou bien une operation neutre ('VRAI'),      */ \
                                        /* c'est-a-dire ne pas crypter/decrypter ? Ceci fut introduit le 20070306093201....          */

#define   DIVISEUR_DE_CRYPTAGE                                                                                                          \
                    UN
#define   DIVISEUR_DE_DECRYPTAGE                                                                                                        \
                    QUATRE
                                        /* Diviseurs des clefs de cryptage/decryptage (introduit le 20041204115821) compatibles      */
                                        /* avec 'v $Falias_decrypte DiViSeUr'.                                                       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   CLEF_DE_CRYPTAGE_DECRYPTAGE_NON_DEFINIE                                                                                       \
                    ZERO
#define   CLEF_DE_CRYPTAGE_DECRYPTAGE(nom_de_la_clef,diviseur_de_la_clef)                                                               \
                    DIVI(GvalDefaut(nom_de_la_clef,CLEF_DE_CRYPTAGE_DECRYPTAGE_NON_DEFINIE),diviseur_de_la_clef)
#define   CLEF_DE_CRYPTAGE                                                                                                              \
                    CLEF_DE_CRYPTAGE_DECRYPTAGE("ClefCryptage",diviseur_de_cryptage)
#define   CLEF_DE_DECRYPTAGE                                                                                                            \
                    CLEF_DE_CRYPTAGE_DECRYPTAGE("ClefDecryptage",diviseur_de_decryptage)
                                        /* Clef de cryptage/decryptage qui ne peut-etre entree via 'GET_ARGUMENT_I(...)' afin de ne  */
                                        /* pas apparaitre dans les histories. Pour la meme raison, les variables '$ClefShufBytes?'   */
                                        /* ne devront pas etre definies dans un fichier, ni etre definies interactivement, mais      */
                                        /* uniquement via :                                                                          */
                                        /*                                                                                           */
                                        /*                  secret    ClefShufBytesC                                                 */
                                        /*                  secret    ClefShufBytesD                                                 */
                                        /*                                                                                           */
                                        /* sous '$CSH', ce qui ne laisse donc aucune trace...                                        */
                                        /*                                                                                           */
                                        /* Pour des raisons de confidentialite liees a la programmation "secrete" de                 */
                                        /* 'v $Falias_fcrypte ClefCryptage' et de 'v $Falias_fdecrypte lefDecryptage' le             */
                                        /* 20050108100540 il y a eu les changements de nom suivant :                                 */
                                        /*                                                                                           */
                                        /*                  ClefShufBytesC ---> ClefCryptage                                         */
                                        /*                  ClefShufBytesD ---> ClefDecryptage                                       */
                                        /*                                                                                           */

#define   PREMIER_OCTET                                                                                                                 \
                    VALEUR_MINIMALE_DANS_UN_OCTET
#define   DERNIER_OCTET                                                                                                                 \
                    VALEUR_MAXIMALE_DANS_UN_OCTET
                                        /* Definitions introduites le 20041208140648 apres que {PREMIER_OCTET,DERNIER_OCTET}         */
                                        /* aient ete supprimees dans 'v $xil/defi_K2$vv$DEF' comme etant redondantes avec les        */
                                        /* definitions {VALEUR_MINIMALE_DANS_UN_OCTET,VALEUR_MAXIMALE_DANS_UN_OCTET}. Elles          */
                                        /* permettent ainsi de ne pas changer ce qui suit et de ne pas rallonger certaines lignes... */

#define   TABLE_DES_PERMUTATIONS                                                                                                        \
                    COND(EST_VRAI(c_est_l_operation_directe)                                                                            \
                        ,table_des_permutations_directes                                                                                \
                        ,table_des_permutations_inverses                                                                                \
                         )                                                                                                              \
                                        /* Definition introduite le 20041207143217...                                                */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P E R M U T A T I O N   " A L E A T O I R E "   E T   R E V E R S I B L E   D ' O C T E T S  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(editer_la_table_des_permutations,EDITER_LA_TABLE_DES_PERMUTATIONS));
                                        /* Faut-il seulement editer la table des permutations ('VRAI') ou bien faire un              */
                                        /* cryptage/decryptage ('FAUX') ?                                                            */
     DEFV(Logical,INIT(c_est_l_operation_directe,C_EST_L_OPERATION_DIRECTE));
                                        /* Est-ce l'operation directe dite "chiffrage" ('VRAI') ou l'operation inverse dite          */
                                        /* "dechiffrage" ('FAUX') ?                                                                  */
     DEFV(Logical,INIT(generer_une_operation_neutre,GENERER_UNE_OPERATION_NEUTRE));
                                        /* Doit-on faire du cryptage/decryptage ('FAUX') ou bien une operation neutre ('VRAI'),      */
                                        /* c'est-a-dire ne pas crypter/decrypter ? Ceci fut introduit le 20070306093201....          */

     DEFV(Int,INIT(diviseur_de_cryptage,DIVISEUR_DE_CRYPTAGE));
     DEFV(Int,INIT(diviseur_de_decryptage,DIVISEUR_DE_DECRYPTAGE));
                                        /* Diviseurs des clefs de cryptage/decryptage (introduit le 20041204115821) compatibles      */
                                        /* avec 'v $Falias_decrypte DiViSeUr'.                                                       */

     DEFV(Int,INIT(clef_de_cryptage_decryptage,UNDEF));
                                        /* Clef de cryptage/decryptage qui ne peut-etre entree via 'GET_ARGUMENT_I(...)' afin de ne  */
                                        /* pas apparaitre dans les histories. Pour la meme raison, les variables '$ClefShufBytes?'   */
                                        /* ne devront pas etre definies dans un fichier, ni etre definies interactivement, mais      */
                                        /* uniquement via :                                                                          */
                                        /*                                                                                           */
                                        /*                  secret    ClefShufBytesC                                                 */
                                        /*                  secret    ClefShufBytesD                                                 */
                                        /*                                                                                           */
                                        /* sous '$CSH', ce qui ne laisse donc aucune trace...                                        */
                                        /*                                                                                           */
                                        /* Pour des raisons de confidentialite liees a la programmation "secrete" de                 */
                                        /* 'v $Falias_fcrypte ClefCryptage' et de 'v $Falias_fdecrypte lefDecryptage' le             */
                                        /* 20050108100540 il y a eu les changements de nom suivant :                                 */
                                        /*                                                                                           */
                                        /*                  ClefShufBytesC ---> ClefCryptage                                         */
                                        /*                  ClefShufBytesD ---> ClefDecryptage                                       */
                                        /*                                                                                           */
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("editer=",editer_la_table_des_permutations);
                         GET_ARGUMENT_N("crypter_decrypter=",editer_la_table_des_permutations);

                         GET_ARGUMENT_L("directe=""crypter=""crypte=""cryptage=",c_est_l_operation_directe);
                         GET_ARGUMENT_N("inverse=""decrypter=""decrypte=""decryptage=",c_est_l_operation_directe);

                         GET_ARGUMENT_L("neutre=",generer_une_operation_neutre);
                         GET_ARGUMENT_N("cryptage_decryptage=",generer_une_operation_neutre);

                         GET_ARGUMENT_I("diviseurC=""dc=",diviseur_de_cryptage);
                         GET_ARGUMENT_I("diviseurD=""dd=",diviseur_de_decryptage);
                         )
                    );
                                        /* Le 'GET_ARGUMENTS_(...)' est mis avant la validation de 'clef_de_cryptage_decryptage'     */
                                        /* afin de permettre de faire des 'use's et des 'suse's de cette commande...                 */

     EGAL(clef_de_cryptage_decryptage
         ,COND(EST_VRAI(c_est_l_operation_directe)
              ,CLEF_DE_CRYPTAGE
              ,CLEF_DE_DECRYPTAGE
               )
          );
                                        /* Entree de la clef de cryptage/decryptage. Le 'FRA?(...)' a ete introduit le               */
                                        /* 20041204115821 et est "en phase" avec 'v $Falias_decrypte DiViSeUr'...                    */

     Test(IFOU(IL_FAUT(generer_une_operation_neutre)
              ,IFET(IL_NE_FAUT_PAS(generer_une_operation_neutre)
                   ,IFNE(clef_de_cryptage_decryptage,CLEF_DE_CRYPTAGE_DECRYPTAGE_NON_DEFINIE)
                    )
               )
          )
          Bblock
          DEFV(Int,INIT(index,UNDEF));
          DEFV(Int,INIT(index_de_permutation,PREMIER_OCTET));
          DEFV(Logical,DTb1(table_de_validation_des_permutations,NOMBRE_D_OCTETS_DIFFERENTS));
          DEFV(Int,DTb1(table_des_permutations_directes,NOMBRE_D_OCTETS_DIFFERENTS));
          DEFV(Int,DTb1(table_des_permutations_inverses,NOMBRE_D_OCTETS_DIFFERENTS));
                                        /* Allocation des vecteurs destines a gerer les permutations...                              */

          DoIn(index,PREMIER_OCTET,DERNIER_OCTET,I)
               Bblock
               EGAL(ITb1(table_de_validation_des_permutations,INDX(index,PREMIER_OCTET)),INVALIDE);
               EGAL(ITb1(table_des_permutations_directes,INDX(index,PREMIER_OCTET)),index);
               EGAL(ITb1(table_des_permutations_inverses,INDX(index,PREMIER_OCTET)),index);
                                        /* Initialisation du processus de generation des permutations...                             */
               Eblock
          EDoI

          DoIn(index,PREMIER_OCTET,DERNIER_OCTET,I)
               Bblock
               DEFV(Logical,INIT(chercher_une_permutation,VRAI));
               DEFV(Int,INIT(compteur_de_detection_de_bouclage,UN));

               EGAL(index_de_permutation
                   ,COND(IL_NE_FAUT_PAS(generer_une_operation_neutre)
                        ,MODS(REST(MUL2(clef_de_cryptage_decryptage,ADD2(index_de_permutation,I))
                                  ,NOMBRE_D_OCTETS_DIFFERENTS
                                   )
                             ,PREMIER_OCTET
                             ,DERNIER_OCTET
                              )
                        ,index
                         )
                    );
                                        /* Index courant de permutation : mais n'est-il pas deja utilise ?                           */

               Tant(EST_VRAI(chercher_une_permutation))
                    Bblock
                    Test(IFLE(compteur_de_detection_de_bouclage,NOMBRE_D_OCTETS_DIFFERENTS))
                         Bblock
                         INCR(compteur_de_detection_de_bouclage,I);

                         Test(EST_VALIDE(ITb1(table_de_validation_des_permutations,INDX(index_de_permutation,PREMIER_OCTET))))
                              Bblock
                              EGAL(index_de_permutation
                                  ,MODS(ADD2(index_de_permutation,I)
                                       ,PREMIER_OCTET
                                       ,DERNIER_OCTET
                                        )
                                   );
                                        /* L'entree courante est deja occupe, passage a la suivante...                               */
                              Eblock
                         ATes
                              Bblock
                              EGAL(chercher_une_permutation,FAUX);
                                        /* Une entree inoccupee a ete trouvee...                                                     */
                              EGAL(ITb1(table_de_validation_des_permutations,INDX(index_de_permutation,PREMIER_OCTET)),VALIDE);
                              EGAL(ITb1(table_des_permutations_directes,INDX(index_de_permutation,PREMIER_OCTET)),index);
                              EGAL(ITb1(table_des_permutations_inverses,INDX(index,PREMIER_OCTET)),index_de_permutation);
                                        /* Et on l'occupe...                                                                         */
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         PRINT_ERREUR("la recherche de l'index de permutation semble boucler");
                                        /* Ceci a ete introduit le 20041204184717...                                                 */
                         Eblock
                    ETes
                    Eblock
               ETan
               Eblock
          EDoI

          Test(IL_FAUT(editer_la_table_des_permutations))
               Bblock
               DEFV(Int,INIT(nombre_de_chiffres_utiles,NOMBRE_DE_CHIFFRES_DECIMAUX(NOMBRE_D_OCTETS_DIFFERENTS)));
                                        /* Afin de garantir une belle tabulation...                                                  */
                                        /*                                                                                           */
                                        /* Avant le 20060104163621, on trouvait ici :                                                */
                                        /*                                                                                           */
                                        /*                  TRPU(POSI(LO1X(NOMBRE_D_OCTETS_DIFFERENTS)))                             */
                                        /*                                                                                           */
                                        /* comme nombre de chiffres...                                                               */

               DoIn(index,PREMIER_OCTET,DERNIER_OCTET,I)
                    Bblock
                    CAL3(Prme4("%0*d --> %0*d\n"
                              ,nombre_de_chiffres_utiles
                              ,index
                              ,nombre_de_chiffres_utiles
                              ,ITb1(TABLE_DES_PERMUTATIONS,INDX(index,PREMIER_OCTET))
                               )
                         );
                    Eblock
               EDoI
               Eblock
          ATes
               Bblock
               DEFV(Int,INIT(caractere_courant,K_UNDEF));
                                        /* Octet courant. ATTENTION, on utilise le type 'Int' et non pas 'Char' a                    */
                                        /* cause de de l'usage qui sera fait ci-apres de 'GetcharQ(...)', et ce afin que le test     */
                                        /* de fin de fichier fonctionne correctement...                                              */

               Tant(GetcharQ(caractere_courant))
                    Bblock
                                        /* Le caractere courant de l'entree courante est recupere ; et on boucle                     */
                                        /* sur cette recuperation tant que l'on n'est pas au bout du fichier.                        */

                    CALS(Putchar(ITb1(TABLE_DES_PERMUTATIONS,INDX(caractere_courant,PREMIER_OCTET))));
                                        /* Enfin, cryptage ou decryptage...                                                          */
                    Eblock
               ETan
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Test(EST_VRAI(c_est_l_operation_directe))
               Bblock
               PRINT_ERREUR("la clef de cryptage 'ClefCryptage' n'a pas ete definie (elle doit l'etre via 'secret')");
               Eblock
          ATes
               Bblock
               PRINT_ERREUR("la clef de decryptage 'ClefDecryptage' n'a pas ete definie (elle doit l'etre via 'secret')");
               Eblock
          ETes
          Eblock
     ETes

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.