17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * These routines check and fix parity of encryption keys for the DES
37c478bd9Sstevel@tonic-gate  * algorithm.
47c478bd9Sstevel@tonic-gate  *
57c478bd9Sstevel@tonic-gate  * They are a replacement for routines in key_parity.c, that don't require
67c478bd9Sstevel@tonic-gate  * the table building that they do.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * Mark Eichin -- Cygnus Support
97c478bd9Sstevel@tonic-gate  */
107c478bd9Sstevel@tonic-gate 
117c478bd9Sstevel@tonic-gate 
12159d09a2SMark Phalan #include "des_int.h"
137c478bd9Sstevel@tonic-gate 
147c478bd9Sstevel@tonic-gate /*
157c478bd9Sstevel@tonic-gate  * des_fixup_key_parity: Forces odd parity per byte; parity is bits
167c478bd9Sstevel@tonic-gate  *                       8,16,...64 in des order, implies 0, 8, 16, ...
177c478bd9Sstevel@tonic-gate  *                       vax order.
187c478bd9Sstevel@tonic-gate  */
197c478bd9Sstevel@tonic-gate #define smask(step) ((1<<step)-1)
207c478bd9Sstevel@tonic-gate #define pstep(x,step) (((x)&smask(step))^(((x)>>step)&smask(step)))
217c478bd9Sstevel@tonic-gate #define parity_char(x) pstep(pstep(pstep((x),4),2),1)
227c478bd9Sstevel@tonic-gate 
237c478bd9Sstevel@tonic-gate void
mit_des_fixup_key_parity(mit_des_cblock key)24159d09a2SMark Phalan mit_des_fixup_key_parity(mit_des_cblock key)
257c478bd9Sstevel@tonic-gate {
267c478bd9Sstevel@tonic-gate     int i;
27*55fea89dSDan Cross     for (i=0; i<sizeof(mit_des_cblock); i++)
287c478bd9Sstevel@tonic-gate       {
297c478bd9Sstevel@tonic-gate 	key[i] &= 0xfe;
307c478bd9Sstevel@tonic-gate 	key[i] |= 1^parity_char(key[i]);
317c478bd9Sstevel@tonic-gate       }
32*55fea89dSDan Cross 
337c478bd9Sstevel@tonic-gate     return;
347c478bd9Sstevel@tonic-gate }
357c478bd9Sstevel@tonic-gate 
367c478bd9Sstevel@tonic-gate /*
377c478bd9Sstevel@tonic-gate  * des_check_key_parity: returns true iff key has the correct des parity.
387c478bd9Sstevel@tonic-gate  *                       See des_fix_key_parity for the definition of
397c478bd9Sstevel@tonic-gate  *                       correct des parity.
407c478bd9Sstevel@tonic-gate  */
417c478bd9Sstevel@tonic-gate int
mit_des_check_key_parity(mit_des_cblock key)42159d09a2SMark Phalan mit_des_check_key_parity(mit_des_cblock key)
437c478bd9Sstevel@tonic-gate {
447c478bd9Sstevel@tonic-gate     int i;
45*55fea89dSDan Cross 
46*55fea89dSDan Cross     for (i=0; i<sizeof(mit_des_cblock); i++)
477c478bd9Sstevel@tonic-gate       {
48*55fea89dSDan Cross 	if((key[i] & 1) == parity_char(0xfe&key[i]))
497c478bd9Sstevel@tonic-gate 	  {
507c478bd9Sstevel@tonic-gate 	    return 0;
517c478bd9Sstevel@tonic-gate 	  }
527c478bd9Sstevel@tonic-gate       }
537c478bd9Sstevel@tonic-gate 
547c478bd9Sstevel@tonic-gate     return(1);
557c478bd9Sstevel@tonic-gate }
567c478bd9Sstevel@tonic-gate 
57