UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
crypt_des.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define qfDES_CBC_d(_key, _data, _size, _initVec)
 
#define qfDES_CBC_e(_key, _data, _size, _initVec)
 
#define qfDES_CFB_d(_key, _data, _size, _initVec)
 
#define qfDES_CFB_e(_key, _data, _size, _initVec)
 
#define qfDES_ECB_d(_key, _data, _size)
 
#define qfDES_ECB_e(_key, _data, _size)
 
#define qfDES_generateIV()
 
#define qfDES_generateKey()
 
#define qfDES_OFB_d(_key, _data, _size, _initVec)
 
#define qfDES_OFB_e(_key, _data, _size, _initVec)
 
#define qfDES_padSpace()
 
#define qfDES_padZero()
 
#define qfDES_plainTextSize(_ptr, _size)
 

Enumerations

enum  QFDES_generate { qfDES_key , qfDES_iv }
 
enum  QFDES_mode { qfDES_ecb , qfDES_cbc , qfDES_cfb , qfDES_ofb }
 
enum  QFDES_parity { qfDES_even , qfDES_odd }
 
enum  QFDES_what { qfDES_encrypt , qfDES_decrypt }
 

Functions

int qfDES (unsigned char *key, unsigned char *data, unsigned int size, const QFDES_what what, const QFDES_mode mode, unsigned char *initVec)
 
unsigned int qfDES_checkParity (unsigned char *ptr, unsigned int size, const QFDES_parity parity)
 
int qfDES_checkWeakKeys (unsigned char *key)
 
unsigned char * qfDES_generate (const QFDES_generate what)
 
unsigned char qfDES_setPad (unsigned char pad)
 
void qfDES_setParity (unsigned char *ptr, unsigned int size, const QFDES_parity parity)
 

Macro Definition Documentation

◆ qfDES_CBC_d

#define qfDES_CBC_d ( _key,
_data,
_size,
_initVec )
Value:
qfDES(_key, _data, _size, qfDES_decrypt, qfDES_cbc, _initVec)
@ qfDES_cbc
Definition crypt_des.h:21
@ qfDES_decrypt
Definition crypt_des.h:18
int qfDES(unsigned char *key, unsigned char *data, unsigned int size, const QFDES_what what, const QFDES_mode mode, unsigned char *initVec)
Definition crypt_des.c:558

Definition at line 38 of file crypt_des.h.

Referenced by des_decrypt(), and test_des().

◆ qfDES_CBC_e

#define qfDES_CBC_e ( _key,
_data,
_size,
_initVec )
Value:
qfDES(_key, _data, _size, qfDES_encrypt, qfDES_cbc, _initVec)
@ qfDES_encrypt
Definition crypt_des.h:18

Definition at line 37 of file crypt_des.h.

Referenced by des_encrypt(), and test_des().

◆ qfDES_CFB_d

#define qfDES_CFB_d ( _key,
_data,
_size,
_initVec )
Value:
qfDES(_key, _data, _size, qfDES_decrypt, qfDES_cfb, _initVec)
@ qfDES_cfb
Definition crypt_des.h:21

Definition at line 41 of file crypt_des.h.

◆ qfDES_CFB_e

#define qfDES_CFB_e ( _key,
_data,
_size,
_initVec )
Value:
qfDES(_key, _data, _size, qfDES_encrypt, qfDES_cfb, _initVec)

Definition at line 40 of file crypt_des.h.

◆ qfDES_ECB_d

#define qfDES_ECB_d ( _key,
_data,
_size )
Value:
qfDES(_key, _data, _size, qfDES_decrypt, qfDES_ecb, (unsigned char *) 0)
@ qfDES_ecb
Definition crypt_des.h:21

Definition at line 35 of file crypt_des.h.

Referenced by test_des().

◆ qfDES_ECB_e

#define qfDES_ECB_e ( _key,
_data,
_size )
Value:
qfDES(_key, _data, _size, qfDES_encrypt, qfDES_ecb, (unsigned char *) 0)

