md32_common.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:18k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* crypto/md32_common.h */
  2. /* ====================================================================
  3.  * Copyright (c) 1999-2002 The OpenSSL Project.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer. 
  11.  *
  12.  * 2. Redistributions in binary form must reproduce the above copyright
  13.  *    notice, this list of conditions and the following disclaimer in
  14.  *    the documentation and/or other materials provided with the
  15.  *    distribution.
  16.  *
  17.  * 3. All advertising materials mentioning features or use of this
  18.  *    software must display the following acknowledgment:
  19.  *    "This product includes software developed by the OpenSSL Project
  20.  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
  21.  *
  22.  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  23.  *    endorse or promote products derived from this software without
  24.  *    prior written permission. For written permission, please contact
  25.  *    licensing@OpenSSL.org.
  26.  *
  27.  * 5. Products derived from this software may not be called "OpenSSL"
  28.  *    nor may "OpenSSL" appear in their names without prior written
  29.  *    permission of the OpenSSL Project.
  30.  *
  31.  * 6. Redistributions of any form whatsoever must retain the following
  32.  *    acknowledgment:
  33.  *    "This product includes software developed by the OpenSSL Project
  34.  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
  35.  *
  36.  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  37.  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  38.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  39.  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
  40.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  41.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  42.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  43.  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  44.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  45.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  46.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  47.  * OF THE POSSIBILITY OF SUCH DAMAGE.
  48.  * ====================================================================
  49.  *
  50.  * This product includes cryptographic software written by Eric Young
  51.  * (eay@cryptsoft.com).  This product includes software written by Tim
  52.  * Hudson (tjh@cryptsoft.com).
  53.  *
  54.  */
  55. /*
  56.  * This is a generic 32 bit "collector" for message digest algorithms.
  57.  * Whenever needed it collects input character stream into chunks of
  58.  * 32 bit values and invokes a block function that performs actual hash
  59.  * calculations.
  60.  *
  61.  * Porting guide.
  62.  *
  63.  * Obligatory macros:
  64.  *
  65.  * DATA_ORDER_IS_BIG_ENDIAN or DATA_ORDER_IS_LITTLE_ENDIAN
  66.  * this macro defines byte order of input stream.
  67.  * HASH_CBLOCK
  68.  * size of a unit chunk HASH_BLOCK operates on.
  69.  * HASH_LONG
  70.  * has to be at lest 32 bit wide, if it's wider, then
  71.  * HASH_LONG_LOG2 *has to* be defined along
  72.  * HASH_CTX
  73.  * context structure that at least contains following
  74.  * members:
  75.  * typedef struct {
  76.  * ...
  77.  * HASH_LONG Nl,Nh;
  78.  * HASH_LONG data[HASH_LBLOCK];
  79.  * unsigned int num;
  80.  * ...
  81.  * } HASH_CTX;
  82.  * HASH_UPDATE
  83.  * name of "Update" function, implemented here.
  84.  * HASH_TRANSFORM
  85.  * name of "Transform" function, implemented here.
  86.  * HASH_FINAL
  87.  * name of "Final" function, implemented here.
  88.  * HASH_BLOCK_HOST_ORDER
  89.  * name of "block" function treating *aligned* input message
  90.  * in host byte order, implemented externally.
  91.  * HASH_BLOCK_DATA_ORDER
  92.  * name of "block" function treating *unaligned* input message
  93.  * in original (data) byte order, implemented externally (it
  94.  * actually is optional if data and host are of the same
  95.  * "endianess").
  96.  * HASH_MAKE_STRING
  97.  * macro convering context variables to an ASCII hash string.
  98.  *
  99.  * Optional macros:
  100.  *
  101.  * B_ENDIAN or L_ENDIAN
  102.  * defines host byte-order.
  103.  * HASH_LONG_LOG2
  104.  * defaults to 2 if not states otherwise.
  105.  * HASH_LBLOCK
  106.  * assumed to be HASH_CBLOCK/4 if not stated otherwise.
  107.  * HASH_BLOCK_DATA_ORDER_ALIGNED
  108.  * alternative "block" function capable of treating
  109.  * aligned input message in original (data) order,
  110.  * implemented externally.
  111.  *
  112.  * MD5 example:
  113.  *
  114.  * #define DATA_ORDER_IS_LITTLE_ENDIAN
  115.  *
  116.  * #define HASH_LONG MD5_LONG
  117.  * #define HASH_LONG_LOG2 MD5_LONG_LOG2
  118.  * #define HASH_CTX MD5_CTX
  119.  * #define HASH_CBLOCK MD5_CBLOCK
  120.  * #define HASH_LBLOCK MD5_LBLOCK
  121.  * #define HASH_UPDATE MD5_Update
  122.  * #define HASH_TRANSFORM MD5_Transform
  123.  * #define HASH_FINAL MD5_Final
  124.  * #define HASH_BLOCK_HOST_ORDER md5_block_host_order
  125.  * #define HASH_BLOCK_DATA_ORDER md5_block_data_order
  126.  *
  127.  * <appro@fy.chalmers.se>
  128.  */
  129. #if !defined(DATA_ORDER_IS_BIG_ENDIAN) && !defined(DATA_ORDER_IS_LITTLE_ENDIAN)
  130. #error "DATA_ORDER must be defined!"
  131. #endif
  132. #ifndef HASH_CBLOCK
  133. #error "HASH_CBLOCK must be defined!"
  134. #endif
  135. #ifndef HASH_LONG
  136. #error "HASH_LONG must be defined!"
  137. #endif
  138. #ifndef HASH_CTX
  139. #error "HASH_CTX must be defined!"
  140. #endif
  141. #ifndef HASH_UPDATE
  142. #error "HASH_UPDATE must be defined!"
  143. #endif
  144. #ifndef HASH_TRANSFORM
  145. #error "HASH_TRANSFORM must be defined!"
  146. #endif
  147. #ifndef HASH_FINAL
  148. #error "HASH_FINAL must be defined!"
  149. #endif
  150. #ifndef HASH_BLOCK_HOST_ORDER
  151. #error "HASH_BLOCK_HOST_ORDER must be defined!"
  152. #endif
  153. #if 0
  154. /*
  155.  * Moved below as it's required only if HASH_BLOCK_DATA_ORDER_ALIGNED
  156.  * isn't defined.
  157.  */
  158. #ifndef HASH_BLOCK_DATA_ORDER
  159. #error "HASH_BLOCK_DATA_ORDER must be defined!"
  160. #endif
  161. #endif
  162. #ifndef HASH_LBLOCK
  163. #define HASH_LBLOCK (HASH_CBLOCK/4)
  164. #endif
  165. #ifndef HASH_LONG_LOG2
  166. #define HASH_LONG_LOG2 2
  167. #endif
  168. /*
  169.  * Engage compiler specific rotate intrinsic function if available.
  170.  */
  171. #undef ROTATE
  172. #ifndef PEDANTIC
  173. # if defined(_MSC_VER) || defined(__ICC)
  174. #  define ROTATE(a,n) _lrotl(a,n)
  175. # elif defined(__MWERKS__)
  176. #  if defined(__POWERPC__)
  177. #   define ROTATE(a,n) __rlwinm(a,n,0,31)
  178. #  elif defined(__MC68K__)
  179.     /* Motorola specific tweak. <appro@fy.chalmers.se> */
  180. #   define ROTATE(a,n) ( n<24 ? __rol(a,n) : __ror(a,32-n) )
  181. #  else
  182. #   define ROTATE(a,n) __rol(a,n)
  183. #  endif
  184. # elif defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
  185.   /*
  186.    * Some GNU C inline assembler templates. Note that these are
  187.    * rotates by *constant* number of bits! But that's exactly
  188.    * what we need here...
  189.    *  <appro@fy.chalmers.se>
  190.    */
  191. #  if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
  192. #   define ROTATE(a,n) ({ register unsigned int ret;
  193. asm (
  194. "roll %1,%0"
  195. : "=r"(ret)
  196. : "I"(n), "0"(a)
  197. : "cc");
  198.    ret;
  199. })
  200. #  elif defined(__powerpc) || defined(__ppc__) || defined(__powerpc64__)
  201. #   define ROTATE(a,n) ({ register unsigned int ret;
  202. asm (
  203. "rlwinm %0,%1,%2,0,31"
  204. : "=r"(ret)
  205. : "r"(a), "I"(n));
  206.    ret;
  207. })
  208. #  endif
  209. # endif
  210. #endif /* PEDANTIC */
  211. #if HASH_LONG_LOG2==2 /* Engage only if sizeof(HASH_LONG)== 4 */
  212. /* A nice byte order reversal from Wei Dai <weidai@eskimo.com> */
  213. #ifdef ROTATE
  214. /* 5 instructions with rotate instruction, else 9 */
  215. #define REVERSE_FETCH32(a,l) (
  216. l=*(const HASH_LONG *)(a),
  217. ((ROTATE(l,8)&0x00FF00FF)|(ROTATE((l&0x00FF00FF),24)))
  218. )
  219. #else
  220. /* 6 instructions with rotate instruction, else 8 */
  221. #define REVERSE_FETCH32(a,l) (
  222. l=*(const HASH_LONG *)(a),
  223. l=(((l>>8)&0x00FF00FF)|((l&0x00FF00FF)<<8)),
  224. ROTATE(l,16)
  225. )
  226. /*
  227.  * Originally the middle line started with l=(((l&0xFF00FF00)>>8)|...
  228.  * It's rewritten as above for two reasons:
  229.  * - RISCs aren't good at long constants and have to explicitely
  230.  *   compose 'em with several (well, usually 2) instructions in a
  231.  *   register before performing the actual operation and (as you
  232.  *   already realized:-) having same constant should inspire the
  233.  *   compiler to permanently allocate the only register for it;
  234.  * - most modern CPUs have two ALUs, but usually only one has
  235.  *   circuitry for shifts:-( this minor tweak inspires compiler
  236.  *   to schedule shift instructions in a better way...
  237.  *
  238.  * <appro@fy.chalmers.se>
  239.  */
  240. #endif
  241. #endif
  242. #ifndef ROTATE
  243. #define ROTATE(a,n)     (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
  244. #endif
  245. /*
  246.  * Make some obvious choices. E.g., HASH_BLOCK_DATA_ORDER_ALIGNED
  247.  * and HASH_BLOCK_HOST_ORDER ought to be the same if input data
  248.  * and host are of the same "endianess". It's possible to mask
  249.  * this with blank #define HASH_BLOCK_DATA_ORDER though...
  250.  *
  251.  * <appro@fy.chalmers.se>
  252.  */
  253. #if defined(B_ENDIAN)
  254. #  if defined(DATA_ORDER_IS_BIG_ENDIAN)
  255. #    if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED) && HASH_LONG_LOG2==2
  256. #      define HASH_BLOCK_DATA_ORDER_ALIGNED HASH_BLOCK_HOST_ORDER
  257. #    endif
  258. #  endif
  259. #elif defined(L_ENDIAN)
  260. #  if defined(DATA_ORDER_IS_LITTLE_ENDIAN)
  261. #    if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED) && HASH_LONG_LOG2==2
  262. #      define HASH_BLOCK_DATA_ORDER_ALIGNED HASH_BLOCK_HOST_ORDER
  263. #    endif
  264. #  endif
  265. #endif
  266. #if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
  267. #ifndef HASH_BLOCK_DATA_ORDER
  268. #error "HASH_BLOCK_DATA_ORDER must be defined!"
  269. #endif
  270. #endif
  271. #if defined(DATA_ORDER_IS_BIG_ENDIAN)
  272. #ifndef PEDANTIC
  273. # if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
  274. #  if ((defined(__i386) || defined(__i386__)) && !defined(I386_ONLY)) || 
  275.       (defined(__x86_64) || defined(__x86_64__))
  276.     /*
  277.      * This gives ~30-40% performance improvement in SHA-256 compiled
  278.      * with gcc [on P4]. Well, first macro to be frank. We can pull
  279.      * this trick on x86* platforms only, because these CPUs can fetch
  280.      * unaligned data without raising an exception.
  281.      */
  282. #   define HOST_c2l(c,l) ({ unsigned int r=*((const unsigned int *)(c));
  283.    asm ("bswapl %0":"=r"(r):"0"(r));
  284.    (c)+=4; (l)=r; })
  285. #   define HOST_l2c(l,c) ({ unsigned int r=(l);
  286.    asm ("bswapl %0":"=r"(r):"0"(r));
  287.    *((unsigned int *)(c))=r; (c)+=4; r; })
  288. #  endif
  289. # endif
  290. #endif
  291. #ifndef HOST_c2l
  292. #define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++)))<<24),
  293.  l|=(((unsigned long)(*((c)++)))<<16),
  294.  l|=(((unsigned long)(*((c)++)))<< 8),
  295.  l|=(((unsigned long)(*((c)++)))    ),
  296.  l)
  297. #endif
  298. #define HOST_p_c2l(c,l,n) {
  299. switch (n) {
  300. case 0: l =((unsigned long)(*((c)++)))<<24;
  301. case 1: l|=((unsigned long)(*((c)++)))<<16;
  302. case 2: l|=((unsigned long)(*((c)++)))<< 8;
  303. case 3: l|=((unsigned long)(*((c)++)));
  304. } }
  305. #define HOST_p_c2l_p(c,l,sc,len) {
  306. switch (sc) {
  307. case 0: l =((unsigned long)(*((c)++)))<<24;
  308. if (--len == 0) break;
  309. case 1: l|=((unsigned long)(*((c)++)))<<16;
  310. if (--len == 0) break;
  311. case 2: l|=((unsigned long)(*((c)++)))<< 8;
  312. } }
  313. /* NOTE the pointer is not incremented at the end of this */
  314. #define HOST_c2l_p(c,l,n) {
  315. l=0; (c)+=n;
  316. switch (n) {
  317. case 3: l =((unsigned long)(*(--(c))))<< 8;
  318. case 2: l|=((unsigned long)(*(--(c))))<<16;
  319. case 1: l|=((unsigned long)(*(--(c))))<<24;
  320. } }
  321. #ifndef HOST_l2c
  322. #define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff),
  323.  *((c)++)=(unsigned char)(((l)>>16)&0xff),
  324.  *((c)++)=(unsigned char)(((l)>> 8)&0xff),
  325.  *((c)++)=(unsigned char)(((l)    )&0xff),
  326.  l)
  327. #endif
  328. #elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
  329. #if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
  330. # ifndef B_ENDIAN
  331.    /* See comment in DATA_ORDER_IS_BIG_ENDIAN section. */
  332. #  define HOST_c2l(c,l) ((l)=*((const unsigned int *)(c)), (c)+=4, l)
  333. #  define HOST_l2c(l,c) (*((unsigned int *)(c))=(l), (c)+=4, l)
  334. # endif
  335. #endif
  336. #ifndef HOST_c2l
  337. #define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++)))    ),
  338.  l|=(((unsigned long)(*((c)++)))<< 8),
  339.  l|=(((unsigned long)(*((c)++)))<<16),
  340.  l|=(((unsigned long)(*((c)++)))<<24),
  341.  l)
  342. #endif
  343. #define HOST_p_c2l(c,l,n) {
  344. switch (n) {
  345. case 0: l =((unsigned long)(*((c)++)));
  346. case 1: l|=((unsigned long)(*((c)++)))<< 8;
  347. case 2: l|=((unsigned long)(*((c)++)))<<16;
  348. case 3: l|=((unsigned long)(*((c)++)))<<24;
  349. } }
  350. #define HOST_p_c2l_p(c,l,sc,len) {
  351. switch (sc) {
  352. case 0: l =((unsigned long)(*((c)++)));
  353. if (--len == 0) break;
  354. case 1: l|=((unsigned long)(*((c)++)))<< 8;
  355. if (--len == 0) break;
  356. case 2: l|=((unsigned long)(*((c)++)))<<16;
  357. } }
  358. /* NOTE the pointer is not incremented at the end of this */
  359. #define HOST_c2l_p(c,l,n) {
  360. l=0; (c)+=n;
  361. switch (n) {
  362. case 3: l =((unsigned long)(*(--(c))))<<16;
  363. case 2: l|=((unsigned long)(*(--(c))))<< 8;
  364. case 1: l|=((unsigned long)(*(--(c))));
  365. } }
  366. #ifndef HOST_l2c
  367. #define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l)    )&0xff),
  368.  *((c)++)=(unsigned char)(((l)>> 8)&0xff),
  369.  *((c)++)=(unsigned char)(((l)>>16)&0xff),
  370.  *((c)++)=(unsigned char)(((l)>>24)&0xff),
  371.  l)
  372. #endif
  373. #endif
  374. /*
  375.  * Time for some action:-)
  376.  */
  377. int HASH_UPDATE (HASH_CTX *c, const void *data_, size_t len)
  378. {
  379. const unsigned char *data=data_;
  380. register HASH_LONG * p;
  381. register HASH_LONG l;
  382. size_t sw,sc,ew,ec;
  383. if (len==0) return 1;
  384. l=(c->Nl+(((HASH_LONG)len)<<3))&0xffffffffUL;
  385. /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to
  386.  * Wei Dai <weidai@eskimo.com> for pointing it out. */
  387. if (l < c->Nl) /* overflow */
  388. c->Nh++;
  389. c->Nh+=(len>>29); /* might cause compiler warning on 16-bit */
  390. c->Nl=l;
  391. if (c->num != 0)
  392. {
  393. p=c->data;
  394. sw=c->num>>2;
  395. sc=c->num&0x03;
  396. if ((c->num+len) >= HASH_CBLOCK)
  397. {
  398. l=p[sw]; HOST_p_c2l(data,l,sc); p[sw++]=l;
  399. for (; sw<HASH_LBLOCK; sw++)
  400. {
  401. HOST_c2l(data,l); p[sw]=l;
  402. }
  403. HASH_BLOCK_HOST_ORDER (c,p,1);
  404. len-=(HASH_CBLOCK-c->num);
  405. c->num=0;
  406. /* drop through and do the rest */
  407. }
  408. else
  409. {
  410. c->num+=(unsigned int)len;
  411. if ((sc+len) < 4) /* ugly, add char's to a word */
  412. {
  413. l=p[sw]; HOST_p_c2l_p(data,l,sc,len); p[sw]=l;
  414. }
  415. else
  416. {
  417. ew=(c->num>>2);
  418. ec=(c->num&0x03);
  419. if (sc)
  420. l=p[sw];
  421. HOST_p_c2l(data,l,sc);
  422. p[sw++]=l;
  423. for (; sw < ew; sw++)
  424. {
  425. HOST_c2l(data,l); p[sw]=l;
  426. }
  427. if (ec)
  428. {
  429. HOST_c2l_p(data,l,ec); p[sw]=l;
  430. }
  431. }
  432. return 1;
  433. }
  434. }
  435. sw=len/HASH_CBLOCK;
  436. if (sw > 0)
  437. {
  438. #if defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
  439. /*
  440.  * Note that HASH_BLOCK_DATA_ORDER_ALIGNED gets defined
  441.  * only if sizeof(HASH_LONG)==4.
  442.  */
  443. if ((((size_t)data)%4) == 0)
  444. {
  445. /* data is properly aligned so that we can cast it: */
  446. HASH_BLOCK_DATA_ORDER_ALIGNED (c,(const HASH_LONG *)data,sw);
  447. sw*=HASH_CBLOCK;
  448. data+=sw;
  449. len-=sw;
  450. }
  451. else
  452. #if !defined(HASH_BLOCK_DATA_ORDER)
  453. while (sw--)
  454. {
  455. memcpy (p=c->data,data,HASH_CBLOCK);
  456. HASH_BLOCK_DATA_ORDER_ALIGNED(c,p,1);
  457. data+=HASH_CBLOCK;
  458. len-=HASH_CBLOCK;
  459. }
  460. #endif
  461. #endif
  462. #if defined(HASH_BLOCK_DATA_ORDER)
  463. {
  464. HASH_BLOCK_DATA_ORDER(c,data,sw);
  465. sw*=HASH_CBLOCK;
  466. data+=sw;
  467. len-=sw;
  468. }
  469. #endif
  470. }
  471. if (len!=0)
  472. {
  473. p = c->data;
  474. c->num = len;
  475. ew=len>>2; /* words to copy */
  476. ec=len&0x03;
  477. for (; ew; ew--,p++)
  478. {
  479. HOST_c2l(data,l); *p=l;
  480. }
  481. HOST_c2l_p(data,l,ec);
  482. *p=l;
  483. }
  484. return 1;
  485. }
  486. void HASH_TRANSFORM (HASH_CTX *c, const unsigned char *data)
  487. {
  488. #if defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
  489. if ((((size_t)data)%4) == 0)
  490. /* data is properly aligned so that we can cast it: */
  491. HASH_BLOCK_DATA_ORDER_ALIGNED (c,(const HASH_LONG *)data,1);
  492. else
  493. #if !defined(HASH_BLOCK_DATA_ORDER)
  494. {
  495. memcpy (c->data,data,HASH_CBLOCK);
  496. HASH_BLOCK_DATA_ORDER_ALIGNED (c,c->data,1);
  497. }
  498. #endif
  499. #endif
  500. #if defined(HASH_BLOCK_DATA_ORDER)
  501. HASH_BLOCK_DATA_ORDER (c,data,1);
  502. #endif
  503. }
  504. int HASH_FINAL (unsigned char *md, HASH_CTX *c)
  505. {
  506. register HASH_LONG *p;
  507. register unsigned long l;
  508. register int i,j;
  509. static const unsigned char end[4]={0x80,0x00,0x00,0x00};
  510. const unsigned char *cp=end;
  511. /* c->num should definitly have room for at least one more byte. */
  512. p=c->data;
  513. i=c->num>>2;
  514. j=c->num&0x03;
  515. #if 0
  516. /* purify often complains about the following line as an
  517.  * Uninitialized Memory Read.  While this can be true, the
  518.  * following p_c2l macro will reset l when that case is true.
  519.  * This is because j&0x03 contains the number of 'valid' bytes
  520.  * already in p[i].  If and only if j&0x03 == 0, the UMR will
  521.  * occur but this is also the only time p_c2l will do
  522.  * l= *(cp++) instead of l|= *(cp++)
  523.  * Many thanks to Alex Tang <altitude@cic.net> for pickup this
  524.  * 'potential bug' */
  525. #ifdef PURIFY
  526. if (j==0) p[i]=0; /* Yeah, but that's not the way to fix it:-) */
  527. #endif
  528. l=p[i];
  529. #else
  530. l = (j==0) ? 0 : p[i];
  531. #endif
  532. HOST_p_c2l(cp,l,j); p[i++]=l; /* i is the next 'undefined word' */
  533. if (i>(HASH_LBLOCK-2)) /* save room for Nl and Nh */
  534. {
  535. if (i<HASH_LBLOCK) p[i]=0;
  536. HASH_BLOCK_HOST_ORDER (c,p,1);
  537. i=0;
  538. }
  539. for (; i<(HASH_LBLOCK-2); i++)
  540. p[i]=0;
  541. #if   defined(DATA_ORDER_IS_BIG_ENDIAN)
  542. p[HASH_LBLOCK-2]=c->Nh;
  543. p[HASH_LBLOCK-1]=c->Nl;
  544. #elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
  545. p[HASH_LBLOCK-2]=c->Nl;
  546. p[HASH_LBLOCK-1]=c->Nh;
  547. #endif
  548. HASH_BLOCK_HOST_ORDER (c,p,1);
  549. #ifndef HASH_MAKE_STRING
  550. #error "HASH_MAKE_STRING must be defined!"
  551. #else
  552. HASH_MAKE_STRING(c,md);
  553. #endif
  554. c->num=0;
  555. /* clear stuff, HASH_BLOCK may be leaving some stuff on the stack
  556.  * but I'm not worried :-)
  557. OPENSSL_cleanse((void *)c,sizeof(HASH_CTX));
  558.  */
  559. return 1;
  560. }
  561. #ifndef MD32_REG_T
  562. #define MD32_REG_T long
  563. /*
  564.  * This comment was originaly written for MD5, which is why it
  565.  * discusses A-D. But it basically applies to all 32-bit digests,
  566.  * which is why it was moved to common header file.
  567.  *
  568.  * In case you wonder why A-D are declared as long and not
  569.  * as MD5_LONG. Doing so results in slight performance
  570.  * boost on LP64 architectures. The catch is we don't
  571.  * really care if 32 MSBs of a 64-bit register get polluted
  572.  * with eventual overflows as we *save* only 32 LSBs in
  573.  * *either* case. Now declaring 'em long excuses the compiler
  574.  * from keeping 32 MSBs zeroed resulting in 13% performance
  575.  * improvement under SPARC Solaris7/64 and 5% under AlphaLinux.
  576.  * Well, to be honest it should say that this *prevents* 
  577.  * performance degradation.
  578.  * <appro@fy.chalmers.se>
  579.  * Apparently there're LP64 compilers that generate better
  580.  * code if A-D are declared int. Most notably GCC-x86_64
  581.  * generates better code.
  582.  * <appro@fy.chalmers.se>
  583.  */
  584. #endif