From 6e7971553e021a7fe72987490439bf9a5475fb44 Mon Sep 17 00:00:00 2001 From: Dave Chapman Date: Sat, 8 Sep 2007 23:27:49 +0000 Subject: Add functions to read and write the AUPD (flash update) image. "--read-aupd aupd.bin" will read (and decrypt) the AUPD image, and "--write-aupd aupd.bin" will write (and encrypt) an image. Also fix a bug in the "diskmove" function which corrupted the AUPD image when a bootloader was installed. So in order to manipulate the aupd image, you need to restore a clean firmware partition, and install the bootloader with this version of ipodpatcher. Decryption functions based on the description and sample code at http://ipodlinux.org/Flash_Decryption git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14644 a1c6a512-1295-4272-9138-f99709370657 --- rbutil/ipodpatcher/arc4.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 rbutil/ipodpatcher/arc4.c (limited to 'rbutil/ipodpatcher/arc4.c') diff --git a/rbutil/ipodpatcher/arc4.c b/rbutil/ipodpatcher/arc4.c new file mode 100644 index 0000000000..75b1862b89 --- /dev/null +++ b/rbutil/ipodpatcher/arc4.c @@ -0,0 +1,108 @@ +/* + * arc4.c + * Release $Name: MATRIXSSL_1_8_3_OPEN $ + * + * ARC4 stream cipher implementation + */ +/* + * Copyright (c) PeerSec Networks, 2002-2007. All Rights Reserved. + * The latest version of this code is available at http://www.matrixssl.org + * + * This software is open source; 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 General Public License does NOT permit incorporating this software + * into proprietary programs. If you are unable to comply with the GPL, a + * commercial license for this software may be purchased from PeerSec Networks + * at http://www.peersec.com + * + * This program is distributed in 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * http://www.gnu.org/copyleft/gpl.html + */ +/******************************************************************************/ + +#include "arc4.h" + +/* + Some accounts, such as O'Reilly's Secure Programming Cookbook say that no + more than 2^30 bytes should be processed without rekeying, so we + enforce that limit here. FYI, this is equal to 1GB of data transferred. +*/ +#define ARC4_MAX_BYTES 0x40000000 + +/******************************************************************************/ +/* + SSL_RSA_WITH_RC4_* cipher callbacks + */ +void matrixArc4Init(struct rc4_key_t *ctx, unsigned char *key, int32_t keylen) +{ + unsigned char index1, index2, tmp, *state; + int16_t counter; + + ctx->byteCount = 0; + state = &ctx->state[0]; + + for (counter = 0; counter < 256; counter++) { + state[counter] = (unsigned char)counter; + } + ctx->x = 0; + ctx->y = 0; + index1 = 0; + index2 = 0; + + for (counter = 0; counter < 256; counter++) { + index2 = (key[index1] + state[counter] + index2) & 0xff; + + tmp = state[counter]; + state[counter] = state[index2]; + state[index2] = tmp; + + index1 = (index1 + 1) % keylen; + } +} + +int32_t matrixArc4(struct rc4_key_t *ctx, unsigned char *in, + unsigned char *out, int32_t len) +{ + unsigned char x, y, *state, xorIndex, tmp; + int counter; /* NOTE BY DAVE CHAPMAN: This was a short in + the original code, which caused a segfault + when attempting to process data > 32767 + bytes. */ + + ctx->byteCount += len; + if (ctx->byteCount > ARC4_MAX_BYTES) { + return -1; + } + + x = ctx->x; + y = ctx->y; + state = &ctx->state[0]; + for (counter = 0; counter < len; counter++) { + x = (x + 1) & 0xff; + y = (state[x] + y) & 0xff; + + tmp = state[x]; + state[x] = state[y]; + state[y] = tmp; + + xorIndex = (state[x] + state[y]) & 0xff; + + tmp = in[counter]; + tmp ^= state[xorIndex]; + out[counter] = tmp; + } + ctx->x = x; + ctx->y = y; + return len; +} + +/*****************************************************************************/ -- cgit v1.2.3