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