Definition at line 34 of file crypt_des.h.

Referenced by test_des().

◆ qfDES_generateIV

#define qfDES_generateIV ( )
Value:
@ qfDES_iv
Definition crypt_des.h:27
unsigned char * qfDES_generate(const QFDES_generate what)
Definition crypt_des.c:921

Definition at line 62 of file crypt_des.h.

◆ qfDES_generateKey

#define qfDES_generateKey ( )
Value:

Definition at line 61 of file crypt_des.h.

◆ qfDES_OFB_d

#define qfDES_OFB_d ( _key,
_data,
_size,
_initVec )
Value:
qfDES(_key, _data, _size, qfDES_decrypt, qfDES_ofb, _initVec)
@ qfDES_ofb
Definition crypt_des.h:21

Definition at line 44 of file crypt_des.h.

◆ qfDES_OFB_e

#define qfDES_OFB_e ( _key,
_data,
_size,
_initVec )
Value:
qfDES(_key, _data, _size, qfDES_encrypt, qfDES_ofb, _initVec)

Definition at line 43 of file crypt_des.h.

◆ qfDES_padSpace

#define qfDES_padSpace ( )
Value:
qfDES_setPad((unsigned char) ' ')
unsigned char qfDES_setPad(unsigned char pad)
Definition crypt_des.c:949

Definition at line 49 of file crypt_des.h.

◆ qfDES_padZero

#define qfDES_padZero ( )
Value:
qfDES_setPad((unsigned char) '\0')

Definition at line 50 of file crypt_des.h.

◆ qfDES_plainTextSize

#define qfDES_plainTextSize ( _ptr,
_size )
Value:
(unsigned int) ((_size) - (unsigned int) (_ptr)[(_size) - 1])

Definition at line 53 of file crypt_des.h.

Enumeration Type Documentation

◆ QFDES_generate

Enumerator
qfDES_key 
qfDES_iv 

Definition at line 27 of file crypt_des.h.

◆ QFDES_mode

enum QFDES_mode
Enumerator
qfDES_ecb 
qfDES_cbc 
qfDES_cfb 
qfDES_ofb 

Definition at line 21 of file crypt_des.h.

◆ QFDES_parity

Enumerator
qfDES_even 
qfDES_odd 

Definition at line 24 of file crypt_des.h.

QFDES_parity
Definition crypt_des.h:24
@ qfDES_odd
Definition crypt_des.h:24
@ qfDES_even
Definition crypt_des.h:24

◆ QFDES_what

enum QFDES_what
Enumerator
qfDES_encrypt 
qfDES_decrypt 

Definition at line 18 of file crypt_des.h.

Function Documentation

◆ qfDES()

int qfDES ( unsigned char * key,
unsigned char * data,
unsigned int size,
const QFDES_what what,
const QFDES_mode mode,
unsigned char * initVec )

Definition at line 558 of file crypt_des.c.

