DES/des3 加密程序
1 #ifndef POLARSSL_DES_H 2 #define POLARSSL_DES_H 3 4 #define DES_ENCRYPT 1 5 #define DES_DECRYPT 0 6 7 #define POLARSSL_ERR_DES_INVALID_INPUT_LENGTH -0x0C00 8 9 /** 10 * \brief DES context structure 11 */ 12 typedef struct 13 { 14 int mode; /*!< encrypt/decrypt */ 15 unsigned long sk[32]; /*!< DES subkeys */ 16 } 17 des_context; 18 19 /** 20 * \brief Triple-DES context structure 21 */ 22 typedef struct 23 { 24 int mode; /*!< encrypt/decrypt */ 25 unsigned long sk[96]; /*!< 3DES subkeys */ 26 } 27 des3_context; 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 /** 34 * \brief DES key schedule (56-bit, encryption) 35 * 36 * \param ctx DES context to be initialized 37 * \param key 8-byte secret key 38 */ 39 void des_setkey_enc( des_context *ctx, const unsigned char key[8] ); 40 41 /** 42 * \brief DES key schedule (56-bit, decryption) 43 * 44 * \param ctx DES context to be initialized 45 * \param key 8-byte secret key 46 */ 47 void des_setkey_dec( des_context *ctx, const unsigned char key[8] ); 48 49 /** 50 * \brief Triple-DES key schedule (112-bit, encryption) 51 * 52 * \param ctx 3DES context to be initialized 53 * \param key 16-byte secret key 54 */ 55 void des3_set2key_enc( des3_context *ctx, const unsigned char key[16] ); 56 57 /** 58 * \brief Triple-DES key schedule (112-bit, decryption) 59 * 60 * \param ctx 3DES context to be initialized 61 * \param key 16-byte secret key 62 */ 63 void des3_set2key_dec( des3_context *ctx, const unsigned char key[16] ); 64 65 /** 66 * \brief Triple-DES key schedule (168-bit, encryption) 67 * 68 * \param ctx 3DES context to be initialized 69 * \param key 24-byte secret key 70 */ 71 void des3_set3key_enc( des3_context *ctx, const unsigned char key[24] ); 72 73 /** 74 * \brief Triple-DES key schedule (168-bit, decryption) 75 * 76 * \param ctx 3DES context to be initialized 77 * \param key 24-byte secret key 78 */ 79 void des3_set3key_dec( des3_context *ctx, const unsigned char key[24] ); 80 81 /** 82 * \brief DES-ECB block encryption/decryption 83 * 84 * \param ctx DES context 85 * \param input 64-bit input block 86 * \param output 64-bit output block 87 * 88 * \return 0 if successful 89 */ 90 int des_crypt_ecb( des_context *ctx, 91 const unsigned char input[8], 92 unsigned char output[8] ); 93 94 /** 95 * \brief DES-CBC buffer encryption/decryption 96 * 97 * \param ctx DES context 98 * \param mode DES_ENCRYPT or DES_DECRYPT 99 * \param length length of the input data 100 * \param iv initialization vector (updated after use) 101 * \param input buffer holding the input data 102 * \param output buffer holding the output data 103 */ 104 int des_crypt_cbc( des_context *ctx, 105 int mode, 106 int length, 107 unsigned char iv[8], 108 const unsigned char *input, 109 unsigned char *output ); 110 111 /** 112 * \brief 3DES-ECB block encryption/decryption 113 * 114 * \param ctx 3DES context 115 * \param input 64-bit input block 116 * \param output 64-bit output block 117 * 118 * \return 0 if successful 119 */ 120 int des3_crypt_ecb( des3_context *ctx, 121 const unsigned char input[8], 122 unsigned char output[8] ); 123 124 /** 125 * \brief 3DES-CBC buffer encryption/decryption 126 * 127 * \param ctx 3DES context 128 * \param mode DES_ENCRYPT or DES_DECRYPT 129 * \param length length of the input data 130 * \param iv initialization vector (updated after use) 131 * \param input buffer holding the input data 132 * \param output buffer holding the output data 133 * 134 * \return 0 if successful, or POLARSSL_ERR_DES_INVALID_INPUT_LENGTH 135 */ 136 int des3_crypt_cbc( des3_context *ctx, 137 int mode, 138 int length, 139 unsigned char iv[8], 140 const unsigned char *input, 141 unsigned char *output ); 142 143 /* 144 * \brief Checkup routine 145 * 146 * \return 0 if successful, or 1 if the test failed 147 */ 148 int des_self_test( int verbose ); 149 150 #ifdef __cplusplus 151 } 152 #endif 153 154 #endif /* des.h */ 155 #ifndef POLARSSL_CONFIG_H 156 #define POLARSSL_CONFIG_H 157 158 #ifndef _CRT_SECURE_NO_DEPRECATE 159 #define _CRT_SECURE_NO_DEPRECATE 1 160 #endif 161 162 /* 163 * Uncomment if native integers are 8-bit wide. 164 * 165 #define POLARSSL_HAVE_INT8 166 */ 167 168 /* 169 * Uncomment if native integers are 16-bit wide. 170 * 171 #define POLARSSL_HAVE_INT16 172 */ 173 174 /* 175 * Uncomment if the compiler supports long long. 176 * 177 #define POLARSSL_HAVE_LONGLONG 178 */ 179 180 /* 181 * Uncomment to enable the use of assembly code. 182 * 183 * Requires support for asm() in compiler. 184 * 185 * Used in: 186 * library/timing.c 187 * library/padlock.c 188 * include/polarssl/bn_mul.h 189 * 190 */ 191 #define POLARSSL_HAVE_ASM 192 193 /* 194 * Uncomment if the CPU supports SSE2 (IA-32 specific). 195 * 196 #define POLARSSL_HAVE_SSE2 197 */ 198 199 /* 200 * Enable all SSL/TLS debugging messages. 201 */ 202 #define POLARSSL_DEBUG_MSG 203 204 /* 205 * Enable the checkup functions (*_self_test). 206 */ 207 #define POLARSSL_SELF_TEST 208 209 /* 210 * Enable run-time version information functions 211 */ 212 #define POLARSSL_VERSION_C 213 214 /* 215 * Enable the prime-number generation code. 216 */ 217 #define POLARSSL_GENPRIME 218 219 /* 220 * Uncomment this macro to store the AES tables in ROM. 221 * 222 #define POLARSSL_AES_ROM_TABLES 223 */ 224 225 /* 226 * Module: library/aes.c 227 * Caller: library/ssl_tls.c 228 * 229 * This module enables the following ciphersuites: 230 * SSL_RSA_AES_128_SHA 231 * SSL_RSA_AES_256_SHA 232 * SSL_EDH_RSA_AES_256_SHA 233 */ 234 #define POLARSSL_AES_C 235 236 /* 237 * Module: library/arc4.c 238 * Caller: library/ssl_tls.c 239 * 240 * This module enables the following ciphersuites: 241 * SSL_RSA_RC4_128_MD5 242 * SSL_RSA_RC4_128_SHA 243 */ 244 #define POLARSSL_ARC4_C 245 246 /* 247 * Module: library/base64.c 248 * Caller: library/x509parse.c 249 * 250 * This module is required for X.509 support. 251 */ 252 #define POLARSSL_BASE64_C 253 254 /* 255 * Module: library/bignum.c 256 * Caller: library/dhm.c 257 * library/rsa.c 258 * library/ssl_tls.c 259 * library/x509parse.c 260 * 261 * This module is required for RSA and DHM support. 262 */ 263 #define POLARSSL_BIGNUM_C 264 265 /* 266 * Module: library/camellia.c 267 * Caller: library/ssl_tls.c 268 * 269 * This module enabled the following cipher suites: 270 * SSL_RSA_CAMELLIA_128_SHA 271 * SSL_RSA_CAMELLIA_256_SHA 272 * SSL_EDH_RSA_CAMELLIA_256_SHA 273 */ 274 #define POLARSSL_CAMELLIA_C 275 276 /* 277 * Module: library/certs.c 278 * Caller: 279 * 280 * This module is used for testing (ssl_client/server). 281 */ 282 #define POLARSSL_CERTS_C 283 284 /* 285 * Module: library/debug.c 286 * Caller: library/ssl_cli.c 287 * library/ssl_srv.c 288 * library/ssl_tls.c 289 * 290 * This module provides debugging functions. 291 */ 292 #define POLARSSL_DEBUG_C 293 294 /* 295 * Module: library/des.c 296 * Caller: library/ssl_tls.c 297 * 298 * This module enables the following ciphersuites: 299 * SSL_RSA_DES_168_SHA 300 * SSL_EDH_RSA_DES_168_SHA 301 */ 302 #define POLARSSL_DES_C 303 304 /* 305 * Module: library/dhm.c 306 * Caller: library/ssl_cli.c 307 * library/ssl_srv.c 308 * 309 * This module enables the following ciphersuites: 310 * SSL_EDH_RSA_DES_168_SHA 311 * SSL_EDH_RSA_AES_256_SHA 312 * SSL_EDH_RSA_CAMELLIA_256_SHA 313 */ 314 #define POLARSSL_DHM_C 315 316 /* 317 * Module: library/havege.c 318 * Caller: 319 * 320 * This module enables the HAVEGE random number generator. 321 */ 322 #define POLARSSL_HAVEGE_C 323 324 /* 325 * Module: library/md2.c 326 * Caller: library/x509parse.c 327 * 328 * Uncomment to enable support for (rare) MD2-signed X.509 certs. 329 * 330 #define POLARSSL_MD2_C 331 */ 332 333 /* 334 * Module: library/md4.c 335 * Caller: library/x509parse.c 336 * 337 * Uncomment to enable support for (rare) MD4-signed X.509 certs. 338 * 339 #define POLARSSL_MD4_C 340 */ 341 342 /* 343 * Module: library/md5.c 344 * Caller: library/ssl_tls.c 345 * library/x509parse.c 346 * 347 * This module is required for SSL/TLS and X.509. 348 */ 349 #define POLARSSL_MD5_C 350 351 /* 352 * Module: library/net.c 353 * Caller: 354 * 355 * This module provides TCP/IP networking routines. 356 */ 357 #define POLARSSL_NET_C 358 359 /* 360 * Module: library/padlock.c 361 * Caller: library/aes.c 362 * 363 * This modules adds support for the VIA PadLock on x86. 364 */ 365 #define POLARSSL_PADLOCK_C 366 367 /* 368 * Module: library/rsa.c 369 * Caller: library/ssl_cli.c 370 * library/ssl_srv.c 371 * library/ssl_tls.c 372 * library/x509.c 373 * 374 * This module is required for SSL/TLS and MD5-signed certificates. 375 */ 376 #define POLARSSL_RSA_C 377 378 /* 379 * Module: library/sha1.c 380 * Caller: library/ssl_cli.c 381 * library/ssl_srv.c 382 * library/ssl_tls.c 383 * library/x509parse.c 384 * 385 * This module is required for SSL/TLS and SHA1-signed certificates. 386 */ 387 #define POLARSSL_SHA1_C 388 389 /* 390 * Module: library/sha2.c 391 * Caller: 392 * 393 * This module adds support for SHA-224 and SHA-256. 394 */ 395 #define POLARSSL_SHA2_C 396 397 /* 398 * Module: library/sha4.c 399 * Caller: 400 * 401 * This module adds support for SHA-384 and SHA-512. 402 */ 403 #define POLARSSL_SHA4_C 404 405 /* 406 * Module: library/ssl_cli.c 407 * Caller: 408 * 409 * This module is required for SSL/TLS client support. 410 */ 411 #define POLARSSL_SSL_CLI_C 412 413 /* 414 * Module: library/ssl_srv.c 415 * Caller: 416 * 417 * This module is required for SSL/TLS server support. 418 */ 419 #define POLARSSL_SSL_SRV_C 420 421 /* 422 * Module: library/ssl_tls.c 423 * Caller: library/ssl_cli.c 424 * library/ssl_srv.c 425 * 426 * This module is required for SSL/TLS. 427 */ 428 #define POLARSSL_SSL_TLS_C 429 430 /* 431 * Module: library/timing.c 432 * Caller: library/havege.c 433 * 434 * This module is used by the HAVEGE random number generator. 435 */ 436 #define POLARSSL_TIMING_C 437 438 /* 439 * Module: library/x509parse.c 440 * Caller: library/ssl_cli.c 441 * library/ssl_srv.c 442 * library/ssl_tls.c 443 * 444 * This module is required for X.509 certificate parsing. 445 */ 446 #define POLARSSL_X509_PARSE_C 447 448 /* 449 * Module: library/x509_write.c 450 * Caller: 451 * 452 * This module is required for X.509 certificate writing. 453 */ 454 #define POLARSSL_X509_WRITE_C 455 456 /* 457 * Module: library/xtea.c 458 * Caller: 459 */ 460 #define POLARSSL_XTEA_C 461 462 #endif /* config.h */ 463 464 465 466 467 #ifndef POLARSSL_TIMING_H 468 #define POLARSSL_TIMING_H 469 470 471 struct hr_time 472 { 473 unsigned char opaque[32]; 474 }; 475 476 #ifdef __cplusplus 477 extern "C" { 478 #endif 479 480 extern int alarmed; 481 unsigned long hardclock( void ); 482 483 484 unsigned long get_timer( struct hr_time *val, int reset ); 485 486 487 void set_alarm( int seconds ); 488 489 490 void m_sleep( int milliseconds ); 491 492 #ifdef __cplusplus 493 } 494 #endif 495 496 #endif 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 #define BUFSIZE 32768 512 513 514 515 #if defined(POLARSSL_TIMING_C) 516 517 518 519 #if defined(_WIN32) 520 521 #include <windows.h> 522 #include <winbase.h> 523 524 struct _hr_time 525 { 526 LARGE_INTEGER start; 527 }; 528 529 #else 530 531 #include <unistd.h> 532 #include <sys/types.h> 533 #include <sys/time.h> 534 #include <signal.h> 535 #include <time.h> 536 537 struct _hr_time 538 { 539 struct timeval start; 540 }; 541 542 #endif 543 544 #if defined(POLARSSL_HAVE_ASM) && \ 545 (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) 546 547 unsigned long hardclock( void ) 548 { 549 unsigned long tsc; 550 __asm rdtsc 551 __asm mov [tsc], eax 552 return( tsc ); 553 } 554 555 #else 556 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && defined(__i386__) 557 558 unsigned long hardclock( void ) 559 { 560 unsigned long tsc; 561 asm( "rdtsc" : "=a" (tsc) ); 562 return( tsc ); 563 } 564 565 #else 566 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && \ 567 (defined(__amd64__) || defined(__x86_64__)) 568 569 unsigned long hardclock( void ) 570 { 571 unsigned long lo, hi; 572 asm( "rdtsc" : "=a" (lo), "=d" (hi) ); 573 return( lo | (hi << 32) ); 574 } 575 576 #else 577 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && \ 578 (defined(__powerpc__) || defined(__ppc__)) 579 580 unsigned long hardclock( void ) 581 { 582 unsigned long tbl, tbu0, tbu1; 583 584 do 585 { 586 asm( "mftbu %0" : "=r" (tbu0) ); 587 asm( "mftb %0" : "=r" (tbl ) ); 588 asm( "mftbu %0" : "=r" (tbu1) ); 589 } 590 while( tbu0 != tbu1 ); 591 592 return( tbl ); 593 } 594 595 #else 596 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && defined(__sparc__) 597 598 unsigned long hardclock( void ) 599 { 600 unsigned long tick; 601 asm( ".byte 0x83, 0x41, 0x00, 0x00" ); 602 asm( "mov %%g1, %0" : "=r" (tick) ); 603 return( tick ); 604 } 605 606 #else 607 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && defined(__alpha__) 608 609 unsigned long hardclock( void ) 610 { 611 unsigned long cc; 612 asm( "rpcc %0" : "=r" (cc) ); 613 return( cc & 0xFFFFFFFF ); 614 } 615 616 #else 617 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && defined(__ia64__) 618 619 unsigned long hardclock( void ) 620 { 621 unsigned long itc; 622 asm( "mov %0 = ar.itc" : "=r" (itc) ); 623 return( itc ); 624 } 625 626 #else 627 628 static int hardclock_init = 0; 629 static struct timeval tv_init; 630 631 unsigned long hardclock( void ) 632 { 633 struct timeval tv_cur; 634 635 if( hardclock_init == 0 ) 636 { 637 gettimeofday( &tv_init, NULL ); 638 hardclock_init = 1; 639 } 640 641 gettimeofday( &tv_cur, NULL ); 642 return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000 643 + ( tv_cur.tv_usec - tv_init.tv_usec ) ); 644 } 645 646 #endif /* generic */ 647 #endif /* IA-64 */ 648 #endif /* Alpha */ 649 #endif /* SPARC8 */ 650 #endif /* PowerPC */ 651 #endif /* AMD64 */ 652 #endif /* i586+ */ 653 654 int alarmed = 0; 655 656 #if defined(_WIN32) 657 658 unsigned long get_timer( struct hr_time *val, int reset ) 659 { 660 unsigned long delta; 661 LARGE_INTEGER offset, hfreq; 662 struct _hr_time *t = (struct _hr_time *) val; 663 664 QueryPerformanceCounter( &offset ); 665 QueryPerformanceFrequency( &hfreq ); 666 667 delta = (unsigned long)( ( 1000 * 668 ( offset.QuadPart - t->start.QuadPart ) ) / 669 hfreq.QuadPart ); 670 671 if( reset ) 672 QueryPerformanceCounter( &t->start ); 673 674 return( delta ); 675 } 676 677 DWORD WINAPI TimerProc( LPVOID uElapse ) 678 { 679 Sleep( (DWORD) uElapse ); 680 alarmed = 1; 681 return( TRUE ); 682 } 683 684 void set_alarm( int seconds ) 685 { 686 DWORD ThreadId; 687 688 alarmed = 0; 689 CloseHandle( CreateThread( NULL, 0, TimerProc, 690 (LPVOID) ( seconds * 1000 ), 0, &ThreadId ) ); 691 } 692 693 void m_sleep( int milliseconds ) 694 { 695 Sleep( milliseconds ); 696 } 697 698 #else 699 700 unsigned long get_timer( struct hr_time *val, int reset ) 701 { 702 unsigned long delta; 703 struct timeval offset; 704 struct _hr_time *t = (struct _hr_time *) val; 705 706 gettimeofday( &offset, NULL ); 707 708 delta = ( offset.tv_sec - t->start.tv_sec ) * 1000 709 + ( offset.tv_usec - t->start.tv_usec ) / 1000; 710 711 if( reset ) 712 { 713 t->start.tv_sec = offset.tv_sec; 714 t->start.tv_usec = offset.tv_usec; 715 } 716 717 return( delta ); 718 } 719 720 static void sighandler( int signum ) 721 { 722 alarmed = 1; 723 signal( signum, sighandler ); 724 } 725 726 void set_alarm( int seconds ) 727 { 728 alarmed = 0; 729 signal( SIGALRM, sighandler ); 730 alarm( seconds ); 731 } 732 733 void m_sleep( int milliseconds ) 734 { 735 struct timeval tv; 736 737 tv.tv_sec = milliseconds / 1000; 738 tv.tv_usec = milliseconds * 1000; 739 740 select( 0, NULL, NULL, NULL, &tv ); 741 } 742 743 #endif 744 745 #endif 746 747 748 749 750 751 #if defined(POLARSSL_DES_C) 752 753 754 755 #include <string.h> 756 757 /* 758 * 32-bit integer manipulation macros (big endian) 759 */ 760 #ifndef GET_ULONG_BE 761 #define GET_ULONG_BE(n,b,i) \ 762 { \ 763 (n) = ( (unsigned long) (b)[(i) ] << 24 ) \ 764 | ( (unsigned long) (b)[(i) + 1] << 16 ) \ 765 | ( (unsigned long) (b)[(i) + 2] << 8 ) \ 766 | ( (unsigned long) (b)[(i) + 3] ); \ 767 } 768 #endif 769 770 #ifndef PUT_ULONG_BE 771 #define PUT_ULONG_BE(n,b,i) \ 772 { \ 773 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ 774 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ 775 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ 776 (b)[(i) + 3] = (unsigned char) ( (n) ); \ 777 } 778 #endif 779 780 /* 781 * Expanded DES S-boxes 782 */ 783 static const unsigned long SB1[64] = 784 { 785 0x01010400, 0x00000000, 0x00010000, 0x01010404, 786 0x01010004, 0x00010404, 0x00000004, 0x00010000, 787 0x00000400, 0x01010400, 0x01010404, 0x00000400, 788 0x01000404, 0x01010004, 0x01000000, 0x00000004, 789 0x00000404, 0x01000400, 0x01000400, 0x00010400, 790 0x00010400, 0x01010000, 0x01010000, 0x01000404, 791 0x00010004, 0x01000004, 0x01000004, 0x00010004, 792 0x00000000, 0x00000404, 0x00010404, 0x01000000, 793 0x00010000, 0x01010404, 0x00000004, 0x01010000, 794 0x01010400, 0x01000000, 0x01000000, 0x00000400, 795 0x01010004, 0x00010000, 0x00010400, 0x01000004, 796 0x00000400, 0x00000004, 0x01000404, 0x00010404, 797 0x01010404, 0x00010004, 0x01010000, 0x01000404, 798 0x01000004, 0x00000404, 0x00010404, 0x01010400, 799 0x00000404, 0x01000400, 0x01000400, 0x00000000, 800 0x00010004, 0x00010400, 0x00000000, 0x01010004 801 }; 802 803 static const unsigned long SB2[64] = 804 { 805 0x80108020, 0x80008000, 0x00008000, 0x00108020, 806 0x00100000, 0x00000020, 0x80100020, 0x80008020, 807 0x80000020, 0x80108020, 0x80108000, 0x80000000, 808 0x80008000, 0x00100000, 0x00000020, 0x80100020, 809 0x00108000, 0x00100020, 0x80008020, 0x00000000, 810 0x80000000, 0x00008000, 0x00108020, 0x80100000, 811 0x00100020, 0x80000020, 0x00000000, 0x00108000, 812 0x00008020, 0x80108000, 0x80100000, 0x00008020, 813 0x00000000, 0x00108020, 0x80100020, 0x00100000, 814 0x80008020, 0x80100000, 0x80108000, 0x00008000, 815 0x80100000, 0x80008000, 0x00000020, 0x80108020, 816 0x00108020, 0x00000020, 0x00008000, 0x80000000, 817 0x00008020, 0x80108000, 0x00100000, 0x80000020, 818 0x00100020, 0x80008020, 0x80000020, 0x00100020, 819 0x00108000, 0x00000000, 0x80008000, 0x00008020, 820 0x80000000, 0x80100020, 0x80108020, 0x00108000 821 }; 822 823 static const unsigned long SB3[64] = 824 { 825 0x00000208, 0x08020200, 0x00000000, 0x08020008, 826 0x08000200, 0x00000000, 0x00020208, 0x08000200, 827 0x00020008, 0x08000008, 0x08000008, 0x00020000, 828 0x08020208, 0x00020008, 0x08020000, 0x00000208, 829 0x08000000, 0x00000008, 0x08020200, 0x00000200, 830 0x00020200, 0x08020000, 0x08020008, 0x00020208, 831 0x08000208, 0x00020200, 0x00020000, 0x08000208, 832 0x00000008, 0x08020208, 0x00000200, 0x08000000, 833 0x08020200, 0x08000000, 0x00020008, 0x00000208, 834 0x00020000, 0x08020200, 0x08000200, 0x00000000, 835 0x00000200, 0x00020008, 0x08020208, 0x08000200, 836 0x08000008, 0x00000200, 0x00000000, 0x08020008, 837 0x08000208, 0x00020000, 0x08000000, 0x08020208, 838 0x00000008, 0x00020208, 0x00020200, 0x08000008, 839 0x08020000, 0x08000208, 0x00000208, 0x08020000, 840 0x00020208, 0x00000008, 0x08020008, 0x00020200 841 }; 842 843 static const unsigned long SB4[64] = 844 { 845 0x00802001, 0x00002081, 0x00002081, 0x00000080, 846 0x00802080, 0x00800081, 0x00800001, 0x00002001, 847 0x00000000, 0x00802000, 0x00802000, 0x00802081, 848 0x00000081, 0x00000000, 0x00800080, 0x00800001, 849 0x00000001, 0x00002000, 0x00800000, 0x00802001, 850 0x00000080, 0x00800000, 0x00002001, 0x00002080, 851 0x00800081, 0x00000001, 0x00002080, 0x00800080, 852 0x00002000, 0x00802080, 0x00802081, 0x00000081, 853 0x00800080, 0x00800001, 0x00802000, 0x00802081, 854 0x00000081, 0x00000000, 0x00000000, 0x00802000, 855 0x00002080, 0x00800080, 0x00800081, 0x00000001, 856 0x00802001, 0x00002081, 0x00002081, 0x00000080, 857 0x00802081, 0x00000081, 0x00000001, 0x00002000, 858 0x00800001, 0x00002001, 0x00802080, 0x00800081, 859 0x00002001, 0x00002080, 0x00800000, 0x00802001, 860 0x00000080, 0x00800000, 0x00002000, 0x00802080 861 }; 862 863 static const unsigned long SB5[64] = 864 { 865 0x00000100, 0x02080100, 0x02080000, 0x42000100, 866 0x00080000, 0x00000100, 0x40000000, 0x02080000, 867 0x40080100, 0x00080000, 0x02000100, 0x40080100, 868 0x42000100, 0x42080000, 0x00080100, 0x40000000, 869 0x02000000, 0x40080000, 0x40080000, 0x00000000, 870 0x40000100, 0x42080100, 0x42080100, 0x02000100, 871 0x42080000, 0x40000100, 0x00000000, 0x42000000, 872 0x02080100, 0x02000000, 0x42000000, 0x00080100, 873 0x00080000, 0x42000100, 0x00000100, 0x02000000, 874 0x40000000, 0x02080000, 0x42000100, 0x40080100, 875 0x02000100, 0x40000000, 0x42080000, 0x02080100, 876 0x40080100, 0x00000100, 0x02000000, 0x42080000, 877 0x42080100, 0x00080100, 0x42000000, 0x42080100, 878 0x02080000, 0x00000000, 0x40080000, 0x42000000, 879 0x00080100, 0x02000100, 0x40000100, 0x00080000, 880 0x00000000, 0x40080000, 0x02080100, 0x40000100 881 }; 882 883 static const unsigned long SB6[64] = 884 { 885 0x20000010, 0x20400000, 0x00004000, 0x20404010, 886 0x20400000, 0x00000010, 0x20404010, 0x00400000, 887 0x20004000, 0x00404010, 0x00400000, 0x20000010, 888 0x00400010, 0x20004000, 0x20000000, 0x00004010, 889 0x00000000, 0x00400010, 0x20004010, 0x00004000, 890 0x00404000, 0x20004010, 0x00000010, 0x20400010, 891 0x20400010, 0x00000000, 0x00404010, 0x20404000, 892 0x00004010, 0x00404000, 0x20404000, 0x20000000, 893 0x20004000, 0x00000010, 0x20400010, 0x00404000, 894 0x20404010, 0x00400000, 0x00004010, 0x20000010, 895 0x00400000, 0x20004000, 0x20000000, 0x00004010, 896 0x20000010, 0x20404010, 0x00404000, 0x20400000, 897 0x00404010, 0x20404000, 0x00000000, 0x20400010, 898 0x00000010, 0x00004000, 0x20400000, 0x00404010, 899 0x00004000, 0x00400010, 0x20004010, 0x00000000, 900 0x20404000, 0x20000000, 0x00400010, 0x20004010 901 }; 902 903 static const unsigned long SB7[64] = 904 { 905 0x00200000, 0x04200002, 0x04000802, 0x00000000, 906 0x00000800, 0x04000802, 0x00200802, 0x04200800, 907 0x04200802, 0x00200000, 0x00000000, 0x04000002, 908 0x00000002, 0x04000000, 0x04200002, 0x00000802, 909 0x04000800, 0x00200802, 0x00200002, 0x04000800, 910 0x04000002, 0x04200000, 0x04200800, 0x00200002, 911 0x04200000, 0x00000800, 0x00000802, 0x04200802, 912 0x00200800, 0x00000002, 0x04000000, 0x00200800, 913 0x04000000, 0x00200800, 0x00200000, 0x04000802, 914 0x04000802, 0x04200002, 0x04200002, 0x00000002, 915 0x00200002, 0x04000000, 0x04000800, 0x00200000, 916 0x04200800, 0x00000802, 0x00200802, 0x04200800, 917 0x00000802, 0x04000002, 0x04200802, 0x04200000, 918 0x00200800, 0x00000000, 0x00000002, 0x04200802, 919 0x00000000, 0x00200802, 0x04200000, 0x00000800, 920 0x04000002, 0x04000800, 0x00000800, 0x00200002 921 }; 922 923 static const unsigned long SB8[64] = 924 { 925 0x10001040, 0x00001000, 0x00040000, 0x10041040, 926 0x10000000, 0x10001040, 0x00000040, 0x10000000, 927 0x00040040, 0x10040000, 0x10041040, 0x00041000, 928 0x10041000, 0x00041040, 0x00001000, 0x00000040, 929 0x10040000, 0x10000040, 0x10001000, 0x00001040, 930 0x00041000, 0x00040040, 0x10040040, 0x10041000, 931 0x00001040, 0x00000000, 0x00000000, 0x10040040, 932 0x10000040, 0x10001000, 0x00041040, 0x00040000, 933 0x00041040, 0x00040000, 0x10041000, 0x00001000, 934 0x00000040, 0x10040040, 0x00001000, 0x00041040, 935 0x10001000, 0x00000040, 0x10000040, 0x10040000, 936 0x10040040, 0x10000000, 0x00040000, 0x10001040, 937 0x00000000, 0x10041040, 0x00040040, 0x10000040, 938 0x10040000, 0x10001000, 0x10001040, 0x00000000, 939 0x10041040, 0x00041000, 0x00041000, 0x00001040, 940 0x00001040, 0x00040040, 0x10000000, 0x10041000 941 }; 942 943 /* 944 * PC1: left and right halves bit-swap 945 */ 946 static const unsigned long LHs[16] = 947 { 948 0x00000000, 0x00000001, 0x00000100, 0x00000101, 949 0x00010000, 0x00010001, 0x00010100, 0x00010101, 950 0x01000000, 0x01000001, 0x01000100, 0x01000101, 951 0x01010000, 0x01010001, 0x01010100, 0x01010101 952 }; 953 954 static const unsigned long RHs[16] = 955 { 956 0x00000000, 0x01000000, 0x00010000, 0x01010000, 957 0x00000100, 0x01000100, 0x00010100, 0x01010100, 958 0x00000001, 0x01000001, 0x00010001, 0x01010001, 959 0x00000101, 0x01000101, 0x00010101, 0x01010101, 960 }; 961 962 /* 963 * Initial Permutation macro 964 */ 965 #define DES_IP(X,Y) \ 966 { \ 967 T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \ 968 T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \ 969 T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \ 970 T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \ 971 Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF; \ 972 T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T; \ 973 X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF; \ 974 } 975 976 /* 977 * Final Permutation macro 978 */ 979 #define DES_FP(X,Y) \ 980 { \ 981 X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF; \ 982 T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T; \ 983 Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF; \ 984 T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \ 985 T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \ 986 T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \ 987 T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \ 988 } 989 990 /* 991 * DES round macro 992 */ 993 #define DES_ROUND(X,Y) \ 994 { \ 995 T = *SK++ ^ X; \ 996 Y ^= SB8[ (T ) & 0x3F ] ^ \ 997 SB6[ (T >> 8) & 0x3F ] ^ \ 998 SB4[ (T >> 16) & 0x3F ] ^ \ 999 SB2[ (T >> 24) & 0x3F ]; \ 1000 \ 1001 T = *SK++ ^ ((X << 28) | (X >> 4)); \ 1002 Y ^= SB7[ (T ) & 0x3F ] ^ \ 1003 SB5[ (T >> 8) & 0x3F ] ^ \ 1004 SB3[ (T >> 16) & 0x3F ] ^ \ 1005 SB1[ (T >> 24) & 0x3F ]; \ 1006 } 1007 1008 #define SWAP(a,b) { unsigned long t = a; a = b; b = t; t = 0; } 1009 1010 static void des_setkey( unsigned long SK[32], const unsigned char key[8] ) 1011 { 1012 int i; 1013 unsigned long X, Y, T; 1014 1015 GET_ULONG_BE( X, key, 0 ); 1016 GET_ULONG_BE( Y, key, 4 ); 1017 1018 /* 1019 * Permuted Choice 1 1020 */ 1021 T = ((Y >> 4) ^ X) & 0x0F0F0F0F; X ^= T; Y ^= (T << 4); 1022 T = ((Y ) ^ X) & 0x10101010; X ^= T; Y ^= (T ); 1023 1024 X = (LHs[ (X ) & 0xF] << 3) | (LHs[ (X >> 8) & 0xF ] << 2) 1025 | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ] ) 1026 | (LHs[ (X >> 5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6) 1027 | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4); 1028 1029 Y = (RHs[ (Y >> 1) & 0xF] << 3) | (RHs[ (Y >> 9) & 0xF ] << 2) 1030 | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ] ) 1031 | (RHs[ (Y >> 4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6) 1032 | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4); 1033 1034 X &= 0x0FFFFFFF; 1035 Y &= 0x0FFFFFFF; 1036 1037 /* 1038 * calculate subkeys 1039 */ 1040 for( i = 0; i < 16; i++ ) 1041 { 1042 if( i < 2 || i == 8 || i == 15 ) 1043 { 1044 X = ((X << 1) | (X >> 27)) & 0x0FFFFFFF; 1045 Y = ((Y << 1) | (Y >> 27)) & 0x0FFFFFFF; 1046 } 1047 else 1048 { 1049 X = ((X << 2) | (X >> 26)) & 0x0FFFFFFF; 1050 Y = ((Y << 2) | (Y >> 26)) & 0x0FFFFFFF; 1051 } 1052 1053 *SK++ = ((X << 4) & 0x24000000) | ((X << 28) & 0x10000000) 1054 | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000) 1055 | ((X << 6) & 0x01000000) | ((X << 9) & 0x00200000) 1056 | ((X >> 1) & 0x00100000) | ((X << 10) & 0x00040000) 1057 | ((X << 2) & 0x00020000) | ((X >> 10) & 0x00010000) 1058 | ((Y >> 13) & 0x00002000) | ((Y >> 4) & 0x00001000) 1059 | ((Y << 6) & 0x00000800) | ((Y >> 1) & 0x00000400) 1060 | ((Y >> 14) & 0x00000200) | ((Y ) & 0x00000100) 1061 | ((Y >> 5) & 0x00000020) | ((Y >> 10) & 0x00000010) 1062 | ((Y >> 3) & 0x00000008) | ((Y >> 18) & 0x00000004) 1063 | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001); 1064 1065 *SK++ = ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000) 1066 | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000) 1067 | ((X >> 2) & 0x02000000) | ((X << 1) & 0x01000000) 1068 | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000) 1069 | ((X << 3) & 0x00080000) | ((X >> 6) & 0x00040000) 1070 | ((X << 15) & 0x00020000) | ((X >> 4) & 0x00010000) 1071 | ((Y >> 2) & 0x00002000) | ((Y << 8) & 0x00001000) 1072 | ((Y >> 14) & 0x00000808) | ((Y >> 9) & 0x00000400) 1073 | ((Y ) & 0x00000200) | ((Y << 7) & 0x00000100) 1074 | ((Y >> 7) & 0x00000020) | ((Y >> 3) & 0x00000011) 1075 | ((Y << 2) & 0x00000004) | ((Y >> 21) & 0x00000002); 1076 } 1077 } 1078 1079 /* 1080 * DES key schedule (56-bit, encryption) 1081 */ 1082 void des_setkey_enc( des_context *ctx, const unsigned char key[8] ) 1083 { 1084 des_setkey( ctx->sk, key ); 1085 } 1086 1087 /* 1088 * DES key schedule (56-bit, decryption) 1089 */ 1090 void des_setkey_dec( des_context *ctx, const unsigned char key[8] ) 1091 { 1092 int i; 1093 1094 des_setkey( ctx->sk, key ); 1095 1096 for( i = 0; i < 16; i += 2 ) 1097 { 1098 SWAP( ctx->sk[i ], ctx->sk[30 - i] ); 1099 SWAP( ctx->sk[i + 1], ctx->sk[31 - i] ); 1100 } 1101 } 1102 1103 static void des3_set2key( unsigned long esk[96], 1104 unsigned long dsk[96], 1105 const unsigned char key[16] ) 1106 { 1107 int i; 1108 1109 des_setkey( esk, key ); 1110 des_setkey( dsk + 32, key + 8 ); 1111 1112 for( i = 0; i < 32; i += 2 ) 1113 { 1114 dsk[i ] = esk[30 - i]; 1115 dsk[i + 1] = esk[31 - i]; 1116 1117 esk[i + 32] = dsk[62 - i]; 1118 esk[i + 33] = dsk[63 - i]; 1119 1120 esk[i + 64] = esk[i ]; 1121 esk[i + 65] = esk[i + 1]; 1122 1123 dsk[i + 64] = dsk[i ]; 1124 dsk[i + 65] = dsk[i + 1]; 1125 } 1126 } 1127 1128 /* 1129 * Triple-DES key schedule (112-bit, encryption) 1130 */ 1131 void des3_set2key_enc( des3_context *ctx, const unsigned char key[16] ) 1132 { 1133 unsigned long sk[96]; 1134 1135 des3_set2key( ctx->sk, sk, key ); 1136 memset( sk, 0, sizeof( sk ) ); 1137 } 1138 1139 /* 1140 * Triple-DES key schedule (112-bit, decryption) 1141 */ 1142 void des3_set2key_dec( des3_context *ctx, const unsigned char key[16] ) 1143 { 1144 unsigned long sk[96]; 1145 1146 des3_set2key( sk, ctx->sk, key ); 1147 memset( sk, 0, sizeof( sk ) ); 1148 } 1149 1150 static void des3_set3key( unsigned long esk[96], 1151 unsigned long dsk[96], 1152 const unsigned char key[24] ) 1153 { 1154 int i; 1155 1156 des_setkey( esk, key ); 1157 des_setkey( dsk + 32, key + 8 ); 1158 des_setkey( esk + 64, key + 16 ); 1159 1160 for( i = 0; i < 32; i += 2 ) 1161 { 1162 dsk[i ] = esk[94 - i]; 1163 dsk[i + 1] = esk[95 - i]; 1164 1165 esk[i + 32] = dsk[62 - i]; 1166 esk[i + 33] = dsk[63 - i]; 1167 1168 dsk[i + 64] = esk[30 - i]; 1169 dsk[i + 65] = esk[31 - i]; 1170 } 1171 } 1172 1173 /* 1174 * Triple-DES key schedule (168-bit, encryption) 1175 */ 1176 void des3_set3key_enc( des3_context *ctx, const unsigned char key[24] ) 1177 { 1178 unsigned long sk[96]; 1179 1180 des3_set3key( ctx->sk, sk, key ); 1181 memset( sk, 0, sizeof( sk ) ); 1182 } 1183 1184 /* 1185 * Triple-DES key schedule (168-bit, decryption) 1186 */ 1187 void des3_set3key_dec( des3_context *ctx, const unsigned char key[24] ) 1188 { 1189 unsigned long sk[96]; 1190 1191 des3_set3key( sk, ctx->sk, key ); 1192 memset( sk, 0, sizeof( sk ) ); 1193 } 1194 1195 /* 1196 * DES-ECB block encryption/decryption 1197 */ 1198 int des_crypt_ecb( des_context *ctx, 1199 const unsigned char input[8], 1200 unsigned char output[8] ) 1201 { 1202 int i; 1203 unsigned long X, Y, T, *SK; 1204 1205 SK = ctx->sk; 1206 1207 GET_ULONG_BE( X, input, 0 ); 1208 GET_ULONG_BE( Y, input, 4 ); 1209 1210 DES_IP( X, Y ); 1211 1212 for( i = 0; i < 8; i++ ) 1213 { 1214 DES_ROUND( Y, X ); 1215 DES_ROUND( X, Y ); 1216 } 1217 1218 DES_FP( Y, X ); 1219 1220 PUT_ULONG_BE( Y, output, 0 ); 1221 PUT_ULONG_BE( X, output, 4 ); 1222 1223 return( 0 ); 1224 } 1225 1226 /* 1227 * DES-CBC buffer encryption/decryption 1228 */ 1229 int des_crypt_cbc( des_context *ctx, 1230 int mode, 1231 int length, 1232 unsigned char iv[8], 1233 const unsigned char *input, 1234 unsigned char *output ) 1235 { 1236 int i; 1237 unsigned char temp[8]; 1238 1239 if( length % 8 ) 1240 return( POLARSSL_ERR_DES_INVALID_INPUT_LENGTH ); 1241 1242 if( mode == DES_ENCRYPT ) 1243 { 1244 while( length > 0 ) 1245 { 1246 for( i = 0; i < 8; i++ ) 1247 output[i] = (unsigned char)( input[i] ^ iv[i] ); 1248 1249 des_crypt_ecb( ctx, output, output ); 1250 memcpy( iv, output, 8 ); 1251 1252 input += 8; 1253 output += 8; 1254 length -= 8; 1255 } 1256 } 1257 else /* DES_DECRYPT */ 1258 { 1259 while( length > 0 ) 1260 { 1261 memcpy( temp, input, 8 ); 1262 des_crypt_ecb( ctx, input, output ); 1263 1264 for( i = 0; i < 8; i++ ) 1265 output[i] = (unsigned char)( output[i] ^ iv[i] ); 1266 1267 memcpy( iv, temp, 8 ); 1268 1269 input += 8; 1270 output += 8; 1271 length -= 8; 1272 } 1273 } 1274 1275 return( 0 ); 1276 } 1277 1278 /* 1279 * 3DES-ECB block encryption/decryption 1280 */ 1281 int des3_crypt_ecb( des3_context *ctx, 1282 const unsigned char input[8], 1283 unsigned char output[8] ) 1284 { 1285 int i; 1286 unsigned long X, Y, T, *SK; 1287 1288 SK = ctx->sk; 1289 1290 GET_ULONG_BE( X, input, 0 ); 1291 GET_ULONG_BE( Y, input, 4 ); 1292 1293 DES_IP( X, Y ); 1294 1295 for( i = 0; i < 8; i++ ) 1296 { 1297 DES_ROUND( Y, X ); 1298 DES_ROUND( X, Y ); 1299 } 1300 1301 for( i = 0; i < 8; i++ ) 1302 { 1303 DES_ROUND( X, Y ); 1304 DES_ROUND( Y, X ); 1305 } 1306 1307 for( i = 0; i < 8; i++ ) 1308 { 1309 DES_ROUND( Y, X ); 1310 DES_ROUND( X, Y ); 1311 } 1312 1313 DES_FP( Y, X ); 1314 1315 PUT_ULONG_BE( Y, output, 0 ); 1316 PUT_ULONG_BE( X, output, 4 ); 1317 1318 return( 0 ); 1319 } 1320 1321 /* 1322 * 3DES-CBC buffer encryption/decryption 1323 */ 1324 int des3_crypt_cbc( des3_context *ctx, 1325 int mode, 1326 int length, 1327 unsigned char iv[8], 1328 const unsigned char *input, 1329 unsigned char *output ) 1330 { 1331 int i; 1332 unsigned char temp[8]; 1333 1334 if( length % 8 ) 1335 return( POLARSSL_ERR_DES_INVALID_INPUT_LENGTH ); 1336 1337 if( mode == DES_ENCRYPT ) 1338 { 1339 while( length > 0 ) 1340 { 1341 for( i = 0; i < 8; i++ ) 1342 output[i] = (unsigned char)( input[i] ^ iv[i] ); 1343 1344 des3_crypt_ecb( ctx, output, output ); 1345 memcpy( iv, output, 8 ); 1346 1347 input += 8; 1348 output += 8; 1349 length -= 8; 1350 } 1351 } 1352 else /* DES_DECRYPT */ 1353 { 1354 while( length > 0 ) 1355 { 1356 memcpy( temp, input, 8 ); 1357 des3_crypt_ecb( ctx, input, output ); 1358 1359 for( i = 0; i < 8; i++ ) 1360 output[i] = (unsigned char)( output[i] ^ iv[i] ); 1361 1362 memcpy( iv, temp, 8 ); 1363 1364 input += 8; 1365 output += 8; 1366 length -= 8; 1367 } 1368 } 1369 1370 return( 0 ); 1371 } 1372 1373 #if defined(POLARSSL_SELF_TEST) 1374 1375 #include <stdio.h> 1376 1377 /* 1378 * DES and 3DES test vectors from: 1379 1381 */ 1382 static const unsigned char des3_test_keys[24] = 1383 { 1384 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 1385 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 1386 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23 1387 }; 1388 1389 static const unsigned char des3_test_iv[8] = 1390 { 1391 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 1392 }; 1393 1394 static const unsigned char des3_test_buf[8] = 1395 { 1396 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 1397 }; 1398 1399 static const unsigned char des3_test_ecb_dec[3][8] = 1400 { 1401 { 0xCD, 0xD6, 0x4F, 0x2F, 0x94, 0x27, 0xC1, 0x5D }, 1402 { 0x69, 0x96, 0xC8, 0xFA, 0x47, 0xA2, 0xAB, 0xEB }, 1403 { 0x83, 0x25, 0x39, 0x76, 0x44, 0x09, 0x1A, 0x0A } 1404 }; 1405 1406 static const unsigned char des3_test_ecb_enc[3][8] = 1407 { 1408 { 0x6A, 0x2A, 0x19, 0xF4, 0x1E, 0xCA, 0x85, 0x4B }, 1409 { 0x03, 0xE6, 0x9F, 0x5B, 0xFA, 0x58, 0xEB, 0x42 }, 1410 { 0xDD, 0x17, 0xE8, 0xB8, 0xB4, 0x37, 0xD2, 0x32 } 1411 }; 1412 1413 static const unsigned char des3_test_cbc_dec[3][8] = 1414 { 1415 { 0x12, 0x9F, 0x40, 0xB9, 0xD2, 0x00, 0x56, 0xB3 }, 1416 { 0x47, 0x0E, 0xFC, 0x9A, 0x6B, 0x8E, 0xE3, 0x93 }, 1417 { 0xC5, 0xCE, 0xCF, 0x63, 0xEC, 0xEC, 0x51, 0x4C } 1418 }; 1419 1420 static const unsigned char des3_test_cbc_enc[3][8] = 1421 { 1422 { 0x54, 0xF1, 0x5A, 0xF6, 0xEB, 0xE3, 0xA4, 0xB4 }, 1423 { 0x35, 0x76, 0x11, 0x56, 0x5F, 0xA1, 0x8E, 0x4D }, 1424 { 0xCB, 0x19, 0x1F, 0x85, 0xD1, 0xED, 0x84, 0x39 } 1425 }; 1426 1427 /* 1428 * Checkup routine 1429 */ 1430 int des_self_test( int verbose ) 1431 { 1432 int i, j, u, v; 1433 des_context ctx; 1434 des3_context ctx3; 1435 unsigned char key[24]; 1436 unsigned char buf[8]; 1437 unsigned char prv[8]; 1438 unsigned char iv[8]; 1439 1440 memset( key, 0, 24 ); 1441 1442 /* 1443 * ECB mode 1444 */ 1445 for( i = 0; i < 6; i++ ) 1446 { 1447 u = i >> 1; 1448 v = i & 1; 1449 1450 if( verbose != 0 ) 1451 printf( " DES%c-ECB-%3d (%s): ", 1452 ( u == 0 ) ? ' ' : '3', 56 + u * 56, 1453 ( v == DES_DECRYPT ) ? "dec" : "enc" ); 1454 1455 memcpy( buf, des3_test_buf, 8 ); 1456 1457 switch( i ) 1458 { 1459 case 0: 1460 des_setkey_dec( &ctx, (unsigned char *) des3_test_keys ); 1461 break; 1462 1463 case 1: 1464 des_setkey_enc( &ctx, (unsigned char *) des3_test_keys ); 1465 break; 1466 1467 case 2: 1468 des3_set2key_dec( &ctx3, (unsigned char *) des3_test_keys ); 1469 break; 1470 1471 case 3: 1472 des3_set2key_enc( &ctx3, (unsigned char *) des3_test_keys ); 1473 break; 1474 1475 case 4: 1476 des3_set3key_dec( &ctx3, (unsigned char *) des3_test_keys ); 1477 break; 1478 1479 case 5: 1480 des3_set3key_enc( &ctx3, (unsigned char *) des3_test_keys ); 1481 break; 1482 1483 default: 1484 return( 1 ); 1485 } 1486 1487 for( j = 0; j < 10000; j++ ) 1488 { 1489 if( u == 0 ) 1490 des_crypt_ecb( &ctx, buf, buf ); 1491 else 1492 des3_crypt_ecb( &ctx3, buf, buf ); 1493 } 1494 1495 if( ( v == DES_DECRYPT && 1496 memcmp( buf, des3_test_ecb_dec[u], 8 ) != 0 ) || 1497 ( v != DES_DECRYPT && 1498 memcmp( buf, des3_test_ecb_enc[u], 8 ) != 0 ) ) 1499 { 1500 if( verbose != 0 ) 1501 printf( "failed\n" ); 1502 1503 return( 1 ); 1504 } 1505 1506 if( verbose != 0 ) 1507 printf( "passed\n" ); 1508 } 1509 1510 if( verbose != 0 ) 1511 printf( "\n" ); 1512 1513 /* 1514 * CBC mode 1515 */ 1516 for( i = 0; i < 6; i++ ) 1517 { 1518 u = i >> 1; 1519 v = i & 1; 1520 1521 if( verbose != 0 ) 1522 printf( " DES%c-CBC-%3d (%s): ", 1523 ( u == 0 ) ? ' ' : '3', 56 + u * 56, 1524 ( v == DES_DECRYPT ) ? "dec" : "enc" ); 1525 1526 memcpy( iv, des3_test_iv, 8 ); 1527 memcpy( prv, des3_test_iv, 8 ); 1528 memcpy( buf, des3_test_buf, 8 ); 1529 1530 switch( i ) 1531 { 1532 case 0: 1533 des_setkey_dec( &ctx, (unsigned char *) des3_test_keys ); 1534 break; 1535 1536 case 1: 1537 des_setkey_enc( &ctx, (unsigned char *) des3_test_keys ); 1538 break; 1539 1540 case 2: 1541 des3_set2key_dec( &ctx3, (unsigned char *) des3_test_keys ); 1542 break; 1543 1544 case 3: 1545 des3_set2key_enc( &ctx3, (unsigned char *) des3_test_keys ); 1546 break; 1547 1548 case 4: 1549 des3_set3key_dec( &ctx3, (unsigned char *) des3_test_keys ); 1550 break; 1551 1552 case 5: 1553 des3_set3key_enc( &ctx3, (unsigned char *) des3_test_keys ); 1554 break; 1555 1556 default: 1557 return( 1 ); 1558 } 1559 1560 if( v == DES_DECRYPT ) 1561 { 1562 for( j = 0; j < 10000; j++ ) 1563 { 1564 if( u == 0 ) 1565 des_crypt_cbc( &ctx, v, 8, iv, buf, buf ); 1566 else 1567 des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf ); 1568 } 1569 } 1570 else 1571 { 1572 for( j = 0; j < 10000; j++ ) 1573 { 1574 unsigned char tmp[8]; 1575 1576 if( u == 0 ) 1577 des_crypt_cbc( &ctx, v, 8, iv, buf, buf ); 1578 else 1579 des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf ); 1580 1581 memcpy( tmp, prv, 8 ); 1582 memcpy( prv, buf, 8 ); 1583 memcpy( buf, tmp, 8 ); 1584 } 1585 1586 memcpy( buf, prv, 8 ); 1587 } 1588 1589 if( ( v == DES_DECRYPT && 1590 memcmp( buf, des3_test_cbc_dec[u], 8 ) != 0 ) || 1591 ( v != DES_DECRYPT && 1592 memcmp( buf, des3_test_cbc_enc[u], 8 ) != 0 ) ) 1593 { 1594 if( verbose != 0 ) 1595 printf( "failed\n" ); 1596 1597 return( 1 ); 1598 } 1599 1600 if( verbose != 0 ) 1601 printf( "passed\n" ); 1602 } 1603 1604 if( verbose != 0 ) 1605 printf( "\n" ); 1606 1607 return( 0 ); 1608 } 1609 1610 #endif 1611 1612 #endif 1613 /*里面包含加密 解密 des DES3 */ 1614 /* 1615 int for_encrypt_des3(char *data, unsigned int len) 1616 { 1617 int i, j; 1618 unsigned char buf[BUFSIZE]; 1619 unsigned long tsc; 1620 unsigned char tmp[64]; 1621 FILE *fp; 1622 1623 des3_context des3; 1624 1625 1626 // des_context des; 1627 1628 des_setkey_enc( &des, tmp); 1629 set_alarm( 1 ); 1630 for(i=1; !alarmed; i++) des_crypt_cbc( &des, DES_ENCRYPT, BUFSIZE, tmp, buf, buf ); 1631 tsc = hardclock(); 1632 for(j=0; j<1024; j++) des_crypt_cbc( &des, DES_ENCRYPT, BUFSIZE, tmp, buf, buf ); 1633 printf("DES speed: %9lu Kb/s, %9lu cycles/byte\n", i*BUFSIZE /1024, (hardclock()-tsc)/(j*BUFSIZE)); 1634 1635 1636 1637 1638 des3_set3key_enc( &des3, tmp ); 1639 set_alarm( 1 ); 1640 for(i=1; !alarmed; i++) des3_crypt_cbc( &des3, DES_ENCRYPT, BUFSIZE, tmp, buf, buf ); 1641 tsc = hardclock(); 1642 for(j=0; j<1024; j++) des3_crypt_cbc( &des3, DES_ENCRYPT, BUFSIZE, tmp, buf, buf ); 1643 1644 DO_LOG("DES3 speed: %9lu Kb/s, %9lu cycles/byte\n", i*BUFSIZE/1024, (hardclock()-tsc)/(j*BUFSIZE)); 1645 1646 1647 1648 memset(tmp, 0, sizeof(tmp)); strcpy(tmp, "01234567abcdefgh"); 1649 memset(buf, 0, sizeof(buf)); strncpy(buf, data,len); 1650 des3_set3key_enc( &des3, tmp); 1651 DO_LOG("DES3 pwd=%s, txt=%s\n", tmp, buf); 1652 des3_crypt_cbc(&des3, DES_ENCRYPT, 32768, tmp, buf, buf ); 1653 DO_LOG("encrypt txt=%s\n",buf); 1654 fp = fopen("/D1", "wb"); 1655 if(fp!=NULL) 1656 { 1657 fprintf(fp,"%s",buf); 1658 fclose(fp); 1659 } 1660 1661 1662 1663 1664 memset(tmp, 0, sizeof(tmp)); strcpy(tmp, "01234567abcdefgh"); 1665 des3_set3key_dec(&des3, tmp); 1666 des3_crypt_cbc(&des3, DES_DECRYPT, 32768, tmp, buf, buf ); 1667 //DO_LOG("decrypt txt= %s\n",buf); 1668 1669 1670 memset(tmp, 0, sizeof(tmp)); strcpy(tmp, "01234567abcdefgh"); 1671 des_setkey_dec(&des, tmp); 1672 des_crypt_cbc(&des, DES_DECRYPT, 32768, tmp, buf, buf ); 1673 fp = fopen("/D2", "wb"); 1674 if(fp!=NULL) 1675 { 1676 fprintf(fp,"%s",buf); 1677 fclose(fp); 1678 } 1679 return 0; 1680 } 1681 */ 1682 int hexcharToInt(char c) 1683 { 1684 if (c >= '0' && c <= '9') return (c - '0'); 1685 if (c >= 'A' && c <= 'F') return (c - 'A' + 10); 1686 if (c >= 'a' && c <= 'f') return (c - 'a' + 10); 1687 return 0; 1688 } 1689 1690 void hexstringToBytes(char* hexstring,char* bytes,int hexlength) 1691 { 1692 int i=0 ; 1693 //cout<<"length is :"<<sizeof(hexstring)/sizeof(char)<<endl; 1694 for (i=0 ; i <hexlength ; i+=2) 1695 { 1696 bytes[i/2] = (char) ((hexcharToInt(hexstring[i]) << 4)| hexcharToInt(hexstring[i+1])); 1697 } 1698 } 1699 1700 void for_decode_des3(unsigned char *data, unsigned int len)//解密 1701 { 1702 char buf[3000]; 1703 unsigned char tmp[64]; 1704 des3_context des3; 1705 memset(buf, 0, 3000); 1706 hexstringToBytes((char *)data, buf, 3000); 1707 memset(data,0,3000); 1708 strncpy((char*)data,buf,strlen(buf)); 1709 1710 1711 memset(tmp, 0, sizeof(tmp)); strcpy((char*)tmp, "JDWA2003"); 1712 des3_set3key_dec(&des3, tmp); 1713 des3_crypt_cbc(&des3, DES_DECRYPT, 1024, tmp, data,data); 1714 }