Updated init script.
authorDavid Bartley <dtbartle@csclub.uwaterloo.ca>
Wed, 25 Jul 2007 06:33:28 +0000 (02:33 -0400)
committerDavid Bartley <dtbartle@csclub.uwaterloo.ca>
Wed, 25 Jul 2007 06:33:48 +0000 (02:33 -0400)
Update sha1 code (works with 64-bit compilers now).
Added -f "don't daemonize" flag.
Added css file.

bluesteel-3.02.css [new file with mode: 0644]
bnbt.cpp
debian/bnbt.init
debian/changelog
sha1.cpp
sha1.h

diff --git a/bluesteel-3.02.css b/bluesteel-3.02.css
new file mode 100644 (file)
index 0000000..6c09cc3
--- /dev/null
@@ -0,0 +1,337 @@
+/* Bluesteel StyleSheet Document Version 3.01\r
+ * Created by Trinity of ZionMatrix\r
+ * For Use with The Trinity Edition of BNBT 7.7r3.2004.07.15\r
+ *\r
+ * Project Homepage - http://bnbteasytracker.sourceforge.net/\r
+ */\r
\r
+/* STANDARD BODY ELEMENTS --------------------------------------------------- */\r
+\r
+img {\r
+\r
+    vertical-align:            middle                   ;\r
+    \r
+}\r
+\r
+body {\r
+\r
+    color:                     black                 ;\r
+    background-color:          white                 ;\r
+    font-family:               tahoma                ;\r
+    font-size:                 8pt                   ;\r
+    font-weight:               normal                ;\r
+\r
+}\r
+\r
+p { /* Used often; places text/objects in Block Level Paragraphs */\r
+\r
+    color:                     inherit               ;\r
+    font-family:               inherit               ;\r
+    font-size:                 inherit               ;\r
+    font-weight:               inherit               ;\r
+\r
+}\r
+\r
+h1 {\r
+\r
+    color:                     inherit               ;\r
+    font-family:               inherit               ;\r
+    font-size:                 20pt                  ;\r
+    font-weight:               normal                ;\r
+\r
+}\r
+\r
+h2 {\r
+\r
+    color:                     inherit               ;\r
+    font-family:               inherit               ;\r
+    font-size:                 15pt                  ;\r
+    font-weight:               normal                ;\r
+\r
+}\r
+\r
+h3 { /* Used for the Header Text on each Tracker Page */\r
+\r
+    color:                     inherit               ;\r
+    font-family:               inherit               ;\r
+    font-size:                 15pt                  ;\r
+    font-weight:               normal                ;\r
+}\r
+\r
+h4 { /* Used for subsequent Header Text - specific to TTE\r
+      * These settings should match what you have for H3 */\r
+      \r
+    color:                     inherit               ;\r
+    font-family:               inherit               ;\r
+    font-size:                 15pt                  ;\r
+    font-weight:               normal                ;\r
+    \r
+}\r
+\r
+/* HYPERLINKED TEXT ELEMENTS */\r
+\r
+a {\r
+\r
+    color:                     #3F419B               ; /* specifies the default (unvisited) link color */\r
+    font-family:               tahoma                ;\r
+    font-size:                 8pt                   ;\r
+    font-weight:               normal                ;\r
+    text-decoration:           none                  ; /* none | underline | overline | line-through */\r
+\r
+}\r
+\r
+a:hover { /* Used to specify hyperlinked text style when the user's mouse hovers over the link */\r
+\r
+    color:                     #404040                 ;\r
+    font-family:               tahoma                ;\r
+    font-size:                 8pt                   ;\r
+    font-weight:               normal                ;\r
+    text-decoration:           underline             ;\r
+    \r
+}\r
+\r
+a.sort { /* Used to specify style for the A and Z sort links in the column headers */\r
+\r
+    color:                     black                 ;\r
+    font-family:               tahoma                ;\r
+    font-size:                 8pt                   ;\r
+    font-weight:               normal                ;\r
+    text-transform:            lowercase             ;\r
+    \r
+}\r
+\r
+a.sort:hover {\r
+\r
+    text-transform:            uppercase             ;\r
+    text-decoration:           none                  ;\r
+    \r
+    /* You will notice that only one specification is being used... when this\r
+     * happens, the other specs are taken from the parent. In this case, that\r
+     * would be "a.sort"\r
+     */\r
+    \r
+}\r
+\r
+/* a.download {\r
+ */\r
+/* Used to further specify style for the DL (Download) Link\r
+ * since it is not being used in this stylesheet, its properties are taken\r
+ * from the parent, which in this case is "a". This holds true for any\r
+ * "element.class" not specified.\r
+ */\r
+/* }\r
+ */\r
+\r
\r
+/* TABLE SPECIFICATIONS ----------------------------------------------------- */\r
+\r
+table {\r
+\r
+      /* the space between cell borders; filled with background color */\r
+    border-spacing:            1pt                   ;\r
+      /* forces empty cells to be rendered; useful for display borders on empty cells */\r
+    empty-cells:               show                  ;\r
+    \r
+}\r
+\r
+tr.even, tr.com_body { /* specifies the bgcolor for even numbered rows AND for user comments */\r
+\r
+    background-color:          #DEE3E7               ;\r
+\r
+}\r
+\r
+tr.odd, tr.com_header { /* specifies the bgcolor for odd numbered rows AND user comment headers*/\r
+\r
+    background-color:          #EFEFEF               ;\r
+\r
+}\r
+\r
+code { /* specifies attributes of user commented text */\r
+\r
+    font-family:               inherit                ;\r
+    \r
+}\r
+\r
+\r
+    \r
+/* CLASSES FOR THE <TH> and <TD> ELEMENTS\r
+.tag          - the category tag\r
+.hash         - the torrent hash\r
+.name         - torrent name, uploader's name\r
+.download     - download link\r
+.number       - comments, files, seeders, leechers, completed\r
+.date         - date added\r
+.bytes        - size, transferred\r
+.percent      - min/average/max | progress/left\r
+.infolink     - InfoLink\r
+.admin        - Admin\r
+.ip           - for IP Addresses on stats.html\r
+.connected    - for connected time on stats.html\r
+*/\r
+\r
+th { /* specifies properties for the column headers */\r
+\r
+    color:                     black                 ; /* text color */\r
+    background-color:          #C0C0C0               ;\r
+    font-family:               tahoma                ;\r
+    font-size:                 8pt                   ;\r
+    font-weight:               normal                ;\r
+    padding:                   1px 1px 1px 1px     ; /* specifies the space around the text in the cell (top, right, bottom, left) */\r
+    vertical-align:            top                   ; /* specifies the vertical alignment of the text in the cell */\r
+    text-transform:            none                  ;\r
+    border:                    1px        ;\r
+    \r
+}\r
+\r
+td {\r
+\r
+    color:                     black                 ; /* text color */\r
+    font-family:               tahoma                ;\r
+    font-size:                 8pt                   ;\r
+    padding:                   2px 3px 2px 3px     ;\r
+    \r
+}\r
+\r
+td.name, td.download, td.bytes, td.date, td.infolink, td.admin {\r
+\r
+    white-space:               nowrap                ;\r
+    \r
+}\r
+\r
+td.download, td.percent, td.infolink, td.admin, td.ip {\r
+\r
+    text-align:                center                ;\r
+    \r
+}\r
+\r
+td.bytes, td.connected {\r
+\r
+    text-align:                right                 ;\r
+    \r
+}\r
+\r
+td.number, td.number_red, td.number_yellow, td.number_green {\r
+\r
+    text-align:                center                ;\r
+    \r
+}\r
+\r
+td.number_red, td.number_yellow, td.number_green {\r
+\r
+    border:                    1px       ;\r
+    \r
+}\r
+\r
+td.number_red {\r
+\r
+    color:                     red                   ;\r
+    \r
+}\r
+\r
+td.number_yellow {\r
+\r
+    color:                     #FFA24A               ;\r
+\r
+}\r
+\r
+td.number_green {\r
+\r
+    color:                     green                 ;\r
+\r
+}\r
+\r
+/* MISCELLANEOUS ------------------------------------------------------------ */\r
+\r
+.pipe { /* specifies style for the vertical line (or pipe) between the tag filter images */\r
+\r
+    color:                     white                 ;\r
+    \r
+}\r
+\r
+/* CSS NOTE:\r
+ * You will notice that the element name was not specified above... this specification\r
+ * will have an effect on all elements with the class name "pipe", but since .pipe is\r
+ * only used for <span>, we don't have to worry about. This is basically shorthand.\r
+ */\r
\r
+.username { /* specifies style for the username displayed in logged in messages */\r
+\r
+    color:                     red                   ;\r
+    \r
+}\r
+\r
+.clearfilter { /* disables the Clear Filter button above the the tag filter images */\r
+\r
+    display:                   none                  ; /* change to "normal" to enable */\r
+\r
+}\r
+\r
+input, select, option {\r
+\r
+    font-family:               tahoma                ;\r
+    font-size:                 8pt                   ;\r
+    \r
+}\r
+\r
+.gen_index { /* specifies style for the page generation time on index.html */\r
+\r
+    text-align:                center                ;\r
+    \r
+}\r
+\r
+\r
+/* NAVIGATION BAR TWEAKS ---------------------------------------------------- */\r
+\r
+body {\r
+\r
+    margin:                    0px                   ;\r
+    \r
+}\r
+\r
+table.navbar {\r
+\r
+    background-color:          #EFEFEF               ;\r
+    border-bottom:             1px ;\r
+    margin:                    0px                   ;\r
+    position:                  absolute              ;\r
+    top:                       0px                   ;\r
+    left:                      0px                   ;\r
+    \r
+}\r
+\r
+p, form, table, h3, h4, input.help_upload {\r
+\r
+    margin-left:               15px                  ;\r
+    \r
+}\r
+\r
+h3, h4 {\r
+\r
+    margin-top:                50px                  ; /* moves the page headers down some because of the fixed navbar */\r
+\r
+}\r
+\r
+td.navbar, td.navbar_search {\r
+\r
+    vertical-align:            top                   ;\r
+    white-space:               nowrap                ;\r
+    \r
+}\r
+\r
+td.navbar_search {\r
+\r
+    text-align:                right                 ; /* forces the search form to align right */\r
+    \r
+}\r
+\r
+table {\r
+\r
+    margin:                    15px                  ;\r
+    \r
+}\r
+\r
+.gen_index {\r
+\r
+    margin-top:                30px                  ;\r
+    \r
+}\r
index a903f32..c2d08dd 100644 (file)
--- a/bnbt.cpp
+++ b/bnbt.cpp
@@ -77,6 +77,7 @@ unsigned int giMaxRecvSize;
 string gstrStyle;\r
 string gstrCharSet;\r
 string gstrRealm;\r
