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}