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