+bool gbDaemonize = true;\r
 \r
 // TCP window size\r
 int giSO_SNDBUF;\r
@@ -212,8 +213,15 @@ int main( int argc, char *argv[] )
        }\r
 #else\r
        // disable SIGPIPE since some systems like OS X don't define MSG_NOSIGNAL\r
-\r
        signal( SIGPIPE, SIG_IGN );\r
+\r
+    if(argc > 1)\r
+    {\r
+        if(strcmp(argv[1], "-f") == 0)\r
+        {\r
+            gbDaemonize = false;\r
+        }\r
+    }\r
 #endif\r
 \r
        // catch SIGABRT and SIGINT\r
@@ -484,7 +492,10 @@ int bnbtmain( )
 \r
 #ifndef WIN32\r
     // daemonize\r
-    daemonize("/var/lock/" DAEMON_NAME);\r
+    if(gbDaemonize)\r
+    {\r
+        daemonize("/var/lock/" DAEMON_NAME);\r
+    }\r
 #endif\r
 \r
        while( 1 )\r
index 788bc1c..d5db224 100644 (file)
-#!/bin/sh
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides:          skeleton
+# Required-Start:    $local_fs $remote_fs
+# Required-Stop:     $local_fs $remote_fs
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: bnbt BitTorrent Tracker init script
+# Description:       This file acts as the init script for bnbt
+### END INIT INFO
 
