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