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