5 * Internal definitions for PeerSec Networks MatrixSSL cryptography provider
\r
8 * Copyright (c) PeerSec Networks, 2002-2006. All Rights Reserved.
\r
9 * The latest version of this code is available at http://www.matrixssl.org
\r
11 * This software is open source; you can redistribute it and/or modify
\r
12 * it under the terms of the GNU General Public License as published by
\r
13 * the Free Software Foundation; either version 2 of the License, or
\r
14 * (at your option) any later version.
\r
16 * This General Public License does NOT permit incorporating this software
\r
17 * into proprietary programs. If you are unable to comply with the GPL, a
\r
18 * commercial license for this software may be purchased from PeerSec Networks
\r
19 * at http://www.peersec.com
\r
21 * This program is distributed in WITHOUT ANY WARRANTY; without even the
\r
22 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
\r
23 * See the GNU General Public License for more details.
\r
25 * You should have received a copy of the GNU General Public License
\r
26 * along with this program; if not, write to the Free Software
\r
27 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
28 * http://www.gnu.org/copyleft/gpl.html
\r
30 /******************************************************************************/
\r
40 PeerSec crypto-specific defines.
\r
45 If Native 64 bit integers are not supported, we must set the 16 bit flag
\r
46 to produce 32 bit mp_words in mpi.h
\r
47 We must also include the slow MPI functions because the fast ones only
\r
48 work with larger (28 bit) digit sizes.
\r
52 #define USE_SMALL_WORD
\r
53 #endif /* USE_INT64 */
\r
55 /******************************************************************************/
\r
65 /* this is the "32-bit at least" data type
\r
66 * Re-define it to suit your platform but it must be at least 32-bits
\r
68 typedef unsigned long ulong32;
\r
71 Primary RSA Key struct. Define here for crypto
\r
74 mp_int e, d, N, qP, dP, dQ, p, q;
\r
75 int32 size; /* Size of the key in bytes */
\r
76 int32 optimized; /* 1 for optimized */
\r
79 #endif /* USE_RSA */
\r
85 extern int32 ps_base64_decode(const unsigned char *in, uint32 len,
\r
86 unsigned char *out, uint32 *outlen);
\r
91 extern void psZeromem(void *dst, size_t len);
\r
92 extern void psBurnStack(unsigned long len);
\r
95 /* max size of either a cipher/hash block or symmetric key [largest of the two] */
\r
96 #define MAXBLOCKSIZE 24
\r
99 /* error codes [will be expanded in future releases] */
\r
101 CRYPT_OK=0, /* Result OK */
\r
102 CRYPT_ERROR, /* Generic Error */
\r
103 CRYPT_NOP, /* Not a failure but no operation was performed */
\r
105 CRYPT_INVALID_KEYSIZE, /* Invalid key size given */
\r
106 CRYPT_INVALID_ROUNDS, /* Invalid number of rounds */
\r
107 CRYPT_FAIL_TESTVECTOR, /* Algorithm failed test vectors */
\r
109 CRYPT_BUFFER_OVERFLOW, /* Not enough space for output */
\r
110 CRYPT_INVALID_PACKET, /* Invalid input packet given */
\r
112 CRYPT_INVALID_PRNGSIZE, /* Invalid number of bits for a PRNG */
\r
113 CRYPT_ERROR_READPRNG, /* Could not read enough from PRNG */
\r
115 CRYPT_INVALID_CIPHER, /* Invalid cipher specified */
\r
116 CRYPT_INVALID_HASH, /* Invalid hash specified */
\r
117 CRYPT_INVALID_PRNG, /* Invalid PRNG specified */
\r
119 CRYPT_MEM, /* Out of memory */
\r
121 CRYPT_PK_TYPE_MISMATCH, /* Not equivalent types of PK keys */
\r
122 CRYPT_PK_NOT_PRIVATE, /* Requires a private PK key */
\r
124 CRYPT_INVALID_ARG, /* Generic invalid argument */
\r
125 CRYPT_FILE_NOTFOUND, /* File Not Found */
\r
127 CRYPT_PK_INVALID_TYPE, /* Invalid type of PK key */
\r
128 CRYPT_PK_INVALID_SYSTEM, /* Invalid PK system specified */
\r
129 CRYPT_PK_DUP, /* Duplicate key already in key ring */
\r
130 CRYPT_PK_NOT_FOUND, /* Key not found in keyring */
\r
131 CRYPT_PK_INVALID_SIZE, /* Invalid size input for PK parameters */
\r
133 CRYPT_INVALID_PRIME_SIZE /* Invalid size of prime requested */
\r
136 /******************************************************************************/
\r
140 struct sha1_state {
\r
146 #endif /* USE_INT64 */
\r
147 ulong32 state[5], curlen;
\r
148 unsigned char buf[64];
\r
157 #endif /* USE_INT64 */
\r
158 ulong32 state[4], curlen;
\r
159 unsigned char buf[64];
\r
164 unsigned char chksum[16], X[48], buf[16];
\r
165 unsigned long curlen;
\r
167 #endif /* USE_MD2 */
\r
170 struct sha256_state {
\r
172 ulong32 state[8], curlen;
\r
173 unsigned char buf[64];
\r
175 #endif /* USE_SHA256 */
\r
178 struct sha1_state sha1;
\r
179 struct md5_state md5;
\r
181 struct md2_state md2;
\r
182 #endif /* USE_MD2 */
\r
184 struct sha256_state sha256;
\r
188 typedef hash_state sslSha1Context_t;
\r
189 typedef hash_state sslMd5Context_t;
\r
191 typedef hash_state sslMd2Context_t;
\r
192 #endif /* USE_MD2 */
\r
194 typedef hash_state sslSha256Context_t;
\r
195 #endif /* USE_SHA256 */
\r
198 unsigned char pad[64];
\r
200 sslMd5Context_t md5;
\r
201 sslSha1Context_t sha1;
\r
203 } sslHmacContext_t;
\r
205 /******************************************************************************/
\r
211 unsigned char state[256];
\r
216 #endif /* USE_ARC4 */
\r
218 #define SSL_DES3_KEY_LEN 24
\r
219 #define SSL_DES3_IV_LEN 8
\r
223 ulong32 ek[3][32], dk[3][32];
\r
227 A block cipher CBC structure
\r
231 unsigned char IV[8];
\r
233 int32 explicitIV; /* 1 if yes */
\r
236 extern int32 des3_setup(const unsigned char *key, int32 keylen, int32 num_rounds,
\r
238 extern void des3_ecb_encrypt(const unsigned char *pt, unsigned char *ct,
\r
240 extern void des3_ecb_decrypt(const unsigned char *ct, unsigned char *pt,
\r
242 extern int32 des3_keysize(int32 *desired_keysize);
\r
244 extern int32 des_setup(const unsigned char *key, int32 keylen, int32 num_rounds,
\r
246 extern void des_ecb_encrypt(const unsigned char *pt, unsigned char *ct,
\r
248 extern void des_ecb_decrypt(const unsigned char *ct, unsigned char *pt,
\r
251 #endif /* USE_3DES */
\r
261 } sslCipherContext_t;
\r
265 Controls endianess and size of registers. Leave uncommented to get
\r
266 platform neutral [slower] code detect x86-32 machines somewhat
\r
268 #if (defined(_MSC_VER) && defined(WIN32)) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__)))
\r
269 #define ENDIAN_LITTLE
\r
270 #define ENDIAN_32BITWORD
\r
274 /* #define ENDIAN_LITTLE */
\r
275 /* #define ENDIAN_BIG */
\r
277 /* #define ENDIAN_32BITWORD */
\r
278 /* #define ENDIAN_64BITWORD */
\r
280 #if (defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE)) && !(defined(ENDIAN_32BITWORD) || defined(ENDIAN_64BITWORD))
\r
281 #error You must specify a word size as well as endianess
\r
284 #if !(defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE))
\r
285 #define ENDIAN_NEUTRAL
\r
291 #if defined (ENDIAN_NEUTRAL)
\r
293 #define STORE32L(x, y) \
\r
294 { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
\r
295 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
\r
297 #define LOAD32L(x, y) \
\r
298 { x = ((unsigned long)((y)[3] & 255)<<24) | \
\r
299 ((unsigned long)((y)[2] & 255)<<16) | \
\r
300 ((unsigned long)((y)[1] & 255)<<8) | \
\r
301 ((unsigned long)((y)[0] & 255)); }
\r
303 #define STORE64L(x, y) \
\r
304 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
\r
305 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
\r
306 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
\r
307 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
\r
309 #define LOAD64L(x, y) \
\r
310 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
\r
311 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
\r
312 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
\r
313 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
\r
315 #define STORE32H(x, y) \
\r
316 { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
\r
317 (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
\r
319 #define LOAD32H(x, y) \
\r
320 { x = ((unsigned long)((y)[0] & 255)<<24) | \
\r
321 ((unsigned long)((y)[1] & 255)<<16) | \
\r
322 ((unsigned long)((y)[2] & 255)<<8) | \
\r
323 ((unsigned long)((y)[3] & 255)); }
\r
325 #define STORE64H(x, y) \
\r
326 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
\r
327 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
\r
328 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
\r
329 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
\r
331 #define LOAD64H(x, y) \
\r
332 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
\r
333 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
\r
334 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
\r
335 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
\r
337 #endif /* ENDIAN_NEUTRAL */
\r
339 #ifdef ENDIAN_LITTLE
\r
341 #define STORE32H(x, y) \
\r
342 { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
\r
343 (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
\r
345 #define LOAD32H(x, y) \
\r
346 { x = ((unsigned long)((y)[0] & 255)<<24) | \
\r
347 ((unsigned long)((y)[1] & 255)<<16) | \
\r
348 ((unsigned long)((y)[2] & 255)<<8) | \
\r
349 ((unsigned long)((y)[3] & 255)); }
\r
351 #define STORE64H(x, y) \
\r
352 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
\r
353 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
\r
354 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
\r
355 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
\r
357 #define LOAD64H(x, y) \
\r
358 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
\r
359 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
\r
360 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
\r
361 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
\r
363 #ifdef ENDIAN_32BITWORD
\r
365 #define STORE32L(x, y) \
\r
366 { unsigned long __t = (x); memcpy(y, &__t, 4); }
\r
368 #define LOAD32L(x, y) \
\r
369 memcpy(&(x), y, 4);
\r
371 #define STORE64L(x, y) \
\r
372 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
\r
373 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
\r
374 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
\r
375 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
\r
377 #define LOAD64L(x, y) \
\r
378 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
\r
379 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
\r
380 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
\r
381 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
\r
383 #else /* 64-bit words then */
\r
385 #define STORE32L(x, y) \
\r
386 { unsigned long __t = (x); memcpy(y, &__t, 4); }
\r
388 #define LOAD32L(x, y) \
\r
389 { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
\r
391 #define STORE64L(x, y) \
\r
392 { ulong64 __t = (x); memcpy(y, &__t, 8); }
\r
394 #define LOAD64L(x, y) \
\r
395 { memcpy(&(x), y, 8); }
\r
397 #endif /* ENDIAN_64BITWORD */
\r
398 #endif /* ENDIAN_LITTLE */
\r
401 #define STORE32L(x, y) \
\r
402 { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
\r
403 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
\r
405 #define LOAD32L(x, y) \
\r
406 { x = ((unsigned long)((y)[3] & 255)<<24) | \
\r
407 ((unsigned long)((y)[2] & 255)<<16) | \
\r
408 ((unsigned long)((y)[1] & 255)<<8) | \
\r
409 ((unsigned long)((y)[0] & 255)); }
\r
411 #define STORE64L(x, y) \
\r
412 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
\r
413 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
\r
414 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
\r
415 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
\r
417 #define LOAD64L(x, y) \
\r
418 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \
\r
419 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32) | \
\r
420 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16) | \
\r
421 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
\r
423 #ifdef ENDIAN_32BITWORD
\r
425 #define STORE32H(x, y) \
\r
426 { unsigned long __t = (x); memcpy(y, &__t, 4); }
\r
428 #define LOAD32H(x, y) \
\r
429 memcpy(&(x), y, 4);
\r
431 #define STORE64H(x, y) \
\r
432 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
\r
433 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
\r
434 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
\r
435 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
\r
437 #define LOAD64H(x, y) \
\r
438 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \
\r
439 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32)| \
\r
440 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16)| \
\r
441 (((ulong64)((y)[6] & 255))<<8)| (((ulong64)((y)[7] & 255))); }
\r
443 #else /* 64-bit words then */
\r
445 #define STORE32H(x, y) \
\r
446 { unsigned long __t = (x); memcpy(y, &__t, 4); }
\r
448 #define LOAD32H(x, y) \
\r
449 { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
\r
451 #define STORE64H(x, y) \
\r
452 { ulong64 __t = (x); memcpy(y, &__t, 8); }
\r
454 #define LOAD64H(x, y) \
\r
455 { memcpy(&(x), y, 8); }
\r
457 #endif /* ENDIAN_64BITWORD */
\r
458 #endif /* ENDIAN_BIG */
\r
462 #if defined(USE_RSA) || defined(MDH) || defined(MECC)
\r
466 size of a packet header in bytes */
\r
467 #define PACKET_SIZE 4
\r
472 #define PACKET_SECT_RSA 0
\r
473 #define PACKET_SECT_DH 1
\r
474 #define PACKET_SECT_ECC 2
\r
475 #define PACKET_SECT_DSA 3
\r
478 Subsection Tags for the first three sections
\r
480 #define PACKET_SUB_KEY 0
\r
481 #define PACKET_SUB_ENCRYPTED 1
\r
482 #define PACKET_SUB_SIGNED 2
\r
483 #define PACKET_SUB_ENC_KEY 3
\r
487 fix for MSVC ...evil!
\r
491 #define CONST64(n) n ## ui64
\r
492 typedef unsigned __int64 ulong64;
\r
494 #define CONST64(n) n ## ULL
\r
495 typedef unsigned long long ulong64;
\r
500 #define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \
\r
501 ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) )
\r
508 #include <stdlib.h>
\r
509 #pragma intrinsic(_lrotr,_lrotl)
\r
510 #define ROR(x,n) _lrotr(x,n)
\r
511 #define ROL(x,n) _lrotl(x,n)
\r
512 #define RORc(x,n) _lrotr(x,n)
\r
513 #define ROLc(x,n) _lrotl(x,n)
\r
516 #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(INTEL_CC) && !defined(PS_NO_ASM)
\r
518 static inline unsigned ROL(unsigned word, int32 i)
\r
520 asm ("roll %%cl,%0"
\r
521 :"0" (word),"c" (i));
\r
525 static inline unsigned ROR(unsigned word, int32 i)
\r
527 asm ("rorl %%cl,%0"
\r
529 :"0" (word),"c" (i));
\r
536 static inline unsigned ROLc(unsigned word, const int32 i)
\r
540 :"0" (word),"I" (i));
\r
544 static inline unsigned RORc(unsigned word, const int32 i)
\r
548 :"0" (word),"I" (i));
\r
560 #else /* _MSC_VER */
\r
563 rotates the hard way
\r
565 #define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
\r
566 #define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
\r
567 #define ROLc(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
\r
568 #define RORc(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
\r
570 #endif /* _MSC_VER */
\r
572 /* 64-bit Rotates */
\r
575 #if defined(__GNUC__) && defined(__x86_64__) && !defined(PS_NO_ASM)
\r
577 static inline unsigned long ROL64(unsigned long word, int32 i)
\r
581 :"0" (word),"c" (i));
\r
585 static inline unsigned long ROR64(unsigned long word, int32 i)
\r
589 :"0" (word),"c" (i));
\r
595 static inline unsigned long ROL64c(unsigned long word, const int32 i)
\r
599 :"0" (word),"J" (i));
\r
603 static inline unsigned long ROR64c(unsigned long word, const int32 i)
\r
607 :"0" (word),"J" (i));
\r
611 #else /* PS_NO_ROLC */
\r
616 #endif /* PS_NO_ROLC */
\r
618 #endif /* commented out */
\r
620 #define ROL64(x, y) \
\r
621 ( (((x)<<((ulong64)(y)&63)) | \
\r
622 (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
\r
624 #define ROR64(x, y) \
\r
625 ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
\r
626 ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
\r
628 #define ROL64c(x, y) \
\r
629 ( (((x)<<((ulong64)(y)&63)) | \
\r
630 (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
\r
632 #define ROR64c(x, y) \
\r
633 ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
\r
634 ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
\r
638 #define MAX(x, y) ( ((x)>(y))?(x):(y) )
\r
639 #define MIN(x, y) ( ((x)<(y))?(x):(y) )
\r
642 extract a byte portably This MSC code causes runtime errors in VS.NET,
\r
643 always use the other
\r
647 #define byte(x, n) ((unsigned char)((x) >> (8 * (n))))
\r
650 #define byte(x, n) (((x) >> (8 * (n))) & 255)
\r
656 #endif /* __cplusplus */
\r
658 #endif /* _h_PSCRYPTO */
\r
660 /******************************************************************************/
\r