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