562{
563 /* Store some info to optimise for multiple calls ... */
564 static unsigned char desKey[8], desKeys[128];
565 static Word *oldKey = (Word *)(void *) desKey, *keys = (Word *) desKeys;
566 static QFDES_what oldWhat;
567 static QFDES_mode oldMode __attribute__((unused));
568 unsigned char b0[8] = "", b1[8]; /* feedback blocks */
569 Word *newKey = (Word *)(void *) key, /* key from user */
570 *text, /* text to be [en|de]crypted */
571 *cb = (Word *)(void *) b0, /* the chained block in CBC mode */
572 *cb1 = (Word *)(void *) b1; /* a copy for use when decrypting */
573
574#if !defined(WORDS_BIGENDIAN)
575 unsigned int origSize = size;
577 MAKE_LITTLE_ENDIAN(data, origSize);
578#endif
579
580 /*
581 ** Check new key against old key
582 ** and set up intermediate keys.
583 */
584 if (newKey[0] != oldKey[0] || newKey[1] != oldKey[1]) {
585 Word c, d; /* C and D registers */
586
587 oldKey[0] = newKey[0];
588 oldKey[1] = newKey[1];
589 oldWhat = what;
590 oldMode = mode;
591
592 PC1(newKey, c, d);
593
594 if ((what == qfDES_encrypt) || (mode == qfDES_cfb)
595 || (mode == qfDES_ofb)) {
596 int z;
597 Word r;
598 Word *k = keys;
599 Word rol[16] =
600 { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };
601
602 for (z = 0; z < 16; z++, k += 2) {
603 for (r = 0; r < rol[z]; r++) {
604 c = ROTATE_LEFT(c);
605 d = ROTATE_LEFT(d);
606 }
607 PC2(c, d, k);
608 }
609 } else {
610 int z;
611 Word r;
612 Word *k = keys;
613 Word ror[16] =
614 { 0, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };
615
616 for (z = 0; z < 16; z++, k += 2) {
617 r = 0;
618 while (ror[z] > r) {
619 r++;
620 c = ROTATE_RIGHT(c);
621 d = ROTATE_RIGHT(d);
622 }
623 PC2(c, d, k);
624 }
625 }
626 } else if ((what != oldWhat)
627 && ((mode == qfDES_ecb) || (mode == qfDES_cbc))) {
628 /*
629 ** Same key but different direction.
630 ** Reverse intermediate key sequence (ECB and CBC).
631 */
632 Word *ik1, *ik2, ik3[2];
633
634 for (ik1 = keys, ik2 = &(keys[30]); ik1 < ik2;
635 ik1 += 2, ik2 -= 2) {
636 ik3[0] = ik1[0];
637 ik3[1] = ik1[1];
638 ik1[0] = ik2[0];
639 ik1[1] = ik2[1];
640 ik2[0] = ik3[0];
641 ik2[1] = ik3[1];
642 }
643
644 oldWhat = what;
645 }
646
647 /* Set up initilaisation vector */
648 if (mode != qfDES_ecb) {
649 if (initVec) {
650 {
651 cb[0] = ((Word *)(void *) initVec)[0];
652 cb[1] = ((Word *)(void *) initVec)[1];
653 }
654 } else {
655 cb[0] = 0;
656 cb[1] = 0;
657 }
658#if !defined(WORDS_BIGENDIAN)
659 MAKE_LITTLE_ENDIAN(cb, 8);
660#endif
661 }
662
663 /*
664 ** Lots of gotos and code duplication follow (arrgh) but it speeds
665 ** it up a wee bit!
666 ** What would be more useful is looking more carefully at the DES
667 ** permutations to produce more efficient versions of the macros
668 ** of the "auto-generated" versions used in qfDES-aux.c.
669 */
670
671 size >>= 3; /* this is always a multpile of 8 */
672
673 if (what == qfDES_encrypt) {
674 switch ((int)mode) {
675 case ((int)qfDES_ecb):
676 goto _ECB_;
677 case ((int)qfDES_cbc):
678 goto _CBC_encrypt_;
679 case ((int)qfDES_cfb):
680 goto _CFB_encrypt_;
681 case ((int)qfDES_ofb):
682 goto _OFB_;
683 }
684 } else {
685 switch ((int)mode) {
686 case ((int)qfDES_ecb):
687 goto _ECB_;
688 case ((int)qfDES_cbc):
689 goto _CBC_decrypt_;
690 case ((int)qfDES_cfb):
691 goto _CFB_decrypt_;
692 case ((int)qfDES_ofb):
693 goto _OFB_;
694 }
695 }
696
697 _ECB_:
698
699 /* ECB */
700 for (text = (Word *)(void *) data; size; --size, text += 2) {
701 DES(text, keys);
702 }
703
704 goto _exit_qfDES_;
705
706 _CBC_encrypt_:
707
708 /* CBC Encryption */
709 for (text = (Word *)(void *) data; size; --size, text += 2) {
710
711 /* chaining block */
712 text[0] ^= cb[0];
713 text[1] ^= cb[1];
714
715 DES(text, keys);
716
717 /* set up chaining block for next round */
718 cb[0] = text[0];
719 cb[1] = text[1];
720 }
721
722 goto _initVec_;
723
724 _CBC_decrypt_:
725
726 /* CBC Decryption */
727 for (text = (Word *)(void *) data; size; --size, text += 2) {
728
729 /* set up chaining block */
730 /*
731 ** The decryption is done in place so I need
732 ** to copy this text block for the next round.
733 */
734 cb1[0] = text[0];
735 cb1[1] = text[1];
736
737 DES(text, keys);
738
739 /* chaining block for next round */
740 text[0] ^= cb[0];
741 text[1] ^= cb[1];
742
743 /*
744 ** Copy back the saved encrypted text - this makes
745 ** CBC decryption slower than CBC encryption.
746 */
747 cb[0] = cb1[0];
748 cb[1] = cb1[1];
749 }
750
751 goto _initVec_;
752
753 _CFB_encrypt_:
754
755 /* CFB Encryption */
756 for (text = (Word *)(void *) data; size; --size, text += 2) {
757
758 /* use cb as the feedback block */
759 DES(cb, keys);
760
761 text[0] ^= cb[0];
762 text[1] ^= cb[1];
763
764 /* set up feedback block for next round */
765 cb[0] = text[0];
766 cb[1] = text[1];
767 }
768
769 goto _initVec_;
770
771 _CFB_decrypt_:
772
773 /* CFB Decryption */
774 for (text = (Word *)(void *) data; size; --size, text += 2) {
775
776 /* set up feedback block */
777 /*
778 ** The decryption is done in place so I need
779 ** to copy this text block for the next round.
780 */
781 cb1[0] = text[0];
782 cb1[1] = text[1];
783
784 /* use cb as the feedback block */
785 DES(cb, keys);
786
787 text[0] ^= cb[0];
788 text[1] ^= cb[1];
789
790 /* set up feedback block for next round */
791 cb[0] = cb1[0];
792 cb[1] = cb1[1];
793 }
794
795 goto _initVec_;
796
797 _OFB_:
798
799 /* OFB */
800 for (text = (Word *)(void *) data; size; --size, text += 2) {
801
802 /* use cb as the feed back block */
803 DES(cb, keys);
804
805 text[0] ^= cb[0];
806 text[1] ^= cb[1];
807 }
808
809 _initVec_:
810
811 /*
812 ** Copy the final chained block back to initVec (CBC, CFB and OFB).
813 ** This allows the [en|de]cryption of large amounts of data in small
814 ** chunks.
815 */
816 if (initVec) {
817 ((Word *)(void *) initVec)[0] = cb[0];
818 ((Word *)(void *) initVec)[1] = cb[1];
819
820#if !defined(WORDS_BIGENDIAN)
821 MAKE_LITTLE_ENDIAN(initVec, 8);
822#endif
823 }
824
825 _exit_qfDES_:
826
827#if !defined(WORDS_BIGENDIAN)
829 MAKE_LITTLE_ENDIAN(data, origSize);
830#endif
831
832 return 0;
833}
#define PC2(regC, regD, k)
Definition crypt_des.c:474
#define MAKE_LITTLE_ENDIAN(t, s)
Definition crypt_des.c:524
#define DES(t, ik)
Definition crypt_des.c:502
static Word ROTATE_RIGHT(Word x)
Definition crypt_des.c:486
unsigned int Word
Definition crypt_des.c:16
#define PC1(k, regC, regD)
Definition crypt_des.c:471
static Word ROTATE_LEFT(Word x)
Definition crypt_des.c:479
enum openssl_mode mode
struct __attribute__((packed))
Definition rtp.h:88
const char * key
Definition cineform.cpp:125