-PATH=/sbin:/bin:/usr/sbin:/usr/bin
+# Author: Foo Bar <foobar@baz.org>
+#
+# Please remove the "Author" lines above and replace them
+# with your own name if you copy and modify this script.
 
-test -x /usr/sbin/bnbt || exit 0
+# Do NOT "set -e"
 
-start () {
-        echo -n "Starting BitTorrent Tracker: bnbt"
-        start-stop-daemon --start --quiet \
-            --pidfile /var/run/bnbt.pid --exec /usr/sbin/bnbt > /dev/null
-        echo "."
+# PATH should only include /usr/* if it runs after the mountnfs.sh script
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
+DESC="bnbt BitTorrent Tracker"
+NAME=bnbt
+DAEMON=/usr/sbin/$NAME
+DAEMON_ARGS=""
+PIDFILE=/var/run/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+
+# Exit if the package is not installed
+[ -x "$DAEMON" ] || exit 0
+
+# Read configuration variable file if it is present
+[ -r /etc/default/$NAME ] && . /etc/default/$NAME
+
+# Load the VERBOSE setting and other rcS variables
+. /lib/init/vars.sh
+
+# Define LSB log_* functions.
+# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
+. /lib/lsb/init-functions
+
+#
+# Function that starts the daemon/service
+#
+do_start()
+{
+    # Return
+    #   0 if daemon has been started
+    #   1 if daemon was already running
+    #   2 if daemon could not be started
+    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
+        || return 1
+    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
+        $DAEMON_ARGS \
+        || return 2
+    # Add code here, if necessary, that waits for the process to be ready
+    # to handle requests from services started subsequently which depend
+    # on this one.  As a last resort, sleep for some time.
 }
 
-stop () {
-        echo -n "Stopping BitTorrent Tracker: bnbt"
-        start-stop-daemon --stop --quiet  \
-            --pidfile /var/run/bnbt.pid --name bnbt
-        echo "."
+#
+# Function that stops the daemon/service
+#
+do_stop()
+{
+    # Return
+    #   0 if daemon has been stopped
+    #   1 if daemon was already stopped
+    #   2 if daemon could not be stopped
+    #   other if a failure occurred
+    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
+    RETVAL="$?"
+    [ "$RETVAL" = 2 ] && return 2
+    # Wait for children to finish too if this is a daemon that forks
+    # and if the daemon is only ever run from this initscript.
+    # If the above conditions are not satisfied then add some other code
+    # that waits for the process to drop all resources that could be
+    # needed by services started subsequently.  A last resort is to
+    # sleep for some time.
+    start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
+    [ "$?" = 2 ] && return 2
+    # Many daemons don't delete their pidfiles when they exit.
+    rm -f $PIDFILE
+    return "$RETVAL"
+}
+
+#
+# Function that sends a SIGHUP to the daemon/service
+#
+do_reload() {
+    #
+    # If the daemon can reload its configuration without
+    # restarting (for example, when it is sent a SIGHUP),
+    # then implement that here.
+    #
+    start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
+    return 0
 }
 
 case "$1" in
-    start)
-        start
+  start)
+    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
+    do_start
+    case "$?" in
+        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+    esac
     ;;
-
-    stop)
-        stop
+  stop)
+    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
+    do_stop
+    case "$?" in
+        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+    esac
     ;;
