/opensource.apple.com/source/OpenSSL096/OpenSSL096-15/openssl/crypto/md32_common.h
# · C++ Header · 632 lines · 431 code · 38 blank · 163 comment · 10 complexity · 7b6d99a351b1a615be11b48345d5f946 MD5 · raw file
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <title>md32_common.h</title>
- <style type="text/css">
- .enscript-comment { font-style: italic; color: rgb(178,34,34); }
- .enscript-function-name { font-weight: bold; color: rgb(0,0,255); }
- .enscript-variable-name { font-weight: bold; color: rgb(184,134,11); }
- .enscript-keyword { font-weight: bold; color: rgb(160,32,240); }
- .enscript-reference { font-weight: bold; color: rgb(95,158,160); }
- .enscript-string { font-weight: bold; color: rgb(188,143,143); }
- .enscript-builtin { font-weight: bold; color: rgb(218,112,214); }
- .enscript-type { font-weight: bold; color: rgb(34,139,34); }
- .enscript-highlight { text-decoration: underline; color: 0; }
- </style>
- </head>
- <body id="top">
- <h1 style="margin:8px;" id="f1">md32_common.h <span style="font-weight: normal; font-size: 0.5em;">[<a href="?txt">plain text</a>]</span></h1>
- <hr/>
- <div></div>
- <pre>
- <span class="enscript-comment">/* crypto/md32_common.h */</span>
- <span class="enscript-comment">/* ====================================================================
- * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. All advertising materials mentioning features or use of this
- * software must display the following acknowledgment:
- * "This product includes software developed by the OpenSSL Project
- * for use in the OpenSSL Toolkit. (<a href="http://www.OpenSSL.org/">http://www.OpenSSL.org/</a>)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- * endorse or promote products derived from this software without
- * prior written permission. For written permission, please contact
- * <a href="mailto:licensing@OpenSSL.org">licensing@OpenSSL.org</a>.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- * nor may "OpenSSL" appear in their names without prior written
- * permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- * acknowledgment:
- * "This product includes software developed by the OpenSSL Project
- * for use in the OpenSSL Toolkit (<a href="http://www.OpenSSL.org/">http://www.OpenSSL.org/</a>)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- * ====================================================================
- *
- * This product includes cryptographic software written by Eric Young
- * (<a href="mailto:eay@cryptsoft.com">eay@cryptsoft.com</a>). This product includes software written by Tim
- * Hudson (<a href="mailto:tjh@cryptsoft.com">tjh@cryptsoft.com</a>).
- *
- */</span>
- <span class="enscript-comment">/*
- * This is a generic 32 bit "collector" for message digest algorithms.
- * Whenever needed it collects input character stream into chunks of
- * 32 bit values and invokes a block function that performs actual hash
- * calculations.
- *
- * Porting guide.
- *
- * Obligatory macros:
- *
- * DATA_ORDER_IS_BIG_ENDIAN or DATA_ORDER_IS_LITTLE_ENDIAN
- * this macro defines byte order of input stream.
- * HASH_CBLOCK
- * size of a unit chunk HASH_BLOCK operates on.
- * HASH_LONG
- * has to be at lest 32 bit wide, if it's wider, then
- * HASH_LONG_LOG2 *has to* be defined along
- * HASH_CTX
- * context structure that at least contains following
- * members:
- * typedef struct {
- * ...
- * HASH_LONG Nl,Nh;
- * HASH_LONG data[HASH_LBLOCK];
- * int num;
- * ...
- * } HASH_CTX;
- * HASH_UPDATE
- * name of "Update" function, implemented here.
- * HASH_TRANSFORM
- * name of "Transform" function, implemented here.
- * HASH_FINAL
- * name of "Final" function, implemented here.
- * HASH_BLOCK_HOST_ORDER
- * name of "block" function treating *aligned* input message
- * in host byte order, implemented externally.
- * HASH_BLOCK_DATA_ORDER
- * name of "block" function treating *unaligned* input message
- * in original (data) byte order, implemented externally (it
- * actually is optional if data and host are of the same
- * "endianess").
- * HASH_MAKE_STRING
- * macro convering context variables to an ASCII hash string.
- *
- * Optional macros:
- *
- * B_ENDIAN or L_ENDIAN
- * defines host byte-order.
- * HASH_LONG_LOG2
- * defaults to 2 if not states otherwise.
- * HASH_LBLOCK
- * assumed to be HASH_CBLOCK/4 if not stated otherwise.
- * HASH_BLOCK_DATA_ORDER_ALIGNED
- * alternative "block" function capable of treating
- * aligned input message in original (data) order,
- * implemented externally.
- *
- * MD5 example:
- *
- * #define DATA_ORDER_IS_LITTLE_ENDIAN
- *
- * #define HASH_LONG MD5_LONG
- * #define HASH_LONG_LOG2 MD5_LONG_LOG2
- * #define HASH_CTX MD5_CTX
- * #define HASH_CBLOCK MD5_CBLOCK
- * #define HASH_LBLOCK MD5_LBLOCK
- * #define HASH_UPDATE MD5_Update
- * #define HASH_TRANSFORM MD5_Transform
- * #define HASH_FINAL MD5_Final
- * #define HASH_BLOCK_HOST_ORDER md5_block_host_order
- * #define HASH_BLOCK_DATA_ORDER md5_block_data_order
- *
- * <<a href="mailto:appro@fy.chalmers.se">appro@fy.chalmers.se</a>>
- */</span>
- #<span class="enscript-reference">if</span> !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">DATA_ORDER_IS_BIG_ENDIAN</span>) && !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">DATA_ORDER_IS_LITTLE_ENDIAN</span>)
- #<span class="enscript-reference">error</span> <span class="enscript-string">"DATA_ORDER must be defined!"</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_CBLOCK</span>
- #<span class="enscript-reference">error</span> <span class="enscript-string">"HASH_CBLOCK must be defined!"</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_LONG</span>
- #<span class="enscript-reference">error</span> <span class="enscript-string">"HASH_LONG must be defined!"</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_CTX</span>
- #<span class="enscript-reference">error</span> <span class="enscript-string">"HASH_CTX must be defined!"</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_UPDATE</span>
- #<span class="enscript-reference">error</span> <span class="enscript-string">"HASH_UPDATE must be defined!"</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_TRANSFORM</span>
- #<span class="enscript-reference">error</span> <span class="enscript-string">"HASH_TRANSFORM must be defined!"</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_FINAL</span>
- #<span class="enscript-reference">error</span> <span class="enscript-string">"HASH_FINAL must be defined!"</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_BLOCK_HOST_ORDER</span>
- #<span class="enscript-reference">error</span> <span class="enscript-string">"HASH_BLOCK_HOST_ORDER must be defined!"</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">if</span> 0
- <span class="enscript-comment">/*
- * Moved below as it's required only if HASH_BLOCK_DATA_ORDER_ALIGNED
- * isn't defined.
- */</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER</span>
- #<span class="enscript-reference">error</span> <span class="enscript-string">"HASH_BLOCK_DATA_ORDER must be defined!"</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_LBLOCK</span>
- #<span class="enscript-reference">define</span> <span class="enscript-variable-name">HASH_LBLOCK</span> (HASH_CBLOCK/4)
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_LONG_LOG2</span>
- #<span class="enscript-reference">define</span> <span class="enscript-variable-name">HASH_LONG_LOG2</span> 2
- #<span class="enscript-reference">endif</span>
- <span class="enscript-comment">/*
- * Engage compiler specific rotate intrinsic function if available.
- */</span>
- #<span class="enscript-reference">undef</span> <span class="enscript-variable-name">ROTATE</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">PEDANTIC</span>
- # <span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">_MSC_VER</span>)
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">ROTATE</span>(a,n) _lrotl(a,n)
- # <span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__MWERKS__</span>)
- # <span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__POWERPC__</span>)
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">ROTATE</span>(a,n) __rlwinm(a,n,0,31)
- # <span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__MC68K__</span>)
- <span class="enscript-comment">/* Motorola specific tweak. <<a href="mailto:appro@fy.chalmers.se">appro@fy.chalmers.se</a>> */</span>
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">ROTATE</span>(a,n) ( n<24 ? __rol(a,n) : __ror(a,32-n) )
- # <span class="enscript-reference">else</span>
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">ROTATE</span>(a,n) __rol(a,n)
- # <span class="enscript-reference">endif</span>
- # <span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__GNUC__</span>) && <span class="enscript-variable-name">__GNUC__</span>>=2 && !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">NO_ASM</span>) && !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">NO_INLINE_ASM</span>)
- <span class="enscript-comment">/*
- * Some GNU C inline assembler templates. Note that these are
- * rotates by *constant* number of bits! But that's exactly
- * what we need here...
- *
- * <<a href="mailto:appro@fy.chalmers.se">appro@fy.chalmers.se</a>>
- */</span>
- # <span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__i386</span>) || <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__i386__</span>)
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">ROTATE</span>(a,n) ({ register unsigned int ret; \
- asm ( \
- <span class="enscript-string">"roll %1,%0"</span> \
- : <span class="enscript-string">"=r"</span>(ret) \
- : <span class="enscript-string">"I"</span>(n), <span class="enscript-string">"0"</span>(a) \
- : <span class="enscript-string">"cc"</span>); \
- ret; \
- })
- # <span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__powerpc</span>) || <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__ppc</span>)
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">ROTATE</span>(a,n) ({ register unsigned int ret; \
- asm ( \
- <span class="enscript-string">"rlwinm %0,%1,%2,0,31"</span> \
- : <span class="enscript-string">"=r"</span>(ret) \
- : <span class="enscript-string">"r"</span>(a), <span class="enscript-string">"I"</span>(n)); \
- ret; \
- })
- # <span class="enscript-reference">endif</span>
- # <span class="enscript-reference">endif</span>
- <span class="enscript-comment">/*
- * Engage compiler specific "fetch in reverse byte order"
- * intrinsic function if available.
- */</span>
- # <span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__GNUC__</span>) && <span class="enscript-variable-name">__GNUC__</span>>=2 && !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">NO_ASM</span>) && !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">NO_INLINE_ASM</span>)
- <span class="enscript-comment">/* some GNU C inline assembler templates by <<a href="mailto:appro@fy.chalmers.se">appro@fy.chalmers.se</a>> */</span>
- # <span class="enscript-reference">if</span> (<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__i386</span>) || <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__i386__</span>)) && !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">I386_ONLY</span>)
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">BE_FETCH32</span>(a) ({ register unsigned int l=(a);\
- asm ( \
- <span class="enscript-string">"bswapl %0"</span> \
- : <span class="enscript-string">"=r"</span>(l) : <span class="enscript-string">"0"</span>(l)); \
- l; \
- })
- # <span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__powerpc</span>)
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">LE_FETCH32</span>(a) ({ register unsigned int l; \
- asm ( \
- <span class="enscript-string">"lwbrx %0,0,%1"</span> \
- : <span class="enscript-string">"=r"</span>(l) \
- : <span class="enscript-string">"r"</span>(a)); \
- l; \
- })
- # <span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">__sparc</span>) && <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">ULTRASPARC</span>)
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">LE_FETCH32</span>(a) ({ register unsigned int l; \
- asm ( \
- <span class="enscript-string">"lda [%1]#ASI_PRIMARY_LITTLE,%0"</span>\
- : <span class="enscript-string">"=r"</span>(l) \
- : <span class="enscript-string">"r"</span>(a)); \
- l; \
- })
- # <span class="enscript-reference">endif</span>
- # <span class="enscript-reference">endif</span>
- #<span class="enscript-reference">endif</span> <span class="enscript-comment">/* PEDANTIC */</span>
- #<span class="enscript-reference">if</span> <span class="enscript-variable-name">HASH_LONG_LOG2</span>==2 <span class="enscript-comment">/* Engage only if sizeof(HASH_LONG)== 4 */</span>
- <span class="enscript-comment">/* A nice byte order reversal from Wei Dai <<a href="mailto:weidai@eskimo.com">weidai@eskimo.com</a>> */</span>
- #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">ROTATE</span>
- <span class="enscript-comment">/* 5 instructions with rotate instruction, else 9 */</span>
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">REVERSE_FETCH32</span>(a,l) ( \
- l=*(<span class="enscript-type">const</span> HASH_LONG *)(a), \
- ((ROTATE(l,8)&0x00FF00FF)|(ROTATE((l&0x00FF00FF),24))) \
- )
- #<span class="enscript-reference">else</span>
- <span class="enscript-comment">/* 6 instructions with rotate instruction, else 8 */</span>
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">REVERSE_FETCH32</span>(a,l) ( \
- l=*(<span class="enscript-type">const</span> HASH_LONG *)(a), \
- l=(((l>>8)&0x00FF00FF)|((l&0x00FF00FF)<<8)), \
- ROTATE(l,16) \
- )
- <span class="enscript-comment">/*
- * Originally the middle line started with l=(((l&0xFF00FF00)>>8)|...
- * It's rewritten as above for two reasons:
- * - RISCs aren't good at long constants and have to explicitely
- * compose 'em with several (well, usually 2) instructions in a
- * register before performing the actual operation and (as you
- * already realized:-) having same constant should inspire the
- * compiler to permanently allocate the only register for it;
- * - most modern CPUs have two ALUs, but usually only one has
- * circuitry for shifts:-( this minor tweak inspires compiler
- * to schedule shift instructions in a better way...
- *
- * <<a href="mailto:appro@fy.chalmers.se">appro@fy.chalmers.se</a>>
- */</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">ROTATE</span>
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">ROTATE</span>(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
- #<span class="enscript-reference">endif</span>
- <span class="enscript-comment">/*
- * Make some obvious choices. E.g., HASH_BLOCK_DATA_ORDER_ALIGNED
- * and HASH_BLOCK_HOST_ORDER ought to be the same if input data
- * and host are of the same "endianess". It's possible to mask
- * this with blank #define HASH_BLOCK_DATA_ORDER though...
- *
- * <<a href="mailto:appro@fy.chalmers.se">appro@fy.chalmers.se</a>>
- */</span>
- #<span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">B_ENDIAN</span>)
- # <span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">DATA_ORDER_IS_BIG_ENDIAN</span>)
- # <span class="enscript-reference">if</span> !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER_ALIGNED</span>) && <span class="enscript-variable-name">HASH_LONG_LOG2</span>==2
- # <span class="enscript-reference">define</span> <span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER_ALIGNED</span> HASH_BLOCK_HOST_ORDER
- # <span class="enscript-reference">endif</span>
- # <span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">DATA_ORDER_IS_LITTLE_ENDIAN</span>)
- # <span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HOST_FETCH32</span>
- # <span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">LE_FETCH32</span>
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_FETCH32</span>(p,l) LE_FETCH32(p)
- # <span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">REVERSE_FETCH32</span>)
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_FETCH32</span>(p,l) REVERSE_FETCH32(p,l)
- # <span class="enscript-reference">endif</span>
- # <span class="enscript-reference">endif</span>
- # <span class="enscript-reference">endif</span>
- #<span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">L_ENDIAN</span>)
- # <span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">DATA_ORDER_IS_LITTLE_ENDIAN</span>)
- # <span class="enscript-reference">if</span> !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER_ALIGNED</span>) && <span class="enscript-variable-name">HASH_LONG_LOG2</span>==2
- # <span class="enscript-reference">define</span> <span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER_ALIGNED</span> HASH_BLOCK_HOST_ORDER
- # <span class="enscript-reference">endif</span>
- # <span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">DATA_ORDER_IS_BIG_ENDIAN</span>)
- # <span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HOST_FETCH32</span>
- # <span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">BE_FETCH32</span>
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_FETCH32</span>(p,l) BE_FETCH32(p)
- # <span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">REVERSE_FETCH32</span>)
- # <span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_FETCH32</span>(p,l) REVERSE_FETCH32(p,l)
- # <span class="enscript-reference">endif</span>
- # <span class="enscript-reference">endif</span>
- # <span class="enscript-reference">endif</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">if</span> !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER_ALIGNED</span>)
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER</span>
- #<span class="enscript-reference">error</span> <span class="enscript-string">"HASH_BLOCK_DATA_ORDER must be defined!"</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">DATA_ORDER_IS_BIG_ENDIAN</span>)
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_c2l</span>(c,l) (l =(((unsigned long)(*((c)++)))<<24), \
- l|=(((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<<16), \
- l|=(((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<< 8), \
- l|=(((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++))) ), \
- l)
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_p_c2l</span>(c,l,n) { \
- <span class="enscript-keyword">switch</span> (n) { \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">0</span>: l =((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<<24; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">1</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<<16; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">2</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<< 8; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">3</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++))); \
- } }
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_p_c2l_p</span>(c,l,sc,len) { \
- <span class="enscript-keyword">switch</span> (sc) { \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">0</span>: l =((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<<24; \
- <span class="enscript-keyword">if</span> (--len == 0) <span class="enscript-keyword">break</span>; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">1</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<<16; \
- <span class="enscript-keyword">if</span> (--len == 0) <span class="enscript-keyword">break</span>; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">2</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<< 8; \
- } }
- <span class="enscript-comment">/* NOTE the pointer is not incremented at the end of this */</span>
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_c2l_p</span>(c,l,n) { \
- l=0; (c)+=n; \
- <span class="enscript-keyword">switch</span> (n) { \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">3</span>: l =((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*(--(c))))<< 8; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">2</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*(--(c))))<<16; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">1</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*(--(c))))<<24; \
- } }
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_l2c</span>(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
- *((c)++)=(<span class="enscript-type">unsigned</span> <span class="enscript-type">char</span>)(((l)>>16)&0xff), \
- *((c)++)=(<span class="enscript-type">unsigned</span> <span class="enscript-type">char</span>)(((l)>> 8)&0xff), \
- *((c)++)=(<span class="enscript-type">unsigned</span> <span class="enscript-type">char</span>)(((l) )&0xff), \
- l)
- #<span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">DATA_ORDER_IS_LITTLE_ENDIAN</span>)
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_c2l</span>(c,l) (l =(((unsigned long)(*((c)++))) ), \
- l|=(((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<< 8), \
- l|=(((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<<16), \
- l|=(((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<<24), \
- l)
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_p_c2l</span>(c,l,n) { \
- <span class="enscript-keyword">switch</span> (n) { \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">0</span>: l =((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++))); \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">1</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<< 8; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">2</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<<16; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">3</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<<24; \
- } }
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_p_c2l_p</span>(c,l,sc,len) { \
- <span class="enscript-keyword">switch</span> (sc) { \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">0</span>: l =((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++))); \
- <span class="enscript-keyword">if</span> (--len == 0) <span class="enscript-keyword">break</span>; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">1</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<< 8; \
- <span class="enscript-keyword">if</span> (--len == 0) <span class="enscript-keyword">break</span>; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">2</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*((c)++)))<<16; \
- } }
- <span class="enscript-comment">/* NOTE the pointer is not incremented at the end of this */</span>
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_c2l_p</span>(c,l,n) { \
- l=0; (c)+=n; \
- <span class="enscript-keyword">switch</span> (n) { \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">3</span>: l =((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*(--(c))))<<16; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">2</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*(--(c))))<< 8; \
- <span class="enscript-keyword">case</span> <span class="enscript-reference">1</span>: l|=((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)(*(--(c)))); \
- } }
- #<span class="enscript-reference">define</span> <span class="enscript-function-name">HOST_l2c</span>(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
- *((c)++)=(<span class="enscript-type">unsigned</span> <span class="enscript-type">char</span>)(((l)>> 8)&0xff), \
- *((c)++)=(<span class="enscript-type">unsigned</span> <span class="enscript-type">char</span>)(((l)>>16)&0xff), \
- *((c)++)=(<span class="enscript-type">unsigned</span> <span class="enscript-type">char</span>)(((l)>>24)&0xff), \
- l)
- #<span class="enscript-reference">endif</span>
- <span class="enscript-comment">/*
- * Time for some action:-)
- */</span>
- <span class="enscript-type">void</span> <span class="enscript-function-name">HASH_UPDATE</span> (HASH_CTX *c, <span class="enscript-type">const</span> <span class="enscript-type">void</span> *data_, <span class="enscript-type">unsigned</span> <span class="enscript-type">long</span> len)
- {
- <span class="enscript-type">const</span> <span class="enscript-type">unsigned</span> <span class="enscript-type">char</span> *data=data_;
- <span class="enscript-type">register</span> HASH_LONG * p;
- <span class="enscript-type">register</span> <span class="enscript-type">unsigned</span> <span class="enscript-type">long</span> l;
- <span class="enscript-type">int</span> sw,sc,ew,ec;
- <span class="enscript-keyword">if</span> (len==0) <span class="enscript-keyword">return</span>;
- l=(c->Nl+(len<<3))&0xffffffffL;
- <span class="enscript-comment">/* 95-05-24 eay Fixed a bug with the overflow handling, thanks to
- * Wei Dai <<a href="mailto:weidai@eskimo.com">weidai@eskimo.com</a>> for pointing it out. */</span>
- <span class="enscript-keyword">if</span> (l < c->Nl) <span class="enscript-comment">/* overflow */</span>
- c->Nh++;
- c->Nh+=(len>>29);
- c->Nl=l;
- <span class="enscript-keyword">if</span> (c->num != 0)
- {
- p=c->data;
- sw=c->num>>2;
- sc=c->num&0x03;
- <span class="enscript-keyword">if</span> ((c->num+len) >= HASH_CBLOCK)
- {
- l=p[sw]; HOST_p_c2l(data,l,sc); p[sw++]=l;
- <span class="enscript-keyword">for</span> (; sw<HASH_LBLOCK; sw++)
- {
- HOST_c2l(data,l); p[sw]=l;
- }
- HASH_BLOCK_HOST_ORDER (c,p,1);
- len-=(HASH_CBLOCK-c->num);
- c->num=0;
- <span class="enscript-comment">/* drop through and do the rest */</span>
- }
- <span class="enscript-keyword">else</span>
- {
- c->num+=len;
- <span class="enscript-keyword">if</span> ((sc+len) < 4) <span class="enscript-comment">/* ugly, add char's to a word */</span>
- {
- l=p[sw]; HOST_p_c2l_p(data,l,sc,len); p[sw]=l;
- }
- <span class="enscript-keyword">else</span>
- {
- ew=(c->num>>2);
- ec=(c->num&0x03);
- l=p[sw]; HOST_p_c2l(data,l,sc); p[sw++]=l;
- <span class="enscript-keyword">for</span> (; sw < ew; sw++)
- {
- HOST_c2l(data,l); p[sw]=l;
- }
- <span class="enscript-keyword">if</span> (ec)
- {
- HOST_c2l_p(data,l,ec); p[sw]=l;
- }
- }
- <span class="enscript-keyword">return</span>;
- }
- }
- sw=len/HASH_CBLOCK;
- <span class="enscript-keyword">if</span> (sw > 0)
- {
- #<span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER_ALIGNED</span>)
- <span class="enscript-comment">/*
- * Note that HASH_BLOCK_DATA_ORDER_ALIGNED gets defined
- * only if sizeof(HASH_LONG)==4.
- */</span>
- <span class="enscript-keyword">if</span> ((((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)data)%4) == 0)
- {
- <span class="enscript-comment">/* data is properly aligned so that we can cast it: */</span>
- HASH_BLOCK_DATA_ORDER_ALIGNED (c,(HASH_LONG *)data,sw);
- sw*=HASH_CBLOCK;
- data+=sw;
- len-=sw;
- }
- <span class="enscript-keyword">else</span>
- #<span class="enscript-reference">if</span> !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER</span>)
- <span class="enscript-keyword">while</span> (sw--)
- {
- memcpy (p=c->data,data,HASH_CBLOCK);
- HASH_BLOCK_DATA_ORDER_ALIGNED(c,p,1);
- data+=HASH_CBLOCK;
- len-=HASH_CBLOCK;
- }
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER</span>)
- {
- HASH_BLOCK_DATA_ORDER(c,data,sw);
- sw*=HASH_CBLOCK;
- data+=sw;
- len-=sw;
- }
- #<span class="enscript-reference">endif</span>
- }
- <span class="enscript-keyword">if</span> (len!=0)
- {
- p = c->data;
- c->num = len;
- ew=len>>2; <span class="enscript-comment">/* words to copy */</span>
- ec=len&0x03;
- <span class="enscript-keyword">for</span> (; ew; ew--,p++)
- {
- HOST_c2l(data,l); *p=l;
- }
- HOST_c2l_p(data,l,ec);
- *p=l;
- }
- }
- <span class="enscript-type">void</span> <span class="enscript-function-name">HASH_TRANSFORM</span> (HASH_CTX *c, <span class="enscript-type">const</span> <span class="enscript-type">unsigned</span> <span class="enscript-type">char</span> *data)
- {
- #<span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER_ALIGNED</span>)
- <span class="enscript-keyword">if</span> ((((<span class="enscript-type">unsigned</span> <span class="enscript-type">long</span>)data)%4) == 0)
- <span class="enscript-comment">/* data is properly aligned so that we can cast it: */</span>
- HASH_BLOCK_DATA_ORDER_ALIGNED (c,(HASH_LONG *)data,1);
- <span class="enscript-keyword">else</span>
- #<span class="enscript-reference">if</span> !<span class="enscript-reference">defined</span>(<span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER</span>)
- {
- memcpy (c->data,data,HASH_CBLOCK);
- HASH_BLOCK_DATA_ORDER_ALIGNED (c,c->data,1);
- }
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">HASH_BLOCK_DATA_ORDER</span>)
- HASH_BLOCK_DATA_ORDER (c,data,1);
- #<span class="enscript-reference">endif</span>
- }
- <span class="enscript-type">void</span> <span class="enscript-function-name">HASH_FINAL</span> (<span class="enscript-type">unsigned</span> <span class="enscript-type">char</span> *md, HASH_CTX *c)
- {
- <span class="enscript-type">register</span> HASH_LONG *p;
- <span class="enscript-type">register</span> <span class="enscript-type">unsigned</span> <span class="enscript-type">long</span> l;
- <span class="enscript-type">register</span> <span class="enscript-type">int</span> i,j;
- <span class="enscript-type">static</span> <span class="enscript-type">const</span> <span class="enscript-type">unsigned</span> <span class="enscript-type">char</span> end[4]={0x80,0x00,0x00,0x00};
- <span class="enscript-type">const</span> <span class="enscript-type">unsigned</span> <span class="enscript-type">char</span> *cp=end;
- <span class="enscript-comment">/* c->num should definitly have room for at least one more byte. */</span>
- p=c->data;
- i=c->num>>2;
- j=c->num&0x03;
- #<span class="enscript-reference">if</span> 0
- <span class="enscript-comment">/* purify often complains about the following line as an
- * Uninitialized Memory Read. While this can be true, the
- * following p_c2l macro will reset l when that case is true.
- * This is because j&0x03 contains the number of 'valid' bytes
- * already in p[i]. If and only if j&0x03 == 0, the UMR will
- * occur but this is also the only time p_c2l will do
- * l= *(cp++) instead of l|= *(cp++)
- * Many thanks to Alex Tang <<a href="mailto:altitude@cic.net">altitude@cic.net</a>> for pickup this
- * 'potential bug' */</span>
- #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">PURIFY</span>
- <span class="enscript-keyword">if</span> (j==0) p[i]=0; <span class="enscript-comment">/* Yeah, but that's not the way to fix it:-) */</span>
- #<span class="enscript-reference">endif</span>
- l=p[i];
- #<span class="enscript-reference">else</span>
- l = (j==0) ? 0 : p[i];
- #<span class="enscript-reference">endif</span>
- HOST_p_c2l(cp,l,j); p[i++]=l; <span class="enscript-comment">/* i is the next 'undefined word' */</span>
- <span class="enscript-keyword">if</span> (i>(HASH_LBLOCK-2)) <span class="enscript-comment">/* save room for Nl and Nh */</span>
- {
- <span class="enscript-keyword">if</span> (i<HASH_LBLOCK) p[i]=0;
- HASH_BLOCK_HOST_ORDER (c,p,1);
- i=0;
- }
- <span class="enscript-keyword">for</span> (; i<(HASH_LBLOCK-2); i++)
- p[i]=0;
- #<span class="enscript-reference">if</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">DATA_ORDER_IS_BIG_ENDIAN</span>)
- p[HASH_LBLOCK-2]=c->Nh;
- p[HASH_LBLOCK-1]=c->Nl;
- #<span class="enscript-reference">elif</span> <span class="enscript-reference">defined</span>(<span class="enscript-variable-name">DATA_ORDER_IS_LITTLE_ENDIAN</span>)
- p[HASH_LBLOCK-2]=c->Nl;
- p[HASH_LBLOCK-1]=c->Nh;
- #<span class="enscript-reference">endif</span>
- HASH_BLOCK_HOST_ORDER (c,p,1);
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">HASH_MAKE_STRING</span>
- #<span class="enscript-reference">error</span> <span class="enscript-string">"HASH_MAKE_STRING must be defined!"</span>
- #<span class="enscript-reference">else</span>
- HASH_MAKE_STRING(c,md);
- #<span class="enscript-reference">endif</span>
- c->num=0;
- <span class="enscript-comment">/* clear stuff, HASH_BLOCK may be leaving some stuff on the stack
- * but I'm not worried :-)
- OPENSSL_cleanse((void *)c,sizeof(HASH_CTX));
- */</span>
- }
- </pre>
- <hr />
- </body></html>