References __attribute__(), DES, key, MAKE_LITTLE_ENDIAN, mode, PC1, PC2, qfDES_cbc, qfDES_cfb, qfDES_ecb, qfDES_encrypt, qfDES_ofb, ROTATE_LEFT(), and ROTATE_RIGHT().

Here is the call graph for this function:

◆ qfDES_checkParity()

unsigned int qfDES_checkParity ( unsigned char * ptr,
unsigned int size,
const QFDES_parity parity )

Definition at line 856 of file crypt_des.c.

858{
859 unsigned int i, mask, bits, parityBit, parityErrors = 0;
860
861 for (i = 0; i < size; ++i, ++ptr) {
862 for (mask = 0x80, bits = 0; mask > 0x01; mask >>= 1)
863 if (((unsigned int)*ptr) & mask)
864 ++bits;
865
866 parityBit = bits % 2 == (unsigned int)parity ? 0 : 1;
867
868 if ((((unsigned int)*ptr) & 0x1) != parityBit)
869 ++parityErrors;
870 }
871
872 return parityErrors;
873}

◆ qfDES_checkWeakKeys()

int qfDES_checkWeakKeys ( unsigned char * key)

Definition at line 902 of file crypt_des.c.

903{
904 unsigned char *bp;
905 int i;
906
907 for (bp = weakKeys[i = 0]; i < 18; bp = weakKeys[++i])
908 if (memcmp((void *)key, (void *)bp, 8) == 0)
909 return -1;
910
911 return 0;
912}
static unsigned char weakKeys[18][8]
Definition crypt_des.c:876

