2 * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
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
12 #include "internal/nelem.h"
15 #ifndef OPENSSL_NO_RC5
16 # include <openssl/rc5.h>
18 static 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},
31 static 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},
39 static 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},
47 # define RC5_CBC_NUM 27
48 static 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},
78 static unsigned char rc5_cbc_key[RC5_CBC_NUM][17] = {
86 {4, 0x00, 0x00, 0x00, 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},
111 static 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},
141 static 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,
148 static 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},
178 static int test_rc5_ecb(int n)
182 unsigned char buf[8], buf2[8];
184 if (!TEST_true(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 if (!TEST_true(RC5_32_set_key(&key, rc5_cbc_key[n][0],
208 &rc5_cbc_key[n][1], i)))
211 memcpy(ivb, &rc5_cbc_iv[n][0], 8);
212 RC5_32_cbc_encrypt(&rc5_cbc_plain[n][0], buf, 8,
213 &key, &ivb[0], RC5_ENCRYPT);
215 if (!TEST_mem_eq(&rc5_cbc_cipher[n][0], sizeof(rc5_cbc_cipher[0]),
219 memcpy(ivb, &rc5_cbc_iv[n][0], 8);
220 RC5_32_cbc_encrypt(buf, buf2, 8, &key, &ivb[0], RC5_DECRYPT);
221 if (!TEST_mem_eq(&rc5_cbc_plain[n][0], sizeof(rc5_cbc_plain[0]),
230 int setup_tests(void)
232 #ifndef OPENSSL_NO_RC5
233 ADD_ALL_TESTS(test_rc5_ecb, OSSL_NELEM(RC5key));
234 ADD_ALL_TESTS(test_rc5_cbc, RC5_CBC_NUM);