version 1.3, 1997/01/15 23:42:13 |
version 1.4, 1998/05/07 19:12:17 |
|
|
#define READ(buf, n) fread(buf, sizeof(char), n, stdin) |
#define READ(buf, n) fread(buf, sizeof(char), n, stdin) |
#define WRITE(buf,n) \ |
#define WRITE(buf,n) \ |
if (fwrite(buf, sizeof(char), n, stdout) != n) \ |
if (fwrite(buf, sizeof(char), n, stdout) != n) \ |
err(bn, NULL); |
err(1, "block %d", bn); |
|
|
/* |
/* |
* some things to make references easier |
* some things to make references easier |
|
|
case 'F': /* use alternative CFB mode */ |
case 'F': /* use alternative CFB mode */ |
alg = ALG_CFBA; |
alg = ALG_CFBA; |
if ((fbbits = setbits(optarg, 7)) > 56 || fbbits == 0) |
if ((fbbits = setbits(optarg, 7)) > 56 || fbbits == 0) |
err(-1, "-F: number must be 1-56 inclusive"); |
err(1, "-F: number must be 1-56 inclusive"); |
else if (fbbits == -1) |
else if (fbbits == -1) |
err(-1, "-F: number must be a multiple of 7"); |
err(1, "-F: number must be a multiple of 7"); |
break; |
break; |
case 'f': /* use CFB mode */ |
case 'f': /* use CFB mode */ |
alg = ALG_CFB; |
alg = ALG_CFB; |
if ((fbbits = setbits(optarg, 8)) > 64 || fbbits == 0) |
if ((fbbits = setbits(optarg, 8)) > 64 || fbbits == 0) |
err(-1, "-f: number must be 1-64 inclusive"); |
err(1, "-f: number must be 1-64 inclusive"); |
else if (fbbits == -1) |
else if (fbbits == -1) |
err(-1, "-f: number must be a multiple of 8"); |
err(1, "-f: number must be a multiple of 8"); |
break; |
break; |
case 'k': /* encryption key */ |
case 'k': /* encryption key */ |
kflag = 1; |
kflag = 1; |
|
|
case 'm': /* number of bits for MACing */ |
case 'm': /* number of bits for MACing */ |
mode = MODE_AUTHENTICATE; |
mode = MODE_AUTHENTICATE; |
if ((macbits = setbits(optarg, 1)) > 64) |
if ((macbits = setbits(optarg, 1)) > 64) |
err(-1, "-m: number must be 0-64 inclusive"); |
err(1, "-m: number must be 0-64 inclusive"); |
break; |
break; |
case 'o': /* use OFB mode */ |
case 'o': /* use OFB mode */ |
alg = ALG_OFB; |
alg = ALG_OFB; |
if ((fbbits = setbits(optarg, 8)) > 64 || fbbits == 0) |
if ((fbbits = setbits(optarg, 8)) > 64 || fbbits == 0) |
err(-1, "-o: number must be 1-64 inclusive"); |
err(1, "-o: number must be 1-64 inclusive"); |
else if (fbbits == -1) |
else if (fbbits == -1) |
err(-1, "-o: number must be a multiple of 8"); |
err(1, "-o: number must be a multiple of 8"); |
break; |
break; |
case 'p': /* preserve parity bits */ |
case 'p': /* preserve parity bits */ |
pflag = 1; |
pflag = 1; |
|
|
case ALG_CFBA: |
case ALG_CFBA: |
switch(mode) { |
switch(mode) { |
case MODE_AUTHENTICATE: /* authenticate using CFBA mode */ |
case MODE_AUTHENTICATE: /* authenticate using CFBA mode */ |
err(-1, "can't authenticate with CFBA mode"); |
err(1, "can't authenticate with CFBA mode"); |
break; |
break; |
case MODE_DECRYPT: /* decrypt using CFBA mode */ |
case MODE_DECRYPT: /* decrypt using CFBA mode */ |
cfbadec(); |
cfbadec(); |
|
|
case ALG_ECB: |
case ALG_ECB: |
switch(mode) { |
switch(mode) { |
case MODE_AUTHENTICATE: /* authenticate using ECB mode */ |
case MODE_AUTHENTICATE: /* authenticate using ECB mode */ |
err(-1, "can't authenticate with ECB mode"); |
err(1, "can't authenticate with ECB mode"); |
break; |
break; |
case MODE_DECRYPT: /* decrypt using ECB mode */ |
case MODE_DECRYPT: /* decrypt using ECB mode */ |
ecbdec(); |
ecbdec(); |
|
|
case ALG_OFB: |
case ALG_OFB: |
switch(mode) { |
switch(mode) { |
case MODE_AUTHENTICATE: /* authenticate using OFB mode */ |
case MODE_AUTHENTICATE: /* authenticate using OFB mode */ |
err(-1, "can't authenticate with OFB mode"); |
err(1, "can't authenticate with OFB mode"); |
break; |
break; |
case MODE_DECRYPT: /* decrypt using OFB mode */ |
case MODE_DECRYPT: /* decrypt using OFB mode */ |
ofbdec(); |
ofbdec(); |
|
|
*/ |
*/ |
for (i = 0; ibuf[i] && i < 16; i++) |
for (i = 0; ibuf[i] && i < 16; i++) |
if ((nbuf[i] = tobinhex(ibuf[i], 16)) == -1) |
if ((nbuf[i] = tobinhex(ibuf[i], 16)) == -1) |
err(-1, "bad hex digit in key"); |
err(1, "bad hex digit in key"); |
while (i < 16) |
while (i < 16) |
nbuf[i++] = 0; |
nbuf[i++] = 0; |
for (i = 0; i < 8; i++) |
for (i = 0; i < 8; i++) |
|
|
*/ |
*/ |
for (i = 0; ibuf[i] && i < 16; i++) |
for (i = 0; ibuf[i] && i < 16; i++) |
if ((nbuf[i] = tobinhex(ibuf[i], 2)) == -1) |
if ((nbuf[i] = tobinhex(ibuf[i], 2)) == -1) |
err(-1, "bad binary digit in key"); |
err(1, "bad binary digit in key"); |
while (i < 64) |
while (i < 64) |
nbuf[i++] = 0; |
nbuf[i++] = 0; |
for (i = 0; i < 8; i++) |
for (i = 0; i < 8; i++) |
|
|
if (isdigit(*p)) |
if (isdigit(*p)) |
n = n * 10 + *p - '0'; |
n = n * 10 + *p - '0'; |
else { |
else { |
err(-1, "bad decimal digit in MAC length"); |
err(1, "bad decimal digit in MAC length"); |
} |
} |
} |
} |
/* |
/* |
|
|
if ((c = getchar()) == EOF) { |
if ((c = getchar()) == EOF) { |
n = CHAR(msgbuf, 7); |
n = CHAR(msgbuf, 7); |
if (n < 0 || n > 7) |
if (n < 0 || n > 7) |
err(bn, "decryption failed (block corrupted)"); |
err(1, "decryption failed (block %d corrupted)", bn); |
} |
} |
else |
else |
(void)ungetc(c, stdin); |
(void)ungetc(c, stdin); |
WRITE(BUFFER(msgbuf), n); |
WRITE(BUFFER(msgbuf), n); |
} |
} |
if (n > 0) |
if (n > 0) |
err(bn, "decryption failed (incomplete block)"); |
err(1, "decryption failed (block %d incomplete)", bn); |
} |
} |
|
|
/* |
/* |
|
|
if ((c = getchar()) == EOF) { |
if ((c = getchar()) == EOF) { |
n = CHAR(msgbuf, 7); |
n = CHAR(msgbuf, 7); |
if (n < 0 || n > 7) |
if (n < 0 || n > 7) |
err(bn, "decryption failed (block corrupted)"); |
err(1, "decryption failed (block %d corrupted)", bn); |
} |
} |
else |
else |
(void)ungetc(c, stdin); |
(void)ungetc(c, stdin); |
WRITE(BUFFER(msgbuf), n); |
WRITE(BUFFER(msgbuf), n); |
} |
} |
if (n > 0) |
if (n > 0) |
err(bn, "decryption failed (incomplete block)"); |
err(1, "decryption failed (block %d incomplete)", bn); |
} |
} |
|
|
/* |
/* |
|
|
if ((c = getchar()) == EOF) { |
if ((c = getchar()) == EOF) { |
n = obuf[nbytes-1]; |
n = obuf[nbytes-1]; |
if (n < 0 || n > nbytes-1) |
if (n < 0 || n > nbytes-1) |
err(bn, "decryption failed (block corrupted)"); |
err(1, "decryption failed (block %d corrupted)", bn); |
} |
} |
else |
else |
(void)ungetc(c, stdin); |
(void)ungetc(c, stdin); |
WRITE(obuf, n); |
WRITE(obuf, n); |
} |
} |
if (n > 0) |
if (n > 0) |
err(bn, "decryption failed (incomplete block)"); |
err(1, "decryption failed (block %d incomplete)", bn); |
} |
} |
|
|
/* |
/* |
|
|
if ((c = getchar()) == EOF) { |
if ((c = getchar()) == EOF) { |
if ((n = (obuf[nbytes-1] - '0')) < 0 |
if ((n = (obuf[nbytes-1] - '0')) < 0 |
|| n > nbytes-1) |
|| n > nbytes-1) |
err(bn, "decryption failed (block corrupted)"); |
err(1, "decryption failed (block %d corrupted)", bn); |
} |
} |
else |
else |
(void)ungetc(c, stdin); |
(void)ungetc(c, stdin); |
WRITE(obuf, n); |
WRITE(obuf, n); |
} |
} |
if (n > 0) |
if (n > 0) |
err(bn, "decryption failed (incomplete block)"); |
err(1, "decryption failed (block %d incomplete)", bn); |
} |
} |
|
|
|
|
|
|
if ((c = getchar()) == EOF) { |
if ((c = getchar()) == EOF) { |
n = obuf[nbytes-1]; |
n = obuf[nbytes-1]; |
if (n < 0 || n > nbytes-1) |
if (n < 0 || n > nbytes-1) |
err(bn, "decryption failed (block corrupted)"); |
err(1, "decryption failed (block %d corrupted)", bn); |
} |
} |
else |
else |
(void)ungetc(c, stdin); |
(void)ungetc(c, stdin); |
|
|
WRITE(obuf, n); |
WRITE(obuf, n); |
} |
} |
if (n > 0) |
if (n > 0) |
err(bn, "decryption failed (incomplete block)"); |
err(1, "decryption failed (block %d incomplete)", bn); |
} |
} |
|
|
/* |
/* |