diff options
Diffstat (limited to 'src/input')
-rw-r--r-- | src/input/Makefile.am | 10 | ||||
-rw-r--r-- | src/input/base64.c | 131 | ||||
-rw-r--r-- | src/input/base64.h | 91 | ||||
-rw-r--r-- | src/input/input_cdda.c | 37 | ||||
-rw-r--r-- | src/input/input_dvb.c | 8 | ||||
-rw-r--r-- | src/input/libreal/Makefile.am | 3 | ||||
-rw-r--r-- | src/input/libreal/sdpplin.c | 89 | ||||
-rw-r--r-- | src/input/sha1.c | 327 | ||||
-rw-r--r-- | src/input/sha1.h | 60 |
9 files changed, 50 insertions, 706 deletions
diff --git a/src/input/Makefile.am b/src/input/Makefile.am index ed32ad7c5..0abeaaeae 100644 --- a/src/input/Makefile.am +++ b/src/input/Makefile.am @@ -107,16 +107,16 @@ xineplug_inp_pnm_la_LIBADD = $(XINE_LIB) $(PTHREAD_LIBS) $(LTLIBINTL) xineplug_inp_dvb_la_SOURCES = input_dvb.c net_buf_ctrl.c xineplug_inp_dvb_la_DEPS = $(XDG_BASEDIR_DEPS) -xineplug_inp_dvb_la_LIBADD = $(XINE_LIB) $(PTHREAD_LIBS) $(LTLIBINTL) $(XDG_BASEDIR_LIBS) -xineplug_inp_dvb_la_CPPFLAGS = $(AM_CPPFLAGS) $(XDG_BASEDIR_CPPFLAGS) +xineplug_inp_dvb_la_LIBADD = $(XINE_LIB) $(PTHREAD_LIBS) $(LTLIBINTL) $(XDG_BASEDIR_LIBS) $(AVUTIL_LIBS) +xineplug_inp_dvb_la_CPPFLAGS = $(AM_CPPFLAGS) $(XDG_BASEDIR_CPPFLAGS) $(AVUTIL_CFLAGS) xineplug_inp_rtsp_la_SOURCES = input_rtsp.c net_buf_ctrl.c xineplug_inp_rtsp_la_LIBADD = $(XINE_LIB) $(PTHREAD_LIBS) $(LTLIBINTL) libreal/libreal.la librtsp/librtsp.la -xineplug_inp_cdda_la_SOURCES = input_cdda.c media_helper.c sha1.c sha1.h base64.c base64.h +xineplug_inp_cdda_la_SOURCES = input_cdda.c media_helper.c xineplug_inp_cdda_la_DEPS = $(XDG_BASEDIR_DEPS) -xineplug_inp_cdda_la_LIBADD = $(XINE_LIB) $(LTLIBINTL) $(XDG_BASEDIR_LIBS) -xineplug_inp_cdda_la_CPPFLAGS = $(AM_CPPFLAGS) $(XDG_BASEDIR_CPPFLAGS) +xineplug_inp_cdda_la_LIBADD = $(XINE_LIB) $(LTLIBINTL) $(XDG_BASEDIR_LIBS) $(AVUTIL_LIBS) +xineplug_inp_cdda_la_CPPFLAGS = $(AM_CPPFLAGS) $(XDG_BASEDIR_CPPFLAGS) $(AVUTIL_CFLAGS) xineplug_inp_v4l_la_SOURCES = input_v4l.c xineplug_inp_v4l_la_LIBADD = $(ALSA_LIBS) $(XINE_LIB) $(LTLIBINTL) diff --git a/src/input/base64.c b/src/input/base64.c deleted file mode 100644 index ffb039802..000000000 --- a/src/input/base64.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - -----------------------------------------------------------------------------*/ -/* - * 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> - -#include "base64.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 deleted file mode 100644 index 5cc94d7f0..000000000 --- a/src/input/base64.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - -----------------------------------------------------------------------------*/ -/* - * 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 ed6f2b4f9..f89697981 100644 --- a/src/input/input_cdda.c +++ b/src/input/input_cdda.c @@ -58,14 +58,16 @@ #include <basedir.h> +/* libavutil from FFmpeg */ +#include <base64.h> +#include <sha1.h> + #define LOG_MODULE "input_cdda" #define LOG_VERBOSE /* #define LOG */ -#include "sha1.h" -#include "base64.h" #include "xine_internal.h" #include "xineutils.h" #include "input_plugin.h" @@ -1911,39 +1913,42 @@ static unsigned long _cdda_calc_cddb_id(cdda_input_plugin_t *this) { */ static void _cdda_cdindex(cdda_input_plugin_t *this, cdrom_toc *toc) { char temp[10]; - SHA_INFO sha; - unsigned char digest[33], *base64; + struct AVSHA1 *sha_ctx = malloc(av_sha1_size); + unsigned char digest[20]; + /* We're going to encode 20 bytes in base64, which will become + * 6 * 32 / 8 = 24 bytes. + * libavutil's base64 encoding functions, though, wants the size to + * be at least len * 4 / 3 + 12, so let's use 39. + */ + char base64[39]; int i; - unsigned long size; - sha_init(&sha); + av_sha1_init(sha_ctx); sprintf(temp, "%02X", toc->first_track); - sha_update(&sha, (unsigned char*) temp, strlen(temp)); + av_sha1_update(sha_ctx, (unsigned char*) temp, strlen(temp)); sprintf(temp, "%02X", toc->last_track - toc->ignore_last_track); - sha_update(&sha, (unsigned char*) temp, strlen(temp)); + av_sha1_update(sha_ctx, (unsigned char*) temp, strlen(temp)); sprintf (temp, "%08X", toc->leadout_track.first_frame);// + 150); - sha_update(&sha, (unsigned char*) temp, strlen(temp)); + av_sha1_update(sha_ctx, (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)); + av_sha1_update(sha_ctx, (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)); + av_sha1_update(sha_ctx, (unsigned char*) temp, strlen(temp)); } - sha_final(digest, &sha); + av_sha1_final(sha_ctx, digest); + free(sha_ctx); - base64 = rfc822_binary(digest, 20, &size); - base64[size] = 0; + av_base64_encode(base64, 39, digest, 20); _x_meta_info_set_utf8(this->stream, XINE_META_INFO_CDINDEX_DISCID, base64); - - free (base64); } /* diff --git a/src/input/input_dvb.c b/src/input/input_dvb.c index 1151d9a81..9a40b1996 100644 --- a/src/input/input_dvb.c +++ b/src/input/input_dvb.c @@ -100,6 +100,9 @@ #endif #include <ctype.h> +/* libavutil from FFmpeg */ +#include <crc.h> + /* XDG */ #include <basedir.h> @@ -2445,6 +2448,9 @@ static void ts_rewrite_packets (dvb_input_plugin_t *this, unsigned char * origin originalPkt+=data_offset; if (pid == 0 && sync_byte==0x47) { + if ( ! *av_crc04C11DB7 ) + av_crc_init(av_crc04C11DB7, 0, 32, AV_CRC_32_IEEE, sizeof(AVCRC)*257); + unsigned long crc; originalPkt[3]=13; /* section length including CRC - first 3 bytes */ @@ -2456,7 +2462,7 @@ static void ts_rewrite_packets (dvb_input_plugin_t *this, unsigned char * origin originalPkt[11]=(this->channels[this->channel].pmtpid >> 8) & 0xff; originalPkt[12]=this->channels[this->channel].pmtpid & 0xff; - crc= _x_compute_crc32 (originalPkt+1, 12, 0xffffffff); + crc = av_crc(av_crc04C11DB7, 0xffffffff, originalPkt+1, 12); originalPkt[13]=(crc>>24) & 0xff; originalPkt[14]=(crc>>16) & 0xff; diff --git a/src/input/libreal/Makefile.am b/src/input/libreal/Makefile.am index bd97a7548..0bd002963 100644 --- a/src/input/libreal/Makefile.am +++ b/src/input/libreal/Makefile.am @@ -1,10 +1,11 @@ include $(top_srcdir)/misc/Makefile.common AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) -AM_CPPFLAGS = -I$(top_srcdir)/src/input/librtsp +AM_CPPFLAGS = -I$(top_srcdir)/src/input/librtsp $(AVUTIL_CFLAGS) noinst_HEADERS = real.h asmrp.h rmff.h sdpplin.h noinst_LTLIBRARIES = libreal.la libreal_la_SOURCES = real.c asmrp.c rmff.c sdpplin.c +libreal_la_LIBADD = $(AVUTIL_LIBS) diff --git a/src/input/libreal/sdpplin.c b/src/input/libreal/sdpplin.c index 5b22e9044..ad65bd491 100644 --- a/src/input/libreal/sdpplin.c +++ b/src/input/libreal/sdpplin.c @@ -31,65 +31,8 @@ #include "sdpplin.h" #include "xineutils.h" -/* - * Decodes base64 strings (based upon b64 package) - */ - -static char *b64_decode(const char *in, char *out, int *size) -{ - char dtable[256]; /* Encode / decode table */ - int i,k; - size_t j; - - for (i = 0; i < 255; i++) { - dtable[i] = 0x80; - } - for (i = 'A'; i <= 'Z'; i++) { - dtable[i] = 0 + (i - 'A'); - } - for (i = 'a'; i <= 'z'; i++) { - dtable[i] = 26 + (i - 'a'); - } - for (i = '0'; i <= '9'; i++) { - dtable[i] = 52 + (i - '0'); - } - dtable['+'] = 62; - dtable['/'] = 63; - dtable['='] = 0; - - k=0; - - /*CONSTANTCONDITION*/ - for (j=0; j<strlen(in); j+=4) - { - char a[4], b[4]; - - for (i = 0; i < 4; i++) { - int c = in[i+j]; - - if (dtable[c] & 0x80) { - fprintf(stderr, "Illegal character '%c' in input.\n", c); - *size = 0; - return NULL; - } - a[i] = (char) c; - b[i] = (char) dtable[c]; - } - xine_buffer_ensure_size(out, k+3); - out[k++] = (b[0] << 2) | (b[1] >> 4); - out[k++] = (b[1] << 4) | (b[2] >> 2); - out[k++] = (b[2] << 6) | b[3]; - i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3); - if (i < 3) { - out[k]=0; - *size=k; - return out; - } - } - out[k]=0; - *size=k; - return out; -} +/* libavutil from FFmpeg */ +#include <base64.h> static char *nl(char *data) { @@ -124,7 +67,6 @@ static sdpplin_stream_t *sdpplin_parse_stream(char **data) { sdpplin_stream_t *desc = xine_xmalloc(sizeof(sdpplin_stream_t)); char *buf=xine_buffer_init(32); - char *decoded=xine_buffer_init(32); int handled; if (filter(*data, "m=", &buf)) { @@ -197,9 +139,10 @@ static sdpplin_stream_t *sdpplin_parse_stream(char **data) { } if(filter(*data,"a=OpaqueData:buffer;",&buf)) { - decoded = b64_decode(buf, decoded, &(desc->mlti_data_size)); - if ( decoded != NULL ) { - desc->mlti_data = calloc(desc->mlti_data_size, sizeof(char)); + uint8_t decoded[32]; + desc->mlti_data_size = av_base64_decode(decoded, buf, 32); + if ( desc->mlti_data_size > 0 ) { + desc->mlti_data = malloc(sizeof(char)*desc->mlti_data_size); memcpy(desc->mlti_data, decoded, desc->mlti_data_size); handled=1; *data=nl(*data); @@ -225,7 +168,6 @@ static sdpplin_stream_t *sdpplin_parse_stream(char **data) { } xine_buffer_free(buf); - xine_buffer_free(decoded); return desc; } @@ -235,9 +177,9 @@ sdpplin_t *sdpplin_parse(char *data) { sdpplin_t *desc = xine_xmalloc(sizeof(sdpplin_t)); sdpplin_stream_t *stream; char *buf=xine_buffer_init(32); - char *decoded=xine_buffer_init(32); int handled; int len; + uint8_t decoded[32]; desc->stream = NULL; @@ -257,8 +199,8 @@ sdpplin_t *sdpplin_parse(char *data) { } if(filter(data,"a=Title:buffer;",&buf)) { - decoded=b64_decode(buf, decoded, &len); - if ( decoded != NULL ) { + len = av_base64_decode(decoded, buf, 32); + if ( len > 0 ) { desc->title=strdup(decoded); handled=1; data=nl(data); @@ -266,8 +208,8 @@ sdpplin_t *sdpplin_parse(char *data) { } if(filter(data,"a=Author:buffer;",&buf)) { - decoded=b64_decode(buf, decoded, &len); - if ( decoded != NULL ) { + len = av_base64_decode(decoded, buf, 32); + if ( len > 0 ) { desc->author=strdup(decoded); handled=1; data=nl(data); @@ -275,8 +217,8 @@ sdpplin_t *sdpplin_parse(char *data) { } if(filter(data,"a=Copyright:buffer;",&buf)) { - decoded=b64_decode(buf, decoded, &len); - if ( decoded != NULL ) { + len = av_base64_decode(decoded, buf, 32); + if ( len > 0 ) { desc->copyright=strdup(decoded); handled=1; data=nl(data); @@ -284,8 +226,8 @@ sdpplin_t *sdpplin_parse(char *data) { } if(filter(data,"a=Abstract:buffer;",&buf)) { - decoded=b64_decode(buf, decoded, &len); - if ( decoded != NULL ) { + len = av_base64_decode(decoded, buf, 32); + if ( len > 0 ) { desc->abstract=strdup(decoded); handled=1; data=nl(data); @@ -317,7 +259,6 @@ sdpplin_t *sdpplin_parse(char *data) { } xine_buffer_free(buf); - xine_buffer_free(decoded); return desc; } diff --git a/src/input/sha1.c b/src/input/sha1.c deleted file mode 100644 index b70e50d5f..000000000 --- a/src/input/sha1.c +++ /dev/null @@ -1,327 +0,0 @@ -/* (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 - */ - -#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 deleted file mode 100644 index 9f2659d60..000000000 --- a/src/input/sha1.h +++ /dev/null @@ -1,60 +0,0 @@ -/* 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 */ - -#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 */ |