001/* 002 * CDDL HEADER START 003 * 004 * The contents of this file are subject to the terms of the 005 * Common Development and Distribution License, Version 1.0 only 006 * (the "License"). You may not use this file except in compliance 007 * with the License. 008 * 009 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt 010 * or http://forgerock.org/license/CDDLv1.0.html. 011 * See the License for the specific language governing permissions 012 * and limitations under the License. 013 * 014 * When distributing Covered Code, include this CDDL HEADER in each 015 * file and include the License file at legal-notices/CDDLv1_0.txt. 016 * If applicable, add the following below this CDDL HEADER, with the 017 * fields enclosed by brackets "[]" replaced with your own identifying 018 * information: 019 * Portions Copyright [yyyy] [name of copyright owner] 020 * 021 * CDDL HEADER END 022 * 023 * 024 * Copyright 2008 Sun Microsystems, Inc. 025 * Portions Copyright 2015 ForgeRock AS 026 */ 027/* 028 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 029 * Use is subject to license terms. 030 */ 031 032/* Copyright (c) 1984,1988 AT&T */ 033/* All Rights Reserved */ 034package org.opends.server.util; 035 036import java.util.Arrays; 037 038/** 039 * UNIX Crypt cipher, ported from the Sun OpenSolaris project. 040 */ 041@org.opends.server.types.PublicAPI( 042 stability=org.opends.server.types.StabilityLevel.VOLATILE, 043 mayInstantiate=true, 044 mayExtend=false, 045 mayInvoke=true) 046public final class Crypt 047{ 048 049 /* LINTLIBRARY */ 050 /* 051 * This program implements the Proposed Federal Information Processing Data 052 * Encryption Standard. See Federal Register, March 17, 1975 (40FR12134) 053 */ 054 055 /* 056 * Initial permutation, 057 */ 058 private static final byte IP[] = 059 { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 060 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 061 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 062 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7, }; 063 064 /* 065 * Final permutation, FP = IP^(-1) 066 */ 067 private static final byte FP[] = 068 { 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 069 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 070 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 071 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25, }; 072 073 /* 074 * Permuted-choice 1 from the key bits to yield C and D. Note that bits 075 * 8,16... are left out: They are intended for a parity check. 076 */ 077 private static final byte PC1_C[] = 078 { 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 079 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, }; 080 081 private static final byte PC1_D[] = 082 { 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 083 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4, }; 084 085 /* 086 * Sequence of shifts used for the key schedule. 087 */ 088 private static final byte shifts[] = 089 { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, }; 090 091 /* 092 * Permuted-choice 2, to pick out the bits from the CD array that generate the 093 * key schedule. 094 */ 095 private static final int PC2_C[] = 096 { 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 097 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, }; 098 099 private static final byte PC2_D[] = 100 { 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 101 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32, }; 102 103 /** 104 * Container for many variables altered throughout the encryption process. 105 */ 106 private static class SubCrypt 107 { 108 /* 109 * The C and D arrays used to calculate the key schedule. 110 */ 111 int _C[] = new int[28]; 112 113 int _D[] = new int[28]; 114 115 /* 116 * The key schedule. Generated from the key. 117 */ 118 int _KS[][] = new int[16][48]; 119 120 /* 121 * The E bit-selection table. 122 */ 123 int _E[] = new int[48]; 124 125 /* 126 * The current block, divided into 2 halves. 127 */ 128 int _L[] = new int[32]; 129 130 int _R[] = new int[32]; 131 132 int _tempL[] = new int[32]; 133 134 int _f[] = new int[32]; 135 136 /* 137 * The combination of the key and the input, before selection. 138 */ 139 int _preS[] = new int[48]; 140 141 /* 142 * Temps for crypt 143 */ 144 int _ablock[] = new int[66]; 145 146 int _iobuf[] = new int[16]; 147 } 148 149 private final SubCrypt _crypt; 150 151 /** 152 * Constructor. 153 */ 154 public Crypt() { 155 _crypt = new SubCrypt(); 156 157 copy(e, _crypt._E); 158 } 159 160 private void copy(byte[] src, int[] dest) { 161 for (int i = 0; i < dest.length; i++) { 162 dest[i] = src[i]; 163 } 164 } 165 166 /** 167 * Sets up the key schedule from the key. 168 */ 169 private void setkey(int[] key) 170 { 171 SubCrypt _c = _crypt; 172 173 /* 174 * if (_c == null) { _cryptinit(); _c = __crypt; } 175 */ 176 /* 177 * First, generate C and D by permuting the key. The low order bit of each 178 * 8-bit char is not used, so C and D are only 28 bits apiece. 179 */ 180 for (int i = 0; i < 28; i++) 181 { 182 _c._C[i] = key[PC1_C[i] - 1]; 183 _c._D[i] = key[PC1_D[i] - 1]; 184 } 185 /* 186 * To generate Ki, rotate C and D according to schedule and pick up a 187 * permutation using PC2. 188 */ 189 for (int i = 0; i < 16; i++) 190 { 191 /* 192 * rotate. 193 */ 194 for (int k = 0; k < shifts[i]; k++) 195 { 196 rotate(_c._C); 197 rotate(_c._D); 198 } 199 /* 200 * get Ki. Note C and D are concatenated. 201 */ 202 for (int j = 0; j < 24; j++) 203 { 204 _c._KS[i][j] = _c._C[PC2_C[j] - 1]; 205 _c._KS[i][j + 24] = _c._D[PC2_D[j] - 28 - 1]; 206 } 207 } 208 } 209 210 private void rotate(int[] array) 211 { 212 int t = array[0]; 213 System.arraycopy(array, 1, array, 0, 28 - 1); 214 array[27] = t; 215 } 216 217 /* 218 * The E bit-selection table. 219 */ 220 private static final byte e[] = 221 { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 222 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 223 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1, }; 224 225 /* 226 * The 8 selection functions. For some reason, they give a 0-origin index, 227 * unlike everything else. 228 */ 229 private static final int S[][] = 230 { 231 { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 232 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 233 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 }, 234 235 { 236 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 237 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 238 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 }, 239 240 { 241 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 242 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 243 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 }, 244 245 { 246 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 247 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 248 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 }, 249 250 { 251 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4, 252 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 253 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 }, 254 255 { 256 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7, 257 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 258 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 }, 259 260 { 261 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 262 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 263 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 }, 264 265 { 266 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10, 267 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 268 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 } 269 }; 270 271 /* 272 * P is a permutation on the selected combination of the current L and key. 273 */ 274 private static final int P[] = 275 { 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 276 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25, }; 277 278 /** 279 * Encrypts a block in place. 280 */ 281 private final void encrypt(int block[], int edflag) 282 { 283 SubCrypt _c = _crypt; 284 285 /* 286 * First, permute the bits in the input 287 */ 288 for (int j = 0; j < 64; j++) 289 { 290 int a = IP[j] - 1; 291 int b = block[a]; 292 if (j <= 31) 293 { 294 _c._L[j] = b; 295 } 296 else 297 { 298 _c._R[j - 32] = b; 299 } 300 } 301 /* 302 * Perform an encryption operation 16 times. 303 */ 304 for (int ii = 0; ii < 16; ii++) 305 { 306 /* 307 * Set direction 308 */ 309 int i; 310 if (edflag != 0) 311 { 312 i = 15 - ii; 313 } 314 else 315 { 316 i = ii; 317 } 318 /* 319 * Save the R array, which will be the new L. 320 */ 321 System.arraycopy(_c._R, 0, _c._tempL, 0, 32); 322 /* 323 * Expand R to 48 bits using the E selector; exclusive-or with the current 324 * key bits. 325 */ 326 for (int j = 0; j < 48; j++) 327 { 328 _c._preS[j] = _c._R[_c._E[j] - 1] ^ _c._KS[i][j]; 329 } 330 /* 331 * The pre-select bits are now considered in 8 groups of 6 bits each. The 332 * 8 selection functions map these 6-bit quantities into 4-bit quantities 333 * and the results permuted to make an f(R, K). The indexing into the 334 * selection functions is peculiar; it could be simplified by rewriting 335 * the tables. 336 */ 337 for (int j = 0; j < 8; j++) 338 { 339 int t = 6 * j; 340 int k = S[j][(_c._preS[t + 0] << 5) + (_c._preS[t + 1] << 3) 341 + (_c._preS[t + 2] << 2) + (_c._preS[t + 3] << 1) 342 + (_c._preS[t + 4] << 0) + (_c._preS[t + 5] << 4)]; 343 t = 4 * j; 344 _c._f[t + 0] = (k >> 3) & 01; 345 _c._f[t + 1] = (k >> 2) & 01; 346 _c._f[t + 2] = (k >> 1) & 01; 347 _c._f[t + 3] = (k >> 0) & 01; 348 } 349 /* 350 * The new R is L ^ f(R, K). The f here has to be permuted first, though. 351 */ 352 for (int j = 0; j < 32; j++) 353 { 354 _c._R[j] = _c._L[j] ^ _c._f[P[j] - 1]; 355 } 356 /* 357 * Finally, the new L (the original R) is copied back. 358 */ 359 System.arraycopy(_c._tempL, 0, _c._L, 0, 32); 360 } 361 /* 362 * The output L and R are reversed. 363 */ 364 for (int j = 0; j < 32; j++) 365 { 366 // swap 367 int t = _c._L[j]; 368 _c._L[j] = _c._R[j]; 369 _c._R[j] = t; 370 } 371 /* 372 * The final output gets the inverse permutation of the very original. 373 */ 374 for (int j = 0; j < 64; j++) 375 { 376 int iv = FP[j] - 1; 377 int a = (iv <= 31) ? _c._L[iv] : _c._R[iv - 32]; 378 block[j] = a; 379 } 380 } 381 382 private Object digestLock = new Object(); 383 384 /** 385 * Encode the supplied password in unix crypt form with the provided 386 * salt. 387 * 388 * @param pw A password to encode. 389 * @param salt A salt array of any size, of which only the first 390 * 2 bytes will be considered. 391 * @return A trimmed array 392 */ 393 public byte[] crypt(byte[] pw, byte[] salt) 394 { 395 int[] r; 396 synchronized (digestLock) 397 { 398 r = _crypt(pw, salt); 399 } 400 401 //TODO: crypt always returns same size array? So don't mess 402 // around calculating the number of zeros at the end. 403 404 // The _crypt algorithm pads the result block with zeros; 405 // we need to copy the array into a byte string, 406 // but without these zeros. 407 int zeroCount = 0; 408 for (int i = r.length - 1; i >= 0; --i) 409 { 410 if (r[i] != 0) 411 { 412 // Zeros can only occur at the end of the block. 413 break; 414 } 415 ++zeroCount; 416 } 417 418 // Convert to byte 419 byte[] b = new byte[r.length - zeroCount]; 420 for (int i = 0; i < b.length; ++i) 421 { 422 b[i] = (byte) r[i]; 423 } 424 return b; 425 } 426 427 private int[] _crypt(byte[] pw, byte[] salt) 428 { 429 SubCrypt _c = _crypt; 430 431 Arrays.fill(_c._ablock, 0); 432 433 for (int i = 0, n = 0; n < pw.length && i < 64; n++) 434 { 435 int c = pw[n]; 436 for (int j = 0; j < 7; j++, i++) 437 { 438 _c._ablock[i] = (c >> (6 - j)) & 01; 439 } 440 i++; 441 } 442 443 setkey(_c._ablock); 444 445 Arrays.fill(_c._ablock, 0); 446 447 copy(e, _c._E); 448 449 for (int i = 0; i < 2; i++) 450 { 451 int c = salt[i]; 452 _c._iobuf[i] = c; 453 if (c > 'Z') 454 { 455 c -= 6; 456 } 457 if (c > '9') 458 { 459 c -= 7; 460 } 461 c -= '.'; 462 for (int j = 0; j < 6; j++) 463 { 464 if (((c >> j) & 01) != 0) 465 { 466 int temp = _c._E[6 * i + j]; 467 _c._E[6 * i + j] = _c._E[6 * i + j + 24]; 468 _c._E[6 * i + j + 24] = temp; 469 } 470 } 471 } 472 473 for (int i = 0; i < 25; i++) 474 { 475 encrypt(_c._ablock, 0); 476 } 477 478 int i; 479 for (i = 0; i < 11; i++) 480 { 481 int c = 0; 482 for (int j = 0; j < 6; j++) 483 { 484 c <<= 1; 485 c |= _c._ablock[6 * i + j]; 486 } 487 c += '.'; 488 if (c > '9') 489 { 490 c += 7; 491 } 492 if (c > 'Z') 493 { 494 c += 6; 495 } 496 _c._iobuf[i + 2] = c; 497 } 498 _c._iobuf[i + 2] = 0; 499 if (_c._iobuf[1] == 0) 500 { 501 _c._iobuf[1] = _c._iobuf[0]; 502 } 503 return _c._iobuf; 504 } 505}