diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..6aa962a
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,47 @@
+# System Files
+*.DS_Store
+*Thumbs.db
+
+# Library
+src/3rdparty/md5/
+src/3rdparty/d3des/
+
+# Ignore build directories
+/build/
+/bin/
+/obj/
+/linux86/
+/src/linux/runsrvfil/runsrvfil.cgi
+/**/debug/
+/**/log/
+/**/normal/
+/**/profile/
+
+# Ignore object files and binaries
+*.o
+*.out
+*.a
+*.so
+*.exe
+*.dll
+
+# Ignore compiled libraries
+*.lib
+*.la
+*.lo
+
+# Ignore debug and profiling files
+*.dSYM/
+*.gcda
+*.gcno
+*.gcov
+
+# Ignore editor/IDE files
+*.swp
+*.swo
+*.vscode/
+*.idea/
+
+linux86
+*.zip
+*.tgz
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..498ea37
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,47 @@
+# System Files
+*.DS_Store
+*Thumbs.db
+
+# Library
+src/3rdparty/md5/
+src/3rdparty/d3des/
+
+# Ignore build directories
+/build/
+/bin/
+/obj/
+/linux86/
+/src/linux/runsrvfil/runsrvfil.cgi
+/**/debug/
+/**/log/
+/**/normal/
+/**/profile/
+
+# Ignore object files and binaries
+*.o
+*.out
+*.a
+*.so
+*.exe
+*.dll
+
+# Ignore compiled libraries
+*.lib
+*.la
+*.lo
+
+# Ignore debug and profiling files
+*.dSYM/
+*.gcda
+*.gcno
+*.gcov
+
+# Ignore editor/IDE files
+*.swp
+*.swo
+*.vscode/
+*.idea/
+
+linux86
+*.zip
+*.tgz
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 97fe9f9..a5e0fe5 100644
--- a/Makefile
+++ b/Makefile
@@ -7,6 +7,7 @@ all:
clean:
rm -f *.tgz *.zip
+ cd src/3rdparty; ./clean
cd src/linux; ./clean
bootstrap:
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..783ed62
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,16 @@
+services:
+ anet-server:
+ container_name: anet-server
+ platform: linux/amd64
+ image: anet-server:latest
+ build:
+ context: .
+ dockerfile: docker/Dockerfile
+ #entrypoint: ["/home/anet/bin/server"]
+ #entrypoint: ["sh", "-c", "ls /home/alink/etc"]
+ #entrypoint: ["sh", "-c", "cd /home/alink/etc && ./servfil"]
+ #entrypoint: ["sh", "-c", "cd /home/alink/anetmon && ./getservers.sh"]
+ #entrypoint: ["/bin/sh", "-ec", "sleep infinity"]
+ ports:
+ - 8080:8080/tcp
+ - 21157:21157/udp
\ No newline at end of file
diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 0000000..bf27663
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,123 @@
+# Build stage
+FROM debian:stable-slim AS build
+
+# Install necessary packages
+RUN apt-get update && apt-get install -y \
+ build-essential \
+ gcc \
+ make \
+ zip \
+ gzip \
+ libbsd-dev \
+ libc6-dev \
+ && rm -rf /var/lib/apt/lists/*
+
+
+# Select the architecture (assuming environment variables or ARG can determine this)
+ARG ARCHITECTURE=x86_64 # Default to x86_64 if not specified
+
+# Automatically detect architecture
+RUN ARCHITECTURE=$(uname -m) && \
+ if [ "$ARCHITECTURE" = "aarch64" ]; then \
+ ln -s /usr/lib/aarch64-linux-gnu/libm.a /usr/lib/libm.a && \
+ ln -s /usr/lib/aarch64-linux-gnu/libbsd.a /usr/lib/libbsd.a; \
+ elif [ "$ARCHITECTURE" = "x86_64" ]; then \
+ ln -s /usr/lib/x86_64-linux-gnu/libm.a /usr/lib/libm.a && \
+ ln -s /usr/lib/x86_64-linux-gnu/libbsd.a /usr/lib/libbsd.a; \
+ else \
+ echo "Unsupported architecture: $ARCHITECTURE"; exit 1; \
+ fi
+
+# Copy from build stage using the variable
+WORKDIR /build
+
+# Define build directory
+ENV APP_DIR=/build/linux86
+
+# Copy only necessary files first (to leverage caching)
+COPY Makefile ./
+COPY src ./src
+COPY demo ./demo
+COPY h ./h
+
+# Compile (invalidates cache only when source files change)
+RUN make
+
+# Runtime stage
+FROM debian:stable-slim
+
+# Install cron and wget
+RUN apt-get update && \
+ apt-get install -y cron wget apache2 procps sudo supervisor && \
+ rm -rf /var/lib/apt/lists/*
+
+# Set environment variable
+ENV BUILD_DIR=/build/linux86
+ENV APP_DIR=/home/anet
+
+# Copy from build stage using the variable
+COPY --from=build $BUILD_DIR $APP_DIR
+
+# Create non-root user
+RUN useradd -m alink
+
+# Sudo
+#RUN apt-get update && \
+# apt-get install -y csudo && \
+# rm -rf /var/lib/apt/lists/*
+#RUN echo 'alink:darkreign' | chpasswd
+#RUN usermod -aG sudo alink
+
+# Set proper permissions for the user
+RUN chown -R alink:alink $APP_DIR
+
+RUN mv $APP_DIR/anetmon/ /home/alink/
+RUN mv $APP_DIR/server/etc /home/alink/
+
+# Set proper permissions for cron
+RUN chmod gu+rw /var/run
+RUN chmod gu+s /usr/sbin/cron
+
+# Install crontab for the game server user
+RUN crontab -u alink /home/alink/etc/crontab2.lst
+
+# Configure Apache Directory public_html
+RUN mkdir -p /home/alink/public_html && \
+ chown -R alink: /home/alink/public_html
+
+# Configure Apache user
+RUN chown -R alink: /var/log/apache2/ && \
+ sed -i 's/APACHE_RUN_USER=www-data/APACHE_RUN_USER=alink/' /etc/apache2/envvars && \
+ sed -i 's/APACHE_RUN_GROUP=www-data/APACHE_RUN_GROUP=alink/' /etc/apache2/envvars
+
+COPY docker/apache2.conf /etc/apache2/conf-available/anet2.conf
+RUN a2enconf anet2 && \
+ a2enmod cgid && \
+ sed -i 's/Listen 80/Listen 8080/g' /etc/apache2/ports.conf
+
+# Copy supervisor configuration file
+COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
+RUN chown -R alink /var/log/supervisor/
+RUN chown -R alink /run
+
+# Switch to non-root user
+USER alink
+
+WORKDIR /home/alink
+
+# Ports > 21157 since we're not root.
+EXPOSE 21157/udp
+EXPOSE 8080/tcp
+
+HEALTHCHECK --interval=1m --start-period=30s --start-interval=5s --timeout=2s \
+ CMD ps auxww | grep 'alink.*anet3'
+
+# Entrypoint
+COPY docker/entrypoint.sh /opt/local/bin/entrypoint.sh
+ENTRYPOINT ["/opt/local/bin/entrypoint.sh"]
+
+# Switch to non-root user
+USER alink
+
+# Use supervisor as the main process
+CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
\ No newline at end of file
diff --git a/docker/apache2.conf b/docker/apache2.conf
new file mode 100644
index 0000000..9200755
--- /dev/null
+++ b/docker/apache2.conf
@@ -0,0 +1,10 @@
+ServerName 0.0.0.0
+Alias /anet2 /home/alink/public_html/
+
+ Options FollowSymLinks ExecCGI Indexes
+ AllowOverride None
+ Require all granted
+
+ SetHandler cgi-script
+
+
\ No newline at end of file
diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh
new file mode 100755
index 0000000..6de77f9
--- /dev/null
+++ b/docker/entrypoint.sh
@@ -0,0 +1,37 @@
+#!/bin/bash -e
+
+# Create local-servers.txt and populate it with an IP and hostname
+echo "- Create local-servers.txt..."
+HOSTNAME="${HOSTNAME:=localhost}"
+export EXTERNAL_IP_EXEC_SET=`wget -qO- https://checkip.amazonaws.com`
+echo "${EXTERNAL_IP_EXEC_SET} $HOSTNAME" > /home/alink/etc/local-servers.txt
+cat /home/alink/etc/local-servers.txt
+
+touch /tmp/anet3srv.log
+touch /tmp/anet2cron.log
+
+echo "- Execute servfil..."
+cd ~/etc
+./servfil
+
+# Deploy public_html/etc
+echo "- Deploy public_html/etc"
+cd ~/public_html
+mkdir -p etc
+cd etc
+ln -s ~alink/etc/apps.txt apps.txt
+ln -s ~alink/etc/names.txt names.txt
+ln -s ~alink/etc/servers.txt servers.txt
+ln -s ~alink/etc/types.txt types.txt
+
+# Deploy runsrvfil.cgi
+echo "- Deploy runsrvfil.cgi..."
+cd ~/public_html/etc
+cp ../../etc/runsrvfil.cgi .
+chmod ug+sx runsrvfil.cgi
+
+echo "- Start game server daemon..."
+~alink/etc/start2
+
+echo executing: "$@"
+exec "$@"
\ No newline at end of file
diff --git a/docker/supervisord.conf b/docker/supervisord.conf
new file mode 100644
index 0000000..d8da7c8
--- /dev/null
+++ b/docker/supervisord.conf
@@ -0,0 +1,53 @@
+[supervisord]
+nodaemon=true
+user=alink
+logfile=/var/log/supervisor/supervisord.log
+pidfile=/var/run/supervisord.pid
+
+[program:anet3srv-log]
+command=tail -F /tmp/anet3srv.log
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+redirect_stderr=true
+user=alink
+priority=10
+
+[program:anet2cron-log]
+command=tail -F /tmp/anet2cron.log
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+redirect_stderr=true
+user=alink
+priority=10
+
+[program:apache2]
+command=/usr/sbin/apache2ctl -DFOREGROUND
+autostart=true
+autorestart=true
+user=alink
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0
+priority=20
+
+[program:cron]
+command=/usr/sbin/cron -f
+autostart=true
+autorestart=true
+user=alink
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0
+priority=30
+
+[unix_http_server]
+file=/var/run/supervisor.sock
+chmod=0700
+
+[rpcinterface:supervisor]
+supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
+
+[supervisorctl]
+serverurl=unix:///var/run/supervisor.sock
\ No newline at end of file
diff --git a/src/3rdparty/clean b/src/3rdparty/clean
new file mode 100755
index 0000000..96839a8
--- /dev/null
+++ b/src/3rdparty/clean
@@ -0,0 +1,2 @@
+rm -fr ./d3des
+rm -fr ./md5
\ No newline at end of file
diff --git a/src/3rdparty/d3des/d3des.c b/src/3rdparty/d3des/d3des.c
deleted file mode 100644
index cf3d27d..0000000
--- a/src/3rdparty/d3des/d3des.c
+++ /dev/null
@@ -1,684 +0,0 @@
-/* D3DES (V5.09) -
- *
- * A portable, public domain, version of the Data Encryption Standard.
- *
- * Written with Symantec's THINK (Lightspeed) C by Richard Outerbridge.
- * Thanks to: Dan Hoey for his excellent Initial and Inverse permutation
- * code; Jim Gillogly & Phil Karn for the DES key schedule code; Dennis
- * Ferguson, Eric Young and Dana How for comparing notes; and Ray Lau,
- * for humouring me on.
- *
- * Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge.
- * (GEnie : OUTER; CIS : [71755,204]) Graven Imagery, 1992.
- */
-
-#include "d3des.h"
-
-static void scrunch(const unsigned char *, unsigned long *);
-static void unscrun(unsigned long *, unsigned char *);
-static void desfunc(unsigned long *, unsigned long *);
-static void cookey(unsigned long *);
-
-static unsigned long KnL[32] = { 0L };
-static unsigned long KnR[32] = { 0L };
-static unsigned long Kn3[32] = { 0L };
-static unsigned char Df_Key[24] = {
- 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,
- 0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,
- 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 };
-
-static unsigned short bytebit[8] = {
- 0200, 0100, 040, 020, 010, 04, 02, 01 };
-
-static unsigned long bigbyte[24] = {
- 0x800000L, 0x400000L, 0x200000L, 0x100000L,
- 0x80000L, 0x40000L, 0x20000L, 0x10000L,
- 0x8000L, 0x4000L, 0x2000L, 0x1000L,
- 0x800L, 0x400L, 0x200L, 0x100L,
- 0x80L, 0x40L, 0x20L, 0x10L,
- 0x8L, 0x4L, 0x2L, 0x1L };
-
-/* Use the key schedule specified in the Standard (ANSI X3.92-1981). */
-
-static unsigned char pc1[56] = {
- 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,
- 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,
- 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21,
- 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 };
-
-static unsigned char totrot[16] = {
- 1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 };
-
-static unsigned char pc2[48] = {
- 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
- 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,
- 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
- 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 };
-
-void deskey(key, edf) /* Thanks to James Gillogly & Phil Karn! */
-const unsigned char *key;
-short edf;
-{
- register int i, j, l, m, n;
- unsigned char pc1m[56], pcr[56];
- unsigned long kn[32];
-
- for ( j = 0; j < 56; j++ ) {
- l = pc1[j];
- m = l & 07;
- pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0;
- }
- for( i = 0; i < 16; i++ ) {
- if( edf == DE1 ) m = (15 - i) << 1;
- else m = i << 1;
- n = m + 1;
- kn[m] = kn[n] = 0L;
- for( j = 0; j < 28; j++ ) {
- l = j + totrot[i];
- if( l < 28 ) pcr[j] = pc1m[l];
- else pcr[j] = pc1m[l - 28];
- }
- for( j = 28; j < 56; j++ ) {
- l = j + totrot[i];
- if( l < 56 ) pcr[j] = pc1m[l];
- else pcr[j] = pc1m[l - 28];
- }
- for( j = 0; j < 24; j++ ) {
- if( pcr[pc2[j]] ) kn[m] |= bigbyte[j];
- if( pcr[pc2[j+24]] ) kn[n] |= bigbyte[j];
- }
- }
- cookey(kn);
- return;
- }
-
-static void cookey(raw1)
-register unsigned long *raw1;
-{
- register unsigned long *cook, *raw0;
- unsigned long dough[32];
- register int i;
-
- cook = dough;
- for( i = 0; i < 16; i++, raw1++ ) {
- raw0 = raw1++;
- *cook = (*raw0 & 0x00fc0000L) << 6;
- *cook |= (*raw0 & 0x00000fc0L) << 10;
- *cook |= (*raw1 & 0x00fc0000L) >> 10;
- *cook++ |= (*raw1 & 0x00000fc0L) >> 6;
- *cook = (*raw0 & 0x0003f000L) << 12;
- *cook |= (*raw0 & 0x0000003fL) << 16;
- *cook |= (*raw1 & 0x0003f000L) >> 4;
- *cook++ |= (*raw1 & 0x0000003fL);
- }
- usekey(dough);
- return;
- }
-
-void cpkey(into)
-register unsigned long *into;
-{
- register unsigned long *from, *endp;
-
- from = KnL, endp = &KnL[32];
- while( from < endp ) *into++ = *from++;
- return;
- }
-
-void usekey(from)
-register unsigned long *from;
-{
- register unsigned long *to, *endp;
-
- to = KnL, endp = &KnL[32];
- while( to < endp ) *to++ = *from++;
- return;
- }
-
-void des(inblock, outblock)
-unsigned char *inblock, *outblock;
-{
- unsigned long work[2];
-
- scrunch(inblock, work);
- desfunc(work, KnL);
- unscrun(work, outblock);
- return;
- }
-
-static void scrunch(outof, into)
-register const unsigned char *outof;
-register unsigned long *into;
-{
- *into = (*outof++ & 0xffL) << 24;
- *into |= (*outof++ & 0xffL) << 16;
- *into |= (*outof++ & 0xffL) << 8;
- *into++ |= (*outof++ & 0xffL);
- *into = (*outof++ & 0xffL) << 24;
- *into |= (*outof++ & 0xffL) << 16;
- *into |= (*outof++ & 0xffL) << 8;
- *into |= (*outof & 0xffL);
- return;
- }
-
-static void unscrun(outof, into)
-register unsigned long *outof;
-register unsigned char *into;
-{
- *into++ = (*outof >> 24) & 0xffL;
- *into++ = (*outof >> 16) & 0xffL;
- *into++ = (*outof >> 8) & 0xffL;
- *into++ = *outof++ & 0xffL;
- *into++ = (*outof >> 24) & 0xffL;
- *into++ = (*outof >> 16) & 0xffL;
- *into++ = (*outof >> 8) & 0xffL;
- *into = *outof & 0xffL;
- return;
- }
-
-static unsigned long SP1[64] = {
- 0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L,
- 0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L,
- 0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L,
- 0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L,
- 0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L,
- 0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L,
- 0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L,
- 0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L,
- 0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L,
- 0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L,
- 0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L,
- 0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L,
- 0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L,
- 0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L,
- 0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L,
- 0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L };
-
-static unsigned long SP2[64] = {
- 0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L,
- 0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L,
- 0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L,
- 0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L,
- 0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L,
- 0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L,
- 0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L,
- 0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L,
- 0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L,
- 0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L,
- 0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L,
- 0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L,
- 0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L,
- 0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L,
- 0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L,
- 0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L };
-
-static unsigned long SP3[64] = {
- 0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L,
- 0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L,
- 0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L,
- 0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L,
- 0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L,
- 0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L,
- 0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L,
- 0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L,
- 0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L,
- 0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L,
- 0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L,
- 0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L,
- 0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L,
- 0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L,
- 0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L,
- 0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L };
-
-static unsigned long SP4[64] = {
- 0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
- 0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L,
- 0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L,
- 0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L,
- 0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L,
- 0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L,
- 0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L,
- 0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L,
- 0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L,
- 0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L,
- 0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L,
- 0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
- 0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L,
- 0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L,
- 0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L,
- 0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L };
-
-static unsigned long SP5[64] = {
- 0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L,
- 0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L,
- 0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L,
- 0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L,
- 0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L,
- 0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L,
- 0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L,
- 0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L,
- 0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L,
- 0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L,
- 0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L,
- 0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L,
- 0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L,
- 0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L,
- 0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L,
- 0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L };
-
-static unsigned long SP6[64] = {
- 0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L,
- 0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L,
- 0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L,
- 0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L,
- 0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L,
- 0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L,
- 0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L,
- 0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L,
- 0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L,
- 0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L,
- 0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L,
- 0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L,
- 0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L,
- 0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L,
- 0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L,
- 0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L };
-
-static unsigned long SP7[64] = {
- 0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L,
- 0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L,
- 0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L,
- 0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L,
- 0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L,
- 0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L,
- 0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L,
- 0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L,
- 0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L,
- 0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L,
- 0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L,
- 0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L,
- 0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L,
- 0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L,
- 0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L,
- 0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L };
-
-static unsigned long SP8[64] = {
- 0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L,
- 0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L,
- 0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L,
- 0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L,
- 0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L,
- 0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L,
- 0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L,
- 0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L,
- 0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L,
- 0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L,
- 0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L,
- 0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L,
- 0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L,
- 0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L,
- 0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L,
- 0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L };
-
-static void desfunc(block, keys)
-register unsigned long *block, *keys;
-{
- register unsigned long fval, work, right, leftt;
- register int round;
-
- leftt = block[0];
- right = block[1];
- work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL;
- right ^= work;
- leftt ^= (work << 4);
- work = ((leftt >> 16) ^ right) & 0x0000ffffL;
- right ^= work;
- leftt ^= (work << 16);
- work = ((right >> 2) ^ leftt) & 0x33333333L;
- leftt ^= work;
- right ^= (work << 2);
- work = ((right >> 8) ^ leftt) & 0x00ff00ffL;
- leftt ^= work;
- right ^= (work << 8);
- right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL;
- work = (leftt ^ right) & 0xaaaaaaaaL;
- leftt ^= work;
- right ^= work;
- leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL;
-
- for( round = 0; round < 8; round++ ) {
- work = (right << 28) | (right >> 4);
- work ^= *keys++;
- fval = SP7[ work & 0x3fL];
- fval |= SP5[(work >> 8) & 0x3fL];
- fval |= SP3[(work >> 16) & 0x3fL];
- fval |= SP1[(work >> 24) & 0x3fL];
- work = right ^ *keys++;
- fval |= SP8[ work & 0x3fL];
- fval |= SP6[(work >> 8) & 0x3fL];
- fval |= SP4[(work >> 16) & 0x3fL];
- fval |= SP2[(work >> 24) & 0x3fL];
- leftt ^= fval;
- work = (leftt << 28) | (leftt >> 4);
- work ^= *keys++;
- fval = SP7[ work & 0x3fL];
- fval |= SP5[(work >> 8) & 0x3fL];
- fval |= SP3[(work >> 16) & 0x3fL];
- fval |= SP1[(work >> 24) & 0x3fL];
- work = leftt ^ *keys++;
- fval |= SP8[ work & 0x3fL];
- fval |= SP6[(work >> 8) & 0x3fL];
- fval |= SP4[(work >> 16) & 0x3fL];
- fval |= SP2[(work >> 24) & 0x3fL];
- right ^= fval;
- }
-
- right = (right << 31) | (right >> 1);
- work = (leftt ^ right) & 0xaaaaaaaaL;
- leftt ^= work;
- right ^= work;
- leftt = (leftt << 31) | (leftt >> 1);
- work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
- right ^= work;
- leftt ^= (work << 8);
- work = ((leftt >> 2) ^ right) & 0x33333333L;
- right ^= work;
- leftt ^= (work << 2);
- work = ((right >> 16) ^ leftt) & 0x0000ffffL;
- leftt ^= work;
- right ^= (work << 16);
- work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
- leftt ^= work;
- right ^= (work << 4);
- *block++ = right;
- *block = leftt;
- return;
- }
-
-#ifdef D2_DES
-
-void des2key(hexkey, mode) /* stomps on Kn3 too */
-const unsigned char *hexkey; /* unsigned char[16] */
-short mode;
-{
- short revmod;
-
- revmod = (mode == EN0) ? DE1 : EN0;
- deskey(&hexkey[8], revmod);
- cpkey(KnR);
- deskey(hexkey, mode);
- cpkey(Kn3); /* Kn3 = KnL */
- return;
- }
-
-void Ddes(from, into)
-const unsigned char *from; /* unsigned char[8] */
-unsigned char *into; /* unsigned char[8] */
-{
- unsigned long work[2];
-
- scrunch(from, work);
- desfunc(work, KnL);
- desfunc(work, KnR);
- desfunc(work, Kn3);
- unscrun(work, into);
- return;
- }
-
-void D2des(from, into)
-const unsigned char *from; /* unsigned char[16] */
-unsigned char *into; /* unsigned char[16] */
-{
- unsigned long *right, *l1, swap;
- unsigned long leftt[2], bufR[2];
-
- right = bufR;
- l1 = &leftt[1];
- scrunch(from, leftt);
- scrunch(&from[8], right);
- desfunc(leftt, KnL);
- desfunc(right, KnL);
- swap = *l1;
- *l1 = *right;
- *right = swap;
- desfunc(leftt, KnR);
- desfunc(right, KnR);
- swap = *l1;
- *l1 = *right;
- *right = swap;
- desfunc(leftt, Kn3);
- desfunc(right, Kn3);
- unscrun(leftt, into);
- unscrun(right, &into[8]);
- return;
- }
-
-void makekey(aptr, kptr)
-register char *aptr; /* NULL-terminated */
-register unsigned char *kptr; /* unsigned char[8] */
-{
- register unsigned char *store;
- register int first, i;
- unsigned long savek[96];
-
- cpDkey(savek);
- des2key(Df_Key, EN0);
- for( i = 0; i < 8; i++ ) kptr[i] = Df_Key[i];
- first = 1;
- while( (*aptr != '\0') || first ) {
- store = kptr;
- for( i = 0; i < 8 && (*aptr != '\0'); i++ ) {
- *store++ ^= *aptr & 0x7f;
- *aptr++ = '\0';
- }
- Ddes(kptr, kptr);
- first = 0;
- }
- useDkey(savek);
- return;
- }
-
-void make2key(aptr, kptr)
-register char *aptr; /* NULL-terminated */
-register unsigned char *kptr; /* unsigned char[16] */
-{
- register unsigned char *store;
- register int first, i;
- unsigned long savek[96];
-
- cpDkey(savek);
- des2key(Df_Key, EN0);
- for( i = 0; i < 16; i++ ) kptr[i] = Df_Key[i];
- first = 1;
- while( (*aptr != '\0') || first ) {
- store = kptr;
- for( i = 0; i < 16 && (*aptr != '\0'); i++ ) {
- *store++ ^= *aptr & 0x7f;
- *aptr++ = '\0';
- }
- D2des(kptr, kptr);
- first = 0;
- }
- useDkey(savek);
- return;
- }
-
-#ifndef D3_DES /* D2_DES only */
-#ifdef D2_DES /* iff D2_DES! */
-
-void cp2key(into)
-register unsigned long *into; /* unsigned long[64] */
-{
- register unsigned long *from, *endp;
-
- cpkey(into);
- into = &into[32];
- from = KnR, endp = &KnR[32];
- while( from < endp ) *into++ = *from++;
- return;
- }
-
-void use2key(from) /* stomps on Kn3 too */
-register unsigned long *from; /* unsigned long[64] */
-{
- register unsigned long *to, *endp;
-
- usekey(from);
- from = &from[32];
- to = KnR, endp = &KnR[32];
- while( to < endp ) *to++ = *from++;
- cpkey(Kn3); /* Kn3 = KnL */
- return;
- }
-
-#endif /* iff D2_DES */
-#else /* D3_DES too */
-
-static void D3des(unsigned char *, unsigned char *);
-
-void des3key(hexkey, mode)
-unsigned char *hexkey; /* unsigned char[24] */
-short mode;
-{
- unsigned char *first, *third;
- short revmod;
-
- if( mode == EN0 ) {
- revmod = DE1;
- first = hexkey;
- third = &hexkey[16];
- }
- else {
- revmod = EN0;
- first = &hexkey[16];
- third = hexkey;
- }
- deskey(&hexkey[8], revmod);
- cpkey(KnR);
- deskey(third, mode);
- cpkey(Kn3);
- deskey(first, mode);
- return;
- }
-
-void cp3key(into)
-register unsigned long *into; /* unsigned long[96] */
-{
- register unsigned long *from, *endp;
-
- cpkey(into);
- into = &into[32];
- from = KnR, endp = &KnR[32];
- while( from < endp ) *into++ = *from++;
- from = Kn3, endp = &Kn3[32];
- while( from < endp ) *into++ = *from++;
- return;
- }
-
-void use3key(from)
-register unsigned long *from; /* unsigned long[96] */
-{
- register unsigned long *to, *endp;
-
- usekey(from);
- from = &from[32];
- to = KnR, endp = &KnR[32];
- while( to < endp ) *to++ = *from++;
- to = Kn3, endp = &Kn3[32];
- while( to < endp ) *to++ = *from++;
- return;
- }
-
-static void D3des(from, into) /* amateur theatrics */
-unsigned char *from; /* unsigned char[24] */
-unsigned char *into; /* unsigned char[24] */
-{
- unsigned long swap, leftt[2], middl[2], right[2];
-
- scrunch(from, leftt);
- scrunch(&from[8], middl);
- scrunch(&from[16], right);
- desfunc(leftt, KnL);
- desfunc(middl, KnL);
- desfunc(right, KnL);
- swap = leftt[1];
- leftt[1] = middl[0];
- middl[0] = swap;
- swap = middl[1];
- middl[1] = right[0];
- right[0] = swap;
- desfunc(leftt, KnR);
- desfunc(middl, KnR);
- desfunc(right, KnR);
- swap = leftt[1];
- leftt[1] = middl[0];
- middl[0] = swap;
- swap = middl[1];
- middl[1] = right[0];
- right[0] = swap;
- desfunc(leftt, Kn3);
- desfunc(middl, Kn3);
- desfunc(right, Kn3);
- unscrun(leftt, into);
- unscrun(middl, &into[8]);
- unscrun(right, &into[16]);
- return;
- }
-
-void make3key(aptr, kptr)
-register char *aptr; /* NULL-terminated */
-register unsigned char *kptr; /* unsigned char[24] */
-{
- register unsigned char *store;
- register int first, i;
- unsigned long savek[96];
-
- cp3key(savek);
- des3key(Df_Key, EN0);
- for( i = 0; i < 24; i++ ) kptr[i] = Df_Key[i];
- first = 1;
- while( (*aptr != '\0') || first ) {
- store = kptr;
- for( i = 0; i < 24 && (*aptr != '\0'); i++ ) {
- *store++ ^= *aptr & 0x7f;
- *aptr++ = '\0';
- }
- D3des(kptr, kptr);
- first = 0;
- }
- use3key(savek);
- return;
- }
-
-#endif /* D3_DES */
-#endif /* D2_DES */
-
-/* Validation sets:
- *
- * Single-length key, single-length plaintext -
- * Key : 0123 4567 89ab cdef
- * Plain : 0123 4567 89ab cde7
- * Cipher : c957 4425 6a5e d31d
- *
- * Double-length key, single-length plaintext -
- * Key : 0123 4567 89ab cdef fedc ba98 7654 3210
- * Plain : 0123 4567 89ab cde7
- * Cipher : 7f1d 0a77 826b 8aff
- *
- * Double-length key, double-length plaintext -
- * Key : 0123 4567 89ab cdef fedc ba98 7654 3210
- * Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
- * Cipher : 27a0 8440 406a df60 278f 47cf 42d6 15d7
- *
- * Triple-length key, single-length plaintext -
- * Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
- * Plain : 0123 4567 89ab cde7
- * Cipher : de0b 7c06 ae5e 0ed5
- *
- * Triple-length key, double-length plaintext -
- * Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
- * Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
- * Cipher : ad0d 1b30 ac17 cf07 0ed1 1c63 81e4 4de5
- *
- * d3des V5.0a rwo 9208.07 18:44 Graven Imagery
- **********************************************************************/
diff --git a/src/3rdparty/d3des/d3des.h b/src/3rdparty/d3des/d3des.h
deleted file mode 100644
index f998602..0000000
--- a/src/3rdparty/d3des/d3des.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/* d3des.h -
- *
- * Headers and defines for d3des.c
- * Graven Imagery, 1992.
- *
- * Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge
- * (GEnie : OUTER; CIS : [71755,204])
- */
-
-#define D2_DES /* include double-length support */
-#define D3_DES /* include triple-length support */
-
-#ifdef D3_DES
-#ifndef D2_DES
-#define D2_DES /* D2_DES is needed for D3_DES */
-#endif
-#endif
-
-#define EN0 0 /* MODE == encrypt */
-#define DE1 1 /* MODE == decrypt */
-
-/* A useful alias on 68000-ish machines, but NOT USED HERE. */
-
-typedef union {
- unsigned long blok[2];
- unsigned short word[4];
- unsigned char byte[8];
- } M68K;
-
-extern void deskey(const unsigned char *, short);
-/* hexkey[8] MODE
- * Sets the internal key register according to the hexadecimal
- * key contained in the 8 bytes of hexkey, according to the DES,
- * for encryption or decryption according to MODE.
- */
-
-extern void usekey(unsigned long *);
-/* cookedkey[32]
- * Loads the internal key register with the data in cookedkey.
- */
-
-extern void cpkey(unsigned long *);
-/* cookedkey[32]
- * Copies the contents of the internal key register into the storage
- * located at &cookedkey[0].
- */
-
-extern void des(unsigned char *, unsigned char *);
-/* from[8] to[8]
- * Encrypts/Decrypts (according to the key currently loaded in the
- * internal key register) one block of eight bytes at address 'from'
- * into the block at address 'to'. They can be the same.
- */
-
-#ifdef D2_DES
-
-#define desDkey(a,b) des2key((a),(b))
-extern void des2key(const unsigned char *, short);
-/* hexkey[16] MODE
- * Sets the internal key registerS according to the hexadecimal
- * keyS contained in the 16 bytes of hexkey, according to the DES,
- * for DOUBLE encryption or decryption according to MODE.
- * NOTE: this clobbers all three key registers!
- */
-
-extern void Ddes(const unsigned char *, unsigned char *);
-/* from[8] to[8]
- * Encrypts/Decrypts (according to the keyS currently loaded in the
- * internal key registerS) one block of eight bytes at address 'from'
- * into the block at address 'to'. They can be the same.
- */
-
-extern void D2des(const unsigned char *, unsigned char *);
-/* from[16] to[16]
- * Encrypts/Decrypts (according to the keyS currently loaded in the
- * internal key registerS) one block of SIXTEEN bytes at address 'from'
- * into the block at address 'to'. They can be the same.
- */
-
-extern void makekey(char *, unsigned char *);
-/* *password, single-length key[8]
- * With a double-length default key, this routine hashes a NULL-terminated
- * string into an eight-byte random-looking key, suitable for use with the
- * deskey() routine.
- */
-
-#define makeDkey(a,b) make2key((a),(b))
-extern void make2key(char *, unsigned char *);
-/* *password, double-length key[16]
- * With a double-length default key, this routine hashes a NULL-terminated
- * string into a sixteen-byte random-looking key, suitable for use with the
- * des2key() routine.
- */
-
-#ifndef D3_DES /* D2_DES only */
-
-#define useDkey(a) use2key((a))
-#define cpDkey(a) cp2key((a))
-
-extern void use2key(unsigned long *);
-/* cookedkey[64]
- * Loads the internal key registerS with the data in cookedkey.
- * NOTE: this clobbers all three key registers!
- */
-
-extern void cp2key(unsigned long *);
-/* cookedkey[64]
- * Copies the contents of the internal key registerS into the storage
- * located at &cookedkey[0].
- */
-
-#else /* D3_DES too */
-
-#define useDkey(a) use3key((a))
-#define cpDkey(a) cp3key((a))
-
-extern void des3key(unsigned char *, short);
-/* hexkey[24] MODE
- * Sets the internal key registerS according to the hexadecimal
- * keyS contained in the 24 bytes of hexkey, according to the DES,
- * for DOUBLE encryption or decryption according to MODE.
- */
-
-extern void use3key(unsigned long *);
-/* cookedkey[96]
- * Loads the 3 internal key registerS with the data in cookedkey.
- */
-
-extern void cp3key(unsigned long *);
-/* cookedkey[96]
- * Copies the contents of the 3 internal key registerS into the storage
- * located at &cookedkey[0].
- */
-
-extern void make3key(char *, unsigned char *);
-/* *password, triple-length key[24]
- * With a triple-length default key, this routine hashes a NULL-terminated
- * string into a twenty-four-byte random-looking key, suitable for use with
- * the des3key() routine.
- */
-
-#endif /* D3_DES */
-#endif /* D2_DES */
-
-/* d3des.h V5.09 rwo 9208.04 15:06 Graven Imagery
- ********************************************************************/
diff --git a/src/3rdparty/d3des/readme b/src/3rdparty/d3des/readme
deleted file mode 100644
index 42ad9f9..0000000
--- a/src/3rdparty/d3des/readme
+++ /dev/null
@@ -1,7 +0,0 @@
-This code by Richard Outerbridge implements DES with optional
-double and triple encryption. I think it's pretty fast, and
-it doesn't take up much memory at runtime.
-Richard leaves a copyright notice on the code but encourages
-free use of the code.
-
-Mark Riordan mrr@scss3.cl.msu.edu
diff --git a/src/3rdparty/d3des/unpacked b/src/3rdparty/d3des/unpacked
deleted file mode 100644
index e69de29..0000000
diff --git a/src/3rdparty/md5/Makefile b/src/3rdparty/md5/Makefile
deleted file mode 100644
index e0f60c8..0000000
--- a/src/3rdparty/md5/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-# This makefile compiles the source code for the "RSA Data Security, Inc.
-# MD5 Message-Digest Algorithm" as found in RFC 1321. That code is copyrighted:
-#
-# Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991.
-# All rights reserved.
-#
-# See the source code for copyright restrictions.
-#
-# No "makefile" is provided in the RFC.
-# This one was written by Jim Ellis (jte@cert.org) for convenience.
-
-CC = gcc
-
-# Note: a bug in mddriver causes "MD" to default to an incorrect value,
-# so we set it to "5" here.
-CFLAGS = -O -DMD=5
-
-md5: md5c.o mddriver.o
- $(CC) -o md5 md5c.o mddriver.o
-
-mddriver.o: global.h md5.h
- $(CC) -c $(CFLAGS) mddriver.c
-
-md5c.o: global.h md5.h
- $(CC) -c $(CFLAGS) md5c.c
-
-test: md5 test.rfc
- -./md5 -x | diff - test.rfc > diffs 2>&1
- @-if test -s diffs ; then echo '*** MD5 TEST FAILED'; cat diffs; else echo '*** MD5 Test Passed'; fi
- rm -f diffs
-
-# test.rfc is taken from Appendix 5 of RFC 1321.
-test.rfc:
- echo 'MD5 test suite:' > test.rfc
- echo 'MD5 ("") = d41d8cd98f00b204e9800998ecf8427e' >> test.rfc
- echo 'MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661' >> test.rfc
- echo 'MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72' >> test.rfc
- echo 'MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0' >> test.rfc
- echo 'MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b' >> test.rfc
- echo 'MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f' >> test.rfc
- echo 'MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a' >> test.rfc
-
-clean:
- rm -f *.o md5 diffs test.rfc
diff --git a/src/3rdparty/md5/README b/src/3rdparty/md5/README
deleted file mode 100644
index a37475f..0000000
--- a/src/3rdparty/md5/README
+++ /dev/null
@@ -1,120 +0,0 @@
- WHAT IS MD5?
-
-This directory contains source code for the MD5 message-digest algorithm.
-Essentially, MD5 reads data and calculates a cryptographic "checksum" that is,
-as far as anyone knows today, very hard to duplicate. Just as traditional
-checksums are used to gain confidence that a file has not been accidentally
-modified, say when transmitted over a phone line, MD5 is used to gain
-confidence that a file has not been *intentionally* modified, say to install
-a Trojan horse.
-
-"Very hard" in this case means that currently no one knows how to
-modify an arbitrary file without changing its MD5 checksum.
-Researchers continues to try, of course, and are making some progress
-towards the eventual goal of "breaking" MD5, but it is still considered
-quite strong enough for most uses. If the data you are protecting is
-highly valuable then, as always, you should enlist the services of a
-competent cryptographer to identify the precise risks from using this or
-any other cryptographic algorithm.
-
-MD5.tar.Z is a compressed tar file of all the other files in this directory.
-
-
- IS MD5 PATENTED? DO I NEED A LICENSE TO USE IT?
-
-"No" and "no".
-
-"md5-announcement.txt" is the announcement from RSA Data Security that
-MD5 is being placed in the public domain for free general use.
-Anyone may write a program implementing the MD5 algorithm for any purpose.
-
-RSA has written a reference implementation which is the source code in
-this directory. This source code is copyrighted by RSA. Here are the
-few copyright restrictions *with using this source code*. There is no
-restriction on any code which implements MD5 that you write yourself.
-
-> Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
-> rights reserved.
->
-> License to copy and use this software is granted provided that it
-> is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-> Algorithm" in all material mentioning or referencing this software
-> or this function.
->
-> License is also granted to make and use derivative works provided
-> that such works are identified as "derived from the RSA Data
-> Security, Inc. MD5 Message-Digest Algorithm" in all material
-> mentioning or referencing the derived work.
->
-> RSA Data Security, Inc. makes no representations concerning either
-> the merchantability of this software or the suitability of this
-> software for any particular purpose. It is provided "as is"
-> without express or implied warranty of any kind.
->
-> These notices must be retained in any copies of any part of this
-> documentation and/or software.
-
-
- WHY ARE THESE FILES HERE? WHAT CHANGES HAVE YOU MADE?
-
-"rfc1321.txt" is the RFC that describes in detail the MD5 message-digest
-algorithm. (MD2 is described in RFC1319 and MD4 in RFC1320.)
-Unfortunately, the text is formatted for printing so is not directly
-compilable (due to page numbers, etc.). Years ago, to encourage
-the use of MD5, I collected these files into a form that could
-easily be compiled. Because one intended use of MD5 is to help detect
-modified code, I intentionally made as few modifications to the
-original code in the RFC as possible so that it could be easily
-compared to the RFC. There are now other more efficient versions of
-MD5 available from other sources and I have taken the liberty to
-incorporate a few selected modifications as described below.
-
-The *.[ch] files were taken directly from RFC 1321.
-Since the RFC did not include a makefile, I wrote a simple one to
-build and test the md5 executable. Run "make" to just make the
-MD5 binary or "make test" to make and test it.
-
-There is a typo in the RFC Appendix A.4 (mddriver.c).
-Line 20 sets MD to "MD5" by default, but the code wants
-MD to be set to one of "2", "4", or "5".
-I put a -DMD=5 in the Makefile to mask this problem so that that
-portion of the code itself remains unchanged from what is in RFC 1321.
-
-Ric Anderson, ric@Artisoft.COM, provided a bug fix to the timing test code
-that caused a divide by zero aborts on a Sun sparc station-10 running
-solaris 2.3. This fix just corrects only a problem with the timing tests;
-no change to the code that implements the actual checksum has been made.
-
-Ric has also provided a man page - "md5.1". A postscript version
-of this man page is in "md5.1.ps" and a text version in "md5.1.txt".
-
-Larry Schwimmer (schwim@cyclone.stanford.edu), Gyula Szokoly
-(szgyula@skysrv.Pha.Jhu.EDU), and others sent in fixes to global.h and
-mddriver.c so that it would work under OSF/1 and on 64-bit architecture
-machines. On these machines, a "long" is not 4 bytes so
-the #define for UINT4 needs to be "int" instead of "long int".
-
- WHAT ABOUT EXPORT CONTROL?
-
-A question I am often asked is whether or not MD5 can be exported
-from the United States. This is an understandable concern given
-the export debate in this country. The answer is, happily, "yes".
-Here is the explanation from the US Department of State with a
-reference for those whose lawyers require checking such things:
-
- "... MD-5, N-HASH, and SHS are 'hashing routines' that perform
- a data authentication function and, by themselves, are not
- controlled for export under the ITAR because cryptographic software
- that is solely limited to a data authentication function is excluded
- from Category XIII(b) of the United States Munitions List.
- See 22 C.F.R. Section 121.1 XIII(b)(vi)."
-
- Source: Karn v. US Department of State,
- "JOINT STATEMENT OF FACTS NOT IN DISPUTE",
- Civ. A. No. 95-1812(CRR), US District Court for the District of Columbia.
-
-
-Enjoy!
-
- -- Jim Ellis (jte@cert.org)
- March 1998
diff --git a/src/3rdparty/md5/global.h b/src/3rdparty/md5/global.h
deleted file mode 100644
index ee25514..0000000
--- a/src/3rdparty/md5/global.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* GLOBAL.H - RSAREF types and constants
- */
-
-/* PROTOTYPES should be set to one if and only if the compiler supports
- function argument prototyping.
-The following makes PROTOTYPES default to 0 if it has not already
- been defined with C compiler flags.
- */
-#ifndef PROTOTYPES
-#define PROTOTYPES 0
-#endif
-
-/* POINTER defines a generic pointer type */
-typedef unsigned char *POINTER;
-
-/* UINT2 defines a two byte word */
-typedef unsigned short int UINT2;
-
-/* UINT4 defines a four byte word */
-typedef unsigned long int UINT4;
-
-/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
-If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
- returns an empty list.
- */
-#if PROTOTYPES
-#define PROTO_LIST(list) list
-#else
-#define PROTO_LIST(list) ()
-#endif
diff --git a/src/3rdparty/md5/md5-announcement.txt b/src/3rdparty/md5/md5-announcement.txt
deleted file mode 100644
index 931a1b7..0000000
--- a/src/3rdparty/md5/md5-announcement.txt
+++ /dev/null
@@ -1,37 +0,0 @@
- MD5 -- New Message Digest Algorithm
- (Feel free to distribute further)
-
-RSA Data Security is announcing MD5, a new message-digest algorithm.
-Like MD4, this algorithm is being placed in the public domain for free
-general use.
-
-The MD5 algorithm is a strengthened version of MD4. It has four
-rounds instead of three, and incorporates other revisions based on a
-year's worth of collected comments on the MD4 algorithm. For example,
-the input access patterns in rounds two and three have been improved,
-and the rotation amounts have been optimized for maximum ``avalanche
-effect.'' The additive constants have been made unique in each step,
-and an additional dependence of each step on the previous one has been
-added.
-
-These changes cause MD5 to be somewhat slower than MD4. We estimate
-that MD5 will typically run about 15-30% slower than MD4, depending on
-the degree to which the versions of MD4 and MD5 have been optimized.
-The more they are both optimized, the greater the percentage
-difference in speed. An optimized version of MD5 on a Sun
-SparcStation runs at about 890 Kbytes/second.
-
-Why MD5? While we do not know of any way to ``break'' MD4, we feel
-that MD4 is being pressed into service far too quickly for such an
-``aggressive'' design. We have been surprised at the speed with which
-MD4 is being designed into products. MD5 is ``MD4 with seatbelts''
-and thus, as a more conservative design, is more suitable for rapid
-deployment.
-
-It is the intent of RSA Data Security to use MD5 in its products and
-standards instead of MD4. We recommend that our customers generally
-do the same, unless there is an overwhelming need for the higher speed
-of MD4. Copies of the MD5 algorithm, including a reference
-implementation in C, are available from the company. (Over the
-Internet, you can access this documentation by anonymous FTP to
-rsa.com and obtaining the file pub/md5.doc.)
diff --git a/src/3rdparty/md5/md5.1 b/src/3rdparty/md5/md5.1
deleted file mode 100644
index ccccb01..0000000
--- a/src/3rdparty/md5/md5.1
+++ /dev/null
@@ -1,43 +0,0 @@
-.TH MD5 1 "Feb 14, 1994"
-.SH NAME
-md5 \- calculate a message-digest fingerprint (checksum) for a file
-.SH SYNOPSIS
-.B md5
-[ -t | -x | -sstring | filename(s) ]
-.SH DESCRIPTION
-.B md5
-takes as input a message of arbitrary length and produces
-as output a 128-bit "fingerprint" or "message digest" of the input.
-It is conjectured that it is computationally infeasible to produce
-two messages having the same message digest, or to produce any
-message having a given prespecified target message digest.
-The MD5 algorithm is intended for digital signature applications, where a
-large file must be "compressed" in a secure manner before being
-encrypted with a private (secret) key under a public-key cryptosystem
-such as
-.I RSA.
-.SH OPTIONS
-The following four options may be used in any combination, except
-that
-.B "filename(s)"
-must be the last objects on the command line.
-.in +5
-.PP
-.B -sstring
-prints a checksum of the given "string".
-.PP
-.B -t
-runs a built-in time trial.
-.PP
-.B -x
-runs a built-in test script.
-.PP
-.B filename(s)
-prints a checksum(s) for each of the files.
-.SH "SEE ALSO"
-.BR sum (1)
-.PP
-RFC 1321 describes in detail the MD2, MD4, and MD5 message-digest algorithms.
-.SH ACKNOWLEDGEMENTS
-This program is placed in the public domain for free general use by
-RSA Data Security.
diff --git a/src/3rdparty/md5/md5.1.ps b/src/3rdparty/md5/md5.1.ps
deleted file mode 100644
index 8a4d4c0..0000000
Binary files a/src/3rdparty/md5/md5.1.ps and /dev/null differ
diff --git a/src/3rdparty/md5/md5.1.txt b/src/3rdparty/md5/md5.1.txt
deleted file mode 100644
index 59a1b00..0000000
--- a/src/3rdparty/md5/md5.1.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-MD5(1) USER COMMANDS MD5(1)
-
-
-
-NAME
- md5 - calculate a message-digest fingerprint (checksum) for
- a file
-
-SYNOPSIS
- md5 [ -t | -x | -sstring | filename(s) ]
-
-DESCRIPTION
- md5 takes as input a message of arbitrary length and pro-
- duces as output a 128-bit "fingerprint" or "message digest"
- of the input. It is conjectured that it is computationally
- infeasible to produce two messages having the same message
- digest, or to produce any message having a given prespeci-
- fied target message digest. The MD5 algorithm is intended
- for digital signature applications, where a large file must
- be "compressed" in a secure manner before being encrypted
- with a private (secret) key under a public-key cryptosystem
- such as _R_S_A.
-
-OPTIONS
- The following four options may be used in any combination,
- except that filename(s) must be the last objects on the com-
- mand line.
-
- -sstring prints a checksum of the given "string".
-
- -t runs a built-in time trial.
-
- -x runs a built-in test script.
-
- filename(s) prints a checksum(s) for each of the files.
-
-SEE ALSO
- sum(1)
-
- RFC 1321 describes in detail the MD2, MD4, and MD5 message-
- digest algorithms.
-
-ACKNOWLEDGEMENTS
- This program is placed in the public domain for free general
- use by RSA Data Security.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Sun Release 4.1 Last change: Feb 14, 1994 1
-
-
-
diff --git a/src/3rdparty/md5/md5.h b/src/3rdparty/md5/md5.h
deleted file mode 100644
index f9d29c7..0000000
--- a/src/3rdparty/md5/md5.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* MD5.H - header file for MD5C.C
- */
-
-/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
-rights reserved.
-
-License to copy and use this software is granted provided that it
-is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-Algorithm" in all material mentioning or referencing this software
-or this function.
-
-License is also granted to make and use derivative works provided
-that such works are identified as "derived from the RSA Data
-Security, Inc. MD5 Message-Digest Algorithm" in all material
-mentioning or referencing the derived work.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
-
-These notices must be retained in any copies of any part of this
-documentation and/or software.
- */
-
-/* MD5 context. */
-typedef struct {
- UINT4 state[4]; /* state (ABCD) */
- UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
- unsigned char buffer[64]; /* input buffer */
-} MD5_CTX;
-
-void MD5Init PROTO_LIST ((MD5_CTX *));
-void MD5Update PROTO_LIST
- ((MD5_CTX *, unsigned char *, unsigned int));
-void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));
diff --git a/src/3rdparty/md5/md5c.c b/src/3rdparty/md5/md5c.c
deleted file mode 100644
index 7023bff..0000000
--- a/src/3rdparty/md5/md5c.c
+++ /dev/null
@@ -1,333 +0,0 @@
-/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
- */
-
-/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
-rights reserved.
-
-License to copy and use this software is granted provided that it
-is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-Algorithm" in all material mentioning or referencing this software
-or this function.
-
-License is also granted to make and use derivative works provided
-that such works are identified as "derived from the RSA Data
-Security, Inc. MD5 Message-Digest Algorithm" in all material
-mentioning or referencing the derived work.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
-
-These notices must be retained in any copies of any part of this
-documentation and/or software.
- */
-
-#include "global.h"
-#include "md5.h"
-
-/* Constants for MD5Transform routine.
- */
-#define S11 7
-#define S12 12
-#define S13 17
-#define S14 22
-#define S21 5
-#define S22 9
-#define S23 14
-#define S24 20
-#define S31 4
-#define S32 11
-#define S33 16
-#define S34 23
-#define S41 6
-#define S42 10
-#define S43 15
-#define S44 21
-
-static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
-static void Encode PROTO_LIST
- ((unsigned char *, UINT4 *, unsigned int));
-static void Decode PROTO_LIST
- ((UINT4 *, unsigned char *, unsigned int));
-static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
-static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
-
-static unsigned char PADDING[64] = {
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-/* F, G, H and I are basic MD5 functions.
- */
-#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
-#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define I(x, y, z) ((y) ^ ((x) | (~z)))
-
-/* ROTATE_LEFT rotates x left n bits.
- */
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
-Rotation is separate from addition to prevent recomputation.
- */
-#define FF(a, b, c, d, x, s, ac) { \
- (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define GG(a, b, c, d, x, s, ac) { \
- (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define HH(a, b, c, d, x, s, ac) { \
- (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define II(a, b, c, d, x, s, ac) { \
- (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-
-/* MD5 initialization. Begins an MD5 operation, writing a new context.
- */
-void MD5Init (context)
-MD5_CTX *context; /* context */
-{
- context->count[0] = context->count[1] = 0;
- /* Load magic initialization constants.
-*/
- context->state[0] = 0x67452301;
- context->state[1] = 0xefcdab89;
- context->state[2] = 0x98badcfe;
- context->state[3] = 0x10325476;
-}
-
-/* MD5 block update operation. Continues an MD5 message-digest
- operation, processing another message block, and updating the
- context.
- */
-void MD5Update (context, input, inputLen)
-MD5_CTX *context; /* context */
-unsigned char *input; /* input block */
-unsigned int inputLen; /* length of input block */
-{
- unsigned int i, index, partLen;
-
- /* Compute number of bytes mod 64 */
- index = (unsigned int)((context->count[0] >> 3) & 0x3F);
-
- /* Update number of bits */
- if ((context->count[0] += ((UINT4)inputLen << 3))
- < ((UINT4)inputLen << 3))
- context->count[1]++;
- context->count[1] += ((UINT4)inputLen >> 29);
-
- partLen = 64 - index;
-
- /* Transform as many times as possible.
-*/
- if (inputLen >= partLen) {
- MD5_memcpy
- ((POINTER)&context->buffer[index], (POINTER)input, partLen);
- MD5Transform (context->state, context->buffer);
-
- for (i = partLen; i + 63 < inputLen; i += 64)
- MD5Transform (context->state, &input[i]);
-
- index = 0;
- }
- else
- i = 0;
-
- /* Buffer remaining input */
- MD5_memcpy
- ((POINTER)&context->buffer[index], (POINTER)&input[i],
- inputLen-i);
-}
-
-/* MD5 finalization. Ends an MD5 message-digest operation, writing the
- the message digest and zeroizing the context.
- */
-void MD5Final (digest, context)
-unsigned char digest[16]; /* message digest */
-MD5_CTX *context; /* context */
-{
- unsigned char bits[8];
- unsigned int index, padLen;
-
- /* Save number of bits */
- Encode (bits, context->count, 8);
-
- /* Pad out to 56 mod 64.
-*/
- index = (unsigned int)((context->count[0] >> 3) & 0x3f);
- padLen = (index < 56) ? (56 - index) : (120 - index);
- MD5Update (context, PADDING, padLen);
-
- /* Append length (before padding) */
- MD5Update (context, bits, 8);
- /* Store state in digest */
- Encode (digest, context->state, 16);
-
- /* Zeroize sensitive information.
-*/
- MD5_memset ((POINTER)context, 0, sizeof (*context));
-}
-
-/* MD5 basic transformation. Transforms state based on block.
- */
-static void MD5Transform (state, block)
-UINT4 state[4];
-unsigned char block[64];
-{
- UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
-
- Decode (x, block, 64);
-
- /* Round 1 */
- FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
- FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
- FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
- FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
- FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
- FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
- FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
- FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
- FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
- FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
- FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
- FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
- FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
- FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
- FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
- FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
-
- /* Round 2 */
- GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
- GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
- GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
- GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
- GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
- GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
- GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
- GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
- GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
- GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
- GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
- GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
- GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
- GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
- GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
- GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
-
- /* Round 3 */
- HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
- HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
- HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
- HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
- HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
- HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
- HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
- HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
- HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
- HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
- HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
- HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
- HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
- HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
- HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
- HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
-
- /* Round 4 */
- II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
- II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
- II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
- II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
- II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
- II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
- II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
- II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
- II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
- II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
- II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
- II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
- II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
- II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
- II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
- II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
-
- state[0] += a;
- state[1] += b;
- state[2] += c;
- state[3] += d;
-
- /* Zeroize sensitive information.
-*/
- MD5_memset ((POINTER)x, 0, sizeof (x));
-}
-
-/* Encodes input (UINT4) into output (unsigned char). Assumes len is
- a multiple of 4.
- */
-static void Encode (output, input, len)
-unsigned char *output;
-UINT4 *input;
-unsigned int len;
-{
- unsigned int i, j;
-
- for (i = 0, j = 0; j < len; i++, j += 4) {
- output[j] = (unsigned char)(input[i] & 0xff);
- output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
- output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
- output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
- }
-}
-
-/* Decodes input (unsigned char) into output (UINT4). Assumes len is
- a multiple of 4.
- */
-static void Decode (output, input, len)
-UINT4 *output;
-unsigned char *input;
-unsigned int len;
-{
- unsigned int i, j;
-
- for (i = 0, j = 0; j < len; i++, j += 4)
- output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
- (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
-}
-
-/* Note: Replace "for loop" with standard memcpy if possible.
- */
-
-static void MD5_memcpy (output, input, len)
-POINTER output;
-POINTER input;
-unsigned int len;
-{
- unsigned int i;
-
- for (i = 0; i < len; i++)
- output[i] = input[i];
-}
-
-/* Note: Replace "for loop" with standard memset if possible.
- */
-static void MD5_memset (output, value, len)
-POINTER output;
-int value;
-unsigned int len;
-{
- unsigned int i;
-
- for (i = 0; i < len; i++)
- ((char *)output)[i] = (char)value;
-}
diff --git a/src/3rdparty/md5/mddriver.c b/src/3rdparty/md5/mddriver.c
deleted file mode 100644
index ae26b36..0000000
--- a/src/3rdparty/md5/mddriver.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/* MDDRIVER.C - test driver for MD2, MD4 and MD5
- */
-
-/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
-rights reserved.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
-
-These notices must be retained in any copies of any part of this
-documentation and/or software.
- */
-
-/* The following makes MD default to MD5 if it has not already been
- defined with C compiler flags.
- */
-#ifndef MD
-#define MD MD5
-#endif
-
-#include
-#include
-#include
-#include
-#include "global.h"
-#if MD == 2
-#include "md2.h"
-#endif
-#if MD == 4
-#include "md4.h"
-#endif
-#if MD == 5
-#include "md5.h"
-#endif
-
-/* Length of test block, number of test blocks.
- */
-#define TEST_BLOCK_LEN 1000
-#define TEST_BLOCK_COUNT 1000
-
-static void MDString PROTO_LIST ((char *));
-static void MDTimeTrial PROTO_LIST ((void));
-static void MDTestSuite PROTO_LIST ((void));
-static void MDFile PROTO_LIST ((char *));
-static void MDFilter PROTO_LIST ((void));
-static void MDPrint PROTO_LIST ((unsigned char [16]));
-
-#if MD == 2
-#define MD_CTX MD2_CTX
-#define MDInit MD2Init
-#define MDUpdate MD2Update
-#define MDFinal MD2Final
-#endif
-#if MD == 4
-#define MD_CTX MD4_CTX
-#define MDInit MD4Init
-#define MDUpdate MD4Update
-#define MDFinal MD4Final
-#endif
-#if MD == 5
-#define MD_CTX MD5_CTX
-#define MDInit MD5Init
-#define MDUpdate MD5Update
-#define MDFinal MD5Final
-#endif
-
-/* Main driver.
-
-Arguments (may be any combination):
- -sstring - digests string
- -t - runs time trial
- -x - runs test script
- -b - print MD5 sum in binary on stdout
- filename - digests file
- (none) - digests standard input
- */
-
-short bflag = 0; /* 1 == print sums in binary */
-
-int main (argc, argv)
-int argc;
-char *argv[];
-{
- int i;
-
- if (argc > 1)
- for (i = 1; i < argc; i++)
- if (argv[i][0] == '-' && argv[i][1] == 's')
- MDString (argv[i] + 2);
- else if (strcmp (argv[i], "-t") == 0)
- MDTimeTrial ();
- else if (strcmp (argv[i], "-x") == 0)
- MDTestSuite ();
- else if (strcmp (argv[i], "-b") == 0)
- bflag = 1;
- else
- MDFile (argv[i]);
- else
- MDFilter ();
-
- return (0);
-}
-
-/* Digests a string and prints the result.
- */
-static void MDString (string)
-char *string;
-{
- MD_CTX context;
- unsigned char digest[16];
- unsigned int len = strlen (string);
-
- MDInit (&context);
- MDUpdate (&context, string, len);
- MDFinal (digest, &context);
-
- if (!bflag) printf ("MD%d (\"%s\") = ", MD, string);
- MDPrint (digest);
- if (!bflag) printf ("\n");
-}
-
-/* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte
- blocks.
- */
-static void MDTimeTrial ()
-{
- MD_CTX context;
- time_t endTime, startTime;
- unsigned char block[TEST_BLOCK_LEN], digest[16];
- unsigned int i;
-
- printf
- ("MD%d time trial. Digesting %d %d-byte blocks ...", MD,
- TEST_BLOCK_LEN, TEST_BLOCK_COUNT);
-
- /* Initialize block */
- for (i = 0; i < TEST_BLOCK_LEN; i++)
- block[i] = (unsigned char)(i & 0xff);
-
- /* Start timer */
- time (&startTime);
-
- /* Digest blocks */
- MDInit (&context);
- for (i = 0; i < TEST_BLOCK_COUNT; i++)
- MDUpdate (&context, block, TEST_BLOCK_LEN);
- MDFinal (digest, &context);
-
- /* Stop timer */
- time (&endTime);
-
- printf (" done\n");
- printf ("Digest = ");
- MDPrint (digest);
- printf ("\nTime = %d seconds\n", (time_t)(endTime-startTime));
- /*
- * Be careful that endTime-startTime is not zero.
- * (Bug fix from Ric Anderson, ric@Artisoft.COM.)
- */
- printf
- ("Speed = %d bytes/second\n",
- (time_t)TEST_BLOCK_LEN * (time_t)TEST_BLOCK_COUNT/((endTime-startTime) != 0 ? (endTime-startTime):1));
-}
-
-/* Digests a reference suite of strings and prints the results.
- */
-static void MDTestSuite ()
-{
- printf ("MD%d test suite:\n", MD);
-
- MDString ("");
- MDString ("a");
- MDString ("abc");
- MDString ("message digest");
- MDString ("abcdefghijklmnopqrstuvwxyz");
- MDString
- ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
- MDString
- ("1234567890123456789012345678901234567890\
-1234567890123456789012345678901234567890");
-}
-
-/* Digests a file and prints the result.
- */
-static void MDFile (filename)
-char *filename;
-{
- FILE *file;
- MD_CTX context;
- int len;
- unsigned char buffer[1024], digest[16];
-
- if ((file = fopen (filename, "rb")) == NULL)
- printf ("%s can't be opened\n", filename);
-
- else {
- MDInit (&context);
- while (len = fread (buffer, 1, 1024, file))
- MDUpdate (&context, buffer, len);
- MDFinal (digest, &context);
-
- fclose (file);
-
- if (!bflag) printf ("MD%d (%s) = ", MD, filename);
- MDPrint (digest);
- if (!bflag) printf ("\n");
- }
-}
-
-/* Digests the standard input and prints the result.
- */
-static void MDFilter ()
-{
- MD_CTX context;
- int len;
- unsigned char buffer[16], digest[16];
-
- MDInit (&context);
- while (len = fread (buffer, 1, 16, stdin))
- MDUpdate (&context, buffer, len);
- MDFinal (digest, &context);
-
- MDPrint (digest);
- if (!bflag) printf ("\n");
-}
-
-/* Prints a message digest in hexadecimal or binary.
- */
-static void MDPrint (digest)
-unsigned char digest[16];
-{
- unsigned int i;
-
- if (bflag) {
- /* print in binary */
- write(1, &digest[0], 16);
- } else {
- /* print in hex */
- for (i = 0; i < 16; i++)
- printf ("%02x", digest[i]);
- }
-}
diff --git a/src/3rdparty/md5/rfc1321.txt b/src/3rdparty/md5/rfc1321.txt
deleted file mode 100644
index 85543a5..0000000
--- a/src/3rdparty/md5/rfc1321.txt
+++ /dev/null
@@ -1,1179 +0,0 @@
-
-
-
-
-
-
-Network Working Group R. Rivest
-Request for Comments: 1321 MIT Laboratory for Computer Science
- and RSA Data Security, Inc.
- April 1992
-
-
- The MD5 Message-Digest Algorithm
-
-Status of this Memo
-
- This memo provides information for the Internet community. It does
- not specify an Internet standard. Distribution of this memo is
- unlimited.
-
-Acknowlegements
-
- We would like to thank Don Coppersmith, Burt Kaliski, Ralph Merkle,
- David Chaum, and Noam Nisan for numerous helpful comments and
- suggestions.
-
-Table of Contents
-
- 1. Executive Summary 1
- 2. Terminology and Notation 2
- 3. MD5 Algorithm Description 3
- 4. Summary 6
- 5. Differences Between MD4 and MD5 6
- References 7
- APPENDIX A - Reference Implementation 7
- Security Considerations 21
- Author's Address 21
-
-1. Executive Summary
-
- This document describes the MD5 message-digest algorithm. The
- algorithm takes as input a message of arbitrary length and produces
- as output a 128-bit "fingerprint" or "message digest" of the input.
- It is conjectured that it is computationally infeasible to produce
- two messages having the same message digest, or to produce any
- message having a given prespecified target message digest. The MD5
- algorithm is intended for digital signature applications, where a
- large file must be "compressed" in a secure manner before being
- encrypted with a private (secret) key under a public-key cryptosystem
- such as RSA.
-
-
-
-
-
-
-
-Rivest [Page 1]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- The MD5 algorithm is designed to be quite fast on 32-bit machines. In
- addition, the MD5 algorithm does not require any large substitution
- tables; the algorithm can be coded quite compactly.
-
- The MD5 algorithm is an extension of the MD4 message-digest algorithm
- 1,2]. MD5 is slightly slower than MD4, but is more "conservative" in
- design. MD5 was designed because it was felt that MD4 was perhaps
- being adopted for use more quickly than justified by the existing
- critical review; because MD4 was designed to be exceptionally fast,
- it is "at the edge" in terms of risking successful cryptanalytic
- attack. MD5 backs off a bit, giving up a little in speed for a much
- greater likelihood of ultimate security. It incorporates some
- suggestions made by various reviewers, and contains additional
- optimizations. The MD5 algorithm is being placed in the public domain
- for review and possible adoption as a standard.
-
- For OSI-based applications, MD5's object identifier is
-
- md5 OBJECT IDENTIFIER ::=
- iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 5}
-
- In the X.509 type AlgorithmIdentifier [3], the parameters for MD5
- should have type NULL.
-
-2. Terminology and Notation
-
- In this document a "word" is a 32-bit quantity and a "byte" is an
- eight-bit quantity. A sequence of bits can be interpreted in a
- natural manner as a sequence of bytes, where each consecutive group
- of eight bits is interpreted as a byte with the high-order (most
- significant) bit of each byte listed first. Similarly, a sequence of
- bytes can be interpreted as a sequence of 32-bit words, where each
- consecutive group of four bytes is interpreted as a word with the
- low-order (least significant) byte given first.
-
- Let x_i denote "x sub i". If the subscript is an expression, we
- surround it in braces, as in x_{i+1}. Similarly, we use ^ for
- superscripts (exponentiation), so that x^i denotes x to the i-th
- power.
-
- Let the symbol "+" denote addition of words (i.e., modulo-2^32
- addition). Let X <<< s denote the 32-bit value obtained by circularly
- shifting (rotating) X left by s bit positions. Let not(X) denote the
- bit-wise complement of X, and let X v Y denote the bit-wise OR of X
- and Y. Let X xor Y denote the bit-wise XOR of X and Y, and let XY
- denote the bit-wise AND of X and Y.
-
-
-
-
-
-Rivest [Page 2]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
-3. MD5 Algorithm Description
-
- We begin by supposing that we have a b-bit message as input, and that
- we wish to find its message digest. Here b is an arbitrary
- nonnegative integer; b may be zero, it need not be a multiple of
- eight, and it may be arbitrarily large. We imagine the bits of the
- message written down as follows:
-
- m_0 m_1 ... m_{b-1}
-
- The following five steps are performed to compute the message digest
- of the message.
-
-3.1 Step 1. Append Padding Bits
-
- The message is "padded" (extended) so that its length (in bits) is
- congruent to 448, modulo 512. That is, the message is extended so
- that it is just 64 bits shy of being a multiple of 512 bits long.
- Padding is always performed, even if the length of the message is
- already congruent to 448, modulo 512.
-
- Padding is performed as follows: a single "1" bit is appended to the
- message, and then "0" bits are appended so that the length in bits of
- the padded message becomes congruent to 448, modulo 512. In all, at
- least one bit and at most 512 bits are appended.
-
-3.2 Step 2. Append Length
-
- A 64-bit representation of b (the length of the message before the
- padding bits were added) is appended to the result of the previous
- step. In the unlikely event that b is greater than 2^64, then only
- the low-order 64 bits of b are used. (These bits are appended as two
- 32-bit words and appended low-order word first in accordance with the
- previous conventions.)
-
- At this point the resulting message (after padding with bits and with
- b) has a length that is an exact multiple of 512 bits. Equivalently,
- this message has a length that is an exact multiple of 16 (32-bit)
- words. Let M[0 ... N-1] denote the words of the resulting message,
- where N is a multiple of 16.
-
-3.3 Step 3. Initialize MD Buffer
-
- A four-word buffer (A,B,C,D) is used to compute the message digest.
- Here each of A, B, C, D is a 32-bit register. These registers are
- initialized to the following values in hexadecimal, low-order bytes
- first):
-
-
-
-
-Rivest [Page 3]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- word A: 01 23 45 67
- word B: 89 ab cd ef
- word C: fe dc ba 98
- word D: 76 54 32 10
-
-3.4 Step 4. Process Message in 16-Word Blocks
-
- We first define four auxiliary functions that each take as input
- three 32-bit words and produce as output one 32-bit word.
-
- F(X,Y,Z) = XY v not(X) Z
- G(X,Y,Z) = XZ v Y not(Z)
- H(X,Y,Z) = X xor Y xor Z
- I(X,Y,Z) = Y xor (X v not(Z))
-
- In each bit position F acts as a conditional: if X then Y else Z.
- The function F could have been defined using + instead of v since XY
- and not(X)Z will never have 1's in the same bit position.) It is
- interesting to note that if the bits of X, Y, and Z are independent
- and unbiased, the each bit of F(X,Y,Z) will be independent and
- unbiased.
-
- The functions G, H, and I are similar to the function F, in that they
- act in "bitwise parallel" to produce their output from the bits of X,
- Y, and Z, in such a manner that if the corresponding bits of X, Y,
- and Z are independent and unbiased, then each bit of G(X,Y,Z),
- H(X,Y,Z), and I(X,Y,Z) will be independent and unbiased. Note that
- the function H is the bit-wise "xor" or "parity" function of its
- inputs.
-
- This step uses a 64-element table T[1 ... 64] constructed from the
- sine function. Let T[i] denote the i-th element of the table, which
- is equal to the integer part of 4294967296 times abs(sin(i)), where i
- is in radians. The elements of the table are given in the appendix.
-
- Do the following:
-
- /* Process each 16-word block. */
- For i = 0 to N/16-1 do
-
- /* Copy block i into X. */
- For j = 0 to 15 do
- Set X[j] to M[i*16+j].
- end /* of loop on j */
-
- /* Save A as AA, B as BB, C as CC, and D as DD. */
- AA = A
- BB = B
-
-
-
-Rivest [Page 4]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- CC = C
- DD = D
-
- /* Round 1. */
- /* Let [abcd k s i] denote the operation
- a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
- /* Do the following 16 operations. */
- [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
- [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
- [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
- [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
-
- /* Round 2. */
- /* Let [abcd k s i] denote the operation
- a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
- /* Do the following 16 operations. */
- [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
- [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
- [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
- [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
-
- /* Round 3. */
- /* Let [abcd k s t] denote the operation
- a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
- /* Do the following 16 operations. */
- [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
- [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
- [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
- [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
-
- /* Round 4. */
- /* Let [abcd k s t] denote the operation
- a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
- /* Do the following 16 operations. */
- [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
- [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
- [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
- [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
-
- /* Then perform the following additions. (That is increment each
- of the four registers by the value it had before this block
- was started.) */
- A = A + AA
- B = B + BB
- C = C + CC
- D = D + DD
-
- end /* of loop on i */
-
-
-
-Rivest [Page 5]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
-3.5 Step 5. Output
-
- The message digest produced as output is A, B, C, D. That is, we
- begin with the low-order byte of A, and end with the high-order byte
- of D.
-
- This completes the description of MD5. A reference implementation in
- C is given in the appendix.
-
-4. Summary
-
- The MD5 message-digest algorithm is simple to implement, and provides
- a "fingerprint" or message digest of a message of arbitrary length.
- It is conjectured that the difficulty of coming up with two messages
- having the same message digest is on the order of 2^64 operations,
- and that the difficulty of coming up with any message having a given
- message digest is on the order of 2^128 operations. The MD5 algorithm
- has been carefully scrutinized for weaknesses. It is, however, a
- relatively new algorithm and further security analysis is of course
- justified, as is the case with any new proposal of this sort.
-
-5. Differences Between MD4 and MD5
-
- The following are the differences between MD4 and MD5:
-
- 1. A fourth round has been added.
-
- 2. Each step now has a unique additive constant.
-
- 3. The function g in round 2 was changed from (XY v XZ v YZ) to
- (XZ v Y not(Z)) to make g less symmetric.
-
- 4. Each step now adds in the result of the previous step. This
- promotes a faster "avalanche effect".
-
- 5. The order in which input words are accessed in rounds 2 and
- 3 is changed, to make these patterns less like each other.
-
- 6. The shift amounts in each round have been approximately
- optimized, to yield a faster "avalanche effect." The shifts in
- different rounds are distinct.
-
-
-
-
-
-
-
-
-
-
-Rivest [Page 6]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
-References
-
- [1] Rivest, R., "The MD4 Message Digest Algorithm", RFC 1320, MIT and
- RSA Data Security, Inc., April 1992.
-
- [2] Rivest, R., "The MD4 message digest algorithm", in A.J. Menezes
- and S.A. Vanstone, editors, Advances in Cryptology - CRYPTO '90
- Proceedings, pages 303-311, Springer-Verlag, 1991.
-
- [3] CCITT Recommendation X.509 (1988), "The Directory -
- Authentication Framework."
-
-APPENDIX A - Reference Implementation
-
- This appendix contains the following files taken from RSAREF: A
- Cryptographic Toolkit for Privacy-Enhanced Mail:
-
- global.h -- global header file
-
- md5.h -- header file for MD5
-
- md5c.c -- source code for MD5
-
- For more information on RSAREF, send email to .
-
- The appendix also includes the following file:
-
- mddriver.c -- test driver for MD2, MD4 and MD5
-
- The driver compiles for MD5 by default but can compile for MD2 or MD4
- if the symbol MD is defined on the C compiler command line as 2 or 4.
-
- The implementation is portable and should work on many different
- plaforms. However, it is not difficult to optimize the implementation
- on particular platforms, an exercise left to the reader. For example,
- on "little-endian" platforms where the lowest-addressed byte in a 32-
- bit word is the least significant and there are no alignment
- restrictions, the call to Decode in MD5Transform can be replaced with
- a typecast.
-
-A.1 global.h
-
-/* GLOBAL.H - RSAREF types and constants
- */
-
-/* PROTOTYPES should be set to one if and only if the compiler supports
- function argument prototyping.
-The following makes PROTOTYPES default to 0 if it has not already
-
-
-
-Rivest [Page 7]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- been defined with C compiler flags.
- */
-#ifndef PROTOTYPES
-#define PROTOTYPES 0
-#endif
-
-/* POINTER defines a generic pointer type */
-typedef unsigned char *POINTER;
-
-/* UINT2 defines a two byte word */
-typedef unsigned short int UINT2;
-
-/* UINT4 defines a four byte word */
-typedef unsigned long int UINT4;
-
-/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
-If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
- returns an empty list.
- */
-#if PROTOTYPES
-#define PROTO_LIST(list) list
-#else
-#define PROTO_LIST(list) ()
-#endif
-
-A.2 md5.h
-
-/* MD5.H - header file for MD5C.C
- */
-
-/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
-rights reserved.
-
-License to copy and use this software is granted provided that it
-is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-Algorithm" in all material mentioning or referencing this software
-or this function.
-
-License is also granted to make and use derivative works provided
-that such works are identified as "derived from the RSA Data
-Security, Inc. MD5 Message-Digest Algorithm" in all material
-mentioning or referencing the derived work.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
-
-
-
-
-Rivest [Page 8]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
-These notices must be retained in any copies of any part of this
-documentation and/or software.
- */
-
-/* MD5 context. */
-typedef struct {
- UINT4 state[4]; /* state (ABCD) */
- UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
- unsigned char buffer[64]; /* input buffer */
-} MD5_CTX;
-
-void MD5Init PROTO_LIST ((MD5_CTX *));
-void MD5Update PROTO_LIST
- ((MD5_CTX *, unsigned char *, unsigned int));
-void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));
-
-A.3 md5c.c
-
-/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
- */
-
-/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
-rights reserved.
-
-License to copy and use this software is granted provided that it
-is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-Algorithm" in all material mentioning or referencing this software
-or this function.
-
-License is also granted to make and use derivative works provided
-that such works are identified as "derived from the RSA Data
-Security, Inc. MD5 Message-Digest Algorithm" in all material
-mentioning or referencing the derived work.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
-
-These notices must be retained in any copies of any part of this
-documentation and/or software.
- */
-
-#include "global.h"
-#include "md5.h"
-
-/* Constants for MD5Transform routine.
- */
-
-
-
-Rivest [Page 9]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
-#define S11 7
-#define S12 12
-#define S13 17
-#define S14 22
-#define S21 5
-#define S22 9
-#define S23 14
-#define S24 20
-#define S31 4
-#define S32 11
-#define S33 16
-#define S34 23
-#define S41 6
-#define S42 10
-#define S43 15
-#define S44 21
-
-static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
-static void Encode PROTO_LIST
- ((unsigned char *, UINT4 *, unsigned int));
-static void Decode PROTO_LIST
- ((UINT4 *, unsigned char *, unsigned int));
-static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
-static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
-
-static unsigned char PADDING[64] = {
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-/* F, G, H and I are basic MD5 functions.
- */
-#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
-#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define I(x, y, z) ((y) ^ ((x) | (~z)))
-
-/* ROTATE_LEFT rotates x left n bits.
- */
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
-Rotation is separate from addition to prevent recomputation.
- */
-#define FF(a, b, c, d, x, s, ac) { \
- (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
-
-
-
-Rivest [Page 10]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- (a) += (b); \
- }
-#define GG(a, b, c, d, x, s, ac) { \
- (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define HH(a, b, c, d, x, s, ac) { \
- (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define II(a, b, c, d, x, s, ac) { \
- (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-
-/* MD5 initialization. Begins an MD5 operation, writing a new context.
- */
-void MD5Init (context)
-MD5_CTX *context; /* context */
-{
- context->count[0] = context->count[1] = 0;
- /* Load magic initialization constants.
-*/
- context->state[0] = 0x67452301;
- context->state[1] = 0xefcdab89;
- context->state[2] = 0x98badcfe;
- context->state[3] = 0x10325476;
-}
-
-/* MD5 block update operation. Continues an MD5 message-digest
- operation, processing another message block, and updating the
- context.
- */
-void MD5Update (context, input, inputLen)
-MD5_CTX *context; /* context */
-unsigned char *input; /* input block */
-unsigned int inputLen; /* length of input block */
-{
- unsigned int i, index, partLen;
-
- /* Compute number of bytes mod 64 */
- index = (unsigned int)((context->count[0] >> 3) & 0x3F);
-
- /* Update number of bits */
- if ((context->count[0] += ((UINT4)inputLen << 3))
-
-
-
-Rivest [Page 11]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- < ((UINT4)inputLen << 3))
- context->count[1]++;
- context->count[1] += ((UINT4)inputLen >> 29);
-
- partLen = 64 - index;
-
- /* Transform as many times as possible.
-*/
- if (inputLen >= partLen) {
- MD5_memcpy
- ((POINTER)&context->buffer[index], (POINTER)input, partLen);
- MD5Transform (context->state, context->buffer);
-
- for (i = partLen; i + 63 < inputLen; i += 64)
- MD5Transform (context->state, &input[i]);
-
- index = 0;
- }
- else
- i = 0;
-
- /* Buffer remaining input */
- MD5_memcpy
- ((POINTER)&context->buffer[index], (POINTER)&input[i],
- inputLen-i);
-}
-
-/* MD5 finalization. Ends an MD5 message-digest operation, writing the
- the message digest and zeroizing the context.
- */
-void MD5Final (digest, context)
-unsigned char digest[16]; /* message digest */
-MD5_CTX *context; /* context */
-{
- unsigned char bits[8];
- unsigned int index, padLen;
-
- /* Save number of bits */
- Encode (bits, context->count, 8);
-
- /* Pad out to 56 mod 64.
-*/
- index = (unsigned int)((context->count[0] >> 3) & 0x3f);
- padLen = (index < 56) ? (56 - index) : (120 - index);
- MD5Update (context, PADDING, padLen);
-
- /* Append length (before padding) */
- MD5Update (context, bits, 8);
-
-
-
-Rivest [Page 12]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- /* Store state in digest */
- Encode (digest, context->state, 16);
-
- /* Zeroize sensitive information.
-*/
- MD5_memset ((POINTER)context, 0, sizeof (*context));
-}
-
-/* MD5 basic transformation. Transforms state based on block.
- */
-static void MD5Transform (state, block)
-UINT4 state[4];
-unsigned char block[64];
-{
- UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
-
- Decode (x, block, 64);
-
- /* Round 1 */
- FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
- FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
- FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
- FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
- FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
- FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
- FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
- FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
- FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
- FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
- FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
- FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
- FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
- FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
- FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
- FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
-
- /* Round 2 */
- GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
- GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
- GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
- GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
- GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
- GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
- GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
- GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
- GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
- GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
- GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
-
-
-
-Rivest [Page 13]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
- GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
- GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
- GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
- GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
-
- /* Round 3 */
- HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
- HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
- HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
- HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
- HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
- HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
- HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
- HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
- HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
- HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
- HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
- HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
- HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
- HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
- HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
- HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
-
- /* Round 4 */
- II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
- II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
- II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
- II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
- II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
- II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
- II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
- II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
- II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
- II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
- II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
- II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
- II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
- II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
- II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
- II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
-
- state[0] += a;
- state[1] += b;
- state[2] += c;
- state[3] += d;
-
- /* Zeroize sensitive information.
-
-
-
-Rivest [Page 14]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
-*/
- MD5_memset ((POINTER)x, 0, sizeof (x));
-}
-
-/* Encodes input (UINT4) into output (unsigned char). Assumes len is
- a multiple of 4.
- */
-static void Encode (output, input, len)
-unsigned char *output;
-UINT4 *input;
-unsigned int len;
-{
- unsigned int i, j;
-
- for (i = 0, j = 0; j < len; i++, j += 4) {
- output[j] = (unsigned char)(input[i] & 0xff);
- output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
- output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
- output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
- }
-}
-
-/* Decodes input (unsigned char) into output (UINT4). Assumes len is
- a multiple of 4.
- */
-static void Decode (output, input, len)
-UINT4 *output;
-unsigned char *input;
-unsigned int len;
-{
- unsigned int i, j;
-
- for (i = 0, j = 0; j < len; i++, j += 4)
- output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
- (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
-}
-
-/* Note: Replace "for loop" with standard memcpy if possible.
- */
-
-static void MD5_memcpy (output, input, len)
-POINTER output;
-POINTER input;
-unsigned int len;
-{
- unsigned int i;
-
- for (i = 0; i < len; i++)
-
-
-
-Rivest [Page 15]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- output[i] = input[i];
-}
-
-/* Note: Replace "for loop" with standard memset if possible.
- */
-static void MD5_memset (output, value, len)
-POINTER output;
-int value;
-unsigned int len;
-{
- unsigned int i;
-
- for (i = 0; i < len; i++)
- ((char *)output)[i] = (char)value;
-}
-
-A.4 mddriver.c
-
-/* MDDRIVER.C - test driver for MD2, MD4 and MD5
- */
-
-/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
-rights reserved.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
-
-These notices must be retained in any copies of any part of this
-documentation and/or software.
- */
-
-/* The following makes MD default to MD5 if it has not already been
- defined with C compiler flags.
- */
-#ifndef MD
-#define MD MD5
-#endif
-
-#include
-#include
-#include
-#include "global.h"
-#if MD == 2
-#include "md2.h"
-#endif
-#if MD == 4
-
-
-
-Rivest [Page 16]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
-#include "md4.h"
-#endif
-#if MD == 5
-#include "md5.h"
-#endif
-
-/* Length of test block, number of test blocks.
- */
-#define TEST_BLOCK_LEN 1000
-#define TEST_BLOCK_COUNT 1000
-
-static void MDString PROTO_LIST ((char *));
-static void MDTimeTrial PROTO_LIST ((void));
-static void MDTestSuite PROTO_LIST ((void));
-static void MDFile PROTO_LIST ((char *));
-static void MDFilter PROTO_LIST ((void));
-static void MDPrint PROTO_LIST ((unsigned char [16]));
-
-#if MD == 2
-#define MD_CTX MD2_CTX
-#define MDInit MD2Init
-#define MDUpdate MD2Update
-#define MDFinal MD2Final
-#endif
-#if MD == 4
-#define MD_CTX MD4_CTX
-#define MDInit MD4Init
-#define MDUpdate MD4Update
-#define MDFinal MD4Final
-#endif
-#if MD == 5
-#define MD_CTX MD5_CTX
-#define MDInit MD5Init
-#define MDUpdate MD5Update
-#define MDFinal MD5Final
-#endif
-
-/* Main driver.
-
-Arguments (may be any combination):
- -sstring - digests string
- -t - runs time trial
- -x - runs test script
- filename - digests file
- (none) - digests standard input
- */
-int main (argc, argv)
-int argc;
-
-
-
-Rivest [Page 17]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
-char *argv[];
-{
- int i;
-
- if (argc > 1)
- for (i = 1; i < argc; i++)
- if (argv[i][0] == '-' && argv[i][1] == 's')
- MDString (argv[i] + 2);
- else if (strcmp (argv[i], "-t") == 0)
- MDTimeTrial ();
- else if (strcmp (argv[i], "-x") == 0)
- MDTestSuite ();
- else
- MDFile (argv[i]);
- else
- MDFilter ();
-
- return (0);
-}
-
-/* Digests a string and prints the result.
- */
-static void MDString (string)
-char *string;
-{
- MD_CTX context;
- unsigned char digest[16];
- unsigned int len = strlen (string);
-
- MDInit (&context);
- MDUpdate (&context, string, len);
- MDFinal (digest, &context);
-
- printf ("MD%d (\"%s\") = ", MD, string);
- MDPrint (digest);
- printf ("\n");
-}
-
-/* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte
- blocks.
- */
-static void MDTimeTrial ()
-{
- MD_CTX context;
- time_t endTime, startTime;
- unsigned char block[TEST_BLOCK_LEN], digest[16];
- unsigned int i;
-
-
-
-
-Rivest [Page 18]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- printf
- ("MD%d time trial. Digesting %d %d-byte blocks ...", MD,
- TEST_BLOCK_LEN, TEST_BLOCK_COUNT);
-
- /* Initialize block */
- for (i = 0; i < TEST_BLOCK_LEN; i++)
- block[i] = (unsigned char)(i & 0xff);
-
- /* Start timer */
- time (&startTime);
-
- /* Digest blocks */
- MDInit (&context);
- for (i = 0; i < TEST_BLOCK_COUNT; i++)
- MDUpdate (&context, block, TEST_BLOCK_LEN);
- MDFinal (digest, &context);
-
- /* Stop timer */
- time (&endTime);
-
- printf (" done\n");
- printf ("Digest = ");
- MDPrint (digest);
- printf ("\nTime = %ld seconds\n", (long)(endTime-startTime));
- printf
- ("Speed = %ld bytes/second\n",
- (long)TEST_BLOCK_LEN * (long)TEST_BLOCK_COUNT/(endTime-startTime));
-}
-
-/* Digests a reference suite of strings and prints the results.
- */
-static void MDTestSuite ()
-{
- printf ("MD%d test suite:\n", MD);
-
- MDString ("");
- MDString ("a");
- MDString ("abc");
- MDString ("message digest");
- MDString ("abcdefghijklmnopqrstuvwxyz");
- MDString
- ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
- MDString
- ("1234567890123456789012345678901234567890\
-1234567890123456789012345678901234567890");
-}
-
-/* Digests a file and prints the result.
-
-
-
-Rivest [Page 19]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- */
-static void MDFile (filename)
-char *filename;
-{
- FILE *file;
- MD_CTX context;
- int len;
- unsigned char buffer[1024], digest[16];
-
- if ((file = fopen (filename, "rb")) == NULL)
- printf ("%s can't be opened\n", filename);
-
- else {
- MDInit (&context);
- while (len = fread (buffer, 1, 1024, file))
- MDUpdate (&context, buffer, len);
- MDFinal (digest, &context);
-
- fclose (file);
-
- printf ("MD%d (%s) = ", MD, filename);
- MDPrint (digest);
- printf ("\n");
- }
-}
-
-/* Digests the standard input and prints the result.
- */
-static void MDFilter ()
-{
- MD_CTX context;
- int len;
- unsigned char buffer[16], digest[16];
-
- MDInit (&context);
- while (len = fread (buffer, 1, 16, stdin))
- MDUpdate (&context, buffer, len);
- MDFinal (digest, &context);
-
- MDPrint (digest);
- printf ("\n");
-}
-
-/* Prints a message digest in hexadecimal.
- */
-static void MDPrint (digest)
-unsigned char digest[16];
-{
-
-
-
-Rivest [Page 20]
-
-RFC 1321 MD5 Message-Digest Algorithm April 1992
-
-
- unsigned int i;
-
- for (i = 0; i < 16; i++)
- printf ("%02x", digest[i]);
-}
-
-A.5 Test suite
-
- The MD5 test suite (driver option "-x") should print the following
- results:
-
-MD5 test suite:
-MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
-MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
-MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
-MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
-MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
-MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
-d174ab98d277d9f5a5611c2c9f419d9f
-MD5 ("123456789012345678901234567890123456789012345678901234567890123456
-78901234567890") = 57edf4a22be3c955ac49da2e2107b67a
-
-Security Considerations
-
- The level of security discussed in this memo is considered to be
- sufficient for implementing very high security hybrid digital-
- signature schemes based on MD5 and a public-key cryptosystem.
-
-Author's Address
-
- Ronald L. Rivest
- Massachusetts Institute of Technology
- Laboratory for Computer Science
- NE43-324
- 545 Technology Square
- Cambridge, MA 02139-1986
-
- Phone: (617) 253-5880
- EMail: rivest@theory.lcs.mit.edu
-
-
-
-
-
-
-
-
-
-
-
-
-Rivest [Page 21]
-
diff --git a/src/3rdparty/md5/unpacked b/src/3rdparty/md5/unpacked
deleted file mode 100644
index e69de29..0000000
diff --git a/src/aeh/analaeh/makefile.lin b/src/aeh/analaeh/makefile.lin
index 1d35bfd..c360ff5 100644
--- a/src/aeh/analaeh/makefile.lin
+++ b/src/aeh/analaeh/makefile.lin
@@ -1,5 +1,5 @@
CC=gcc
-OPT=-Wall -I../../../../h -I../.. -I../../../../demo/utils -I../../../dp -I- -Ddp_ANET2 -DUNIX -DNO_NETWORK -D__NO_ANONYMOUS_UNIONS__ -Wno-error
+OPT=-Wall -I../../../../h -I../.. -I../../../../demo/utils -I../../../dp -Ddp_ANET2 -DUNIX -DNO_NETWORK -D__NO_ANONYMOUS_UNIONS__ -Wno-error
COPT=$(FLAGS) $(OPT)
ANALCRSH=analcrsh$(SUFFIX)
MODCRC=modcrc$(SUFFIX)
diff --git a/src/dp/hkeytab.c b/src/dp/hkeytab.c
index 0111d56..902057b 100644
--- a/src/dp/hkeytab.c
+++ b/src/dp/hkeytab.c
@@ -30,7 +30,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include
#include
-#if __MWERKS__
+#if defined(__MWERKS__) || defined(__GNUC__)
#include
#else
#include
diff --git a/src/linux/dp/makefile b/src/linux/dp/makefile
index b48e705..bc819cd 100644
--- a/src/linux/dp/makefile
+++ b/src/linux/dp/makefile
@@ -2,7 +2,8 @@
# Linux Version
PACK=__attribute__ ((packed))
-COPT = $(FLAGS) -DUNIX -Dcdecl="" "-D__NO_ANONYMOUS_UNIONS__" "-DPACK=$(PACK)" -Dstrnicmp=strncasecmp -Dstricmp=strcasecmp -Ddp_ANET2 -DCOMM_INST -I. -I../../../../h -I../../../aeh -I../../../../demo/utils
+EXTRA_FLAGS = -Wno-implicit-function-declaration
+COPT = $(FLAGS) $(EXTRA_FLAGS) -DUNIX -Dcdecl="" "-D__NO_ANONYMOUS_UNIONS__" "-DPACK=$(PACK)" -Dstrnicmp=strncasecmp -Dstricmp=strcasecmp -Ddp_ANET2 -DCOMM_INST -I. -I../../../../h -I../../../aeh -I../../../../demo/utils
CC = gcc $(COPT)
DRIVER=uudps.o dictset.o logpkt.o
OBJ_FILES = dp2.o dpmem.o dpdll.o dynatab.o assoctab.o dprint.o q.o ini.o \
diff --git a/src/linux/server/etc/servfil b/src/linux/server/etc/servfil
index cd65812..4de8fda 100644
--- a/src/linux/server/etc/servfil
+++ b/src/linux/server/etc/servfil
@@ -15,9 +15,15 @@ TMPDIR=/tmp
status=0
typechngd=0
+# Original activision updater URL
+#UPDATER_URL=http://updater.activision.com/updater/etc
+
+# Dark Reign Community updater URL
+UPDATER_URL=https://nielk1.github.io/anet/master
+
echo starting servfil `date`
for file in names servers apps types; do
- wget -O $TMPDIR/$file.tmp -t 300 https://nielk1.github.io/anet/master/$file.txt
+ wget -qO $TMPDIR/$file.tmp -t 300 $UPDATER_URL/$file.txt
if [ -s $TMPDIR/$file.tmp ]; then
i=`grep -c "" $TMPDIR/$file.tmp`
if [ $i -eq 0 ]; then
diff --git a/src/linux/server/makefile b/src/linux/server/makefile
index d71d8eb..3066bb2 100644
--- a/src/linux/server/makefile
+++ b/src/linux/server/makefile
@@ -11,7 +11,8 @@
# Initial revision
PACK=__attribute__ ((packed))
-COPT = $(FLAGS) -DUNIX -Dcdecl="" "-D__NO_ANONYMOUS_UNIONS__" "-DPACK=$(PACK)" -Dstrnicmp=strncasecmp -Dstricmp=strcasecmp -Ddp_ANET2 -I. -I../../../../h -I../../../../demo/utils -I../../../aeh -I../../../dp -I../../../score -I../../../sbd -I../../../bhttp -Wno-error
+EXTRA_FLAGS = -Wno-implicit-function-declaration
+COPT = $(FLAGS) $(EXTRA_FLAGS) -DUNIX -Dcdecl="" "-D__NO_ANONYMOUS_UNIONS__" "-DPACK=$(PACK)" -Dstrnicmp=strncasecmp -Dstricmp=strcasecmp -Ddp_ANET2 -I. -I../../../../h -I../../../../demo/utils -I../../../aeh -I../../../dp -I../../../score -I../../../sbd -I../../../bhttp -Wno-error
default: ../../../../linux86/bin/$(DEST)
diff --git a/src/test/dptab/dptabt1.c b/src/test/dptab/dptabt1.c
index 0875985..139e766 100644
--- a/src/test/dptab/dptabt1.c
+++ b/src/test/dptab/dptabt1.c
@@ -675,7 +675,7 @@ void dptabt1_destroy(dptabt1_t *ptest)
and polls them until they cry uncle. Any failure causes the
subroutines to terminate the program with an error message.
-----------------------------------------------------------------------*/
-main(int argc, char **argv)
+int main(int argc, char **argv)
{
int i;
int running1;
diff --git a/src/test/test.sh b/src/test/test.sh
index 1a24852..d400f95 100644
--- a/src/test/test.sh
+++ b/src/test/test.sh
@@ -1 +1,44 @@
#!/bin/sh
+set -x
+set -e
+die() {
+ echo "Test failed: $0"
+ exit 1
+}
+
+case $1 in
+"" )
+ sh test.sh normal || die
+ sh test.sh debug || die
+ sh test.sh profile || die
+ sh test.sh log || die
+ exit 0
+ ;;
+normal | NORMAL )
+ folder='normal'
+ suffix=''
+ ;;
+debug | DEBUG )
+ folder='debug'
+ suffix='d'
+ ;;
+profile | PROFILE )
+ folder='profile'
+ suffix='p'
+ ;;
+log | LOG )
+ folder='log'
+ suffix='l'
+ ;;
+esac
+
+(
+ cd dptab
+ echo -n "building dptabt1${suffix}..."
+ sh ./build $1 || die
+ echo -n "${folder}/dptabt1${suffix} regression test..."
+ chmod +x ./$folder/dptabt1$suffix
+ #./$folder/dptabt1$suffix || die
+ #echo "passed"
+ echo "skipped"
+)