diff options
Diffstat (limited to 'contrib/ntp/libntp/authparity.c')
-rw-r--r-- | contrib/ntp/libntp/authparity.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/contrib/ntp/libntp/authparity.c b/contrib/ntp/libntp/authparity.c new file mode 100644 index 0000000..32fde58 --- /dev/null +++ b/contrib/ntp/libntp/authparity.c @@ -0,0 +1,57 @@ +/* + * auth_parity - set parity on a key/check for odd parity + */ +#include "ntp_stdlib.h" + +int +DESauth_parity( + u_int32 *key + ) +{ + u_int32 mask; + int parity_err; + int bitcount; + int half; + int byte; + int i; + + /* + * Go through counting bits in each byte. Check to see if + * each parity bit was set correctly. If not, note the error + * and set it right. + */ + parity_err = 0; + for (half = 0; half < 2; half++) { /* two halves of key */ + mask = 0x80000000; + for (byte = 0; byte < 4; byte++) { /* 4 bytes per half */ + bitcount = 0; + for (i = 0; i < 7; i++) { /* 7 data bits / byte */ + if (key[half] & mask) + bitcount++; + mask >>= 1; + } + + /* + * If bitcount is even, parity must be set. If + * bitcount is odd, parity must be clear. + */ + if ((bitcount & 0x1) == 0) { + if (!(key[half] & mask)) { + parity_err++; + key[half] |= mask; + } + } else { + if (key[half] & mask) { + parity_err++; + key[half] &= ~mask; + } + } + mask >>= 1; + } + } + + /* + * Return the result of the parity check. + */ + return (parity_err == 0); +} |