xref: /AOO41X/main/sal/workben/t_cipher.c (revision 647f063d49501903f1667b75f5634541fc603283)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #include <sal/types.h>
24 #include <osl/diagnose.h>
25 #include <rtl/cipher.h>
26 
27 #include <stdio.h>
28 #include <string.h>
29 
30 #define NUM_VARIABLE_KEY_TESTS  34
31 #define NUM_SET_KEY_TESTS       24
32 
33 /* plaintext bytes -- left halves */
34 unsigned long plaintext_l[NUM_VARIABLE_KEY_TESTS + NUM_SET_KEY_TESTS] = {
35    0x00000000l, 0xFFFFFFFFl, 0x10000000l, 0x11111111l, 0x11111111l,
36    0x01234567l, 0x00000000l, 0x01234567l, 0x01A1D6D0l, 0x5CD54CA8l,
37    0x0248D438l, 0x51454B58l, 0x42FD4430l, 0x059B5E08l, 0x0756D8E0l,
38    0x762514B8l, 0x3BDD1190l, 0x26955F68l, 0x164D5E40l, 0x6B056E18l,
39    0x004BD6EFl, 0x480D3900l, 0x437540C8l, 0x072D43A0l, 0x02FE5577l,
40    0x1D9D5C50l, 0x30553228l, 0x01234567l, 0x01234567l, 0x01234567l,
41    0xFFFFFFFFl, 0x00000000l, 0x00000000l, 0xFFFFFFFFl, 0xFEDCBA98l,
42    0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l,
43    0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l,
44    0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l,
45    0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l,
46    0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l };
47 
48 /* plaintext bytes -- right halves */
49 unsigned long plaintext_r[NUM_VARIABLE_KEY_TESTS + NUM_SET_KEY_TESTS] = {
50    0x00000000l, 0xFFFFFFFFl, 0x00000001l, 0x11111111l, 0x11111111l,
51    0x89ABCDEFl, 0x00000000l, 0x89ABCDEFl, 0x39776742l, 0x3DEF57DAl,
52    0x06F67172l, 0x2DDF440Al, 0x59577FA2l, 0x51CF143Al, 0x774761D2l,
53    0x29BF486Al, 0x49372802l, 0x35AF609Al, 0x4F275232l, 0x759F5CCAl,
54    0x09176062l, 0x6EE762F2l, 0x698F3CFAl, 0x77075292l, 0x8117F12Al,
55    0x18F728C2l, 0x6D6F295Al, 0x89ABCDEFl, 0x89ABCDEFl, 0x89ABCDEFl,
56    0xFFFFFFFFl, 0x00000000l, 0x00000000l, 0xFFFFFFFFl, 0x76543210l,
57    0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l,
58    0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l,
59    0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l,
60    0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l,
61    0x76543210l, 0x76543210l, 0x76543210l };
62 
63 /* key bytes for variable key tests */
64 unsigned char variable_key[NUM_VARIABLE_KEY_TESTS][8] = {
65    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
66    { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
67    { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
68    { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
69    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
70    { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
71    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
72    { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
73    { 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
74    { 0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E },
75    { 0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86 },
76    { 0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E },
77    { 0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6 },
78    { 0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE },
79    { 0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6 },
80    { 0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE },
81    { 0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16 },
82    { 0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F },
83    { 0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46 },
84    { 0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E },
85    { 0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76 },
86    { 0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07 },
87    { 0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F },
88    { 0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7 },
89    { 0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF },
90    { 0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6 },
91    { 0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF },
92    { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
93    { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
94    { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
95    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
96    { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
97    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
98    { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }};
99 
100 /* key bytes for set key tests */
101 unsigned char set_key[24] = {
102    0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
103    0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
104    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
105 
106 /* ciphertext bytes -- left halves */
107 unsigned long ciphertext_l[NUM_VARIABLE_KEY_TESTS + NUM_SET_KEY_TESTS] = {
108    0x4EF99745l, 0x51866FD5l, 0x7D856F9Al, 0x2466DD87l, 0x61F9C380l,
109    0x7D0CC630l, 0x4EF99745l, 0x0ACEAB0Fl, 0x59C68245l, 0xB1B8CC0Bl,
110    0x1730E577l, 0xA25E7856l, 0x353882B1l, 0x48F4D088l, 0x432193B7l,
111    0x13F04154l, 0x2EEDDA93l, 0xD887E039l, 0x5F99D04Fl, 0x4A057A3Bl,
112    0x452031C1l, 0x7555AE39l, 0x53C55F9Cl, 0x7A8E7BFAl, 0xCF9C5D7Al,
113    0xD1ABB290l, 0x55CB3774l, 0xFA34EC48l, 0xA7907951l, 0xC39E072Dl,
114    0x014933E0l, 0xF21E9A77l, 0x24594688l, 0x6B5C5A9Cl, 0xF9AD597Cl,
115    0xE91D21C1l, 0xE9C2B70Al, 0xBE1E6394l, 0xB39E4448l, 0x9457AA83l,
116    0x8BB77032l, 0xE87A244El, 0x15750E7Al, 0x122BA70Bl, 0x3A833C9Al,
117    0x9409DA87l, 0x884F8062l, 0x1F85031Cl, 0x79D9373Al, 0x93142887l,
118    0x03429E83l, 0xA4299E27l, 0xAFD5AED1l, 0x10851C0El, 0xE6F51ED7l,
119    0x64A6E14Al, 0x80C7D7D4l, 0x05044B62l };
120 
121 /* ciphertext bytes -- right halves */
122 unsigned long ciphertext_r[NUM_VARIABLE_KEY_TESTS + NUM_SET_KEY_TESTS] = {
123    0x6198DD78l, 0xB85ECB8Al, 0x613063F2l, 0x8B963C9Dl, 0x2281B096l,
124    0xAFDA1EC7l, 0x6198DD78l, 0xC6A0A28Dl, 0xEB05282Bl, 0x250F09A0l,
125    0x8BEA1DA4l, 0xCF2651EBl, 0x09CE8F1Al, 0x4C379918l, 0x8951FC98l,
126    0xD69D1AE5l, 0xFFD39C79l, 0x3C2DA6E3l, 0x5B163969l, 0x24D3977Bl,
127    0xE4FADA8El, 0xF59B87BDl, 0xB49FC019l, 0x937E89A3l, 0x4986ADB5l,
128    0x658BC778l, 0xD13EF201l, 0x47B268B2l, 0x08EA3CAEl, 0x9FAC631Dl,
129    0xCDAFF6E4l, 0xB71C49BCl, 0x5754369Al, 0x5D9E0A5Al, 0x49DB005El,
130    0xD961A6D6l, 0x1BC65CF3l, 0x08640F05l, 0x1BDB1E6El, 0xB1928C0Dl,
131    0xF960629Dl, 0x2CC85E82l, 0x4F4EC577l, 0x3AB64AE0l, 0xFFC537F6l,
132    0xA90F6BF2l, 0x5060B8B4l, 0x19E11968l, 0x714CA34Fl, 0xEE3BE15Cl,
133    0x8CE2D14Bl, 0x469FF67Bl, 0xC1BC96A8l, 0x3858DA9Fl, 0x9B9DB21Fl,
134    0xFD36B46Fl, 0x5A5479ADl, 0xFA52D080l };
135 
136 
137 static sal_uInt8 cbc_key[16] =
138 {
139     0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
140     0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87
141 };
142 static sal_uInt8 cbc_iv[8] =
143 {
144     0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
145 };
146 
147 static sal_Char cbc_data[40] = "7654321 Now is the time for ";
148 
149 static sal_uInt8 ecb_ok[32] =
150 {
151     0x2A, 0xFD, 0x7D, 0xAA, 0x60, 0x62, 0x6B, 0xA3,
152     0x86, 0x16, 0x46, 0x8C, 0xC2, 0x9C, 0xF6, 0xE1,
153     0x29, 0x1E, 0x81, 0x7C, 0xC7, 0x40, 0x98, 0x2D,
154     0x6F, 0x87, 0xAC, 0x5F, 0x17, 0x1A, 0xAB, 0xEA
155 };
156 static sal_uInt8 cbc_ok[32] =
157 {
158     0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
159     0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
160     0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
161     0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC
162 };
163 static sal_uInt8 cfb_ok[] =
164 {
165     0xE7, 0x32, 0x14, 0xA2, 0x82, 0x21, 0x39, 0xCA,
166     0xF2, 0x6E, 0xCF, 0x6D, 0x2E, 0xB9, 0xE7, 0x6E,
167     0x3D, 0xA3, 0xDE, 0x04, 0xD1, 0x51, 0x72, 0x00,
168     0x51, 0x9D, 0x57, 0xA6, 0xC3
169 };
170 
171 static sal_uInt8 arcfour_key[6][30] =
172 {
173     { 8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
174     { 8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
175     { 8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
176     { 4, 0xef, 0x01, 0x23, 0x45 },
177     { 8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
178     { 4, 0xef, 0x01, 0x23, 0x45 }
179 };
180 static sal_uInt8 arcfour_data_len[6] =
181 {
182     8, 8, 8, 20, 28, 10
183 };
184 static sal_uInt8 arcfour_data[6][30] =
185 {
186     { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xff },
187     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff },
188     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff },
189     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191       0x00, 0x00, 0x00, 0x00, 0xff },
192     { 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
193       0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
194       0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
195       0x12, 0x34, 0x56, 0x78, 0xff },
196     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197       0x00, 0x00, 0xff }
198 };
199 static sal_uInt8 arcfour_ok[6][30] =
200 {
201     { 0x75, 0xb7, 0x87, 0x80, 0x99, 0xe0, 0xc5, 0x96, 0x00},
202     { 0x74, 0x94, 0xc2, 0xe7, 0x10, 0x4b, 0x08, 0x79, 0x00},
203     { 0xde, 0x18, 0x89, 0x41, 0xa3, 0x37, 0x5d, 0x3a, 0x00},
204     { 0xd6, 0xa1, 0x41, 0xa7, 0xec, 0x3c, 0x38, 0xdf,
205       0xbd, 0x61, 0x5a, 0x11, 0x62, 0xe1, 0xc7, 0xba,
206       0x36, 0xb6, 0x78, 0x58, 0x00 },
207     { 0x66, 0xa0, 0x94, 0x9f, 0x8a, 0xf7, 0xd6, 0x89,
208       0x1f, 0x7f, 0x83, 0x2b, 0xa8, 0x33, 0xc0, 0x0c,
209       0x89, 0x2e, 0xbe, 0x30, 0x14, 0x3c, 0xe2, 0x87,
210       0x40, 0x01, 0x1e, 0xcf, 0x00 },
211     { 0xd6, 0xa1, 0x41, 0xa7, 0xec, 0x3c, 0x38, 0xdf,
212       0xbd, 0x61, 0x00}
213 };
214 
main(int argc,char * argv)215 int SAL_CALL main (int argc, char *argv)
216 {
217     rtlCipher cipher;
218 
219     /* ECB */
220     cipher = rtl_cipher_create (rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeECB);
221     OSL_ASSERT(cipher != 0);
222     if (cipher != 0)
223     {
224         rtlCipherError result;
225         sal_uInt8      ecb_in[40], ecb_out[40];
226         sal_uInt32     length = strlen(cbc_data) + 1;
227 
228         result = rtl_cipher_init (
229             cipher, rtl_Cipher_DirectionBoth,
230             cbc_key, sizeof(cbc_key), NULL, 0);
231         OSL_ASSERT(result == rtl_Cipher_E_None);
232 
233         memset (ecb_out, 0, sizeof(ecb_out));
234         result = rtl_cipher_encode (
235             cipher, cbc_data, length, ecb_out, sizeof(ecb_out));
236         OSL_ASSERT(result == rtl_Cipher_E_None);
237         OSL_ASSERT(memcmp (ecb_out, ecb_ok, sizeof(ecb_ok)) == 0);
238 
239         memset (ecb_in,  0, sizeof(ecb_in));
240         result = rtl_cipher_decode (
241             cipher, ecb_out, length, ecb_in, sizeof(ecb_in));
242         OSL_ASSERT(result == rtl_Cipher_E_None);
243         OSL_ASSERT(memcmp (ecb_in, cbc_data, length) == 0);
244 
245         rtl_cipher_destroy (cipher);
246     }
247 
248     /* CBC */
249     cipher = rtl_cipher_create (rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeCBC);
250     OSL_ASSERT(cipher != 0);
251     if (cipher != 0)
252     {
253         rtlCipherError result;
254         sal_uInt8      cbc_in[40], cbc_out[40];
255         sal_uInt32     length = strlen(cbc_data) + 1;
256 
257         result = rtl_cipher_init (
258             cipher, rtl_Cipher_DirectionEncode,
259             cbc_key, sizeof(cbc_key), cbc_iv, sizeof(cbc_iv));
260         OSL_ASSERT(result == rtl_Cipher_E_None);
261 
262         memset (cbc_out, 0, sizeof(cbc_out));
263         result = rtl_cipher_encode (
264             cipher, cbc_data, length, cbc_out, sizeof(cbc_out));
265         OSL_ASSERT(result == rtl_Cipher_E_None);
266         OSL_ASSERT(memcmp (cbc_out, cbc_ok, sizeof(cbc_ok)) == 0);
267 
268         result = rtl_cipher_init (
269             cipher, rtl_Cipher_DirectionDecode,
270             cbc_key, sizeof(cbc_key), cbc_iv, sizeof(cbc_iv));
271         OSL_ASSERT(result == rtl_Cipher_E_None);
272 
273         memset (cbc_in,  0, sizeof(cbc_in));
274         result = rtl_cipher_decode (
275             cipher, cbc_out, length, cbc_in, sizeof(cbc_in));
276         OSL_ASSERT(result == rtl_Cipher_E_None);
277         OSL_ASSERT(memcmp (cbc_in, cbc_data, length) == 0);
278 
279         rtl_cipher_destroy (cipher);
280     }
281 
282     /* CFB */
283     cipher = rtl_cipher_create (rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeStream);
284     OSL_ASSERT(cipher != 0);
285     if (cipher != 0)
286     {
287         rtlCipherError result;
288         sal_uInt8      cfb_in[40], cfb_out[40];
289         sal_uInt32     length = strlen(cbc_data) + 1;
290 
291         result = rtl_cipher_init (
292             cipher, rtl_Cipher_DirectionEncode,
293             cbc_key, sizeof(cbc_key), cbc_iv, sizeof(cbc_iv));
294         OSL_ASSERT(result == rtl_Cipher_E_None);
295 
296         memset (cfb_out, 0, sizeof(cfb_out));
297         result = rtl_cipher_encode (
298             cipher, cbc_data, length, cfb_out, sizeof(cfb_out));
299         OSL_ASSERT(result == rtl_Cipher_E_None);
300         OSL_ASSERT(memcmp (cfb_out, cfb_ok, sizeof(cfb_ok)) == 0);
301 
302         result = rtl_cipher_init (
303             cipher, rtl_Cipher_DirectionDecode,
304             cbc_key, sizeof(cbc_key), cbc_iv, sizeof(cbc_iv));
305         OSL_ASSERT(result == rtl_Cipher_E_None);
306 
307         memset (cfb_in,  0, sizeof(cfb_in));
308         result = rtl_cipher_decode (
309             cipher, cfb_out, length, cfb_in, sizeof(cfb_in));
310         OSL_ASSERT(result == rtl_Cipher_E_None);
311         OSL_ASSERT(memcmp (cfb_in, cbc_data, length) == 0);
312 
313         rtl_cipher_destroy (cipher);
314     }
315 
316     /* ARCFOUR */
317     cipher = rtl_cipher_create (rtl_Cipher_AlgorithmARCFOUR, rtl_Cipher_ModeStream);
318     OSL_ASSERT(cipher != 0);
319     if (cipher != 0)
320     {
321         rtlCipherError result;
322         sal_uInt8      arcfour_out[40];
323         sal_Size       length;
324         int            i, n;
325 
326         n = sizeof(arcfour_data_len) / sizeof(arcfour_data_len[0]);
327         for (i = 0; i < n; i++)
328         {
329             length = arcfour_data_len[i];
330 
331             result = rtl_cipher_init (
332                 cipher, rtl_Cipher_DirectionBoth,
333                 &(arcfour_key[i][1]), arcfour_key[i][0], 0, 0);
334             OSL_ASSERT(result == rtl_Cipher_E_None);
335 
336             memset (arcfour_out, 0, sizeof(arcfour_out));
337             result = rtl_cipher_encode (
338                 cipher, &(arcfour_data[i][0]), length,
339                 arcfour_out, sizeof(arcfour_out));
340             OSL_ASSERT(result == rtl_Cipher_E_None);
341             OSL_ASSERT(memcmp (arcfour_out, arcfour_ok[i], length) == 0);
342         }
343 
344         n = arcfour_data_len[3];
345         for (i = 1; i < n; i++)
346         {
347             length = i;
348 
349             result = rtl_cipher_init (
350                 cipher, rtl_Cipher_DirectionBoth,
351                 &(arcfour_key[3][1]), arcfour_key[3][0], 0, 0);
352             OSL_ASSERT(result == rtl_Cipher_E_None);
353 
354             memset (arcfour_out, 0, sizeof(arcfour_out));
355             result = rtl_cipher_encode (
356                 cipher, &(arcfour_data[3][0]), length,
357                 arcfour_out, sizeof(arcfour_out));
358             OSL_ASSERT(result == rtl_Cipher_E_None);
359             OSL_ASSERT(memcmp (arcfour_out, arcfour_ok[3], length) == 0);
360             OSL_ASSERT(arcfour_out[length] == 0);
361         }
362 
363         n = arcfour_data_len[3];
364         for (i = 1; i < n; i++)
365         {
366             length = i;
367 
368             result = rtl_cipher_init (
369                 cipher, rtl_Cipher_DirectionBoth,
370                 &(arcfour_key[3][1]), arcfour_key[3][0], 0, 0);
371             OSL_ASSERT(result == rtl_Cipher_E_None);
372 
373             memset (arcfour_out, 0, sizeof(arcfour_out));
374             result = rtl_cipher_encode (
375                 cipher, &(arcfour_data[3][0]), length,
376                 &(arcfour_out[0]), sizeof(arcfour_out));
377             OSL_ASSERT(result == rtl_Cipher_E_None);
378 
379             result = rtl_cipher_encode (
380                 cipher, &(arcfour_data[3][length]), n - length,
381                 &(arcfour_out[length]), sizeof(arcfour_out) - length);
382             OSL_ASSERT(result == rtl_Cipher_E_None);
383 
384             OSL_ASSERT(memcmp (arcfour_out, arcfour_ok[3], length) == 0);
385         }
386 
387         rtl_cipher_destroy (cipher);
388     }
389 
390     /* Done */
391     return 0;
392 }
393