]>
git.saurik.com Git - apple/security.git/blob - OSX/libsecurity_apple_csp/open_ssl/bf/bf_locl.h
   1 /* crypto/bf/bf_locl.h */ 
   2 /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) 
   5  * This package is an SSL implementation written 
   6  * by Eric Young (eay@cryptsoft.com). 
   7  * The implementation was written so as to conform with Netscapes SSL. 
   9  * This library is free for commercial and non-commercial use as long as 
  10  * the following conditions are aheared to.  The following conditions 
  11  * apply to all code found in this distribution, be it the RC4, RSA, 
  12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation 
  13  * included with this distribution is covered by the same copyright terms 
  14  * except that the holder is Tim Hudson (tjh@cryptsoft.com). 
  16  * Copyright remains Eric Young's, and as such any Copyright notices in 
  17  * the code are not to be removed. 
  18  * If this package is used in a product, Eric Young should be given attribution 
  19  * as the author of the parts of the library used. 
  20  * This can be in the form of a textual message at program startup or 
  21  * in documentation (online or textual) provided with the package. 
  23  * Redistribution and use in source and binary forms, with or without 
  24  * modification, are permitted provided that the following conditions 
  26  * 1. Redistributions of source code must retain the copyright 
  27  *    notice, this list of conditions and the following disclaimer. 
  28  * 2. Redistributions in binary form must reproduce the above copyright 
  29  *    notice, this list of conditions and the following disclaimer in the 
  30  *    documentation and/or other materials provided with the distribution. 
  31  * 3. All advertising materials mentioning features or use of this software 
  32  *    must display the following acknowledgement: 
  33  *    "This product includes cryptographic software written by 
  34  *     Eric Young (eay@cryptsoft.com)" 
  35  *    The word 'cryptographic' can be left out if the rouines from the library 
  36  *    being used are not cryptographic related :-). 
  37  * 4. If you include any Windows specific code (or a derivative thereof) from  
  38  *    the apps directory (application code) you must include an acknowledgement: 
  39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 
  41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 
  42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 
  45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
  47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
  50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  53  * The licence and distribution terms for any publically available version or 
  54  * derivative of this code cannot be changed.  i.e. this code cannot simply be 
  55  * copied and put under another distribution licence 
  56  * [including the GNU Public Licence.] 
  59 #ifndef HEADER_BF_LOCL_H 
  60 #define HEADER_BF_LOCL_H 
  61 #include <openssl/opensslconf_legacy.h> /* BF_PTR, BF_PTR2 */ 
  64 #define c2l(c,l)        (l =(((BF_LONG))(*((c)++)))    , \ 
  65                          l|=(((BF_LONG))(*((c)++)))<< 8L, \ 
  66                          l|=(((BF_LONG))(*((c)++)))<<16L, \ 
  67                          l|=(((BF_LONG))(*((c)++)))<<24L) 
  69 /* NOTE - c is not incremented as per c2l */ 
  71 #define c2ln(c,l1,l2,n) { \ 
  75                         case 8: l2 =(((BF_LONG))(*(--(c))))<<24L; \ 
  76                         case 7: l2|=(((BF_LONG))(*(--(c))))<<16L; \ 
  77                         case 6: l2|=(((BF_LONG))(*(--(c))))<< 8L; \ 
  78                         case 5: l2|=(((BF_LONG))(*(--(c))));     \ 
  79                         case 4: l1 =(((BF_LONG))(*(--(c))))<<24L; \ 
  80                         case 3: l1|=(((BF_LONG))(*(--(c))))<<16L; \ 
  81                         case 2: l1|=(((BF_LONG))(*(--(c))))<< 8L; \ 
  82                         case 1: l1|=(((BF_LONG))(*(--(c))));     \ 
  87 #define l2c(l,c)        (*((c)++)=(unsigned char)(((l)     )&0xff), \ 
  88                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ 
  89                          *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ 
  90                          *((c)++)=(unsigned char)(((l)>>24L)&0xff)) 
  92 /* NOTE - c is not incremented as per l2c */ 
  94 #define l2cn(l1,l2,c,n) { \ 
  97                         case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \ 
  98                         case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \ 
  99                         case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \ 
 100                         case 5: *(--(c))=(unsigned char)(((l2)     )&0xff); \ 
 101                         case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \ 
 102                         case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \ 
 103                         case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \ 
 104                         case 1: *(--(c))=(unsigned char)(((l1)     )&0xff); \ 
 108 /* NOTE - c is not incremented as per n2l */ 
 109 #define n2ln(c,l1,l2,n) { \ 
 113                         case 8: l2 =((BF_LONG)(*(--(c))))    ; \ 
 114                         case 7: l2|=((BF_LONG)(*(--(c))))<< 8; \ 
 115                         case 6: l2|=((BF_LONG)(*(--(c))))<<16; \ 
 116                         case 5: l2|=((BF_LONG)(*(--(c))))<<24; \ 
 117                         case 4: l1 =((BF_LONG)(*(--(c))))    ; \ 
 118                         case 3: l1|=((BF_LONG)(*(--(c))))<< 8; \ 
 119                         case 2: l1|=((BF_LONG)(*(--(c))))<<16; \ 
 120                         case 1: l1|=((BF_LONG)(*(--(c))))<<24; \ 
 124 /* NOTE - c is not incremented as per l2n */ 
 125 #define l2nn(l1,l2,c,n) { \ 
 128                         case 8: *(--(c))=(unsigned char)(((l2)    )&0xff); \ 
 129                         case 7: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \ 
 130                         case 6: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \ 
 131                         case 5: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \ 
 132                         case 4: *(--(c))=(unsigned char)(((l1)    )&0xff); \ 
 133                         case 3: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \ 
 134                         case 2: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \ 
 135                         case 1: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \ 
 140 #if     defined(__GNUC__) && defined(__ppc__) 
 141 /* alignment tolerant big-endian optimization */ 
 142         #define n2l(c,l)        { l= *(((BF_LONG) *)c); c += 4; } 
 144 /* little endian, etc. */ 
 145         #define n2l(c,l)        (l =((BF_LONG)(*((c)++)))<<24L, \ 
 146                          l|=((BF_LONG)(*((c)++)))<<16L, \ 
 147                          l|=((BF_LONG)(*((c)++)))<< 8L, \ 
 148                          l|=((BF_LONG)(*((c)++)))) 
 152 #if     defined(__GNUC__) && defined(__ppc__) 
 153         /* alignment tolerant big-endian optimization */ 
 154         #define l2n(l,c)        { *(((BF_LONG) *)c) = l; c += 4; } 
 156         /* little endian, etc. */ 
 157         #define l2n(l,c)    (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \ 
 158                          *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ 
 159                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ 
 160                          *((c)++)=(unsigned char)(((l)     )&0xff)) 
 162 #endif  /* GNU, big endian */ 
 164 /* This is actually a big endian algorithm, the most significant byte 
 165  * is used to lookup array 0 */ 
 170  * This is basically a special Intel version. Point is that Intel 
 171  * doesn't have many registers, but offers a reach choice of addressing 
 172  * modes. So we spare some registers by directly traversing BF_KEY 
 173  * structure and hiring the most decorated addressing mode. The code 
 174  * generated by EGCS is *perfectly* competitive with assembler 
 177 #define BF_ENC(LL,R,KEY,Pi) (\ 
 179         t=  KEY[BF_ROUNDS+2 +   0 + ((R>>24)&0xFF)], \ 
 180         t+= KEY[BF_ROUNDS+2 + 256 + ((R>>16)&0xFF)], \ 
 181         t^= KEY[BF_ROUNDS+2 + 512 + ((R>>8 )&0xFF)], \ 
 182         t+= KEY[BF_ROUNDS+2 + 768 + ((R    )&0xFF)], \ 
 186 #elif defined(BF_PTR) 
 189 #define BF_LONG_LOG2  2       /* default to BF_LONG being 32 bits */ 
 191 #define BF_M  (0xFF<<BF_LONG_LOG2) 
 192 #define BF_0  (24-BF_LONG_LOG2) 
 193 #define BF_1  (16-BF_LONG_LOG2) 
 194 #define BF_2  ( 8-BF_LONG_LOG2) 
 195 #define BF_3  BF_LONG_LOG2 /* left shift */ 
 198  * This is normally very good on RISC platforms where normally you 
 199  * have to explicitly "multiply" array index by sizeof(BF_LONG) 
 200  * in order to calculate the effective address. This implementation 
 201  * excuses CPU from this extra work. Power[PC] uses should have most 
 202  * fun as (R>>BF_i)&BF_M gets folded into a single instruction, namely 
 203  * rlwinm. So let'em double-check if their compiler does it. 
 206 #define BF_ENC(LL,R,S,P) ( \ 
 208         LL^= (((*(BF_LONG *)((unsigned char *)&(S[  0])+((R>>BF_0)&BF_M))+ \ 
 209                 *(BF_LONG *)((unsigned char *)&(S[256])+((R>>BF_1)&BF_M)))^ \ 
 210                 *(BF_LONG *)((unsigned char *)&(S[512])+((R>>BF_2)&BF_M)))+ \ 
 211                 *(BF_LONG *)((unsigned char *)&(S[768])+((R<<BF_3)&BF_M))) \ 
 216  * This is a *generic* version. Seem to perform best on platforms that 
 217  * offer explicit support for extraction of 8-bit nibbles preferably 
 218  * complemented with "multiplying" of array index by sizeof(BF_LONG). 
 219  * For the moment of this writing the list comprises Alpha CPU featuring 
 220  * extbl and s[48]addq instructions. 
 223 #define BF_ENC(LL,R,S,P) ( \ 
 225         LL^=((( S[       ((int)(R>>24)&0xff)] + \ 
 226                 S[0x0100+((int)(R>>16)&0xff)])^ \ 
 227                 S[0x0200+((int)(R>> 8)&0xff)])+ \ 
 228                 S[0x0300+((int)(R    )&0xff)])&0xffffffffL \