summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/input/Makefile.am2
-rw-r--r--src/input/base64.c133
-rw-r--r--src/input/base64.h95
-rw-r--r--src/input/input_cdda.c61
-rw-r--r--src/input/sha1.c329
-rw-r--r--src/input/sha1.h61
6 files changed, 674 insertions, 7 deletions
diff --git a/src/input/Makefile.am b/src/input/Makefile.am
index 5d834fb22..35672d934 100644
--- a/src/input/Makefile.am
+++ b/src/input/Makefile.am
@@ -108,7 +108,7 @@ xineplug_inp_rtsp_la_SOURCES = input_rtsp.c net_buf_ctrl.c
xineplug_inp_rtsp_la_LIBADD = $(XINE_LIB) libreal/libreal.la librtsp/librtsp.la
xineplug_inp_rtsp_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@
-xineplug_inp_cdda_la_SOURCES = input_cdda.c media_helper.c
+xineplug_inp_cdda_la_SOURCES = input_cdda.c media_helper.c sha1.c sha1.h base64.c base64.h
xineplug_inp_cdda_la_LIBADD = $(XINE_LIB)
xineplug_inp_cdda_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@
diff --git a/src/input/base64.c b/src/input/base64.c
new file mode 100644
index 000000000..777d29ac1
--- /dev/null
+++ b/src/input/base64.c
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2000 Robert Kaye
+ *
+ * This file is part of xine, a free video player.
+ *
+ * xine is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * xine is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * Base64 encoding modified for Musicbrainz
+ * relicensed under the GNU General Public License for use in xine-lib
+ *
+ */
+/* --------------------------------------------------------------------------
+
+ MusicBrainz -- The Internet music metadatabase
+
+ Copyright (C) 2000 Robert Kaye
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ $Id: base64.c,v 1.1 2004/05/05 09:11:39 hadess Exp $
+
+----------------------------------------------------------------------------*/
+/*
+ * Program: RFC-822 routines (originally from SMTP)
+ *
+ * Author: Mark Crispin
+ * Networks and Distributed Computing
+ * Computing & Communications
+ * University of Washington
+ * Administration Building, AG-44
+ * Seattle, WA 98195
+ * Internet: MRC@CAC.Washington.EDU
+ *
+ * Date: 27 July 1988
+ * Last Edited: 10 September 1998
+ *
+ * Sponsorship: The original version of this work was developed in the
+ * Symbolic Systems Resources Group of the Knowledge Systems
+ * Laboratory at Stanford University in 1987-88, and was funded
+ * by the Biomedical Research Technology Program of the National
+ * Institutes of Health under grant number RR-00785.
+ *
+ * Original version Copyright 1988 by The Leland Stanford Junior University
+ * Copyright 1998 by the University of Washington
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notices appear in all copies and that both the
+ * above copyright notices and this permission notice appear in supporting
+ * documentation, and that the name of the University of Washington or The
+ * Leland Stanford Junior University not be used in advertising or publicity
+ * pertaining to distribution of the software without specific, written prior
+ * permission. This software is made available "as is", and
+ * THE UNIVERSITY OF WASHINGTON AND THE LELAND STANFORD JUNIOR UNIVERSITY
+ * DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING WITHOUT LIMITATION ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE, AND IN NO EVENT SHALL THE UNIVERSITY OF
+ * WASHINGTON OR THE LELAND STANFORD JUNIOR UNIVERSITY BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#include <ctype.h>
+#include <stdio.h>
+#include <time.h>
+#include <stdlib.h>
+
+
+/* NOTE: This is not true RFC822 anymore. The use of the characters
+ '/', '+', and '=' is no bueno when the ID will be used as part of a URL.
+ '_', '.', and '-' have been used instead
+*/
+
+/* Convert binary contents to BASE64
+ * Accepts: source
+ * length of source
+ * pointer to return destination length
+ * Returns: destination as BASE64
+ */
+
+unsigned char *rfc822_binary (void *src,unsigned long srcl,unsigned long *len)
+{
+ unsigned char *ret,*d;
+ unsigned char *s = (unsigned char *) src;
+ char *v = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._";
+ unsigned long i = ((srcl + 2) / 3) * 4;
+ *len = i += 2 * ((i / 60) + 1);
+ d = ret = (unsigned char *) malloc ((size_t) ++i);
+ for (i = 0; srcl; s += 3) { /* process tuplets */
+ *d++ = v[s[0] >> 2]; /* byte 1: high 6 bits (1) */
+ /* byte 2: low 2 bits (1), high 4 bits (2) */
+ *d++ = v[((s[0] << 4) + (--srcl ? (s[1] >> 4) : 0)) & 0x3f];
+ /* byte 3: low 4 bits (2), high 2 bits (3) */
+ *d++ = srcl ? v[((s[1] << 2) + (--srcl ? (s[2] >> 6) : 0)) & 0x3f] : '-';
+ /* byte 4: low 6 bits (3) */
+ *d++ = srcl ? v[s[2] & 0x3f] : '-';
+ if (srcl) srcl--; /* count third character if processed */
+ if ((++i) == 15) { /* output 60 characters? */
+ i = 0; /* restart line break count, insert CRLF */
+ *d++ = '\015'; *d++ = '\012';
+ }
+ }
+ *d = '\0'; /* tie off string */
+
+ return ret; /* return the resulting string */
+}
diff --git a/src/input/base64.h b/src/input/base64.h
new file mode 100644
index 000000000..72feef885
--- /dev/null
+++ b/src/input/base64.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2000 Robert Kaye
+ *
+ * This file is part of xine, a free video player.
+ *
+ * xine is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * xine is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * Base64 encoding modified for Musicbrainz
+ * relicensed under the GNU General Public License for use in xine-lib
+ *
+ */
+/* --------------------------------------------------------------------------
+
+ MusicBrainz -- The Internet music metadatabase
+
+ Copyright (C) 2000 Robert Kaye
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ $Id: base64.h,v 1.1 2004/05/05 09:11:39 hadess Exp $
+
+----------------------------------------------------------------------------*/
+/*
+ * Program: RFC-822 routines (originally from SMTP)
+ *
+ * Author: Mark Crispin
+ * Networks and Distributed Computing
+ * Computing & Communications
+ * University of Washington
+ * Administration Building, AG-44
+ * Seattle, WA 98195
+ * Internet: MRC@CAC.Washington.EDU
+ *
+ * Date: 27 July 1988
+ * Last Edited: 10 September 1998
+ *
+ * Sponsorship: The original version of this work was developed in the
+ * Symbolic Systems Resources Group of the Knowledge Systems
+ * Laboratory at Stanford University in 1987-88, and was funded
+ * by the Biomedical Research Technology Program of the National
+ * Institutes of Health under grant number RR-00785.
+ *
+ * Original version Copyright 1988 by The Leland Stanford Junior University
+ * Copyright 1998 by the University of Washington
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notices appear in all copies and that both the
+ * above copyright notices and this permission notice appear in supporting
+ * documentation, and that the name of the University of Washington or The
+ * Leland Stanford Junior University not be used in advertising or publicity
+ * pertaining to distribution of the software without specific, written prior
+ * permission. This software is made available "as is", and
+ * THE UNIVERSITY OF WASHINGTON AND THE LELAND STANFORD JUNIOR UNIVERSITY
+ * DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING WITHOUT LIMITATION ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE, AND IN NO EVENT SHALL THE UNIVERSITY OF
+ * WASHINGTON OR THE LELAND STANFORD JUNIOR UNIVERSITY BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#ifndef BASE64_H
+#define BASE64_H
+
+unsigned char *rfc822_binary (void *src,unsigned long srcl,unsigned long *len);
+
+#endif
diff --git a/src/input/input_cdda.c b/src/input/input_cdda.c
index 1ad33179a..d2025c4d2 100644
--- a/src/input/input_cdda.c
+++ b/src/input/input_cdda.c
@@ -20,7 +20,7 @@
* Compact Disc Digital Audio (CDDA) Input Plugin
* by Mike Melanson (melanson@pcisys.net)
*
- * $Id: input_cdda.c,v 1.52 2004/05/02 15:17:39 valtri Exp $
+ * $Id: input_cdda.c,v 1.53 2004/05/05 09:11:39 hadess Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -54,6 +54,7 @@
#define LOG
*/
+#include "sha1.h"
#include "xine_internal.h"
#include "xineutils.h"
#include "input_plugin.h"
@@ -452,14 +453,20 @@ static int read_cdrom_toc(int fd, cdrom_toc *toc) {
return -1;
}
+#define XA_INTERVAL ((60 + 90 + 2) * CD_FRAMES)
+
toc->leadout_track.track_mode = (tocentry.cdte_ctrl & 0x04) ? 1 : 0;
toc->leadout_track.first_frame_minute = tocentry.cdte_addr.msf.minute;
toc->leadout_track.first_frame_second = tocentry.cdte_addr.msf.second;
toc->leadout_track.first_frame_frame = tocentry.cdte_addr.msf.frame;
- toc->leadout_track.first_frame =
- (tocentry.cdte_addr.msf.minute * CD_SECONDS_PER_MINUTE * CD_FRAMES_PER_SECOND) +
- (tocentry.cdte_addr.msf.second * CD_FRAMES_PER_SECOND) +
- tocentry.cdte_addr.msf.frame;
+ if (!ms.xa_flag) {
+ toc->leadout_track.first_frame =
+ (tocentry.cdte_addr.msf.minute * CD_SECONDS_PER_MINUTE * CD_FRAMES_PER_SECOND) +
+ (tocentry.cdte_addr.msf.second * CD_FRAMES_PER_SECOND) +
+ tocentry.cdte_addr.msf.frame;
+ } else {
+ toc->leadout_track.first_frame = ms.addr.lba - XA_INTERVAL + 150;
+ }
return 0;
}
@@ -1693,6 +1700,46 @@ static unsigned long _cdda_calc_cddb_id(cdda_input_plugin_t *this) {
}
/*
+ * Compute Musicbrainz CDIndex ID
+ */
+static void _cdda_cdindex(cdda_input_plugin_t *this, cdrom_toc *toc) {
+ char temp[10];
+ SHA_INFO sha;
+ unsigned char digest[33], *base64;
+ int i, size;
+
+ sha_init(&sha);
+
+ sprintf(temp, "%02X", toc->first_track);
+ sha_update(&sha, (unsigned char*) temp, strlen(temp));
+
+ sprintf(temp, "%02X", toc->last_track - toc->ignore_last_track);
+ sha_update(&sha, (unsigned char*) temp, strlen(temp));
+
+ sprintf (temp, "%08X", toc->leadout_track.first_frame);// + 150);
+ sha_update(&sha, (unsigned char*) temp, strlen(temp));
+
+ for (i = toc->first_track; i <= toc->last_track - toc->ignore_last_track; i++) {
+ sprintf(temp, "%08X", toc->toc_entries[i - 1].first_frame);
+ sha_update(&sha, (unsigned char*) temp, strlen(temp));
+ }
+
+ for (i = toc->last_track - toc->ignore_last_track + 1; i < 100; i++) {
+ sha_update(&sha, (unsigned char*) temp, strlen(temp));
+ }
+
+ sha_final(digest, &sha);
+
+ base64 = rfc822_binary(digest, 20, &size);
+ base64[size] = 0;
+
+ printf ("disc id: %s\n", base64);
+ //_x_meta_info_set(this->stream, XINE_META_INFO_CDINDEX_DISCID, base64);
+
+ free (base64);
+}
+
+/*
* return cbbd disc id.
*/
static unsigned long _cdda_get_cddb_id(cdda_input_plugin_t *this) {
@@ -2137,7 +2184,9 @@ static int cdda_plugin_open (input_plugin_t *this_gen ) {
/* invalidate cache */
this->cache_first = this->cache_last = -1;
-
+
+ /* get the Musicbrainz CDIndex */
+ _cdda_cdindex (this, toc);
/*
* CDDB
diff --git a/src/input/sha1.c b/src/input/sha1.c
new file mode 100644
index 000000000..aa46f0311
--- /dev/null
+++ b/src/input/sha1.c
@@ -0,0 +1,329 @@
+/* (PD) 2001 The Bitzi Corporation
+ * Please see file COPYING or http://bitzi.com/publicdomain
+ * for more info.
+ *
+ * NIST Secure Hash Algorithm
+ * heavily modified by Uwe Hollerbach <uh@alumni.caltech edu>
+ * from Peter C. Gutmann's implementation as found in
+ * Applied Cryptography by Bruce Schneier
+ * Further modifications to include the "UNRAVEL" stuff, below
+ *
+ * This code is in the public domain
+ *
+ * $Id: sha1.c,v 1.1 2004/05/05 09:11:39 hadess Exp $
+ */
+
+#include <string.h>
+#include "sha1.h"
+
+/* UNRAVEL should be fastest & biggest */
+/* UNROLL_LOOPS should be just as big, but slightly slower */
+/* both undefined should be smallest and slowest */
+
+#define UNRAVEL
+/* #define UNROLL_LOOPS */
+
+/* SHA f()-functions */
+
+#define f1(x,y,z) ((x & y) | (~x & z))
+#define f2(x,y,z) (x ^ y ^ z)
+#define f3(x,y,z) ((x & y) | (x & z) | (y & z))
+#define f4(x,y,z) (x ^ y ^ z)
+
+/* SHA constants */
+
+#define CONST1 0x5a827999L
+#define CONST2 0x6ed9eba1L
+#define CONST3 0x8f1bbcdcL
+#define CONST4 0xca62c1d6L
+
+/* truncate to 32 bits -- should be a null op on 32-bit machines */
+
+#define T32(x) ((x) & 0xffffffffL)
+
+/* 32-bit rotate */
+
+#define R32(x,n) T32(((x << n) | (x >> (32 - n))))
+
+/* the generic case, for when the overall rotation is not unraveled */
+
+#define FG(n) \
+ T = T32(R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n); \
+ E = D; D = C; C = R32(B,30); B = A; A = T
+
+/* specific cases, for when the overall rotation is unraveled */
+
+#define FA(n) \
+ T = T32(R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n); B = R32(B,30)
+
+#define FB(n) \
+ E = T32(R32(T,5) + f##n(A,B,C) + D + *WP++ + CONST##n); A = R32(A,30)
+
+#define FC(n) \
+ D = T32(R32(E,5) + f##n(T,A,B) + C + *WP++ + CONST##n); T = R32(T,30)
+
+#define FD(n) \
+ C = T32(R32(D,5) + f##n(E,T,A) + B + *WP++ + CONST##n); E = R32(E,30)
+
+#define FE(n) \
+ B = T32(R32(C,5) + f##n(D,E,T) + A + *WP++ + CONST##n); D = R32(D,30)
+
+#define FT(n) \
+ A = T32(R32(B,5) + f##n(C,D,E) + T + *WP++ + CONST##n); C = R32(C,30)
+
+/* do SHA transformation */
+
+static void sha_transform(SHA_INFO *sha_info)
+{
+ int i;
+ SHA_BYTE *dp;
+ SHA_LONG T, A, B, C, D, E, W[80], *WP;
+
+ dp = sha_info->data;
+
+/*
+the following makes sure that at least one code block below is
+traversed or an error is reported, without the necessity for nested
+preprocessor if/else/endif blocks, which are a great pain in the
+nether regions of the anatomy...
+*/
+#undef SWAP_DONE
+
+#if (SHA_BYTE_ORDER == 1234)
+#define SWAP_DONE
+ for (i = 0; i < 16; ++i) {
+ T = *((SHA_LONG *) dp);
+ dp += 4;
+ W[i] = ((T << 24) & 0xff000000) | ((T << 8) & 0x00ff0000) |
+ ((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
+ }
+#endif /* SHA_BYTE_ORDER == 1234 */
+
+#if (SHA_BYTE_ORDER == 4321)
+#define SWAP_DONE
+ for (i = 0; i < 16; ++i) {
+ T = *((SHA_LONG *) dp);
+ dp += 4;
+ W[i] = T32(T);
+ }
+#endif /* SHA_BYTE_ORDER == 4321 */
+
+#if (SHA_BYTE_ORDER == 12345678)
+#define SWAP_DONE
+ for (i = 0; i < 16; i += 2) {
+ T = *((SHA_LONG *) dp);
+ dp += 8;
+ W[i] = ((T << 24) & 0xff000000) | ((T << 8) & 0x00ff0000) |
+ ((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
+ T >>= 32;
+ W[i+1] = ((T << 24) & 0xff000000) | ((T << 8) & 0x00ff0000) |
+ ((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
+ }
+#endif /* SHA_BYTE_ORDER == 12345678 */
+
+#if (SHA_BYTE_ORDER == 87654321)
+#define SWAP_DONE
+ for (i = 0; i < 16; i += 2) {
+ T = *((SHA_LONG *) dp);
+ dp += 8;
+ W[i] = T32(T >> 32);
+ W[i+1] = T32(T);
+ }
+#endif /* SHA_BYTE_ORDER == 87654321 */
+
+#ifndef SWAP_DONE
+#error Unknown byte order -- you need to add code here
+#endif /* SWAP_DONE */
+
+ for (i = 16; i < 80; ++i) {
+ W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
+#if (SHA_VERSION == 1)
+ W[i] = R32(W[i], 1);
+#endif /* SHA_VERSION */
+ }
+ A = sha_info->digest[0];
+ B = sha_info->digest[1];
+ C = sha_info->digest[2];
+ D = sha_info->digest[3];
+ E = sha_info->digest[4];
+ WP = W;
+#ifdef UNRAVEL
+ FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); FC(1); FD(1);
+ FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1);
+ FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); FE(2); FT(2);
+ FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2);
+ FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); FA(3); FB(3);
+ FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3);
+ FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); FC(4); FD(4);
+ FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4);
+ sha_info->digest[0] = T32(sha_info->digest[0] + E);
+ sha_info->digest[1] = T32(sha_info->digest[1] + T);
+ sha_info->digest[2] = T32(sha_info->digest[2] + A);
+ sha_info->digest[3] = T32(sha_info->digest[3] + B);
+ sha_info->digest[4] = T32(sha_info->digest[4] + C);
+#else /* !UNRAVEL */
+#ifdef UNROLL_LOOPS
+ FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1);
+ FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1);
+ FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2);
+ FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2);
+ FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3);
+ FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3);
+ FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4);
+ FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4);
+#else /* !UNROLL_LOOPS */
+ for (i = 0; i < 20; ++i) { FG(1); }
+ for (i = 20; i < 40; ++i) { FG(2); }
+ for (i = 40; i < 60; ++i) { FG(3); }
+ for (i = 60; i < 80; ++i) { FG(4); }
+#endif /* !UNROLL_LOOPS */
+ sha_info->digest[0] = T32(sha_info->digest[0] + A);
+ sha_info->digest[1] = T32(sha_info->digest[1] + B);
+ sha_info->digest[2] = T32(sha_info->digest[2] + C);
+ sha_info->digest[3] = T32(sha_info->digest[3] + D);
+ sha_info->digest[4] = T32(sha_info->digest[4] + E);
+#endif /* !UNRAVEL */
+}
+
+/* initialize the SHA digest */
+
+void sha_init(SHA_INFO *sha_info)
+{
+ sha_info->digest[0] = 0x67452301L;
+ sha_info->digest[1] = 0xefcdab89L;
+ sha_info->digest[2] = 0x98badcfeL;
+ sha_info->digest[3] = 0x10325476L;
+ sha_info->digest[4] = 0xc3d2e1f0L;
+ sha_info->count_lo = 0L;
+ sha_info->count_hi = 0L;
+ sha_info->local = 0;
+}
+
+/* update the SHA digest */
+
+void sha_update(SHA_INFO *sha_info, SHA_BYTE *buffer, int count)
+{
+ int i;
+ SHA_LONG clo;
+
+ clo = T32(sha_info->count_lo + ((SHA_LONG) count << 3));
+ if (clo < sha_info->count_lo) {
+ ++sha_info->count_hi;
+ }
+ sha_info->count_lo = clo;
+ sha_info->count_hi += (SHA_LONG) count >> 29;
+ if (sha_info->local) {
+ i = SHA_BLOCKSIZE - sha_info->local;
+ if (i > count) {
+ i = count;
+ }
+ memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);
+ count -= i;
+ buffer += i;
+ sha_info->local += i;
+ if (sha_info->local == SHA_BLOCKSIZE) {
+ sha_transform(sha_info);
+ } else {
+ return;
+ }
+ }
+ while (count >= SHA_BLOCKSIZE) {
+ memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
+ buffer += SHA_BLOCKSIZE;
+ count -= SHA_BLOCKSIZE;
+ sha_transform(sha_info);
+ }
+ memcpy(sha_info->data, buffer, count);
+ sha_info->local = count;
+}
+
+/* finish computing the SHA digest */
+
+void sha_final(unsigned char digest[20], SHA_INFO *sha_info)
+{
+ int count;
+ SHA_LONG lo_bit_count, hi_bit_count;
+
+ lo_bit_count = sha_info->count_lo;
+ hi_bit_count = sha_info->count_hi;
+ count = (int) ((lo_bit_count >> 3) & 0x3f);
+ ((SHA_BYTE *) sha_info->data)[count++] = 0x80;
+ if (count > SHA_BLOCKSIZE - 8) {
+ memset(((SHA_BYTE *) sha_info->data) + count, 0, SHA_BLOCKSIZE - count);
+ sha_transform(sha_info);
+ memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8);
+ } else {
+ memset(((SHA_BYTE *) sha_info->data) + count, 0,
+ SHA_BLOCKSIZE - 8 - count);
+ }
+ sha_info->data[56] = (unsigned char) ((hi_bit_count >> 24) & 0xff);
+ sha_info->data[57] = (unsigned char) ((hi_bit_count >> 16) & 0xff);
+ sha_info->data[58] = (unsigned char) ((hi_bit_count >> 8) & 0xff);
+ sha_info->data[59] = (unsigned char) ((hi_bit_count >> 0) & 0xff);
+ sha_info->data[60] = (unsigned char) ((lo_bit_count >> 24) & 0xff);
+ sha_info->data[61] = (unsigned char) ((lo_bit_count >> 16) & 0xff);
+ sha_info->data[62] = (unsigned char) ((lo_bit_count >> 8) & 0xff);
+ sha_info->data[63] = (unsigned char) ((lo_bit_count >> 0) & 0xff);
+ sha_transform(sha_info);
+ digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);
+ digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);
+ digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff);
+ digest[ 3] = (unsigned char) ((sha_info->digest[0] ) & 0xff);
+ digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);
+ digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);
+ digest[ 6] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff);
+ digest[ 7] = (unsigned char) ((sha_info->digest[1] ) & 0xff);
+ digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);
+ digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);
+ digest[10] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff);
+ digest[11] = (unsigned char) ((sha_info->digest[2] ) & 0xff);
+ digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);
+ digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);
+ digest[14] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff);
+ digest[15] = (unsigned char) ((sha_info->digest[3] ) & 0xff);
+ digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);
+ digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);
+ digest[18] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff);
+ digest[19] = (unsigned char) ((sha_info->digest[4] ) & 0xff);
+}
+
+/* compute the SHA digest of a FILE stream */
+
+#define BLOCK_SIZE 8192
+
+void sha_stream(unsigned char digest[20], SHA_INFO *sha_info, FILE *fin)
+{
+ int i;
+ SHA_BYTE data[BLOCK_SIZE];
+
+ sha_init(sha_info);
+ while ((i = fread(data, 1, BLOCK_SIZE, fin)) > 0) {
+ sha_update(sha_info, data, i);
+ }
+ sha_final(digest, sha_info);
+}
+
+/* print a SHA digest */
+
+void sha_print(unsigned char digest[20])
+{
+ int i, j;
+
+ for (j = 0; j < 5; ++j) {
+ for (i = 0; i < 4; ++i) {
+ printf("%02x", *digest++);
+ }
+ printf("%c", (j < 4) ? ' ' : '\n');
+ }
+}
+
+char *sha_version(void)
+{
+#if (SHA_VERSION == 1)
+ static char *version = "SHA-1";
+#else
+ static char *version = "SHA";
+#endif
+ return(version);
+}
+
diff --git a/src/input/sha1.h b/src/input/sha1.h
new file mode 100644
index 000000000..6657c92e3
--- /dev/null
+++ b/src/input/sha1.h
@@ -0,0 +1,61 @@
+/* NIST Secure Hash Algorithm */
+/* heavily modified by Uwe Hollerbach <uh@alumni.caltech edu> */
+/* from Peter C. Gutmann's implementation as found in */
+/* Applied Cryptography by Bruce Schneier */
+/* This code is in the public domain */
+/* $Id: sha1.h,v 1.1 2004/05/05 09:11:39 hadess Exp $ */
+
+#ifndef SHA_H
+#define SHA_H
+
+#include <stdlib.h>
+#include <stdio.h>
+
+/* Useful defines & typedefs */
+typedef unsigned char SHA_BYTE; /* 8-bit quantity */
+typedef unsigned long SHA_LONG; /* 32-or-more-bit quantity */
+
+#define SHA_BLOCKSIZE 64
+#define SHA_DIGESTSIZE 20
+
+typedef struct {
+ SHA_LONG digest[5]; /* message digest */
+ SHA_LONG count_lo, count_hi; /* 64-bit bit count */
+ SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */
+ int local; /* unprocessed amount in data */
+} SHA_INFO;
+
+void sha_init(SHA_INFO *);
+void sha_update(SHA_INFO *, SHA_BYTE *, int);
+void sha_final(unsigned char [20], SHA_INFO *);
+
+void sha_stream(unsigned char [20], SHA_INFO *, FILE *);
+void sha_print(unsigned char [20]);
+char *sha_version(void);
+
+#define SHA_VERSION 1
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+
+#ifdef WORDS_BIGENDIAN
+# if SIZEOF_LONG == 4
+# define SHA_BYTE_ORDER 4321
+# elif SIZEOF_LONG == 8
+# define SHA_BYTE_ORDER 87654321
+# endif
+#else
+# if SIZEOF_LONG == 4
+# define SHA_BYTE_ORDER 1234
+# elif SIZEOF_LONG == 8
+# define SHA_BYTE_ORDER 12345678
+# endif
+#endif
+
+#else
+
+#define SHA_BYTE_ORDER 1234
+
+#endif
+
+#endif /* SHA_H */