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

其他游戏

开发平台:

Visual C++

  1. /* crypto/des/des_locl.h */
  2. /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
  3.  * All rights reserved.
  4.  *
  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.
  8.  * 
  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).
  15.  * 
  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.
  22.  * 
  23.  * Redistribution and use in source and binary forms, with or without
  24.  * modification, are permitted provided that the following conditions
  25.  * are met:
  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)"
  40.  * 
  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
  51.  * SUCH DAMAGE.
  52.  * 
  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.]
  57.  */
  58. #ifndef HEADER_DES_LOCL_H
  59. #define HEADER_DES_LOCL_H
  60. #include <openssl/e_os2.h>
  61. #if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN16)
  62. #ifndef OPENSSL_SYS_MSDOS
  63. #define OPENSSL_SYS_MSDOS
  64. #endif
  65. #endif
  66. #include <stdio.h>
  67. #include <stdlib.h>
  68. #ifndef OPENSSL_SYS_MSDOS
  69. #if !defined(OPENSSL_SYS_VMS) || defined(__DECC)
  70. #ifdef OPENSSL_UNISTD
  71. # include OPENSSL_UNISTD
  72. #else
  73. # include <unistd.h>
  74. #endif
  75. #include <math.h>
  76. #endif
  77. #endif
  78. #include <openssl/des.h>
  79. #ifdef OPENSSL_SYS_MSDOS /* Visual C++ 2.1 (Windows NT/95) */
  80. #include <stdlib.h>
  81. #include <errno.h>
  82. #include <time.h>
  83. #include <io.h>
  84. #endif
  85. #if defined(__STDC__) || defined(OPENSSL_SYS_VMS) || defined(M_XENIX) || defined(OPENSSL_SYS_MSDOS)
  86. #include <string.h>
  87. #endif
  88. #ifdef OPENSSL_BUILD_SHLIBCRYPTO
  89. # undef OPENSSL_EXTERN
  90. # define OPENSSL_EXTERN OPENSSL_EXPORT
  91. #endif
  92. #define ITERATIONS 16
  93. #define HALF_ITERATIONS 8
  94. /* used in des_read and des_write */
  95. #define MAXWRITE (1024*16)
  96. #define BSIZE (MAXWRITE+4)
  97. #define c2l(c,l) (l =((DES_LONG)(*((c)++)))    , 
  98.  l|=((DES_LONG)(*((c)++)))<< 8L, 
  99.  l|=((DES_LONG)(*((c)++)))<<16L, 
  100.  l|=((DES_LONG)(*((c)++)))<<24L)
  101. /* NOTE - c is not incremented as per c2l */
  102. #define c2ln(c,l1,l2,n) { 
  103. c+=n; 
  104. l1=l2=0; 
  105. switch (n) { 
  106. case 8: l2 =((DES_LONG)(*(--(c))))<<24L; 
  107. case 7: l2|=((DES_LONG)(*(--(c))))<<16L; 
  108. case 6: l2|=((DES_LONG)(*(--(c))))<< 8L; 
  109. case 5: l2|=((DES_LONG)(*(--(c))));     
  110. case 4: l1 =((DES_LONG)(*(--(c))))<<24L; 
  111. case 3: l1|=((DES_LONG)(*(--(c))))<<16L; 
  112. case 2: l1|=((DES_LONG)(*(--(c))))<< 8L; 
  113. case 1: l1|=((DES_LONG)(*(--(c))));     
  114. }
  115. #define l2c(l,c) (*((c)++)=(unsigned char)(((l)     )&0xff), 
  116.  *((c)++)=(unsigned char)(((l)>> 8L)&0xff), 
  117.  *((c)++)=(unsigned char)(((l)>>16L)&0xff), 
  118.  *((c)++)=(unsigned char)(((l)>>24L)&0xff))
  119. /* replacements for htonl and ntohl since I have no idea what to do
  120.  * when faced with machines with 8 byte longs. */
  121. #define HDRSIZE 4
  122. #define n2l(c,l) (l =((DES_LONG)(*((c)++)))<<24L, 
  123.  l|=((DES_LONG)(*((c)++)))<<16L, 
  124.  l|=((DES_LONG)(*((c)++)))<< 8L, 
  125.  l|=((DES_LONG)(*((c)++))))
  126. #define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24L)&0xff), 
  127.  *((c)++)=(unsigned char)(((l)>>16L)&0xff), 
  128.  *((c)++)=(unsigned char)(((l)>> 8L)&0xff), 
  129.  *((c)++)=(unsigned char)(((l)     )&0xff))
  130. /* NOTE - c is not incremented as per l2c */
  131. #define l2cn(l1,l2,c,n) { 
  132. c+=n; 
  133. switch (n) { 
  134. case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); 
  135. case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); 
  136. case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); 
  137. case 5: *(--(c))=(unsigned char)(((l2)     )&0xff); 
  138. case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); 
  139. case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); 
  140. case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); 
  141. case 1: *(--(c))=(unsigned char)(((l1)     )&0xff); 
  142. }
  143. #if (defined(OPENSSL_SYS_WIN32) && defined(_MSC_VER)) || defined(__ICC)
  144. #define ROTATE(a,n) (_lrotr(a,n))
  145. #elif defined(__GNUC__) && __GNUC__>=2 && !defined(__STRICT_ANSI__) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) && !defined(PEDANTIC)
  146. # if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
  147. #  define ROTATE(a,n) ({ register unsigned int ret;
  148. asm ("rorl %1,%0"
  149. : "=r"(ret)
  150. : "I"(n),"0"(a)
  151. : "cc");
  152.    ret;
  153. })
  154. # endif
  155. #endif
  156. #ifndef ROTATE
  157. #define ROTATE(a,n) (((a)>>(n))+((a)<<(32-(n))))
  158. #endif
  159. /* Don't worry about the LOAD_DATA() stuff, that is used by
  160.  * fcrypt() to add it's little bit to the front */
  161. #ifdef DES_FCRYPT
  162. #define LOAD_DATA_tmp(R,S,u,t,E0,E1) 
  163. { DES_LONG tmp; LOAD_DATA(R,S,u,t,E0,E1,tmp); }
  164. #define LOAD_DATA(R,S,u,t,E0,E1,tmp) 
  165. t=R^(R>>16L); 
  166. u=t&E0; t&=E1; 
  167. tmp=(u<<16); u^=R^s[S  ]; u^=tmp; 
  168. tmp=(t<<16); t^=R^s[S+1]; t^=tmp
  169. #else
  170. #define LOAD_DATA_tmp(a,b,c,d,e,f) LOAD_DATA(a,b,c,d,e,f,g)
  171. #define LOAD_DATA(R,S,u,t,E0,E1,tmp) 
  172. u=R^s[S  ]; 
  173. t=R^s[S+1]
  174. #endif
  175. /* The changes to this macro may help or hinder, depending on the
  176.  * compiler and the architecture.  gcc2 always seems to do well :-).
  177.  * Inspired by Dana How <how@isl.stanford.edu>
  178.  * DO NOT use the alternative version on machines with 8 byte longs.
  179.  * It does not seem to work on the Alpha, even when DES_LONG is 4
  180.  * bytes, probably an issue of accessing non-word aligned objects :-( */
  181. #ifdef DES_PTR
  182. /* It recently occurred to me that 0^0^0^0^0^0^0 == 0, so there
  183.  * is no reason to not xor all the sub items together.  This potentially
  184.  * saves a register since things can be xored directly into L */
  185. #if defined(DES_RISC1) || defined(DES_RISC2)
  186. #ifdef DES_RISC1
  187. #define D_ENCRYPT(LL,R,S) { 
  188. unsigned int u1,u2,u3; 
  189. LOAD_DATA(R,S,u,t,E0,E1,u1); 
  190. u2=(int)u>>8L; 
  191. u1=(int)u&0xfc; 
  192. u2&=0xfc; 
  193. t=ROTATE(t,4); 
  194. u>>=16L; 
  195. LL^= *(const DES_LONG *)(des_SP      +u1); 
  196. LL^= *(const DES_LONG *)(des_SP+0x200+u2); 
  197. u3=(int)(u>>8L); 
  198. u1=(int)u&0xfc; 
  199. u3&=0xfc; 
  200. LL^= *(const DES_LONG *)(des_SP+0x400+u1); 
  201. LL^= *(const DES_LONG *)(des_SP+0x600+u3); 
  202. u2=(int)t>>8L; 
  203. u1=(int)t&0xfc; 
  204. u2&=0xfc; 
  205. t>>=16L; 
  206. LL^= *(const DES_LONG *)(des_SP+0x100+u1); 
  207. LL^= *(const DES_LONG *)(des_SP+0x300+u2); 
  208. u3=(int)t>>8L; 
  209. u1=(int)t&0xfc; 
  210. u3&=0xfc; 
  211. LL^= *(const DES_LONG *)(des_SP+0x500+u1); 
  212. LL^= *(const DES_LONG *)(des_SP+0x700+u3); }
  213. #endif
  214. #ifdef DES_RISC2
  215. #define D_ENCRYPT(LL,R,S) { 
  216. unsigned int u1,u2,s1,s2; 
  217. LOAD_DATA(R,S,u,t,E0,E1,u1); 
  218. u2=(int)u>>8L; 
  219. u1=(int)u&0xfc; 
  220. u2&=0xfc; 
  221. t=ROTATE(t,4); 
  222. LL^= *(const DES_LONG *)(des_SP      +u1); 
  223. LL^= *(const DES_LONG *)(des_SP+0x200+u2); 
  224. s1=(int)(u>>16L); 
  225. s2=(int)(u>>24L); 
  226. s1&=0xfc; 
  227. s2&=0xfc; 
  228. LL^= *(const DES_LONG *)(des_SP+0x400+s1); 
  229. LL^= *(const DES_LONG *)(des_SP+0x600+s2); 
  230. u2=(int)t>>8L; 
  231. u1=(int)t&0xfc; 
  232. u2&=0xfc; 
  233. LL^= *(const DES_LONG *)(des_SP+0x100+u1); 
  234. LL^= *(const DES_LONG *)(des_SP+0x300+u2); 
  235. s1=(int)(t>>16L); 
  236. s2=(int)(t>>24L); 
  237. s1&=0xfc; 
  238. s2&=0xfc; 
  239. LL^= *(const DES_LONG *)(des_SP+0x500+s1); 
  240. LL^= *(const DES_LONG *)(des_SP+0x700+s2); }
  241. #endif
  242. #else
  243. #define D_ENCRYPT(LL,R,S) { 
  244. LOAD_DATA_tmp(R,S,u,t,E0,E1); 
  245. t=ROTATE(t,4); 
  246. LL^= 
  247. *(const DES_LONG *)(des_SP      +((u     )&0xfc))^ 
  248. *(const DES_LONG *)(des_SP+0x200+((u>> 8L)&0xfc))^ 
  249. *(const DES_LONG *)(des_SP+0x400+((u>>16L)&0xfc))^ 
  250. *(const DES_LONG *)(des_SP+0x600+((u>>24L)&0xfc))^ 
  251. *(const DES_LONG *)(des_SP+0x100+((t     )&0xfc))^ 
  252. *(const DES_LONG *)(des_SP+0x300+((t>> 8L)&0xfc))^ 
  253. *(const DES_LONG *)(des_SP+0x500+((t>>16L)&0xfc))^ 
  254. *(const DES_LONG *)(des_SP+0x700+((t>>24L)&0xfc)); }
  255. #endif
  256. #else /* original version */
  257. #if defined(DES_RISC1) || defined(DES_RISC2)
  258. #ifdef DES_RISC1
  259. #define D_ENCRYPT(LL,R,S) {
  260. unsigned int u1,u2,u3; 
  261. LOAD_DATA(R,S,u,t,E0,E1,u1); 
  262. u>>=2L; 
  263. t=ROTATE(t,6); 
  264. u2=(int)u>>8L; 
  265. u1=(int)u&0x3f; 
  266. u2&=0x3f; 
  267. u>>=16L; 
  268. LL^=DES_SPtrans[0][u1]; 
  269. LL^=DES_SPtrans[2][u2]; 
  270. u3=(int)u>>8L; 
  271. u1=(int)u&0x3f; 
  272. u3&=0x3f; 
  273. LL^=DES_SPtrans[4][u1]; 
  274. LL^=DES_SPtrans[6][u3]; 
  275. u2=(int)t>>8L; 
  276. u1=(int)t&0x3f; 
  277. u2&=0x3f; 
  278. t>>=16L; 
  279. LL^=DES_SPtrans[1][u1]; 
  280. LL^=DES_SPtrans[3][u2]; 
  281. u3=(int)t>>8L; 
  282. u1=(int)t&0x3f; 
  283. u3&=0x3f; 
  284. LL^=DES_SPtrans[5][u1]; 
  285. LL^=DES_SPtrans[7][u3]; }
  286. #endif
  287. #ifdef DES_RISC2
  288. #define D_ENCRYPT(LL,R,S) {
  289. unsigned int u1,u2,s1,s2; 
  290. LOAD_DATA(R,S,u,t,E0,E1,u1); 
  291. u>>=2L; 
  292. t=ROTATE(t,6); 
  293. u2=(int)u>>8L; 
  294. u1=(int)u&0x3f; 
  295. u2&=0x3f; 
  296. LL^=DES_SPtrans[0][u1]; 
  297. LL^=DES_SPtrans[2][u2]; 
  298. s1=(int)u>>16L; 
  299. s2=(int)u>>24L; 
  300. s1&=0x3f; 
  301. s2&=0x3f; 
  302. LL^=DES_SPtrans[4][s1]; 
  303. LL^=DES_SPtrans[6][s2]; 
  304. u2=(int)t>>8L; 
  305. u1=(int)t&0x3f; 
  306. u2&=0x3f; 
  307. LL^=DES_SPtrans[1][u1]; 
  308. LL^=DES_SPtrans[3][u2]; 
  309. s1=(int)t>>16; 
  310. s2=(int)t>>24L; 
  311. s1&=0x3f; 
  312. s2&=0x3f; 
  313. LL^=DES_SPtrans[5][s1]; 
  314. LL^=DES_SPtrans[7][s2]; }
  315. #endif
  316. #else
  317. #define D_ENCRYPT(LL,R,S) {
  318. LOAD_DATA_tmp(R,S,u,t,E0,E1); 
  319. t=ROTATE(t,4); 
  320. LL^=
  321. DES_SPtrans[0][(u>> 2L)&0x3f]^ 
  322. DES_SPtrans[2][(u>>10L)&0x3f]^ 
  323. DES_SPtrans[4][(u>>18L)&0x3f]^ 
  324. DES_SPtrans[6][(u>>26L)&0x3f]^ 
  325. DES_SPtrans[1][(t>> 2L)&0x3f]^ 
  326. DES_SPtrans[3][(t>>10L)&0x3f]^ 
  327. DES_SPtrans[5][(t>>18L)&0x3f]^ 
  328. DES_SPtrans[7][(t>>26L)&0x3f]; }
  329. #endif
  330. #endif
  331. /* IP and FP
  332.  * The problem is more of a geometric problem that random bit fiddling.
  333.  0  1  2  3  4  5  6  7      62 54 46 38 30 22 14  6
  334.  8  9 10 11 12 13 14 15      60 52 44 36 28 20 12  4
  335. 16 17 18 19 20 21 22 23      58 50 42 34 26 18 10  2
  336. 24 25 26 27 28 29 30 31  to  56 48 40 32 24 16  8  0
  337. 32 33 34 35 36 37 38 39      63 55 47 39 31 23 15  7
  338. 40 41 42 43 44 45 46 47      61 53 45 37 29 21 13  5
  339. 48 49 50 51 52 53 54 55      59 51 43 35 27 19 11  3
  340. 56 57 58 59 60 61 62 63      57 49 41 33 25 17  9  1
  341. The output has been subject to swaps of the form
  342. 0 1 -> 3 1 but the odd and even bits have been put into
  343. 2 3    2 0
  344. different words.  The main trick is to remember that
  345. t=((l>>size)^r)&(mask);
  346. r^=t;
  347. l^=(t<<size);
  348. can be used to swap and move bits between words.
  349. So l =  0  1  2  3  r = 16 17 18 19
  350.         4  5  6  7      20 21 22 23
  351.         8  9 10 11      24 25 26 27
  352.        12 13 14 15      28 29 30 31
  353. becomes (for size == 2 and mask == 0x3333)
  354.    t =   2^16  3^17 -- --   l =  0  1 16 17  r =  2  3 18 19
  355.  6^20  7^21 -- --        4  5 20 21       6  7 22 23
  356. 10^24 11^25 -- --        8  9 24 25      10 11 24 25
  357. 14^28 15^29 -- --       12 13 28 29      14 15 28 29
  358. Thanks for hints from Richard Outerbridge - he told me IP&FP
  359. could be done in 15 xor, 10 shifts and 5 ands.
  360. When I finally started to think of the problem in 2D
  361. I first got ~42 operations without xors.  When I remembered
  362. how to use xors :-) I got it to its final state.
  363. */
  364. #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),
  365. (b)^=(t),
  366. (a)^=((t)<<(n)))
  367. #define IP(l,r) 
  368. register DES_LONG tt; 
  369. PERM_OP(r,l,tt, 4,0x0f0f0f0fL); 
  370. PERM_OP(l,r,tt,16,0x0000ffffL); 
  371. PERM_OP(r,l,tt, 2,0x33333333L); 
  372. PERM_OP(l,r,tt, 8,0x00ff00ffL); 
  373. PERM_OP(r,l,tt, 1,0x55555555L); 
  374. }
  375. #define FP(l,r) 
  376. register DES_LONG tt; 
  377. PERM_OP(l,r,tt, 1,0x55555555L); 
  378. PERM_OP(r,l,tt, 8,0x00ff00ffL); 
  379. PERM_OP(l,r,tt, 2,0x33333333L); 
  380. PERM_OP(r,l,tt,16,0x0000ffffL); 
  381. PERM_OP(l,r,tt, 4,0x0f0f0f0fL); 
  382. }
  383. extern const DES_LONG DES_SPtrans[8][64];
  384. void fcrypt_body(DES_LONG *out,DES_key_schedule *ks,
  385.  DES_LONG Eswap0, DES_LONG Eswap1);
  386. #endif