2 * Copyright 1995-2020 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
11 * RC5 low level APIs are deprecated for public use, but still ok for internal
14 #include "internal/deprecated.h"
18 #include "internal/nelem.h"
21 #ifndef OPENSSL_NO_RC5
22 # include <openssl/rc5.h>
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},
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},
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},
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},
84 static unsigned char rc5_cbc_key[RC5_CBC_NUM][17] = {
92 {4, 0x00, 0x00, 0x00, 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},
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},
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,
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},
184 static int test_rc5_ecb(int n)
188 unsigned char buf[8], buf2[8];
190 if (!TEST_true(RC5_32_set_key(&key, 16, &RC5key[n][0], 12)))
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)))
197 RC5_32_ecb_encrypt(buf, buf2, &key, RC5_DECRYPT);
198 if (!TEST_mem_eq(&RC5plain[n][0], sizeof(RC5cipher[0]), buf2, sizeof(buf2)))
204 static int test_rc5_cbc(int n)
209 unsigned char buf[8], buf2[8], ivb[8];
211 i = rc5_cbc_rounds[n];
213 if (!TEST_true(RC5_32_set_key(&key, rc5_cbc_key[n][0],
214 &rc5_cbc_key[n][1], i)))
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);
221 if (!TEST_mem_eq(&rc5_cbc_cipher[n][0], sizeof(rc5_cbc_cipher[0]),
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]),
236 int setup_tests(void)
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);