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,
    149     0,
    150     0,
    151     0,
    152     0,
    153     1,
    154     2,
    155     2,
    156     8,
    157     8,
    158     12,
    159     16,
    160     8,
    161     12,
    162     16,
    163     12,
    164     8,
    165     12,
    166     16,
    167     8,
    168     12,
    169     16,
    170     12,
    171     8,
    172     8,
    173     8,
    174     8,
    175 };
    176 
    177 static unsigned char rc5_cbc_iv[RC5_CBC_NUM][8] = {
    178     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    179     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    180     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
    181     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    182     { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
    183     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    184     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    185     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    186     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    187     { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
    188     { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
    189     { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
    190     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    191     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    192     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    193     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    194     { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
    195     { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
    196     { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
    197     { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
    198     { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
    199     { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
    200     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    201     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    202     { 0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78 },
    203     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    204     { 0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11 },
    205 };
    206 
    207 static int test_rc5_ecb(int n)
    208 {
    209     int testresult = 1;
    210     RC5_32_KEY key;
    211     unsigned char buf[8], buf2[8];
    212 
    213     if (!TEST_true(RC5_32_set_key(&key, 16, &RC5key[n][0], 12)))
    214         return 0;
    215 
    216     RC5_32_ecb_encrypt(&RC5plain[n][0], buf, &key, RC5_ENCRYPT);
    217     if (!TEST_mem_eq(&RC5cipher[n][0], sizeof(RC5cipher[0]), buf, sizeof(buf)))
    218         testresult = 0;
    219 
    220     RC5_32_ecb_encrypt(buf, buf2, &key, RC5_DECRYPT);
    221     if (!TEST_mem_eq(&RC5plain[n][0], sizeof(RC5cipher[0]), buf2, sizeof(buf2)))
    222         testresult = 0;
    223 
    224     return testresult;
    225 }
    226 
    227 static int test_rc5_cbc(int n)
    228 {
    229     int testresult = 1;
    230     int i;
    231     RC5_32_KEY key;
    232     unsigned char buf[8], buf2[8], ivb[8];
    233 
    234     i = rc5_cbc_rounds[n];
    235     if (i >= 8) {
    236         if (!TEST_true(RC5_32_set_key(&key, rc5_cbc_key[n][0],
    237                 &rc5_cbc_key[n][1], i)))
    238             return 0;
    239 
    240         memcpy(ivb, &rc5_cbc_iv[n][0], 8);
    241         RC5_32_cbc_encrypt(&rc5_cbc_plain[n][0], buf, 8,
    242             &key, &ivb[0], RC5_ENCRYPT);
    243 
    244         if (!TEST_mem_eq(&rc5_cbc_cipher[n][0], sizeof(rc5_cbc_cipher[0]),
    245                 buf, sizeof(buf)))
    246             testresult = 0;
    247 
    248         memcpy(ivb, &rc5_cbc_iv[n][0], 8);
    249         RC5_32_cbc_encrypt(buf, buf2, 8, &key, &ivb[0], RC5_DECRYPT);
    250         if (!TEST_mem_eq(&rc5_cbc_plain[n][0], sizeof(rc5_cbc_plain[0]),
    251                 buf2, sizeof(buf2)))
    252             testresult = 0;
    253     }
    254 
    255     return testresult;
    256 }
    257 #endif
    258 
    259 int setup_tests(void)
    260 {
    261 #ifndef OPENSSL_NO_RC5
    262     ADD_ALL_TESTS(test_rc5_ecb, OSSL_NELEM(RC5key));
    263     ADD_ALL_TESTS(test_rc5_cbc, RC5_CBC_NUM);
    264 #endif
    265     return 1;
    266 }
    267