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