summaryrefslogtreecommitdiffstats
path: root/usr.sbin/xntpd/authstuff/keyparity.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/xntpd/authstuff/keyparity.c')
-rw-r--r--usr.sbin/xntpd/authstuff/keyparity.c279
1 files changed, 0 insertions, 279 deletions
diff --git a/usr.sbin/xntpd/authstuff/keyparity.c b/usr.sbin/xntpd/authstuff/keyparity.c
deleted file mode 100644
index 8a12c13..0000000
--- a/usr.sbin/xntpd/authstuff/keyparity.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * keyparity - add parity bits to key and/or change an ascii key to binary
- */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <ctype.h>
-
-#include "ntp_string.h"
-#include "ntp_stdlib.h"
-
-#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0)
-
-/*
- * Types of ascii representations for keys. "Standard" means a 64 bit
- * hex number in NBS format, i.e. with the low order bit of each byte
- * a parity bit. "NTP" means a 64 bit key in NTP format, with the
- * high order bit of each byte a parity bit. "Ascii" means a 1-to-8
- * character string whose ascii representation is used as the key.
- */
-#define KEY_TYPE_STD 1
-#define KEY_TYPE_NTP 2
-#define KEY_TYPE_ASCII 3
-
-#define STD_PARITY_BITS 0x01010101
-
-char *progname;
-int debug;
-
-int ntpflag = 0;
-int stdflag = 0;
-int asciiflag = 0;
-int ntpoutflag = 0;
-int gotoopt = 0;
-
-static int parity P((u_long *));
-static int decodekey P((int, char *, u_long *));
-static void output P((u_long *, int));
-
-/*
- * main - parse arguments and handle options
- */
-void
-main(argc, argv)
-int argc;
-char *argv[];
-{
- int c;
- int errflg = 0;
- int keytype;
- u_long key[2];
- extern int ntp_optind;
- extern char *ntp_optarg;
-
- progname = argv[0];
- while ((c = ntp_getopt(argc, argv, "adno:s")) != EOF)
- switch (c) {
- case 'a':
- asciiflag = 1;
- break;
- case 'd':
- ++debug;
- break;
- case 'n':
- ntpflag = 1;
- break;
- case 's':
- stdflag = 1;
- break;
- case 'o':
- if (*ntp_optarg == 'n') {
- ntpoutflag = 1;
- gotoopt = 1;
- } else if (*ntp_optarg == 's') {
- ntpoutflag = 0;
- gotoopt = 1;
- } else {
- (void) fprintf(stderr,
- "%s: output format must be `n' or `s'\n",
- progname);
- errflg++;
- }
- break;
- default:
- errflg++;
- break;
- }
- if (errflg || ntp_optind == argc) {
- (void) fprintf(stderr,
- "usage: %s -n|-s [-a] [-o n|s] key [...]\n",
- progname);
- exit(2);
- }
-
- if (!ntpflag && !stdflag) {
- (void) fprintf(stderr,
- "%s: one of either the -n or -s flags must be specified\n",
- progname);
- exit(2);
- }
-
- if (ntpflag && stdflag) {
- (void) fprintf(stderr,
- "%s: only one of the -n and -s flags may be specified\n",
- progname);
- exit(2);
- }
-
- if (!gotoopt) {
- if (ntpflag)
- ntpoutflag = 1;
- }
-
- if (asciiflag)
- keytype = KEY_TYPE_ASCII;
- else if (ntpflag)
- keytype = KEY_TYPE_NTP;
- else
- keytype = KEY_TYPE_STD;
-
- for (; ntp_optind < argc; ntp_optind++) {
- if (!decodekey(keytype, argv[ntp_optind], key)) {
- (void) fprintf(stderr,
- "%s: format of key %s invalid\n",
- progname, argv[ntp_optind]);
- exit(1);
- }
- (void) parity(key);
- output(key, ntpoutflag);
- }
- exit(0);
-}
-
-
-
-/*
- * parity - set parity on a key/check for odd parity
- */
-static int
-parity(key)
- u_long *key;
-{
- u_long 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);
-}
-
-
-static int
-decodekey(keytype, str, key)
- int keytype;
- char *str;
- u_long *key;
-{
- u_char keybytes[8];
- char *cp;
- char *xdigit;
- int len;
- int i;
- static char *hex = "0123456789abcdef";
-
- cp = str;
- len = strlen(cp);
- if (len == 0)
- return 0;
-
- switch(keytype) {
- case KEY_TYPE_STD:
- case KEY_TYPE_NTP:
- if (len != 16) /* Lazy. Should define constant */
- return 0;
- /*
- * Decode hex key.
- */
- key[0] = 0;
- key[1] = 0;
- for (i = 0; i < 16; i++) {
- if (!isascii(*cp))
- return 0;
- xdigit = strchr(hex, isupper(*cp) ? tolower(*cp) : *cp);
- cp++;
- if (xdigit == 0)
- return 0;
- key[i>>3] <<= 4;
- key[i>>3] |= (u_long)(xdigit - hex) & 0xf;
- }
-
- /*
- * If this is an NTP format key, put it into NBS format
- */
- if (keytype == KEY_TYPE_NTP) {
- for (i = 0; i < 2; i++)
- key[i] = ((key[i] << 1) & ~STD_PARITY_BITS)
- | ((key[i] >> 7) & STD_PARITY_BITS);
- }
- break;
-
- case KEY_TYPE_ASCII:
- /*
- * Make up key from ascii representation
- */
- memset(keybytes, 0, sizeof(keybytes));
- for (i = 0; i < 8 && i < len; i++)
- keybytes[i] = *cp++ << 1;
- key[0] = keybytes[0] << 24 | keybytes[1] << 16
- | keybytes[2] << 8 | keybytes[3];
- key[1] = keybytes[4] << 24 | keybytes[5] << 16
- | keybytes[6] << 8 | keybytes[7];
- break;
-
- default:
- /* Oh, well */
- return 0;
- }
-
- return 1;
-}
-
-
-/*
- * output - print a hex key on the standard output
- */
-static void
-output(key, ntpformat)
- u_long *key;
- int ntpformat;
-{
- int i;
-
- if (ntpformat) {
- for (i = 0; i < 2; i++)
- key[i] = ((key[i] & ~STD_PARITY_BITS) >> 1)
- | ((key[i] & STD_PARITY_BITS) << 7);
- }
- (void) printf("%08x%08x\n", key[0], key[1]);
-}
OpenPOWER on IntegriCloud