/* * An implementation of the ARCFOUR algorithm * * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine * * Copyright (C) 2009 Paul Bakker * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of PolarSSL or XySSL nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * The ARCFOUR algorithm was publicly disclosed on 94/09. * * http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0 */ #include "netif/ppp/ppp_opts.h" #if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_ARC4 #include "netif/ppp/polarssl/arc4.h" /* * ARC4 key schedule */ void arc4_setup( arc4_context *ctx, unsigned char *key, int keylen ) { int i, j, k, a; unsigned char *m; ctx->x = 0; ctx->y = 0; m = ctx->m; for( i = 0; i < 256; i++ ) m[i] = (unsigned char) i; j = k = 0; for( i = 0; i < 256; i++, k++ ) { if( k >= keylen ) k = 0; a = m[i]; j = ( j + a + key[k] ) & 0xFF; m[i] = m[j]; m[j] = (unsigned char) a; } } /* * ARC4 cipher function */ void arc4_crypt( arc4_context *ctx, unsigned char *buf, int buflen ) { int i, x, y, a, b; unsigned char *m; x = ctx->x; y = ctx->y; m = ctx->m; for( i = 0; i < buflen; i++ ) { x = ( x + 1 ) & 0xFF; a = m[x]; y = ( y + a ) & 0xFF; b = m[y]; m[x] = (unsigned char) b; m[y] = (unsigned char) a; buf[i] = (unsigned char) ( buf[i] ^ m[(unsigned char)( a + b )] ); } ctx->x = x; ctx->y = y; } #endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_DES */