References key, and weakKeys.

Referenced by qfDES_generate().

◆ qfDES_generate()

unsigned char * qfDES_generate ( const QFDES_generate what)

Definition at line 921 of file crypt_des.c.

922{
923 static
924 unsigned char buffer[8];
925 static
926 int flag = 0;
927
928 unsigned char *bp;
929 int mask = what == qfDES_key ? 0xfe : 0xff;
930
931 /* Set up a seed - 42 is the answer ... */
932 if (!flag) {
933 lbl_srandom((int)(getpid() * 42) ^ (int)time((time_t *) 0));
934 flag = 1;
935 }
936 do {
937
938 for (bp = buffer; bp <= &(buffer[7]);
939 *bp++ = (unsigned char)(lbl_random() & mask)) ;
940
941 if (what == qfDES_key)
942 qfDES_setParity(buffer, 8, qfDES_odd);
943
944 } while (what == qfDES_key ? qfDES_checkWeakKeys(buffer) : 0);
945
946 return buffer;
947}
int qfDES_checkWeakKeys(unsigned char *key)
Definition crypt_des.c:902
void qfDES_setParity(unsigned char *ptr, unsigned int size, const QFDES_parity parity)
Definition crypt_des.c:842
uint32_t lbl_random(void)
Definition random.c:61
void lbl_srandom(uint32_t seed)
Definition random.c:56

References lbl_random(), lbl_srandom(), qfDES_checkWeakKeys(), qfDES_key, qfDES_odd, and qfDES_setParity().

Here is the call graph for this function:

◆ qfDES_setPad()

unsigned char qfDES_setPad ( unsigned char pad)

Definition at line 949 of file crypt_des.c.

950{
951 unsigned char b = G_padChar;
952 G_padChar = pad;
953 return b;
954}
unsigned char G_padChar
Definition crypt_des.c:477

References G_padChar.

◆ qfDES_setParity()

void qfDES_setParity ( unsigned char * ptr,
unsigned int size,
const QFDES_parity parity )

Definition at line 842 of file crypt_des.c.

844{
845 unsigned int i, mask, bits;
846
847 for (i = 0; i < size; ++i, ++ptr) {
848 for (mask = 0x80, bits = 0; mask > 0x01; mask >>= 1)
849 if (((unsigned int)*ptr) & mask)
850 ++bits;
851
852 *ptr |= bits % 2 == (unsigned int)parity ? 0x00 : 0x01;
853 }
854}

Referenced by qfDES_generate().