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