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