Home | History | Annotate | Line # | Download | only in test
      1 /*
      2  * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License 2.0 (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 /*
     11  * RC5 low level APIs are deprecated for public use, but still ok for internal
     12  * use.
     13  */
     14 #include "internal/deprecated.h"
     15 
     16 #include <string.h>
     17 
     18 #include "internal/nelem.h"
     19 #include "testutil.h"
     20 
     21 #ifndef OPENSSL_NO_RC5
     22 # include <openssl/rc5.h>
     23 
     24 static unsigned char RC5key[5][16] = {
     25     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     26      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
     27     {0x91, 0x5f, 0x46, 0x19, 0xbe, 0x41, 0xb2, 0x51,
     28      0x63, 0x55, 0xa5, 0x01, 0x10, 0xa9, 0xce, 0x91},
     29     {0x78, 0x33, 0x48, 0xe7, 0x5a, 0xeb, 0x0f, 0x2f,
     30      0xd7, 0xb1, 0x69, 0xbb, 0x8d, 0xc1, 0x67, 0x87},
     31     {0xdc, 0x49, 0xdb, 0x13, 0x75, 0xa5, 0x58, 0x4f,
     32      0x64, 0x85, 0xb4, 0x13, 0xb5, 0xf1, 0x2b, 0xaf},
     33     {0x52, 0x69, 0xf1, 0x49, 0xd4, 0x1b, 0xa0, 0x15,
     34      0x24, 0x97, 0x57, 0x4d, 0x7f, 0x15, 0x31, 0x25},
     35 };
     36 
     37 static unsigned char RC5plain[5][8] = {
     38     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
     39     {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D},
     40     {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52},
     41     {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92},
     42     {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC},
     43 };
     44 
     45 static unsigned char RC5cipher[5][8] = {
     46     {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D},
     47     {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52},
     48     {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92},
     49     {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC},
     50     {0xEB, 0x44, 0xE4, 0x15, 0xDA, 0x31, 0x98, 0x24},
     51 };
     52 
     53 # define RC5_CBC_NUM 27
     54 static unsigned char rc5_cbc_cipher[RC5_CBC_NUM][8] = {
     55     {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1e},
     56     {0x79, 0x7b, 0xba, 0x4d, 0x78, 0x11, 0x1d, 0x1e},
     57     {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f},
     58     {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f},
     59     {0x8b, 0x9d, 0xed, 0x91, 0xce, 0x77, 0x94, 0xa6},
     60     {0x2f, 0x75, 0x9f, 0xe7, 0xad, 0x86, 0xa3, 0x78},
     61     {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88},
     62     {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88},
     63     {0xdc, 0xfe, 0x09, 0x85, 0x77, 0xec, 0xa5, 0xff},
     64     {0x96, 0x46, 0xfb, 0x77, 0x63, 0x8f, 0x9c, 0xa8},
     65     {0xb2, 0xb3, 0x20, 0x9d, 0xb6, 0x59, 0x4d, 0xa4},
     66     {0x54, 0x5f, 0x7f, 0x32, 0xa5, 0xfc, 0x38, 0x36},
     67     {0x82, 0x85, 0xe7, 0xc1, 0xb5, 0xbc, 0x74, 0x02},
     68     {0xfc, 0x58, 0x6f, 0x92, 0xf7, 0x08, 0x09, 0x34},
     69     {0xcf, 0x27, 0x0e, 0xf9, 0x71, 0x7f, 0xf7, 0xc4},
     70     {0xe4, 0x93, 0xf1, 0xc1, 0xbb, 0x4d, 0x6e, 0x8c},
     71     {0x5c, 0x4c, 0x04, 0x1e, 0x0f, 0x21, 0x7a, 0xc3},
     72     {0x92, 0x1f, 0x12, 0x48, 0x53, 0x73, 0xb4, 0xf7},
     73     {0x5b, 0xa0, 0xca, 0x6b, 0xbe, 0x7f, 0x5f, 0xad},
     74     {0xc5, 0x33, 0x77, 0x1c, 0xd0, 0x11, 0x0e, 0x63},
     75     {0x29, 0x4d, 0xdb, 0x46, 0xb3, 0x27, 0x8d, 0x60},
     76     {0xda, 0xd6, 0xbd, 0xa9, 0xdf, 0xe8, 0xf7, 0xe8},
     77     {0x97, 0xe0, 0x78, 0x78, 0x37, 0xed, 0x31, 0x7f},
     78     {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78},
     79     {0x8f, 0x34, 0xc3, 0xc6, 0x81, 0xc9, 0x96, 0x95},
     80     {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11},
     81     {0x7f, 0xd1, 0xa0, 0x23, 0xa5, 0xbb, 0xa2, 0x17},
     82 };
     83 
     84 static unsigned char rc5_cbc_key[RC5_CBC_NUM][17] = {
     85     {1, 0x00},
     86     {1, 0x00},
     87     {1, 0x00},
     88     {1, 0x00},
     89     {1, 0x00},
     90     {1, 0x11},
     91     {1, 0x00},
     92     {4, 0x00, 0x00, 0x00, 0x00},
     93     {1, 0x00},
     94     {1, 0x00},
     95     {1, 0x00},
     96     {1, 0x00},
     97     {4, 0x01, 0x02, 0x03, 0x04},
     98     {4, 0x01, 0x02, 0x03, 0x04},
     99     {4, 0x01, 0x02, 0x03, 0x04},
    100     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    101     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    102     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    103     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    104     {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
    105      0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    106     {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
    107      0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    108     {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
    109      0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    110     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
    111     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
    112     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
    113     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
    114     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
    115 };
    116 
    117 static unsigned char rc5_cbc_plain[RC5_CBC_NUM][8] = {
    118     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    119     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    120     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    121     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
    122     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    123     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    124     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    125     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    126     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    127     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    128     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    129     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    130     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    131     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    132     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    133     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    134     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    135     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    136     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    137     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    138     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    139     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
    140     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    141     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    142     {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08},
    143     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    144     {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x01},
    145 };
    146 
    147 static int rc5_cbc_rounds[RC5_CBC_NUM] = {
    148     0, 0, 0, 0, 0, 1, 2, 2,
    149     8, 8, 12, 16, 8, 12, 16, 12,
    150     8, 12, 16, 8, 12, 16, 12, 8,
    151     8, 8, 8,
    152 };
    153 
    154 static unsigned char rc5_cbc_iv[RC5_CBC_NUM][8] = {
    155     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    156     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    157     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
    158     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    159     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    160     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    161     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    162     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    163     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    164     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    165     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    166     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    167     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    168     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    169     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    170     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    171     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    172     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    173     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    174     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    175     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    176     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
    177     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    178     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    179     {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78},
    180     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    181     {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11},
    182 };
    183 
    184 static int test_rc5_ecb(int n)
    185 {
    186     int testresult = 1;
    187     RC5_32_KEY key;
    188     unsigned char buf[8], buf2[8];
    189 
    190     if (!TEST_true(RC5_32_set_key(&key, 16, &RC5key[n][0], 12)))
    191         return 0;
    192 
    193     RC5_32_ecb_encrypt(&RC5plain[n][0], buf, &key, RC5_ENCRYPT);
    194     if (!TEST_mem_eq(&RC5cipher[n][0], sizeof(RC5cipher[0]), buf, sizeof(buf)))
    195         testresult = 0;
    196 
    197     RC5_32_ecb_encrypt(buf, buf2, &key, RC5_DECRYPT);
    198     if (!TEST_mem_eq(&RC5plain[n][0], sizeof(RC5cipher[0]), buf2, sizeof(buf2)))
    199         testresult = 0;
    200 
    201     return testresult;
    202 }
    203 
    204 static int test_rc5_cbc(int n)
    205 {
    206     int testresult = 1;
    207     int i;
    208     RC5_32_KEY key;
    209     unsigned char buf[8], buf2[8], ivb[8];
    210 
    211     i = rc5_cbc_rounds[n];
    212     if (i >= 8) {
    213         if (!TEST_true(RC5_32_set_key(&key, rc5_cbc_key[n][0],
    214                                       &rc5_cbc_key[n][1], i)))
    215             return 0;
    216 
    217         memcpy(ivb, &rc5_cbc_iv[n][0], 8);
    218         RC5_32_cbc_encrypt(&rc5_cbc_plain[n][0], buf, 8,
    219                            &key, &ivb[0], RC5_ENCRYPT);
    220 
    221         if (!TEST_mem_eq(&rc5_cbc_cipher[n][0], sizeof(rc5_cbc_cipher[0]),
    222                          buf, sizeof(buf)))
    223             testresult = 0;
    224 
    225         memcpy(ivb, &rc5_cbc_iv[n][0], 8);
    226         RC5_32_cbc_encrypt(buf, buf2, 8, &key, &ivb[0], RC5_DECRYPT);
    227         if (!TEST_mem_eq(&rc5_cbc_plain[n][0], sizeof(rc5_cbc_plain[0]),
    228                          buf2, sizeof(buf2)))
    229             testresult = 0;
    230     }
    231 
    232     return testresult;
    233 }
    234 #endif
    235 
    236 int setup_tests(void)
    237 {
    238 #ifndef OPENSSL_NO_RC5
    239     ADD_ALL_TESTS(test_rc5_ecb, OSSL_NELEM(RC5key));
    240     ADD_ALL_TESTS(test_rc5_cbc, RC5_CBC_NUM);
    241 #endif
    242     return 1;
    243 }
    244