Home | History | Annotate | Line # | Download | only in test
      1 /*
      2  * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the OpenSSL license (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 #include <string.h>
     11 
     12 #include "internal/nelem.h"
     13 #include "testutil.h"
     14 
     15 #ifndef OPENSSL_NO_RC4
     16 # include <openssl/rc4.h>
     17 # include <openssl/sha.h>
     18 
     19 static unsigned char keys[6][30] = {
     20     {8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
     21     {8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
     22     {8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
     23     {4, 0xef, 0x01, 0x23, 0x45},
     24     {8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
     25     {4, 0xef, 0x01, 0x23, 0x45},
     26 };
     27 
     28 static unsigned char data_len[6] = { 8, 8, 8, 20, 28, 10 };
     29 
     30 static unsigned char data[6][30] = {
     31     {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xff},
     32     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
     33     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
     34     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     35      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     36      0x00, 0x00, 0x00, 0x00, 0xff},
     37     {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
     38      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
     39      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
     40      0x12, 0x34, 0x56, 0x78, 0xff},
     41     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
     42 };
     43 
     44 static unsigned char output[6][30] = {
     45     {0x75, 0xb7, 0x87, 0x80, 0x99, 0xe0, 0xc5, 0x96, 0x00},
     46     {0x74, 0x94, 0xc2, 0xe7, 0x10, 0x4b, 0x08, 0x79, 0x00},
     47     {0xde, 0x18, 0x89, 0x41, 0xa3, 0x37, 0x5d, 0x3a, 0x00},
     48     {0xd6, 0xa1, 0x41, 0xa7, 0xec, 0x3c, 0x38, 0xdf,
     49      0xbd, 0x61, 0x5a, 0x11, 0x62, 0xe1, 0xc7, 0xba,
     50      0x36, 0xb6, 0x78, 0x58, 0x00},
     51     {0x66, 0xa0, 0x94, 0x9f, 0x8a, 0xf7, 0xd6, 0x89,
     52      0x1f, 0x7f, 0x83, 0x2b, 0xa8, 0x33, 0xc0, 0x0c,
     53      0x89, 0x2e, 0xbe, 0x30, 0x14, 0x3c, 0xe2, 0x87,
     54      0x40, 0x01, 0x1e, 0xcf, 0x00},
     55     {0xd6, 0xa1, 0x41, 0xa7, 0xec, 0x3c, 0x38, 0xdf, 0xbd, 0x61, 0x00},
     56 };
     57 
     58 static int test_rc4_encrypt(const int i)
     59 {
     60     unsigned char obuf[512];
     61     RC4_KEY key;
     62 
     63     RC4_set_key(&key, keys[i][0], &(keys[i][1]));
     64     memset(obuf, 0, sizeof(obuf));
     65     RC4(&key, data_len[i], &(data[i][0]), obuf);
     66     return TEST_mem_eq(obuf, data_len[i] + 1, output[i], data_len[i] + 1);
     67 }
     68 
     69 static int test_rc4_end_processing(const int i)
     70 {
     71     unsigned char obuf[512];
     72     RC4_KEY key;
     73 
     74     RC4_set_key(&key, keys[3][0], &(keys[3][1]));
     75     memset(obuf, 0, sizeof(obuf));
     76     RC4(&key, i, &(data[3][0]), obuf);
     77     if (!TEST_mem_eq(obuf, i, output[3], i))
     78         return 0;
     79     return TEST_uchar_eq(obuf[i], 0);
     80 }
     81 
     82 static int test_rc4_multi_call(const int i)
     83 {
     84     unsigned char obuf[512];
     85     RC4_KEY key;
     86 
     87     RC4_set_key(&key, keys[3][0], &(keys[3][1]));
     88     memset(obuf, 0, sizeof(obuf));
     89     RC4(&key, i, &(data[3][0]), obuf);
     90     RC4(&key, data_len[3] - i, &(data[3][i]), &(obuf[i]));
     91     return TEST_mem_eq(obuf, data_len[3] + 1, output[3], data_len[3] + 1);
     92 }
     93 
     94 static int test_rc_bulk(void)
     95 {
     96     RC4_KEY key;
     97     unsigned char buf[513];
     98     SHA_CTX c;
     99     unsigned char md[SHA_DIGEST_LENGTH];
    100     int i;
    101     static unsigned char expected[] = {
    102         0xa4, 0x7b, 0xcc, 0x00, 0x3d, 0xd0, 0xbd, 0xe1, 0xac, 0x5f,
    103         0x12, 0x1e, 0x45, 0xbc, 0xfb, 0x1a, 0xa1, 0xf2, 0x7f, 0xc5
    104     };
    105 
    106     RC4_set_key(&key, keys[0][0], &(keys[3][1]));
    107     memset(buf, 0, sizeof(buf));
    108     SHA1_Init(&c);
    109     for (i = 0; i < 2571; i++) {
    110         RC4(&key, sizeof(buf), buf, buf);
    111         SHA1_Update(&c, buf, sizeof(buf));
    112     }
    113     SHA1_Final(md, &c);
    114 
    115     return TEST_mem_eq(md, sizeof(md), expected, sizeof(expected));
    116 }
    117 #endif
    118 
    119 int setup_tests(void)
    120 {
    121 #ifndef OPENSSL_NO_RC4
    122     ADD_ALL_TESTS(test_rc4_encrypt, OSSL_NELEM(data_len));
    123     ADD_ALL_TESTS(test_rc4_end_processing, data_len[3]);
    124     ADD_ALL_TESTS(test_rc4_multi_call, data_len[3]);
    125     ADD_TEST(test_rc_bulk);
    126 #endif
    127     return 1;
    128 }
    129