1/*
2 * These routines check and fix parity of encryption keys for the DES
3 * algorithm.
4 *
5 * They are a replacement for routines in key_parity.c, that don't require
6 * the table building that they do.
7 *
8 * Mark Eichin -- Cygnus Support
9 */
10
11
12#include "des_int.h"
13
14/*
15 * des_fixup_key_parity: Forces odd parity per byte; parity is bits
16 *                       8,16,...64 in des order, implies 0, 8, 16, ...
17 *                       vax order.
18 */
19#define smask(step) ((1<<step)-1)
20#define pstep(x,step) (((x)&smask(step))^(((x)>>step)&smask(step)))
21#define parity_char(x) pstep(pstep(pstep((x),4),2),1)
22
23void
24mit_des_fixup_key_parity(mit_des_cblock key)
25{
26    int i;
27    for (i=0; i<sizeof(mit_des_cblock); i++)
28      {
29	key[i] &= 0xfe;
30	key[i] |= 1^parity_char(key[i]);
31      }
32
33    return;
34}
35
36/*
37 * des_check_key_parity: returns true iff key has the correct des parity.
38 *                       See des_fix_key_parity for the definition of
39 *                       correct des parity.
40 */
41int
42mit_des_check_key_parity(mit_des_cblock key)
43{
44    int i;
45
46    for (i=0; i<sizeof(mit_des_cblock); i++)
47      {
48	if((key[i] & 1) == parity_char(0xfe&key[i]))
49	  {
50	    return 0;
51	  }
52      }
53
54    return(1);
55}
56
57