]> git.sur5r.net Git - freertos/blob - FreeRTOS-Labs/Source/mbedtls/library/arc4.c
Add the Labs projects provided in the V10.2.1_191129 zip file.
[freertos] / FreeRTOS-Labs / Source / mbedtls / library / arc4.c
1 /*\r
2  *  An implementation of the ARCFOUR algorithm\r
3  *\r
4  *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\r
5  *  SPDX-License-Identifier: Apache-2.0\r
6  *\r
7  *  Licensed under the Apache License, Version 2.0 (the "License"); you may\r
8  *  not use this file except in compliance with the License.\r
9  *  You may obtain a copy of the License at\r
10  *\r
11  *  http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  *  Unless required by applicable law or agreed to in writing, software\r
14  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\r
15  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  *  See the License for the specific language governing permissions and\r
17  *  limitations under the License.\r
18  *\r
19  *  This file is part of mbed TLS (https://tls.mbed.org)\r
20  */\r
21 /*\r
22  *  The ARCFOUR algorithm was publicly disclosed on 94/09.\r
23  *\r
24  *  http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0\r
25  */\r
26 \r
27 #if !defined(MBEDTLS_CONFIG_FILE)\r
28 #include "mbedtls/config.h"\r
29 #else\r
30 #include MBEDTLS_CONFIG_FILE\r
31 #endif\r
32 \r
33 #if defined(MBEDTLS_ARC4_C)\r
34 \r
35 #include "mbedtls/arc4.h"\r
36 #include "mbedtls/platform_util.h"\r
37 \r
38 #include <string.h>\r
39 \r
40 #if defined(MBEDTLS_SELF_TEST)\r
41 #if defined(MBEDTLS_PLATFORM_C)\r
42 #include "mbedtls/platform.h"\r
43 #else\r
44 #include <stdio.h>\r
45 #define mbedtls_printf printf\r
46 #endif /* MBEDTLS_PLATFORM_C */\r
47 #endif /* MBEDTLS_SELF_TEST */\r
48 \r
49 #if !defined(MBEDTLS_ARC4_ALT)\r
50 \r
51 void mbedtls_arc4_init( mbedtls_arc4_context *ctx )\r
52 {\r
53     memset( ctx, 0, sizeof( mbedtls_arc4_context ) );\r
54 }\r
55 \r
56 void mbedtls_arc4_free( mbedtls_arc4_context *ctx )\r
57 {\r
58     if( ctx == NULL )\r
59         return;\r
60 \r
61     mbedtls_platform_zeroize( ctx, sizeof( mbedtls_arc4_context ) );\r
62 }\r
63 \r
64 /*\r
65  * ARC4 key schedule\r
66  */\r
67 void mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key,\r
68                  unsigned int keylen )\r
69 {\r
70     int i, j, a;\r
71     unsigned int k;\r
72     unsigned char *m;\r
73 \r
74     ctx->x = 0;\r
75     ctx->y = 0;\r
76     m = ctx->m;\r
77 \r
78     for( i = 0; i < 256; i++ )\r
79         m[i] = (unsigned char) i;\r
80 \r
81     j = k = 0;\r
82 \r
83     for( i = 0; i < 256; i++, k++ )\r
84     {\r
85         if( k >= keylen ) k = 0;\r
86 \r
87         a = m[i];\r
88         j = ( j + a + key[k] ) & 0xFF;\r
89         m[i] = m[j];\r
90         m[j] = (unsigned char) a;\r
91     }\r
92 }\r
93 \r
94 /*\r
95  * ARC4 cipher function\r
96  */\r
97 int mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input,\r
98                 unsigned char *output )\r
99 {\r
100     int x, y, a, b;\r
101     size_t i;\r
102     unsigned char *m;\r
103 \r
104     x = ctx->x;\r
105     y = ctx->y;\r
106     m = ctx->m;\r
107 \r
108     for( i = 0; i < length; i++ )\r
109     {\r
110         x = ( x + 1 ) & 0xFF; a = m[x];\r
111         y = ( y + a ) & 0xFF; b = m[y];\r
112 \r
113         m[x] = (unsigned char) b;\r
114         m[y] = (unsigned char) a;\r
115 \r
116         output[i] = (unsigned char)\r
117             ( input[i] ^ m[(unsigned char)( a + b )] );\r
118     }\r
119 \r
120     ctx->x = x;\r
121     ctx->y = y;\r
122 \r
123     return( 0 );\r
124 }\r
125 \r
126 #endif /* !MBEDTLS_ARC4_ALT */\r
127 \r
128 #if defined(MBEDTLS_SELF_TEST)\r
129 /*\r
130  * ARC4 tests vectors as posted by Eric Rescorla in sep. 1994:\r
131  *\r
132  * http://groups.google.com/group/comp.security.misc/msg/10a300c9d21afca0\r
133  */\r
134 static const unsigned char arc4_test_key[3][8] =\r
135 {\r
136     { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },\r
137     { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },\r
138     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\r
139 };\r
140 \r
141 static const unsigned char arc4_test_pt[3][8] =\r
142 {\r
143     { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },\r
144     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },\r
145     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\r
146 };\r
147 \r
148 static const unsigned char arc4_test_ct[3][8] =\r
149 {\r
150     { 0x75, 0xB7, 0x87, 0x80, 0x99, 0xE0, 0xC5, 0x96 },\r
151     { 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 },\r
152     { 0xDE, 0x18, 0x89, 0x41, 0xA3, 0x37, 0x5D, 0x3A }\r
153 };\r
154 \r
155 /*\r
156  * Checkup routine\r
157  */\r
158 int mbedtls_arc4_self_test( int verbose )\r
159 {\r
160     int i, ret = 0;\r
161     unsigned char ibuf[8];\r
162     unsigned char obuf[8];\r
163     mbedtls_arc4_context ctx;\r
164 \r
165     mbedtls_arc4_init( &ctx );\r
166 \r
167     for( i = 0; i < 3; i++ )\r
168     {\r
169         if( verbose != 0 )\r
170             mbedtls_printf( "  ARC4 test #%d: ", i + 1 );\r
171 \r
172         memcpy( ibuf, arc4_test_pt[i], 8 );\r
173 \r
174         mbedtls_arc4_setup( &ctx, arc4_test_key[i], 8 );\r
175         mbedtls_arc4_crypt( &ctx, 8, ibuf, obuf );\r
176 \r
177         if( memcmp( obuf, arc4_test_ct[i], 8 ) != 0 )\r
178         {\r
179             if( verbose != 0 )\r
180                 mbedtls_printf( "failed\n" );\r
181 \r
182             ret = 1;\r
183             goto exit;\r
184         }\r
185 \r
186         if( verbose != 0 )\r
187             mbedtls_printf( "passed\n" );\r
188     }\r
189 \r
190     if( verbose != 0 )\r
191         mbedtls_printf( "\n" );\r
192 \r
193 exit:\r
194     mbedtls_arc4_free( &ctx );\r
195 \r
196     return( ret );\r
197 }\r
198 \r
199 #endif /* MBEDTLS_SELF_TEST */\r
200 \r
201 #endif /* MBEDTLS_ARC4_C */\r