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, 0, 0, 0, 0, 1, 2, 2, 149 8, 8, 12, 16, 8, 12, 16, 12, 150 8, 12, 16, 8, 12, 16, 12, 8, 151 8, 8, 8, 152 }; 153 154 static unsigned char rc5_cbc_iv[RC5_CBC_NUM][8] = { 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, 0x01}, 158 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 159 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 160 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 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 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 165 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 166 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 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 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 171 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 172 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 173 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 174 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 175 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 176 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, 177 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 178 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 179 {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78}, 180 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 181 {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11}, 182 }; 183 184 static int test_rc5_ecb(int n) 185 { 186 int testresult = 1; 187 RC5_32_KEY key; 188 unsigned char buf[8], buf2[8]; 189 190 if (!TEST_true(RC5_32_set_key(&key, 16, &RC5key[n][0], 12))) 191 return 0; 192 193 RC5_32_ecb_encrypt(&RC5plain[n][0], buf, &key, RC5_ENCRYPT); 194 if (!TEST_mem_eq(&RC5cipher[n][0], sizeof(RC5cipher[0]), buf, sizeof(buf))) 195 testresult = 0; 196 197 RC5_32_ecb_encrypt(buf, buf2, &key, RC5_DECRYPT); 198 if (!TEST_mem_eq(&RC5plain[n][0], sizeof(RC5cipher[0]), buf2, sizeof(buf2))) 199 testresult = 0; 200 201 return testresult; 202 } 203 204 static int test_rc5_cbc(int n) 205 { 206 int testresult = 1; 207 int i; 208 RC5_32_KEY key; 209 unsigned char buf[8], buf2[8], ivb[8]; 210 211 i = rc5_cbc_rounds[n]; 212 if (i >= 8) { 213 if (!TEST_true(RC5_32_set_key(&key, rc5_cbc_key[n][0], 214 &rc5_cbc_key[n][1], i))) 215 return 0; 216 217 memcpy(ivb, &rc5_cbc_iv[n][0], 8); 218 RC5_32_cbc_encrypt(&rc5_cbc_plain[n][0], buf, 8, 219 &key, &ivb[0], RC5_ENCRYPT); 220 221 if (!TEST_mem_eq(&rc5_cbc_cipher[n][0], sizeof(rc5_cbc_cipher[0]), 222 buf, sizeof(buf))) 223 testresult = 0; 224 225 memcpy(ivb, &rc5_cbc_iv[n][0], 8); 226 RC5_32_cbc_encrypt(buf, buf2, 8, &key, &ivb[0], RC5_DECRYPT); 227 if (!TEST_mem_eq(&rc5_cbc_plain[n][0], sizeof(rc5_cbc_plain[0]), 228 buf2, sizeof(buf2))) 229 testresult = 0; 230 } 231 232 return testresult; 233 } 234 #endif 235 236 int setup_tests(void) 237 { 238 #ifndef OPENSSL_NO_RC5 239 ADD_ALL_TESTS(test_rc5_ecb, OSSL_NELEM(RC5key)); 240 ADD_ALL_TESTS(test_rc5_cbc, RC5_CBC_NUM); 241 #endif 242 return 1; 243 } 244