Annotation of pgp/src/lfsr.c, revision 1.1

1.1     ! root        1: /*
        !             2: **     lfsr.c - Linear Feedback Shift Register (LFSR) routines.
        !             3: **     (c) 1988 Philip Zimmermann.  All rights reserved.
        !             4: **     10 Sep 88 -- revised 20 Jun 89
        !             5: */
        !             6: 
        !             7: #include "lfsr.h"      /* Linear Feedback Shift Register headers */
        !             8: 
        !             9: /* Calling routines must declare lfsr buffer and byte index into it.: */
        !            10: /* byte lfsr[256] = {0}; */
        !            11: /* byte rtail = 0;     /* points to 256, which is same as 0 */
        !            12: 
        !            13: 
        !            14: /*
        !            15: **     steplfsr256 - Step big linear feedback shift register (LFSR)
        !            16: **     256 cycles.  Use primitive polynomial:  X^255 + X^82 + X^0
        !            17: **     Actually runs 8 LFSR's in parallel, outputting a whole byte
        !            18: **     with each step.
        !            19: */
        !            20: void steplfsr256(register byteptr lfsr)
        !            21: {      register byte ltail;
        !            22:        register byte ltap0;
        !            23:        register byte ltap82;
        !            24:        register byte ltap255;
        !            25:        ltail = 0; ltap0 = 0; ltap82 = 82; ltap255 = 255;
        !            26:        do
        !            27:                lfsr[--ltail] = lfsr[ltap0--]^lfsr[ltap82--]^lfsr[ltap255--];
        !            28:        while (ltail);
        !            29: } /* steplfsr256 */
        !            30: 
        !            31: 
        !            32: /*
        !            33: **     getlfsr - get 1 byte from lfsr buffer.
        !            34: **     Calls steplfsr256() if necessary to replenish lfsr buffer.
        !            35: **
        !            36: **     getlfsr() is a #define in the header file "lfsr.h"
        !            37: */
        !            38: 
        !            39: 
        !            40: /*
        !            41: **     initlfsr - initialize linear feedback shift register
        !            42: **
        !            43: **     Since each of the 8 bits of the bytes in the LFSR array represents
        !            44: **     a separate independant LFSR, we must be sure the every one of the
        !            45: **     8 LFSRs have some 1's and 0's in it.  Therefore, an unmodified
        !            46: **     7-bit ASCII string is not an acceptable seed for the LFSR byte
        !            47: **     array, because the high bits are all zeros.  That's why we do a
        !            48: **     cumulative add on the seed bits, to mix the seed bits up between
        !            49: **     the 8 LFSRs.
        !            50: */
        !            51: void initlfsr(byteptr seed, short size, byteptr lfsr, byte *rtail)
        !            52: /*     seed is random number seed.
        !            53:        size is number of bytes in seed.
        !            54:        lfsr is pointer to 256-byte LFSR buffer.
        !            55:        *rtail is rtail index byte.
        !            56: */
        !            57: {      short i;
        !            58:        unsigned int c;
        !            59: #ifdef CHECKLFSR
        !            60:        byte check1,check0;     /* to ensure 1s and 0s mixed in each LFSR */
        !            61:        check0 = 0x00;          /* should end up as 0xff after ORing */
        !            62:        check1 = 0xff;          /* should end up as 0x00 after ANDing */
        !            63: #endif /* CHECKLFSR */
        !            64:        *rtail = 0;             /* points to 256, which is same as 0 */
        !            65:        c = size;               /* makes seed "AAA" distinct from seed "AAAAAA" */
        !            66:        for (i=0; i<=255; i++)  /* make several seed copies across the LFSR */
        !            67:        {       c += seed[i % size];    /* cumulatively add the seed data */
        !            68:                lfsr[i] = c + (c>>8);   /* wraparound carry bits */
        !            69: #ifdef CHECKLFSR
        !            70:                check0 |= lfsr[i];      /* scan for all zeros in any LFSR row */
        !            71:                check1 &= lfsr[i];      /* scan for all ones in any LFSR row */
        !            72: #endif /* CHECKLFSR */
        !            73:        }
        !            74: #ifdef CHECKLFSR
        !            75:        /* if any LFSR row contained all zeros, check0 will not be 0xff */
        !            76:        /* if any LFSR row contained all ones, check1 will not be 0x00 */
        !            77:        c = 0xFF & (check1 | ~check0);  /* should be 0x00 if all went OK. */
        !            78:        /* Now guarantee that all 8 LFSRs contain a mix of 1s and 0s... */
        !            79:        if (c) printf("\nLFSR check0=%2X check1=%2X. ",check0,check1);
        !            80:        lfsr[0] ^= c;           /* flip some faulty bits if we have to */
        !            81: #endif /* CHECKLFSR */
        !            82: } /* initlfsr */
        !            83: 
        !            84: 
        !            85: /*
        !            86: **     stomplfsr - inverts about half the bits in an LFSR.
        !            87: **
        !            88: **     If the LFSR has a "rail" of almost all 0's or almost all 1's in
        !            89: **     the same bit position, it will perform poorly as a random number
        !            90: **     generator.  This function will probably fix this condition.
        !            91: */
        !            92: void stomplfsr(byteptr lfsr)
        !            93: /*     lfsr is pointer to 256-byte LFSR buffer. */
        !            94: {      byte i;
        !            95:        i=255;
        !            96:        while (i) *lfsr++ ^= i--;
        !            97: } /* stomplfsr */
        !            98: 
        !            99: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.