Your message dated Wed, 16 Jun 2010 09:42:47 +0000
with message-id <e1oop8x-0008i5...@ries.debian.org>
and subject line Bug#585821: fixed in libvpx 0.9.0+git-2010-06-15-13-41-1
has caused the Debian Bug report #585821,
regarding libvpx: includes non-free MD5 implementation
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact ow...@bugs.debian.org
immediately.)


-- 
585821: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=585821
Debian Bug Tracking System
Contact ow...@bugs.debian.org with problems
--- Begin Message ---
Package: libvpx
Version: 0.9.0-6
Severity: serious
Justification: Policy 2.2.1

md5_utils.[ch] is an implementation of the MD5 algorithm from
RSA Data Security, Inc. This implementation is considered non-free. Here is
some explainations as to why [1] [2].

Attached is a patch that replaces the non-free implementation of the MD5
algorithm with a public domain implementation. This implementation is derived
from the MD5 implementation found in dpkg.

1. http://lists.debian.org/debian-mentors/2009/08/msg00082.html
2. http://bugs.debian.org/340538

-- System Information:
Debian Release: squeeze/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.32-5-amd64 (SMP w/8 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
This patch replaces the non-free RSA Data Security, Inc. implementation of the
MD5 algorithm with a public domain implementation.

--- libvpx-0.9.0.orig/ivfdec.c
+++ libvpx-0.9.0/ivfdec.c
@@ -235,9 +235,9 @@ void *out_open(const char *out_fn, int d
     if (do_md5)
     {
 #if CONFIG_MD5
-        md5_ctx_t *md5_ctx = out = malloc(sizeof(md5_ctx_t));
+        MD5Context *md5_ctx = out = malloc(sizeof(MD5Context));
         (void)out_fn;
-        md5_init(md5_ctx);
+        MD5Init(md5_ctx);
 #endif
     }
     else
@@ -259,7 +259,7 @@ void out_put(void *out, const uint8_t *b
     if (do_md5)
     {
 #if CONFIG_MD5
-        md5_update(out, buf, len);
+        MD5Update(out, buf, len);
 #endif
     }
     else
@@ -276,7 +276,7 @@ void out_close(void *out, const char *ou
         uint8_t md5[16];
         int i;
 
-        md5_finalize(out, md5);
+        MD5Final(md5, out);
         free(out);
 
         for (i = 0; i < 16; i++)
--- libvpx-0.9.0.orig/md5_utils.c
+++ libvpx-0.9.0/md5_utils.c
@@ -1,299 +1,240 @@
 /*
- *  Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest.  This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
  *
- *  Use of this source code is governed by a BSD-style license 
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may 
- *  be found in the AUTHORS file in the root of the source tree.
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ *
+ * Changed so as no longer to depend on Colin Plumb's `usual.h' header
+ * definitions; now uses stuff from dpkg's config.h.
+ *  - Ian Jackson <i...@chiark.greenend.org.uk>.
+ * Still in the public domain.
  */
 
+#include <sys/types.h>    /* for stupid systems */
 
-/*
-Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
-rights reserved.
-
-License to copy and use this software is granted provided that it
-is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-Algorithm" in all material mentioning or referencing this software
-or this function.
-
-License is also granted to make and use derivative works provided
-that such works are identified as "derived from the RSA Data
-Security, Inc. MD5 Message-Digest Algorithm" in all material
-mentioning or referencing the derived work.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
-
-These notices must be retained in any copies of any part of this
-documentation and/or software.
-*/
+#include <string.h>   /* for memcpy() */
 
 #include "md5_utils.h"
-#include <string.h>
-
-/* Constants for md5_transform routine.
- */
-#define S11 7
-#define S12 12
-#define S13 17
-#define S14 22
-#define S21 5
-#define S22 9
-#define S23 14
-#define S24 20
-#define S31 4
-#define S32 11
-#define S33 16
-#define S34 23
-#define S41 6
-#define S42 10
-#define S43 15
-#define S44 21
-
-static void md5_transform(uint32_t state[4], const uint8_t block[64]);
-static void Encode(uint8_t *output, const uint32_t *input, unsigned int len);
-static void Decode(uint32_t *output, const uint8_t *input, unsigned int len);
-#define md5_memset memset
-#define md5_memcpy memcpy
 
-static unsigned char PADDING[64] =
-{
-    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
+#ifdef WORDS_BIGENDIAN
+void
+byteSwap(UWORD32 *buf, unsigned words)
+{
+  md5byte *p = (md5byte *)buf;
+
+  do {
+    *buf++ = (UWORD32)((unsigned)p[3] << 8 | p[2]) << 16 |
+      ((unsigned)p[1] << 8 | p[0]);
+    p += 4;
+  } while (--words);
+}
+#else
+#define byteSwap(buf,words)
+#endif
 
-/* F, G, H and I are basic MD5 functions.
- */
-#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
-#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define I(x, y, z) ((y) ^ ((x) | (~z)))
-
-/* ROTATE_LEFT rotates x left n bits.
- */
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
-Rotation is separate from addition to prevent recomputation.
- */
-#define FF(a, b, c, d, x, s, ac) { \
-        (a) += F ((b), (c), (d)) + (x) + (uint32_t)(ac); \
-        (a) = ROTATE_LEFT ((a), (s)); \
-        (a) += (b); \
-    }
-#define GG(a, b, c, d, x, s, ac) { \
-        (a) += G ((b), (c), (d)) + (x) + (uint32_t)(ac); \
-        (a) = ROTATE_LEFT ((a), (s)); \
-        (a) += (b); \
-    }
-#define HH(a, b, c, d, x, s, ac) { \
-        (a) += H ((b), (c), (d)) + (x) + (uint32_t)(ac); \
-        (a) = ROTATE_LEFT ((a), (s)); \
-        (a) += (b); \
-    }
-#define II(a, b, c, d, x, s, ac) { \
-        (a) += I ((b), (c), (d)) + (x) + (uint32_t)(ac); \
-        (a) = ROTATE_LEFT ((a), (s)); \
-        (a) += (b); \
-    }
-
-/* MD5 initialization. Begins an MD5 operation, writing a new context.
- */
-void md5_init(md5_ctx_t *context)
-{
-    context->count[0] = context->count[1] = 0;
-    /* Load magic initialization constants.
-    */
-    context->state[0] = 0x67452301;
-    context->state[1] = 0xefcdab89;
-    context->state[2] = 0x98badcfe;
-    context->state[3] = 0x10325476;
-}
-
-/* MD5 block update operation. Continues an MD5 message-digest
-  operation, processing another message block, and updating the
-  context.
+/*
+ * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
+ * initialization constants.
  */
-void md5_update(md5_ctx_t *context, const uint8_t *input, unsigned int 
input_len)
+void
+MD5Init(struct MD5Context *ctx)
 {
-    unsigned int i, index, part_len;
-
-    /* Compute number of bytes mod 64 */
-    index = (unsigned int)((context->count[0] >> 3) & 0x3F);
+  ctx->buf[0] = 0x67452301;
+  ctx->buf[1] = 0xefcdab89;
+  ctx->buf[2] = 0x98badcfe;
+  ctx->buf[3] = 0x10325476;
 
-    /* Update number of bits */
-    if ((context->count[0] += ((uint32_t)input_len << 3))
-        < ((uint32_t)input_len << 3))
-        context->count[1]++;
-
-    context->count[1] += ((uint32_t)input_len >> 29);
-
-    part_len = 64 - index;
-
-    /* Transform as many times as possible. */
-    if (input_len >= part_len)
-    {
-        memcpy(&context->buffer[index], input, part_len);
-        md5_transform(context->state, context->buffer);
-
-        for (i = part_len; i + 63 < input_len; i += 64)
-            md5_transform(context->state, &input[i]);
-
-        index = 0;
-    }
-    else
-        i = 0;
-
-    /* Buffer remaining input */
-    memcpy(&context->buffer[index], &input[i], input_len - i);
+  ctx->bytes[0] = 0;
+  ctx->bytes[1] = 0;
 }
 
-/* MD5 finalization. Ends an MD5 message-digest operation, writing the
-  the message digest and zeroizing the context.
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
  */
-void md5_finalize(md5_ctx_t *context, uint8_t digest[16])
+void
+MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len)
 {
-    unsigned char bits[8];
-    unsigned int index, pad_len;
+  UWORD32 t;
 
-    /* Save number of bits */
-    Encode(bits, context->count, 8);
+  /* Update byte count */
+
+  t = ctx->bytes[0];
+  if ((ctx->bytes[0] = t + len) < t)
+    ctx->bytes[1]++;  /* Carry from low to high */
+
+  t = 64 - (t & 0x3f);  /* Space available in ctx->in (at least 1) */
+  if (t > len) {
+    memcpy((md5byte *)ctx->in + 64 - t, buf, len);
+    return;
+  }
+  /* First chunk is an odd size */
+  memcpy((md5byte *)ctx->in + 64 - t, buf, t);
+  byteSwap(ctx->in, 16);
+  MD5Transform(ctx->buf, ctx->in);
+  buf += t;
+  len -= t;
+
+  /* Process data in 64-byte chunks */
+  while (len >= 64) {
+    memcpy(ctx->in, buf, 64);
+    byteSwap(ctx->in, 16);
+    MD5Transform(ctx->buf, ctx->in);
+    buf += 64;
+    len -= 64;
+  }
 
-    /* Pad out to 56 mod 64.
-    */
-    index = (unsigned int)((context->count[0] >> 3) & 0x3f);
-    pad_len = (index < 56) ? (56 - index) : (120 - index);
-    md5_update(context, PADDING, pad_len);
-
-    /* Append length (before padding) */
-    md5_update(context, bits, 8);
-    /* Store state in digest */
-    Encode(digest, context->state, 16);
-
-    /* Zeroize sensitive information.
-    */
-    memset(context, 0, sizeof(*context));
+  /* Handle any remaining bytes of data. */
+  memcpy(ctx->in, buf, len);
 }
 
