RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/rpmio/ bson.c bson.h mongo.c rpm/tests/mon...

From: Jeff Johnson <jbj@rpm5.org>
Date: Sat 18 Sep 2010 - 16:02:50 CEST
Message-Id: <20100918140250.932D3C1437@rpm5.org>
  RPM Package Manager, CVS Repository
  /cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   18-Sep-2010 16:02:50
  Branch: HEAD                             Handle: 2010091814024901

  Modified files:
    rpm                     CHANGES
    rpm/rpmio               bson.c bson.h mongo.c
    rpm/tests/mongo         Makefile.am test.h

  Log:
    - mongo: handle endianness at runtime, remove MONGO_BIG_ENDIAN.
    - mongo: replace internal md5 digest with rpmDigestInit().

  Summary:
    Revision    Changes     Path
    1.3449      +2  -0      rpm/CHANGES
    2.3         +77 -34     rpm/rpmio/bson.c
    2.3         +4  -2      rpm/rpmio/bson.h
    2.3         +23 -508    rpm/rpmio/mongo.c
    1.3         +3  -3      rpm/tests/mongo/Makefile.am
    1.3         +0  -12     rpm/tests/mongo/test.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.3448 -r1.3449 CHANGES
  --- rpm/CHANGES	18 Sep 2010 03:31:44 -0000	1.3448
  +++ rpm/CHANGES	18 Sep 2010 14:02:49 -0000	1.3449
  @@ -1,4 +1,6 @@
   5.3.3 -> 5.4a1:
  +    - jbj: mongo: handle endianness at runtime, remove MONGO_BIG_ENDIAN.
  +    - jbj: mongo: replace internal md5 digest with rpmDigestInit().
       - jbj: mongo: refactor to export from -lrpmio (with no AutoFu!).
       - jbj: mongo: refactor to export the mongo-c-driver API in -lrpmdb.
       - jbj: mongo: bundle up the mongo-c-driver in rpmdb/rpmmdb.c.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/bson.c
  ============================================================================
  $ cvs diff -u -r2.2 -r2.3 bson.c
  --- rpm/rpmio/bson.c	18 Sep 2010 03:31:45 -0000	2.2
  +++ rpm/rpmio/bson.c	18 Sep 2010 14:02:49 -0000	2.3
  @@ -22,41 +22,84 @@
   #include "debug.h"
   
   /* big endian is only used for OID generation. little is used everywhere else */
  -#ifdef MONGO_BIG_ENDIAN
  -#define bson_little_endian64(out, in) ( bson_swap_endian64(out, in) )
  -#define bson_little_endian32(out, in) ( bson_swap_endian32(out, in) )
  -#define bson_big_endian64(out, in) ( memcpy(out, in, 8) )
  -#define bson_big_endian32(out, in) ( memcpy(out, in, 4) )
  -#else
  -#define bson_little_endian64(out, in) ( memcpy(out, in, 8) )
  -#define bson_little_endian32(out, in) ( memcpy(out, in, 4) )
  -#define bson_big_endian64(out, in) ( bson_swap_endian64(out, in) )
  -#define bson_big_endian32(out, in) ( bson_swap_endian32(out, in) )
  -#endif
  -
  -__inline__ void bson_swap_endian64(void* outp, const void* inp){
  -    const char *in = (const char*)inp;
  -    char *out = (char*)outp;
  -
  -    out[0] = in[7];
  -    out[1] = in[6];
  -    out[2] = in[5];
  -    out[3] = in[4];
  -    out[4] = in[3];
  -    out[5] = in[2];
  -    out[6] = in[1];
  -    out[7] = in[0];
   
  -}
  -
  -__inline__ void bson_swap_endian32(void* outp, const void* inp){
  -    const char *in = (const char*)inp;
  -    char *out = (char*)outp;
  -
  -    out[0] = in[3];
  -    out[1] = in[2];
  -    out[2] = in[1];
  -    out[3] = in[0];
  +/*@-redef@*/
  +union _dbswap {
  +    uint64_t ul;
  +    uint32_t ui;
  +    uint16_t us;
  +    uint8_t uc[8];
  +};
  +/*@=redef@*/
  +/*@unchecked@*/
  +static union _dbswap _endian = { .ui = 0x11223344 };
  +
  +__inline__ void bson_little_endian64(void* outp, const void* inp)
  +{
  +
  +    if (_endian.uc[0] == 0x44)
  +	memcpy(outp, inp, 8);
  +    else {
  +	const char *in = (const char *)inp;
  +	char *out = (char *)outp;
  +	out[0] = in[7];
  +	out[1] = in[6];
  +	out[2] = in[5];
  +	out[3] = in[4];
  +	out[4] = in[3];
  +	out[5] = in[2];
  +	out[6] = in[1];
  +	out[7] = in[0];
  +    }
  +
  +}
  +
  +__inline__ void bson_little_endian32(void* outp, const void* inp)
  +{
  +    if (_endian.uc[0] == 0x44)
  +	memcpy(outp, inp, 4);
  +    else {
  +	const char *in = (const char *)inp;
  +	char *out = (char *)outp;
  +	out[0] = in[3];
  +	out[1] = in[2];
  +	out[2] = in[1];
  +	out[3] = in[0];
  +    }
  +}
  +
  +__inline__ void bson_big_endian64(void* outp, const void* inp)
  +{
  +
  +    if (_endian.uc[0] == 0x11)
  +	memcpy(outp, inp, 8);
  +    else {
  +	const char *in = (const char *)inp;
  +	char *out = (char *)outp;
  +	out[0] = in[7];
  +	out[1] = in[6];
  +	out[2] = in[5];
  +	out[3] = in[4];
  +	out[4] = in[3];
  +	out[5] = in[2];
  +	out[6] = in[1];
  +	out[7] = in[0];
  +    }
  +
  +}
  +
  +__inline__ void bson_big_endian32(void* outp, const void* inp)
  +{
  +    if (_endian.uc[0] == 0x11)
  +	memcpy(outp, inp, 4);
  +    else {
  +	const char *in = (const char *)inp;
  +	char *out = (char *)outp;
  +	out[0] = in[3];
  +	out[1] = in[2];
  +	out[2] = in[1];
  +	out[3] = in[0];
  +    }
   }
   
   static const int initialBufferSize = 128;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/bson.h
  ============================================================================
  $ cvs diff -u -r2.2 -r2.3 bson.h
  --- rpm/rpmio/bson.h	18 Sep 2010 03:31:45 -0000	2.2
  +++ rpm/rpmio/bson.h	18 Sep 2010 14:02:49 -0000	2.3
  @@ -76,8 +76,10 @@
   extern "C" {
   #endif
   
  -extern void bson_swap_endian64(void* outp, const void* inp);
  -extern void bson_swap_endian32(void* outp, const void* inp);
  +extern void bson_little_endian64(void* outp, const void* inp);
  +extern void bson_little_endian32(void* outp, const void* inp);
  +extern void bson_big_endian64(void* outp, const void* inp);
  +extern void bson_big_endian32(void* outp, const void* inp);
   
   void bson_append_byte( bson_buffer * b , char c );
   void bson_append( bson_buffer * b , const void * data , int len );
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/mongo.c
  ============================================================================
  $ cvs diff -u -r2.2 -r2.3 mongo.c
  --- rpm/rpmio/mongo.c	18 Sep 2010 03:41:08 -0000	2.2
  +++ rpm/rpmio/mongo.c	18 Sep 2010 14:02:49 -0000	2.3
  @@ -35,488 +35,11 @@
   /*@unchecked@*/ /*@relnull@*/
   rpmmgo _rpmmgoI;
   
  -/*==============================================================*/
  -
   /* only need one of these */
   static const int zero = 0;
   static const int one = 1;
   
   /*==============================================================*/
  -/* --- platform_hacks.h */
  -/*    Copyright 2009, 2010 10gen Inc.
  - *
  - *    Licensed under the Apache License, Version 2.0 (the "License");
  - *    you may not use this file except in compliance with the License.
  - *    You may obtain a copy of the License at
  - *
  - *    http://www.apache.org/licenses/LICENSE-2.0
  - *
  - *    Unless required by applicable law or agreed to in writing, software
  - *    distributed under the License is distributed on an "AS IS" BASIS,
  - *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  - *    See the License for the specific language governing permissions and
  - *    limitations under the License.
  - */
  -
  -/* big endian is only used for OID generation. little is used everywhere else */
  -#ifdef MONGO_BIG_ENDIAN
  -#define bson_little_endian64(out, in) ( bson_swap_endian64(out, in) )
  -#define bson_little_endian32(out, in) ( bson_swap_endian32(out, in) )
  -#define bson_big_endian64(out, in) ( memcpy(out, in, 8) )
  -#define bson_big_endian32(out, in) ( memcpy(out, in, 4) )
  -#else
  -#define bson_little_endian64(out, in) ( memcpy(out, in, 8) )
  -#define bson_little_endian32(out, in) ( memcpy(out, in, 4) )
  -#define bson_big_endian64(out, in) ( bson_swap_endian64(out, in) )
  -#define bson_big_endian32(out, in) ( bson_swap_endian32(out, in) )
  -#endif
  -
  -/*==============================================================*/
  -/*
  -  Copyright (C) 1999, 2002 Aladdin Enterprises.  All rights reserved.
  -
  -  This software is provided 'as-is', without any express or implied
  -  warranty.  In no event will the authors be held liable for any damages
  -  arising from the use of this software.
  -
  -  Permission is granted to anyone to use this software for any purpose,
  -  including commercial applications, and to alter it and redistribute it
  -  freely, subject to the following restrictions:
  -
  -  1. The origin of this software must not be misrepresented; you must not
  -     claim that you wrote the original software. If you use this software
  -     in a product, an acknowledgment in the product documentation would be
  -     appreciated but is not required.
  -  2. Altered source versions must be plainly marked as such, and must not be
  -     misrepresented as being the original software.
  -  3. This notice may not be removed or altered from any source distribution.
  -
  -  L. Peter Deutsch
  -  ghost@aladdin.com
  -
  - */
  -
  -/*
  -  Independent implementation of MD5 (RFC 1321).
  -
  -  This code implements the MD5 Algorithm defined in RFC 1321, whose
  -  text is available at
  -	http://www.ietf.org/rfc/rfc1321.txt
  -  The code is derived from the text of the RFC, including the test suite
  -  (section A.5) but excluding the rest of Appendix A.  It does not include
  -  any code or documentation that is identified in the RFC as being
  -  copyrighted.
  -
  -  The original and principal author of md5.h is L. Peter Deutsch
  -  <ghost@aladdin.com>.  Other authors are noted in the change history
  -  that follows (in reverse chronological order):
  -
  -  2002-04-13 lpd Removed support for non-ANSI compilers; removed
  -	references to Ghostscript; clarified derivation from RFC 1321;
  -	now handles byte order either statically or dynamically.
  -  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
  -  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
  -	added conditionalization for C++ compilation from Martin
  -	Purschke <purschke@bnl.gov>.
  -  1999-05-03 lpd Original version.
  - */
  -
  -/*
  - * This package supports both compile-time and run-time determination of CPU
  - * byte order.  If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be
  - * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is
  - * defined as non-zero, the code will be compiled to run only on big-endian
  - * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to
  - * run on either big- or little-endian CPUs, but will run slightly less
  - * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined.
  - */
  -
  -typedef unsigned char mongo_md5_byte_t; /* 8-bit byte */
  -typedef unsigned int mongo_md5_word_t; /* 32-bit word */
  -
  -/* Define the state of the MD5 Algorithm. */
  -typedef struct mongo_md5_state_s {
  -    mongo_md5_word_t count[2];	/* message length in bits, lsw first */
  -    mongo_md5_word_t abcd[4];		/* digest buffer */
  -    mongo_md5_byte_t buf[64];		/* accumulate block */
  -} mongo_md5_state_t;
  -
  -#ifdef __cplusplus
  -extern "C"
  -{
  -#endif
  -
  -    /* Initialize the algorithm. */
  -    void mongo_md5_init(mongo_md5_state_t *pms);
  -
  -    /* Append a string to the message. */
  -    void mongo_md5_append(mongo_md5_state_t *pms, const mongo_md5_byte_t *data, int nbytes);
  -
  -    /* Finish the message and return the digest. */
  -    void mongo_md5_finish(mongo_md5_state_t *pms, mongo_md5_byte_t digest[16]);
  -
  -#ifdef __cplusplus
  -}  /* end extern "C" */
  -#endif
  -
  -/*==============================================================*/
  -/* --- md5.c */
  -
  -/*
  -  Independent implementation of MD5 (RFC 1321).
  -
  -  This code implements the MD5 Algorithm defined in RFC 1321, whose
  -  text is available at
  -	http://www.ietf.org/rfc/rfc1321.txt
  -  The code is derived from the text of the RFC, including the test suite
  -  (section A.5) but excluding the rest of Appendix A.  It does not include
  -  any code or documentation that is identified in the RFC as being
  -  copyrighted.
  -
  -  The original and principal author of md5.c is L. Peter Deutsch
  -  <ghost@aladdin.com>.  Other authors are noted in the change history
  -  that follows (in reverse chronological order):
  -
  -  2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order
  -	either statically or dynamically; added missing #include <string.h>
  -	in library.
  -  2002-03-11 lpd Corrected argument list for main(), and added int return
  -	type, in test program and T value program.
  -  2002-02-21 lpd Added missing #include <stdio.h> in test program.
  -  2000-07-03 lpd Patched to eliminate warnings about "constant is
  -	unsigned in ANSI C, signed in traditional"; made test program
  -	self-checking.
  -  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
  -  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
  -  1999-05-03 lpd Original version.
  - */
  -
  -#undef BYTE_ORDER	/* 1 = big-endian, -1 = little-endian, 0 = unknown */
  -#ifdef MONGO_BIG_ENDIAN
  -#  define BYTE_ORDER 1
  -#else
  -#  define BYTE_ORDER -1
  -#endif
  -
  -#define T_MASK ((mongo_md5_word_t)~0)
  -#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
  -#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
  -#define T3    0x242070db
  -#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
  -#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
  -#define T6    0x4787c62a
  -#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
  -#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
  -#define T9    0x698098d8
  -#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
  -#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
  -#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
  -#define T13    0x6b901122
  -#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
  -#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
  -#define T16    0x49b40821
  -#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
  -#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
  -#define T19    0x265e5a51
  -#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
  -#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
  -#define T22    0x02441453
  -#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
  -#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
  -#define T25    0x21e1cde6
  -#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
  -#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
  -#define T28    0x455a14ed
  -#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
  -#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
  -#define T31    0x676f02d9
  -#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
  -#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
  -#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
  -#define T35    0x6d9d6122
  -#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
  -#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
  -#define T38    0x4bdecfa9
  -#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
  -#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
  -#define T41    0x289b7ec6
  -#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
  -#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
  -#define T44    0x04881d05
  -#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
  -#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
  -#define T47    0x1fa27cf8
  -#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
  -#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
  -#define T50    0x432aff97
  -#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
  -#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
  -#define T53    0x655b59c3
  -#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
  -#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
  -#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
  -#define T57    0x6fa87e4f
  -#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
  -#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
  -#define T60    0x4e0811a1
  -#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
  -#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
  -#define T63    0x2ad7d2bb
  -#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
  -
  -static void
  -mongo_md5_process(mongo_md5_state_t *pms, const mongo_md5_byte_t *data /*[64]*/)
  -{
  -    mongo_md5_word_t
  -	a = pms->abcd[0], b = pms->abcd[1],
  -	c = pms->abcd[2], d = pms->abcd[3];
  -    mongo_md5_word_t t;
  -#if BYTE_ORDER > 0
  -    /* Define storage only for big-endian CPUs. */
  -    mongo_md5_word_t X[16];
  -#else
  -    /* Define storage for little-endian or both types of CPUs. */
  -    mongo_md5_word_t xbuf[16];
  -    const mongo_md5_word_t *X;
  -#endif
  -
  -    {
  -#if BYTE_ORDER == 0
  -	/*
  -	 * Determine dynamically whether this is a big-endian or
  -	 * little-endian machine, since we can use a more efficient
  -	 * algorithm on the latter.
  -	 */
  -	static const int w = 1;
  -
  -	if (*((const mongo_md5_byte_t *)&w)) /* dynamic little-endian */
  -#endif
  -#if BYTE_ORDER <= 0		/* little-endian */
  -	{
  -	    /*
  -	     * On little-endian machines, we can process properly aligned
  -	     * data without copying it.
  -	     */
  -	    if (!((data - (const mongo_md5_byte_t *)0) & 3)) {
  -		/* data are properly aligned */
  -		X = (const mongo_md5_word_t *)data;
  -	    } else {
  -		/* not aligned */
  -		memcpy(xbuf, data, 64);
  -		X = xbuf;
  -	    }
  -	}
  -#endif
  -#if BYTE_ORDER == 0
  -	else			/* dynamic big-endian */
  -#endif
  -#if BYTE_ORDER >= 0		/* big-endian */
  -	{
  -	    /*
  -	     * On big-endian machines, we must arrange the bytes in the
  -	     * right order.
  -	     */
  -	    const mongo_md5_byte_t *xp = data;
  -	    int i;
  -
  -#  if BYTE_ORDER == 0
  -	    X = xbuf;		/* (dynamic only) */
  -#  else
  -#    define xbuf X		/* (static only) */
  -#  endif
  -	    for (i = 0; i < 16; ++i, xp += 4)
  -		xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
  -	}
  -#endif
  -    }
  -
  -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
  -
  -    /* Round 1. */
  -    /* Let [abcd k s i] denote the operation
  -       a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
  -#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
  -#define SET(a, b, c, d, k, s, Ti)\
  -  t = a + F(b,c,d) + X[k] + Ti;\
  -  a = ROTATE_LEFT(t, s) + b
  -    /* Do the following 16 operations. */
  -    SET(a, b, c, d,  0,  7,  T1);
  -    SET(d, a, b, c,  1, 12,  T2);
  -    SET(c, d, a, b,  2, 17,  T3);
  -    SET(b, c, d, a,  3, 22,  T4);
  -    SET(a, b, c, d,  4,  7,  T5);
  -    SET(d, a, b, c,  5, 12,  T6);
  -    SET(c, d, a, b,  6, 17,  T7);
  -    SET(b, c, d, a,  7, 22,  T8);
  -    SET(a, b, c, d,  8,  7,  T9);
  -    SET(d, a, b, c,  9, 12, T10);
  -    SET(c, d, a, b, 10, 17, T11);
  -    SET(b, c, d, a, 11, 22, T12);
  -    SET(a, b, c, d, 12,  7, T13);
  -    SET(d, a, b, c, 13, 12, T14);
  -    SET(c, d, a, b, 14, 17, T15);
  -    SET(b, c, d, a, 15, 22, T16);
  -#undef SET
  -
  -     /* Round 2. */
  -     /* Let [abcd k s i] denote the operation
  -          a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
  -#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
  -#define SET(a, b, c, d, k, s, Ti)\
  -  t = a + G(b,c,d) + X[k] + Ti;\
  -  a = ROTATE_LEFT(t, s) + b
  -     /* Do the following 16 operations. */
  -    SET(a, b, c, d,  1,  5, T17);
  -    SET(d, a, b, c,  6,  9, T18);
  -    SET(c, d, a, b, 11, 14, T19);
  -    SET(b, c, d, a,  0, 20, T20);
  -    SET(a, b, c, d,  5,  5, T21);
  -    SET(d, a, b, c, 10,  9, T22);
  -    SET(c, d, a, b, 15, 14, T23);
  -    SET(b, c, d, a,  4, 20, T24);
  -    SET(a, b, c, d,  9,  5, T25);
  -    SET(d, a, b, c, 14,  9, T26);
  -    SET(c, d, a, b,  3, 14, T27);
  -    SET(b, c, d, a,  8, 20, T28);
  -    SET(a, b, c, d, 13,  5, T29);
  -    SET(d, a, b, c,  2,  9, T30);
  -    SET(c, d, a, b,  7, 14, T31);
  -    SET(b, c, d, a, 12, 20, T32);
  -#undef SET
  -
  -     /* Round 3. */
  -     /* Let [abcd k s t] denote the operation
  -          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
  -#define H(x, y, z) ((x) ^ (y) ^ (z))
  -#define SET(a, b, c, d, k, s, Ti)\
  -  t = a + H(b,c,d) + X[k] + Ti;\
  -  a = ROTATE_LEFT(t, s) + b
  -     /* Do the following 16 operations. */
  -    SET(a, b, c, d,  5,  4, T33);
  -    SET(d, a, b, c,  8, 11, T34);
  -    SET(c, d, a, b, 11, 16, T35);
  -    SET(b, c, d, a, 14, 23, T36);
  -    SET(a, b, c, d,  1,  4, T37);
  -    SET(d, a, b, c,  4, 11, T38);
  -    SET(c, d, a, b,  7, 16, T39);
  -    SET(b, c, d, a, 10, 23, T40);
  -    SET(a, b, c, d, 13,  4, T41);
  -    SET(d, a, b, c,  0, 11, T42);
  -    SET(c, d, a, b,  3, 16, T43);
  -    SET(b, c, d, a,  6, 23, T44);
  -    SET(a, b, c, d,  9,  4, T45);
  -    SET(d, a, b, c, 12, 11, T46);
  -    SET(c, d, a, b, 15, 16, T47);
  -    SET(b, c, d, a,  2, 23, T48);
  -#undef SET
  -
  -     /* Round 4. */
  -     /* Let [abcd k s t] denote the operation
  -          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
  -#define I(x, y, z) ((y) ^ ((x) | ~(z)))
  -#define SET(a, b, c, d, k, s, Ti)\
  -  t = a + I(b,c,d) + X[k] + Ti;\
  -  a = ROTATE_LEFT(t, s) + b
  -     /* Do the following 16 operations. */
  -    SET(a, b, c, d,  0,  6, T49);
  -    SET(d, a, b, c,  7, 10, T50);
  -    SET(c, d, a, b, 14, 15, T51);
  -    SET(b, c, d, a,  5, 21, T52);
  -    SET(a, b, c, d, 12,  6, T53);
  -    SET(d, a, b, c,  3, 10, T54);
  -    SET(c, d, a, b, 10, 15, T55);
  -    SET(b, c, d, a,  1, 21, T56);
  -    SET(a, b, c, d,  8,  6, T57);
  -    SET(d, a, b, c, 15, 10, T58);
  -    SET(c, d, a, b,  6, 15, T59);
  -    SET(b, c, d, a, 13, 21, T60);
  -    SET(a, b, c, d,  4,  6, T61);
  -    SET(d, a, b, c, 11, 10, T62);
  -    SET(c, d, a, b,  2, 15, T63);
  -    SET(b, c, d, a,  9, 21, T64);
  -#undef SET
  -
  -     /* Then perform the following additions. (That is increment each
  -        of the four registers by the value it had before this block
  -        was started.) */
  -    pms->abcd[0] += a;
  -    pms->abcd[1] += b;
  -    pms->abcd[2] += c;
  -    pms->abcd[3] += d;
  -}
  -
  -void
  -mongo_md5_init(mongo_md5_state_t *pms)
  -{
  -    pms->count[0] = pms->count[1] = 0;
  -    pms->abcd[0] = 0x67452301;
  -    pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
  -    pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
  -    pms->abcd[3] = 0x10325476;
  -}
  -
  -void
  -mongo_md5_append(mongo_md5_state_t *pms, const mongo_md5_byte_t *data, int nbytes)
  -{
  -    const mongo_md5_byte_t *p = data;
  -    int left = nbytes;
  -    int offset = (pms->count[0] >> 3) & 63;
  -    mongo_md5_word_t nbits = (mongo_md5_word_t)(nbytes << 3);
  -
  -    if (nbytes <= 0)
  -	return;
  -
  -    /* Update the message length. */
  -    pms->count[1] += nbytes >> 29;
  -    pms->count[0] += nbits;
  -    if (pms->count[0] < nbits)
  -	pms->count[1]++;
  -
  -    /* Process an initial partial block. */
  -    if (offset) {
  -	int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
  -
  -	memcpy(pms->buf + offset, p, copy);
  -	if (offset + copy < 64)
  -	    return;
  -	p += copy;
  -	left -= copy;
  -	mongo_md5_process(pms, pms->buf);
  -    }
  -
  -    /* Process full blocks. */
  -    for (; left >= 64; p += 64, left -= 64)
  -	mongo_md5_process(pms, p);
  -
  -    /* Process a final partial block. */
  -    if (left)
  -	memcpy(pms->buf, p, left);
  -}
  -
  -void
  -mongo_md5_finish(mongo_md5_state_t *pms, mongo_md5_byte_t digest[16])
  -{
  -    static const mongo_md5_byte_t pad[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
  -    };
  -    mongo_md5_byte_t data[8];
  -    int i;
  -
  -    /* Save the length before padding. */
  -    for (i = 0; i < 8; ++i)
  -	data[i] = (mongo_md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
  -    /* Pad to 56 bytes mod 64. */
  -    mongo_md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
  -    /* Append the length. */
  -    mongo_md5_append(pms, data, 8);
  -    for (i = 0; i < 16; ++i)
  -	digest[i] = (mongo_md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
  -}
  -
  -/*==============================================================*/
   /* --- mongo_except.h */
   
   /* This file is based loosely on cexcept (http://www.nicemice.net/cexcept/). I
  @@ -1281,33 +804,24 @@
       return ismaster;
   }
   
  -static void digest2hex(mongo_md5_byte_t digest[16], char hex_digest[33]){
  -    static const char hex[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
  -    int i;
  -    for (i=0; i<16; i++){
  -        hex_digest[2*i]     = hex[(digest[i] & 0xf0) >> 4];
  -        hex_digest[2*i + 1] = hex[ digest[i] & 0x0f      ];
  -    }
  -    hex_digest[32] = '\0';
  -}
  -
  -static void mongo_pass_digest(const char* user, const char* pass, char hex_digest[33]){
  -    mongo_md5_state_t st;
  -    mongo_md5_byte_t digest[16];
  -
  -    mongo_md5_init(&st);
  -    mongo_md5_append(&st, (const mongo_md5_byte_t*)user, strlen(user));
  -    mongo_md5_append(&st, (const mongo_md5_byte_t*)":mongo:", 7);
  -    mongo_md5_append(&st, (const mongo_md5_byte_t*)pass, strlen(pass));
  -    mongo_md5_finish(&st, digest);
  -    digest2hex(digest, hex_digest);
  +static void mongo_pass_digest(const char* user, const char* pass, char hex_digest[32+1])
  +{
  +    DIGEST_CTX ctx = rpmDigestInit(PGPHASHALGO_MD5, RPMDIGEST_NONE);
  +    const char * _digest = NULL;
  +    int xx;
  +    xx = rpmDigestUpdate(ctx, user, strlen(user));
  +    xx = rpmDigestUpdate(ctx, ":mongo:", 7);
  +    xx = rpmDigestUpdate(ctx, pass, strlen(pass));
  +    xx = rpmDigestFinal(ctx, &_digest, NULL, 1);
  +    strncpy(hex_digest, _digest, 32+1);
  +    _digest = _free(_digest);
   }
   
   void mongo_cmd_add_user(mongo_connection* conn, const char* db, const char* user, const char* pass){
       bson_buffer bb;
       bson user_obj;
       bson pass_obj;
  -    char hex_digest[33];
  +    char hex_digest[32+1];
       char* ns = malloc(strlen(db) + strlen(".system.users") + 1);
   
       strcpy(ns, db);
  @@ -1346,9 +860,7 @@
       const char* nonce;
       bson_bool_t success = 0;
   
  -    mongo_md5_state_t st;
  -    mongo_md5_byte_t digest[16];
  -    char hex_digest[33];
  +    char hex_digest[32+1];
   
       if (mongo_simple_int_command(conn, db, "getnonce", 1, &from_db)){
           bson_iterator it;
  @@ -1360,12 +872,16 @@
   
       mongo_pass_digest(user, pass, hex_digest);
   
  -    mongo_md5_init(&st);
  -    mongo_md5_append(&st, (const mongo_md5_byte_t*)nonce, strlen(nonce));
  -    mongo_md5_append(&st, (const mongo_md5_byte_t*)user, strlen(user));
  -    mongo_md5_append(&st, (const mongo_md5_byte_t*)hex_digest, 32);
  -    mongo_md5_finish(&st, digest);
  -    digest2hex(digest, hex_digest);
  +    {	DIGEST_CTX ctx = rpmDigestInit(PGPHASHALGO_MD5, RPMDIGEST_NONE);
  +	const char * _digest = NULL;
  +	int xx;
  +	xx = rpmDigestUpdate(ctx, nonce, strlen(nonce));
  +	xx = rpmDigestUpdate(ctx, user, strlen(user));
  +	xx = rpmDigestUpdate(ctx, hex_digest, 32);
  +	xx = rpmDigestFinal(ctx, &_digest, NULL, 1);
  +	strncpy(hex_digest, _digest, 32+1);
  +	_digest = _free(_digest);
  +    }
   
       bson_buffer_init(&bb);
       bson_append_int(&bb, "authenticate", 1);
  @@ -1426,7 +942,6 @@
   rpmmgo rpmmgoNew(const char * fn, int flags)
   {
       rpmmgo mgo = rpmmgoGetPool(_rpmmgoPool);
  -    int xx;
   
       if (fn)
   	mgo->fn = xstrdup(fn);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/tests/mongo/Makefile.am
  ============================================================================
  $ cvs diff -u -r1.2 -r1.3 Makefile.am
  --- rpm/tests/mongo/Makefile.am	18 Sep 2010 03:25:03 -0000	1.2
  +++ rpm/tests/mongo/Makefile.am	18 Sep 2010 14:02:50 -0000	1.3
  @@ -5,6 +5,7 @@
   EXTRA_DIST =
   
   EXTRA_PROGRAMS = \
  +	endian_swap \
   	json
   
   noinst_PROGRAMS = \
  @@ -12,7 +13,6 @@
   	auth \
   	benchmark \
   	count_delete \
  -	endian_swap \
   	errors \
   	pair \
   	resize \
  @@ -88,8 +88,8 @@
   #	@-./benchmark $(mongoserver)
   	@echo "--> count_delete"
   	@-./count_delete $(mongoserver)
  -	@echo "--> endian_swap"
  -	@-./endian_swap
  +#	@echo "--> endian_swap"
  +#	@-./endian_swap
   	@echo "--> errors"
   	@-./errors $(mongoserver)
   #	@echo "--> json"
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/tests/mongo/test.h
  ============================================================================
  $ cvs diff -u -r1.2 -r1.3 test.h
  --- rpm/tests/mongo/test.h	18 Sep 2010 03:25:03 -0000	1.2
  +++ rpm/tests/mongo/test.h	18 Sep 2010 14:02:50 -0000	1.3
  @@ -7,15 +7,3 @@
       }while(0)
   
   #define	TEST_SERVER	"127.0.0.1"
  -
  -#ifdef MONGO_BIG_ENDIAN
  -#define bson_little_endian64(out, in) ( bson_swap_endian64(out, in) )
  -#define bson_little_endian32(out, in) ( bson_swap_endian32(out, in) )
  -#define bson_big_endian64(out, in) ( memcpy(out, in, 8) )
  -#define bson_big_endian32(out, in) ( memcpy(out, in, 4) )
  -#else
  -#define bson_little_endian64(out, in) ( memcpy(out, in, 8) )
  -#define bson_little_endian32(out, in) ( memcpy(out, in, 4) )
  -#define bson_big_endian64(out, in) ( bson_swap_endian64(out, in) )
  -#define bson_big_endian32(out, in) ( bson_swap_endian32(out, in) )
  -#endif
  @@ .
Received on Sat Sep 18 16:02:50 2010
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.