-
-    restart)
-        stop
-        sleep 2
-        start
+  #reload|force-reload)
+    #
+    # If do_reload() is not implemented then leave this commented out
+    # and leave 'force-reload' as an alias for 'restart'.
+    #
+    #log_daemon_msg "Reloading $DESC" "$NAME"
+    #do_reload
+    #log_end_msg $?
+    #;;
+  restart|force-reload)
+    #
+    # If the "reload" option is implemented then remove the
+    # 'force-reload' alias
+    #
+    log_daemon_msg "Restarting $DESC" "$NAME"
+    do_stop
+    case "$?" in
+      0|1)
+        do_start
+        case "$?" in
+            0) log_end_msg 0 ;;
+            1) log_end_msg 1 ;; # Old process is still running
+            *) log_end_msg 1 ;; # Failed to start
+        esac
+        ;;
+      *)
+        # Failed to stop
+        log_end_msg 1
+        ;;
+    esac
     ;;
-    
-    *)
-        echo "Usage: /etc/init.d/bnbt {start|stop|restart}" >&2
-        exit 1
+  *)
+    #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
+    echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
+    exit 3
     ;;
 esac
 
-exit 0
-
+:
index bc87a18..1382f09 100644 (file)
@@ -1,3 +1,10 @@
+bnbt (8.0.10.1) unstable; urgency=low
+
+  * Update init script
+  * Added -f flag to allow non-daemonizing
+
+ -- David Bartley <dtbartle@csclub.uwaterloo.ca>  Wed, 25 Jul 2007 00:11:48 -0400
+
 bnbt (8.0.10) unstable; urgency=low
 
   * Initial Release.
index bfc8b94..a0a7bf4 100644 (file)
--- a/sha1.cpp
+++ b/sha1.cpp
@@ -1,27 +1,70 @@
 /*\r
-       100% free public domain implementation of the SHA-1\r
-       algorithm by Dominik Reichl <Dominik.Reichl@tiscali.de>\r
-\r
-       * modified by Trevor Hogan for use with BNBT *\r
-\r
-       === Test Vectors (from FIPS PUB 180-1) ===\r
-\r
-       "abc"\r
+       100% free public domain implementation of the SHA-1 algorithm\r
+       by Dominik Reichl <dominik.reichl@t-online.de>\r
+       Web: http://www.dominik-reichl.de/\r
+\r
+       Version 1.6 - 2005-02-07 (thanks to Howard Kapustein for patches)\r
+       - You can set the endianness in your files, no need to modify the\r
+         header file of the CSHA1 class any more\r
+       - Aligned data support\r
+       - Made support/compilation of the utility functions (ReportHash\r
+         and HashFile) optional (useful, if bytes count, for example in\r
+         embedded environments)\r
+\r
+       Version 1.5 - 2005-01-01\r
+       - 64-bit compiler compatibility added\r
+       - Made variable wiping optional (define SHA1_WIPE_VARIABLES)\r
+       - Removed unnecessary variable initializations\r
+       - ROL32 improvement for the Microsoft compiler (using _rotl)\r
+\r
+       ======== Test Vectors (from FIPS PUB 180-1) ========\r
+\r
+       SHA1("abc") =\r
                A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D\r
 \r
-       "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"\r
+       SHA1("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") =\r
                84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1\r
 \r
-       A million repetitions of "a"\r
+       SHA1(A million repetitions of "a") =\r
                34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F\r
 */\r
 \r
-\r
 #include "sha1.h"\r
 \r
+#ifdef SHA1_UTILITY_FUNCTIONS\r
+#define SHA1_MAX_FILE_BUFFER 8000\r
+#endif\r
+\r
+// Rotate x bits to the left\r
+#ifndef ROL32\r
+#ifdef _MSC_VER\r
+#define ROL32(_val32, _nBits) _rotl(_val32, _nBits)\r
+#else\r
+#define ROL32(_val32, _nBits) (((_val32)<<(_nBits))|((_val32)>>(32-(_nBits))))\r
+#endif\r
+#endif\r
+\r
+#ifdef SHA1_LITTLE_ENDIAN\r
+#define SHABLK0(i) (m_block->l[i] = \\r
+       (ROL32(m_block->l[i],24) & 0xFF00FF00) | (ROL32(m_block->l[i],8) & 0x00FF00FF))\r
+#else\r
+#define SHABLK0(i) (m_block->l[i])\r
+#endif\r
+\r
+#define SHABLK(i) (m_block->l[i&15] = ROL32(m_block->l[(i+13)&15] ^ m_block->l[(i+8)&15] \\r
+       ^ m_block->l[(i+2)&15] ^ m_block->l[i&15],1))\r
+\r
+// SHA-1 rounds\r
+#define _R0(v,w,x,y,z,i) { z+=((w&(x^y))^y)+SHABLK0(i)+0x5A827999+ROL32(v,5); w=ROL32(w,30); }\r
+#define _R1(v,w,x,y,z,i) { z+=((w&(x^y))^y)+SHABLK(i)+0x5A827999+ROL32(v,5); w=ROL32(w,30); }\r
+#define _R2(v,w,x,y,z,i) { z+=(w^x^y)+SHABLK(i)+0x6ED9EBA1+ROL32(v,5); w=ROL32(w,30); }\r
+#define _R3(v,w,x,y,z,i) { z+=(((w|x)&y)|(w&x))+SHABLK(i)+0x8F1BBCDC+ROL32(v,5); w=ROL32(w,30); }\r
+#define _R4(v,w,x,y,z,i) { z+=(w^x^y)+SHABLK(i)+0xCA62C1D6+ROL32(v,5); w=ROL32(w,30); }\r
 \r
 CSHA1::CSHA1()\r
 {\r
+       m_block = (SHA1_WORKSPACE_BLOCK *)m_workspace;\r
+\r
        Reset();\r
 }\r
 \r
