annotate libdvdread/md5.c @ 27524:39937f39cb2d

Make internal Matroska demuxer default again Undo Aurelien's previous commit which made the lavf demuxer the default. SSA/ASS subtitles do not work properly with the lavf demuxer at the moment. That's much more important than any issues with the internal demuxer. The internal demuxer must remain the default at least until the subtitle issues are resolved.
author uau
date Tue, 09 Sep 2008 14:45:50 +0000
parents ea01824701a5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27466
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
1 /* -*- c-basic-offset: 2; indent-tabs-mode: nil -*- */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
2 /* md5.c - Functions to compute MD5 message digest of files or memory blocks
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
3 according to the definition of MD5 in RFC 1321 from April 1992.
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
4 Copyright (C) 1995, 1996, 2001 Free Software Foundation, Inc.
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
5 NOTE: The canonical source of this file is maintained with the GNU C
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
6 Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
7
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
8 This program is free software; you can redistribute it and/or modify it
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
11 later version.
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
12
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
13 This program is distributed in the hope that it will be useful,
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
16 GNU General Public License for more details.
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
17
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
19 along with this program; if not, write to the Free Software Foundation,
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
20 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
21
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
22 /* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
23
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
25 # include <config.h>
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
26 #endif
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
27
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
28 #include <sys/types.h>
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
29
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
30 #if STDC_HEADERS || defined _LIBC
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
31 # include <stdlib.h>
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
32 # include <string.h>
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
33 #else
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
34 # ifndef HAVE_MEMCPY
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
35 # define memcpy(d, s, n) bcopy ((s), (d), (n))
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
36 # endif
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
37 #endif
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
38
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
39 #include "md5.h"
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
40 //#include "unlocked-io.h"
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
41
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
42 #ifdef _LIBC
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
43 # include <endian.h>
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
44 # if __BYTE_ORDER == __BIG_ENDIAN
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
45 # define WORDS_BIGENDIAN 1
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
46 # endif
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
47 #endif
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
48
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
49 #ifdef WORDS_BIGENDIAN
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
50 # define SWAP(n) \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
51 (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
52 #else
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
53 # define SWAP(n) (n)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
54 #endif
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
55
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
56
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
57 /* This array contains the bytes used to pad the buffer to the next
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
58 64-byte boundary. (RFC 1321, 3.1: Step 1) */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
59 static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
60
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
61
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
62 /* Initialize structure containing state of computation.
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
63 (RFC 1321, 3.3: Step 3) */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
64 void
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
65 md5_init_ctx (ctx)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
66 struct md5_ctx *ctx;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
67 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
68 ctx->A = 0x67452301;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
69 ctx->B = 0xefcdab89;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
70 ctx->C = 0x98badcfe;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
71 ctx->D = 0x10325476;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
72
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
73 ctx->total[0] = ctx->total[1] = 0;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
74 ctx->buflen = 0;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
75 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
76
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
77 /* Put result from CTX in first 16 bytes following RESBUF. The result
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
78 must be in little endian byte order.
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
79
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
80 IMPORTANT: On some systems it is required that RESBUF is correctly
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
81 aligned for a 32 bits value. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
82 void *
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
83 md5_read_ctx (ctx, resbuf)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
84 const struct md5_ctx *ctx;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
85 void *resbuf;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
86 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
87 ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
88 ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
89 ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
90 ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
91
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
92 return resbuf;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
93 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
94
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
95 /* Process the remaining bytes in the internal buffer and the usual
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
96 prolog according to the standard and write the result to RESBUF.
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
97
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
98 IMPORTANT: On some systems it is required that RESBUF is correctly
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
99 aligned for a 32 bits value. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
100 void *
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
101 md5_finish_ctx (ctx, resbuf)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
102 struct md5_ctx *ctx;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
103 void *resbuf;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
104 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
105 /* Take yet unprocessed bytes into account. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
106 md5_uint32 bytes = ctx->buflen;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
107 size_t pad;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
108
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
109 /* Now count remaining bytes. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
110 ctx->total[0] += bytes;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
111 if (ctx->total[0] < bytes)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
112 ++ctx->total[1];
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
113
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
114 pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
115 memcpy (&ctx->buffer[bytes], fillbuf, pad);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
116
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
117 /* Put the 64-bit file length in *bits* at the end of the buffer. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
118 *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
119 *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) |
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
120 (ctx->total[0] >> 29));
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
121
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
122 /* Process last bytes. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
123 md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
124
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
125 return md5_read_ctx (ctx, resbuf);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
126 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
127
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
128 /* Compute MD5 message digest for bytes read from STREAM. The
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
129 resulting message digest number will be written into the 16 bytes
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
130 beginning at RESBLOCK. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
131 int
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
132 md5_stream (stream, resblock)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
133 FILE *stream;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
134 void *resblock;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
135 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
136 /* Important: BLOCKSIZE must be a multiple of 64. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
137 #define BLOCKSIZE 4096
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
138 struct md5_ctx ctx;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
139 char buffer[BLOCKSIZE + 72];
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
140 size_t sum;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
141
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
142 /* Initialize the computation context. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
143 md5_init_ctx (&ctx);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
144
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
145 /* Iterate over full file contents. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
146 while (1)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
147 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
148 /* We read the file in blocks of BLOCKSIZE bytes. One call of the
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
149 computation function processes the whole buffer so that with the
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
150 next round of the loop another block can be read. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
151 size_t n;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
152 sum = 0;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
153
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
154 /* Read block. Take care for partial reads. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
155 do
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
156 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
157 n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
158
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
159 sum += n;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
160 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
161 while (sum < BLOCKSIZE && n != 0);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
162 if (n == 0 && ferror (stream))
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
163 return 1;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
164
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
165 /* If end of file is reached, end the loop. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
166 if (n == 0)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
167 break;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
168
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
169 /* Process buffer with BLOCKSIZE bytes. Note that
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
170 BLOCKSIZE % 64 == 0
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
171 */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
172 md5_process_block (buffer, BLOCKSIZE, &ctx);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
173 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
174
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
175 /* Add the last bytes if necessary. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
176 if (sum > 0)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
177 md5_process_bytes (buffer, sum, &ctx);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
178
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
179 /* Construct result in desired memory. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
180 md5_finish_ctx (&ctx, resblock);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
181 return 0;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
182 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
183
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
184 /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
185 result is always in little endian byte order, so that a byte-wise
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
186 output yields to the wanted ASCII representation of the message
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
187 digest. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
188 void *
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
189 md5_buffer (buffer, len, resblock)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
190 const char *buffer;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
191 size_t len;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
192 void *resblock;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
193 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
194 struct md5_ctx ctx;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
195
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
196 /* Initialize the computation context. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
197 md5_init_ctx (&ctx);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
198
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
199 /* Process whole buffer but last len % 64 bytes. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
200 md5_process_bytes (buffer, len, &ctx);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
201
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
202 /* Put result in desired memory area. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
203 return md5_finish_ctx (&ctx, resblock);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
204 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
205
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
206
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
207 void
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
208 md5_process_bytes (buffer, len, ctx)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
209 const void *buffer;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
210 size_t len;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
211 struct md5_ctx *ctx;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
212 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
213 /* When we already have some bits in our internal buffer concatenate
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
214 both inputs first. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
215 if (ctx->buflen != 0)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
216 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
217 size_t left_over = ctx->buflen;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
218 size_t add = 128 - left_over > len ? len : 128 - left_over;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
219
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
220 memcpy (&ctx->buffer[left_over], buffer, add);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
221 ctx->buflen += add;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
222
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
223 if (left_over + add > 64)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
224 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
225 md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
226 /* The regions in the following copy operation cannot overlap. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
227 memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
228 (left_over + add) & 63);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
229 ctx->buflen = (left_over + add) & 63;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
230 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
231
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
232 buffer = (const char *) buffer + add;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
233 len -= add;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
234 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
235
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
236 /* Process available complete blocks. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
237 if (len > 64)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
238 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
239 md5_process_block (buffer, len & ~63, ctx);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
240 buffer = (const char *) buffer + (len & ~63);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
241 len &= 63;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
242 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
243
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
244 /* Move remaining bytes in internal buffer. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
245 if (len > 0)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
246 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
247 memcpy (ctx->buffer, buffer, len);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
248 ctx->buflen = len;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
249 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
250 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
251
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
252
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
253 /* These are the four functions used in the four steps of the MD5 algorithm
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
254 and defined in the RFC 1321. The first function is a little bit optimized
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
255 (as found in Colin Plumbs public domain implementation). */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
256 /* #define FF(b, c, d) ((b & c) | (~b & d)) */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
257 #define FF(b, c, d) (d ^ (b & (c ^ d)))
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
258 #define FG(b, c, d) FF (d, b, c)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
259 #define FH(b, c, d) (b ^ c ^ d)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
260 #define FI(b, c, d) (c ^ (b | ~d))
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
261
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
262 /* Process LEN bytes of BUFFER, accumulating context into CTX.
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
263 It is assumed that LEN % 64 == 0. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
264
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
265 void
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
266 md5_process_block (buffer, len, ctx)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
267 const void *buffer;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
268 size_t len;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
269 struct md5_ctx *ctx;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
270 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
271 md5_uint32 correct_words[16];
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
272 const md5_uint32 *words = buffer;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
273 size_t nwords = len / sizeof (md5_uint32);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
274 const md5_uint32 *endp = words + nwords;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
275 md5_uint32 A = ctx->A;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
276 md5_uint32 B = ctx->B;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
277 md5_uint32 C = ctx->C;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
278 md5_uint32 D = ctx->D;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
279
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
280 /* First increment the byte count. RFC 1321 specifies the possible
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
281 length of the file up to 2^64 bits. Here we only compute the
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
282 number of bytes. Do a double word increment. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
283 ctx->total[0] += len;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
284 if (ctx->total[0] < len)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
285 ++ctx->total[1];
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
286
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
287 /* Process all bytes in the buffer with 64 bytes in each round of
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
288 the loop. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
289 while (words < endp)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
290 {
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
291 md5_uint32 *cwp = correct_words;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
292 md5_uint32 A_save = A;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
293 md5_uint32 B_save = B;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
294 md5_uint32 C_save = C;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
295 md5_uint32 D_save = D;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
296
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
297 /* First round: using the given function, the context and a constant
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
298 the next context is computed. Because the algorithms processing
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
299 unit is a 32-bit word and it is determined to work on words in
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
300 little endian byte order we perhaps have to change the byte order
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
301 before the computation. To reduce the work for the next steps
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
302 we store the swapped words in the array CORRECT_WORDS. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
303
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
304 #define OP(a, b, c, d, s, T) \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
305 do \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
306 { \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
307 a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
308 ++words; \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
309 a = rol (a, s); \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
310 a += b; \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
311 } \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
312 while (0)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
313
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
314 /* Before we start, one word to the strange constants.
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
315 They are defined in RFC 1321 as
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
316
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
317 T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64, or
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
318 perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}'
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
319 */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
320
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
321 /* Round 1. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
322 OP (A, B, C, D, 7, 0xd76aa478);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
323 OP (D, A, B, C, 12, 0xe8c7b756);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
324 OP (C, D, A, B, 17, 0x242070db);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
325 OP (B, C, D, A, 22, 0xc1bdceee);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
326 OP (A, B, C, D, 7, 0xf57c0faf);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
327 OP (D, A, B, C, 12, 0x4787c62a);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
328 OP (C, D, A, B, 17, 0xa8304613);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
329 OP (B, C, D, A, 22, 0xfd469501);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
330 OP (A, B, C, D, 7, 0x698098d8);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
331 OP (D, A, B, C, 12, 0x8b44f7af);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
332 OP (C, D, A, B, 17, 0xffff5bb1);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
333 OP (B, C, D, A, 22, 0x895cd7be);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
334 OP (A, B, C, D, 7, 0x6b901122);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
335 OP (D, A, B, C, 12, 0xfd987193);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
336 OP (C, D, A, B, 17, 0xa679438e);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
337 OP (B, C, D, A, 22, 0x49b40821);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
338
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
339 /* For the second to fourth round we have the possibly swapped words
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
340 in CORRECT_WORDS. Redefine the macro to take an additional first
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
341 argument specifying the function to use. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
342 #undef OP
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
343 #define OP(f, a, b, c, d, k, s, T) \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
344 do \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
345 { \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
346 a += f (b, c, d) + correct_words[k] + T; \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
347 a = rol (a, s); \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
348 a += b; \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
349 } \
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
350 while (0)
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
351
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
352 /* Round 2. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
353 OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
354 OP (FG, D, A, B, C, 6, 9, 0xc040b340);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
355 OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
356 OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
357 OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
358 OP (FG, D, A, B, C, 10, 9, 0x02441453);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
359 OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
360 OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
361 OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
362 OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
363 OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
364 OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
365 OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
366 OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
367 OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
368 OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
369
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
370 /* Round 3. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
371 OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
372 OP (FH, D, A, B, C, 8, 11, 0x8771f681);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
373 OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
374 OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
375 OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
376 OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
377 OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
378 OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
379 OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
380 OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
381 OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
382 OP (FH, B, C, D, A, 6, 23, 0x04881d05);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
383 OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
384 OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
385 OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
386 OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
387
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
388 /* Round 4. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
389 OP (FI, A, B, C, D, 0, 6, 0xf4292244);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
390 OP (FI, D, A, B, C, 7, 10, 0x432aff97);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
391 OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
392 OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
393 OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
394 OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
395 OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
396 OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
397 OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
398 OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
399 OP (FI, C, D, A, B, 6, 15, 0xa3014314);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
400 OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
401 OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
402 OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
403 OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
404 OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
405
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
406 /* Add the starting values of the context. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
407 A += A_save;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
408 B += B_save;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
409 C += C_save;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
410 D += D_save;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
411 }
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
412
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
413 /* Put checksum in context given as argument. */
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
414 ctx->A = A;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
415 ctx->B = B;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
416 ctx->C = C;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
417 ctx->D = D;
ea01824701a5 Rename internal libdvdread fork from dvdread to libdvdread
rathann
parents:
diff changeset
418 }