root/maint/gnulib/tests/test-des.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main

   1 /*
   2  * Copyright (C) 2005, 2007, 2010-2021 Free Software Foundation, Inc.
   3  * Written by Simon Josefsson
   4  *
   5  * This program is free software; you can redistribute it and/or modify
   6  * it under the terms of the GNU General Public License as published by
   7  * the Free Software Foundation; either version 3, or (at your option)
   8  * any later version.
   9  *
  10  * This program is distributed in the hope that it will be useful,
  11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13  * GNU General Public License for more details.
  14  *
  15  * You should have received a copy of the GNU General Public License
  16  * along with this program; if not, see <https://www.gnu.org/licenses/>.  */
  17 
  18 /* Adapted for gnulib by Simon Josefsson, based on Libgcrypt. */
  19 
  20 #include <config.h>
  21 
  22 #include "des.h"
  23 
  24 #include <stdio.h>
  25 #include <string.h>
  26 
  27 int
  28 main (int argc, char *argv[])
     /* [previous][next][first][last][top][bottom][index][help] */
  29 {
  30   /*
  31    * DES Maintenance Test
  32    */
  33   {
  34     int i;
  35     char key[8] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
  36     char input[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  37     char result[8] = { 0x24, 0x6e, 0x9d, 0xb9, 0xc5, 0x50, 0x38, 0x1a };
  38     char temp1[8], temp2[8], temp3[8];
  39     gl_des_ctx des;
  40 
  41     for (i = 0; i < 64; ++i)
  42       {
  43         gl_des_setkey (&des, key);
  44         gl_des_ecb_encrypt (&des, input, temp1);
  45         gl_des_ecb_encrypt (&des, temp1, temp2);
  46         gl_des_setkey (&des, temp2);
  47         gl_des_ecb_decrypt (&des, temp1, temp3);
  48         memcpy (key, temp3, 8);
  49         memcpy (input, temp1, 8);
  50       }
  51     if (memcmp (temp3, result, 8))
  52       return 1;
  53   }
  54 
  55 
  56   /*
  57    * Self made Triple-DES test  (Does somebody know an official test?)
  58    */
  59   {
  60     int i;
  61     char input[8] = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
  62     char key1[8] = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 };
  63     char key2[8] = { 0x11, 0x22, 0x33, 0x44, 0xff, 0xaa, 0xcc, 0xdd };
  64     char result[8] = { 0x7b, 0x38, 0x3b, 0x23, 0xa2, 0x7d, 0x26, 0xd3 };
  65 
  66     gl_3des_ctx des3;
  67 
  68     for (i = 0; i < 16; ++i)
  69       {
  70         gl_3des_set2keys (&des3, key1, key2);
  71         gl_3des_ecb_encrypt (&des3, input, key1);
  72         gl_3des_ecb_decrypt (&des3, input, key2);
  73         gl_3des_set3keys (&des3, key1, input, key2);
  74         gl_3des_ecb_encrypt (&des3, input, input);
  75       }
  76     if (memcmp (input, result, 8))
  77       return 1;
  78   }
  79 
  80   /*
  81    * More Triple-DES test.  These are testvectors as used by SSLeay,
  82    * thanks to Jeroen C. van Gelderen.
  83    */
  84   {
  85     struct
  86     {
  87       char key[24];
  88       char plain[8];
  89       char cipher[8];
  90     } testdata[] =
  91     {
  92       {
  93         {
  94         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  95             0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  96             0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
  97         {
  98         0x95, 0xF8, 0xA5, 0xE5, 0xDD, 0x31, 0xD9, 0x00},
  99         {
 100       0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
 101       {
 102         {
 103         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 104             0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 105             0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
 106         {
 107         0x9D, 0x64, 0x55, 0x5A, 0x9A, 0x10, 0xB8, 0x52,},
 108         {
 109         0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00}
 110       },
 111       {
 112         {
 113         0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E,
 114             0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E,
 115             0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
 116         {
 117         0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
 118         {
 119         0x71, 0x78, 0x87, 0x6E, 0x01, 0xF1, 0x9B, 0x2A}
 120       },
 121       {
 122         {
 123         0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6,
 124             0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6,
 125             0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
 126         {
 127         0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
 128         {
 129         0xAF, 0x37, 0xFB, 0x42, 0x1F, 0x8C, 0x40, 0x95}
 130       },
 131       {
 132         {
 133         0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
 134             0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
 135             0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
 136         {
 137         0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61},
 138         {
 139         0x3D, 0x12, 0x4F, 0xE2, 0x19, 0x8B, 0xA3, 0x18}
 140       },
 141       {
 142         {
 143         0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
 144             0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
 145             0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
 146         {
 147         0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61},
 148         {
 149         0xFB, 0xAB, 0xA1, 0xFF, 0x9D, 0x05, 0xE9, 0xB1}
 150       },
 151       {
 152         {
 153         0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
 154             0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
 155             0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
 156         {
 157         0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61},
 158         {
 159         0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72}
 160       },
 161       {
 162         {
 163         0x03, 0x52, 0x02, 0x07, 0x67, 0x20, 0x82, 0x17,
 164             0x86, 0x02, 0x87, 0x66, 0x59, 0x08, 0x21, 0x98,
 165             0x64, 0x05, 0x6A, 0xBD, 0xFE, 0xA9, 0x34, 0x57},
 166         {
 167         0x73, 0x71, 0x75, 0x69, 0x67, 0x67, 0x6C, 0x65},
 168         {
 169         0xc0, 0x7d, 0x2a, 0x0f, 0xa5, 0x66, 0xfa, 0x30}
 170       },
 171       {
 172         {
 173         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 174             0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 175             0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02},
 176         {
 177         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
 178         {
 179         0xe6, 0xe6, 0xdd, 0x5b, 0x7e, 0x72, 0x29, 0x74}
 180       },
 181       {
 182         {
 183         0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
 184             0x91, 0x07, 0xD0, 0x15, 0x89, 0x19, 0x01, 0x01,
 185             0x19, 0x07, 0x92, 0x10, 0x98, 0x1A, 0x01, 0x01},
 186         {
 187         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
 188         {
 189         0xe1, 0xef, 0x62, 0xc3, 0x32, 0xfe, 0x82, 0x5b}
 190       }
 191     };
 192 
 193     char result[8];
 194     int i;
 195     gl_3des_ctx des3;
 196 
 197     for (i = 0; i < sizeof (testdata) / sizeof (*testdata); ++i)
 198       {
 199         gl_3des_set3keys (&des3, testdata[i].key,
 200                           testdata[i].key + 8, testdata[i].key + 16);
 201 
 202         gl_3des_ecb_encrypt (&des3, testdata[i].plain, result);
 203         if (memcmp (testdata[i].cipher, result, 8))
 204           {
 205             return 1;
 206           }
 207 
 208         gl_3des_ecb_decrypt (&des3, testdata[i].cipher, result);
 209         if (memcmp (testdata[i].plain, result, 8))
 210           {
 211             return 1;
 212           }
 213       }
 214   }
 215 
 216   return 0;
 217 }

/* [previous][next][first][last][top][bottom][index][help] */