@@ -30,7 +73,6 @@ CSHA1::~CSHA1()
        Reset();\r
 }\r
 \r
-\r
 void CSHA1::Reset()\r
 {\r
        // SHA1 initialization constants\r
@@ -44,45 +86,36 @@ void CSHA1::Reset()
        m_count[1] = 0;\r
 }\r
 \r
-void CSHA1::Transform(unsigned long state[5], unsigned char buffer[64])\r
+void CSHA1::Transform(UINT_32 *state, UINT_8 *buffer)\r
 {\r
-       unsigned long a = 0, b = 0, c = 0, d = 0, e = 0;\r
-\r
-       SHA1_WORKSPACE_BLOCK* block;\r
-       static unsigned char workspace[64];\r
-       block = (SHA1_WORKSPACE_BLOCK *)workspace;\r
-       memcpy(block, buffer, 64);\r
-\r
        // Copy state[] to working vars\r
-       a = state[0];\r
-       b = state[1];\r
-       c = state[2];\r
-       d = state[3];\r
-       e = state[4];\r
+       UINT_32 a = state[0], b = state[1], c = state[2], d = state[3], e = state[4];\r
+\r
+       memcpy(m_block, buffer, 64);\r
 \r
        // 4 rounds of 20 operations each. Loop unrolled.\r
-       R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);\r
-       R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);\r
-       R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);\r
-       R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);\r
-       R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);\r
-       R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);\r
-       R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);\r
-       R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);\r
-       R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);\r
-       R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);\r
-       R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);\r
-       R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);\r
-       R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);\r
-       R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);\r
-       R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);\r
-       R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);\r
-       R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);\r
-       R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);\r
-       R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);\r
-       R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);\r
-\r
-       // Add the working vars back into state[]\r
+       _R0(a,b,c,d,e, 0); _R0(e,a,b,c,d, 1); _R0(d,e,a,b,c, 2); _R0(c,d,e,a,b, 3);\r
+       _R0(b,c,d,e,a, 4); _R0(a,b,c,d,e, 5); _R0(e,a,b,c,d, 6); _R0(d,e,a,b,c, 7);\r
+       _R0(c,d,e,a,b, 8); _R0(b,c,d,e,a, 9); _R0(a,b,c,d,e,10); _R0(e,a,b,c,d,11);\r
+       _R0(d,e,a,b,c,12); _R0(c,d,e,a,b,13); _R0(b,c,d,e,a,14); _R0(a,b,c,d,e,15);\r
+       _R1(e,a,b,c,d,16); _R1(d,e,a,b,c,17); _R1(c,d,e,a,b,18); _R1(b,c,d,e,a,19);\r
+       _R2(a,b,c,d,e,20); _R2(e,a,b,c,d,21); _R2(d,e,a,b,c,22); _R2(c,d,e,a,b,23);\r
+       _R2(b,c,d,e,a,24); _R2(a,b,c,d,e,25); _R2(e,a,b,c,d,26); _R2(d,e,a,b,c,27);\r
+       _R2(c,d,e,a,b,28); _R2(b,c,d,e,a,29); _R2(a,b,c,d,e,30); _R2(e,a,b,c,d,31);\r
+       _R2(d,e,a,b,c,32); _R2(c,d,e,a,b,33); _R2(b,c,d,e,a,34); _R2(a,b,c,d,e,35);\r
+       _R2(e,a,b,c,d,36); _R2(d,e,a,b,c,37); _R2(c,d,e,a,b,38); _R2(b,c,d,e,a,39);\r
+       _R3(a,b,c,d,e,40); _R3(e,a,b,c,d,41); _R3(d,e,a,b,c,42); _R3(c,d,e,a,b,43);\r
+       _R3(b,c,d,e,a,44); _R3(a,b,c,d,e,45); _R3(e,a,b,c,d,46); _R3(d,e,a,b,c,47);\r
+       _R3(c,d,e,a,b,48); _R3(b,c,d,e,a,49); _R3(a,b,c,d,e,50); _R3(e,a,b,c,d,51);\r
+       _R3(d,e,a,b,c,52); _R3(c,d,e,a,b,53); _R3(b,c,d,e,a,54); _R3(a,b,c,d,e,55);\r
+       _R3(e,a,b,c,d,56); _R3(d,e,a,b,c,57); _R3(c,d,e,a,b,58); _R3(b,c,d,e,a,59);\r
+       _R4(a,b,c,d,e,60); _R4(e,a,b,c,d,61); _R4(d,e,a,b,c,62); _R4(c,d,e,a,b,63);\r
+       _R4(b,c,d,e,a,64); _R4(a,b,c,d,e,65); _R4(e,a,b,c,d,66); _R4(d,e,a,b,c,67);\r
+       _R4(c,d,e,a,b,68); _R4(b,c,d,e,a,69); _R4(a,b,c,d,e,70); _R4(e,a,b,c,d,71);\r
+       _R4(d,e,a,b,c,72); _R4(c,d,e,a,b,73); _R4(b,c,d,e,a,74); _R4(a,b,c,d,e,75);\r
+       _R4(e,a,b,c,d,76); _R4(d,e,a,b,c,77); _R4(c,d,e,a,b,78); _R4(b,c,d,e,a,79);\r
+\r
+       // Add the working vars back into state\r
        state[0] += a;\r
        state[1] += b;\r
        state[2] += c;\r
