xref: /aoo42x/main/sal/workben/t_cipher.c (revision cdf0e10c)
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