mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-15 05:47:56 -07:00
a48e284317
There were some fixes back on March 13th, 2014 for fixing compiling on MIPS64. Also some fixes on June 25th, 2014 for SPARC64 fixes. Probably more things, but those are what I care about.
209 lines
4.7 KiB
C
209 lines
4.7 KiB
C
/*
|
|
* An implementation of the ARCFOUR algorithm
|
|
*
|
|
* Copyright (C) 2006-2014, Brainspark B.V.
|
|
*
|
|
* This file is part of PolarSSL (http://www.polarssl.org)
|
|
* Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
/*
|
|
* The ARCFOUR algorithm was publicly disclosed on 94/09.
|
|
*
|
|
* http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0
|
|
*/
|
|
|
|
#if !defined(POLARSSL_CONFIG_FILE)
|
|
#include "polarssl/config.h"
|
|
#else
|
|
#include POLARSSL_CONFIG_FILE
|
|
#endif
|
|
|
|
#if defined(POLARSSL_ARC4_C)
|
|
|
|
#include "polarssl/arc4.h"
|
|
|
|
#if defined(POLARSSL_PLATFORM_C)
|
|
#include "polarssl/platform.h"
|
|
#else
|
|
#define polarssl_printf printf
|
|
#endif
|
|
|
|
#if !defined(POLARSSL_ARC4_ALT)
|
|
|
|
/* Implementation that should never be optimized out by the compiler */
|
|
static void polarssl_zeroize( void *v, size_t n ) {
|
|
volatile unsigned char *p = v; while( n-- ) *p++ = 0;
|
|
}
|
|
|
|
void arc4_init( arc4_context *ctx )
|
|
{
|
|
memset( ctx, 0, sizeof( arc4_context ) );
|
|
}
|
|
|
|
void arc4_free( arc4_context *ctx )
|
|
{
|
|
if( ctx == NULL )
|
|
return;
|
|
|
|
polarssl_zeroize( ctx, sizeof( arc4_context ) );
|
|
}
|
|
|
|
/*
|
|
* ARC4 key schedule
|
|
*/
|
|
void arc4_setup( arc4_context *ctx, const unsigned char *key,
|
|
unsigned int keylen )
|
|
{
|
|
int i, j, a;
|
|
unsigned int k;
|
|
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
|
|
*/
|
|
int arc4_crypt( arc4_context *ctx, size_t length, const unsigned char *input,
|
|
unsigned char *output )
|
|
{
|
|
int x, y, a, b;
|
|
size_t i;
|
|
unsigned char *m;
|
|
|
|
x = ctx->x;
|
|
y = ctx->y;
|
|
m = ctx->m;
|
|
|
|
for( i = 0; i < length; 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;
|
|
|
|
output[i] = (unsigned char)
|
|
( input[i] ^ m[(unsigned char)( a + b )] );
|
|
}
|
|
|
|
ctx->x = x;
|
|
ctx->y = y;
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
#endif /* !POLARSSL_ARC4_ALT */
|
|
|
|
#if defined(POLARSSL_SELF_TEST)
|
|
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
/*
|
|
* ARC4 tests vectors as posted by Eric Rescorla in sep. 1994:
|
|
*
|
|
* http://groups.google.com/group/comp.security.misc/msg/10a300c9d21afca0
|
|
*/
|
|
static const unsigned char arc4_test_key[3][8] =
|
|
{
|
|
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
|
|
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
|
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
|
};
|
|
|
|
static const unsigned char arc4_test_pt[3][8] =
|
|
{
|
|
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
|
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
|
};
|
|
|
|
static const unsigned char arc4_test_ct[3][8] =
|
|
{
|
|
{ 0x75, 0xB7, 0x87, 0x80, 0x99, 0xE0, 0xC5, 0x96 },
|
|
{ 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 },
|
|
{ 0xDE, 0x18, 0x89, 0x41, 0xA3, 0x37, 0x5D, 0x3A }
|
|
};
|
|
|
|
/*
|
|
* Checkup routine
|
|
*/
|
|
int arc4_self_test( int verbose )
|
|
{
|
|
int i, ret = 0;
|
|
unsigned char ibuf[8];
|
|
unsigned char obuf[8];
|
|
arc4_context ctx;
|
|
|
|
arc4_init( &ctx );
|
|
|
|
for( i = 0; i < 3; i++ )
|
|
{
|
|
if( verbose != 0 )
|
|
polarssl_printf( " ARC4 test #%d: ", i + 1 );
|
|
|
|
memcpy( ibuf, arc4_test_pt[i], 8 );
|
|
|
|
arc4_setup( &ctx, arc4_test_key[i], 8 );
|
|
arc4_crypt( &ctx, 8, ibuf, obuf );
|
|
|
|
if( memcmp( obuf, arc4_test_ct[i], 8 ) != 0 )
|
|
{
|
|
if( verbose != 0 )
|
|
polarssl_printf( "failed\n" );
|
|
|
|
ret = 1;
|
|
goto exit;
|
|
}
|
|
|
|
if( verbose != 0 )
|
|
polarssl_printf( "passed\n" );
|
|
}
|
|
|
|
if( verbose != 0 )
|
|
polarssl_printf( "\n" );
|
|
|
|
exit:
|
|
arc4_free( &ctx );
|
|
|
|
return( ret );
|
|
}
|
|
|
|
#endif /* POLARSSL_SELF_TEST */
|
|
|
|
#endif /* POLARSSL_ARC4_C */
|