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