From 22afc41a706dc6a3244fa748e593b8f8a238a83f Mon Sep 17 00:00:00 2001 From: theStack Date: Sun, 30 Aug 2009 23:49:57 +0200 Subject: [PATCH] sha1 patch for ppcskel Steve Reid's SHA-1 C implementation is used here and slighty modified for the SHA-1 Controller in Hollywood. Some simple testcases showed that it is a bit faster as it would be done in software, especially on a huge amount of data. However, there is room for improvement :) Further this patch uses the AHBPROT issue recently found, so Broadway is able to acces the SHA-1 Controller *directly*. --- .deps/console.d | 16 --- .deps/diskio.d | 16 --- .deps/exception.d | 9 -- .deps/fat.d | 9 -- .deps/ff.d | 9 -- .deps/font.d | 1 - .deps/gecko.d | 7 -- .deps/input.d | 11 -- .deps/ipc.d | 11 -- .deps/main.d | 30 ------ .deps/malloc.d | 9 -- .deps/mini_ipc.d | 14 --- .deps/nandfs.d | 16 --- .deps/printf.d | 3 - .deps/string.d | 5 - .deps/sync.d | 7 -- .deps/time.d | 7 -- .deps/video_low.d | 12 --- Makefile | 3 +- gecko.c | 2 + hollywood.h | 248 ++++++++++++++++++++++++++++++++++++++++++++++ main.c | 6 +- sha1.c | 216 ++++++++++++++++++++++++++++++++++++++++ sha1.h | 8 ++ 24 files changed, 480 insertions(+), 195 deletions(-) delete mode 100644 .deps/console.d delete mode 100644 .deps/diskio.d delete mode 100644 .deps/exception.d delete mode 100644 .deps/fat.d delete mode 100644 .deps/ff.d delete mode 100644 .deps/font.d delete mode 100644 .deps/gecko.d delete mode 100644 .deps/input.d delete mode 100644 .deps/ipc.d delete mode 100644 .deps/main.d delete mode 100644 .deps/malloc.d delete mode 100644 .deps/mini_ipc.d delete mode 100644 .deps/nandfs.d delete mode 100644 .deps/printf.d delete mode 100644 .deps/string.d delete mode 100644 .deps/sync.d delete mode 100644 .deps/time.d delete mode 100644 .deps/video_low.d create mode 100644 hollywood.h create mode 100644 sha1.c create mode 100644 sha1.h diff --git a/.deps/console.d b/.deps/console.d deleted file mode 100644 index ee6e69c..0000000 --- a/.deps/console.d +++ /dev/null @@ -1,16 +0,0 @@ -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: diff --git a/.deps/diskio.d b/.deps/diskio.d deleted file mode 100644 index 91a9b0d..0000000 --- a/.deps/diskio.d +++ /dev/null @@ -1,16 +0,0 @@ -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: diff --git a/.deps/exception.d b/.deps/exception.d deleted file mode 100644 index 10580b9..0000000 --- a/.deps/exception.d +++ /dev/null @@ -1,9 +0,0 @@ -exception.o: exception.c bootmii_ppc.h types.h printf.h string.h - -bootmii_ppc.h: - -types.h: - -printf.h: - -string.h: diff --git a/.deps/fat.d b/.deps/fat.d deleted file mode 100644 index 3e0d498..0000000 --- a/.deps/fat.d +++ /dev/null @@ -1,9 +0,0 @@ -fat.o: fat.c fat.h ff.h types.h diskio.h - -fat.h: - -ff.h: - -types.h: - -diskio.h: diff --git a/.deps/ff.d b/.deps/ff.d deleted file mode 100644 index e1a6e7d..0000000 --- a/.deps/ff.d +++ /dev/null @@ -1,9 +0,0 @@ -ff.o: ff.c ff.h types.h diskio.h string.h - -ff.h: - -types.h: - -diskio.h: - -string.h: diff --git a/.deps/font.d b/.deps/font.d deleted file mode 100644 index 05386da..0000000 --- a/.deps/font.d +++ /dev/null @@ -1 +0,0 @@ -font.o: font.c diff --git a/.deps/gecko.d b/.deps/gecko.d deleted file mode 100644 index a4ffc09..0000000 --- a/.deps/gecko.d +++ /dev/null @@ -1,7 +0,0 @@ -gecko.o: gecko.c bootmii_ppc.h types.h printf.h - -bootmii_ppc.h: - -types.h: - -printf.h: diff --git a/.deps/input.d b/.deps/input.d deleted file mode 100644 index 106fd9d..0000000 --- a/.deps/input.d +++ /dev/null @@ -1,11 +0,0 @@ -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: diff --git a/.deps/ipc.d b/.deps/ipc.d deleted file mode 100644 index 7b04dfe..0000000 --- a/.deps/ipc.d +++ /dev/null @@ -1,11 +0,0 @@ -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: diff --git a/.deps/main.d b/.deps/main.d deleted file mode 100644 index db1b5bb..0000000 --- a/.deps/main.d +++ /dev/null @@ -1,30 +0,0 @@ -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: diff --git a/.deps/malloc.d b/.deps/malloc.d deleted file mode 100644 index fc65e56..0000000 --- a/.deps/malloc.d +++ /dev/null @@ -1,9 +0,0 @@ -malloc.o: malloc.c bootmii_ppc.h types.h printf.h string.h - -bootmii_ppc.h: - -types.h: - -printf.h: - -string.h: diff --git a/.deps/mini_ipc.d b/.deps/mini_ipc.d deleted file mode 100644 index eec10fa..0000000 --- a/.deps/mini_ipc.d +++ /dev/null @@ -1,14 +0,0 @@ -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: diff --git a/.deps/nandfs.d b/.deps/nandfs.d deleted file mode 100644 index 872043a..0000000 --- a/.deps/nandfs.d +++ /dev/null @@ -1,16 +0,0 @@ -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: diff --git a/.deps/printf.d b/.deps/printf.d deleted file mode 100644 index f233a70..0000000 --- a/.deps/printf.d +++ /dev/null @@ -1,3 +0,0 @@ -printf.o: printf.c types.h - -types.h: diff --git a/.deps/string.d b/.deps/string.d deleted file mode 100644 index 578b675..0000000 --- a/.deps/string.d +++ /dev/null @@ -1,5 +0,0 @@ -string.o: string.c string.h types.h - -string.h: - -types.h: diff --git a/.deps/sync.d b/.deps/sync.d deleted file mode 100644 index c2a75f6..0000000 --- a/.deps/sync.d +++ /dev/null @@ -1,7 +0,0 @@ -sync.o: sync.c bootmii_ppc.h types.h printf.h - -bootmii_ppc.h: - -types.h: - -printf.h: diff --git a/.deps/time.d b/.deps/time.d deleted file mode 100644 index b78f1ea..0000000 --- a/.deps/time.d +++ /dev/null @@ -1,7 +0,0 @@ -time.o: time.c bootmii_ppc.h types.h printf.h - -bootmii_ppc.h: - -types.h: - -printf.h: diff --git a/.deps/video_low.d b/.deps/video_low.d deleted file mode 100644 index f1242fd..0000000 --- a/.deps/video_low.d +++ /dev/null @@ -1,12 +0,0 @@ -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: diff --git a/Makefile b/Makefile index 87ff1fc..39a27ff 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,8 @@ TARGET = ppcboot.elf 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 diff --git a/gecko.c b/gecko.c index 49f57cf..1511fa5 100644 --- a/gecko.c +++ b/gecko.c @@ -205,6 +205,8 @@ int printf(const char *fmt, ...) { if (!gecko_console_enabled) return 0; + udelay(100); // evil hack :) + va_list args; char buffer[1024]; int i; diff --git a/hollywood.h b/hollywood.h new file mode 100644 index 0000000..3f2dde4 --- /dev/null +++ b/hollywood.h @@ -0,0 +1,248 @@ +/* + mini - a Free Software replacement for the Nintendo/BroadOn IOS. + Hollywood register definitions + +Copyright (C) 2008, 2009 Haxx Enterprises +Copyright (C) 2008, 2009 Sven Peter +Copyright (C) 2008, 2009 Hector Martin "marcan" +Copyright (C) 2008, 2009 John Kelley + +# 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 diff --git a/main.c b/main.c index acd9717..3e186f3 100644 --- a/main.c +++ b/main.c @@ -24,6 +24,8 @@ Copyright (C) 2009 John Kelley #include "video_low.h" #include "input.h" #include "console.h" +#include "sha1.h" +#include "hollywood.h" #define MINIMUM_MINI_VERSION 0x00010001 @@ -109,9 +111,9 @@ int main(void) ; // better ideas welcome! } - print_str_noscroll(112, 112, "ohai, world!\n"); + printf("===============================\n"); - testOTP(); + SHA1TestCases(); printf("bye, world!\n"); diff --git a/sha1.c b/sha1.c new file mode 100644 index 0000000..9201920 --- /dev/null +++ b/sha1.c @@ -0,0 +1,216 @@ +/* +SHA-1 in C +By Steve Reid +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); +} + diff --git a/sha1.h b/sha1.h new file mode 100644 index 0000000..a4a01b5 --- /dev/null +++ b/sha1.h @@ -0,0 +1,8 @@ +#ifndef __SHA1_H__ +#define __SHA1_H__ + +void SHA1(unsigned char *ptr, unsigned int size, unsigned char *outbuf); + +void SHA1TestCases(void); + +#endif -- 2.25.1