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