1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 #include <sys/types.h>
  28 
  29 #pragma ident   "%Z%%M% %I%     %E% SMI"
  30 
  31 /* EXPORT DELETE START */
  32 
  33 static uint64_t pc1_table[2][128]=
  34 {
  35 /* BEGIN CSTYLED */
  36 {
  37 0x0000000000000000ULL, 0x0000000000100000ULL, 0x0000000000001000ULL, 0x0000000000101000ULL,
  38 0x0000000000000010ULL, 0x0000000000100010ULL, 0x0000000000001010ULL, 0x0000000000101010ULL,
  39 0x0000000000000001ULL, 0x0000000000100001ULL, 0x0000000000001001ULL, 0x0000000000101001ULL,
  40 0x0000000000000011ULL, 0x0000000000100011ULL, 0x0000000000001011ULL, 0x0000000000101011ULL,
  41 0x0000000100000000ULL, 0x0000000100100000ULL, 0x0000000100001000ULL, 0x0000000100101000ULL,
  42 0x0000000100000010ULL, 0x0000000100100010ULL, 0x0000000100001010ULL, 0x0000000100101010ULL,
  43 0x0000000100000001ULL, 0x0000000100100001ULL, 0x0000000100001001ULL, 0x0000000100101001ULL,
  44 0x0000000100000011ULL, 0x0000000100100011ULL, 0x0000000100001011ULL, 0x0000000100101011ULL,
  45 0x0000010000000000ULL, 0x0000010000100000ULL, 0x0000010000001000ULL, 0x0000010000101000ULL,
  46 0x0000010000000010ULL, 0x0000010000100010ULL, 0x0000010000001010ULL, 0x0000010000101010ULL,
  47 0x0000010000000001ULL, 0x0000010000100001ULL, 0x0000010000001001ULL, 0x0000010000101001ULL,
  48 0x0000010000000011ULL, 0x0000010000100011ULL, 0x0000010000001011ULL, 0x0000010000101011ULL,
  49 0x0000010100000000ULL, 0x0000010100100000ULL, 0x0000010100001000ULL, 0x0000010100101000ULL,
  50 0x0000010100000010ULL, 0x0000010100100010ULL, 0x0000010100001010ULL, 0x0000010100101010ULL,
  51 0x0000010100000001ULL, 0x0000010100100001ULL, 0x0000010100001001ULL, 0x0000010100101001ULL,
  52 0x0000010100000011ULL, 0x0000010100100011ULL, 0x0000010100001011ULL, 0x0000010100101011ULL,
  53 0x0001000000000000ULL, 0x0001000000100000ULL, 0x0001000000001000ULL, 0x0001000000101000ULL,
  54 0x0001000000000010ULL, 0x0001000000100010ULL, 0x0001000000001010ULL, 0x0001000000101010ULL,
  55 0x0001000000000001ULL, 0x0001000000100001ULL, 0x0001000000001001ULL, 0x0001000000101001ULL,
  56 0x0001000000000011ULL, 0x0001000000100011ULL, 0x0001000000001011ULL, 0x0001000000101011ULL,
  57 0x0001000100000000ULL, 0x0001000100100000ULL, 0x0001000100001000ULL, 0x0001000100101000ULL,
  58 0x0001000100000010ULL, 0x0001000100100010ULL, 0x0001000100001010ULL, 0x0001000100101010ULL,
  59 0x0001000100000001ULL, 0x0001000100100001ULL, 0x0001000100001001ULL, 0x0001000100101001ULL,
  60 0x0001000100000011ULL, 0x0001000100100011ULL, 0x0001000100001011ULL, 0x0001000100101011ULL,
  61 0x0001010000000000ULL, 0x0001010000100000ULL, 0x0001010000001000ULL, 0x0001010000101000ULL,
  62 0x0001010000000010ULL, 0x0001010000100010ULL, 0x0001010000001010ULL, 0x0001010000101010ULL,
  63 0x0001010000000001ULL, 0x0001010000100001ULL, 0x0001010000001001ULL, 0x0001010000101001ULL,
  64 0x0001010000000011ULL, 0x0001010000100011ULL, 0x0001010000001011ULL, 0x0001010000101011ULL,
  65 0x0001010100000000ULL, 0x0001010100100000ULL, 0x0001010100001000ULL, 0x0001010100101000ULL,
  66 0x0001010100000010ULL, 0x0001010100100010ULL, 0x0001010100001010ULL, 0x0001010100101010ULL,
  67 0x0001010100000001ULL, 0x0001010100100001ULL, 0x0001010100001001ULL, 0x0001010100101001ULL,
  68 0x0001010100000011ULL, 0x0001010100100011ULL, 0x0001010100001011ULL, 0x0001010100101011ULL
  69 },
  70 {
  71 0x0000000000000000ULL, 0x0000000001000000ULL, 0x0000000000010000ULL, 0x0000000001010000ULL,
  72 0x0000000000000100ULL, 0x0000000001000100ULL, 0x0000000000010100ULL, 0x0000000001010100ULL,
  73 0x0000000010000000ULL, 0x0000000011000000ULL, 0x0000000010010000ULL, 0x0000000011010000ULL,
  74 0x0000000010000100ULL, 0x0000000011000100ULL, 0x0000000010010100ULL, 0x0000000011010100ULL,
  75 0x0000001000000000ULL, 0x0000001001000000ULL, 0x0000001000010000ULL, 0x0000001001010000ULL,
  76 0x0000001000000100ULL, 0x0000001001000100ULL, 0x0000001000010100ULL, 0x0000001001010100ULL,
  77 0x0000001010000000ULL, 0x0000001011000000ULL, 0x0000001010010000ULL, 0x0000001011010000ULL,
  78 0x0000001010000100ULL, 0x0000001011000100ULL, 0x0000001010010100ULL, 0x0000001011010100ULL,
  79 0x0000100000000000ULL, 0x0000100001000000ULL, 0x0000100000010000ULL, 0x0000100001010000ULL,
  80 0x0000100000000100ULL, 0x0000100001000100ULL, 0x0000100000010100ULL, 0x0000100001010100ULL,
  81 0x0000100010000000ULL, 0x0000100011000000ULL, 0x0000100010010000ULL, 0x0000100011010000ULL,
  82 0x0000100010000100ULL, 0x0000100011000100ULL, 0x0000100010010100ULL, 0x0000100011010100ULL,
  83 0x0000101000000000ULL, 0x0000101001000000ULL, 0x0000101000010000ULL, 0x0000101001010000ULL,
  84 0x0000101000000100ULL, 0x0000101001000100ULL, 0x0000101000010100ULL, 0x0000101001010100ULL,
  85 0x0000101010000000ULL, 0x0000101011000000ULL, 0x0000101010010000ULL, 0x0000101011010000ULL,
  86 0x0000101010000100ULL, 0x0000101011000100ULL, 0x0000101010010100ULL, 0x0000101011010100ULL,
  87 0x0010000000000000ULL, 0x0010000001000000ULL, 0x0010000000010000ULL, 0x0010000001010000ULL,
  88 0x0010000000000100ULL, 0x0010000001000100ULL, 0x0010000000010100ULL, 0x0010000001010100ULL,
  89 0x0010000010000000ULL, 0x0010000011000000ULL, 0x0010000010010000ULL, 0x0010000011010000ULL,
  90 0x0010000010000100ULL, 0x0010000011000100ULL, 0x0010000010010100ULL, 0x0010000011010100ULL,
  91 0x0010001000000000ULL, 0x0010001001000000ULL, 0x0010001000010000ULL, 0x0010001001010000ULL,
  92 0x0010001000000100ULL, 0x0010001001000100ULL, 0x0010001000010100ULL, 0x0010001001010100ULL,
  93 0x0010001010000000ULL, 0x0010001011000000ULL, 0x0010001010010000ULL, 0x0010001011010000ULL,
  94 0x0010001010000100ULL, 0x0010001011000100ULL, 0x0010001010010100ULL, 0x0010001011010100ULL,
  95 0x0010100000000000ULL, 0x0010100001000000ULL, 0x0010100000010000ULL, 0x0010100001010000ULL,
  96 0x0010100000000100ULL, 0x0010100001000100ULL, 0x0010100000010100ULL, 0x0010100001010100ULL,
  97 0x0010100010000000ULL, 0x0010100011000000ULL, 0x0010100010010000ULL, 0x0010100011010000ULL,
  98 0x0010100010000100ULL, 0x0010100011000100ULL, 0x0010100010010100ULL, 0x0010100011010100ULL,
  99 0x0010101000000000ULL, 0x0010101001000000ULL, 0x0010101000010000ULL, 0x0010101001010000ULL,
 100 0x0010101000000100ULL, 0x0010101001000100ULL, 0x0010101000010100ULL, 0x0010101001010100ULL,
 101 0x0010101010000000ULL, 0x0010101011000000ULL, 0x0010101010010000ULL, 0x0010101011010000ULL,
 102 0x0010101010000100ULL, 0x0010101011000100ULL, 0x0010101010010100ULL, 0x0010101011010100ULL
 103 }
 104 /* END CSTYLED */
 105 };
 106 
 107 
 108 static uint32_t pc2_1_table[4][64] =
 109 {
 110 {
 111 0x00000000, 0x00004000, 0x04000000, 0x04004000,
 112 0x00000100, 0x00004100, 0x04000100, 0x04004100,
 113 0x00020000, 0x00024000, 0x04020000, 0x04024000,
 114 0x00020100, 0x00024100, 0x04020100, 0x04024100,
 115 0x00000001, 0x00004001, 0x04000001, 0x04004001,
 116 0x00000101, 0x00004101, 0x04000101, 0x04004101,
 117 0x00020001, 0x00024001, 0x04020001, 0x04024001,
 118 0x00020101, 0x00024101, 0x04020101, 0x04024101,
 119 0x08000000, 0x08004000, 0x0c000000, 0x0c004000,
 120 0x08000100, 0x08004100, 0x0c000100, 0x0c004100,
 121 0x08020000, 0x08024000, 0x0c020000, 0x0c024000,
 122 0x08020100, 0x08024100, 0x0c020100, 0x0c024100,
 123 0x08000001, 0x08004001, 0x0c000001, 0x0c004001,
 124 0x08000101, 0x08004101, 0x0c000101, 0x0c004101,
 125 0x08020001, 0x08024001, 0x0c020001, 0x0c024001,
 126 0x08020101, 0x08024101, 0x0c020101, 0x0c024101
 127 },
 128 {
 129 0x00000000, 0x00000200, 0x20000000, 0x20000200,
 130 0x00001000, 0x00001200, 0x20001000, 0x20001200,
 131 0x00000000, 0x00000200, 0x20000000, 0x20000200,
 132 0x00001000, 0x00001200, 0x20001000, 0x20001200,
 133 0x00000040, 0x00000240, 0x20000040, 0x20000240,
 134 0x00001040, 0x00001240, 0x20001040, 0x20001240,
 135 0x00000040, 0x00000240, 0x20000040, 0x20000240,
 136 0x00001040, 0x00001240, 0x20001040, 0x20001240,
 137 0x00000010, 0x00000210, 0x20000010, 0x20000210,
 138 0x00001010, 0x00001210, 0x20001010, 0x20001210,
 139 0x00000010, 0x00000210, 0x20000010, 0x20000210,
 140 0x00001010, 0x00001210, 0x20001010, 0x20001210,
 141 0x00000050, 0x00000250, 0x20000050, 0x20000250,
 142 0x00001050, 0x00001250, 0x20001050, 0x20001250,
 143 0x00000050, 0x00000250, 0x20000050, 0x20000250,
 144 0x00001050, 0x00001250, 0x20001050, 0x20001250
 145 },
 146 {
 147 0x00000000, 0x00000000, 0x40000000, 0x40000000,
 148 0x00000020, 0x00000020, 0x40000020, 0x40000020,
 149 0x00008000, 0x00008000, 0x40008000, 0x40008000,
 150 0x00008020, 0x00008020, 0x40008020, 0x40008020,
 151 0x80000000, 0x80000000, 0xc0000000, 0xc0000000,
 152 0x80000020, 0x80000020, 0xc0000020, 0xc0000020,
 153 0x80008000, 0x80008000, 0xc0008000, 0xc0008000,
 154 0x80008020, 0x80008020, 0xc0008020, 0xc0008020,
 155 0x00000002, 0x00000002, 0x40000002, 0x40000002,
 156 0x00000022, 0x00000022, 0x40000022, 0x40000022,
 157 0x00008002, 0x00008002, 0x40008002, 0x40008002,
 158 0x00008022, 0x00008022, 0x40008022, 0x40008022,
 159 0x80000002, 0x80000002, 0xc0000002, 0xc0000002,
 160 0x80000022, 0x80000022, 0xc0000022, 0xc0000022,
 161 0x80008002, 0x80008002, 0xc0008002, 0xc0008002,
 162 0x80008022, 0x80008022, 0xc0008022, 0xc0008022
 163 },
 164 {
 165 0x00000000, 0x10000000, 0x00000800, 0x10000800,
 166 0x00000000, 0x10000000, 0x00000800, 0x10000800,
 167 0x00002000, 0x10002000, 0x00002800, 0x10002800,
 168 0x00002000, 0x10002000, 0x00002800, 0x10002800,
 169 0x00000004, 0x10000004, 0x00000804, 0x10000804,
 170 0x00000004, 0x10000004, 0x00000804, 0x10000804,
 171 0x00002004, 0x10002004, 0x00002804, 0x10002804,
 172 0x00002004, 0x10002004, 0x00002804, 0x10002804,
 173 0x00000400, 0x10000400, 0x00000c00, 0x10000c00,
 174 0x00000400, 0x10000400, 0x00000c00, 0x10000c00,
 175 0x00002400, 0x10002400, 0x00002c00, 0x10002c00,
 176 0x00002400, 0x10002400, 0x00002c00, 0x10002c00,
 177 0x00000404, 0x10000404, 0x00000c04, 0x10000c04,
 178 0x00000404, 0x10000404, 0x00000c04, 0x10000c04,
 179 0x00002404, 0x10002404, 0x00002c04, 0x10002c04,
 180 0x00002404, 0x10002404, 0x00002c04, 0x10002c04
 181 }
 182 };
 183 
 184 static uint32_t pc2_1_tail_table[8] =
 185 {
 186 0x00000000, 0x00010000, 0x00000008, 0x00010008,
 187 0x00000080, 0x00010080, 0x00000088, 0x00010088
 188 };
 189 
 190 static uint32_t pc2_2_table[5][32] =
 191 {
 192 {
 193 0x00000000, 0x00010000, 0x00000008, 0x00010008,
 194 0x20000000, 0x20010000, 0x20000008, 0x20010008,
 195 0x00100000, 0x00110000, 0x00100008, 0x00110008,
 196 0x20100000, 0x20110000, 0x20100008, 0x20110008,
 197 0x00000010, 0x00010010, 0x00000018, 0x00010018,
 198 0x20000010, 0x20010010, 0x20000018, 0x20010018,
 199 0x00100010, 0x00110010, 0x00100018, 0x00110018,
 200 0x20100010, 0x20110010, 0x20100018, 0x20110018
 201 },
 202 {
 203 0x00000000, 0x00000000, 0x10000000, 0x10000000,
 204 0x00000020, 0x00000020, 0x10000020, 0x10000020,
 205 0x00000000, 0x00000000, 0x10000000, 0x10000000,
 206 0x00000020, 0x00000020, 0x10000020, 0x10000020,
 207 0x00000400, 0x00000400, 0x10000400, 0x10000400,
 208 0x00000420, 0x00000420, 0x10000420, 0x10000420,
 209 0x00000400, 0x00000400, 0x10000400, 0x10000400,
 210 0x00000420, 0x00000420, 0x10000420, 0x10000420
 211 },
 212 {
 213 0x00000000, 0x00000000, 0x00000080, 0x00000080,
 214 0x80000000, 0x80000000, 0x80000080, 0x80000080,
 215 0x00080000, 0x00080000, 0x00080080, 0x00080080,
 216 0x80080000, 0x80080000, 0x80080080, 0x80080080,
 217 0x00001000, 0x00001000, 0x00001080, 0x00001080,
 218 0x80001000, 0x80001000, 0x80001080, 0x80001080,
 219 0x00081000, 0x00081000, 0x00081080, 0x00081080,
 220 0x80081000, 0x80081000, 0x80081080, 0x80081080
 221 },
 222 {
 223 0x00000000, 0x00008000, 0x08000000, 0x08008000,
 224 0x00000100, 0x00008100, 0x08000100, 0x08008100,
 225 0x00020000, 0x00028000, 0x08020000, 0x08028000,
 226 0x00020100, 0x00028100, 0x08020100, 0x08028100,
 227 0x00004000, 0x0000c000, 0x08004000, 0x0800c000,
 228 0x00004100, 0x0000c100, 0x08004100, 0x0800c100,
 229 0x00024000, 0x0002c000, 0x08024000, 0x0802c000,
 230 0x00024100, 0x0002c100, 0x08024100, 0x0802c100
 231 },
 232 {
 233 0x00000000, 0x00000200, 0x40000000, 0x40000200,
 234 0x00040000, 0x00040200, 0x40040000, 0x40040200,
 235 0x00000040, 0x00000240, 0x40000040, 0x40000240,
 236 0x00040040, 0x00040240, 0x40040040, 0x40040240,
 237 0x00002000, 0x00002200, 0x40002000, 0x40002200,
 238 0x00042000, 0x00042200, 0x40042000, 0x40042200,
 239 0x00002040, 0x00002240, 0x40002040, 0x40002240,
 240 0x00042040, 0x00042240, 0x40042040, 0x40042240
 241 }
 242 };
 243 
 244 static uint32_t pc2_2_tail_table[4] =
 245 {
 246 0x00000000, 0x00000800, 0x04000000, 0x04000800
 247 };
 248 
 249 static int ss[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
 250 
 251 
 252 /*
 253  * This routine initializes the key schedule.
 254  */
 255 void
 256 des_ks(uint64_t *ks, uint64_t key)
 257 {
 258         int i;
 259         uint32_t upper, lower;
 260         uint64_t c, d;
 261 
 262         c = pc1_table[0][key >> 57] |
 263                 ((pc1_table[0][(key >> 49) & 127ULL]) << 1) |
 264                 ((pc1_table[0][(key >> 41) & 127ULL]) << 2) |
 265                 ((pc1_table[0][(key >> 33) & 127ULL]) << 3) |
 266                 pc1_table[1][(key >> 25) & 127ULL] |
 267                 ((pc1_table[1][(key >> 17) & 127ULL]) << 1) |
 268                 ((pc1_table[1][(key >> 9) & 127ULL]) << 2) |
 269                 ((pc1_table[1][(key >> 1) & 127ULL]) << 3);
 270 
 271         d = (c & 0xfffffffULL) | ((c & 0xfffffffULL) << 28);
 272         c = (c & 0xfffffff0000000ULL) | ((c & 0xfffffff0000000ULL) >> 28);
 273 
 274         for (i = 0; i < 16; i++) {
 275                 c = c << ss[i];
 276                 d = d << ss[i];
 277 
 278                 upper = pc2_1_table[0][(c >> 50) & 63] |
 279                         pc2_1_table[1][(c >> 44) & 63] |
 280                         pc2_1_table[2][(c >> 38) & 63] |
 281                         pc2_1_table[3][(c >> 32) & 63] |
 282                         pc2_1_tail_table[(c >> 28) & 7];
 283 
 284                 lower = pc2_2_table[0][(d >> 51) & 31] |
 285                         pc2_2_table[1][(d >> 46) & 31] |
 286                         pc2_2_table[2][(d >> 41) & 31] |
 287                         pc2_2_table[3][(d >> 36) & 31] |
 288                         pc2_2_table[4][(d >> 31) & 31] |
 289                         pc2_2_tail_table[(d >> 28) & 3];
 290                 ks[i] = ((uint64_t)upper)<<32 | ((uint64_t)lower);
 291         }
 292 }
 293 
 294 /* EXPORT DELETE END */