2 * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
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
13 #include "test_main.h"
16 #ifndef OPENSSL_NO_RC5
17 # include <openssl/rc5.h>
19 static unsigned char RC5key[5][16] = {
20 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
22 {0x91, 0x5f, 0x46, 0x19, 0xbe, 0x41, 0xb2, 0x51,
23 0x63, 0x55, 0xa5, 0x01, 0x10, 0xa9, 0xce, 0x91},
24 {0x78, 0x33, 0x48, 0xe7, 0x5a, 0xeb, 0x0f, 0x2f,
25 0xd7, 0xb1, 0x69, 0xbb, 0x8d, 0xc1, 0x67, 0x87},
26 {0xdc, 0x49, 0xdb, 0x13, 0x75, 0xa5, 0x58, 0x4f,
27 0x64, 0x85, 0xb4, 0x13, 0xb5, 0xf1, 0x2b, 0xaf},
28 {0x52, 0x69, 0xf1, 0x49, 0xd4, 0x1b, 0xa0, 0x15,
29 0x24, 0x97, 0x57, 0x4d, 0x7f, 0x15, 0x31, 0x25},
32 static unsigned char RC5plain[5][8] = {
33 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
34 {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D},
35 {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52},
36 {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92},
37 {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC},
40 static unsigned char RC5cipher[5][8] = {
41 {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D},
42 {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52},
43 {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92},
44 {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC},
45 {0xEB, 0x44, 0xE4, 0x15, 0xDA, 0x31, 0x98, 0x24},
48 # define RC5_CBC_NUM 27
49 static unsigned char rc5_cbc_cipher[RC5_CBC_NUM][8] = {
50 {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1e},
51 {0x79, 0x7b, 0xba, 0x4d, 0x78, 0x11, 0x1d, 0x1e},
52 {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f},
53 {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f},
54 {0x8b, 0x9d, 0xed, 0x91, 0xce, 0x77, 0x94, 0xa6},
55 {0x2f, 0x75, 0x9f, 0xe7, 0xad, 0x86, 0xa3, 0x78},
56 {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88},
57 {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88},
58 {0xdc, 0xfe, 0x09, 0x85, 0x77, 0xec, 0xa5, 0xff},
59 {0x96, 0x46, 0xfb, 0x77, 0x63, 0x8f, 0x9c, 0xa8},
60 {0xb2, 0xb3, 0x20, 0x9d, 0xb6, 0x59, 0x4d, 0xa4},
61 {0x54, 0x5f, 0x7f, 0x32, 0xa5, 0xfc, 0x38, 0x36},
62 {0x82, 0x85, 0xe7, 0xc1, 0xb5, 0xbc, 0x74, 0x02},
63 {0xfc, 0x58, 0x6f, 0x92, 0xf7, 0x08, 0x09, 0x34},
64 {0xcf, 0x27, 0x0e, 0xf9, 0x71, 0x7f, 0xf7, 0xc4},
65 {0xe4, 0x93, 0xf1, 0xc1, 0xbb, 0x4d, 0x6e, 0x8c},
66 {0x5c, 0x4c, 0x04, 0x1e, 0x0f, 0x21, 0x7a, 0xc3},
67 {0x92, 0x1f, 0x12, 0x48, 0x53, 0x73, 0xb4, 0xf7},
68 {0x5b, 0xa0, 0xca, 0x6b, 0xbe, 0x7f, 0x5f, 0xad},
69 {0xc5, 0x33, 0x77, 0x1c, 0xd0, 0x11, 0x0e, 0x63},
70 {0x29, 0x4d, 0xdb, 0x46, 0xb3, 0x27, 0x8d, 0x60},
71 {0xda, 0xd6, 0xbd, 0xa9, 0xdf, 0xe8, 0xf7, 0xe8},
72 {0x97, 0xe0, 0x78, 0x78, 0x37, 0xed, 0x31, 0x7f},
73 {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78},
74 {0x8f, 0x34, 0xc3, 0xc6, 0x81, 0xc9, 0x96, 0x95},
75 {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11},
76 {0x7f, 0xd1, 0xa0, 0x23, 0xa5, 0xbb, 0xa2, 0x17},
79 static unsigned char rc5_cbc_key[RC5_CBC_NUM][17] = {
87 {4, 0x00, 0x00, 0x00, 0x00},
92 {4, 0x01, 0x02, 0x03, 0x04},
93 {4, 0x01, 0x02, 0x03, 0x04},
94 {4, 0x01, 0x02, 0x03, 0x04},
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 {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
99 {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
100 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
101 {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
102 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
103 {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
104 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
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 {5, 0x01, 0x02, 0x03, 0x04, 0x05},
112 static unsigned char rc5_cbc_plain[RC5_CBC_NUM][8] = {
113 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
114 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
115 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
116 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
117 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
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 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
122 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
123 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
124 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
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 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
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 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
135 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
136 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
137 {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08},
138 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
139 {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x01},
142 static int rc5_cbc_rounds[RC5_CBC_NUM] = {
143 0, 0, 0, 0, 0, 1, 2, 2,
144 8, 8, 12, 16, 8, 12, 16, 12,
145 8, 12, 16, 8, 12, 16, 12, 8,
149 static unsigned char rc5_cbc_iv[RC5_CBC_NUM][8] = {
150 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
151 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
152 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
153 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
154 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
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 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
159 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
160 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
161 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
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 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
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 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
172 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
173 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
174 {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78},
175 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
176 {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11},
179 static int test_rc5_ecb(int n)
183 unsigned char buf[8], buf2[8];
185 RC5_32_set_key(&key, 16, &RC5key[n][0], 12);
187 RC5_32_ecb_encrypt(&RC5plain[n][0], buf, &key, RC5_ENCRYPT);
188 if (!TEST_mem_eq(&RC5cipher[n][0], sizeof(RC5cipher[0]), buf, sizeof(buf)))
191 RC5_32_ecb_encrypt(buf, buf2, &key, RC5_DECRYPT);
192 if (!TEST_mem_eq(&RC5plain[n][0], sizeof(RC5cipher[0]), buf2, sizeof(buf2)))
198 static int test_rc5_cbc(int n)
203 unsigned char buf[8], buf2[8], ivb[8];
205 i = rc5_cbc_rounds[n];
207 RC5_32_set_key(&key, rc5_cbc_key[n][0], &rc5_cbc_key[n][1], i);
209 memcpy(ivb, &rc5_cbc_iv[n][0], 8);
210 RC5_32_cbc_encrypt(&rc5_cbc_plain[n][0], buf, 8,
211 &key, &ivb[0], RC5_ENCRYPT);
213 if (!TEST_mem_eq(&rc5_cbc_cipher[n][0], sizeof(rc5_cbc_cipher[0]),
217 memcpy(ivb, &rc5_cbc_iv[n][0], 8);
218 RC5_32_cbc_encrypt(buf, buf2, 8, &key, &ivb[0], RC5_DECRYPT);
219 if (!TEST_mem_eq(&rc5_cbc_plain[n][0], sizeof(rc5_cbc_plain[0]),
220 buf2, sizeof(buf2)) != 0)
228 void register_tests(void)
230 #ifndef OPENSSL_NO_RC5
231 ADD_ALL_TESTS(test_rc5_ecb, OSSL_NELEM(RC5key));
232 ADD_ALL_TESTS(test_rc5_cbc, RC5_CBC_NUM);