-/* MD5 basic transformation. Transforms state based on block.
+/*
+ * Final wrapup - pad to 64-byte boundary with the bit pattern
+ * 1 0* (64-bit count of bits processed, MSB-first)
  */
-static void md5_transform(uint32_t state[4], const uint8_t block[64])
+void
+MD5Final(md5byte digest[16], struct MD5Context *ctx)
 {
-    uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16];
-
-    Decode(x, block, 64);
+  int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */
+  md5byte *p = (md5byte *)ctx->in + count;
 
-    /* Round 1 */
-    FF(a, b, c, d, x[ 0], S11, 0xd76aa478);  /* 1 */
-    FF(d, a, b, c, x[ 1], S12, 0xe8c7b756);  /* 2 */
-    FF(c, d, a, b, x[ 2], S13, 0x242070db);  /* 3 */
-    FF(b, c, d, a, x[ 3], S14, 0xc1bdceee);  /* 4 */
-    FF(a, b, c, d, x[ 4], S11, 0xf57c0faf);  /* 5 */
-    FF(d, a, b, c, x[ 5], S12, 0x4787c62a);  /* 6 */
-    FF(c, d, a, b, x[ 6], S13, 0xa8304613);  /* 7 */
-    FF(b, c, d, a, x[ 7], S14, 0xfd469501);  /* 8 */
-    FF(a, b, c, d, x[ 8], S11, 0x698098d8);  /* 9 */
-    FF(d, a, b, c, x[ 9], S12, 0x8b44f7af);  /* 10 */
-    FF(c, d, a, b, x[10], S13, 0xffff5bb1);  /* 11 */
-    FF(b, c, d, a, x[11], S14, 0x895cd7be);  /* 12 */
-    FF(a, b, c, d, x[12], S11, 0x6b901122);  /* 13 */
-    FF(d, a, b, c, x[13], S12, 0xfd987193);  /* 14 */
-    FF(c, d, a, b, x[14], S13, 0xa679438e);  /* 15 */
-    FF(b, c, d, a, x[15], S14, 0x49b40821);  /* 16 */
-
-    /* Round 2 */
-    GG(a, b, c, d, x[ 1], S21, 0xf61e2562);  /* 17 */
-    GG(d, a, b, c, x[ 6], S22, 0xc040b340);  /* 18 */
-    GG(c, d, a, b, x[11], S23, 0x265e5a51);  /* 19 */
-    GG(b, c, d, a, x[ 0], S24, 0xe9b6c7aa);  /* 20 */
-    GG(a, b, c, d, x[ 5], S21, 0xd62f105d);  /* 21 */
-    GG(d, a, b, c, x[10], S22,  0x2441453);  /* 22 */
-    GG(c, d, a, b, x[15], S23, 0xd8a1e681);  /* 23 */
-    GG(b, c, d, a, x[ 4], S24, 0xe7d3fbc8);  /* 24 */
-    GG(a, b, c, d, x[ 9], S21, 0x21e1cde6);  /* 25 */
-    GG(d, a, b, c, x[14], S22, 0xc33707d6);  /* 26 */
-    GG(c, d, a, b, x[ 3], S23, 0xf4d50d87);  /* 27 */
-    GG(b, c, d, a, x[ 8], S24, 0x455a14ed);  /* 28 */
-    GG(a, b, c, d, x[13], S21, 0xa9e3e905);  /* 29 */
-    GG(d, a, b, c, x[ 2], S22, 0xfcefa3f8);  /* 30 */
-    GG(c, d, a, b, x[ 7], S23, 0x676f02d9);  /* 31 */
-    GG(b, c, d, a, x[12], S24, 0x8d2a4c8a);  /* 32 */
-
-    /* Round 3 */
-    HH(a, b, c, d, x[ 5], S31, 0xfffa3942);  /* 33 */
-    HH(d, a, b, c, x[ 8], S32, 0x8771f681);  /* 34 */
-    HH(c, d, a, b, x[11], S33, 0x6d9d6122);  /* 35 */
-    HH(b, c, d, a, x[14], S34, 0xfde5380c);  /* 36 */
-    HH(a, b, c, d, x[ 1], S31, 0xa4beea44);  /* 37 */
-    HH(d, a, b, c, x[ 4], S32, 0x4bdecfa9);  /* 38 */
-    HH(c, d, a, b, x[ 7], S33, 0xf6bb4b60);  /* 39 */
-    HH(b, c, d, a, x[10], S34, 0xbebfbc70);  /* 40 */
-    HH(a, b, c, d, x[13], S31, 0x289b7ec6);  /* 41 */
-    HH(d, a, b, c, x[ 0], S32, 0xeaa127fa);  /* 42 */
-    HH(c, d, a, b, x[ 3], S33, 0xd4ef3085);  /* 43 */
-    HH(b, c, d, a, x[ 6], S34,  0x4881d05);  /* 44 */
-    HH(a, b, c, d, x[ 9], S31, 0xd9d4d039);  /* 45 */
-    HH(d, a, b, c, x[12], S32, 0xe6db99e5);  /* 46 */
-    HH(c, d, a, b, x[15], S33, 0x1fa27cf8);  /* 47 */
-    HH(b, c, d, a, x[ 2], S34, 0xc4ac5665);  /* 48 */
-
-    /* Round 4 */
-    II(a, b, c, d, x[ 0], S41, 0xf4292244);  /* 49 */
-    II(d, a, b, c, x[ 7], S42, 0x432aff97);  /* 50 */
-    II(c, d, a, b, x[14], S43, 0xab9423a7);  /* 51 */
-    II(b, c, d, a, x[ 5], S44, 0xfc93a039);  /* 52 */
-    II(a, b, c, d, x[12], S41, 0x655b59c3);  /* 53 */
-    II(d, a, b, c, x[ 3], S42, 0x8f0ccc92);  /* 54 */
-    II(c, d, a, b, x[10], S43, 0xffeff47d);  /* 55 */
-    II(b, c, d, a, x[ 1], S44, 0x85845dd1);  /* 56 */
-    II(a, b, c, d, x[ 8], S41, 0x6fa87e4f);  /* 57 */
-    II(d, a, b, c, x[15], S42, 0xfe2ce6e0);  /* 58 */
-    II(c, d, a, b, x[ 6], S43, 0xa3014314);  /* 59 */
-    II(b, c, d, a, x[13], S44, 0x4e0811a1);  /* 60 */
-    II(a, b, c, d, x[ 4], S41, 0xf7537e82);  /* 61 */
-    II(d, a, b, c, x[11], S42, 0xbd3af235);  /* 62 */
-    II(c, d, a, b, x[ 2], S43, 0x2ad7d2bb);  /* 63 */
-    II(b, c, d, a, x[ 9], S44, 0xeb86d391);  /* 64 */
-
-    state[0] += a;
-    state[1] += b;
-    state[2] += c;
-    state[3] += d;
-
-    /* Zeroize sensitive information.
-    */
-    memset(x, 0, sizeof(x));
-}
+  /* Set the first char of padding to 0x80.  There is always room. */
+  *p++ = 0x80;
+
+  /* Bytes of padding needed to make 56 bytes (-8..55) */
+  count = 56 - 1 - count;
+
+  if (count < 0) {  /* Padding forces an extra block */
+    memset(p, 0, count + 8);
+    byteSwap(ctx->in, 16);
+    MD5Transform(ctx->buf, ctx->in);
+    p = (md5byte *)ctx->in;
+    count = 56;
+  }
+  memset(p, 0, count);
+  byteSwap(ctx->in, 14);
+
+  /* Append length in bits and transform */
+  ctx->in[14] = ctx->bytes[0] << 3;
+  ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29;
+  MD5Transform(ctx->buf, ctx->in);
+
+  byteSwap(ctx->buf, 4);
+  memcpy(digest, ctx->buf, 16);
+  memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
+}
+
+#ifndef ASM_MD5
+
+/* The four core functions - F1 is optimized somewhat */
+
+/* #define F1(x, y, z) (x & y | ~x & z) */
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+/* This is the central step in the MD5 algorithm. */
+#define MD5STEP(f,w,x,y,z,in,s) \
+   (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
 
-/* Encodes input (uint32_t) into output (unsigned char). Assumes len is
-  a multiple of 4.
- */
-static void Encode(uint8_t *output, const uint32_t *input, unsigned int len)
-{
-    unsigned int i, j;
-
-    for (i = 0, j = 0; j < len; i++, j += 4)
-    {
-        output[j] = (unsigned char)(input[i] & 0xff);
-        output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
-        output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
-        output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
-    }
+/*
+ * The core of the MD5 algorithm, this alters an existing MD5 hash to
+ * reflect the addition of 16 longwords of new data.  MD5Update blocks
+ * the data and converts bytes into longwords for this routine.
+ */
+void
+MD5Transform(UWORD32 buf[4], UWORD32 const in[16])
+{
+  register UWORD32 a, b, c, d;
+
+  a = buf[0];
+  b = buf[1];
+  c = buf[2];
+  d = buf[3];
+
+  MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
+  MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
+  MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
+  MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
+  MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
+  MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
+  MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
+  MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
+  MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
+  MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
+  MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
+  MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
+  MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
+  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
+  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
+  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
+
+  MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
+  MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
+  MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
+  MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
+  MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
+  MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
+  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
+  MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
+  MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
+  MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
+  MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
+  MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
+  MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
+  MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
+  MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
+  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
+
+  MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
+  MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
+  MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
+  MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
+  MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
+  MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
+  MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
+  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
+  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
+  MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
+  MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
+  MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
+  MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
+  MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
+  MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
+  MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
+
+  MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
+  MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
+  MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
+  MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
+  MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
+  MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
+  MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
+  MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
+  MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
+  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
+  MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
+  MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
+  MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
+  MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
+  MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
+  MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
+
+  buf[0] += a;
+  buf[1] += b;
+  buf[2] += c;
+  buf[3] += d;
 }
 
-/* Decodes input (unsigned char) into output (uint32_t). Assumes len is
-  a multiple of 4.
- */
-static void Decode(uint32_t *output, const uint8_t *input, unsigned int len)
-{
-    unsigned int i, j;
-
-    for (i = 0, j = 0; j < len; i++, j += 4)
-        output[i] = ((uint32_t)input[j]) | (((uint32_t)input[j+1]) << 8) |
-                    (((uint32_t)input[j+2]) << 16) | (((uint32_t)input[j+3]) 
<< 24);
-}
+#endif
--- libvpx-0.9.0.orig/md5_utils.h
+++ libvpx-0.9.0/md5_utils.h
@@ -1,45 +1,40 @@
 /*
- *  Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
+ * This is the header file for the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest.  This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
  *
- *  Use of this source code is governed by a BSD-style license 
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may 
- *  be found in the AUTHORS file in the root of the source tree.
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ *
+ * Changed so as no longer to depend on Colin Plumb's `usual.h'
+ * header definitions; now uses stuff from dpkg's config.h
+ *  - Ian Jackson <i...@chiark.greenend.org.uk>.
+ * Still in the public domain.
  */
 
-/*
-Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
-rights reserved.
-
-License to copy and use this software is granted provided that it
-is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-Algorithm" in all material mentioning or referencing this software
-or this function.
-
-License is also granted to make and use derivative works provided
-that such works are identified as "derived from the RSA Data
-Security, Inc. MD5 Message-Digest Algorithm" in all material
-mentioning or referencing the derived work.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
+#ifndef MD5_H
+#define MD5_H
 
-These notices must be retained in any copies of any part of this
-documentation and/or software.
-*/
-#include "vpx/vpx_integer.h"
+#define md5byte unsigned char
+#define UWORD32 unsigned int
 
-/* MD5 context. */
-typedef struct
-{
-    uint32_t state[4];        /* state (ABCD) */
-    uint32_t count[2];        /* number of bits, modulo 2^64 (lsb first) */
-    uint8_t  buffer[64];      /* input buffer */
-} md5_ctx_t;
+typedef struct MD5Context {
+  UWORD32 buf[4];
+  UWORD32 bytes[2];
+  UWORD32 in[16];
+} MD5Context;
+
+void MD5Init(struct MD5Context *context);
+void MD5Update(struct MD5Context *context, md5byte const *buf, unsigned len);
+void MD5Final(unsigned char digest[16], struct MD5Context *context);
+void MD5Transform(UWORD32 buf[4], UWORD32 const in[16]);
 
-void md5_init(md5_ctx_t *ctx);
-void md5_update(md5_ctx_t *ctx, const uint8_t *buf, unsigned int len);
-void md5_finalize(md5_ctx_t *ctx, uint8_t md5[16]);
+#endif /* !MD5_H */
--- libvpx-0.9.0.orig/examples/decode_to_md5.txt
+++ libvpx-0.9.0/examples/decode_to_md5.txt
@@ -26,21 +26,21 @@ is processed, then U, then V. It is impo
 values.
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_DX
 unsigned char  md5_sum[16];
-md5_ctx_t      md5;
+MD5Context     md5;
 int            i;
 
-md5_init(&md5);
+MD5Init(&md5);
 
 for(plane=0; plane < 3; plane++) {
     unsigned char *buf =img->planes[plane];
 
     for(y=0; y<img->d_h >> (plane?1:0); y++) {
-        md5_update(&md5, buf, img->d_w >> (plane?1:0));
+        MD5Update(&md5, buf, img->d_w >> (plane?1:0));
         buf += img->stride[plane];
     }
 }
 
-md5_finalize(&md5, md5_sum);
+MD5Final(md5_sum, &md5);
 for(i=0; i<16; i++)
     fprintf(outfile, "%02x",md5_sum[i]);
 fprintf(outfile, "  img-%dx%d-%04d.i420\n", img->d_w, img->d_h,

--- End Message ---
--- Begin Message ---
Source: libvpx
Source-Version: 0.9.0+git-2010-06-15-13-41-1

We believe that the bug you reported is fixed in the latest version of
libvpx, which is due to be installed in the Debian FTP archive:

libvpx-dev_0.9.0+git-2010-06-15-13-41-1_amd64.deb
  to main/libv/libvpx/libvpx-dev_0.9.0+git-2010-06-15-13-41-1_amd64.deb
libvpx-doc_0.9.0+git-2010-06-15-13-41-1_all.deb
  to main/libv/libvpx/libvpx-doc_0.9.0+git-2010-06-15-13-41-1_all.deb
libvpx0-dbg_0.9.0+git-2010-06-15-13-41-1_amd64.deb
  to main/libv/libvpx/libvpx0-dbg_0.9.0+git-2010-06-15-13-41-1_amd64.deb
libvpx0_0.9.0+git-2010-06-15-13-41-1_amd64.deb
  to main/libv/libvpx/libvpx0_0.9.0+git-2010-06-15-13-41-1_amd64.deb
libvpx_0.9.0+git-2010-06-15-13-41-1.debian.tar.gz
  to main/libv/libvpx/libvpx_0.9.0+git-2010-06-15-13-41-1.debian.tar.gz
libvpx_0.9.0+git-2010-06-15-13-41-1.dsc
  to main/libv/libvpx/libvpx_0.9.0+git-2010-06-15-13-41-1.dsc
libvpx_0.9.0+git-2010-06-15-13-41.orig.tar.gz
  to main/libv/libvpx/libvpx_0.9.0+git-2010-06-15-13-41.orig.tar.gz



A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to 585...@bugs.debian.org,
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Sebastian Dröge <sl...@debian.org> (supplier of updated libvpx package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing ftpmas...@debian.org)


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Format: 1.8
Date: Wed, 16 Jun 2010 07:17:13 +0200
Source: libvpx
Binary: libvpx-dev libvpx0 libvpx0-dbg libvpx-doc
Architecture: source all amd64
Version: 0.9.0+git-2010-06-15-13-41-1
Distribution: unstable
Urgency: low
Maintainer: Sebastian Dröge <sl...@debian.org>
Changed-By: Sebastian Dröge <sl...@debian.org>
Description: 
 libvpx-dev - VP8 video codec (development files)
 libvpx-doc - VP8 video codec (API documentation)
 libvpx0    - VP8 video codec (shared library)
 libvpx0-dbg - VP8 video codec (debugging symbols)
Closes: 583765 585821
Changes: 
 libvpx (0.9.0+git-2010-06-15-13-41-1) unstable; urgency=low
 .
   * New upstream GIT snapshot:
     + Fixes enormous amount of virtual memory used by the library,
       causing problems on 32 bit architectures (Closes: #583765).
     + Replaces non-free MD5 implementation with a free one (Closes: #585821).
     + debian/rules:
       - Update for build system changes, especially for the shared library
         support that is upstream now.
Checksums-Sha1: 
 2e5eb67fca4223cbda829f78834c15e77d76e501 1296 
libvpx_0.9.0+git-2010-06-15-13-41-1.dsc
 1293a77d2b2b1da3ed0627b98b2c21c01aa5f268 1569707 
libvpx_0.9.0+git-2010-06-15-13-41.orig.tar.gz
 d7936458aa4c31c5be4ac01f0cb846988a1f1a40 8488 
libvpx_0.9.0+git-2010-06-15-13-41-1.debian.tar.gz
 abf8ac0e8e7f09fab7a82fe8e827e6a8279988a5 226998 
libvpx-doc_0.9.0+git-2010-06-15-13-41-1_all.deb
 1a7c7103cffda362118002bf36b1d80953005946 300778 
libvpx-dev_0.9.0+git-2010-06-15-13-41-1_amd64.deb
 5cd4a9702eb3a604e876edbdcf9bf66adb96138f 230948 
libvpx0_0.9.0+git-2010-06-15-13-41-1_amd64.deb
 e74a2befa52e941a1d720107a3b2e6aa46ad0a47 487918 
libvpx0-dbg_0.9.0+git-2010-06-15-13-41-1_amd64.deb
Checksums-Sha256: 
 d295f674046c61ef6bd5818ea24493c871168a8435dc87bb2e12bd502a6b9213 1296 
libvpx_0.9.0+git-2010-06-15-13-41-1.dsc
 cef287cf5bc9313208b89bf3b5da8ced69354c19ec2597bcd87c386bdba89e41 1569707 
libvpx_0.9.0+git-2010-06-15-13-41.orig.tar.gz
 5c5a260237e18789c5d3e4d40472959f49cecbe7e404de86bafac31d956e1194 8488 
libvpx_0.9.0+git-2010-06-15-13-41-1.debian.tar.gz
 976934e1ccb338894803d27bfa8e05c067a63a9d32874564d247da4237dc30fd 226998 
libvpx-doc_0.9.0+git-2010-06-15-13-41-1_all.deb
 caa2e333e32e874bdaeb3c58d316de90b0aa56d3af8ce02db98bedc327ae5336 300778 
libvpx-dev_0.9.0+git-2010-06-15-13-41-1_amd64.deb
 fbf282df88ad941f8a96402065ac62c2aea4985bae65c9814d9c7f08baa5fe4c 230948 
libvpx0_0.9.0+git-2010-06-15-13-41-1_amd64.deb
 6345776af0e1a54ac100b90b3b96c23846d322b86bafc652b2a77ad36a9372b7 487918 
libvpx0-dbg_0.9.0+git-2010-06-15-13-41-1_amd64.deb
Files: 
 dedfccc12104d08ac5fa1348f236c627 1296 video optional 
libvpx_0.9.0+git-2010-06-15-13-41-1.dsc
 eeda59f13030893024ed6a7b91d24892 1569707 video optional 
libvpx_0.9.0+git-2010-06-15-13-41.orig.tar.gz
 c81fa676b53c6d1ccb8ac4baa9aa8725 8488 video optional 
libvpx_0.9.0+git-2010-06-15-13-41-1.debian.tar.gz
 605987d237fa79d2736b99ecff143f9c 226998 doc optional 
libvpx-doc_0.9.0+git-2010-06-15-13-41-1_all.deb
 8fd773dbe4400e81c5bd7c5b86b8db5c 300778 libdevel optional 
libvpx-dev_0.9.0+git-2010-06-15-13-41-1_amd64.deb
 f38b00985f569a75eb538ab39440e327 230948 libs optional 
libvpx0_0.9.0+git-2010-06-15-13-41-1_amd64.deb
 274c2fbaddafdc93e1c142f7d511b77d 487918 debug extra 
libvpx0-dbg_0.9.0+git-2010-06-15-13-41-1_amd64.deb

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iEYEARECAAYFAkwYhIgACgkQBsBdh1vkHyE66gCeJpORt9JSQuU32dcIckydgC1u
Y3IAnRQ8zz9G1nZkUCRFGVjRzciEAvZc
=8sj/
-----END PGP SIGNATURE-----



--- End Message ---

Reply via email to