1295016Sjkim/* 255714Skris * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. 355714Skris * 455714Skris * Licensed under the Apache License 2.0 (the "License"). You may not use 555714Skris * this file except in compliance with the License. You can obtain a copy 655714Skris * in the file LICENSE in the source distribution or at 755714Skris * https://www.openssl.org/source/license.html 8280304Sjkim */ 955714Skris 1055714Skris/* 1155714Skris * RC4 and SHA-1 low level APIs are deprecated for public use, but still ok for 1255714Skris * internal use. 1355714Skris */ 1455714Skris#include "internal/deprecated.h" 15280304Sjkim 1655714Skris#include <string.h> 1755714Skris 1855714Skris#include "internal/nelem.h" 1955714Skris#include "testutil.h" 2055714Skris 2155714Skris#ifndef OPENSSL_NO_RC4 22280304Sjkim# include <openssl/rc4.h> 2355714Skris# include <openssl/sha.h> 2455714Skris 2555714Skrisstatic unsigned char keys[6][30] = { 2655714Skris {8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, 2755714Skris {8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, 2855714Skris {8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 2955714Skris {4, 0xef, 0x01, 0x23, 0x45}, 3055714Skris {8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, 3155714Skris {4, 0xef, 0x01, 0x23, 0x45}, 3255714Skris}; 3355714Skris 3455714Skrisstatic unsigned char data_len[6] = { 8, 8, 8, 20, 28, 10 }; 3555714Skris 3655714Skrisstatic unsigned char data[6][30] = { 37280304Sjkim {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xff}, 3855714Skris {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}, 3955714Skris {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}, 40280304Sjkim {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 4155714Skris 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 4255714Skris 0x00, 0x00, 0x00, 0x00, 0xff}, 4355714Skris {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 4455714Skris 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 4555714Skris 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 4655714Skris 0x12, 0x34, 0x56, 0x78, 0xff}, 4755714Skris {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}, 4855714Skris}; 4955714Skris 5055714Skrisstatic unsigned char output[6][30] = { 5155714Skris {0x75, 0xb7, 0x87, 0x80, 0x99, 0xe0, 0xc5, 0x96, 0x00}, 52280304Sjkim {0x74, 0x94, 0xc2, 0xe7, 0x10, 0x4b, 0x08, 0x79, 0x00}, 5355714Skris {0xde, 0x18, 0x89, 0x41, 0xa3, 0x37, 0x5d, 0x3a, 0x00}, 5455714Skris {0xd6, 0xa1, 0x41, 0xa7, 0xec, 0x3c, 0x38, 0xdf, 5555714Skris 0xbd, 0x61, 0x5a, 0x11, 0x62, 0xe1, 0xc7, 0xba, 5655714Skris 0x36, 0xb6, 0x78, 0x58, 0x00}, 5755714Skris {0x66, 0xa0, 0x94, 0x9f, 0x8a, 0xf7, 0xd6, 0x89, 58160817Ssimon 0x1f, 0x7f, 0x83, 0x2b, 0xa8, 0x33, 0xc0, 0x0c, 59160817Ssimon 0x89, 0x2e, 0xbe, 0x30, 0x14, 0x3c, 0xe2, 0x87, 60160817Ssimon 0x40, 0x01, 0x1e, 0xcf, 0x00}, 61280304Sjkim {0xd6, 0xa1, 0x41, 0xa7, 0xec, 0x3c, 0x38, 0xdf, 0xbd, 0x61, 0x00}, 62160817Ssimon}; 63160817Ssimon 64160817Ssimonstatic int test_rc4_encrypt(const int i) 65160817Ssimon{ 66160817Ssimon unsigned char obuf[512]; 67280304Sjkim RC4_KEY key; 68160817Ssimon 69160817Ssimon RC4_set_key(&key, keys[i][0], &(keys[i][1])); 70160817Ssimon memset(obuf, 0, sizeof(obuf)); 7155714Skris RC4(&key, data_len[i], &(data[i][0]), obuf); 7255714Skris return TEST_mem_eq(obuf, data_len[i] + 1, output[i], data_len[i] + 1); 7355714Skris} 74111150Snectar 75111150Snectarstatic int test_rc4_end_processing(const int i) 76280304Sjkim{ 77280304Sjkim unsigned char obuf[512]; 78280304Sjkim RC4_KEY key; 79280304Sjkim 80280304Sjkim RC4_set_key(&key, keys[3][0], &(keys[3][1])); 81280304Sjkim memset(obuf, 0, sizeof(obuf)); 8255714Skris RC4(&key, i, &(data[3][0]), obuf); 8355714Skris if (!TEST_mem_eq(obuf, i, output[3], i)) 8455714Skris return 0; 8555714Skris return TEST_uchar_eq(obuf[i], 0); 86280304Sjkim} 87280304Sjkim 8855714Skrisstatic int test_rc4_multi_call(const int i) 89280304Sjkim{ 90280304Sjkim unsigned char obuf[512]; 91160817Ssimon RC4_KEY key; 92280304Sjkim 93280304Sjkim RC4_set_key(&key, keys[3][0], &(keys[3][1])); 94280304Sjkim memset(obuf, 0, sizeof(obuf)); 95280304Sjkim RC4(&key, i, &(data[3][0]), obuf); 96280304Sjkim RC4(&key, data_len[3] - i, &(data[3][i]), &(obuf[i])); 97280304Sjkim return TEST_mem_eq(obuf, data_len[3] + 1, output[3], data_len[3] + 1); 98280304Sjkim} 99280304Sjkim 100280304Sjkimstatic int test_rc_bulk(void) 101280304Sjkim{ 102280304Sjkim RC4_KEY key; 103280304Sjkim unsigned char buf[513]; 104280304Sjkim SHA_CTX c; 105280304Sjkim unsigned char md[SHA_DIGEST_LENGTH]; 10655714Skris int i; 107280304Sjkim static unsigned char expected[] = { 108280304Sjkim 0xa4, 0x7b, 0xcc, 0x00, 0x3d, 0xd0, 0xbd, 0xe1, 0xac, 0x5f, 109280304Sjkim 0x12, 0x1e, 0x45, 0xbc, 0xfb, 0x1a, 0xa1, 0xf2, 0x7f, 0xc5 110160817Ssimon }; 111280304Sjkim 112280304Sjkim RC4_set_key(&key, keys[0][0], &(keys[3][1])); 113280304Sjkim memset(buf, 0, sizeof(buf)); 114280304Sjkim SHA1_Init(&c); 115280304Sjkim for (i = 0; i < 2571; i++) { 116280304Sjkim RC4(&key, sizeof(buf), buf, buf); 117280304Sjkim SHA1_Update(&c, buf, sizeof(buf)); 118280304Sjkim } 119238405Sjkim SHA1_Final(md, &c); 120280304Sjkim 121238405Sjkim return TEST_mem_eq(md, sizeof(md), expected, sizeof(expected)); 12255714Skris} 123280304Sjkim#endif 124280304Sjkim 125280304Sjkimint setup_tests(void) 126280304Sjkim{ 127280304Sjkim#ifndef OPENSSL_NO_RC4 128280304Sjkim ADD_ALL_TESTS(test_rc4_encrypt, OSSL_NELEM(data_len)); 129280304Sjkim ADD_ALL_TESTS(test_rc4_end_processing, data_len[3]); 130280304Sjkim ADD_ALL_TESTS(test_rc4_multi_call, data_len[3]); 131280304Sjkim ADD_TEST(test_rc_bulk); 132280304Sjkim#endif 133280304Sjkim return 1; 134280304Sjkim} 135280304Sjkim