SOURCE CODE FOR MD5

View Code
   1 /*
   2 Source Code for Cryptography (Just a touch)
   3 
   4  
   5 
   6 SOURCE CODE FOR MD5
   7 
   8 md5.h (the include file for the above C code)
   9 
  10 Karn Encryption: Symmetric Secret with MD5
  11 
  12 SHA-1 By Steve Reid
  13 
  14 RSA Crypto Toolkit Totality
  15 
  16 DES Encryption
  17 
  18 Elliptic Curves
  19  
  20 SOURCE CODE FOR MD5
  21 */
  22  
  23 
  24 #ifdef  CPU386  /* Fast assembler version exists for 386/486 */
  25 
  26 #pragma inline
  27 
  28 #endif
  29 
  30  
  31 
  32 /*
  33 
  34  ***********************************************************************
  35 
  36  ** md5.c -- the source code for MD5 routines                         **
  37 
  38  ** RSA Data Security, Inc. MD5 Message-Digest Algorithm              **
  39 
  40  ** Created: 2/17/90 RLR                                              **
  41 
  42  ** Revised: 1/91 SRD,AJ,BSK,JT Reference C ver., 7/10 constant corr. **
  43 
  44  **          1992.2.13 Jouko Holopainen, 80x86 version                **
  45 
  46  ***********************************************************************
  47 
  48  */
  49 
  50  
  51 
  52 /*
  53 
  54  ***********************************************************************
  55 
  56  ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved.  **
  57 
  58  **                                                                   **
  59 
  60  ** License to copy and use this software is granted provided that    **
  61 
  62  ** it is identified as the "RSA Data Security, Inc. MD5 Message-     **
  63 
  64  ** Digest Algorithm" in all material mentioning or referencing this  **
  65 
  66  ** software or this function.                                        **
  67 
  68  **                                                                   **
  69 
  70  ** License is also granted to make and use derivative works          **
  71 
  72  ** provided that such works are identified as "derived from the RSA  **
  73 
  74  ** Data Security, Inc. MD5 Message-Digest Algorithm" in all          **
  75 
  76  ** material mentioning or referencing the derived work.              **
  77 
  78  **                                                                   **
  79 
  80  ** RSA Data Security, Inc. makes no representations concerning       **
  81 
  82  ** either the merchantability of this software or the suitability    **
  83 
  84  ** of this software for any particular purpose.  It is provided "as  **
  85 
  86  ** is" without express or implied warranty of any kind.              **
  87 
  88  **                                                                   **
  89 
  90  ** These notices must be retained in any copies of any part of this  **
  91 
  92  ** documentation and/or software.                                    **
  93 
  94  ***********************************************************************
  95 
  96  */
  97 
  98  
  99 
 100 #include "md5.h"
 101 
 102  
 103 
 104 /*
 105 
 106  ***********************************************************************
 107 
 108  **  Message-digest routines:                                         **
 109 
 110  **  To form the message digest for a message M                       **
 111 
 112  **    (1) Initialize a context buffer mdContext using MD5Init        **
 113 
 114  **    (2) Call MD5Update on mdContext and M                          **
 115 
 116  **    (3) Call MD5Final on mdContext                                 **
 117 
 118  **  The message digest is now in mdContext->digest[0...15]           **
 119 
 120  ***********************************************************************
 121 
 122  */
 123 
 124  
 125 
 126 static unsigned char PADDING[64] = {
 127 
 128   0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 129 
 130   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 131 
 132   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 133 
 134   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 135 
 136   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 137 
 138   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 139 
 140   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 141 
 142   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 143 
 144 };
 145 
 146  
 147 
 148 #ifndef CPU386  /* Alternate defs exist for 386 assembler version */
 149 
 150 /* F, G, H and I are basic MD5 functions */
 151 
 152 #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
 153 
 154 #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
 155 
 156 #define H(x, y, z) ((x) ^ (y) ^ (z))
 157 
 158 #define I(x, y, z) ((y) ^ ((x) | (~z)))
 159 
 160  
 161 
 162 /* ROTATE_LEFT rotates x left n bits */
 163 
 164 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
 165 
 166  
 167 
 168 /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */
 169 
 170 /* Rotation is separate from addition to prevent recomputation */
 171 
 172 #define FF(a, b, c, d, x, s, ac) \
 173 
 174   {(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
 175 
 176    (a) = ROTATE_LEFT ((a), (s)); \
 177 
 178    (a) += (b); \
 179 
 180   }
 181 
 182 #define GG(a, b, c, d, x, s, ac) \
 183 
 184   {(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
 185 
 186    (a) = ROTATE_LEFT ((a), (s)); \
 187 
 188    (a) += (b); \
 189 
 190   }
 191 
 192 #define HH(a, b, c, d, x, s, ac) \
 193 
 194   {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
 195 
 196    (a) = ROTATE_LEFT ((a), (s)); \
 197 
 198    (a) += (b); \
 199 
 200   }
 201 
 202 #define II(a, b, c, d, x, s, ac) \
 203 
 204   {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
 205 
 206    (a) = ROTATE_LEFT ((a), (s)); \
 207 
 208    (a) += (b); \
 209 
 210   }
 211 
 212 #endif  /* CPU386 */
 213 
 214  
 215 
 216 /* The routine MD5Init initializes the message-digest context
 217 
 218    mdContext. All fields are set to zero.
 219 
 220  */
 221 
 222 void MD5Init (mdContext)
 223 
 224 MD5_CTX *mdContext;
 225 
 226 {
 227 
 228   mdContext->i[0] = mdContext->i[1] = (UINT4)0;
 229 
 230  
 231 
 232   /* Load magic initialization constants.
 233 
 234    */
 235 
 236   mdContext->buf[0] = (UINT4)0x67452301;
 237 
 238   mdContext->buf[1] = (UINT4)0xefcdab89;
 239 
 240   mdContext->buf[2] = (UINT4)0x98badcfe;
 241 
 242   mdContext->buf[3] = (UINT4)0x10325476;
 243 
 244 }
 245 
 246  
 247 
 248 /* The routine MD5Update updates the message-digest context to
 249 
 250    account for the presence of each of the characters inBuf[0..inLen-1]
 251 
 252    in the message whose digest is being computed.
 253 
 254  */
 255 
 256 void MD5Update (mdContext, inBuf, inLen)
 257 
 258 MD5_CTX *mdContext;
 259 
 260 unsigned char *inBuf;
 261 
 262 unsigned int inLen;
 263 
 264 {
 265 
 266   UINT4 in[16];
 267 
 268   int mdi;
 269 
 270   unsigned int i, ii;
 271 
 272  
 273 
 274   /* compute number of bytes mod 64 */
 275 
 276   mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
 277 
 278  
 279 
 280   /* update number of bits */
 281 
 282   if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0])
 283 
 284     mdContext->i[1]++;
 285 
 286   mdContext->i[0] += ((UINT4)inLen << 3);
 287 
 288   mdContext->i[1] += ((UINT4)inLen >> 29);
 289 
 290  
 291 
 292 #ifdef  LITTLE_ENDIAN
 293 
 294   /* Speedup for little-endian machines suggested in MD5 report --P Karn */
 295 
 296      if(mdi == 0 && ((int)inBuf & 3) == 0){
 297 
 298           while(inLen >= 64){
 299 
 300                MD5Transform(mdContext->buf,(UINT4 *)inBuf);
 301 
 302                inLen -= 64;
 303 
 304                inBuf += 64;
 305 
 306           }              
 307 
 308      }
 309 
 310 #endif  /* LITTLE_ENDIAN */
 311 
 312   while (inLen--) {
 313 
 314     /* add new character to buffer, increment mdi */
 315 
 316     mdContext->in[mdi++] = *inBuf++;
 317 
 318  
 319 
 320     /* transform if necessary */
 321 
 322     if (mdi == 0x40) {
 323 
 324       for (i = 0, ii = 0; i < 16; i++, ii += 4)
 325 
 326      in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
 327 
 328           (((UINT4)mdContext->in[ii+2]) << 16) |
 329 
 330           (((UINT4)mdContext->in[ii+1]) << 8) |
 331 
 332           ((UINT4)mdContext->in[ii]);
 333 
 334       MD5Transform (mdContext->buf, in);
 335 
 336       mdi = 0;
 337 
 338     }
 339 
 340   }
 341 
 342 }
 343 
 344  
 345 
 346 /* The routine MD5Final terminates the message-digest computation and
 347 
 348    ends with the desired message digest in mdContext->digest[0...15].
 349 
 350  */
 351 
 352 void MD5Final (mdContext)
 353 
 354 MD5_CTX *mdContext;
 355 
 356 {
 357 
 358   UINT4 in[16];
 359 
 360   int mdi;
 361 
 362   unsigned int i, ii;
 363 
 364   unsigned int padLen;
 365 
 366  
 367 
 368   /* save number of bits */
 369 
 370   in[14] = mdContext->i[0];
 371 
 372   in[15] = mdContext->i[1];
 373 
 374  
 375 
 376   /* compute number of bytes mod 64 */
 377 
 378   mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
 379 
 380  
 381 
 382   /* pad out to 56 mod 64 */
 383 
 384   padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
 385 
 386   MD5Update (mdContext, PADDING, padLen);
 387 
 388  
 389 
 390   /* append length in bits and transform */
 391 
 392   for (i = 0, ii = 0; i < 14; i++, ii += 4)
 393 
 394     in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
 395 
 396          (((UINT4)mdContext->in[ii+2]) << 16) |
 397 
 398          (((UINT4)mdContext->in[ii+1]) << 8) |
 399 
 400          ((UINT4)mdContext->in[ii]);
 401 
 402   MD5Transform (mdContext->buf, in);
 403 
 404  
 405 
 406   /* store buffer in digest */
 407 
 408   for (i = 0, ii = 0; i < 4; i++, ii += 4) {
 409 
 410     mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF);
 411 
 412     mdContext->digest[ii+1] =
 413 
 414       (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
 415 
 416     mdContext->digest[ii+2] =
 417 
 418       (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
 419 
 420     mdContext->digest[ii+3] =
 421 
 422       (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
 423 
 424   }
 425 
 426 }
 427 
 428  
 429 
 430 #ifndef CPU386  /* Fast assembler version exists for 386/486 */
 431 
 432  
 433 
 434 /* Basic MD5 step. Transforms buf based on in.
 435 
 436  */
 437 
 438 void MD5Transform (buf, in)
 439 
 440 UINT4 *buf;
 441 
 442 UINT4 *in;
 443 
 444 {
 445 
 446   UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3];
 447 
 448  
 449 
 450   /* Round 1 */
 451 
 452 #define S11 7
 453 
 454 #define S12 12
 455 
 456 #define S13 17
 457 
 458 #define S14 22
 459 
 460   FF ( a, b, c, d, in[ 0], S11, 3614090360); /* 1 */
 461 
 462   FF ( d, a, b, c, in[ 1], S12, 3905402710); /* 2 */
 463 
 464   FF ( c, d, a, b, in[ 2], S13,  606105819); /* 3 */
 465 
 466   FF ( b, c, d, a, in[ 3], S14, 3250441966); /* 4 */
 467 
 468   FF ( a, b, c, d, in[ 4], S11, 4118548399); /* 5 */
 469 
 470   FF ( d, a, b, c, in[ 5], S12, 1200080426); /* 6 */
 471 
 472   FF ( c, d, a, b, in[ 6], S13, 2821735955); /* 7 */
 473 
 474   FF ( b, c, d, a, in[ 7], S14, 4249261313); /* 8 */
 475 
 476   FF ( a, b, c, d, in[ 8], S11, 1770035416); /* 9 */
 477 
 478   FF ( d, a, b, c, in[ 9], S12, 2336552879); /* 10 */
 479 
 480   FF ( c, d, a, b, in[10], S13, 4294925233); /* 11 */
 481 
 482   FF ( b, c, d, a, in[11], S14, 2304563134); /* 12 */
 483 
 484   FF ( a, b, c, d, in[12], S11, 1804603682); /* 13 */
 485 
 486   FF ( d, a, b, c, in[13], S12, 4254626195); /* 14 */
 487 
 488   FF ( c, d, a, b, in[14], S13, 2792965006); /* 15 */
 489 
 490   FF ( b, c, d, a, in[15], S14, 1236535329); /* 16 */
 491 
 492  
 493 
 494   /* Round 2 */
 495 
 496 #define S21 5
 497 
 498 #define S22 9
 499 
 500 #define S23 14
 501 
 502 #define S24 20
 503 
 504   GG ( a, b, c, d, in[ 1], S21, 4129170786); /* 17 */
 505 
 506   GG ( d, a, b, c, in[ 6], S22, 3225465664); /* 18 */
 507 
 508   GG ( c, d, a, b, in[11], S23,  643717713); /* 19 */
 509 
 510   GG ( b, c, d, a, in[ 0], S24, 3921069994); /* 20 */
 511 
 512   GG ( a, b, c, d, in[ 5], S21, 3593408605); /* 21 */
 513 
 514   GG ( d, a, b, c, in[10], S22,   38016083); /* 22 */
 515 
 516   GG ( c, d, a, b, in[15], S23, 3634488961); /* 23 */
 517 
 518   GG ( b, c, d, a, in[ 4], S24, 3889429448); /* 24 */
 519 
 520   GG ( a, b, c, d, in[ 9], S21,  568446438); /* 25 */
 521 
 522   GG ( d, a, b, c, in[14], S22, 3275163606); /* 26 */
 523 
 524   GG ( c, d, a, b, in[ 3], S23, 4107603335); /* 27 */
 525 
 526   GG ( b, c, d, a, in[ 8], S24, 1163531501); /* 28 */
 527 
 528   GG ( a, b, c, d, in[13], S21, 2850285829); /* 29 */
 529 
 530   GG ( d, a, b, c, in[ 2], S22, 4243563512); /* 30 */
 531 
 532   GG ( c, d, a, b, in[ 7], S23, 1735328473); /* 31 */
 533 
 534   GG ( b, c, d, a, in[12], S24, 2368359562); /* 32 */
 535 
 536  
 537 
 538   /* Round 3 */
 539 
 540 #define S31 4
 541 
 542 #define S32 11
 543 
 544 #define S33 16
 545 
 546 #define S34 23
 547 
 548   HH ( a, b, c, d, in[ 5], S31, 4294588738); /* 33 */
 549 
 550   HH ( d, a, b, c, in[ 8], S32, 2272392833); /* 34 */
 551 
 552   HH ( c, d, a, b, in[11], S33, 1839030562); /* 35 */
 553 
 554   HH ( b, c, d, a, in[14], S34, 4259657740); /* 36 */
 555 
 556   HH ( a, b, c, d, in[ 1], S31, 2763975236); /* 37 */
 557 
 558   HH ( d, a, b, c, in[ 4], S32, 1272893353); /* 38 */
 559 
 560   HH ( c, d, a, b, in[ 7], S33, 4139469664); /* 39 */
 561 
 562   HH ( b, c, d, a, in[10], S34, 3200236656); /* 40 */
 563 
 564   HH ( a, b, c, d, in[13], S31,  681279174); /* 41 */
 565 
 566   HH ( d, a, b, c, in[ 0], S32, 3936430074); /* 42 */
 567 
 568   HH ( c, d, a, b, in[ 3], S33, 3572445317); /* 43 */
 569 
 570   HH ( b, c, d, a, in[ 6], S34,   76029189); /* 44 */
 571 
 572   HH ( a, b, c, d, in[ 9], S31, 3654602809); /* 45 */
 573 
 574   HH ( d, a, b, c, in[12], S32, 3873151461); /* 46 */
 575 
 576   HH ( c, d, a, b, in[15], S33,  530742520); /* 47 */
 577 
 578   HH ( b, c, d, a, in[ 2], S34, 3299628645); /* 48 */
 579 
 580  
 581 
 582   /* Round 4 */
 583 
 584 #define S41 6
 585 
 586 #define S42 10
 587 
 588 #define S43 15
 589 
 590 #define S44 21
 591 
 592   II ( a, b, c, d, in[ 0], S41, 4096336452); /* 49 */
 593 
 594   II ( d, a, b, c, in[ 7], S42, 1126891415); /* 50 */
 595 
 596   II ( c, d, a, b, in[14], S43, 2878612391); /* 51 */
 597 
 598   II ( b, c, d, a, in[ 5], S44, 4237533241); /* 52 */
 599 
 600   II ( a, b, c, d, in[12], S41, 1700485571); /* 53 */
 601 
 602   II ( d, a, b, c, in[ 3], S42, 2399980690); /* 54 */
 603 
 604   II ( c, d, a, b, in[10], S43, 4293915773); /* 55 */
 605 
 606   II ( b, c, d, a, in[ 1], S44, 2240044497); /* 56 */
 607 
 608   II ( a, b, c, d, in[ 8], S41, 1873313359); /* 57 */
 609 
 610   II ( d, a, b, c, in[15], S42, 4264355552); /* 58 */
 611 
 612   II ( c, d, a, b, in[ 6], S43, 2734768916); /* 59 */
 613 
 614   II ( b, c, d, a, in[13], S44, 1309151649); /* 60 */
 615 
 616   II ( a, b, c, d, in[ 4], S41, 4149444226); /* 61 */
 617 
 618   II ( d, a, b, c, in[11], S42, 3174756917); /* 62 */
 619 
 620   II ( c, d, a, b, in[ 2], S43,  718787259); /* 63 */
 621 
 622   II ( b, c, d, a, in[ 9], S44, 3951481745); /* 64 */
 623 
 624  
 625 
 626   buf[0] += a;
 627 
 628   buf[1] += b;
 629 
 630   buf[2] += c;
 631 
 632   buf[3] += d;
 633 
 634 }
 635 
 636 #else   /* CPU386 */
 637 
 638 /* Fast 386 Borland C inline assembler version of the MD5Transform() function
 639 
 640  * from the RSA Data Security, Inc, MD5 Message Digest Algorithm.
 641 
 642  *
 643 
 644  * This version uses native 32 bit registers, so it needs a 386 or 486 CPU.
 645 
 646  *
 647 
 648  * Because this function does *lots* of 32-bit operations, this version is
 649 
 650  * MUCH faster than the reference C version compiled with a garden-
 651 
 652  * variety 16-bit MS-DOS C compiler.
 653 
 654  *
 655 
 656  * Written and placed into the public domain on
 657 
 658  * 22 February 1992 by Phil Karn, KA9Q
 659 
 660  */
 661 
 662 /* I really shouldn't have to do this explicitly... */
 663 
 664 #ifdef  __COMPACT__
 665 
 666      asm     .MODEL COMPACT
 667 
 668 #elif   __HUGE__
 669 
 670      asm     .MODEL HUGE
 671 
 672 #elif   __LARGE__
 673 
 674      asm     .MODEL LARGE
 675 
 676 #elif   __MEDIUM__
 677 
 678      asm     .MODEL MEDIUM
 679 
 680 #elif   __SMALL__
 681 
 682      asm     .MODEL SMALL
 683 
 684 #elif   __TINY__
 685 
 686      asm     .MODEL TINY
 687 
 688 #endif
 689 
 690  
 691 
 692 /* Code sequence common to all four rounds.
 693 
 694  * evaluates a = b + (a + edi + x + t) <<< s
 695 
 696  * Assumes a,b are registers, s,t are immediate constants
 697 
 698  * The 'lea' instruction is just a fast way to compute "a = a+t+edi"
 699 
 700  */
 701 
 702 #define COM(a,b,x,s,t)\
 703 
 704      asm     lea a,t[a+edi];\
 705 
 706      asm     add a,x;\
 707 
 708      asm     rol a,s;\
 709 
 710      asm     add a,b;
 711 
 712  
 713 
 714 /* Round 1 functions */
 715 
 716 /* edi = F(x,y,z) = (x & y) | (~x & z) */
 717 
 718 #define F(x,y,z)\
 719 
 720      asm     mov edi,x;\
 721 
 722      asm     and edi,y;\
 723 
 724      asm     mov esi,x;\
 725 
 726      asm     not esi;\
 727 
 728      asm     and esi,z;\
 729 
 730      asm     or edi,esi
 731 
 732  
 733 
 734 /* a = b + ((a + F(x,y,z) + x + t) <<< s); */
 735 
 736 #define FF(a,b,c,d,x,s,t)\
 737 
 738      F(b,c,d);\
 739 
 740      COM(a,b,x,s,t)
 741 
 742  
 743 
 744 /* Round 2 functions */
 745 
 746 /* edi = G(x,y,z) = F(z,x,y) = (x & z) | (y & ~z) */
 747 
 748 #define G(x,y,z) F(z,x,y)
 749 
 750  
 751 
 752 /* a = b + ((a + G(b,c,d) + x + t) <<< s) */
 753 
 754 #define GG(a,b,c,d,x,s,t)\
 755 
 756      G(b,c,d);\
 757 
 758      COM(a,b,x,s,t)
 759 
 760  
 761 
 762 /* Round 3 functions */
 763 
 764 /* edi = H(x,y,z) = x ^ y ^ z */
 765 
 766 #define H(x,y,z)\
 767 
 768      asm     mov edi,x;\
 769 
 770      asm     xor edi,y;\
 771 
 772      asm     xor edi,z
 773 
 774  
 775 
 776 /* a = b + ((a + H(b,c,d) + x + t) <<< s) */
 777 
 778 #define HH(a,b,c,d,x,s,t)\
 779 
 780      H(b,c,d);\
 781 
 782      COM(a,b,x,s,t)
 783 
 784  
 785 
 786 /* Round 4 functions */
 787 
 788 /* edi = I(x,y,z) = y ^ (x | ~z) */
 789 
 790 #define I(x,y,z)\
 791 
 792      asm     mov edi,z;\
 793 
 794      asm     not edi;\
 795 
 796      asm     or edi,x;\
 797 
 798      asm     xor edi,y
 799 
 800  
 801 
 802 /* a = b + ((a + I(b,c,d) + x + t) <<< s) */
 803 
 804 #define II(a,b,c,d,x,s,t)\
 805 
 806      I(b,c,d);\
 807 
 808      COM(a,b,x,s,t)
 809 
 810  
 811 
 812 #define A       eax
 813 
 814 #define B       ebx
 815 
 816 #define C       ecx
 817 
 818 #define D       edx
 819 
 820  
 821 
 822 void
 823 
 824 MD5Transform(buf,input)
 825 
 826 UINT4 *buf;
 827 
 828 UINT4 *input;
 829 
 830 {
 831 
 832      asm     .386;   /* Allow use of 32-bit general registers */
 833 
 834  
 835 
 836      /* Save caller's registers */
 837 
 838      asm     push si;
 839 
 840      asm     push di;
 841 
 842      asm     push es;
 843 
 844      asm     if @DataSize NE 0
 845 
 846      asm             push ds;
 847 
 848      asm     endif
 849 
 850  
 851 
 852      /* Get buf argument */
 853 
 854      asm     if @DataSize NE 0
 855 
 856      asm             lds si,buf;
 857 
 858      asm     else
 859 
 860      asm             mov si,buf;
 861 
 862      asm     endif
 863 
 864      asm     mov A,dword ptr si[0*4];        /* A = buf[0] */
 865 
 866      asm     mov B,dword ptr si[1*4];        /* B = buf[1] */
 867 
 868      asm     mov C,dword ptr si[2*4];        /* C = buf[2] */
 869 
 870      asm     mov D,dword ptr si[3*4];        /* D = buf[3] */
 871 
 872  
 873 
 874      /* Warning: This makes our other args inaccessible until bp
 875 
 876       * is restored!
 877 
 878      */
 879 
 880      asm     push bp;
 881 
 882      asm     les bp,input
 883 
 884  
 885 
 886 /* Round 1. The *4 factors in the subscripts to bp account for the
 887 
 888  * byte offsets of each long element in the input array.
 889 
 890  */
 891 
 892 #define S11 7
 893 
 894 #define S12 12
 895 
 896 #define S13 17
 897 
 898 #define S14 22
 899 
 900      FF(A,B,C,D,es:bp[ 0*4],S11,3614090360); /* 1 */
 901 
 902      FF(D,A,B,C,es:bp[ 1*4],S12,3905402710); /* 2 */
 903 
 904      FF(C,D,A,B,es:bp[ 2*4],S13, 606105819); /* 3 */
 905 
 906      FF(B,C,D,A,es:bp[ 3*4],S14,3250441966); /* 4 */
 907 
 908      FF(A,B,C,D,es:bp[ 4*4],S11,4118548399); /* 5 */
 909 
 910      FF(D,A,B,C,es:bp[ 5*4],S12,1200080426); /* 6 */
 911 
 912      FF(C,D,A,B,es:bp[ 6*4],S13,2821735955); /* 7 */
 913 
 914      FF(B,C,D,A,es:bp[ 7*4],S14,4249261313); /* 8 */
 915 
 916      FF(A,B,C,D,es:bp[ 8*4],S11,1770035416); /* 9 */
 917 
 918      FF(D,A,B,C,es:bp[ 9*4],S12,2336552879); /* 10 */
 919 
 920      FF(C,D,A,B,es:bp[10*4],S13,4294925233); /* 11 */
 921 
 922      FF(B,C,D,A,es:bp[11*4],S14,2304563134); /* 12 */
 923 
 924      FF(A,B,C,D,es:bp[12*4],S11,1804603682); /* 13 */
 925 
 926      FF(D,A,B,C,es:bp[13*4],S12,4254626195); /* 14 */
 927 
 928      FF(C,D,A,B,es:bp[14*4],S13,2792965006); /* 15 */
 929 
 930      FF(B,C,D,A,es:bp[15*4],S14,1236535329); /* 16 */
 931 
 932  
 933 
 934 /* Round 2 */
 935 
 936 #define S21 5
 937 
 938 #define S22 9
 939 
 940 #define S23 14
 941 
 942 #define S24 20
 943 
 944      GG(A,B,C,D,es:bp[ 1*4],S21,4129170786); /* 17 */
 945 
 946      GG(D,A,B,C,es:bp[ 6*4],S22,3225465664); /* 18 */
 947 
 948      GG(C,D,A,B,es:bp[11*4],S23, 643717713); /* 19 */
 949 
 950      GG(B,C,D,A,es:bp[ 0*4],S24,3921069994); /* 20 */
 951 
 952      GG(A,B,C,D,es:bp[ 5*4],S21,3593408605); /* 21 */
 953 
 954      GG(D,A,B,C,es:bp[10*4],S22,  38016083); /* 22 */
 955 
 956      GG(C,D,A,B,es:bp[15*4],S23,3634488961); /* 23 */
 957 
 958      GG(B,C,D,A,es:bp[ 4*4],S24,3889429448); /* 24 */
 959 
 960      GG(A,B,C,D,es:bp[ 9*4],S21, 568446438); /* 25 */
 961 
 962      GG(D,A,B,C,es:bp[14*4],S22,3275163606); /* 26 */
 963 
 964      GG(C,D,A,B,es:bp[ 3*4],S23,4107603335); /* 27 */
 965 
 966      GG(B,C,D,A,es:bp[ 8*4],S24,1163531501); /* 28 */
 967 
 968      GG(A,B,C,D,es:bp[13*4],S21,2850285829); /* 29 */
 969 
 970      GG(D,A,B,C,es:bp[ 2*4],S22,4243563512); /* 30 */
 971 
 972      GG(C,D,A,B,es:bp[ 7*4],S23,1735328473); /* 31 */
 973 
 974      GG(B,C,D,A,es:bp[12*4],S24,2368359562); /* 32 */
 975 
 976  
 977 
 978 /* Round 3 */
 979 
 980 #define S31 4
 981 
 982 #define S32 11
 983 
 984 #define S33 16
 985 
 986 #define S34 23
 987 
 988      HH(A,B,C,D,es:bp[ 5*4],S31,4294588738); /* 33 */
 989 
 990      HH(D,A,B,C,es:bp[ 8*4],S32,2272392833); /* 34 */
 991 
 992      HH(C,D,A,B,es:bp[11*4],S33,1839030562); /* 35 */
 993 
 994      HH(B,C,D,A,es:bp[14*4],S34,4259657740); /* 36 */
 995 
 996      HH(A,B,C,D,es:bp[ 1*4],S31,2763975236); /* 37 */
 997 
 998      HH(D,A,B,C,es:bp[ 4*4],S32,1272893353); /* 38 */
 999 
1000      HH(C,D,A,B,es:bp[ 7*4],S33,4139469664); /* 39 */
1001 
1002      HH(B,C,D,A,es:bp[10*4],S34,3200236656); /* 40 */
1003 
1004      HH(A,B,C,D,es:bp[13*4],S31, 681279174); /* 41 */
1005 
1006      HH(D,A,B,C,es:bp[ 0*4],S32,3936430074); /* 42 */
1007 
1008      HH(C,D,A,B,es:bp[ 3*4],S33,3572445317); /* 43 */
1009 
1010      HH(B,C,D,A,es:bp[ 6*4],S34,  76029189); /* 44 */
1011 
1012      HH(A,B,C,D,es:bp[ 9*4],S31,3654602809); /* 45 */
1013 
1014      HH(D,A,B,C,es:bp[12*4],S32,3873151461); /* 46 */
1015 
1016      HH(C,D,A,B,es:bp[15*4],S33, 530742520); /* 47 */
1017 
1018      HH(B,C,D,A,es:bp[ 2*4],S34,3299628645); /* 48 */
1019 
1020  
1021 
1022 /* Round 4 */
1023 
1024 #define S41 6
1025 
1026 #define S42 10
1027 
1028 #define S43 15
1029 
1030 #define S44 21
1031 
1032      II(A,B,C,D,es:bp[ 0*4],S41,4096336452); /* 49 */
1033 
1034      II(D,A,B,C,es:bp[ 7*4],S42,1126891415); /* 50 */
1035 
1036      II(C,D,A,B,es:bp[14*4],S43,2878612391); /* 51 */
1037 
1038      II(B,C,D,A,es:bp[ 5*4],S44,4237533241); /* 52 */
1039 
1040      II(A,B,C,D,es:bp[12*4],S41,1700485571); /* 53 */
1041 
1042      II(D,A,B,C,es:bp[ 3*4],S42,2399980690); /* 54 */
1043 
1044      II(C,D,A,B,es:bp[10*4],S43,4293915773); /* 55 */
1045 
1046      II(B,C,D,A,es:bp[ 1*4],S44,2240044497); /* 56 */
1047 
1048      II(A,B,C,D,es:bp[ 8*4],S41,1873313359); /* 57 */
1049 
1050      II(D,A,B,C,es:bp[15*4],S42,4264355552); /* 58 */
1051 
1052      II(C,D,A,B,es:bp[ 6*4],S43,2734768916); /* 59 */
1053 
1054      II(B,C,D,A,es:bp[13*4],S44,1309151649); /* 60 */
1055 
1056      II(A,B,C,D,es:bp[ 4*4],S41,4149444226); /* 61 */
1057 
1058      II(D,A,B,C,es:bp[11*4],S42,3174756917); /* 62 */
1059 
1060      II(C,D,A,B,es:bp[ 2*4],S43, 718787259); /* 63 */
1061 
1062      II(B,C,D,A,es:bp[ 9*4],S44,3951481745); /* 64 */
1063 
1064  
1065 
1066      asm pop bp;             /* We can address our args again */
1067 
1068      asm     if @DataSize NE 0
1069 
1070      asm             lds si,buf
1071 
1072      asm     else
1073 
1074      asm             mov si,buf;
1075 
1076      asm     endif
1077 
1078      asm add dword ptr si[0*4],A;    /* buf[0] += A */
1079 
1080      asm add dword ptr si[1*4],B;    /* buf[1] += B */
1081 
1082      asm add dword ptr si[2*4],C;    /* buf[2] += C */
1083 
1084      asm add dword ptr si[3*4],D;    /* buf[3] += D */
1085 
1086  
1087 
1088      /* Restore caller's registers */
1089 
1090      asm     if @DataSize NE 0
1091 
1092      asm             pop ds
1093 
1094      asm     endif
1095 
1096  
1097 
1098      asm     pop es;
1099 
1100      asm     pop di;
1101 
1102      asm     pop si;
1103 
1104 }
1105 
1106 #endif  /* CPU386 */
1107 
1108  
1109 
1110 /*
1111 
1112  ***********************************************************************
1113 
1114  ** End of md5.c                                                      **
1115 
1116  ******************************** (cut) ********************************
1117 
1118  */
1119 
1120 md5.h (the include file for the above C code)
1121 
1122 /*
1123 
1124  ***********************************************************************
1125 
1126  ** md5.h -- header file for implementation of MD5                    **
1127 
1128  ** RSA Data Security, Inc. MD5 Message-Digest Algorithm              **
1129 
1130  ** Created: 2/17/90 RLR                                              **
1131 
1132  ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version               **
1133 
1134  ** Revised (for MD5): RLR 4/27/91                                    **
1135 
1136  **   -- G modified to have y&~z instead of y&z                       **
1137 
1138  **   -- FF, GG, HH modified to add in last register done             **
1139 
1140  **   -- Access pattern: round 2 works mod 5, round 3 works mod 3     **
1141 
1142  **   -- distinct additive constant for each step                     **
1143 
1144  **   -- round 4 added, working mod 7                                 **
1145 
1146  ***********************************************************************
1147 
1148  */
1149 
1150 /*
1151 
1152  ***********************************************************************
1153 
1154  ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved.  **
1155 
1156  **                                                                   **
1157 
1158  ** License to copy and use this software is granted provided that    **
1159 
1160  ** it is identified as the "RSA Data Security, Inc. MD5 Message-     **
1161 
1162  ** Digest Algorithm" in all material mentioning or referencing this  **
1163 
1164  ** software or this function.                                        **
1165 
1166  **                                                                   **
1167 
1168  ** License is also granted to make and use derivative works          **
1169 
1170  ** provided that such works are identified as "derived from the RSA  **
1171 
1172  ** Data Security, Inc. MD5 Message-Digest Algorithm" in all          **
1173 
1174  ** material mentioning or referencing the derived work.              **
1175 
1176  **                                                                   **
1177 
1178  ** RSA Data Security, Inc. makes no representations concerning       **
1179 
1180  ** either the merchantability of this software or the suitability    **
1181 
1182  ** of this software for any particular purpose.  It is provided "as  **
1183 
1184  ** is" without express or implied warranty of any kind.              **
1185 
1186  **                                                                   **
1187 
1188  ** These notices must be retained in any copies of any part of this  **
1189 
1190  ** documentation and/or software.                                    **
1191 
1192  ***********************************************************************
1193 
1194  */
1195 
1196  
1197 
1198 /* typedef a 32-bit type */
1199 
1200 typedef unsigned long int UINT4;
1201 
1202  
1203 
1204 /* Data structure for MD5 (Message-Digest) computation */
1205 
1206 typedef struct {
1207 
1208   UINT4 i[2];                   /* number of _bits_ handled mod 2^64 */
1209 
1210   UINT4 buf[4];                                    /* scratch buffer */
1211 
1212   unsigned char in[64];                              /* input buffer */
1213 
1214   unsigned char digest[16];     /* actual digest after MD5Final call */
1215 
1216 } MD5_CTX;
1217 
1218  
1219 
1220 void MD5Init (MD5_CTX *);
1221 
1222 void MD5Update (MD5_CTX *,unsigned char *,unsigned int);
1223 
1224 void MD5Final (MD5_CTX *);
1225 
1226 void MD5Transform(UINT4 *,UINT4 *);
1227 
1228 /*
1229 
1230  ***********************************************************************
1231 
1232  ** End of md5.h                                                      **
1233 
1234  ******************************** (cut) ********************************
1235 
1236  */
1237 
1238  
1239 Karn Encryption: Symmetric Secret with MD5
1240 
1241 /*
1242 
1243  *   Karn encryption
1244 
1245  *   Based on Phil Karn, sci.crypt, 13 Feb 1992
1246 
1247  *   See also his comments from sci.crypt, 23 Mar 1992.
1248 
1249  *   The method is a variant of that described in
1250 
1251  *   Zheng, Matsumoto and Imai, Crypto 89.
1252 
1253  *   See also, "A New Class of Cryptosystems Based on
1254 
1255  *     Interconnection Networks" by
1256 
1257  *     michaelp@terpsichore.informatic.rwth-aachen.de
1258 
1259  *
1260 
1261  *   A method for turning a hash function, here MD5, into a fast
1262 
1263  *   secret-key encryption.
1264 
1265  *
1266 
1267  *   This does triple hashing with nondistinct keys.
1268 
1269  */
1270 
1271  
1272 
1273 typedef unsigned long UINT4;
1274 
1275  
1276 
1277 /* Initial values for MD5 Transform hash function */
1278 
1279 static UINT4 ihash[4] = {
1280 
1281   0x67452301L, 0xefcdab89L, 0x98badcfeL, 0x10325476L };
1282 
1283  
1284 
1285 /* MD5 hash function */
1286 
1287 extern void Transform ();
1288 
1289  
1290 
1291  
1292 
1293 /* Basic transform for Karn encryption.  Take two 16-byte
1294 
1295    half-buffers, two 48-byte keys (which must be distinct), and use
1296 
1297    the MD5 Transform algorithm to produce two 16-byte output
1298 
1299    half-buffers.
1300 
1301  
1302 
1303    This is reversible: If we get out1 and out2 from in1, in2, key1, key2,
1304 
1305    then we can get in2 and in1 from out2, out1, key1, key2.
1306 
1307  
1308 
1309    in1, in2, out1, and out2 should point to 16-byte buffers.
1310 
1311    By convention, in1 and in2 are two halves of a 32-byte input
1312 
1313    buffer, and out1 and out2 are two halves of a 32-byte output
1314 
1315    buffer.
1316 
1317  
1318 
1319    key1 and key2 should point to 48-byte buffers with different contents.
1320 
1321  */
1322 
1323 void
1324 
1325 karn (out1, out2, in1, in2, key1, key2)
1326 
1327 UINT4 *out1, *out2, *in1, *in2, *key1, *key2;
1328 
1329 {
1330 
1331      int  i;
1332 
1333      UINT4     buf[16];
1334 
1335      UINT4     hash[4];
1336 
1337      UINT4     temp[4];
1338 
1339  
1340 
1341      bcopy (ihash, hash, sizeof(hash));
1342 
1343      bcopy (in1, buf, 16);
1344 
1345      bcopy (key1, buf+4, 48);
1346 
1347      Transform (hash, buf);
1348 
1349      for (i=0; i<4; ++i)
1350 
1351           temp[i] = buf[i] = in2[i] ^ hash[i];
1352 
1353      bcopy (ihash, hash, sizeof(hash));
1354 
1355      bcopy (key2, buf+4, 48);
1356 
1357      Transform (hash, buf);
1358 
1359      for (i=0; i<4; ++i)
1360 
1361           out2[i] = buf[i] = in1[i] ^ hash[i];
1362 
1363      bcopy (ihash, hash, sizeof(hash));
1364 
1365      bcopy (key1, buf+4, 48);
1366 
1367      Transform (hash, buf);
1368 
1369      for (i=0; i<4; ++i)
1370 
1371           out1[i] = temp[i] ^ hash[i];
1372 
1373 }
1374 
1375  
1376 
1377  
1378 
1379 SHA-1 By Steve Reid
1380 
1381 /*
1382 
1383 SHA-1 in C
1384 
1385 By Steve Reid <steve@edmweb.com>
1386 
1387 100% Public Domain
1388 
1389  
1390 
1391 Test Vectors (from FIPS PUB 180-1)
1392 
1393 "abc"
1394 
1395   A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
1396 
1397 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
1398 
1399   84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
1400 
1401 A million repetitions of "a"
1402 
1403   34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
1404 
1405 */
1406 
1407  
1408 
1409 /* #define LITTLE_ENDIAN * This should be #define'd if true. */
1410 
1411 /* #define SHA1HANDSOFF * Copies data before messing with it. */
1412 
1413  
1414 
1415 #include <stdio.h>
1416 
1417 #include <string.h>
1418 
1419  
1420 
1421 typedef struct {
1422 
1423     unsigned long state[5];
1424 
1425     unsigned long count[2];
1426 
1427     unsigned char buffer[64];
1428 
1429 } SHA1_CTX;
1430 
1431  
1432 
1433 void SHA1Transform(unsigned long state[5], unsigned char buffer[64]);
1434 
1435 void SHA1Init(SHA1_CTX* context);
1436 
1437 void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len);
1438 
1439 void SHA1Final(unsigned char digest[20], SHA1_CTX* context);
1440 
1441  
1442 
1443 #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
1444 
1445  
1446 
1447 /* blk0() and blk() perform the initial expand. */
1448 
1449 /* I got the idea of expanding during the round function from SSLeay */
1450 
1451 #ifdef LITTLE_ENDIAN
1452 
1453 #define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
1454 
1455     |(rol(block->l[i],8)&0x00FF00FF))
1456 
1457 #else
1458 
1459 #define blk0(i) block->l[i]
1460 
1461 #endif
1462 
1463 #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
1464 
1465     ^block->l[(i+2)&15]^block->l[i&15],1))
1466 
1467  
1468 
1469 /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
1470 
1471 #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
1472 
1473 #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
1474 
1475 #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
1476 
1477 #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
1478 
1479 #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
1480 
1481  
1482 
1483  
1484 
1485 /* Hash a single 512-bit block. This is the core of the algorithm. */
1486 
1487  
1488 
1489 void SHA1Transform(unsigned long state[5], unsigned char buffer[64])
1490 
1491 {
1492 
1493 unsigned long a, b, c, d, e;
1494 
1495 typedef union {
1496 
1497     unsigned char c[64];
1498 
1499     unsigned long l[16];
1500 
1501 } CHAR64LONG16;
1502 
1503 CHAR64LONG16* block;
1504 
1505 #ifdef SHA1HANDSOFF
1506 
1507 static unsigned char workspace[64];
1508 
1509     block = (CHAR64LONG16*)workspace;
1510 
1511     memcpy(block, buffer, 64);
1512 
1513 #else
1514 
1515     block = (CHAR64LONG16*)buffer;
1516 
1517 #endif
1518 
1519     /* Copy context->state[] to working vars */
1520 
1521     a = state[0];
1522 
1523     b = state[1];
1524 
1525     c = state[2];
1526 
1527     d = state[3];
1528 
1529     e = state[4];
1530 
1531     /* 4 rounds of 20 operations each. Loop unrolled. */
1532 
1533     R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
1534 
1535     R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
1536 
1537     R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
1538 
1539     R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
1540 
1541     R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
1542 
1543     R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
1544 
1545     R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
1546 
1547     R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
1548 
1549     R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
1550 
1551     R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
1552 
1553     R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
1554 
1555     R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
1556 
1557     R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
1558 
1559     R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
1560 
1561     R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
1562 
1563     R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
1564 
1565     R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
1566 
1567     R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
1568 
1569     R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
1570 
1571     R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
1572 
1573     /* Add the working vars back into context.state[] */
1574 
1575     state[0] += a;
1576 
1577     state[1] += b;
1578 
1579     state[2] += c;
1580 
1581     state[3] += d;
1582 
1583     state[4] += e;
1584 
1585     /* Wipe variables */
1586 
1587     a = b = c = d = e = 0;
1588 
1589 }
1590 
1591  
1592 
1593  
1594 
1595 /* SHA1Init - Initialize new context */
1596 
1597  
1598 
1599 void SHA1Init(SHA1_CTX* context)
1600 
1601 {
1602 
1603     /* SHA1 initialization constants */
1604 
1605     context->state[0] = 0x67452301;
1606 
1607     context->state[1] = 0xEFCDAB89;
1608 
1609     context->state[2] = 0x98BADCFE;
1610 
1611     context->state[3] = 0x10325476;
1612 
1613     context->state[4] = 0xC3D2E1F0;
1614 
1615     context->count[0] = context->count[1] = 0;
1616 
1617 }
1618 
1619  
1620 
1621  
1622 
1623 /* Run your data through this. */
1624 
1625  
1626 
1627 void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len)
1628 
1629 {
1630 
1631 unsigned int i, j;
1632 
1633  
1634 
1635     j = (context->count[0] >> 3) & 63;
1636 
1637     if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++;
1638 
1639     context->count[1] += (len >> 29);
1640 
1641     if ((j + len) > 63) {
1642 
1643         memcpy(&context->buffer[j], data, (i = 64-j));
1644 
1645         SHA1Transform(context->state, context->buffer);
1646 
1647         for ( ; i + 63 < len; i += 64) {
1648 
1649             SHA1Transform(context->state, &data[i]);
1650 
1651         }
1652 
1653         j = 0;
1654 
1655     }
1656 
1657     else i = 0;
1658 
1659     memcpy(&context->buffer[j], &data[i], len - i);
1660 
1661 }
1662 
1663  
1664 
1665  
1666 
1667 /* Add padding and return the message digest. */
1668 
1669  
1670 
1671 void SHA1Final(unsigned char digest[20], SHA1_CTX* context)
1672 
1673 {
1674 
1675 unsigned long i, j;
1676 
1677 unsigned char finalcount[8];
1678 
1679  
1680 
1681     for (i = 0; i < 8; i++) {
1682 
1683         finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
1684 
1685          >> ((3-(i & 3)) * 8) ) & 255);  /* Endian independent */
1686 
1687     }
1688 
1689     SHA1Update(context, (unsigned char *)"\200", 1);
1690 
1691     while ((context->count[0] & 504) != 448) {
1692 
1693         SHA1Update(context, (unsigned char *)"\0", 1);
1694 
1695     }
1696 
1697     SHA1Update(context, finalcount, 8);  /* Should cause a SHA1Transform() */
1698 
1699     for (i = 0; i < 20; i++) {
1700 
1701         digest[i] = (unsigned char)
1702 
1703          ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
1704 
1705     }
1706 
1707     /* Wipe variables */
1708 
1709     i = j = 0;
1710 
1711     memset(context->buffer, 0, 64);
1712 
1713     memset(context->state, 0, 20);
1714 
1715     memset(context->count, 0, 8);
1716 
1717     memset(finalcount, 0, 8);
1718 
1719 #ifdef SHA1HANDSOFF  /* make SHA1Transform overwrite it's own static vars */
1720 
1721     SHA1Transform(context->state, context->buffer);
1722 
1723 #endif
1724 
1725 }
1726 
1727  
1728 
1729  
1730 
1731 /*************************************************************/
1732 
1733  
1734 
1735  
1736 
1737 int main(int argc, char** argv)
1738 
1739 {
1740 
1741 int i, j;
1742 
1743 SHA1_CTX context;
1744 
1745 unsigned char digest[20], buffer[16384];
1746 
1747 FILE* file;
1748 
1749  
1750 
1751     if (argc > 2) {
1752 
1753         puts("Public domain SHA-1 implementation - by Steve Reid <steve@edmweb.com>");
1754 
1755         puts("Produces the SHA-1 hash of a file, or stdin if no file is specified.");
1756 
1757         exit(0);
1758 
1759     }
1760 
1761     if (argc < 2) {
1762 
1763         file = stdin;
1764 
1765     }
1766 
1767     else {
1768 
1769         if (!(file = fopen(argv[1], "rb"))) {
1770 
1771             fputs("Unable to open file.", stderr);
1772 
1773             exit(-1);
1774 
1775         }
1776 
1777     }
1778 
1779     SHA1Init(&context);
1780 
1781     while (!feof(file)) {  /* note: what if ferror(file) */
1782 
1783         i = fread(buffer, 1, 16384, file);
1784 
1785         SHA1Update(&context, buffer, i);
1786 
1787     }
1788 
1789     SHA1Final(digest, &context);
1790 
1791     fclose(file);
1792 
1793     for (i = 0; i < 5; i++) {
1794 
1795         for (j = 0; j < 4; j++) {
1796 
1797             printf("%02X", digest[i*4+j]);
1798 
1799         }
1800 
1801         putchar(' ');
1802 
1803     }
1804 
1805     putchar('\n');
1806 
1807     exit(0);
1808 
1809 }
1810 
1811  
1812 
1813 RSA Crypto Toolkit Totality
1814 
1815 /* RSAREF.H - header file for RSAREF cryptographic toolkit
1816 
1817  */
1818 
1819  
1820 
1821 /* Copyright (C) RSA Laboratories, a division of RSA Data Security,
1822 
1823      Inc., created 1991. All rights reserved.
1824 
1825  */
1826 
1827  
1828 
1829 #ifndef _RSAREF_H_
1830 
1831 #define _RSAREF_H_ 1
1832 
1833  
1834 
1835 #include "md2.h"
1836 
1837 #include "md5.h"
1838 
1839 #include "des.h"
1840 
1841  
1842 
1843 #ifdef __cplusplus
1844 
1845 extern "C" {
1846 
1847 #endif
1848 
1849  
1850 
1851 /* Message-digest algorithms.
1852 
1853  */
1854 
1855 #define DA_MD2 3
1856 
1857 #define DA_MD5 5
1858 
1859  
1860 
1861 /* Encryption algorithms to be ored with digest algorithm in Seal and Open.
1862 
1863  */
1864 
1865 #define EA_DES_CBC 1
1866 
1867 #define EA_DES_EDE2_CBC 2
1868 
1869 #define EA_DES_EDE3_CBC 3
1870 
1871 #define EA_DESX_CBC 4
1872 
1873  
1874 
1875 /* RSA key lengths.
1876 
1877  */
1878 
1879 #define MIN_RSA_MODULUS_BITS 508
1880 
1881 #define MAX_RSA_MODULUS_BITS 1024
1882 
1883 #define MAX_RSA_MODULUS_LEN ((MAX_RSA_MODULUS_BITS + 7) / 8)
1884 
1885 #define MAX_RSA_PRIME_BITS ((MAX_RSA_MODULUS_BITS + 1) / 2)
1886 
1887 #define MAX_RSA_PRIME_LEN ((MAX_RSA_PRIME_BITS + 7) / 8)
1888 
1889  
1890 
1891 /* Maximum lengths of encoded and encrypted content, as a function of
1892 
1893    content length len. Also, inverse functions.
1894 
1895  */
1896 
1897 #define ENCODED_CONTENT_LEN(len) (4*(len)/3 + 3)
1898 
1899 #define ENCRYPTED_CONTENT_LEN(len) ENCODED_CONTENT_LEN ((len)+8)
1900 
1901 #define DECODED_CONTENT_LEN(len) (3*(len)/4 + 1)
1902 
1903 #define DECRYPTED_CONTENT_LEN(len) (DECODED_CONTENT_LEN (len) - 1)
1904 
1905  
1906 
1907 /* Maximum lengths of signatures, encrypted keys, encrypted
1908 
1909    signatures, and message digests.
1910 
1911  */
1912 
1913 #define MAX_SIGNATURE_LEN MAX_RSA_MODULUS_LEN
1914 
1915 #define MAX_PEM_SIGNATURE_LEN ENCODED_CONTENT_LEN (MAX_SIGNATURE_LEN)
1916 
1917 #define MAX_ENCRYPTED_KEY_LEN MAX_RSA_MODULUS_LEN
1918 
1919 #define MAX_PEM_ENCRYPTED_KEY_LEN ENCODED_CONTENT_LEN (MAX_ENCRYPTED_KEY_LEN)
1920 
1921 #define MAX_PEM_ENCRYPTED_SIGNATURE_LEN \
1922 
1923   ENCRYPTED_CONTENT_LEN (MAX_SIGNATURE_LEN)
1924 
1925 #define MAX_DIGEST_LEN 16
1926 
1927  
1928 
1929 /* Maximum length of Diffie-Hellman parameters.
1930 
1931  */
1932 
1933 #define DH_PRIME_LEN(bits) (((bits) + 7) / 8)
1934 
1935  
1936 
1937 /* Error codes.
1938 
1939  */
1940 
1941 #define RE_CONTENT_ENCODING 0x0400
1942 
1943 #define RE_DATA 0x0401
1944 
1945 #define RE_DIGEST_ALGORITHM 0x0402
1946 
1947 #define RE_ENCODING 0x0403
1948 
1949 #define RE_KEY 0x0404
1950 
1951 #define RE_KEY_ENCODING 0x0405
1952 
1953 #define RE_LEN 0x0406
1954 
1955 #define RE_MODULUS_LEN 0x0407
1956 
1957 #define RE_NEED_RANDOM 0x0408
1958 
1959 #define RE_PRIVATE_KEY 0x0409
1960 
1961 #define RE_PUBLIC_KEY 0x040a
1962 
1963 #define RE_SIGNATURE 0x040b
1964 
1965 #define RE_SIGNATURE_ENCODING 0x040c
1966 
1967 #define RE_ENCRYPTION_ALGORITHM 0x040d
1968 
1969  
1970 
1971 /* Random structure.
1972 
1973  */
1974 
1975 typedef struct {
1976 
1977   unsigned int bytesNeeded;
1978 
1979   unsigned char state[16];
1980 
1981   unsigned int outputAvailable;
1982 
1983   unsigned char output[16];
1984 
1985 } R_RANDOM_STRUCT;
1986 
1987  
1988 
1989 /* RSA public and private key.
1990 
1991  */
1992 
1993 typedef struct {
1994 
1995   unsigned int bits;                           /* length in bits of modulus */
1996 
1997   unsigned char modulus[MAX_RSA_MODULUS_LEN];                    /* modulus */
1998 
1999   unsigned char exponent[MAX_RSA_MODULUS_LEN];           /* public exponent */
2000 
2001 } R_RSA_PUBLIC_KEY;
2002 
2003  
2004 
2005 typedef struct {
2006 
2007   unsigned int bits;                           /* length in bits of modulus */
2008 
2009   unsigned char modulus[MAX_RSA_MODULUS_LEN];                    /* modulus */
2010 
2011   unsigned char publicExponent[MAX_RSA_MODULUS_LEN];     /* public exponent */
2012 
2013   unsigned char exponent[MAX_RSA_MODULUS_LEN];          /* private exponent */
2014 
2015   unsigned char prime[2][MAX_RSA_PRIME_LEN];               /* prime factors */
2016 
2017   unsigned char primeExponent[2][MAX_RSA_PRIME_LEN];   /* exponents for CRT */
2018 
2019   unsigned char coefficient[MAX_RSA_PRIME_LEN];          /* CRT coefficient */
2020 
2021 } R_RSA_PRIVATE_KEY;
2022 
2023  
2024 
2025 /* RSA prototype key.
2026 
2027  */
2028 
2029 typedef struct {
2030 
2031   unsigned int bits;                           /* length in bits of modulus */
2032 
2033   int useFermat4;                        /* public exponent (1 = F4, 0 = 3) */
2034 
2035 } R_RSA_PROTO_KEY;
2036 
2037  
2038 
2039 /* Diffie-Hellman parameters.
2040 
2041  */
2042 
2043 typedef struct {
2044 
2045   unsigned char *prime;                                            /* prime */
2046 
2047   unsigned int primeLen;                                 /* length of prime */
2048 
2049   unsigned char *generator;                                    /* generator */
2050 
2051   unsigned int generatorLen;                         /* length of generator */
2052 
2053 } R_DH_PARAMS;
2054 
2055  
2056 
2057 typedef struct {
2058 
2059   int digestAlgorithm;
2060 
2061   union {
2062 
2063     MD2_CTX md2;
2064 
2065     MD5_CTX md5;
2066 
2067   } context;
2068 
2069 } R_DIGEST_CTX;
2070 
2071  
2072 
2073 typedef struct {
2074 
2075   R_DIGEST_CTX digestContext;
2076 
2077 } R_SIGNATURE_CTX;
2078 
2079  
2080 
2081 typedef struct {
2082 
2083   int encryptionAlgorithm;
2084 
2085   union {
2086 
2087     DES_CBC_CTX des;
2088 
2089     DES3_CBC_CTX des3;
2090 
2091     DESX_CBC_CTX desx;
2092 
2093   } cipherContext;
2094 
2095  
2096 
2097   unsigned char buffer[8];
2098 
2099   unsigned int bufferLen;
2100 
2101 } R_ENVELOPE_CTX;
2102 
2103  
2104 
2105 /* Random structures.
2106 
2107  */
2108 
2109 int R_RandomInit PROTO_LIST ((R_RANDOM_STRUCT *));
2110 
2111 int R_RandomUpdate PROTO_LIST
2112 
2113   ((R_RANDOM_STRUCT *, unsigned char *, unsigned int));
2114 
2115 int R_GetRandomBytesNeeded PROTO_LIST ((unsigned int *, R_RANDOM_STRUCT *));
2116 
2117 void R_RandomFinal PROTO_LIST ((R_RANDOM_STRUCT *));
2118 
2119  
2120 
2121 /* Cryptographic procedures "by parts"
2122 
2123  */
2124 
2125 int R_DigestInit PROTO_LIST ((R_DIGEST_CTX *, int));
2126 
2127 int R_DigestUpdate PROTO_LIST
2128 
2129   ((R_DIGEST_CTX *, unsigned char *, unsigned int));
2130 
2131 int R_DigestFinal PROTO_LIST
2132 
2133   ((R_DIGEST_CTX *, unsigned char *, unsigned int *));
2134 
2135  
2136 
2137 int R_SignInit PROTO_LIST ((R_SIGNATURE_CTX *, int));
2138 
2139 int R_SignUpdate PROTO_LIST
2140 
2141   ((R_SIGNATURE_CTX *, unsigned char *, unsigned int));
2142 
2143 int R_SignFinal PROTO_LIST
2144 
2145   ((R_SIGNATURE_CTX *, unsigned char *, unsigned int *, R_RSA_PRIVATE_KEY *));
2146 
2147  
2148 
2149 int R_VerifyInit PROTO_LIST ((R_SIGNATURE_CTX *, int));
2150 
2151 int R_VerifyUpdate PROTO_LIST
2152 
2153   ((R_SIGNATURE_CTX *, unsigned char *, unsigned int));
2154 
2155 int R_VerifyFinal PROTO_LIST
2156 
2157   ((R_SIGNATURE_CTX *, unsigned char *, unsigned int, R_RSA_PUBLIC_KEY *));
2158 
2159  
2160 
2161 int R_SealInit PROTO_LIST
2162 
2163   ((R_ENVELOPE_CTX *, unsigned char **, unsigned int *, unsigned char [8],
2164 
2165     unsigned int, R_RSA_PUBLIC_KEY **, int, R_RANDOM_STRUCT *));
2166 
2167 int R_SealUpdate PROTO_LIST
2168 
2169   ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *, unsigned char *,
2170 
2171     unsigned int));
2172 
2173 int R_SealFinal PROTO_LIST
2174 
2175   ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *));
2176 
2177  
2178 
2179 int R_OpenInit PROTO_LIST
2180 
2181   ((R_ENVELOPE_CTX *, int, unsigned char *, unsigned int, unsigned char [8],
2182 
2183     R_RSA_PRIVATE_KEY *));
2184 
2185 int R_OpenUpdate PROTO_LIST
2186 
2187   ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *, unsigned char *,
2188 
2189     unsigned int));
2190 
2191 int R_OpenFinal PROTO_LIST
2192 
2193   ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *));
2194 
2195  
2196 
2197 /* Cryptographic enhancements by block.
2198 
2199  */
2200 
2201 int R_SignPEMBlock PROTO_LIST
2202 
2203   ((unsigned char *, unsigned int *, unsigned char *, unsigned int *,
2204 
2205     unsigned char *, unsigned int, int, int, R_RSA_PRIVATE_KEY *));
2206 
2207 int R_SignBlock PROTO_LIST
2208 
2209   ((unsigned char *, unsigned int *, unsigned char *, unsigned int, int,
2210 
2211     R_RSA_PRIVATE_KEY *));
2212 
2213 int R_VerifyPEMSignature PROTO_LIST
2214 
2215   ((unsigned char *, unsigned int *, unsigned char *, unsigned int,
2216 
2217     unsigned char *, unsigned int, int, int, R_RSA_PUBLIC_KEY *));
2218 
2219 int R_VerifyBlockSignature PROTO_LIST
2220 
2221   ((unsigned char *, unsigned int, unsigned char *, unsigned int, int,
2222 
2223     R_RSA_PUBLIC_KEY *));
2224 
2225 int R_SealPEMBlock PROTO_LIST
2226 
2227   ((unsigned char *, unsigned int *, unsigned char *, unsigned int *,
2228 
2229     unsigned char *, unsigned int *, unsigned char [8], unsigned char *,
2230 
2231     unsigned int, int, R_RSA_PUBLIC_KEY *, R_RSA_PRIVATE_KEY *,
2232 
2233     R_RANDOM_STRUCT *));
2234 
2235 int R_OpenPEMBlock PROTO_LIST
2236 
2237   ((unsigned char *, unsigned int *, unsigned char *, unsigned int,
2238 
2239     unsigned char *, unsigned int, unsigned char *, unsigned int,
2240 
2241     unsigned char [8], int, R_RSA_PRIVATE_KEY *, R_RSA_PUBLIC_KEY *));
2242 
2243 int R_DigestBlock PROTO_LIST
2244 
2245   ((unsigned char *, unsigned int *, unsigned char *, unsigned int, int));
2246 
2247  
2248 
2249 /* Printable ASCII encoding and decoding.
2250 
2251  */
2252 
2253 int R_EncodePEMBlock PROTO_LIST
2254 
2255   ((unsigned char *, unsigned int *, unsigned char *, unsigned int));
2256 
2257 int R_DecodePEMBlock PROTO_LIST
2258 
2259   ((unsigned char *, unsigned int *, unsigned char *, unsigned int));
2260 
2261  
2262 
2263 /* Key-pair generation.
2264 
2265  */
2266 
2267 int R_GeneratePEMKeys PROTO_LIST
2268 
2269   ((R_RSA_PUBLIC_KEY *, R_RSA_PRIVATE_KEY *, R_RSA_PROTO_KEY *,
2270 
2271     R_RANDOM_STRUCT *));
2272 
2273  
2274 
2275 /* Diffie-Hellman key agreement.
2276 
2277  */
2278 
2279 int R_GenerateDHParams PROTO_LIST
2280 
2281   ((R_DH_PARAMS *, unsigned int, unsigned int, R_RANDOM_STRUCT *));
2282 
2283 int R_SetupDHAgreement PROTO_LIST
2284 
2285   ((unsigned char *, unsigned char *, unsigned int, R_DH_PARAMS *,
2286 
2287     R_RANDOM_STRUCT *));
2288 
2289 int R_ComputeDHAgreedKey PROTO_LIST
2290 
2291   ((unsigned char *, unsigned char *, unsigned char *, unsigned int,
2292 
2293     R_DH_PARAMS *));
2294 
2295  
2296 
2297 /* Routines supplied by the implementor.
2298 
2299  */
2300 
2301 void R_memset PROTO_LIST ((POINTER, int, unsigned int));
2302 
2303 void R_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
2304 
2305 int R_memcmp PROTO_LIST ((POINTER, POINTER, unsigned int));
2306 
2307  
2308 
2309 #ifdef __cplusplus
2310 
2311 }
2312 
2313 #endif
2314 
2315  
2316 
2317 #endif
2318 
2319 DES Encryption
2320 
2321 /*
2322 
2323  * CDES -- DES encryption package
2324 
2325  * options:
2326 
2327  *   -a   key is in ASCII
2328 
2329  *   -b   use key in old style (ie, don't reset parity bit)
2330 
2331  *            -- default unless key is in ASCII
2332 
2333  *   -c   use CBC (cipher block chaining) mode
2334 
2335  *   -e   use ECB (electronic code book) mode
2336 
2337  *   -f b use b-bit CFB (cipher feedback) mode
2338 
2339  *   -F b use b-bit CFB (cipher feedback) alternative mode
2340 
2341  *   -i   invert (decrypt) input
2342 
2343  *   -m b     generate a MAC of length b
2344 
2345  *   -o b use b-bit OFB (output feedback) mode
2346 
2347  *   -v v use v as the initialization vector (ignored for ECB)
2348 
2349  * note: the last character of the last block is the ASCII digit indicating
2350 
2351  * how many characters of that block are to be output.
2352 
2353  */
2354 
2355 #include <ctype.h>
2356 
2357 #include <stdio.h>
2358 
2359 #define C_NULL     ((char *) NULL)
2360 
2361  
2362 
2363 /*
2364 
2365  * BSD and System V systems offer special library calls that do
2366 
2367  * block moves and fills, so if possible we take advantage of them
2368 
2369  */
2370 
2371 #ifdef BSD4
2372 
2373 #    define     MEMCPY(dest,src,len)     bcopy((src),(dest),(len))
2374 
2375 #    define     MEMZERO(dest,len)     bzero((dest),(len))
2376 
2377 #else
2378 
2379 #ifdef SYSV
2380 
2381 #    include <memory.h>
2382 
2383 #    define     MEMCPY(dest,src,len)     (void) memcpy((dest),(src),(len))
2384 
2385 #    define     MEMZERO(dest,len)   (void) memset((dest),'\0',(len))
2386 
2387 #else
2388 
2389 #    define     MEMCPY(dest,src,len)                  \
2390 
2391               {                        \
2392 
2393                    register int i1;       \
2394 
2395                    for(i1 = 0; i1 < (len); i1++)     \
2396 
2397                         (dest)[i1] = (src)[i1];  \
2398 
2399               }
2400 
2401 #    define     MEMZERO(dest,len)                 \
2402 
2403               {                        \
2404 
2405                    register int i1;       \
2406 
2407                    for(i1 = 0; i1 < (len); i1++)     \
2408 
2409                         (dest)[i1] = '\0';   \
2410 
2411               }
2412 
2413 #endif
2414 
2415 #endif
2416 
2417  
2418 
2419 /*
2420 
2421  * these "hide" the calls to the primitive encryption routines
2422 
2423  */
2424 
2425 #define     DES_KEY(buf)   {                            \
2426 
2427                    char bits1[64];     /* bits of key */    \
2428 
2429                    expand(buf, bits1);          \
2430 
2431                    setkey(bits1);               \
2432 
2433               }
2434 
2435 #define DES_XFORM(buf) {                            \
2436 
2437                    char bits1[64];     /* bits of message */    \
2438 
2439                    expand(buf, bits1);          \
2440 
2441                    encrypt(bits1, inverse);      \
2442 
2443                    compress(bits1, buf);             \
2444 
2445               }
2446 
2447  
2448 
2449 /*
2450 
2451  * this does an error-checking write
2452 
2453  */
2454 
2455 #define     READ(buf, n)   fread(buf, sizeof(char), n, stdin)
2456 
2457 #define WRITE(buf,n)                          \
2458 
2459           if (fwrite(buf, sizeof(char), n, stdout) != n)   \
2460 
2461                err(1, bn, C_NULL);
2462 
2463  
2464 
2465 /*
2466 
2467  * some things to make references easier
2468 
2469  */
2470 
2471 typedef char Desbuf[8];
2472 
2473 #define     CHAR(x,i)     (x[i])
2474 
2475 #define     UCHAR(x,i)     (x[i])
2476 
2477 #define     BUFFER(x)     (x)
2478 
2479 #define     UBUFFER(x)     (x)
2480 
2481  
2482 
2483 /*
2484 
2485  * global variables and related macros
2486 
2487  */
2488 
2489 #define KEY_DEFAULT        0    /* interpret radix of key from key */
2490 
2491 #define KEY_ASCII     1     /* key is in ASCII characters */
2492 
2493 int keybase = KEY_DEFAULT;     /* how to interpret the key */
2494 
2495  
2496 
2497 #define MODE_ENCRYPT       0x01 /* encrypt */
2498 
2499 #define MODE_DECRYPT       0x02 /* decrypt */
2500 
2501 #define MODE_AUTHENTICATE   0x04 /* authenticate */
2502 
2503 #define GET_DIRECTION      ((mode)&0xf)
2504 
2505 #define ISSET_MODE_DIRECTION     (GET_DIRECTION != 0)
2506 
2507 #define MODE_ECB       0x10 /* ECB mode */
2508 
2509 #define MODE_CBC       0x20 /* CBC mode */
2510 
2511 #define     MODE_CFB       0x30 /* cipher feedback mode */
2512 
2513 #define MODE_OFB       0x40 /* output feedback mode */
2514 
2515 #define     MODE_CFBA      0x50 /* alternative cipher feedback mode */
2516 
2517 #define GET_ALGORITHM      ((mode)&0xf0)
2518 
2519 #define ISSET_MODE_ALGORITHM     (GET_ALGORITHM != 0)
2520 
2521 int mode = 0;           /* how to run */
2522 
2523  
2524 
2525 char *keyrep = "*********";     /* replaces command-line key */
2526 
2527 Desbuf ivec;            /* initialization vector */
2528 
2529 char bits[] = { '\200', '\100',     /* used to extract bits from a char */
2530 
2531           '\040', '\020', '\010', '\004', '\002', '\001' };
2532 
2533 int inverse = 0;        /* 0 ti encrypt, 1 to decrypt */
2534 
2535 char *progname = "des program"; /* program name */
2536 
2537 int parity = 1;               /* 0 to reset key parity bits */
2538 
2539 int macbits = -1;        /* number of bits in authentication */
2540 
2541 int fbbits = -1;        /* number of feedback bits */
2542 
2543 char *dummyargs[] = { "*****", NULL };   /* argument list to be printed */
2544 
2545  
2546 
2547 /*
2548 
2549  * library hooks
2550 
2551  */
2552 
2553                    /* see getopt(3) */
2554 
2555 extern int optind;        /* option (argument) number */
2556 
2557 extern char *optarg;       /* argument to option if any */
2558 
2559  
2560 
2561 /*
2562 
2563  * library functions
2564 
2565  */
2566 
2567 char *sprintf();        /* in core formatted print */
2568 
2569 char *getpass();        /* get a password from a terminal */
2570 
2571  
2572 
2573 main(argc, argv)
2574 
2575 int argc;
2576 
2577 char **argv;
2578 
2579 {
2580 
2581      register int i;         /* counter in a for loop */
2582 
2583      register char *p;  /* used to obtain the key */
2584 
2585      int n;              /* number of command-line errors */
2586 
2587      Desbuf msgbuf;        /* I/O buffer */
2588 
2589      int nargs;          /* internal number of arguments */
2590 
2591      char **arglist;         /* internal argument list */
2592 
2593  
2594 
2595      /*
2596 
2597       * hide the arguments
2598 
2599       */
2600 
2601      nargs = argc;
2602 
2603      argc = 1;
2604 
2605      arglist = argv;
2606 
2607      argv = dummyargs;
2608 
2609  
2610 
2611      /*
2612 
2613       * initialize the initialization vctor
2614 
2615       */
2616 
2617      for(i = 0; i < 8; i++)
2618 
2619           UCHAR(ivec, i) = 0x00;
2620 
2621  
2622 
2623      /*
2624 
2625       * process the argument list
2626 
2627       */
2628 
2629      progname = arglist[0];
2630 
2631      n = 0;
2632 
2633      while ((i = getopt(nargs, arglist, "abceF:f:im:o:v:")) != EOF)
2634 
2635           switch(i){
2636 
2637           case 'a':      /* key is ASCII */
2638 
2639                keybase = KEY_ASCII;
2640 
2641                break;
2642 
2643           case 'b':      /* don't reset parity bit */
2644 
2645                parity = 0;
2646 
2647                break;
2648 
2649           case 'c':      /* use CBC mode */
2650 
2651                if (ISSET_MODE_ALGORITHM)
2652 
2653                     err(1, -1, "two modes of operation specified");
2654 
2655                mode |= MODE_CBC;
2656 
2657                break;
2658 
2659           case 'e':      /* use ECB mode */
2660 
2661                if (ISSET_MODE_ALGORITHM)
2662 
2663                    err(1, -1, "two modes of operation specified");
2664 
2665                mode |= MODE_ECB;
2666 
2667                break;
2668 
2669           case 'F':      /* use alternative CFB mode */
2670 
2671                if (ISSET_MODE_ALGORITHM)
2672 
2673                    err(1, -1, "two modes of operation specified");
2674 
2675                mode |= MODE_CFBA;
2676 
2677                if ((fbbits = setbits(optarg, 7)) > 56 || fbbits == 0)
2678 
2679                err(1, -1, "-F: number must be 1-56 inclusive");
2680 
2681                else if (fbbits == -1)
2682 
2683                err(1, -1, "-F: number must be a multiple of 7");
2684 
2685                break;
2686 
2687           case 'f':      /* use CFB mode */
2688 
2689                if (ISSET_MODE_ALGORITHM)
2690 
2691                    err(1, -1, "two modes of operation specified");
2692 
2693                mode |= MODE_CFB;
2694 
2695                if ((fbbits = setbits(optarg, 8)) > 64 || fbbits == 0)
2696 
2697                err(1, -1, "-f: number must be 1-64 inclusive");
2698 
2699                else if (fbbits == -1)
2700 
2701                err(1, -1, "-f: number must be a multiple of 8");
2702 
2703                break;
2704 
2705           case 'i':      /* decrypt */
2706 
2707                if (ISSET_MODE_DIRECTION)
2708 
2709                    err(1, -1, "only one of -i and -m allowed");
2710 
2711                mode |= MODE_DECRYPT;
2712 
2713                break;
2714 
2715           case 'm':      /* number of bits for MACing */
2716 
2717                if (ISSET_MODE_DIRECTION)
2718 
2719                    err(1, -1, "only one of -i and -m allowed");
2720 
2721                mode |= MODE_AUTHENTICATE;
2722 
2723                if ((macbits = setbits(optarg, 1)) > 64)
2724 
2725                err(1, -1, "-m: number must be 0-64 inclusive");
2726 
2727                break;
2728 
2729           case 'o':      /* use OFB mode */
2730 
2731                if (ISSET_MODE_ALGORITHM)
2732 
2733                    err(1, -1, "two modes of operation specified");
2734 
2735                mode |= MODE_OFB;
2736 
2737                if ((fbbits = setbits(optarg, 8)) > 64 || fbbits == 0)
2738 
2739                err(1, -1, "-o: number must be 1-64 inclusive");
2740 
2741                else if (fbbits == -1)
2742 
2743                err(1, -1, "-o: number must be a multiple of 8");
2744 
2745                break;
2746 
2747           case 'v':      /* set initialization vector */
2748 
2749                cvtkey(BUFFER(ivec), optarg);
2750 
2751                break;
2752 
2753           default:       /* error */
2754 
2755                n++;
2756 
2757                break;
2758 
2759           }
2760 
2761      /*
2762 
2763       * on error, quit
2764 
2765       */
2766 
2767      if (n > 0)
2768 
2769           exit(1);
2770 
2771      /*
2772 
2773       * if no direction set, default to encryption
2774 
2775       */
2776 
2777      if (!ISSET_MODE_DIRECTION)
2778 
2779           mode |= MODE_ENCRYPT;
2780 
2781      if (!ISSET_MODE_ALGORITHM)
2782 
2783           mode |= MODE_ECB;
2784 
2785  
2786 
2787      /*
2788 
2789       * pick up the key
2790 
2791       * -- if there are no more arguments, prompt for it
2792 
2793       * -- if there is 1 more argument, use it as the key
2794 
2795       * -- if there are 2 or more arguments, error
2796 
2797       */
2798 
2799      if (optind == nargs){
2800 
2801           /*
2802 
2803            * if the key's not ASCII, can't do this since
2804 
2805            * only the first 8 chars are significant
2806 
2807            */
2808 
2809           if (keybase != KEY_ASCII)
2810 
2811                err(1, -1,
2812 
2813                "you must enter non-ASCII keys on the command line");
2814 
2815           /*
2816 
2817            * get the key
2818 
2819            */
2820 
2821           if ((p = getpass("Enter key: ")) == NULL)
2822 
2823                err(1, -1, "no key given");
2824 
2825           /*
2826 
2827            * copy it, nul-padded, into the key area
2828 
2829            */
2830 
2831           strncpy(BUFFER(msgbuf), p, 8);
2832 
2833      }
2834 
2835      else if (optind + 1 == nargs){
2836 
2837           /*
2838 
2839            * obtain the bit form of the key
2840 
2841            * and hide it from a "ps"
2842 
2843            */
2844 
2845           cvtkey(BUFFER(msgbuf), arglist[optind]);
2846 
2847           arglist[optind] = keyrep;
2848 
2849      }
2850 
2851      else{
2852 
2853           /*
2854 
2855            * extra arguments -- bomb
2856 
2857            */
2858 
2859           err(1, -1, "extraneous arguments");
2860 
2861      }
2862 
2863  
2864 
2865  
2866 
2867      /*
2868 
2869       * main loop
2870 
2871       */
2872 
2873      switch(mode){
2874 
2875      case MODE_ECB|MODE_ENCRYPT:        /* encrypt using ECB mode */
2876 
2877                    inverse = 0;
2878 
2879                    makekey(msgbuf);
2880 
2881                    ecbenc();
2882 
2883                    break;
2884 
2885      case MODE_ECB|MODE_DECRYPT:        /* decrypt using ECB mode */
2886 
2887                    inverse = 1;
2888 
2889                    makekey(msgbuf);
2890 
2891                    ecbdec();
2892 
2893                    break;
2894 
2895      case MODE_ECB|MODE_AUTHENTICATE:     /* authenticate using ECB */
2896 
2897                    err(1, -1, "can't authenticate with ECB mode");
2898 
2899                    break;
2900 
2901      case MODE_CBC|MODE_ENCRYPT:        /* encrypt using CBC mode */
2902 
2903                    inverse = 0;
2904 
2905                    makekey(msgbuf);
2906 
2907                    cbcenc();
2908 
2909                    break;
2910 
2911      case MODE_CBC|MODE_DECRYPT:        /* decrypt using CBC mode */
2912 
2913                    inverse = 1;
2914 
2915                    makekey(msgbuf);
2916 
2917                    cbcdec();
2918 
2919                    break;
2920 
2921      case MODE_CBC|MODE_AUTHENTICATE:     /* authenticate using CBC */
2922 
2923                    inverse = 0;
2924 
2925                    makekey(msgbuf);
2926 
2927                    cbcauth();
2928 
2929                    break;
2930 
2931      case MODE_CFB|MODE_ENCRYPT:        /* encrypt using CFB mode */
2932 
2933                    inverse = 0;
2934 
2935                    makekey(msgbuf);
2936 
2937                    cfbenc();
2938 
2939                    break;
2940 
2941      case MODE_CFB|MODE_DECRYPT:        /* decrypt using CFB mode */
2942 
2943                    inverse = 0;
2944 
2945                    makekey(msgbuf);
2946 
2947                    cfbdec();
2948 
2949                    break;
2950 
2951      case MODE_CFB|MODE_AUTHENTICATE:     /* authenticate using CFB */
2952 
2953                    inverse = 0;
2954 
2955                    makekey(msgbuf);
2956 
2957                    cfbauth();
2958 
2959                    break;
2960 
2961      case MODE_CFBA|MODE_ENCRYPT:       /* alternative CFB mode */
2962 
2963                    inverse = 0;
2964 
2965                    makekey(msgbuf);
2966 
2967                    cfbaenc();
2968 
2969                    break;
2970 
2971      case MODE_CFBA|MODE_DECRYPT:       /* alternative CFB mode */
2972 
2973                    inverse = 0;
2974 
2975                    makekey(msgbuf);
2976 
2977                    cfbadec();
2978 
2979                    break;
2980 
2981      case MODE_OFB|MODE_ENCRYPT:        /* encrypt using OFB mode */
2982 
2983                    inverse = 0;
2984 
2985                    makekey(msgbuf);
2986 
2987                    ofbenc();
2988 
2989                    break;
2990 
2991      case MODE_OFB|MODE_DECRYPT:        /* decrypt using OFB mode */
2992 
2993                    inverse = 0;
2994 
2995                    makekey(msgbuf);
2996 
2997                    ofbdec();
2998 
2999                    break;
3000 
3001      default:            /* unimplemented */
3002 
3003                    err(1, -1, "can't handle that yet");
3004 
3005                    break;
3006 
3007      }
3008 
3009      exit(0);
3010 
3011  
3012 
3013 }
3014 
3015  
3016 
3017 /*
3018 
3019  * print a warning message and, possibly, terminate
3020 
3021  */
3022 
3023 err(f, n, s)
3024 
3025 int f;             /* >0 if fatal (status code), 0 if not */
3026 
3027 int n;             /* offending block number */
3028 
3029 char *s;       /* the message */
3030 
3031 {
3032 
3033      char tbuf[BUFSIZ];
3034 
3035  
3036 
3037      if (n > 0)
3038 
3039           (void) sprintf(tbuf, "%s (block %d)", progname, n);
3040 
3041      else
3042 
3043           (void) sprintf(tbuf, "%s", progname);
3044 
3045      if (s == C_NULL)
3046 
3047           perror(tbuf);
3048 
3049      else
3050 
3051           fprintf(stderr, "%s: %s\n", tbuf, s);
3052 
3053      if (f > 0)
3054 
3055           exit(f);
3056 
3057 }
3058 
3059  
3060 
3061 /*
3062 
3063  * map a hex character to an integer
3064 
3065  */
3066 
3067 int tohex(c)
3068 
3069 char c;
3070 
3071 {
3072 
3073      switch(c){
3074 
3075      case '0':      return(0x0);
3076 
3077      case '1':      return(0x1);
3078 
3079      case '2':      return(0x2);
3080 
3081      case '3':      return(0x3);
3082 
3083      case '4':      return(0x4);
3084 
3085      case '5':      return(0x5);
3086 
3087      case '6':      return(0x6);
3088 
3089      case '7':      return(0x7);
3090 
3091      case '8':      return(0x8);
3092 
3093      case '9':      return(0x9);
3094 
3095      case 'A': case 'a':     return(0xa);
3096 
3097      case 'B': case 'b':     return(0xb);
3098 
3099      case 'C': case 'c':     return(0xc);
3100 
3101      case 'D': case 'd':     return(0xd);
3102 
3103      case 'E': case 'e':     return(0xe);
3104 
3105      case 'F': case 'f':     return(0xf);
3106 
3107      }
3108 
3109      /*
3110 
3111       * invalid character
3112 
3113       */
3114 
3115      return(-1);
3116 
3117 }
3118 
3119  
3120 
3121 /*
3122 
3123  * convert the key to a bit pattern
3124 
3125  */
3126 
3127 cvtkey(obuf, ibuf)
3128 
3129 char *obuf;
3130 
3131 char *ibuf;
3132 
3133 {
3134 
3135      register int i;             /* counter in a for loop */
3136 
3137      int nbuf[16];          /* used for hes/key translation */
3138 
3139  
3140 
3141      /*
3142 
3143       * just switch on the key base
3144 
3145       */
3146 
3147      switch(keybase){
3148 
3149      case KEY_ASCII:              /* ascii to integer */
3150 
3151           (void) strncpy(obuf, ibuf, 8);
3152 
3153           return;
3154 
3155      case KEY_DEFAULT:       /* tell from context */
3156 
3157           /*
3158 
3159            * leading '0x' or '0X' == hex key
3160 
3161            */
3162 
3163           if (ibuf[0] == '0' && (ibuf[1] == 'x' || ibuf[1] == 'x')){
3164 
3165                ibuf = &ibuf[2];
3166 
3167                /*
3168 
3169                * now translate it,m bombing on any illegal hex digit
3170 
3171                */
3172 
3173                for(i = 0; ibuf[i] && i < 16; i++)
3174 
3175                    if ((nbuf[i] = tohex(ibuf[i])) == -1)
3176 
3177                         err(1, -1, "bad hex digit in key");
3178 
3179                while(i < 16)
3180 
3181                    nbuf[i++] = 0;
3182 
3183                for(i = 0; i < 8; i++)
3184 
3185                    obuf[i] = ((nbuf[2*i]&0xf)<<4)|
3186 
3187                                  (nbuf[2*i+1]&0xf);
3188 
3189                parity = 0;
3190 
3191                return;
3192 
3193           }
3194 
3195           /*
3196 
3197            * no special leader -- ASCII
3198 
3199            */
3200 
3201           (void) strncpy(obuf, ibuf, 8);
3202 
3203      }
3204 
3205 }
3206 
3207  
3208 
3209 /*
3210 
3211  * convert an ASCII string into a decimal number:
3212 
3213  * 1. must be between 0 and 64 inclusive
3214 
3215  * 2. must be a valid decimal number
3216 
3217  * 3. must be a multiple of mult
3218 
3219  */
3220 
3221 setbits(s, mult)
3222 
3223 char *s;
3224 
3225 {
3226 
3227      register char *p;
3228 
3229      register int n = 0;
3230 
3231  
3232 
3233      /*
3234 
3235       * skip white space
3236 
3237       */
3238 
3239      while (isspace(*s))
3240 
3241           s++;
3242 
3243      /*
3244 
3245       * get the integer
3246 
3247       */
3248 
3249      for(p = s; *p; p++){
3250 
3251           if (isdigit(*p))
3252 
3253               n = n * 10 + *p - '0';
3254 
3255           else{
3256 
3257                err(1, -1, "bad decimal digit in MAC length");
3258 
3259           }
3260 
3261      }
3262 
3263      /*
3264 
3265       * be sure it's a multiple of mult
3266 
3267       */
3268 
3269      return((n % mult != 0) ? -1 : n);
3270 
3271 }
3272 
3273  
3274 
3275 /*****************
3276 
3277  * DES FUNCTIONS *
3278 
3279  *****************/
3280 
3281 /*
3282 
3283  * This sets the DES key and (if you're using the deszip version)
3284 
3285  * the direction of the transformation.  Note there are two ways
3286 
3287  * to map the 64-bit key onto the 56 bits that the key schedule
3288 
3289  * generation routines use: the old way, which just uses the user-
3290 
3291  * supplied 64 bits as is, and the new way, which resets the parity
3292 
3293  * bit to be the same as the low-order bit in each character.  The
3294 
3295  * new way generates a greater variety of key schedules, since many
3296 
3297  * systems set the parity (high) bit of each character to 0, and the
3298 
3299  * DES ignores the low order bit of each character.
3300 
3301  */
3302 
3303 makekey(buf)
3304 
3305 Desbuf buf;             /* key block */
3306 
3307 {
3308 
3309      register int i;             /* counter in a for loop */
3310 
3311      /*
3312 
3313       * if using new key arrangement, reset the parity bit
3314 
3315       * to be the same as the low-order bit
3316 
3317       */
3318 
3319      if (parity){
3320 
3321           for(i = 0; i < 8; i++)
3322 
3323                UCHAR(buf, i) = (UCHAR(buf, i)&0177)|
3324 
3325                              ((UCHAR(buf, i)&01)<<7);
3326 
3327      }
3328 
3329      /*
3330 
3331       * Make the key schedule
3332 
3333       */
3334 
3335      DES_KEY(UBUFFER(buf));
3336 
3337 }
3338 
3339  
3340 
3341 /*
3342 
3343  * This encrypts using the Electronic Code Book mode of DES
3344 
3345  */
3346 
3347 ecbenc()
3348 
3349 {
3350 
3351      register int n;         /* number of bytes actually read */
3352 
3353      register int bn;   /* block number */
3354 
3355      Desbuf msgbuf;        /* I/O buffer */
3356 
3357  
3358 
3359      for(bn = 0; (n = READ(BUFFER(msgbuf),  8)) == 8; bn++){
3360 
3361           /*
3362 
3363            * do the transformation
3364 
3365            */
3366 
3367           DES_XFORM(UBUFFER(msgbuf));
3368 
3369           WRITE(BUFFER(msgbuf), 8);
3370 
3371      }
3372 
3373      /*
3374 
3375       * at EOF or last block -- in either ase, the last byte contains
3376 
3377       * the character representation of the number of bytes in it
3378 
3379       */
3380 
3381      bn++;
3382 
3383      MEMZERO(&CHAR(msgbuf, n), 8 - n);
3384 
3385      CHAR(msgbuf, 7) = '0' + n;
3386 
3387      DES_XFORM(UBUFFER(msgbuf));
3388 
3389      WRITE(BUFFER(msgbuf), 8);
3390 
3391  
3392 
3393 }
3394 
3395  
3396 
3397 /*
3398 
3399  * This decrypts using the Electronic Code Book mode of DES
3400 
3401  */
3402 
3403 ecbdec()
3404 
3405 {
3406 
3407      register int n;         /* number of bytes actually read */
3408 
3409      register int c;         /* used to test for EOF */
3410 
3411      register int bn;   /* block number */
3412 
3413      Desbuf msgbuf;        /* I/O buffer */
3414 
3415  
3416 
3417      for(bn = 1; (n = READ(BUFFER(msgbuf), 8)) == 8; bn++){
3418 
3419           /*
3420 
3421            * do the transformation
3422 
3423            */
3424 
3425           DES_XFORM(UBUFFER(msgbuf));
3426 
3427           /*
3428 
3429            * if the last one, handle it specially
3430 
3431            */
3432 
3433           if ((c = getchar()) == EOF){
3434 
3435                if ((n = (CHAR(msgbuf, 7) - '0')) < 0 || n > 7)
3436 
3437                    err(1, bn,
3438 
3439                         "decryption failed (block corrupted)");
3440 
3441           }
3442 
3443           else
3444 
3445                (void) ungetc(c, stdin);
3446 
3447           WRITE(BUFFER(msgbuf), n);
3448 
3449      }
3450 
3451      if (n > 0)
3452 
3453           err(1, bn, "decryption failed (incomplete block)");
3454 
3455 }
3456 
3457  
3458 
3459 /*
3460 
3461  * This encrypts using the Cipher Block Chaining mode of DES
3462 
3463  */
3464 
3465 cbcenc()
3466 
3467 {
3468 
3469      register int n;         /* number of bytes actually read */
3470 
3471      register int bn;   /* block number */
3472 
3473      Desbuf msgbuf;        /* I/O buffer */
3474 
3475  
3476 
3477      /*
3478 
3479       * do the transformation
3480 
3481       */
3482 
3483      for(bn = 1; (n = READ(BUFFER(msgbuf), 8)) == 8; bn++){
3484 
3485           for(n = 0; n < 8; n++)
3486 
3487                CHAR(msgbuf, n) ^= CHAR(ivec, n);
3488 
3489           DES_XFORM(UBUFFER(msgbuf));
3490 
3491           MEMCPY(BUFFER(ivec), BUFFER(msgbuf), 8);
3492 
3493           WRITE(BUFFER(msgbuf), 8);
3494 
3495      }
3496 
3497      /*
3498 
3499       * at EOF or last block -- in either case, the last byte contains
3500 
3501       * the character representation of the number of bytes in it
3502 
3503       */
3504 
3505      bn++;
3506 
3507      MEMZERO(&CHAR(msgbuf, n), 8 - n);
3508 
3509      CHAR(msgbuf, 7) = '0' + n;
3510 
3511      for(n = 0; n < 8; n++)
3512 
3513           CHAR(msgbuf, n) ^= CHAR(ivec, n);
3514 
3515      DES_XFORM(UBUFFER(msgbuf));
3516 
3517      WRITE(BUFFER(msgbuf), 8);
3518 
3519  
3520 
3521 }
3522 
3523  
3524 
3525 /*
3526 
3527  * This decrypts using the Cipher Block Chaining mode of DES
3528 
3529  */
3530 
3531 cbcdec()
3532 
3533 {
3534 
3535      register int n;         /* number of bytes actually read */
3536 
3537      Desbuf msgbuf;        /* I/O buffer */
3538 
3539      Desbuf ibuf;          /* temp buffer for initialization vector */
3540 
3541      register int c;         /* used to test for EOF */
3542 
3543      register int bn;   /* block number */
3544 
3545  
3546 
3547      for(bn = 0; (n = READ(BUFFER(msgbuf), 8)) == 8; bn++){
3548 
3549           /*
3550 
3551            * do the transformation
3552 
3553            */
3554 
3555           MEMCPY(BUFFER(ibuf), BUFFER(msgbuf), 8);
3556 
3557           DES_XFORM(UBUFFER(msgbuf));
3558 
3559           for(c = 0; c < 8; c++)
3560 
3561                UCHAR(msgbuf, c) ^= UCHAR(ivec, c);
3562 
3563           MEMCPY(BUFFER(ivec), BUFFER(ibuf), 8);
3564 
3565           /*
3566 
3567            * if the last one, handle it specially
3568 
3569            */
3570 
3571           if ((c = getchar()) == EOF){
3572 
3573                if ((n = (CHAR(msgbuf, 7) - '0')) < 0 || n > 7)
3574 
3575                    err(1, bn,
3576 
3577                         "decryption failed (block corrupted)");
3578 
3579           }
3580 
3581           else
3582 
3583                (void) ungetc(c, stdin);
3584 
3585           WRITE(BUFFER(msgbuf), n);
3586 
3587      }
3588 
3589      if (n > 0)
3590 
3591           err(1, bn, "decryption failed (incomplete block)");
3592 
3593 }
3594 
3595  
3596 
3597 /*
3598 
3599  * This authenticates using the Cipher Block Chaining mode of DES
3600 
3601  */
3602 
3603 cbcauth()
3604 
3605 {
3606 
3607      register int n;         /* number of bytes actually read */
3608 
3609      Desbuf msgbuf;        /* I/O buffer */
3610 
3611      Desbuf encbuf;        /* encryption buffer */
3612 
3613  
3614 
3615      /*
3616 
3617       * do the transformation
3618 
3619       * note we DISCARD the encrypted block;
3620 
3621       * we only care about the last one
3622 
3623       */
3624 
3625      while ((n = READ(BUFFER(msgbuf), 8)) == 8){
3626 
3627           for(n = 0; n < 8; n++)
3628 
3629                CHAR(encbuf, n) = CHAR(msgbuf, n) ^ CHAR(ivec, n);
3630 
3631           DES_XFORM(UBUFFER(encbuf));
3632 
3633           MEMCPY(BUFFER(ivec), BUFFER(encbuf), 8);
3634 
3635      }
3636 
3637      /*
3638 
3639       * now compute the last one, right padding with '\0' if need be
3640 
3641       */
3642 
3643      if (n > 0){
3644 
3645           MEMZERO(&CHAR(msgbuf, n), 8 - n);
3646 
3647           for(n = 0; n < 8; n++)
3648 
3649                CHAR(encbuf, n) = CHAR(msgbuf, n) ^ CHAR(ivec, n);
3650 
3651           DES_XFORM(UBUFFER(encbuf));
3652 
3653      }
3654 
3655      /*
3656 
3657       * drop the bits
3658 
3659       * we write chars until fewer than 7 bits,
3660 
3661       * and then pad the last one with 0 bits
3662 
3663       */
3664 
3665      for(n = 0; macbits > 7; n++, macbits -= 8)
3666 
3667           putchar(CHAR(encbuf, n));
3668 
3669      if (macbits > 0){
3670 
3671           CHAR(msgbuf, 0) = 0x00;
3672 
3673           for(n = 0; n < macbits; n++)
3674 
3675                CHAR(msgbuf, 0) |= (CHAR(encbuf, n)&bits[n]);
3676 
3677           putchar(CHAR(msgbuf, 0));
3678 
3679      }
3680 
3681 }
3682 
3683  
3684 
3685 /*
3686 
3687  * This encrypts using the Cipher FeedBack mode of DES
3688 
3689  */
3690 
3691 cfbenc()
3692 
3693 {
3694 
3695      register int n;         /* number of bytes actually read */
3696 
3697      register int nbytes;     /* number of bytes to read */
3698 
3699      register int bn;   /* block number */
3700 
3701      char ibuf[8];       /* input buffer */
3702 
3703      Desbuf msgbuf;        /* encryption buffer */
3704 
3705  
3706 
3707      /*
3708 
3709       * do things in bytes, not bits
3710 
3711       */
3712 
3713      nbytes = fbbits / 8;
3714 
3715      /*
3716 
3717       * do the transformation
3718 
3719       */
3720 
3721      for(bn = 1; (n = READ(ibuf, nbytes)) == nbytes; bn++){
3722 
3723           MEMCPY(BUFFER(msgbuf), BUFFER(ivec), 8);
3724 
3725           DES_XFORM(UBUFFER(msgbuf));
3726 
3727           for(n = 0; n < 8 - nbytes; n++)
3728 
3729                UCHAR(ivec, n) = UCHAR(ivec, n+nbytes);
3730 
3731           for(n = 0; n < nbytes; n++)
3732 
3733                UCHAR(ivec, 8-nbytes+n) = ibuf[n] ^ UCHAR(msgbuf, n);
3734 
3735           WRITE(&CHAR(ivec, 8-nbytes), nbytes);
3736 
3737      }
3738 
3739      /*
3740 
3741       * at EOF or last block -- in either case, the last byte contains
3742 
3743       * the character representation of the number of bytes in it
3744 
3745       */
3746 
3747      bn++;
3748 
3749      MEMZERO(&ibuf[n], nbytes - n);
3750 
3751      ibuf[nbytes - 1] = '0' + n;
3752 
3753      MEMCPY(BUFFER(msgbuf), BUFFER(ivec), 8);
3754 
3755      DES_XFORM(UBUFFER(msgbuf));
3756 
3757      for(n = 0; n < nbytes; n++)
3758 
3759           ibuf[n] ^= UCHAR(msgbuf, n);
3760 
3761      WRITE(ibuf, nbytes);
3762 
3763 }
3764 
3765  
3766 
3767 /*
3768 
3769  * This decrypts using the Cipher Block Chaining mode of DES
3770 
3771  */
3772 
3773 cfbdec()
3774 
3775 {
3776 
3777      register int n;         /* number of bytes actually read */
3778 
3779      register int c;         /* used to test for EOF */
3780 
3781      register int nbytes;     /* number of bytes to read */
3782 
3783      register int bn;   /* block number */
3784 
3785      char ibuf[8];       /* input buffer */
3786 
3787      char obuf[8];       /* output buffer */
3788 
3789      Desbuf msgbuf;        /* encryption buffer */
3790 
3791  
3792 
3793      /*
3794 
3795       * do things in bytes, not bits
3796 
3797       */
3798 
3799      nbytes = fbbits / 8;
3800 
3801      /*
3802 
3803       * do the transformation
3804 
3805       */
3806 
3807      for(bn = 1; (n = READ(ibuf, nbytes)) == nbytes; bn++){
3808 
3809           MEMCPY(BUFFER(msgbuf), BUFFER(ivec), 8);
3810 
3811           DES_XFORM(UBUFFER(msgbuf));
3812 
3813           for(c = 0; c < 8 - nbytes; c++)
3814 
3815                CHAR(ivec, c) = CHAR(ivec, c+nbytes);
3816 
3817           for(c = 0; c < nbytes; c++){
3818 
3819                CHAR(ivec, 8-nbytes+c) = ibuf[c];
3820 
3821                obuf[c] = ibuf[c] ^ UCHAR(msgbuf, c);
3822 
3823           }
3824 
3825           /*
3826 
3827            * if the last one, handle it specially
3828 
3829            */
3830 
3831           if ((c = getchar()) == EOF){
3832 
3833                if ((n = (obuf[nbytes-1] - '0')) < 0
3834 
3835                              || n > nbytes-1)
3836 
3837                    err(1, bn,
3838 
3839                         "decryption failed (block corrupted)");
3840 
3841           }
3842 
3843           else
3844 
3845                (void) ungetc(c, stdin);
3846 
3847           WRITE(obuf, n);
3848 
3849      }
3850 
3851      if (n > 0)
3852 
3853           err(1, bn, "decryption failed (incomplete block)");
3854 
3855 }
3856 
3857  
3858 
3859 /*
3860 
3861  * This encrypts using the alternative Cipher FeedBack mode of DES
3862 
3863  */
3864 
3865 cfbaenc()
3866 
3867 {
3868 
3869      register int n;         /* number of bytes actually read */
3870 
3871      register int nbytes;     /* number of bytes to read */
3872 
3873      register int bn;   /* block number */
3874 
3875      char ibuf[8];       /* input buffer */
3876 
3877      char obuf[8];       /* output buffer */
3878 
3879      Desbuf msgbuf;        /* encryption buffer */
3880 
3881  
3882 
3883      /*
3884 
3885       * do things in bytes, not bits
3886 
3887       */
3888 
3889      nbytes = fbbits / 7;
3890 
3891      /*
3892 
3893       * do the transformation
3894 
3895       */
3896 
3897      for(bn = 1; (n = READ(ibuf, nbytes)) == nbytes; bn++){
3898 
3899           MEMCPY(BUFFER(msgbuf), BUFFER(ivec), 8);
3900 
3901           DES_XFORM(UBUFFER(msgbuf));
3902 
3903           for(n = 0; n < 8 - nbytes; n++)
3904 
3905                UCHAR(ivec, n) = UCHAR(ivec, n+nbytes);
3906 
3907           for(n = 0; n < nbytes; n++)
3908 
3909                UCHAR(ivec, 8-nbytes+n) = (ibuf[n] ^ UCHAR(msgbuf, n))
3910 
3911                                  |0200;
3912 
3913           for(n = 0; n < nbytes; n++)
3914 
3915                obuf[n] = CHAR(ivec, 8-nbytes+n)&0177;
3916 
3917           WRITE(obuf, nbytes);
3918 
3919      }
3920 
3921      /*
3922 
3923       * at EOF or last block -- in either case, the last byte contains
3924 
3925       * the character representation of the number of bytes in it
3926 
3927       */
3928 
3929      bn++;
3930 
3931      MEMZERO(&ibuf[n], nbytes - n);
3932 
3933      ibuf[nbytes - 1] = ('0' + n)|0200;
3934 
3935      MEMCPY(BUFFER(msgbuf), BUFFER(ivec), 8);
3936 
3937      DES_XFORM(UBUFFER(msgbuf));
3938 
3939      for(n = 0; n < nbytes; n++)
3940 
3941           ibuf[n] ^= UCHAR(msgbuf, n);
3942 
3943      WRITE(ibuf, nbytes);
3944 
3945 }
3946 
3947  
3948 
3949 /*
3950 
3951  * This decrypts using the alternative Cipher Block Chaining mode of DES
3952 
3953  */
3954 
3955 cfbadec()
3956 
3957 {
3958 
3959      register int n;         /* number of bytes actually read */
3960 
3961      register int c;         /* used to test for EOF */
3962 
3963      register int nbytes;     /* number of bytes to read */
3964 
3965      register int bn;   /* block number */
3966 
3967      char ibuf[8];       /* input buffer */
3968 
3969      char obuf[8];       /* output buffer */
3970 
3971      Desbuf msgbuf;        /* encryption buffer */
3972 
3973  
3974 
3975      /*
3976 
3977       * do things in bytes, not bits
3978 
3979       */
3980 
3981      nbytes = fbbits / 7;
3982 
3983      /*
3984 
3985       * do the transformation
3986 
3987       */
3988 
3989      for(bn = 1; (n = READ(ibuf, nbytes)) == nbytes; bn++){
3990 
3991           MEMCPY(BUFFER(msgbuf), BUFFER(ivec), 8);
3992 
3993           DES_XFORM(UBUFFER(msgbuf));
3994 
3995           for(c = 0; c < 8 - nbytes; c++)
3996 
3997                CHAR(ivec, c) = CHAR(ivec, c+nbytes);
3998 
3999           for(c = 0; c < nbytes; c++){
4000 
4001                CHAR(ivec, 8-nbytes+c) = ibuf[c]|0200;
4002 
4003                obuf[c] = (ibuf[c] ^ UCHAR(msgbuf, c))&0177;
4004 
4005           }
4006 
4007           /*
4008 
4009            * if the last one, handle it specially
4010 
4011            */
4012 
4013           if ((c = getchar()) == EOF){
4014 
4015                if ((n = (obuf[nbytes-1] - '0')) < 0
4016 
4017                              || n > nbytes-1)
4018 
4019                    err(1, bn,
4020 
4021                         "decryption failed (block corrupted)");
4022 
4023           }
4024 
4025           else
4026 
4027                (void) ungetc(c, stdin);
4028 
4029           WRITE(obuf, n);
4030 
4031      }
4032 
4033      if (n > 0)
4034 
4035           err(1, bn, "decryption failed (incomplete block)");
4036 
4037 }
4038 
4039  
4040 
4041  
4042 
4043 /*
4044 
4045  * This encrypts using the Output FeedBack mode of DES
4046 
4047  */
4048 
4049 ofbenc()
4050 
4051 {
4052 
4053      register int n;         /* number of bytes actually read */
4054 
4055      register int c;         /* used to test for EOF */
4056 
4057      register int nbytes;     /* number of bytes to read */
4058 
4059      register int bn;   /* block number */
4060 
4061      char ibuf[8];       /* input buffer */
4062 
4063      char obuf[8];       /* output buffer */
4064 
4065      Desbuf msgbuf;        /* encryption buffer */
4066 
4067  
4068 
4069      /*
4070 
4071       * do things in bytes, not bits
4072 
4073       */
4074 
4075      nbytes = fbbits / 8;
4076 
4077      /*
4078 
4079       * do the transformation
4080 
4081       */
4082 
4083      for(bn = 1; (n = READ(ibuf, nbytes)) == nbytes; bn++){
4084 
4085           MEMCPY(BUFFER(msgbuf), BUFFER(ivec), 8);
4086 
4087           DES_XFORM(UBUFFER(msgbuf));
4088 
4089           for(n = 0; n < 8 - nbytes; n++)
4090 
4091                UCHAR(ivec, n) = UCHAR(ivec, n+nbytes);
4092 
4093           for(n = 0; n < nbytes; n++){
4094 
4095                UCHAR(ivec, 8-nbytes+n) = UCHAR(msgbuf, n);
4096 
4097                obuf[n] = ibuf[n] ^ UCHAR(msgbuf, n);
4098 
4099           }
4100 
4101           WRITE(obuf, nbytes);
4102 
4103      }
4104 
4105      /*
4106 
4107       * at EOF or last block -- in either case, the last byte contains
4108 
4109       * the character representation of the number of bytes in it
4110 
4111       */
4112 
4113      bn++;
4114 
4115      MEMZERO(&ibuf[n], nbytes - n);
4116 
4117      ibuf[nbytes - 1] = '0' + n;
4118 
4119      MEMCPY(BUFFER(msgbuf), BUFFER(ivec), 8);
4120 
4121      DES_XFORM(UBUFFER(msgbuf));
4122 
4123      for(c = 0; c < nbytes; c++)
4124 
4125           ibuf[c] ^= UCHAR(msgbuf, c);
4126 
4127      WRITE(ibuf, nbytes);
4128 
4129 }
4130 
4131  
4132 
4133 /*
4134 
4135  * This decrypts using the Output Block Chaining mode of DES
4136 
4137  */
4138 
4139 ofbdec()
4140 
4141 {
4142 
4143      register int n;         /* number of bytes actually read */
4144 
4145      register int c;         /* used to test for EOF */
4146 
4147      register int nbytes;     /* number of bytes to read */
4148 
4149      register int bn;   /* block number */
4150 
4151      char ibuf[8];       /* input buffer */
4152 
4153      char obuf[8];       /* output buffer */
4154 
4155      Desbuf msgbuf;        /* encryption buffer */
4156 
4157  
4158 
4159      /*
4160 
4161       * do things in bytes, not bits
4162 
4163       */
4164 
4165      nbytes = fbbits / 8;
4166 
4167      /*
4168 
4169       * do the transformation
4170 
4171       */
4172 
4173      for(bn = 1; (n = READ(ibuf, nbytes)) == nbytes; bn++){
4174 
4175           MEMCPY(BUFFER(msgbuf), BUFFER(ivec), 8);
4176 
4177           DES_XFORM(UBUFFER(msgbuf));
4178 
4179           for(c = 0; c < 8 - nbytes; c++)
4180 
4181                CHAR(ivec, c) = CHAR(ivec, c+nbytes);
4182 
4183           for(c = 0; c < nbytes; c++){
4184 
4185                CHAR(ivec, 8-nbytes+c) = UCHAR(msgbuf, c);
4186 
4187                obuf[c] = ibuf[c] ^ UCHAR(msgbuf, c);
4188 
4189           }
4190 
4191           /*
4192 
4193            * if the last one, handle it specially
4194 
4195            */
4196 
4197           if ((c = getchar()) == EOF){
4198 
4199                if ((n = (obuf[nbytes-1] - '0')) < 0
4200 
4201                              || n > nbytes-1)
4202 
4203                    err(1, bn,
4204 
4205                         "decryption failed (block corrupted)");
4206 
4207           }
4208 
4209           else
4210 
4211                (void) ungetc(c, stdin);
4212 
4213           /*
4214 
4215            * dump it
4216 
4217            */
4218 
4219           WRITE(obuf, n);
4220 
4221      }
4222 
4223      if (n > 0)
4224 
4225           err(1, bn, "decryption failed (incomplete block)");
4226 
4227 }
4228 
4229  
4230 
4231 /*
4232 
4233  * This authenticates using the Cipher FeedBack mode of DES
4234 
4235  */
4236 
4237 cfbauth()
4238 
4239 {
4240 
4241      register int n;         /* number of bytes actually read */
4242 
4243      register int nbytes;     /* number of bytes to read */
4244 
4245      char ibuf[8];       /* input buffer */
4246 
4247      Desbuf msgbuf;        /* encryption buffer */
4248 
4249  
4250 
4251      /*
4252 
4253       * do things in bytes, not bits
4254 
4255       */
4256 
4257      nbytes = fbbits / 8;
4258 
4259      /*
4260 
4261       * do the transformation
4262 
4263       */
4264 
4265      while((n = READ(ibuf, nbytes)) == nbytes){
4266 
4267           MEMCPY(BUFFER(msgbuf), BUFFER(ivec), 8);
4268 
4269           DES_XFORM(UBUFFER(msgbuf));
4270 
4271           for(n = 0; n < 8 - nbytes; n++)
4272 
4273                UCHAR(ivec, n) = UCHAR(ivec, n+nbytes);
4274 
4275           for(n = 0; n < nbytes; n++)
4276 
4277                UCHAR(ivec, 8-nbytes+n) = ibuf[n] ^ UCHAR(msgbuf, n);
4278 
4279      }
4280 
4281      /*
4282 
4283       * at EOF or last block -- in either case, the last byte contains
4284 
4285       * the character representation of the number of bytes in it
4286 
4287       */
4288 
4289      MEMZERO(&ibuf[n], nbytes - n);
4290 
4291      ibuf[nbytes - 1] = '0' + n;
4292 
4293      MEMCPY(BUFFER(msgbuf), BUFFER(ivec), 8);
4294 
4295      DES_XFORM(UBUFFER(msgbuf));
4296 
4297      for(n = 0; n < nbytes; n++)
4298 
4299           ibuf[n] ^= UCHAR(msgbuf, n);
4300 
4301      /*
4302 
4303       * drop the bits
4304 
4305       * we write chars until fewer than 7 bits,
4306 
4307       * and then pad the last one with 0 bits
4308 
4309       */
4310 
4311      for(n = 0; macbits > 7; n++, macbits -= 8)
4312 
4313           putchar(CHAR(msgbuf, n));
4314 
4315      if (macbits > 0){
4316 
4317           CHAR(msgbuf, 0) = 0x00;
4318 
4319           for(n = 0; n < macbits; n++)
4320 
4321                CHAR(msgbuf, 0) |= (CHAR(msgbuf, n)&bits[n]);
4322 
4323           putchar(CHAR(msgbuf, 0));
4324 
4325      }
4326 
4327 }
4328 
4329  
4330 
4331 #ifdef ALONE
4332 
4333  
4334 
4335 /*
4336 
4337  * change from 8 bits/Uchar to 1 bit/Uchar
4338 
4339  */
4340 
4341 expand(from, to)
4342 
4343 Desbuf from;            /* 8bit/unsigned char string */
4344 
4345 char to[64];            /* 1bit/char string */
4346 
4347 {
4348 
4349      register int i, j;      /* counters in for loop */
4350 
4351  
4352 
4353      for(i = 0; i < 8; i++)
4354 
4355           for(j = 0; j < 8; j++)
4356 
4357                to[i*8+j] = (CHAR(from, i)>>(7-j))&01;
4358 
4359 }
4360 
4361  
4362 
4363 /*
4364 
4365  * change from 1 bit/char to 8 bits/Uchar
4366 
4367  */
4368 
4369 compress(from, to)
4370 
4371 char from[64];           /* 1bit/char string */
4372 
4373 Desbuf to;              /* 8bit/unsigned char string */
4374 
4375 {
4376 
4377      register int i, j;      /* counters in for loop */
4378 
4379  
4380 
4381      for(i = 0; i < 8; i++){
4382 
4383            CHAR(to, i) = 0;
4384 
4385           for(j = 0; j < 8; j++)
4386 
4387                CHAR(to, i) = (from[i*8+j]<<(7-j))|CHAR(to, i);
4388 
4389      }
4390 
4391 }
4392 
4393  
4394 
4395 #endif
4396 
4397 Elliptic Curves
4398 
4399 /************************************************************************
4400 
4401 *                                                                       *
4402 
4403 *       Elliptic curves over Galois Fields.  These routines find points *
4404 
4405 *  on a curve, add and double points for type 1 optimal normal bases.   *
4406 
4407 *                                                                       *
4408 
4409 *    For succint explanaition, see Menezes, page 92                  *
4410 
4411 *                                                                       *
4412 
4413 ************************************************************************/
4414 
4415  
4416 
4417 #include <stdio.h>
4418 
4419 #include "bigint.h"
4420 
4421 #include "eliptic.h"
4422 
4423  
4424 
4425 /************************************************************************
4426 
4427 *  Note that the following is obvious to mathematicians.  I thought it  *
4428 
4429 *  was pretty cool when I discovered it myself, <sigh>.              *
4430 
4431 *                                                                       *
4432 
4433 *       Routine to solve quadradic equation.  Enter with coeficients    *
4434 
4435 *  a and b and it returns solutions y[2]: y^2 + ay + b = 0.             *
4436 
4437 *  If Tr(b/a^2) != 0, returns y=0 and error code 1.                     *
4438 
4439 *  If Tr(b/a^2) == 0, returns y[2] and error code 0.                    *
4440 
4441 *  If solution fails, returns y=0 and error code 2.                     *
4442 
4443 *                                                                       *
4444 
4445 *      Algorithm used based on normal basis GF math.  Since (a+b)^2 =   *
4446 
4447 *  a^2 + b^2 it follows that (a+b)^.5 = a^.5 + b^.5.  Note that squaring*
4448 
4449 *  is a left shift and rooting is a right shift in a normal basis.      *
4450 
4451 *  Transforming the source equation with y = ax and dividing by a^2     *
4452 
4453 *  gives:                                                               *
4454 
4455 *               x^2 + x + b/a^2 = 0                                     *
4456 
4457 *                                                                       *
4458 
4459 *       or      x = x^.5 + (b/a^2)^.5                                   *
4460 
4461 *                                                                       *
4462 
4463 *  Let k_i = the ith significant bit of (b/a^2)^.5 and                  *
4464 
4465 *      x_i = the ith significant bit of x.                              *
4466 
4467 *  The above equation is equivelent to a bitwise representation as      *
4468 
4469 *                                                                       *
4470 
4471 *               x_i = x_(i+1) + k_i                                     *
4472 
4473 *       or                                                              *
4474 
4475 *               x(i+1) = x_i + k_i.                                     *
4476 
4477 *                                                                       *
4478 
4479 *  Since both x and x+1 are solutions, and 1 is represented by all      *
4480 
4481 *  bits set in a normal basis, we can start with x_0 = 0 or 1 at our    *
4482 
4483 *  pleasure and use the recursion relation to discover every bit of x.  *
4484 
4485 *  The answer is then ax and ax+a returned in y[0] and y[1] respectively*
4486 
4487 *  If the sum of x_(n-1) + k_(n-1) != x_0, returns error code 2 and     *
4488 
4489 *  y = 0.                                                               *
4490 
4491 *                                                                       *
4492 
4493 *       error code                      returns                         *
4494 
4495 *          0                    y[0] and y[1] values                    *
4496 
4497 *          1                    y[0] = y[1] = 0                         *
4498 
4499 *          2                    mathematicly impossible !!!!            *
4500 
4501 *                                                                       *
4502 
4503 ************************************************************************/
4504 
4505  
4506 
4507 extern  ELEMENT  mask_table[WORDSIZE];
4508 
4509 extern  void opt_inv(), rot_left(), rot_right(), null(), opt_mul();
4510 
4511 extern  void big_print(), copy();
4512 
4513  
4514 
4515 int gf_quadradic(a, b, y)
4516 
4517 BIGINT *a, *b, *y;
4518 
4519 {
4520 
4521         INDEX   i, l, bits;
4522 
4523         BIGINT  x, k, a2;
4524 
4525         ELEMENT  r, t, mask;
4526 
4527  
4528 
4529 /*  test for b=0.  Won't work if it is.  */
4530 
4531  
4532 
4533         l = 1;
4534 
4535         for (i=STRTPOS; i<MAXLONG; i++) {
4536 
4537            if (b->b[i] == 0) continue;
4538 
4539            else {
4540 
4541               l = 0;
4542 
4543               break;
4544 
4545            }
4546 
4547         }
4548 
4549         if (l) {
4550 
4551            null(&y[0]);
4552 
4553            null(&y[1]);
4554 
4555            return(1);
4556 
4557         }
4558 
4559  
4560 
4561 /*  find a^-2  */
4562 
4563  
4564 
4565         opt_inv( a, &a2);
4566 
4567         rot_left(&a2);
4568 
4569  
4570 
4571 /*  find k=(b/a^2)^.5 */
4572 
4573  
4574 
4575         opt_mul( b, &a2, &k);
4576 
4577         rot_right(&k);
4578 
4579         r = 0;
4580 
4581  
4582 
4583 /*  check that Tr(k) is zero.  Combine all words first. */
4584 
4585  
4586 
4587         for (i=STRTPOS; i<MAXLONG; i++)
4588 
4589                 r ^= k.b[i];
4590 
4591  
4592 
4593 /*  take trace of word, combining half of all the bits each time */
4594 
4595  
4596 
4597         for (bits = WORDSIZE/2; bits > 0; bits /= 2)
4598 
4599                 r = ((r & mask_table[bits]) ^ (r >> bits));
4600 
4601  
4602 
4603 /*  if not zero, return error code 1.  */
4604 
4605  
4606 
4607         if (r) {
4608 
4609            null(&y[0]);
4610 
4611            null(&y[1]);
4612 
4613            return(1);
4614 
4615         }
4616 
4617  
4618 
4619 /*  point is valid, proceed with solution.  mask points to bit i,
4620 
4621 which is known, in x bits previously found and k (=b/a^2).  */
4622 
4623  
4624 
4625         null(&x);
4626 
4627         mask = 1;
4628 
4629         for (bits=0; bits < NUMBITS ; bits++) {
4630 
4631  
4632 
4633 /* source long word could be different than destination  */
4634 
4635  
4636 
4637            i = LONGPOS - bits/WORDSIZE;
4638 
4639            l = LONGPOS - (bits + 1)/WORDSIZE;
4640 
4641  
4642 
4643 /*  use present bits to compute next one */
4644 
4645  
4646 
4647            r = k.b[i] & mask;
4648 
4649            t = x.b[i] & mask;
4650 
4651            r ^= t;
4652 
4653  
4654 
4655 /*  same word, so just shift result up */
4656 
4657  
4658 
4659            if ( l == i ) {
4660 
4661               r <<= 1;
4662 
4663               x.b[l] |= r;
4664 
4665               mask <<= 1;
4666 
4667            } else {
4668 
4669  
4670 
4671 /*  different word, reset mask and use a 1 */
4672 
4673  
4674 
4675               mask = 1;
4676 
4677               if (r) x.b[l] = 1;
4678 
4679            }
4680 
4681         }
4682 
4683  
4684 
4685 /*  test that last bit generates a zero */
4686 
4687  
4688 
4689         r = k.b[STRTPOS] & UPRBIT;
4690 
4691         t = x.b[STRTPOS] & UPRBIT;
4692 
4693         if ( r^t ) {
4694 
4695            null(&y[0]);
4696 
4697            null(&y[1]);
4698 
4699            return(2);
4700 
4701         }
4702 
4703  
4704 
4705 /*  convert solution back via y = ax */
4706 
4707  
4708 
4709         opt_mul(a, &x, &y[0]);
4710 
4711  
4712 
4713 /*  and create complementary soultion y = ax + a */
4714 
4715  
4716 
4717      null (&y[1]);
4718 
4719         for (i = STRTPOS; i < MAXLONG;  i++)
4720 
4721                 y[1].b[i] = y[0].b[i] ^ a->b[i];
4722 
4723  
4724 
4725 /*  no errors, bye!  */
4726 
4727  
4728 
4729         return(0);
4730 
4731 }
4732 
4733  
4734 
4735 /*  compute R.H.S. f(x) = x^3 + a2*x^2 + a6 
4736 
4737     curv.form = 0 implies a2 = 0, so no extra multiply. 
4738 
4739     curv.form = 1 is the "twist" curve.
4740 
4741 */
4742 
4743  
4744 
4745 void fofx(x, curv, f)
4746 
4747 BIGINT * x, * f;
4748 
4749 CURVE * curv;
4750 
4751 {
4752 
4753  
4754 
4755         BIGINT x2,x3;
4756 
4757         INDEX i;
4758 
4759  
4760 
4761         copy(x, &x2);
4762 
4763         rot_left(&x2);
4764 
4765         opt_mul(x, &x2, &x3);
4766 
4767         if (curv->form) opt_mul(&x2, &curv->a2, f);
4768 
4769      else null(f);
4770 
4771         for (i = STRTPOS; i < MAXLONG; i++)
4772 
4773              f->b[i] ^= (x3.b[i] ^ curv->a6.b[i]);
4774 
4775 }
4776 
4777  
4778 
4779 /****************************************************************************
4780 
4781 *                                                                           *
4782 
4783 *   Implement elliptic curve point addition for optimal normal basis form.  *
4784 
4785 *  This follows R. Schroeppel, H. Orman, S. O'Mally, "Fast Key Exchange with*
4786 
4787 *  Elliptic Curve Systems", CRYPTO '95, TR-95-03, Univ. of Arizona, Comp.   *
4788 
4789 *  Science Dept.                                                            *
4790 
4791 *                                                                           *
4792 
4793 *   This version is faster for inversion processes requiring fewer          *
4794 
4795 *  multiplies than projective math version.  For NUMBITS = 148 or 226 this  *
4796 
4797 *  is the case because only 10 multiplies are required for inversion but    *
4798 
4799 *  15 multiplies for projective math.  I leave it as a paper to be written  *
4800 
4801 *  [HINT!!] to propagate TR-95-03 to normal basis inversion.  In that case  *
4802 
4803 *  inversion will require order 2 multiplies and this method would be far   *
4804 
4805 *  superior to projective coordinates.                                      *
4806 
4807 ****************************************************************************/
4808 
4809  
4810 
4811 void esum (p1, p2, p3, curv)
4812 
4813 POINT   *p1, *p2, *p3;
4814 
4815 CURVE   *curv;
4816 
4817 {
4818 
4819     register INDEX   i;
4820 
4821     BIGINT  x1, y1, lmda, onex, lmda2;
4822 
4823  
4824 
4825 /*  compute lambda = (y_1 + y_2)/(x_1 + x_2)  */
4826 
4827  
4828 
4829     null(&x1);
4830 
4831     null(&y1);
4832 
4833     SUMLOOP(i) {
4834 
4835      x1.b[i] = p1->x.b[i] ^ p2->x.b[i];
4836 
4837      y1.b[i] = p1->y.b[i] ^ p2->y.b[i];
4838 
4839     }
4840 
4841     opt_inv( &x1, &onex);
4842 
4843     opt_mul( &onex, &y1, &lmda);
4844 
4845     copy( &lmda, &lmda2);
4846 
4847     rot_left(&lmda2);
4848 
4849  
4850 
4851 /*  with lambda and lamda^2, compute x_3  */
4852 
4853  
4854 
4855     if (curv->form)
4856 
4857      SUMLOOP (i)
4858 
4859          p3->x.b[i] = lmda.b[i] ^ lmda2.b[i] ^ p1->x.b[i] ^ p2->x.b[i]
4860 
4861            ^ curv->a2.b[i];
4862 
4863     else
4864 
4865      SUMLOOP (i)
4866 
4867          p3->x.b[i] = lmda.b[i] ^ lmda2.b[i] ^ p1->x.b[i] ^ p2->x.b[i];
4868 
4869  
4870 
4871 /*  next find y_3  */
4872 
4873  
4874 
4875     SUMLOOP (i) x1.b[i] = p1->x.b[i] ^ p3->x.b[i];
4876 
4877     opt_mul( &x1, &lmda, &lmda2);
4878 
4879     SUMLOOP (i) p3->y.b[i] = lmda2.b[i] ^ p3->x.b[i] ^ p1->y.b[i];
4880 
4881 }
4882 
4883  
4884 
4885 /*  elliptic curve doubling routine for Schroeppel's algorithm over normal
4886 
4887     basis.  Enter with p1, p3 as source and destination as well as curv
4888 
4889     to operate on.  Returns p3 = 2*p1.
4890 
4891 */
4892 
4893  
4894 
4895 void edbl (p1, p3, curv)
4896 
4897 POINT *p1, *p3;
4898 
4899 CURVE *curv;
4900 
4901 {
4902 
4903     BIGINT  x1, y1, lmda, lmda2, t1;
4904 
4905     register INDEX   i;
4906 
4907  
4908 
4909 /*  first compute lambda = x + y/x  */
4910 
4911  
4912 
4913     opt_inv( &p1->x, &x1);
4914 
4915     opt_mul( &x1, &p1->y, &y1);
4916 
4917     SUMLOOP (i) lmda.b[i] = p1->x.b[i] ^ y1.b[i];
4918 
4919  
4920 
4921 /*  next compute x_3  */
4922 
4923  
4924 
4925     copy( &lmda, &lmda2);
4926 
4927     rot_left(&lmda2);
4928 
4929     if(curv->form)
4930 
4931      SUMLOOP (i) p3->x.b[i] = lmda.b[i] ^ lmda2.b[i] ^ curv->a2.b[i];
4932 
4933     else
4934 
4935      SUMLOOP (i) p3->x.b[i] = lmda.b[i] ^ lmda2.b[i];
4936 
4937  
4938 
4939 /*  and lastly y_3  */
4940 
4941  
4942 
4943     one( &y1);
4944 
4945     SUMLOOP (i) y1.b[i] ^= lmda.b[i];
4946 
4947     opt_mul( &y1, &p3->x, &t1);
4948 
4949     copy( &p1->x, &x1);
4950 
4951     rot_left( &x1);
4952 
4953     SUMLOOP (i) p3->y.b[i] = x1.b[i] ^ t1.b[i];
4954 
4955 }
4956 
4957  
4958 
4959 /*  subtract two points on a curve.  just negates p2 and does a sum.
4960 
4961     Returns p3 = p1 - p2 over curv.
4962 
4963 */
4964 
4965  
4966 
4967 void esub (p1, p2, p3, curv)
4968 
4969 POINT   *p1, *p2, *p3;
4970 
4971 CURVE   *curv;
4972 
4973 {
4974 
4975     POINT   negp;
4976 
4977     INDEX   i;
4978 
4979  
4980 
4981     copy ( &p2->x, &negp.x);
4982 
4983     null (&negp.y);
4984 
4985     SUMLOOP(i) negp.y.b[i] = p2->x.b[i] ^ p2->y.b[i];
4986 
4987     esum (p1, &negp, p3, curv);
4988 
4989 }
4990 
4991  
4992 
4993 /*  need to move points around, not just values.  Optimize later.  */
4994 
4995  
4996 
4997 void copy_point (p1, p2)
4998 
4999 POINT *p1, *p2;
5000 
5001 {
5002 
5003      copy (&p1->x, &p2->x);
5004 
5005      copy (&p1->y, &p2->y);
5006 
5007 }
5008 
5009  
5010 
5011 /*  Routine to compute kP where k is an integer (base 2, not normal basis)
5012 
5013      and P is a point on an elliptic curve.  This routine assumes that K
5014 
5015      is representable in the same bit field as x, y or z values of P.
5016 
5017      This is for simplicity, larger or smaller fields can be independently
5018 
5019      implemented.
5020 
5021     Enter with: integer k, source point P, curve to compute over (curv) and
5022 
5023     Returns with: result point R.
5024 
5025  
5026 
5027   Reference: Koblitz, "CM-Curves with good Cryptografic Properties",
5028 
5029      Springer-Verlag LNCS #576, p279 (pg 284 really), 1992
5030 
5031 */
5032 
5033 ELEMENT     bit_table[32] = {1, 2, 4, 8, 16, 32, 64, 128, 256,
5034 
5035                0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000,
5036 
5037                0x10000, 0x20000, 0x40000, 0x80000,
5038 
5039                0x100000, 0x200000, 0x400000, 0x800000,
5040 
5041                0x1000000, 0x2000000, 0x4000000, 0x8000000,
5042 
5043                0x10000000, 0x20000000, 0x40000000, 0x80000000 };
5044 
5045  
5046 
5047 void  elptic_mul(k, p, r, curv)
5048 
5049 BIGINT    *k;
5050 
5051 POINT     *p, *r;
5052 
5053 CURVE     *curv;
5054 
5055 {
5056 
5057      char      blncd[NUMBITS+1];
5058 
5059      ELEMENT        wordptr, mskindx, sequnce;
5060 
5061      long      bit_count;
5062 
5063      POINT          temp;
5064 
5065  
5066 
5067 /*  scan across k from right to left to expand bits to chars  */
5068 
5069  
5070 
5071      for (bit_count = 0; bit_count < NUMBITS; bit_count++) {
5072 
5073         wordptr = LONGPOS - bit_count/WORDSIZE;
5074 
5075         mskindx = bit_count % WORDSIZE;
5076 
5077         if (k->b[wordptr] & bit_table[mskindx]) blncd[bit_count] = 1;
5078 
5079         else blncd[bit_count] = 0;
5080 
5081      }
5082 
5083      blncd[NUMBITS] = 0;
5084 
5085  
5086 
5087 /*  Next convert balanced array to ballanced representation  */
5088 
5089 /*  sequence flag used for multiple 1's being switched to 0's.  */
5090 
5091  
5092 
5093      sequnce = 0;
5094 
5095      bit_count = 0;
5096 
5097      while (bit_count <= NUMBITS) {
5098 
5099         if ( blncd[bit_count]) {
5100 
5101            if (sequnce)      /*  in middle of 1's sequence */
5102 
5103           blncd[bit_count] = 0;
5104 
5105            else if (blncd[bit_count+1]) {
5106 
5107           sequnce = 1;        /*  next bit also set, begin sequnce */
5108 
5109           blncd[bit_count] = -1;
5110 
5111            }
5112 
5113            bit_count++;
5114 
5115         } else {   
5116 
5117            if (sequnce) {        /* last bit of sequence */
5118 
5119           blncd[bit_count] = 1;
5120 
5121           sequnce = 0;
5122 
5123            } else
5124 
5125           bit_count++;
5126 
5127         }
5128 
5129      }
5130 
5131  
5132 
5133 /*  now follow ballanced representation and compute kP  */
5134 
5135  
5136 
5137      bit_count = NUMBITS;
5138 
5139      while (!blncd[bit_count] && bit_count >= 0) bit_count--; /* find first bit */
5140 
5141      if (bit_count < 0) {
5142 
5143         null (&r->x);
5144 
5145         null (&r->y);
5146 
5147         return;
5148 
5149      }
5150 
5151      copy_point(p,r);         /* first bit always set */
5152 
5153      while (bit_count > 0) {
5154 
5155        edbl(r, &temp, curv);
5156 
5157        bit_count--;
5158 
5159        switch (blncd[bit_count]) {
5160 
5161           case 1: esum (p, &temp, r, curv);
5162 
5163                break;
5164 
5165           case -1: esub (&temp, p, r, curv);
5166 
5167                break;
5168 
5169           case 0: copy_point (&temp, r);
5170 
5171         }
5172 
5173      }
5174 
5175 }
5176 
5177  
5178 
5179 /*  One is not what it appears to be.  In any normal basis, "1" is the sum of
5180 
5181 all powers of the generator.  So this routine puts ones to fill the number size
5182 
5183 being used in the address of the BIGINT supplied.  */
5184 
5185  
5186 
5187 void one (place)
5188 
5189 BIGINT *place;
5190 
5191 {
5192 
5193      INDEX i;
5194 
5195  
5196 
5197      SUMLOOP(i) place->b[i] = -1L;
5198 
5199      place->b[STRTPOS] &= UPRMASK;
5200 
5201 }
5202 
5203 }
posted @ 2012-10-21 23:45  godjob  Views(546)  Comments(0Edit  收藏  举报