Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(735)

Side by Side Diff: nss/lib/freebl/des.c

Issue 1504923011: Update NSS to 3.21 RTM and NSPR to 4.11 RTM (Closed) Base URL: http://src.chromium.org/svn/trunk/deps/third_party/nss
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * des.c 2 * des.c
3 * 3 *
4 * core source file for DES-150 library 4 * core source file for DES-150 library
5 * Make key schedule from DES key. 5 * Make key schedule from DES key.
6 * Encrypt/Decrypt one 8-byte block. 6 * Encrypt/Decrypt one 8-byte block.
7 * 7 *
8 * This Source Code Form is subject to the terms of the Mozilla Public 8 * This Source Code Form is subject to the terms of the Mozilla Public
9 * License, v. 2.0. If a copy of the MPL was not distributed with this 9 * License, v. 2.0. If a copy of the MPL was not distributed with this
10 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 10 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
11 11
12 #include "des.h" 12 #include "des.h"
13 #include <stddef.h> /* for ptrdiff_t */ 13 #include <stddef.h> /* for ptrdiff_t */
14 /* #define USE_INDEXING 1 */ 14 /* #define USE_INDEXING 1 */
15 15
16 /* Some processors automatically fix up unaligned memory access, so they can
17 * read or write a HALF (4 bytes) at a time whether the address is 4-byte
18 * aligned or not. */
19 #if defined(NSS_X86_OR_X64)
20 #define HAVE_UNALIGNED_ACCESS 1
21 #endif
22
16 /* 23 /*
17 * The tables below are the 8 sbox functions, with the 6-bit input permutation 24 * The tables below are the 8 sbox functions, with the 6-bit input permutation
18 * and the 32-bit output permutation pre-computed. 25 * and the 32-bit output permutation pre-computed.
19 * They are shifted circularly to the left 3 bits, which removes 2 shifts 26 * They are shifted circularly to the left 3 bits, which removes 2 shifts
20 * and an or from each round by reducing the number of sboxes whose 27 * and an or from each round by reducing the number of sboxes whose
21 * indices cross word broundaries from 2 to 1. 28 * indices cross word broundaries from 2 to 1.
22 */ 29 */
23 30
24 static const HALF SP[8][64] = { 31 static const HALF SP[8][64] = {
25 /* Box S1 */ { 32 /* Box S1 */ {
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 421
415 void 422 void
416 DES_MakeSchedule( HALF * ks, const BYTE * key, DESDirection direction) 423 DES_MakeSchedule( HALF * ks, const BYTE * key, DESDirection direction)
417 { 424 {
418 register HALF left, right; 425 register HALF left, right;
419 register HALF c0, d0; 426 register HALF c0, d0;
420 register HALF temp; 427 register HALF temp;
421 int delta; 428 int delta;
422 unsigned int ls; 429 unsigned int ls;
423 430
424 #if defined(NSS_X86_OR_X64) 431 #if defined(HAVE_UNALIGNED_ACCESS)
425 left = HALFPTR(key)[0]; 432 left = HALFPTR(key)[0];
426 right = HALFPTR(key)[1]; 433 right = HALFPTR(key)[1];
434 #if defined(IS_LITTLE_ENDIAN)
427 BYTESWAP(left, temp); 435 BYTESWAP(left, temp);
428 BYTESWAP(right, temp); 436 BYTESWAP(right, temp);
437 #endif
429 #else 438 #else
430 if (((ptrdiff_t)key & 0x03) == 0) { 439 if (((ptrdiff_t)key & 0x03) == 0) {
431 left = HALFPTR(key)[0]; 440 left = HALFPTR(key)[0];
432 right = HALFPTR(key)[1]; 441 right = HALFPTR(key)[1];
433 #if defined(IS_LITTLE_ENDIAN) 442 #if defined(IS_LITTLE_ENDIAN)
434 BYTESWAP(left, temp); 443 BYTESWAP(left, temp);
435 BYTESWAP(right, temp); 444 BYTESWAP(right, temp);
436 #endif 445 #endif
437 } else { 446 } else {
438 left = ((HALF)key[0] << 24) | ((HALF)key[1] << 16) | 447 left = ((HALF)key[0] << 24) | ((HALF)key[1] << 16) |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 left ^= temp << 16; \ 574 left ^= temp << 16; \
566 right ^= temp = ((left >> 4) ^ right) & 0x0f0f0f0f; \ 575 right ^= temp = ((left >> 4) ^ right) & 0x0f0f0f0f; \
567 left ^= temp << 4; 576 left ^= temp << 4;
568 577
569 void 578 void
570 DES_Do1Block(HALF * ks, const BYTE * inbuf, BYTE * outbuf) 579 DES_Do1Block(HALF * ks, const BYTE * inbuf, BYTE * outbuf)
571 { 580 {
572 register HALF left, right; 581 register HALF left, right;
573 register HALF temp; 582 register HALF temp;
574 583
575 #if defined(NSS_X86_OR_X64) 584 #if defined(HAVE_UNALIGNED_ACCESS)
576 left = HALFPTR(inbuf)[0]; 585 left = HALFPTR(inbuf)[0];
577 right = HALFPTR(inbuf)[1]; 586 right = HALFPTR(inbuf)[1];
587 #if defined(IS_LITTLE_ENDIAN)
578 BYTESWAP(left, temp); 588 BYTESWAP(left, temp);
579 BYTESWAP(right, temp); 589 BYTESWAP(right, temp);
590 #endif
580 #else 591 #else
581 if (((ptrdiff_t)inbuf & 0x03) == 0) { 592 if (((ptrdiff_t)inbuf & 0x03) == 0) {
582 left = HALFPTR(inbuf)[0]; 593 left = HALFPTR(inbuf)[0];
583 right = HALFPTR(inbuf)[1]; 594 right = HALFPTR(inbuf)[1];
584 #if defined(IS_LITTLE_ENDIAN) 595 #if defined(IS_LITTLE_ENDIAN)
585 BYTESWAP(left, temp); 596 BYTESWAP(left, temp);
586 BYTESWAP(right, temp); 597 BYTESWAP(right, temp);
587 #endif 598 #endif
588 } else { 599 } else {
589 left = ((HALF)inbuf[0] << 24) | ((HALF)inbuf[1] << 16) | 600 left = ((HALF)inbuf[0] << 24) | ((HALF)inbuf[1] << 16) |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 647
637 /* now shift circularly right 3 bits to undo the shifting done 648 /* now shift circularly right 3 bits to undo the shifting done
638 ** above. switch left and right here. 649 ** above. switch left and right here.
639 */ 650 */
640 temp = (left >> 3) | (left << 29); 651 temp = (left >> 3) | (left << 29);
641 left = (right >> 3) | (right << 29); 652 left = (right >> 3) | (right << 29);
642 right = temp; 653 right = temp;
643 654
644 FP(left, right, temp); 655 FP(left, right, temp);
645 656
646 #if defined(NSS_X86_OR_X64) 657 #if defined(HAVE_UNALIGNED_ACCESS)
658 #if defined(IS_LITTLE_ENDIAN)
647 BYTESWAP(left, temp); 659 BYTESWAP(left, temp);
648 BYTESWAP(right, temp); 660 BYTESWAP(right, temp);
661 #endif
649 HALFPTR(outbuf)[0] = left; 662 HALFPTR(outbuf)[0] = left;
650 HALFPTR(outbuf)[1] = right; 663 HALFPTR(outbuf)[1] = right;
651 #else 664 #else
652 if (((ptrdiff_t)outbuf & 0x03) == 0) { 665 if (((ptrdiff_t)outbuf & 0x03) == 0) {
653 #if defined(IS_LITTLE_ENDIAN) 666 #if defined(IS_LITTLE_ENDIAN)
654 BYTESWAP(left, temp); 667 BYTESWAP(left, temp);
655 BYTESWAP(right, temp); 668 BYTESWAP(right, temp);
656 #endif 669 #endif
657 HALFPTR(outbuf)[0] = left; 670 HALFPTR(outbuf)[0] = left;
658 HALFPTR(outbuf)[1] = right; 671 HALFPTR(outbuf)[1] = right;
(...skipping 12 matching lines...) Expand all
671 684
672 } 685 }
673 686
674 /* Ackowledgements: 687 /* Ackowledgements:
675 ** Two ideas used in this implementation were shown to me by Dennis Ferguson 688 ** Two ideas used in this implementation were shown to me by Dennis Ferguson
676 ** in 1990. He credits them to Richard Outerbridge and Dan Hoey. They were: 689 ** in 1990. He credits them to Richard Outerbridge and Dan Hoey. They were:
677 ** 1. The method of computing the Initial and Final permutations. 690 ** 1. The method of computing the Initial and Final permutations.
678 ** 2. Circularly rotating the SP tables and the initial values of left and 691 ** 2. Circularly rotating the SP tables and the initial values of left and
679 ** right to reduce the number of shifts required during the 16 rounds. 692 ** right to reduce the number of shifts required during the 16 rounds.
680 */ 693 */
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698