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 /* 11 * This has been a quickly hacked 'ideatest.c'. When I add tests for other 12 * RC5 modes, more of the code will be uncommented. 13 */ 14 15 #include <stdio.h> 16 #include <string.h> 17 #include <stdlib.h> 18 19 #include "../e_os.h" 20 21 #ifdef OPENSSL_NO_RC5 22 int main(int argc, char *argv[]) 23 { 24 printf("No RC5 support\n"); 25 return (0); 26 } 27 #else 28 # include <openssl/rc5.h> 29 30 static unsigned char RC5key[5][16] = { 31 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 33 {0x91, 0x5f, 0x46, 0x19, 0xbe, 0x41, 0xb2, 0x51, 34 0x63, 0x55, 0xa5, 0x01, 0x10, 0xa9, 0xce, 0x91}, 35 {0x78, 0x33, 0x48, 0xe7, 0x5a, 0xeb, 0x0f, 0x2f, 36 0xd7, 0xb1, 0x69, 0xbb, 0x8d, 0xc1, 0x67, 0x87}, 37 {0xdc, 0x49, 0xdb, 0x13, 0x75, 0xa5, 0x58, 0x4f, 38 0x64, 0x85, 0xb4, 0x13, 0xb5, 0xf1, 0x2b, 0xaf}, 39 {0x52, 0x69, 0xf1, 0x49, 0xd4, 0x1b, 0xa0, 0x15, 40 0x24, 0x97, 0x57, 0x4d, 0x7f, 0x15, 0x31, 0x25}, 41 }; 42 43 static unsigned char RC5plain[5][8] = { 44 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 45 {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D}, 46 {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52}, 47 {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92}, 48 {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC}, 49 }; 50 51 static unsigned char RC5cipher[5][8] = { 52 {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D}, 53 {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52}, 54 {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92}, 55 {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC}, 56 {0xEB, 0x44, 0xE4, 0x15, 0xDA, 0x31, 0x98, 0x24}, 57 }; 58 59 # define RC5_CBC_NUM 27 60 static unsigned char rc5_cbc_cipher[RC5_CBC_NUM][8] = { 61 {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1e}, 62 {0x79, 0x7b, 0xba, 0x4d, 0x78, 0x11, 0x1d, 0x1e}, 63 {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f}, 64 {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f}, 65 {0x8b, 0x9d, 0xed, 0x91, 0xce, 0x77, 0x94, 0xa6}, 66 {0x2f, 0x75, 0x9f, 0xe7, 0xad, 0x86, 0xa3, 0x78}, 67 {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88}, 68 {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88}, 69 {0xdc, 0xfe, 0x09, 0x85, 0x77, 0xec, 0xa5, 0xff}, 70 {0x96, 0x46, 0xfb, 0x77, 0x63, 0x8f, 0x9c, 0xa8}, 71 {0xb2, 0xb3, 0x20, 0x9d, 0xb6, 0x59, 0x4d, 0xa4}, 72 {0x54, 0x5f, 0x7f, 0x32, 0xa5, 0xfc, 0x38, 0x36}, 73 {0x82, 0x85, 0xe7, 0xc1, 0xb5, 0xbc, 0x74, 0x02}, 74 {0xfc, 0x58, 0x6f, 0x92, 0xf7, 0x08, 0x09, 0x34}, 75 {0xcf, 0x27, 0x0e, 0xf9, 0x71, 0x7f, 0xf7, 0xc4}, 76 {0xe4, 0x93, 0xf1, 0xc1, 0xbb, 0x4d, 0x6e, 0x8c}, 77 {0x5c, 0x4c, 0x04, 0x1e, 0x0f, 0x21, 0x7a, 0xc3}, 78 {0x92, 0x1f, 0x12, 0x48, 0x53, 0x73, 0xb4, 0xf7}, 79 {0x5b, 0xa0, 0xca, 0x6b, 0xbe, 0x7f, 0x5f, 0xad}, 80 {0xc5, 0x33, 0x77, 0x1c, 0xd0, 0x11, 0x0e, 0x63}, 81 {0x29, 0x4d, 0xdb, 0x46, 0xb3, 0x27, 0x8d, 0x60}, 82 {0xda, 0xd6, 0xbd, 0xa9, 0xdf, 0xe8, 0xf7, 0xe8}, 83 {0x97, 0xe0, 0x78, 0x78, 0x37, 0xed, 0x31, 0x7f}, 84 {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78}, 85 {0x8f, 0x34, 0xc3, 0xc6, 0x81, 0xc9, 0x96, 0x95}, 86 {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11}, 87 {0x7f, 0xd1, 0xa0, 0x23, 0xa5, 0xbb, 0xa2, 0x17}, 88 }; 89 90 static unsigned char rc5_cbc_key[RC5_CBC_NUM][17] = { 91 {1, 0x00}, 92 {1, 0x00}, 93 {1, 0x00}, 94 {1, 0x00}, 95 {1, 0x00}, 96 {1, 0x11}, 97 {1, 0x00}, 98 {4, 0x00, 0x00, 0x00, 0x00}, 99 {1, 0x00}, 100 {1, 0x00}, 101 {1, 0x00}, 102 {1, 0x00}, 103 {4, 0x01, 0x02, 0x03, 0x04}, 104 {4, 0x01, 0x02, 0x03, 0x04}, 105 {4, 0x01, 0x02, 0x03, 0x04}, 106 {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 107 {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 108 {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 109 {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 110 {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 111 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 112 {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 113 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 114 {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 115 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 116 {5, 0x01, 0x02, 0x03, 0x04, 0x05}, 117 {5, 0x01, 0x02, 0x03, 0x04, 0x05}, 118 {5, 0x01, 0x02, 0x03, 0x04, 0x05}, 119 {5, 0x01, 0x02, 0x03, 0x04, 0x05}, 120 {5, 0x01, 0x02, 0x03, 0x04, 0x05}, 121 }; 122 123 static unsigned char rc5_cbc_plain[RC5_CBC_NUM][8] = { 124 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 125 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 126 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 127 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 128 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 129 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 130 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 131 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 132 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 133 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 134 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 135 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 136 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 137 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 138 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 139 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 140 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 141 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 142 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 143 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 144 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 145 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}, 146 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 147 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 148 {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, 149 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 150 {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x01}, 151 }; 152 153 static int rc5_cbc_rounds[RC5_CBC_NUM] = { 154 0, 0, 0, 0, 0, 1, 2, 2, 155 8, 8, 12, 16, 8, 12, 16, 12, 156 8, 12, 16, 8, 12, 16, 12, 8, 157 8, 8, 8, 158 }; 159 160 static unsigned char rc5_cbc_iv[RC5_CBC_NUM][8] = { 161 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 162 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 163 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 164 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 165 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 166 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 167 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 168 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 169 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 170 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 171 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 172 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 173 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 174 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 175 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 176 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 177 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 178 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 179 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 180 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 181 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 182 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 183 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 184 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 185 {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78}, 186 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 187 {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11}, 188 }; 189 190 int main(int argc, char *argv[]) 191 { 192 int i, n, err = 0; 193 RC5_32_KEY key; 194 unsigned char buf[8], buf2[8], ivb[8]; 195 196 for (n = 0; n < 5; n++) { 197 RC5_32_set_key(&key, 16, &(RC5key[n][0]), 12); 198 199 RC5_32_ecb_encrypt(&(RC5plain[n][0]), buf, &key, RC5_ENCRYPT); 200 if (memcmp(&(RC5cipher[n][0]), buf, 8) != 0) { 201 printf("ecb RC5 error encrypting (%d)\n", n + 1); 202 printf("got :"); 203 for (i = 0; i < 8; i++) 204 printf("%02X ", buf[i]); 205 printf("\n"); 206 printf("expected:"); 207 for (i = 0; i < 8; i++) 208 printf("%02X ", RC5cipher[n][i]); 209 err = 20; 210 printf("\n"); 211 } 212 213 RC5_32_ecb_encrypt(buf, buf2, &key, RC5_DECRYPT); 214 if (memcmp(&(RC5plain[n][0]), buf2, 8) != 0) { 215 printf("ecb RC5 error decrypting (%d)\n", n + 1); 216 printf("got :"); 217 for (i = 0; i < 8; i++) 218 printf("%02X ", buf2[i]); 219 printf("\n"); 220 printf("expected:"); 221 for (i = 0; i < 8; i++) 222 printf("%02X ", RC5plain[n][i]); 223 printf("\n"); 224 err = 3; 225 } 226 } 227 if (err == 0) 228 printf("ecb RC5 ok\n"); 229 230 for (n = 0; n < RC5_CBC_NUM; n++) { 231 i = rc5_cbc_rounds[n]; 232 if (i < 8) 233 continue; 234 235 RC5_32_set_key(&key, rc5_cbc_key[n][0], &(rc5_cbc_key[n][1]), i); 236 237 memcpy(ivb, &(rc5_cbc_iv[n][0]), 8); 238 RC5_32_cbc_encrypt(&(rc5_cbc_plain[n][0]), buf, 8, 239 &key, &(ivb[0]), RC5_ENCRYPT); 240 241 if (memcmp(&(rc5_cbc_cipher[n][0]), buf, 8) != 0) { 242 printf("cbc RC5 error encrypting (%d)\n", n + 1); 243 printf("got :"); 244 for (i = 0; i < 8; i++) 245 printf("%02X ", buf[i]); 246 printf("\n"); 247 printf("expected:"); 248 for (i = 0; i < 8; i++) 249 printf("%02X ", rc5_cbc_cipher[n][i]); 250 err = 30; 251 printf("\n"); 252 } 253 254 memcpy(ivb, &(rc5_cbc_iv[n][0]), 8); 255 RC5_32_cbc_encrypt(buf, buf2, 8, &key, &(ivb[0]), RC5_DECRYPT); 256 if (memcmp(&(rc5_cbc_plain[n][0]), buf2, 8) != 0) { 257 printf("cbc RC5 error decrypting (%d)\n", n + 1); 258 printf("got :"); 259 for (i = 0; i < 8; i++) 260 printf("%02X ", buf2[i]); 261 printf("\n"); 262 printf("expected:"); 263 for (i = 0; i < 8; i++) 264 printf("%02X ", rc5_cbc_plain[n][i]); 265 printf("\n"); 266 err = 3; 267 } 268 } 269 if (err == 0) 270 printf("cbc RC5 ok\n"); 271 272 EXIT(err); 273 return (err); 274 } 275 276 #endif 277