@@ -90,13 +123,15 @@ void CSHA1::Transform(unsigned long state[5], unsigned char buffer[64])
        state[4] += e;\r
 \r
        // Wipe variables\r
-       a = 0; b = 0; c = 0; d = 0; e = 0;\r
+#ifdef SHA1_WIPE_VARIABLES\r
+       a = b = c = d = e = 0;\r
+#endif\r
 }\r
 \r
 // Use this function to hash in binary data and strings\r
-void CSHA1::Update(unsigned char* data, unsigned int len)\r
+void CSHA1::Update(UINT_8 *data, UINT_32 len)\r
 {\r
-       unsigned long i = 0, j = 0;\r
+       UINT_32 i, j;\r
 \r
        j = (m_count[0] >> 3) & 63;\r
 \r
@@ -106,13 +141,11 @@ void CSHA1::Update(unsigned char* data, unsigned int len)
 \r
        if((j + len) > 63)\r
        {\r
-               memcpy(&m_buffer[j], data, (i = 64 - j));\r
+               i = 64 - j;\r
+               memcpy(&m_buffer[j], data, i);\r
                Transform(m_state, m_buffer);\r
 \r
-               for (; i+63 < len; i += 64)\r
-               {\r
-                       Transform(m_state, &data[i]);\r
-               }\r
+               for( ; i + 63 < len; i += 64) Transform(m_state, &data[i]);\r
 \r
                j = 0;\r
        }\r
@@ -121,51 +154,101 @@ void CSHA1::Update(unsigned char* data, unsigned int len)
        memcpy(&m_buffer[j], &data[i], len - i);\r
 }\r
 \r
