+++ /dev/null
-console.o: console.c bootmii_ppc.h types.h printf.h video_low.h console.h \
- string.h malloc.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-video_low.h:
-
-console.h:
-
-string.h:
-
-malloc.h:
+++ /dev/null
-diskio.o: diskio.c bootmii_ppc.h types.h printf.h ipc.h mini_ipc.h \
- diskio.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-ipc.h:
-
-mini_ipc.h:
-
-diskio.h:
-
-string.h:
+++ /dev/null
-exception.o: exception.c bootmii_ppc.h types.h printf.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-string.h:
+++ /dev/null
-fat.o: fat.c fat.h ff.h types.h diskio.h
-
-fat.h:
-
-ff.h:
-
-types.h:
-
-diskio.h:
+++ /dev/null
-ff.o: ff.c ff.h types.h diskio.h string.h
-
-ff.h:
-
-types.h:
-
-diskio.h:
-
-string.h:
+++ /dev/null
-font.o: font.c
+++ /dev/null
-gecko.o: gecko.c bootmii_ppc.h types.h printf.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
+++ /dev/null
-input.o: input.c bootmii_ppc.h types.h printf.h input.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-input.h:
-
-string.h:
+++ /dev/null
-ipc.o: ipc.c bootmii_ppc.h types.h printf.h ipc.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-ipc.h:
-
-string.h:
+++ /dev/null
-main.o: main.c bootmii_ppc.h types.h printf.h string.h ipc.h mini_ipc.h \
- nandfs.h fat.h ff.h diskio.h malloc.h video_low.h input.h console.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-string.h:
-
-ipc.h:
-
-mini_ipc.h:
-
-nandfs.h:
-
-fat.h:
-
-ff.h:
-
-diskio.h:
-
-malloc.h:
-
-video_low.h:
-
-input.h:
-
-console.h:
+++ /dev/null
-malloc.o: malloc.c bootmii_ppc.h types.h printf.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-string.h:
+++ /dev/null
-mini_ipc.o: mini_ipc.c bootmii_ppc.h types.h printf.h ipc.h mini_ipc.h \
- string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-ipc.h:
-
-mini_ipc.h:
-
-string.h:
+++ /dev/null
-nandfs.o: nandfs.c bootmii_ppc.h types.h printf.h ipc.h mini_ipc.h \
- nandfs.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-ipc.h:
-
-mini_ipc.h:
-
-nandfs.h:
-
-string.h:
+++ /dev/null
-printf.o: printf.c types.h
-
-types.h:
+++ /dev/null
-string.o: string.c string.h types.h
-
-string.h:
-
-types.h:
+++ /dev/null
-sync.o: sync.c bootmii_ppc.h types.h printf.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
+++ /dev/null
-time.o: time.c bootmii_ppc.h types.h printf.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
+++ /dev/null
-video_low.o: video_low.c bootmii_ppc.h types.h printf.h video_low.h \
- string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-video_low.h:
-
-string.h:
OBJS = realmode.o crt0.o main.o string.o sync.o time.o printf.o input.o \
exception.o exception_2200.o malloc.o gecko.o video_low.o \
- ipc.o mini_ipc.o nandfs.o ff.o diskio.o fat.o font.o console.o
+ ipc.o mini_ipc.o nandfs.o ff.o diskio.o fat.o font.o console.o \
+ sha1.o
include common.mk
if (!gecko_console_enabled)
return 0;
+ udelay(100); // evil hack :)
+
va_list args;
char buffer[1024];
int i;
--- /dev/null
+/*
+ mini - a Free Software replacement for the Nintendo/BroadOn IOS.
+ Hollywood register definitions
+
+Copyright (C) 2008, 2009 Haxx Enterprises <bushing@gmail.com>
+Copyright (C) 2008, 2009 Sven Peter <svenpeter@gmail.com>
+Copyright (C) 2008, 2009 Hector Martin "marcan" <marcan@marcansoft.com>
+Copyright (C) 2008, 2009 John Kelley <wiidev@kelley.ca>
+
+# This code is licensed to you under the terms of the GNU GPL, version 2;
+# see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+*/
+
+#ifndef __HOLLYWOOD_H__
+#define __HOLLYWOOD_H__
+
+/* Hollywood Registers */
+
+#define HW_PPC_REG_BASE 0xd000000
+#define HW_REG_BASE 0xd800000
+
+// The PPC can only see the first three IPC registers
+#define HW_IPC_PPCMSG (HW_REG_BASE + 0x000)
+#define HW_IPC_PPCCTRL (HW_REG_BASE + 0x004)
+#define HW_IPC_ARMMSG (HW_REG_BASE + 0x008)
+#define HW_IPC_ARMCTRL (HW_REG_BASE + 0x00c)
+
+#define HW_TIMER (HW_REG_BASE + 0x010)
+#define HW_ALARM (HW_REG_BASE + 0x014)
+
+#define HW_PPCIRQFLAG (HW_REG_BASE + 0x030)
+#define HW_PPCIRQMASK (HW_REG_BASE + 0x034)
+
+#define HW_ARMIRQFLAG (HW_REG_BASE + 0x038)
+#define HW_ARMIRQMASK (HW_REG_BASE + 0x03c)
+
+#define HW_MEMMIRR (HW_REG_BASE + 0x060)
+
+// something to do with PPCBOOT
+// and legacy DI it seems ?!?
+#define HW_EXICTRL (HW_REG_BASE + 0x070)
+#define EXICTRL_ENABLE_EXI 1
+
+// PPC side of GPIO1 (Starlet can access this too)
+// Output state
+#define HW_GPIO1BOUT (HW_REG_BASE + 0x0c0)
+// Direction (1=output)
+#define HW_GPIO1BDIR (HW_REG_BASE + 0x0c4)
+// Input state
+#define HW_GPIO1BIN (HW_REG_BASE + 0x0c8)
+// Interrupt level
+#define HW_GPIO1BINTLVL (HW_REG_BASE + 0x0cc)
+// Interrupt flags (write 1 to clear)
+#define HW_GPIO1BINTFLAG (HW_REG_BASE + 0x0d0)
+// Interrupt propagation enable
+// Do these interrupts go anywhere???
+#define HW_GPIO1BINTENABLE (HW_REG_BASE + 0x0d4)
+//??? seems to be a mirror of inputs at some point... power-up state?
+#define HW_GPIO1BINMIR (HW_REG_BASE + 0x0d8)
+// 0xFFFFFF by default, if cleared disables respective outputs. Top bits non-settable.
+#define HW_GPIO1ENABLE (HW_REG_BASE + 0x0dc)
+
+#define HW_GPIO1_SLOT 0x000020
+#define HW_GPIO1_DEBUG 0xFF0000
+#define HW_GPIO1_DEBUG_SH 16
+
+// Starlet side of GPIO1
+// Output state
+#define HW_GPIO1OUT (HW_REG_BASE + 0x0e0)
+// Direction (1=output)
+#define HW_GPIO1DIR (HW_REG_BASE + 0x0e4)
+// Input state
+#define HW_GPIO1IN (HW_REG_BASE + 0x0e8)
+// Interrupt level
+#define HW_GPIO1INTLVL (HW_REG_BASE + 0x0ec)
+// Interrupt flags (write 1 to clear)
+#define HW_GPIO1INTFLAG (HW_REG_BASE + 0x0f0)
+// Interrupt propagation enable (interrupts go to main interrupt 0x800)
+#define HW_GPIO1INTENABLE (HW_REG_BASE + 0x0f4)
+//??? seems to be a mirror of inputs at some point... power-up state?
+#define HW_GPIO1INMIR (HW_REG_BASE + 0x0f8)
+// Owner of each GPIO bit. If 1, GPIO1B registers assume control. If 0, GPIO1 registers assume control.
+#define HW_GPIO1OWNER (HW_REG_BASE + 0x0fc)
+
+// ????
+#define HW_DIFLAGS (HW_REG_BASE + 0x180)
+#define DIFLAGS_BOOT_CODE 0x100000
+
+// maybe a GPIO???
+#define HW_RESETS (HW_REG_BASE + 0x194)
+
+#define HW_CLOCKS (HW_REG_BASE + 0x1b4)
+
+#define HW_GPIO2OUT (HW_REG_BASE + 0x1c8)
+#define HW_GPIO2DIR (HW_REG_BASE + 0x1cc)
+#define HW_GPIO2IN (HW_REG_BASE + 0x1d0)
+
+#define HW_OTPCMD (HW_REG_BASE + 0x1ec)
+#define HW_OTPDATA (HW_REG_BASE + 0x1f0)
+#define HW_VERSION (HW_REG_BASE + 0x214)
+
+/* NAND Registers */
+
+#define NAND_REG_BASE 0xd010000
+
+#define NAND_CMD (NAND_REG_BASE + 0x000)
+#define NAND_STATUS NAND_CMD
+#define NAND_CONF (NAND_REG_BASE + 0x004)
+#define NAND_ADDR0 (NAND_REG_BASE + 0x008)
+#define NAND_ADDR1 (NAND_REG_BASE + 0x00c)
+#define NAND_DATA (NAND_REG_BASE + 0x010)
+#define NAND_ECC (NAND_REG_BASE + 0x014)
+#define NAND_UNK1 (NAND_REG_BASE + 0x018)
+#define NAND_UNK2 (NAND_REG_BASE + 0x01c)
+
+/* AES Registers */
+
+#define AES_REG_BASE 0xd020000
+
+#define AES_CMD (AES_REG_BASE + 0x000)
+#define AES_SRC (AES_REG_BASE + 0x004)
+#define AES_DEST (AES_REG_BASE + 0x008)
+#define AES_KEY (AES_REG_BASE + 0x00c)
+#define AES_IV (AES_REG_BASE + 0x010)
+
+/* SHA-1 Registers */
+
+#define SHA_REG_BASE 0xd030000
+
+#define SHA_CMD (SHA_REG_BASE + 0x000)
+#define SHA_SRC (SHA_REG_BASE + 0x004)
+#define SHA_H0 (SHA_REG_BASE + 0x008)
+#define SHA_H1 (SHA_REG_BASE + 0x00c)
+#define SHA_H2 (SHA_REG_BASE + 0x010)
+#define SHA_H3 (SHA_REG_BASE + 0x014)
+#define SHA_H4 (SHA_REG_BASE + 0x018)
+
+/* SD Host Controller Registers */
+
+#define SDHC_REG_BASE 0xd070000
+
+/* OHCI0 Registers */
+
+#define OHCI0_REG_BASE 0xd050000
+
+#define OHCI0_HC_REVISION (OHCI0_REG_BASE + 0x00)
+#define OHCI0_HC_CONTROL (OHCI0_REG_BASE + 0x04)
+#define OHCI0_HC_COMMAND_STATUS (OHCI0_REG_BASE + 0x08)
+#define OHCI0_HC_INT_STATUS (OHCI0_REG_BASE + 0x0C)
+
+#define OHCI0_HC_INT_ENABLE (OHCI0_REG_BASE + 0x10)
+#define OHCI0_HC_INT_DISABLE (OHCI0_REG_BASE + 0x14)
+#define OHCI0_HC_HCCA (OHCI0_REG_BASE + 0x18)
+#define OHCI0_HC_PERIOD_CURRENT_ED (OHCI0_REG_BASE + 0x1C)
+
+#define OHCI0_HC_CTRL_HEAD_ED (OHCI0_REG_BASE + 0x20)
+#define OHCI0_HC_CTRL_CURRENT_ED (OHCI0_REG_BASE + 0x24)
+#define OHCI0_HC_BULK_HEAD_ED (OHCI0_REG_BASE + 0x28)
+#define OHCI0_HC_BULK_CURRENT_ED (OHCI0_REG_BASE + 0x2C)
+
+#define OHCI0_HC_DONE_HEAD (OHCI0_REG_BASE + 0x30)
+#define OHCI0_HC_FM_INTERVAL (OHCI0_REG_BASE + 0x34)
+#define OHCI0_HC_FM_REMAINING (OHCI0_REG_BASE + 0x38)
+#define OHCI0_HC_FM_NUMBER (OHCI0_REG_BASE + 0x3C)
+
+#define OHCI0_HC_PERIODIC_START (OHCI0_REG_BASE + 0x40)
+#define OHCI0_HC_LS_THRESHOLD (OHCI0_REG_BASE + 0x44)
+#define OHCI0_HC_RH_DESCRIPTOR_A (OHCI0_REG_BASE + 0x48)
+#define OHCI0_HC_RH_DESCRIPTOR_B (OHCI0_REG_BASE + 0x4C)
+
+#define OHCI0_HC_RH_STATUS (OHCI0_REG_BASE + 0x50)
+
+/* OHCI1 Registers */
+
+#define OHCI1_REG_BASE 0xd060000
+
+#define OHCI1_HC_REVISION (OHCI1_REG_BASE + 0x00)
+#define OHCI1_HC_CONTROL (OHCI1_REG_BASE + 0x04)
+#define OHCI1_HC_COMMAND_STATUS (OHCI1_REG_BASE + 0x08)
+#define OHCI1_HC_INT_STATUS (OHCI1_REG_BASE + 0x0C)
+
+#define OHCI1_HC_INT_ENABLE (OHCI1_REG_BASE + 0x10)
+#define OHCI1_HC_INT_DISABLE (OHCI1_REG_BASE + 0x14)
+#define OHCI1_HC_HCCA (OHCI1_REG_BASE + 0x18)
+#define OHCI1_HC_PERIOD_CURRENT_ED (OHCI1_REG_BASE + 0x1C)
+
+#define OHCI1_HC_CTRL_HEAD_ED (OHCI1_REG_BASE + 0x20)
+#define OHCI1_HC_CTRL_CURRENT_ED (OHCI1_REG_BASE + 0x24)
+#define OHCI1_HC_BULK_HEAD_ED (OHCI1_REG_BASE + 0x28)
+#define OHCI1_HC_BULK_CURRENT_ED (OHCI1_REG_BASE + 0x2C)
+
+#define OHCI1_HC_DONE_HEAD (OHCI1_REG_BASE + 0x30)
+#define OHCI1_HC_FM_INTERVAL (OHCI1_REG_BASE + 0x34)
+#define OHCI1_HC_FM_REMAINING (OHCI1_REG_BASE + 0x38)
+#define OHCI1_HC_FM_NUMBER (OHCI1_REG_BASE + 0x3C)
+
+#define OHCI1_HC_PERIODIC_START (OHCI1_REG_BASE + 0x40)
+#define OHCI1_HC_LS_THRESHOLD (OHCI1_REG_BASE + 0x44)
+#define OHCI1_HC_RH_DESCRIPTOR_A (OHCI1_REG_BASE + 0x48)
+#define OHCI1_HC_RH_DESCRIPTOR_B (OHCI1_REG_BASE + 0x4C)
+
+#define OHCI1_HC_RH_STATUS (OHCI1_REG_BASE + 0x50)
+
+/* EHCI Registers */
+#define EHCI_REG_BASE 0xd040000
+
+/* stolen from mikep2 patched linux kernel: drivers/usb/host/ohci-mipc.c */
+#define EHCI_CTL (EHCI_REG_BASE + 0xCC)
+#define EHCI_CTL_OH0INTE (1<<11) /* oh0 interrupt enable */
+#define EHCI_CTL_OH1INTE (1<<12) /* oh1 interrupt enable */
+
+/* EXI Registers */
+
+#define EXI_REG_BASE 0xd806800
+#define EXI0_REG_BASE (EXI_REG_BASE+0x000)
+#define EXI1_REG_BASE (EXI_REG_BASE+0x014)
+#define EXI2_REG_BASE (EXI_REG_BASE+0x028)
+
+#define EXI0_CSR (EXI0_REG_BASE+0x000)
+#define EXI0_MAR (EXI0_REG_BASE+0x004)
+#define EXI0_LENGTH (EXI0_REG_BASE+0x008)
+#define EXI0_CR (EXI0_REG_BASE+0x00c)
+#define EXI0_DATA (EXI0_REG_BASE+0x010)
+
+#define EXI1_CSR (EXI1_REG_BASE+0x000)
+#define EXI1_MAR (EXI1_REG_BASE+0x004)
+#define EXI1_LENGTH (EXI1_REG_BASE+0x008)
+#define EXI1_CR (EXI1_REG_BASE+0x00c)
+#define EXI1_DATA (EXI1_REG_BASE+0x010)
+
+#define EXI2_CSR (EXI2_REG_BASE+0x000)
+#define EXI2_MAR (EXI2_REG_BASE+0x004)
+#define EXI2_LENGTH (EXI2_REG_BASE+0x008)
+#define EXI2_CR (EXI2_REG_BASE+0x00c)
+#define EXI2_DATA (EXI2_REG_BASE+0x010)
+
+#define EXI_BOOT_BASE (EXI_REG_BASE+0x040)
+
+/* MEMORY CONTROLLER Registers */
+
+#define MEM_REG_BASE 0xd8b4000
+#define MEM_PROT (MEM_REG_BASE+0x20a)
+#define MEM_PROT_START (MEM_REG_BASE+0x20c)
+#define MEM_PROT_END (MEM_REG_BASE+0x20e)
+#define MEM_FLUSHREQ (MEM_REG_BASE+0x228)
+#define MEM_FLUSHACK (MEM_REG_BASE+0x22a)
+
+#endif
#include "video_low.h"
#include "input.h"
#include "console.h"
+#include "sha1.h"
+#include "hollywood.h"
#define MINIMUM_MINI_VERSION 0x00010001
; // better ideas welcome!
}
- print_str_noscroll(112, 112, "ohai, world!\n");
+ printf("===============================\n");
- testOTP();
+ SHA1TestCases();
printf("bye, world!\n");
--- /dev/null
+/*
+SHA-1 in C
+By Steve Reid <steve@edmweb.com>
+100% Public Domain
+
+Test Vectors (from FIPS PUB 180-1)
+"abc"
+ A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
+"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+ 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
+A million repetitions of "a"
+ 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
+*/
+
+#define SHA1HANDSOFF
+
+#include "string.h"
+#include "sha1.h"
+#include "bootmii_ppc.h"
+#include "hollywood.h"
+#include "malloc.h"
+#include "types.h"
+
+//should be divisibly by four
+#define BLOCKSIZE 32
+
+#define SHA_CMD_FLAG_EXEC (1<<31)
+#define SHA_CMD_FLAG_IRQ (1<<30)
+#define SHA_CMD_FLAG_ERR (1<<29)
+#define SHA_CMD_AREA_BLOCK ((1<<10) - 1)
+
+typedef struct {
+ unsigned long state[5];
+ unsigned long count[2];
+ unsigned char buffer[64];
+} SHA1_CTX;
+
+typedef u32 sha1[5];
+
+static void SHA1Transform(unsigned long state[5], unsigned char buffer[64]);
+static void SHA1Transforml(unsigned long state[5], unsigned char buffer[64], u32 len);
+static void SHA1Init(SHA1_CTX* context);
+static void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len);
+static void SHA1Final(unsigned char digest[20], SHA1_CTX* context);
+
+static void SHA1Transform(unsigned long state[5], unsigned char buffer[64]) {
+ SHA1Transforml(state, buffer, 1);
+}
+
+/* Hash a single 512-bit block. This is the core of the algorithm. */
+
+static void SHA1Transforml(unsigned long state[5], unsigned char buffer[64], u32 len)
+{
+ /* Copy context->state[] to working vars */
+ write32(SHA_H0, state[0]);
+ write32(SHA_H1, state[1]);
+ write32(SHA_H2, state[2]);
+ write32(SHA_H3, state[3]);
+ write32(SHA_H4, state[4]);
+
+ static u32 num_blocks;
+ num_blocks = len;
+
+ // assign block to local copy which is 64-byte aligned
+ static u8 block[64*BLOCKSIZE] ALIGNED(64);
+ // for further improvments!
+ // u8 *block = memalign(64, 64*num_blocks);
+ memcpy(block, buffer, 64*num_blocks);
+
+ // royal flush :)
+ sync_after_write(block, 64*num_blocks);
+
+ // tell sha1 controller the block source address
+ write32(SHA_SRC, virt_to_phys(block));
+
+ // tell sha1 controller number of blocks
+ if (num_blocks != 0)
+ num_blocks--;
+ write32(SHA_CMD, (read32(SHA_CMD) & ~(SHA_CMD_AREA_BLOCK)) | num_blocks);
+
+ // fire up hashing and wait till its finished
+ write32(SHA_CMD, read32(SHA_CMD) | SHA_CMD_FLAG_EXEC);
+ while (read32(SHA_CMD) & SHA_CMD_FLAG_EXEC);
+
+ // free the aligned data
+ // free(block);
+
+ /* Add the working vars back into context.state[] */
+ state[0] = read32(SHA_H0);
+ state[1] = read32(SHA_H1);
+ state[2] = read32(SHA_H2);
+ state[3] = read32(SHA_H3);
+ state[4] = read32(SHA_H4);
+}
+
+
+/* SHA1Init - Initialize new context */
+
+static void SHA1Init(SHA1_CTX* context)
+{
+ // reset sha-1 engine
+ write32(SHA_CMD, read32(SHA_CMD) & ~(SHA_CMD_FLAG_EXEC));
+ while ((read32(SHA_CMD) & SHA_CMD_FLAG_EXEC) != 0);
+
+ /* SHA1 initialization constants */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xEFCDAB89;
+ context->state[2] = 0x98BADCFE;
+ context->state[3] = 0x10325476;
+ context->state[4] = 0xC3D2E1F0;
+ context->count[0] = context->count[1] = 0;
+}
+
+
+/* Run your data through this. */
+
+static void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len)
+{
+ unsigned int i, j;
+
+ j = (context->count[0] >> 3) & 63;
+ if ((context->count[0] += len << 3) < (len << 3))
+ context->count[1]++;
+ context->count[1] += (len >> 29);
+ if ((j + len) > 63) {
+ memcpy(&context->buffer[j], data, (i = 64-j));
+ SHA1Transform(context->state, context->buffer);
+ // try bigger blocks at once
+ for ( ; i + 63 + ((BLOCKSIZE-1)*64) < len; i += (64 + (BLOCKSIZE-1)*64)) {
+ SHA1Transforml(context->state, &data[i], BLOCKSIZE);
+ }
+ for ( ; i + 63 + (((BLOCKSIZE/2)-1)*64) < len; i += (64 + ((BLOCKSIZE/2)-1)*64)) {
+ SHA1Transforml(context->state, &data[i], BLOCKSIZE/2);
+ }
+ for ( ; i + 63 + (((BLOCKSIZE/4)-1)*64) < len; i += (64 + ((BLOCKSIZE/4)-1)*64)) {
+ SHA1Transforml(context->state, &data[i], BLOCKSIZE/4);
+ }
+ for ( ; i + 63 < len; i += 64) {
+ SHA1Transform(context->state, &data[i]);
+ }
+ j = 0;
+ }
+ else i = 0;
+ memcpy(&context->buffer[j], &data[i], len - i);
+}
+
+
+/* Add padding and return the message digest. */
+
+static void SHA1Final(unsigned char digest[20], SHA1_CTX* context)
+{
+ unsigned long i, j;
+ unsigned char finalcount[8];
+
+ for (i = 0; i < 8; i++) {
+ finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
+ >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
+ }
+
+ SHA1Update(context, (unsigned char *)"\200", 1);
+ while ((context->count[0] & 504) != 448) {
+ SHA1Update(context, (unsigned char *)"\0", 1);
+ }
+ SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */
+ for (i = 0; i < 20; i++) {
+ digest[i] = (unsigned char)
+ ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
+ }
+ /* Wipe variables */
+ i = j = 0;
+ memset(context->buffer, 0, 64);
+ memset(context->state, 0, 20);
+ memset(context->count, 0, 8);
+ memset(&finalcount, 0, 8);
+#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */
+ SHA1Transform(context->state, context->buffer);
+#endif
+}
+
+void SHA1(unsigned char *ptr, unsigned int size, unsigned char *outbuf)
+{
+ SHA1_CTX ctx;
+
+ SHA1Init(&ctx);
+ SHA1Update(&ctx, ptr, size);
+ SHA1Final(outbuf, &ctx);
+}
+
+static void SHA1TestIt(const char *str, u32 len)
+{
+ u8 *in = malloc(len*sizeof(u8));
+ sha1 out;
+ strlcpy((char*)in, str, len+1);
+
+ u32 diff = read32(HW_TIMER);
+ SHA1(in, len, (u8*) out);
+ diff = read32(HW_TIMER)-diff;
+
+ printf("SHA-1 (in hardware) says (H0|H1|H2|H3|H4): %08X|%08X|%08X|%08X|%08X this was calculatet in %02d (hollywood-)cycles\n", out[0], out[1], out[2], out[3], out[4], diff);
+}
+
+
+void SHA1TestCases(void)
+{
+ // expected sha1 hash of string "lasasdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5" (len = 3811)
+ // 33ad104c4fd0de2e90edd6f6103de8304043ab20
+ SHA1TestIt("lasasdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5", 3811);
+ // expected sha1 hash of string "asdf" (len = 4)
+ // 3da541559918a808c2402bba5012f6c60b27661c
+ SHA1TestIt("asdf", 4);
+
+ // expected sha1 hash of string "asdfasdfjalsdfjklasdkjflaksdjflaksdjflkasjdfklajsdfkljasldkfjlaskdjflkajsdfakljsdfklasjddflkjalskdjfasldfjlasdkjflaskjdflaksdf" (len = 126)
+ // 74e1e9e5489d08dc65108aff3a21756e8fc269d2
+ SHA1TestIt("asdfasdfjalsdfjklasdkjflaksdjflaksdjflkasjdfklajsdfkljasldkfjlaskdjflkajsdfakljsdfklasjddflkjalskdjfasldfjlasdkjflaskjdflaksdf", 126);
+}
+
--- /dev/null
+#ifndef __SHA1_H__
+#define __SHA1_H__
+
+void SHA1(unsigned char *ptr, unsigned int size, unsigned char *outbuf);
+
+void SHA1TestCases(void);
+
+#endif