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