+#ifdef SHA1_UTILITY_FUNCTIONS\r
+// Hash in file contents\r
+bool CSHA1::HashFile(char *szFileName)\r
+{\r
+       unsigned long ulFileSize, ulRest, ulBlocks;\r
+       unsigned long i;\r
+       UINT_8 uData[SHA1_MAX_FILE_BUFFER];\r
+       FILE *fIn;\r
+\r
+       if(szFileName == NULL) return false;\r
+\r
+       fIn = fopen(szFileName, "rb");\r
+       if(fIn == NULL) return false;\r
+\r
+       fseek(fIn, 0, SEEK_END);\r
+       ulFileSize = (unsigned long)ftell(fIn);\r
+       fseek(fIn, 0, SEEK_SET);\r
+\r
+       if(ulFileSize != 0)\r
+       {\r
+               ulBlocks = ulFileSize / SHA1_MAX_FILE_BUFFER;\r
+               ulRest = ulFileSize % SHA1_MAX_FILE_BUFFER;\r
+       }\r
+       else\r
+       {\r
+               ulBlocks = 0;\r
+               ulRest = 0;\r
+       }\r
+\r
+       for(i = 0; i < ulBlocks; i++)\r
+       {\r
+               fread(uData, 1, SHA1_MAX_FILE_BUFFER, fIn);\r
+               Update((UINT_8 *)uData, SHA1_MAX_FILE_BUFFER);\r
+       }\r
+\r
+       if(ulRest != 0)\r
+       {\r
+               fread(uData, 1, ulRest, fIn);\r
+               Update((UINT_8 *)uData, ulRest);\r
+       }\r
+\r
+       fclose(fIn); fIn = NULL;\r
+       return true;\r
+}\r
+#endif\r
+\r
 void CSHA1::Final()\r
 {\r
-       unsigned long i = 0, j = 0;\r
-       unsigned char finalcount[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };\r
+       UINT_32 i;\r
+       UINT_8 finalcount[8];\r
 \r
-       for (i = 0; i < 8; i++)\r
-               finalcount[i] = (unsigned char)((m_count[(i >= 4 ? 0 : 1)]\r
+       for(i = 0; i < 8; i++)\r
+               finalcount[i] = (UINT_8)((m_count[((i >= 4) ? 0 : 1)]\r
                        >> ((3 - (i & 3)) * 8) ) & 255); // Endian independent\r
 \r
-       Update((unsigned char *)"\200", 1);\r
+       Update((UINT_8 *)"\200", 1);\r
 \r
        while ((m_count[0] & 504) != 448)\r
-               Update((unsigned char *)"\0", 1);\r
+               Update((UINT_8 *)"\0", 1);\r
 \r
        Update(finalcount, 8); // Cause a SHA1Transform()\r
 \r
-       for (i = 0; i < 20; i++)\r
+       for(i = 0; i < 20; i++)\r
        {\r
-               m_digest[i] = (unsigned char)((m_state[i >> 2] >> ((3 - (i & 3)) * 8) ) & 255);\r
+               m_digest[i] = (UINT_8)((m_state[i >> 2] >> ((3 - (i & 3)) * 8) ) & 255);\r
        }\r
 \r
        // Wipe variables for security reasons\r
-       i = 0; j = 0;\r
+#ifdef SHA1_WIPE_VARIABLES\r
+       i = 0;\r
        memset(m_buffer, 0, 64);\r
        memset(m_state, 0, 20);\r
        memset(m_count, 0, 8);\r
        memset(finalcount, 0, 8);\r
-\r
        Transform(m_state, m_buffer);\r
+#endif\r
 }\r
 \r
+#ifdef SHA1_UTILITY_FUNCTIONS\r
 // Get the final hash as a pre-formatted string\r
 void CSHA1::ReportHash(char *szReport, unsigned char uReportType)\r
 {\r
-       unsigned char i = 0;\r
-       char szTemp[4];\r
+       unsigned char i;\r
+       char szTemp[16];\r
+\r
+       if(szReport == NULL) return;\r
 \r
        if(uReportType == REPORT_HEX)\r
        {\r
-               sprintf(szTemp, "%02x", m_digest[0]);\r
+               sprintf(szTemp, "%02X", m_digest[0]);\r
                strcat(szReport, szTemp);\r
 \r
                for(i = 1; i < 20; i++)\r
                {\r
-                       sprintf(szTemp, "%02x", m_digest[i]);\r
+                       sprintf(szTemp, "%02X", m_digest[i]);\r
                        strcat(szReport, szTemp);\r
                }\r
        }\r
@@ -176,15 +259,16 @@ void CSHA1::ReportHash(char *szReport, unsigned char uReportType)
 \r
                for(i = 1; i < 20; i++)\r
                {\r
-                       sprintf(szTemp, " %u", m_digest[i]);\r
+                       sprintf(szTemp, "%u", m_digest[i]);\r
                        strcat(szReport, szTemp);\r
                }\r
        }\r
        else strcpy(szReport, "Error: Unknown report type!");\r
 }\r
+#endif\r
 \r
 // Get the raw message digest\r
-void CSHA1::GetHash(unsigned char *uDest)\r
+void CSHA1::GetHash(UINT_8 *puDest)\r
 {\r
-       memcpy(uDest, m_digest, 20);\r
+       memcpy(puDest, m_digest, 20);\r
 }\r
diff --git a/sha1.h b/sha1.h
index 7cc52e8..e7ea00f 100644 (file)
--- a/sha1.h
+++ b/sha1.h
 /*\r
-       100% free public domain implementation of the SHA-1\r
-       algorithm by Dominik Reichl <Dominik.Reichl@tiscali.de>\r
-\r
-       * modified by Trevor Hogan for use with BNBT *\r
-\r
-       === Test Vectors (from FIPS PUB 180-1) ===\r
-\r
-       "abc"\r
+       100% free public domain implementation of the SHA-1 algorithm\r
+       by Dominik Reichl <dominik.reichl@t-online.de>\r
+       Web: http://www.dominik-reichl.de/\r
+\r
+       Version 1.6 - 2005-02-07 (thanks to Howard Kapustein for patches)\r
+       - You can set the endianness in your files, no need to modify the\r
+         header file of the CSHA1 class any more\r
+       - Aligned data support\r
+       - Made support/compilation of the utility functions (ReportHash\r
+         and HashFile) optional (useful, if bytes count, for example in\r
+         embedded environments)\r
+\r
+       Version 1.5 - 2005-01-01\r
+       - 64-bit compiler compatibility added\r
+       - Made variable wiping optional (define SHA1_WIPE_VARIABLES)\r
+       - Removed unnecessary variable initializations\r
+       - ROL32 improvement for the Microsoft compiler (using _rotl)\r
+\r
+       ======== Test Vectors (from FIPS PUB 180-1) ========\r
+\r
+       SHA1("abc") =\r
                A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D\r
 \r
-       "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"\r
+       SHA1("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") =\r
                84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1\r
 \r
-       A million repetitions of "a"\r
+       SHA1(A million repetitions of "a") =\r
                34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F\r
 */\r
 \r
-#ifndef ___SHA1_H___\r
-#define ___SHA1_H___\r
+#ifndef ___SHA1_HDR___\r
+#define ___SHA1_HDR___\r
 \r
-//\r
-// SOLARIS USERS - IF YOUR SYSTEM IS LITTLE ENDIAN, REMOVE THE NEXT 3 LINES\r
-//  also see bnbt.h\r
-//\r
-\r
-#if defined( __APPLE__ ) || defined( __SOLARIS__ )\r
- #define BNBT_BIG_ENDIAN\r
+#if !defined(SHA1_UTILITY_FUNCTIONS) && !defined(SHA1_NO_UTILITY_FUNCTIONS)\r
+#define SHA1_UTILITY_FUNCTIONS\r
 #endif\r
 \r
-#include <stdio.h> // Needed for file access\r
 #include <memory.h> // Needed for memset and memcpy\r
+\r
+#ifdef SHA1_UTILITY_FUNCTIONS\r
+#include <stdio.h>  // Needed for file access and sprintf\r
 #include <string.h> // Needed for strcat and strcpy\r
+#endif\r
+\r
+#ifdef _MSC_VER\r
+#include <stdlib.h>\r
+#endif\r
+\r
+// You can define the endian mode in your files, without modifying the SHA1\r
+// source files. Just #define SHA1_LITTLE_ENDIAN or #define SHA1_BIG_ENDIAN\r
+// in your files, before including the SHA1.h header file. If you don't\r
+// define anything, the class defaults to little endian.\r
+\r
+#if !defined(SHA1_LITTLE_ENDIAN) && !defined(SHA1_BIG_ENDIAN)\r
+#define SHA1_LITTLE_ENDIAN\r
+#endif\r
+\r
+// Same here. If you want variable wiping, #define SHA1_WIPE_VARIABLES, if\r
+// not, #define SHA1_NO_WIPE_VARIABLES. If you don't define anything, it\r
+// defaults to wiping.\r
+\r
+#if !defined(SHA1_WIPE_VARIABLES) && !defined(SHA1_NO_WIPE_VARIABLES)\r
+#define SHA1_WIPE_VARIABLES\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Define 8- and 32-bit variables\r
+\r
+#ifndef UINT_32\r
+\r
+#ifdef _MSC_VER\r
 \r
-#define MAX_FILE_READ_BUFFER 8000\r
+#define UINT_8  unsigned __int8\r
+#define UINT_32 unsigned __int32\r
+\r
+#else\r
+\r
+#define UINT_8 unsigned char\r
+\r
+#if (ULONG_MAX == 0xFFFFFFFF)\r
+#define UINT_32 unsigned long\r
+#else\r
+#define UINT_32 unsigned int\r
+#endif\r
+\r
+#endif\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Declare SHA1 workspace\r
+\r
+typedef union\r
+{\r
+       UINT_8  c[64];\r
+       UINT_32 l[16];\r
+} SHA1_WORKSPACE_BLOCK;\r
 \r
 class CSHA1\r
 {\r
 public:\r
-       // Rotate x bits to the left\r
-       #define ROL32(value, bits) (((value)<<(bits))|((value)>>(32-(bits))))\r
-\r
-       #ifdef BNBT_BIG_ENDIAN\r
-               #define SHABLK0(i) (block->l[i])\r
-       #else\r
-               #define SHABLK0(i) (block->l[i] = (ROL32(block->l[i],24) & 0xFF00FF00) \\r
-                       | (ROL32(block->l[i],8) & 0x00FF00FF))\r
-       #endif\r
-\r
-       #define SHABLK(i) (block->l[i&15] = ROL32(block->l[(i+13)&15] ^ block->l[(i+8)&15] \\r
-               ^ block->l[(i+2)&15] ^ block->l[i&15],1))\r
-\r
-       // SHA-1 rounds\r
-       #define R0(v,w,x,y,z,i) { z+=((w&(x^y))^y)+SHABLK0(i)+0x5A827999+ROL32(v,5); w=ROL32(w,30); }\r
-       #define R1(v,w,x,y,z,i) { z+=((w&(x^y))^y)+SHABLK(i)+0x5A827999+ROL32(v,5); w=ROL32(w,30); }\r
-       #define R2(v,w,x,y,z,i) { z+=(w^x^y)+SHABLK(i)+0x6ED9EBA1+ROL32(v,5); w=ROL32(w,30); }\r
-       #define R3(v,w,x,y,z,i) { z+=(((w|x)&y)|(w&x))+SHABLK(i)+0x8F1BBCDC+ROL32(v,5); w=ROL32(w,30); }\r
-       #define R4(v,w,x,y,z,i) { z+=(w^x^y)+SHABLK(i)+0xCA62C1D6+ROL32(v,5); w=ROL32(w,30); }\r
-\r
-       typedef union {\r
-               unsigned char c[64];\r
-               unsigned long l[16];\r
-       } SHA1_WORKSPACE_BLOCK;\r
-\r
+#ifdef SHA1_UTILITY_FUNCTIONS\r
        // Two different formats for ReportHash(...)\r
