1 /* 2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <string.h> 13 14 #include "../e_os.h" 15 16 #ifdef OPENSSL_NO_RC4 17 int main(int argc, char *argv[]) 18 { 19 printf("No RC4 support\n"); 20 return (0); 21 } 22 #else 23 # include <openssl/rc4.h> 24 # include <openssl/sha.h> 25 26 static unsigned char keys[7][30] = { 27 {8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, 28 {8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, 29 {8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 30 {4, 0xef, 0x01, 0x23, 0x45}, 31 {8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, 32 {4, 0xef, 0x01, 0x23, 0x45}, 33 }; 34 35 static unsigned char data_len[7] = { 8, 8, 8, 20, 28, 10 }; 36 37 static unsigned char data[7][30] = { 38 {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xff}, 39 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}, 40 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}, 41 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 0x00, 0x00, 0x00, 0x00, 0xff}, 44 {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 45 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 46 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 47 0x12, 0x34, 0x56, 0x78, 0xff}, 48 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}, 49 {0}, 50 }; 51 52 static unsigned char output[7][30] = { 53 {0x75, 0xb7, 0x87, 0x80, 0x99, 0xe0, 0xc5, 0x96, 0x00}, 54 {0x74, 0x94, 0xc2, 0xe7, 0x10, 0x4b, 0x08, 0x79, 0x00}, 55 {0xde, 0x18, 0x89, 0x41, 0xa3, 0x37, 0x5d, 0x3a, 0x00}, 56 {0xd6, 0xa1, 0x41, 0xa7, 0xec, 0x3c, 0x38, 0xdf, 57 0xbd, 0x61, 0x5a, 0x11, 0x62, 0xe1, 0xc7, 0xba, 58 0x36, 0xb6, 0x78, 0x58, 0x00}, 59 {0x66, 0xa0, 0x94, 0x9f, 0x8a, 0xf7, 0xd6, 0x89, 60 0x1f, 0x7f, 0x83, 0x2b, 0xa8, 0x33, 0xc0, 0x0c, 61 0x89, 0x2e, 0xbe, 0x30, 0x14, 0x3c, 0xe2, 0x87, 62 0x40, 0x01, 0x1e, 0xcf, 0x00}, 63 {0xd6, 0xa1, 0x41, 0xa7, 0xec, 0x3c, 0x38, 0xdf, 0xbd, 0x61, 0x00}, 64 {0}, 65 }; 66 67 int main(int argc, char *argv[]) 68 { 69 int i, err = 0; 70 int j; 71 unsigned char *p; 72 RC4_KEY key; 73 unsigned char obuf[512]; 74 75 for (i = 0; i < 6; i++) { 76 RC4_set_key(&key, keys[i][0], &(keys[i][1])); 77 memset(obuf, 0, sizeof(obuf)); 78 RC4(&key, data_len[i], &(data[i][0]), obuf); 79 if (memcmp(obuf, output[i], data_len[i] + 1) != 0) { 80 printf("error calculating RC4\n"); 81 printf("output:"); 82 for (j = 0; j < data_len[i] + 1; j++) 83 printf(" %02x", obuf[j]); 84 printf("\n"); 85 printf("expect:"); 86 p = &(output[i][0]); 87 for (j = 0; j < data_len[i] + 1; j++) 88 printf(" %02x", *(p++)); 89 printf("\n"); 90 err++; 91 } else 92 printf("test %d ok\n", i); 93 } 94 printf("test end processing "); 95 for (i = 0; i < data_len[3]; i++) { 96 RC4_set_key(&key, keys[3][0], &(keys[3][1])); 97 memset(obuf, 0, sizeof(obuf)); 98 RC4(&key, i, &(data[3][0]), obuf); 99 if ((memcmp(obuf, output[3], i) != 0) || (obuf[i] != 0)) { 100 printf("error in RC4 length processing\n"); 101 printf("output:"); 102 for (j = 0; j < i + 1; j++) 103 printf(" %02x", obuf[j]); 104 printf("\n"); 105 printf("expect:"); 106 p = &(output[3][0]); 107 for (j = 0; j < i; j++) 108 printf(" %02x", *(p++)); 109 printf(" 00\n"); 110 err++; 111 } else { 112 printf("."); 113 fflush(stdout); 114 } 115 } 116 printf("done\n"); 117 printf("test multi-call "); 118 for (i = 0; i < data_len[3]; i++) { 119 RC4_set_key(&key, keys[3][0], &(keys[3][1])); 120 memset(obuf, 0, sizeof(obuf)); 121 RC4(&key, i, &(data[3][0]), obuf); 122 RC4(&key, data_len[3] - i, &(data[3][i]), &(obuf[i])); 123 if (memcmp(obuf, output[3], data_len[3] + 1) != 0) { 124 printf("error in RC4 multi-call processing\n"); 125 printf("output:"); 126 for (j = 0; j < data_len[3] + 1; j++) 127 printf(" %02x", obuf[j]); 128 printf("\n"); 129 printf("expect:"); 130 p = &(output[3][0]); 131 for (j = 0; j < data_len[3] + 1; j++) 132 printf(" %02x", *(p++)); 133 err++; 134 } else { 135 printf("."); 136 fflush(stdout); 137 } 138 } 139 printf("done\n"); 140 printf("bulk test "); 141 { 142 unsigned char buf[513]; 143 SHA_CTX c; 144 unsigned char md[SHA_DIGEST_LENGTH]; 145 static unsigned char expected[] = { 146 0xa4, 0x7b, 0xcc, 0x00, 0x3d, 0xd0, 0xbd, 0xe1, 0xac, 0x5f, 147 0x12, 0x1e, 0x45, 0xbc, 0xfb, 0x1a, 0xa1, 0xf2, 0x7f, 0xc5 148 }; 149 150 RC4_set_key(&key, keys[0][0], &(keys[3][1])); 151 memset(buf, 0, sizeof(buf)); 152 SHA1_Init(&c); 153 for (i = 0; i < 2571; i++) { 154 RC4(&key, sizeof(buf), buf, buf); 155 SHA1_Update(&c, buf, sizeof(buf)); 156 } 157 SHA1_Final(md, &c); 158 159 if (memcmp(md, expected, sizeof(md))) { 160 printf("error in RC4 bulk test\n"); 161 printf("output:"); 162 for (j = 0; j < (int)sizeof(md); j++) 163 printf(" %02x", md[j]); 164 printf("\n"); 165 printf("expect:"); 166 for (j = 0; j < (int)sizeof(md); j++) 167 printf(" %02x", expected[j]); 168 printf("\n"); 169 err++; 170 } else 171 printf("ok\n"); 172 } 173 EXIT(err); 174 } 175 #endif 176