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