-       enum { REPORT_HEX = 0, REPORT_DIGIT = 1 };\r
+       enum\r
+       {\r
+               REPORT_HEX = 0,\r
+               REPORT_DIGIT = 1\r
+       };\r
+#endif\r
 \r
        // Constructor and Destructor\r
        CSHA1();\r
-       virtual ~CSHA1();\r
+       ~CSHA1();\r
 \r
-       unsigned long m_state[5];\r
-       unsigned long m_count[2];\r
-       unsigned char m_buffer[64];\r
-       unsigned char m_digest[20];\r
+       UINT_32 m_state[5];\r
+       UINT_32 m_count[2];\r
+       UINT_32 __reserved1[1];\r
+       UINT_8  m_buffer[64];\r
+       UINT_8  m_digest[20];\r
+       UINT_32 __reserved2[3];\r
 \r
        void Reset();\r
 \r
        // Update the hash value\r
-       void Update(unsigned char* data, unsigned int len);\r
+       void Update(UINT_8 *data, UINT_32 len);\r
+#ifdef SHA1_UTILITY_FUNCTIONS\r
+       bool HashFile(char *szFileName);\r
+#endif\r
 \r
        // Finalize hash and report\r
        void Final();\r
+\r
+       // Report functions: as pre-formatted and raw data\r
+#ifdef SHA1_UTILITY_FUNCTIONS\r
        void ReportHash(char *szReport, unsigned char uReportType = REPORT_HEX);\r
-       void GetHash(unsigned char *uDest);\r
+#endif\r
+       void GetHash(UINT_8 *puDest);\r
 \r
 private:\r
        // Private SHA-1 transformation\r
-       void Transform(unsigned long state[5], unsigned char buffer[64]);\r
+       void Transform(UINT_32 *state, UINT_8 *buffer);\r
+\r
+       // Member variables\r
+       UINT_8 m_workspace[64];\r
+       SHA1_WORKSPACE_BLOCK *m_block; // SHA1 pointer to the byte array above\r
 };\r
 \r
-#endif // ___SHA1_H___\r
+#endif\r