Mercurial > hg > early-roguelike
comparison srogue/xcrypt.c @ 121:e6c8652473fe
srogue: more compatibility improvements.
Randomness now uses mdport, and xcrypt.c has been replaced with the
rogue5 version.
Super-Rogue now builds on MinGW.
| author | John "Elwin" Edwards |
|---|---|
| date | Sat, 03 May 2014 10:31:30 -0700 |
| parents | 458df24e973d |
| children |
comparison
equal
deleted
inserted
replaced
| 120:d6b7c3fb37ea | 121:e6c8652473fe |
|---|---|
| 1 /* | 1 /* |
| 2 * FreeSec: libcrypt | 2 * FreeSec: libcrypt |
| 3 * | 3 * |
| 4 * Copyright (C) 1994 David Burren | 4 * Copyright (C) 1994 David Burren |
| 5 * All rights reserved. | 5 * All rights reserved. |
| 6 * | 6 * |
| 7 * Redistribution and use in source and binary forms, with or without | 7 * Redistribution and use in source and binary forms, with or without |
| 8 * modification, are permitted provided that the following conditions | 8 * modification, are permitted provided that the following conditions |
| 9 * are met: | 9 * are met: |
| 10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
| 11 * notice, this list of conditions and the following disclaimer. | 11 * notice, this list of conditions and the following disclaimer. |
| 12 * 2. Redistributions in binary form must reproduce the above copyright | 12 * 2. Redistributions in binary form must reproduce the above copyright |
| 13 * notice, this list of conditions and the following disclaimer in the | 13 * notice, this list of conditions and the following disclaimer in the |
| 14 * documentation and/or other materials provided with the distribution. | 14 * documentation and/or other materials provided with the distribution. |
| 15 * 3. Neither the name(s) of the author(s) nor the names of other contributors | 15 * 3. Neither the name(s) of the author(s) nor the names of other contributors |
| 16 * may be used to endorse or promote products derived from this software | 16 * may be used to endorse or promote products derived from this software |
| 17 * without specific prior written permission. | 17 * without specific prior written permission. |
| 18 * | 18 * |
| 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTORS ``AS IS'' AND | 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTORS ``AS IS'' AND |
| 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTORS BE LIABLE | 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTORS BE LIABLE |
| 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 29 * SUCH DAMAGE. | 29 * SUCH DAMAGE. |
| 30 * | 30 * |
| 31 * | 31 * |
| 32 * This is an original implementation of the DES and the crypt(3) interfaces | 32 * This is an original implementation of the DES and the crypt(3) interfaces |
| 33 * by David Burren <davidb@werj.com.au>. | 33 * by David Burren <davidb@werj.com.au>. |
| 34 * | 34 * |
| 48 * only the crypt() interface. This is required to make binaries linked | 48 * only the crypt() interface. This is required to make binaries linked |
| 49 * against crypt.o exportable or re-exportable from the USA. | 49 * against crypt.o exportable or re-exportable from the USA. |
| 50 */ | 50 */ |
| 51 | 51 |
| 52 #include <sys/types.h> | 52 #include <sys/types.h> |
| 53 #include <sys/param.h> | |
| 54 #include <string.h> | 53 #include <string.h> |
| 55 | 54 |
| 56 #ifdef DEBUG | 55 static unsigned int md_endian = 0x01020304; |
| 57 # include <stdio.h> | 56 |
| 58 #endif | 57 unsigned int |
| 58 xntohl(unsigned int x) | |
| 59 { | |
| 60 if ( *((char *)&md_endian) == 0x01 ) | |
| 61 return(x); | |
| 62 else | |
| 63 return( ((x & 0x000000ffU) << 24) | | |
| 64 ((x & 0x0000ff00U) << 8) | | |
| 65 ((x & 0x00ff0000U) >> 8) | | |
| 66 ((x & 0xff000000U) >> 24) ); | |
| 67 } | |
| 68 | |
| 69 unsigned int | |
| 70 xhtonl(unsigned int x) | |
| 71 { | |
| 72 if ( *((char *)&md_endian) == 0x01 ) | |
| 73 return(x); | |
| 74 else | |
| 75 return( ((x & 0x000000ffU) << 24) | | |
| 76 ((x & 0x0000ff00U) << 8) | | |
| 77 ((x & 0x00ff0000U) >> 8) | | |
| 78 ((x & 0xff000000U) >> 24) ); | |
| 79 } | |
| 80 | |
| 59 #define _PASSWORD_EFMT1 '_' | 81 #define _PASSWORD_EFMT1 '_' |
| 60 | 82 |
| 61 static unsigned char IP[64] = { | 83 static unsigned char IP[64] = { |
| 62 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, | 84 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, |
| 63 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, | 85 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, |
| 180 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | 202 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; |
| 181 /* 0000000000111111111122222222223333333333444444444455555555556666 */ | 203 /* 0000000000111111111122222222223333333333444444444455555555556666 */ |
| 182 /* 0123456789012345678901234567890123456789012345678901234567890123 */ | 204 /* 0123456789012345678901234567890123456789012345678901234567890123 */ |
| 183 | 205 |
| 184 static __inline int | 206 static __inline int |
| 185 ascii_to_bin(ch) | 207 ascii_to_bin(int ch) |
| 186 char ch; | |
| 187 { | 208 { |
| 188 if (ch > 'z') | 209 if (ch > 'z') |
| 189 return(0); | 210 return(0); |
| 190 if (ch >= 'a') | 211 if (ch >= 'a') |
| 191 return(ch - 'a' + 38); | 212 return(ch - 'a' + 38); |
| 199 return(ch - '.'); | 220 return(ch - '.'); |
| 200 return(0); | 221 return(0); |
| 201 } | 222 } |
| 202 | 223 |
| 203 static void | 224 static void |
| 204 des_init() | 225 des_init(void) |
| 205 { | 226 { |
| 206 int i, j, b, k, inbit, obit; | 227 int i, j, b, k, inbit, obit; |
| 207 unsigned int *p, *il, *ir, *fl, *fr; | 228 unsigned int *p, *il, *ir, *fl, *fr; |
| 208 | 229 |
| 209 old_rawkey0 = old_rawkey1 = 0; | 230 old_rawkey0 = old_rawkey1 = 0; |
| 234 /* | 255 /* |
| 235 * Set up the initial & final permutations into a useful form, and | 256 * Set up the initial & final permutations into a useful form, and |
| 236 * initialise the inverted key permutation. | 257 * initialise the inverted key permutation. |
| 237 */ | 258 */ |
| 238 for (i = 0; i < 64; i++) { | 259 for (i = 0; i < 64; i++) { |
| 239 init_perm[final_perm[i] = IP[i] - 1] = i; | 260 init_perm[final_perm[i] = IP[i] - 1] = (unsigned char) i; |
| 240 inv_key_perm[i] = 255; | 261 inv_key_perm[i] = 255; |
| 241 } | 262 } |
| 242 | 263 |
| 243 /* | 264 /* |
| 244 * Invert the key permutation and initialise the inverted key | 265 * Invert the key permutation and initialise the inverted key |
| 245 * compression permutation. | 266 * compression permutation. |
| 246 */ | 267 */ |
| 247 for (i = 0; i < 56; i++) { | 268 for (i = 0; i < 56; i++) { |
| 248 inv_key_perm[key_perm[i] - 1] = i; | 269 inv_key_perm[key_perm[i] - 1] = (unsigned char) i; |
| 249 inv_comp_perm[i] = 255; | 270 inv_comp_perm[i] = 255; |
| 250 } | 271 } |
| 251 | 272 |
| 252 /* | 273 /* |
| 253 * Invert the key compression permutation. | 274 * Invert the key compression permutation. |
| 254 */ | 275 */ |
| 255 for (i = 0; i < 48; i++) { | 276 for (i = 0; i < 48; i++) { |
| 256 inv_comp_perm[comp_perm[i] - 1] = i; | 277 inv_comp_perm[comp_perm[i] - 1] = (unsigned char) i; |
| 257 } | 278 } |
| 258 | 279 |
| 259 /* | 280 /* |
| 260 * Set up the OR-mask arrays for the initial and final permutations, | 281 * Set up the OR-mask arrays for the initial and final permutations, |
| 261 * and for the key initial and compression permutations. | 282 * and for the key initial and compression permutations. |
| 313 /* | 334 /* |
| 314 * Invert the P-box permutation, and convert into OR-masks for | 335 * Invert the P-box permutation, and convert into OR-masks for |
| 315 * handling the output of the S-box arrays setup above. | 336 * handling the output of the S-box arrays setup above. |
| 316 */ | 337 */ |
| 317 for (i = 0; i < 32; i++) | 338 for (i = 0; i < 32; i++) |
| 318 un_pbox[pbox[i] - 1] = i; | 339 un_pbox[pbox[i] - 1] = (unsigned char) i; |
| 319 | 340 |
| 320 for (b = 0; b < 4; b++) | 341 for (b = 0; b < 4; b++) |
| 321 for (i = 0; i < 256; i++) { | 342 for (i = 0; i < 256; i++) { |
| 322 *(p = &psbox[b][i]) = 0; | 343 *(p = &psbox[b][i]) = 0; |
| 323 for (j = 0; j < 8; j++) { | 344 for (j = 0; j < 8; j++) { |
| 328 | 349 |
| 329 des_initialised = 1; | 350 des_initialised = 1; |
| 330 } | 351 } |
| 331 | 352 |
| 332 static void | 353 static void |
| 333 setup_salt(salt) | 354 setup_salt(int salt) |
| 334 int salt; | |
| 335 { | 355 { |
| 336 unsigned int obit, saltbit; | 356 unsigned int obit, saltbit; |
| 337 int i; | 357 int i; |
| 338 | 358 |
| 339 if (salt == old_salt) | 359 if (salt == old_salt) |
| 350 obit >>= 1; | 370 obit >>= 1; |
| 351 } | 371 } |
| 352 } | 372 } |
| 353 | 373 |
| 354 static int | 374 static int |
| 355 des_setkey(key) | 375 des_setkey(const char *key) |
| 356 const char *key; | |
| 357 { | 376 { |
| 358 unsigned int k0, k1, rawkey0, rawkey1; | 377 unsigned int k0, k1, rawkey0, rawkey1; |
| 359 int shifts, round; | 378 int shifts, round; |
| 360 | 379 |
| 361 if (!des_initialised) | 380 if (!des_initialised) |
| 362 des_init(); | 381 des_init(); |
| 363 | 382 |
| 364 rawkey0 = ntohl(*(unsigned int *) key); | 383 rawkey0 = xntohl(*(unsigned int *) key); |
| 365 rawkey1 = ntohl(*(unsigned int *) (key + 4)); | 384 rawkey1 = xntohl(*(unsigned int *) (key + 4)); |
| 366 | 385 |
| 367 if ((rawkey0 | rawkey1) | 386 if ((rawkey0 | rawkey1) |
| 368 && rawkey0 == old_rawkey0 | 387 && rawkey0 == old_rawkey0 |
| 369 && rawkey1 == old_rawkey1) { | 388 && rawkey1 == old_rawkey1) { |
| 370 /* | 389 /* |
| 431 } | 450 } |
| 432 return(0); | 451 return(0); |
| 433 } | 452 } |
| 434 | 453 |
| 435 static int | 454 static int |
| 436 do_des(l_in, r_in, l_out, r_out, count) | 455 do_des(unsigned int l_in, unsigned int r_in, unsigned int *l_out, |
| 437 unsigned int l_in, r_in, *l_out, *r_out; | 456 unsigned int *r_out, int count) |
| 438 int count; | |
| 439 { | 457 { |
| 440 /* | 458 /* |
| 441 * l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format. | 459 * l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format. |
| 442 */ | 460 */ |
| 443 unsigned int l, r, *kl, *kr, *kl1, *kr1; | 461 unsigned int l, r, *kl, *kr, *kl1, *kr1; |
| 444 unsigned int f, r48l, r48r; | 462 unsigned int f = 0, r48l, r48r; |
| 445 int round; | 463 int round; |
| 446 | 464 |
| 447 if (count == 0) { | 465 if (count == 0) { |
| 448 return(1); | 466 return(1); |
| 449 } else if (count > 0) { | 467 } else if (count > 0) { |
| 549 | fp_maskr[7][r & 0xff]; | 567 | fp_maskr[7][r & 0xff]; |
| 550 return(0); | 568 return(0); |
| 551 } | 569 } |
| 552 | 570 |
| 553 static int | 571 static int |
| 554 des_cipher(in, out, salt, count) | 572 des_cipher(const char *in, char *out, int salt, int count) |
| 555 const char *in; | |
| 556 char *out; | |
| 557 int salt; | |
| 558 int count; | |
| 559 { | 573 { |
| 560 unsigned int l_out, r_out, rawl, rawr; | 574 unsigned int l_out, r_out, rawl, rawr; |
| 561 unsigned int x[2]; | 575 unsigned int x[2]; |
| 562 int retval; | 576 int retval; |
| 563 | 577 |
| 565 des_init(); | 579 des_init(); |
| 566 | 580 |
| 567 setup_salt(salt); | 581 setup_salt(salt); |
| 568 | 582 |
| 569 memcpy(x, in, sizeof x); | 583 memcpy(x, in, sizeof x); |
| 570 rawl = ntohl(x[0]); | 584 rawl = xntohl(x[0]); |
| 571 rawr = ntohl(x[1]); | 585 rawr = xntohl(x[1]); |
| 572 retval = do_des(rawl, rawr, &l_out, &r_out, count); | 586 retval = do_des(rawl, rawr, &l_out, &r_out, count); |
| 573 | 587 |
| 574 x[0] = htonl(l_out); | 588 x[0] = xhtonl(l_out); |
| 575 x[1] = htonl(r_out); | 589 x[1] = xhtonl(r_out); |
| 576 memcpy(out, x, sizeof x); | 590 memcpy(out, x, sizeof x); |
| 577 return(retval); | 591 return(retval); |
| 578 } | 592 } |
| 579 | 593 |
| 580 char * | 594 char * |
| 581 xcrypt(key, setting) | 595 xcrypt(const char *key, const char *setting) |
| 582 const char *key; | |
| 583 const char *setting; | |
| 584 { | 596 { |
| 585 int i; | 597 int i; |
| 586 unsigned int count, salt, l, r0, r1, keybuf[2]; | 598 unsigned int count, salt, l, r0, r1, keybuf[2]; |
| 587 unsigned char *p, *q; | 599 unsigned char *p, *q; |
| 588 static unsigned char output[21]; | 600 static unsigned char output[21]; |
| 597 q = (unsigned char *) keybuf; | 609 q = (unsigned char *) keybuf; |
| 598 while ((q - (unsigned char *) keybuf) < sizeof(keybuf)) { | 610 while ((q - (unsigned char *) keybuf) < sizeof(keybuf)) { |
| 599 if ((*q++ = *key << 1)) | 611 if ((*q++ = *key << 1)) |
| 600 key++; | 612 key++; |
| 601 } | 613 } |
| 602 if (des_setkey((unsigned char *) keybuf)) | 614 if (des_setkey((const char *) keybuf)) |
| 603 return(NULL); | 615 return(NULL); |
| 604 | 616 |
| 605 if (*setting == _PASSWORD_EFMT1) { | 617 if (*setting == _PASSWORD_EFMT1) { |
| 606 /* | 618 /* |
| 607 * "new"-style: | 619 * "new"-style: |
| 616 | 628 |
| 617 while (*key) { | 629 while (*key) { |
| 618 /* | 630 /* |
| 619 * Encrypt the key with itself. | 631 * Encrypt the key with itself. |
| 620 */ | 632 */ |
| 621 if (des_cipher((unsigned char*)keybuf, (unsigned char*)keybuf, 0, 1)) | 633 if (des_cipher((const char*)keybuf, (char*)keybuf, 0, 1)) |
| 622 return(NULL); | 634 return(NULL); |
| 623 /* | 635 /* |
| 624 * And XOR with the next 8 characters of the key. | 636 * And XOR with the next 8 characters of the key. |
| 625 */ | 637 */ |
| 626 q = (unsigned char *) keybuf; | 638 q = (unsigned char *) keybuf; |
| 627 while (((q - (unsigned char *) keybuf) < sizeof(keybuf)) && | 639 while (((q - (unsigned char *) keybuf) < sizeof(keybuf)) && |
| 628 *key) | 640 *key) |
| 629 *q++ ^= *key++ << 1; | 641 *q++ ^= *key++ << 1; |
| 630 | 642 |
| 631 if (des_setkey((unsigned char *) keybuf)) | 643 if (des_setkey((const char *) keybuf)) |
| 632 return(NULL); | 644 return(NULL); |
| 633 } | 645 } |
| 634 strncpy((char *)output, setting, 9); | 646 strncpy((char *)output, setting, 9); |
| 635 | 647 |
| 636 /* | 648 /* |
