summaryrefslogtreecommitdiff
path: root/src/lib/libc/crypt
diff options
context:
space:
mode:
authorniklas <>1998-08-30 22:35:39 +0000
committerniklas <>1998-08-30 22:35:39 +0000
commite9167bf16e397e0e0a3cf229c19a6ea8af165654 (patch)
treedb15f16bf6ce1151d4883bbcefadfc3ce71a7403 /src/lib/libc/crypt
parent43a4b6b64c7688c7b672c0f5d351a613e0bc531e (diff)
downloadopenbsd-e9167bf16e397e0e0a3cf229c19a6ea8af165654.tar.gz
openbsd-e9167bf16e397e0e0a3cf229c19a6ea8af165654.tar.bz2
openbsd-e9167bf16e397e0e0a3cf229c19a6ea8af165654.zip
Fix UA cases in a MI way
Diffstat (limited to 'src/lib/libc/crypt')
-rw-r--r--src/lib/libc/crypt/blowfish.c116
1 files changed, 59 insertions, 57 deletions
diff --git a/src/lib/libc/crypt/blowfish.c b/src/lib/libc/crypt/blowfish.c
index 261ace5c21..6cddbc64b3 100644
--- a/src/lib/libc/crypt/blowfish.c
+++ b/src/lib/libc/crypt/blowfish.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: blowfish.c,v 1.11 1998/08/22 07:12:58 deraadt Exp $ */ 1/* $OpenBSD: blowfish.c,v 1.12 1998/08/30 22:35:39 niklas Exp $ */
2/* 2/*
3 * Blowfish block cipher for OpenBSD 3 * Blowfish block cipher for OpenBSD
4 * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> 4 * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
@@ -585,24 +585,6 @@ blf_dec(c, data, blocks)
585 } 585 }
586} 586}
587 587
588/* Repeating operations for little endian machines */
589
590/*
591 * XXX This code is NOT correct for unaligned-access faulting machines.
592 */
593#define BLF_BLK_ENC l = ntohl (*(u_int32_t *)data); \
594 r = ntohl (*(u_int32_t *)(data+4)); \
595 Blowfish_encipher(c, &l, &r); \
596 *(u_int32_t *)data = htonl (l); \
597 *(u_int32_t *)(data + 4) = htonl (r);
598
599#define BLF_BLK_DEC l = ntohl (*(u_int32_t *)data); \
600 r = ntohl (*(u_int32_t *)(data+4)); \
601 Blowfish_decipher(c, &l, &r); \
602 *(u_int32_t *)data = htonl (l); \
603 *(u_int32_t *)(data + 4) = htonl (r);
604
605
606#if __STDC__ 588#if __STDC__
607void 589void
608blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len) 590blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
@@ -618,13 +600,17 @@ blf_ecb_encrypt(c, data, len)
618 u_int32_t i; 600 u_int32_t i;
619 601
620 for (i = 0; i < len; i += 8) { 602 for (i = 0; i < len; i += 8) {
621#if BYTE_ORDER == LITTLE_ENDIAN 603 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
622 BLF_BLK_ENC; 604 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
623#else
624 memcpy(&l, data, sizeof l);
625 memcpy(&r, data + 4, sizeof r);
626 Blowfish_encipher(c, &l, &r); 605 Blowfish_encipher(c, &l, &r);
627#endif 606 data[0] = l >> 24 & 0xff;
607 data[1] = l >> 16 & 0xff;
608 data[2] = l >> 8 & 0xff;
609 data[3] = l & 0xff;
610 data[4] = r >> 24 & 0xff;
611 data[5] = r >> 16 & 0xff;
612 data[6] = r >> 8 & 0xff;
613 data[7] = r & 0xff;
628 data += 8; 614 data += 8;
629 } 615 }
630} 616}
@@ -644,13 +630,17 @@ blf_ecb_decrypt(c, data, len)
644 u_int32_t i; 630 u_int32_t i;
645 631
646 for (i = 0; i < len; i += 8) { 632 for (i = 0; i < len; i += 8) {
647#if BYTE_ORDER == LITTLE_ENDIAN 633 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
648 BLF_BLK_DEC; 634 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
649#else
650 memcpy(&l, data, sizeof l);
651 memcpy(&r, data + 4, sizeof r);
652 Blowfish_decipher(c, &l, &r); 635 Blowfish_decipher(c, &l, &r);
653#endif 636 data[0] = l >> 24 & 0xff;
637 data[1] = l >> 16 & 0xff;
638 data[2] = l >> 8 & 0xff;
639 data[3] = l & 0xff;
640 data[4] = r >> 24 & 0xff;
641 data[5] = r >> 16 & 0xff;
642 data[6] = r >> 8 & 0xff;
643 data[7] = r & 0xff;
654 data += 8; 644 data += 8;
655 } 645 }
656} 646}
@@ -668,18 +658,22 @@ blf_cbc_encrypt(c, iv, data, len)
668#endif 658#endif
669{ 659{
670 u_int32_t l, r; 660 u_int32_t l, r;
671 u_int32_t i; 661 u_int32_t i, j;
672 662
673 for (i = 0; i < len; i += 8) { 663 for (i = 0; i < len; i += 8) {
674 *(u_int32_t *)data ^= *(u_int32_t *)iv; 664 for (j = 0; j < 8; j++)
675 *(u_int32_t *)(data + 4) ^= *(u_int32_t *)(iv + 4); 665 data[j] ^= iv[j];
676#if BYTE_ORDER == LITTLE_ENDIAN 666 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
677 BLF_BLK_ENC; 667 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
678#else
679 memcpy(&l, data, sizeof l);
680 memcpy(&r, data + 4, sizeof r);
681 Blowfish_encipher(c, &l, &r); 668 Blowfish_encipher(c, &l, &r);
682#endif 669 data[0] = l >> 24 & 0xff;
670 data[1] = l >> 16 & 0xff;
671 data[2] = l >> 8 & 0xff;
672 data[3] = l & 0xff;
673 data[4] = r >> 24 & 0xff;
674 data[5] = r >> 16 & 0xff;
675 data[6] = r >> 8 & 0xff;
676 data[7] = r & 0xff;
683 iv = data; 677 iv = data;
684 data += 8; 678 data += 8;
685 } 679 }
@@ -699,32 +693,40 @@ blf_cbc_decrypt(c, iva, data, len)
699{ 693{
700 u_int32_t l, r; 694 u_int32_t l, r;
701 u_int8_t *iv; 695 u_int8_t *iv;
702 u_int32_t i; 696 u_int32_t i, j;
703 697
704 iv = data + len - 16; 698 iv = data + len - 16;
705 data = data + len - 8; 699 data = data + len - 8;
706 for (i = len - 8; i >= 8; i -= 8) { 700 for (i = len - 8; i >= 8; i -= 8) {
707#if BYTE_ORDER == LITTLE_ENDIAN 701 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
708 BLF_BLK_DEC; 702 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
709#else
710 memcpy(&l, data, sizeof l);
711 memcpy(&r, data + 4, sizeof r);
712 Blowfish_decipher(c, &l, &r); 703 Blowfish_decipher(c, &l, &r);
713#endif 704 data[0] = l >> 24 & 0xff;
714 *(u_int32_t *)data ^= *(u_int32_t *)iv; 705 data[1] = l >> 16 & 0xff;
715 *(u_int32_t *)(data + 4) ^= *(u_int32_t *)(iv + 4); 706 data[2] = l >> 8 & 0xff;
707 data[3] = l & 0xff;
708 data[4] = r >> 24 & 0xff;
709 data[5] = r >> 16 & 0xff;
710 data[6] = r >> 8 & 0xff;
711 data[7] = r & 0xff;
712 for (j = 0; j < 8; j++)
713 data[j] ^= iv[j];
716 iv = data; 714 iv = data;
717 data -= 8; 715 data -= 8;
718 } 716 }
719#if BYTE_ORDER == LITTLE_ENDIAN 717 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
720 BLF_BLK_DEC; 718 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
721#else
722 memcpy(&l, data, sizeof l);
723 memcpy(&r, data + 4, sizeof r);
724 Blowfish_decipher(c, &l, &r); 719 Blowfish_decipher(c, &l, &r);
725#endif 720 data[0] = l >> 24 & 0xff;
726 *(u_int32_t *)data ^= *(u_int32_t *)iva; 721 data[1] = l >> 16 & 0xff;
727 *(u_int32_t *)(data + 4) ^= *(u_int32_t *)(iva + 4); 722 data[2] = l >> 8 & 0xff;
723 data[3] = l & 0xff;
724 data[4] = r >> 24 & 0xff;
725 data[5] = r >> 16 & 0xff;
726 data[6] = r >> 8 & 0xff;
727 data[7] = r & 0xff;
728 for (j = 0; j < 8; j++)
729 data[j] ^= iva[j];
728} 730}
729 731
730#if 0 732#if 0