Blame crypt/crypt_util.c

Packit Service 82fcde
/*
Packit Service 82fcde
 * UFC-crypt: ultra fast crypt(3) implementation
Packit Service 82fcde
 *
Packit Service 82fcde
 * Copyright (C) 1991-2018 Free Software Foundation, Inc.
Packit Service 82fcde
 *
Packit Service 82fcde
 * This library is free software; you can redistribute it and/or
Packit Service 82fcde
 * modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
 * License as published by the Free Software Foundation; either
Packit Service 82fcde
 * version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
 *
Packit Service 82fcde
 * This library is distributed in the hope that it will be useful,
Packit Service 82fcde
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
 * Lesser General Public License for more details.
Packit Service 82fcde
 *
Packit Service 82fcde
 * You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
 * License along with this library; see the file COPYING.LIB.  If not,
Packit Service 82fcde
 * see <http://www.gnu.org/licenses/>.
Packit Service 82fcde
 *
Packit Service 82fcde
 * @(#)crypt_util.c	2.56 12/20/96
Packit Service 82fcde
 *
Packit Service 82fcde
 * Support routines
Packit Service 82fcde
 *
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
#ifdef DEBUG
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
#endif
Packit Service 82fcde
#include <atomic.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
Packit Service 82fcde
#ifndef STATIC
Packit Service 82fcde
#define STATIC static
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#include "crypt-private.h"
Packit Service 82fcde
#include <shlib-compat.h>
Packit Service 82fcde
Packit Service 82fcde
/* Prototypes for local functions.  */
Packit Service 82fcde
#ifndef __GNU_LIBRARY__
Packit Service 82fcde
void _ufc_clearmem (char *start, int cnt);
Packit Service 82fcde
void _ufc_copymem (char *from, char *to, int cnt);
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifdef _UFC_32_
Packit Service 82fcde
STATIC void shuffle_sb (long32 *k, ufc_long saltbits);
Packit Service 82fcde
#else
Packit Service 82fcde
STATIC void shuffle_sb (long64 *k, ufc_long saltbits);
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * Permutation done once on the 56 bit
Packit Service 82fcde
 *  key derived from the original 8 byte ASCII key.
Packit Service 82fcde
 */
Packit Service 82fcde
static const int pc1[56] = {
Packit Service 82fcde
  57, 49, 41, 33, 25, 17,  9,  1, 58, 50, 42, 34, 26, 18,
Packit Service 82fcde
  10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,
Packit Service 82fcde
  63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22,
Packit Service 82fcde
  14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,  4
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * How much to rotate each 28 bit half of the pc1 permutated
Packit Service 82fcde
 *  56 bit key before using pc2 to give the i' key
Packit Service 82fcde
 */
Packit Service 82fcde
static const int rots[16] = {
Packit Service 82fcde
  1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * Permutation giving the key
Packit Service 82fcde
 * of the i' DES round
Packit Service 82fcde
 */
Packit Service 82fcde
static const int pc2[48] = {
Packit Service 82fcde
  14, 17, 11, 24,  1,  5,  3, 28, 15,  6, 21, 10,
Packit Service 82fcde
  23, 19, 12,  4, 26,  8, 16,  7, 27, 20, 13,  2,
Packit Service 82fcde
  41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
Packit Service 82fcde
  44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * The E expansion table which selects
Packit Service 82fcde
 * bits from the 32 bit intermediate result.
Packit Service 82fcde
 */
Packit Service 82fcde
static const int esel[48] = {
Packit Service 82fcde
  32,  1,  2,  3,  4,  5,  4,  5,  6,  7,  8,  9,
Packit Service 82fcde
   8,  9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
Packit Service 82fcde
  16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
Packit Service 82fcde
  24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32,  1
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * Permutation done on the
Packit Service 82fcde
 * result of sbox lookups
Packit Service 82fcde
 */
Packit Service 82fcde
static const int perm32[32] = {
Packit Service 82fcde
  16,  7, 20, 21, 29, 12, 28, 17,  1, 15, 23, 26,  5, 18, 31, 10,
Packit Service 82fcde
  2,   8, 24, 14, 32, 27,  3,  9, 19, 13, 30,  6, 22, 11,  4, 25
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * The sboxes
Packit Service 82fcde
 */
Packit Service 82fcde
static const int sbox[8][4][16]= {
Packit Service 82fcde
	{ { 14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7 },
Packit Service 82fcde
	  {  0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8 },
Packit Service 82fcde
	  {  4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0 },
Packit Service 82fcde
	  { 15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13 }
Packit Service 82fcde
	},
Packit Service 82fcde
Packit Service 82fcde
	{ { 15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10 },
Packit Service 82fcde
	  {  3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5 },
Packit Service 82fcde
	  {  0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15 },
Packit Service 82fcde
	  { 13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9 }
Packit Service 82fcde
	},
Packit Service 82fcde
Packit Service 82fcde
	{ { 10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8 },
Packit Service 82fcde
	  { 13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1 },
Packit Service 82fcde
	  { 13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7 },
Packit Service 82fcde
	  {  1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12 }
Packit Service 82fcde
	},
Packit Service 82fcde
Packit Service 82fcde
	{ {  7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15 },
Packit Service 82fcde
	  { 13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9 },
Packit Service 82fcde
	  { 10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4 },
Packit Service 82fcde
	  {  3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14 }
Packit Service 82fcde
	},
Packit Service 82fcde
Packit Service 82fcde
	{ {  2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9 },
Packit Service 82fcde
	  { 14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6 },
Packit Service 82fcde
	  {  4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14 },
Packit Service 82fcde
	  { 11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3 }
Packit Service 82fcde
	},
Packit Service 82fcde
Packit Service 82fcde
	{ { 12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11 },
Packit Service 82fcde
	  { 10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8 },
Packit Service 82fcde
	  {  9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6 },
Packit Service 82fcde
	  {  4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13 }
Packit Service 82fcde
	},
Packit Service 82fcde
Packit Service 82fcde
	{ {  4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1 },
Packit Service 82fcde
	  { 13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6 },
Packit Service 82fcde
	  {  1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2 },
Packit Service 82fcde
	  {  6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12 }
Packit Service 82fcde
	},
Packit Service 82fcde
Packit Service 82fcde
	{ { 13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7 },
Packit Service 82fcde
	  {  1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2 },
Packit Service 82fcde
	  {  7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8 },
Packit Service 82fcde
	  {  2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11 }
Packit Service 82fcde
	}
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
#if SHLIB_COMPAT (libcrypt, GLIBC_2_0, GLIBC_2_28)
Packit Service 82fcde
/*
Packit Service 82fcde
 * This is the initial
Packit Service 82fcde
 * permutation matrix
Packit Service 82fcde
 */
Packit Service 82fcde
static const int initial_perm[64] = {
Packit Service 82fcde
  58, 50, 42, 34, 26, 18, 10,  2, 60, 52, 44, 36, 28, 20, 12, 4,
Packit Service 82fcde
  62, 54, 46, 38, 30, 22, 14,  6, 64, 56, 48, 40, 32, 24, 16, 8,
Packit Service 82fcde
  57, 49, 41, 33, 25, 17,  9,  1, 59, 51, 43, 35, 27, 19, 11, 3,
Packit Service 82fcde
  61, 53, 45, 37, 29, 21, 13,  5, 63, 55, 47, 39, 31, 23, 15, 7
Packit Service 82fcde
};
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * This is the final
Packit Service 82fcde
 * permutation matrix
Packit Service 82fcde
 */
Packit Service 82fcde
static const int final_perm[64] = {
Packit Service 82fcde
  40,  8, 48, 16, 56, 24, 64, 32, 39,  7, 47, 15, 55, 23, 63, 31,
Packit Service 82fcde
  38,  6, 46, 14, 54, 22, 62, 30, 37,  5, 45, 13, 53, 21, 61, 29,
Packit Service 82fcde
  36,  4, 44, 12, 52, 20, 60, 28, 35,  3, 43, 11, 51, 19, 59, 27,
Packit Service 82fcde
  34,  2, 42, 10, 50, 18, 58, 26, 33,  1, 41,  9, 49, 17, 57, 25
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
#define ascii_to_bin(c) ((c)>='a'?(c-59):(c)>='A'?((c)-53):(c)-'.')
Packit Service 82fcde
#define bin_to_ascii(c) ((c)>=38?((c)-38+'a'):(c)>=12?((c)-12+'A'):(c)+'.')
Packit Service 82fcde
Packit Service 82fcde
static const ufc_long BITMASK[24] = {
Packit Service 82fcde
  0x40000000, 0x20000000, 0x10000000, 0x08000000, 0x04000000, 0x02000000,
Packit Service 82fcde
  0x01000000, 0x00800000, 0x00400000, 0x00200000, 0x00100000, 0x00080000,
Packit Service 82fcde
  0x00004000, 0x00002000, 0x00001000, 0x00000800, 0x00000400, 0x00000200,
Packit Service 82fcde
  0x00000100, 0x00000080, 0x00000040, 0x00000020, 0x00000010, 0x00000008
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
static const unsigned char bytemask[8]  = {
Packit Service 82fcde
  0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
static const ufc_long longmask[32] = {
Packit Service 82fcde
  0x80000000, 0x40000000, 0x20000000, 0x10000000,
Packit Service 82fcde
  0x08000000, 0x04000000, 0x02000000, 0x01000000,
Packit Service 82fcde
  0x00800000, 0x00400000, 0x00200000, 0x00100000,
Packit Service 82fcde
  0x00080000, 0x00040000, 0x00020000, 0x00010000,
Packit Service 82fcde
  0x00008000, 0x00004000, 0x00002000, 0x00001000,
Packit Service 82fcde
  0x00000800, 0x00000400, 0x00000200, 0x00000100,
Packit Service 82fcde
  0x00000080, 0x00000040, 0x00000020, 0x00000010,
Packit Service 82fcde
  0x00000008, 0x00000004, 0x00000002, 0x00000001
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * do_pc1: permform pc1 permutation in the key schedule generation.
Packit Service 82fcde
 *
Packit Service 82fcde
 * The first   index is the byte number in the 8 byte ASCII key
Packit Service 82fcde
 *  -  second    -      -    the two 28 bits halfs of the result
Packit Service 82fcde
 *  -  third     -   selects the 7 bits actually used of each byte
Packit Service 82fcde
 *
Packit Service 82fcde
 * The result is kept with 28 bit per 32 bit with the 4 most significant
Packit Service 82fcde
 * bits zero.
Packit Service 82fcde
 */
Packit Service 82fcde
static ufc_long do_pc1[8][2][128];
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * do_pc2: permform pc2 permutation in the key schedule generation.
Packit Service 82fcde
 *
Packit Service 82fcde
 * The first   index is the septet number in the two 28 bit intermediate values
Packit Service 82fcde
 *  -  second    -    -  -  septet values
Packit Service 82fcde
 *
Packit Service 82fcde
 * Knowledge of the structure of the pc2 permutation is used.
Packit Service 82fcde
 *
Packit Service 82fcde
 * The result is kept with 28 bit per 32 bit with the 4 most significant
Packit Service 82fcde
 * bits zero.
Packit Service 82fcde
 */
Packit Service 82fcde
static ufc_long do_pc2[8][128];
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * eperm32tab: do 32 bit permutation and E selection
Packit Service 82fcde
 *
Packit Service 82fcde
 * The first index is the byte number in the 32 bit value to be permuted
Packit Service 82fcde
 *  -  second  -   is the value of this byte
Packit Service 82fcde
 *  -  third   -   selects the two 32 bit values
Packit Service 82fcde
 *
Packit Service 82fcde
 * The table is used and generated internally in init_des to speed it up
Packit Service 82fcde
 */
Packit Service 82fcde
static ufc_long eperm32tab[4][256][2];
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * efp: undo an extra e selection and do final
Packit Service 82fcde
 *      permutation giving the DES result.
Packit Service 82fcde
 *
Packit Service 82fcde
 *      Invoked 6 bit a time on two 48 bit values
Packit Service 82fcde
 *      giving two 32 bit longs.
Packit Service 82fcde
 */
Packit Service 82fcde
static ufc_long efp[16][64][2];
Packit Service 82fcde
Packit Service 82fcde
/* Table with characters for base64 transformation.  */
Packit Service 82fcde
static const char b64t[64] =
Packit Service 82fcde
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * For use by the old, non-reentrant routines
Packit Service 82fcde
 * (crypt/encrypt/setkey)
Packit Service 82fcde
 */
Packit Service 82fcde
struct crypt_data _ufc_foobar;
Packit Service 82fcde
Packit Service 82fcde
#ifdef __GNU_LIBRARY__
Packit Service 82fcde
#include <libc-lock.h>
Packit Service 82fcde
Packit Service 82fcde
__libc_lock_define_initialized (static, _ufc_tables_lock)
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifdef DEBUG
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_ufc_prbits (ufc_long *a, int n)
Packit Service 82fcde
{
Packit Service 82fcde
  ufc_long i, j, t, tmp;
Packit Service 82fcde
  n /= 8;
Packit Service 82fcde
  for(i = 0; i < n; i++) {
Packit Service 82fcde
    tmp=0;
Packit Service 82fcde
    for(j = 0; j < 8; j++) {
Packit Service 82fcde
      t=8*i+j;
Packit Service 82fcde
      tmp|=(a[t/24] & BITMASK[t % 24])?bytemask[j]:0;
Packit Service 82fcde
    }
Packit Service 82fcde
    (void)printf("%02lx ", tmp);
Packit Service 82fcde
  }
Packit Service 82fcde
  printf(" ");
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
static void __attribute__ ((unused))
Packit Service 82fcde
_ufc_set_bits (ufc_long v, ufc_long *b)
Packit Service 82fcde
{
Packit Service 82fcde
  ufc_long i;
Packit Service 82fcde
  *b = 0;
Packit Service 82fcde
  for(i = 0; i < 24; i++) {
Packit Service 82fcde
    if(v & longmask[8 + i])
Packit Service 82fcde
      *b |= BITMASK[i];
Packit Service 82fcde
  }
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifndef __GNU_LIBRARY__
Packit Service 82fcde
/*
Packit Service 82fcde
 * Silly rewrites of 'bzero'/'memset'. I do so
Packit Service 82fcde
 * because some machines don't have
Packit Service 82fcde
 * bzero and some don't have memset.
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_ufc_clearmem (char *start, int cnt)
Packit Service 82fcde
{
Packit Service 82fcde
  while(cnt--)
Packit Service 82fcde
    *start++ = '\0';
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_ufc_copymem (char *from, char *to, int cnt)
Packit Service 82fcde
{
Packit Service 82fcde
  while(cnt--)
Packit Service 82fcde
    *to++ = *from++;
Packit Service 82fcde
}
Packit Service 82fcde
#else
Packit Service 82fcde
#define _ufc_clearmem(start, cnt)   memset(start, 0, cnt)
Packit Service 82fcde
#define _ufc_copymem(from, to, cnt) memcpy(to, from, cnt)
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* lookup a 6 bit value in sbox */
Packit Service 82fcde
Packit Service 82fcde
#define s_lookup(i,s) sbox[(i)][(((s)>>4) & 0x2)|((s) & 0x1)][((s)>>1) & 0xf];
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * Initialize unit - may be invoked directly
Packit Service 82fcde
 * by fcrypt users.
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
__init_des_r (struct crypt_data * __restrict __data)
Packit Service 82fcde
{
Packit Service 82fcde
  int comes_from_bit;
Packit Service 82fcde
  int bit, sg;
Packit Service 82fcde
  ufc_long j;
Packit Service 82fcde
  ufc_long mask1, mask2;
Packit Service 82fcde
  int e_inverse[64];
Packit Service 82fcde
  static volatile int small_tables_initialized = 0;
Packit Service 82fcde
Packit Service 82fcde
#ifdef _UFC_32_
Packit Service 82fcde
  long32 *sb[4];
Packit Service 82fcde
  sb[0] = (long32*)__data->sb0; sb[1] = (long32*)__data->sb1;
Packit Service 82fcde
  sb[2] = (long32*)__data->sb2; sb[3] = (long32*)__data->sb3;
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifdef _UFC_64_
Packit Service 82fcde
  long64 *sb[4];
Packit Service 82fcde
  sb[0] = (long64*)__data->sb0; sb[1] = (long64*)__data->sb1;
Packit Service 82fcde
  sb[2] = (long64*)__data->sb2; sb[3] = (long64*)__data->sb3;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  if(small_tables_initialized == 0) {
Packit Service 82fcde
#ifdef __GNU_LIBRARY__
Packit Service 82fcde
    __libc_lock_lock (_ufc_tables_lock);
Packit Service 82fcde
    if(small_tables_initialized)
Packit Service 82fcde
      goto small_tables_done;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    /*
Packit Service 82fcde
     * Create the do_pc1 table used
Packit Service 82fcde
     * to affect pc1 permutation
Packit Service 82fcde
     * when generating keys
Packit Service 82fcde
     */
Packit Service 82fcde
    _ufc_clearmem((char*)do_pc1, (int)sizeof(do_pc1));
Packit Service 82fcde
    for(bit = 0; bit < 56; bit++) {
Packit Service 82fcde
      comes_from_bit  = pc1[bit] - 1;
Packit Service 82fcde
      mask1 = bytemask[comes_from_bit % 8 + 1];
Packit Service 82fcde
      mask2 = longmask[bit % 28 + 4];
Packit Service 82fcde
      for(j = 0; j < 128; j++) {
Packit Service 82fcde
	if(j & mask1)
Packit Service 82fcde
	  do_pc1[comes_from_bit / 8][bit / 28][j] |= mask2;
Packit Service 82fcde
      }
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
    /*
Packit Service 82fcde
     * Create the do_pc2 table used
Packit Service 82fcde
     * to affect pc2 permutation when
Packit Service 82fcde
     * generating keys
Packit Service 82fcde
     */
Packit Service 82fcde
    _ufc_clearmem((char*)do_pc2, (int)sizeof(do_pc2));
Packit Service 82fcde
    for(bit = 0; bit < 48; bit++) {
Packit Service 82fcde
      comes_from_bit  = pc2[bit] - 1;
Packit Service 82fcde
      mask1 = bytemask[comes_from_bit % 7 + 1];
Packit Service 82fcde
      mask2 = BITMASK[bit % 24];
Packit Service 82fcde
      for(j = 0; j < 128; j++) {
Packit Service 82fcde
	if(j & mask1)
Packit Service 82fcde
	  do_pc2[comes_from_bit / 7][j] |= mask2;
Packit Service 82fcde
      }
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
    /*
Packit Service 82fcde
     * Now generate the table used to do combined
Packit Service 82fcde
     * 32 bit permutation and e expansion
Packit Service 82fcde
     *
Packit Service 82fcde
     * We use it because we have to permute 16384 32 bit
Packit Service 82fcde
     * longs into 48 bit in order to initialize sb.
Packit Service 82fcde
     *
Packit Service 82fcde
     * Looping 48 rounds per permutation becomes
Packit Service 82fcde
     * just too slow...
Packit Service 82fcde
     *
Packit Service 82fcde
     */
Packit Service 82fcde
Packit Service 82fcde
    _ufc_clearmem((char*)eperm32tab, (int)sizeof(eperm32tab));
Packit Service 82fcde
    for(bit = 0; bit < 48; bit++) {
Packit Service 82fcde
      ufc_long mask1,comes_from;
Packit Service 82fcde
      comes_from = perm32[esel[bit]-1]-1;
Packit Service 82fcde
      mask1      = bytemask[comes_from % 8];
Packit Service 82fcde
      for(j = 256; j--;) {
Packit Service 82fcde
	if(j & mask1)
Packit Service 82fcde
	  eperm32tab[comes_from / 8][j][bit / 24] |= BITMASK[bit % 24];
Packit Service 82fcde
      }
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
    /*
Packit Service 82fcde
     * Create an inverse matrix for esel telling
Packit Service 82fcde
     * where to plug out bits if undoing it
Packit Service 82fcde
     */
Packit Service 82fcde
    for(bit=48; bit--;) {
Packit Service 82fcde
      e_inverse[esel[bit] - 1     ] = bit;
Packit Service 82fcde
      e_inverse[esel[bit] - 1 + 32] = bit + 48;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
    /*
Packit Service 82fcde
     * create efp: the matrix used to
Packit Service 82fcde
     * undo the E expansion and effect final permutation
Packit Service 82fcde
     */
Packit Service 82fcde
    _ufc_clearmem((char*)efp, (int)sizeof efp);
Packit Service 82fcde
    for(bit = 0; bit < 64; bit++) {
Packit Service 82fcde
      int o_bit, o_long;
Packit Service 82fcde
      ufc_long word_value, mask1, mask2;
Packit Service 82fcde
      int comes_from_f_bit, comes_from_e_bit;
Packit Service 82fcde
      int comes_from_word, bit_within_word;
Packit Service 82fcde
Packit Service 82fcde
      /* See where bit i belongs in the two 32 bit long's */
Packit Service 82fcde
      o_long = bit / 32; /* 0..1  */
Packit Service 82fcde
      o_bit  = bit % 32; /* 0..31 */
Packit Service 82fcde
Packit Service 82fcde
      /*
Packit Service 82fcde
       * And find a bit in the e permutated value setting this bit.
Packit Service 82fcde
       *
Packit Service 82fcde
       * Note: the e selection may have selected the same bit several
Packit Service 82fcde
       * times. By the initialization of e_inverse, we only look
Packit Service 82fcde
       * for one specific instance.
Packit Service 82fcde
       */
Packit Service 82fcde
      comes_from_f_bit = final_perm[bit] - 1;         /* 0..63 */
Packit Service 82fcde
      comes_from_e_bit = e_inverse[comes_from_f_bit]; /* 0..95 */
Packit Service 82fcde
      comes_from_word  = comes_from_e_bit / 6;        /* 0..15 */
Packit Service 82fcde
      bit_within_word  = comes_from_e_bit % 6;        /* 0..5  */
Packit Service 82fcde
Packit Service 82fcde
      mask1 = longmask[bit_within_word + 26];
Packit Service 82fcde
      mask2 = longmask[o_bit];
Packit Service 82fcde
Packit Service 82fcde
      for(word_value = 64; word_value--;) {
Packit Service 82fcde
	if(word_value & mask1)
Packit Service 82fcde
	  efp[comes_from_word][word_value][o_long] |= mask2;
Packit Service 82fcde
      }
Packit Service 82fcde
    }
Packit Service 82fcde
    atomic_write_barrier ();
Packit Service 82fcde
    small_tables_initialized = 1;
Packit Service 82fcde
#ifdef __GNU_LIBRARY__
Packit Service 82fcde
small_tables_done:
Packit Service 82fcde
    __libc_lock_unlock(_ufc_tables_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
  } else
Packit Service 82fcde
    atomic_read_barrier ();
Packit Service 82fcde
Packit Service 82fcde
  /*
Packit Service 82fcde
   * Create the sb tables:
Packit Service 82fcde
   *
Packit Service 82fcde
   * For each 12 bit segment of an 48 bit intermediate
Packit Service 82fcde
   * result, the sb table precomputes the two 4 bit
Packit Service 82fcde
   * values of the sbox lookups done with the two 6
Packit Service 82fcde
   * bit halves, shifts them to their proper place,
Packit Service 82fcde
   * sends them through perm32 and finally E expands
Packit Service 82fcde
   * them so that they are ready for the next
Packit Service 82fcde
   * DES round.
Packit Service 82fcde
   *
Packit Service 82fcde
   */
Packit Service 82fcde
Packit Service 82fcde
  if (__data->sb0 + sizeof (__data->sb0) == __data->sb1
Packit Service 82fcde
      && __data->sb1 + sizeof (__data->sb1) == __data->sb2
Packit Service 82fcde
      && __data->sb2 + sizeof (__data->sb2) == __data->sb3)
Packit Service 82fcde
    _ufc_clearmem(__data->sb0,
Packit Service 82fcde
		  (int)sizeof(__data->sb0)
Packit Service 82fcde
		  + (int)sizeof(__data->sb1)
Packit Service 82fcde
		  + (int)sizeof(__data->sb2)
Packit Service 82fcde
		  + (int)sizeof(__data->sb3));
Packit Service 82fcde
  else {
Packit Service 82fcde
    _ufc_clearmem(__data->sb0, (int)sizeof(__data->sb0));
Packit Service 82fcde
    _ufc_clearmem(__data->sb1, (int)sizeof(__data->sb1));
Packit Service 82fcde
    _ufc_clearmem(__data->sb2, (int)sizeof(__data->sb2));
Packit Service 82fcde
    _ufc_clearmem(__data->sb3, (int)sizeof(__data->sb3));
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  for(sg = 0; sg < 4; sg++) {
Packit Service 82fcde
    int j1, j2;
Packit Service 82fcde
    int s1, s2;
Packit Service 82fcde
Packit Service 82fcde
    for(j1 = 0; j1 < 64; j1++) {
Packit Service 82fcde
      s1 = s_lookup(2 * sg, j1);
Packit Service 82fcde
      for(j2 = 0; j2 < 64; j2++) {
Packit Service 82fcde
	ufc_long to_permute, inx;
Packit Service 82fcde
Packit Service 82fcde
	s2         = s_lookup(2 * sg + 1, j2);
Packit Service 82fcde
	to_permute = (((ufc_long)s1 << 4)  |
Packit Service 82fcde
		      (ufc_long)s2) << (24 - 8 * (ufc_long)sg);
Packit Service 82fcde
Packit Service 82fcde
#ifdef _UFC_32_
Packit Service 82fcde
	inx = ((j1 << 6)  | j2) << 1;
Packit Service 82fcde
	sb[sg][inx  ]  = eperm32tab[0][(to_permute >> 24) & 0xff][0];
Packit Service 82fcde
	sb[sg][inx+1]  = eperm32tab[0][(to_permute >> 24) & 0xff][1];
Packit Service 82fcde
	sb[sg][inx  ] |= eperm32tab[1][(to_permute >> 16) & 0xff][0];
Packit Service 82fcde
	sb[sg][inx+1] |= eperm32tab[1][(to_permute >> 16) & 0xff][1];
Packit Service 82fcde
	sb[sg][inx  ] |= eperm32tab[2][(to_permute >>  8) & 0xff][0];
Packit Service 82fcde
	sb[sg][inx+1] |= eperm32tab[2][(to_permute >>  8) & 0xff][1];
Packit Service 82fcde
	sb[sg][inx  ] |= eperm32tab[3][(to_permute)       & 0xff][0];
Packit Service 82fcde
	sb[sg][inx+1] |= eperm32tab[3][(to_permute)       & 0xff][1];
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifdef _UFC_64_
Packit Service 82fcde
	inx = ((j1 << 6)  | j2);
Packit Service 82fcde
	sb[sg][inx]  =
Packit Service 82fcde
	  ((long64)eperm32tab[0][(to_permute >> 24) & 0xff][0] << 32) |
Packit Service 82fcde
	   (long64)eperm32tab[0][(to_permute >> 24) & 0xff][1];
Packit Service 82fcde
	sb[sg][inx] |=
Packit Service 82fcde
	  ((long64)eperm32tab[1][(to_permute >> 16) & 0xff][0] << 32) |
Packit Service 82fcde
	   (long64)eperm32tab[1][(to_permute >> 16) & 0xff][1];
Packit Service 82fcde
	sb[sg][inx] |=
Packit Service 82fcde
	  ((long64)eperm32tab[2][(to_permute >>  8) & 0xff][0] << 32) |
Packit Service 82fcde
	   (long64)eperm32tab[2][(to_permute >>  8) & 0xff][1];
Packit Service 82fcde
	sb[sg][inx] |=
Packit Service 82fcde
	  ((long64)eperm32tab[3][(to_permute)       & 0xff][0] << 32) |
Packit Service 82fcde
	   (long64)eperm32tab[3][(to_permute)       & 0xff][1];
Packit Service 82fcde
#endif
Packit Service 82fcde
      }
Packit Service 82fcde
    }
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  __data->current_saltbits = 0;
Packit Service 82fcde
  __data->current_salt[0] = 0;
Packit Service 82fcde
  __data->current_salt[1] = 0;
Packit Service 82fcde
  __data->initialized++;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
__init_des (void)
Packit Service 82fcde
{
Packit Service 82fcde
  __init_des_r(&_ufc_foobar);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * Process the elements of the sb table permuting the
Packit Service 82fcde
 * bits swapped in the expansion by the current salt.
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
#ifdef _UFC_32_
Packit Service 82fcde
STATIC void
Packit Service 82fcde
shuffle_sb (long32 *k, ufc_long saltbits)
Packit Service 82fcde
{
Packit Service 82fcde
  ufc_long j;
Packit Service 82fcde
  long32 x;
Packit Service 82fcde
  for(j=4096; j--;) {
Packit Service 82fcde
    x = (k[0] ^ k[1]) & (long32)saltbits;
Packit Service 82fcde
    *k++ ^= x;
Packit Service 82fcde
    *k++ ^= x;
Packit Service 82fcde
  }
Packit Service 82fcde
}
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifdef _UFC_64_
Packit Service 82fcde
STATIC void
Packit Service 82fcde
shuffle_sb (long64 *k, ufc_long saltbits)
Packit Service 82fcde
{
Packit Service 82fcde
  ufc_long j;
Packit Service 82fcde
  long64 x;
Packit Service 82fcde
  for(j=4096; j--;) {
Packit Service 82fcde
    x = ((*k >> 32) ^ *k) & (long64)saltbits;
Packit Service 82fcde
    *k++ ^= (x << 32) | x;
Packit Service 82fcde
  }
Packit Service 82fcde
}
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * Return false iff C is in the specified alphabet for crypt salt.
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
static bool
Packit Service 82fcde
bad_for_salt (char c)
Packit Service 82fcde
{
Packit Service 82fcde
  switch (c)
Packit Service 82fcde
    {
Packit Service 82fcde
    case '0' ... '9':
Packit Service 82fcde
    case 'A' ... 'Z':
Packit Service 82fcde
    case 'a' ... 'z':
Packit Service 82fcde
    case '.': case '/':
Packit Service 82fcde
      return false;
Packit Service 82fcde
Packit Service 82fcde
    default:
Packit Service 82fcde
      return true;
Packit Service 82fcde
    }
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * Setup the unit for a new salt
Packit Service 82fcde
 * Hopefully we'll not see a new salt in each crypt call.
Packit Service 82fcde
 * Return false if an unexpected character was found in s[0] or s[1].
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
bool
Packit Service 82fcde
_ufc_setup_salt_r (const char *s, struct crypt_data * __restrict __data)
Packit Service 82fcde
{
Packit Service 82fcde
  ufc_long i, j, saltbits;
Packit Service 82fcde
  char s0, s1;
Packit Service 82fcde
Packit Service 82fcde
  if(__data->initialized == 0)
Packit Service 82fcde
    __init_des_r(__data);
Packit Service 82fcde
Packit Service 82fcde
  s0 = s[0];
Packit Service 82fcde
  if(bad_for_salt (s0))
Packit Service 82fcde
    return false;
Packit Service 82fcde
Packit Service 82fcde
  s1 = s[1];
Packit Service 82fcde
  if(bad_for_salt (s1))
Packit Service 82fcde
    return false;
Packit Service 82fcde
Packit Service 82fcde
  if(s0 == __data->current_salt[0] && s1 == __data->current_salt[1])
Packit Service 82fcde
    return true;
Packit Service 82fcde
Packit Service 82fcde
  __data->current_salt[0] = s0;
Packit Service 82fcde
  __data->current_salt[1] = s1;
Packit Service 82fcde
Packit Service 82fcde
  /*
Packit Service 82fcde
   * This is the only crypt change to DES:
Packit Service 82fcde
   * entries are swapped in the expansion table
Packit Service 82fcde
   * according to the bits set in the salt.
Packit Service 82fcde
   */
Packit Service 82fcde
  saltbits = 0;
Packit Service 82fcde
  for(i = 0; i < 2; i++) {
Packit Service 82fcde
    long c=ascii_to_bin(s[i]);
Packit Service 82fcde
    for(j = 0; j < 6; j++) {
Packit Service 82fcde
      if((c >> j) & 0x1)
Packit Service 82fcde
	saltbits |= BITMASK[6 * i + j];
Packit Service 82fcde
    }
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  /*
Packit Service 82fcde
   * Permute the sb table values
Packit Service 82fcde
   * to reflect the changed e
Packit Service 82fcde
   * selection table
Packit Service 82fcde
   */
Packit Service 82fcde
#ifdef _UFC_32_
Packit Service 82fcde
#define LONGG long32*
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifdef _UFC_64_
Packit Service 82fcde
#define LONGG long64*
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  shuffle_sb((LONGG)__data->sb0, __data->current_saltbits ^ saltbits);
Packit Service 82fcde
  shuffle_sb((LONGG)__data->sb1, __data->current_saltbits ^ saltbits);
Packit Service 82fcde
  shuffle_sb((LONGG)__data->sb2, __data->current_saltbits ^ saltbits);
Packit Service 82fcde
  shuffle_sb((LONGG)__data->sb3, __data->current_saltbits ^ saltbits);
Packit Service 82fcde
Packit Service 82fcde
  __data->current_saltbits = saltbits;
Packit Service 82fcde
Packit Service 82fcde
  return true;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_ufc_mk_keytab_r (const char *key, struct crypt_data * __restrict __data)
Packit Service 82fcde
{
Packit Service 82fcde
  ufc_long v1, v2, *k1;
Packit Service 82fcde
  int i;
Packit Service 82fcde
#ifdef _UFC_32_
Packit Service 82fcde
  long32 v, *k2;
Packit Service 82fcde
  k2 = (long32*)__data->keysched;
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifdef _UFC_64_
Packit Service 82fcde
  long64 v, *k2;
Packit Service 82fcde
  k2 = (long64*)__data->keysched;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  v1 = v2 = 0; k1 = &do_pc1[0][0][0];
Packit Service 82fcde
  for(i = 8; i--;) {
Packit Service 82fcde
    v1 |= k1[*key   & 0x7f]; k1 += 128;
Packit Service 82fcde
    v2 |= k1[*key++ & 0x7f]; k1 += 128;
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  for(i = 0; i < 16; i++) {
Packit Service 82fcde
    k1 = &do_pc2[0][0];
Packit Service 82fcde
Packit Service 82fcde
    v1 = (v1 << rots[i]) | (v1 >> (28 - rots[i]));
Packit Service 82fcde
    v  = k1[(v1 >> 21) & 0x7f]; k1 += 128;
Packit Service 82fcde
    v |= k1[(v1 >> 14) & 0x7f]; k1 += 128;
Packit Service 82fcde
    v |= k1[(v1 >>  7) & 0x7f]; k1 += 128;
Packit Service 82fcde
    v |= k1[(v1      ) & 0x7f]; k1 += 128;
Packit Service 82fcde
Packit Service 82fcde
#ifdef _UFC_32_
Packit Service 82fcde
    *k2++ = (v | 0x00008000);
Packit Service 82fcde
    v = 0;
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifdef _UFC_64_
Packit Service 82fcde
    v = (v << 32);
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    v2 = (v2 << rots[i]) | (v2 >> (28 - rots[i]));
Packit Service 82fcde
    v |= k1[(v2 >> 21) & 0x7f]; k1 += 128;
Packit Service 82fcde
    v |= k1[(v2 >> 14) & 0x7f]; k1 += 128;
Packit Service 82fcde
    v |= k1[(v2 >>  7) & 0x7f]; k1 += 128;
Packit Service 82fcde
    v |= k1[(v2      ) & 0x7f];
Packit Service 82fcde
Packit Service 82fcde
#ifdef _UFC_32_
Packit Service 82fcde
    *k2++ = (v | 0x00008000);
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifdef _UFC_64_
Packit Service 82fcde
    *k2++ = v | 0x0000800000008000l;
Packit Service 82fcde
#endif
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  __data->direction = 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * Undo an extra E selection and do final permutations
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_ufc_dofinalperm_r (ufc_long *res, struct crypt_data * __restrict __data)
Packit Service 82fcde
{
Packit Service 82fcde
  ufc_long v1, v2, x;
Packit Service 82fcde
  ufc_long l1,l2,r1,r2;
Packit Service 82fcde
Packit Service 82fcde
  l1 = res[0]; l2 = res[1];
Packit Service 82fcde
  r1 = res[2]; r2 = res[3];
Packit Service 82fcde
Packit Service 82fcde
  x = (l1 ^ l2) & __data->current_saltbits; l1 ^= x; l2 ^= x;
Packit Service 82fcde
  x = (r1 ^ r2) & __data->current_saltbits; r1 ^= x; r2 ^= x;
Packit Service 82fcde
Packit Service 82fcde
  v1=v2=0; l1 >>= 3; l2 >>= 3; r1 >>= 3; r2 >>= 3;
Packit Service 82fcde
Packit Service 82fcde
  v1 |= efp[15][ r2         & 0x3f][0]; v2 |= efp[15][ r2 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[14][(r2 >>= 6)  & 0x3f][0]; v2 |= efp[14][ r2 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[13][(r2 >>= 10) & 0x3f][0]; v2 |= efp[13][ r2 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[12][(r2 >>= 6)  & 0x3f][0]; v2 |= efp[12][ r2 & 0x3f][1];
Packit Service 82fcde
Packit Service 82fcde
  v1 |= efp[11][ r1         & 0x3f][0]; v2 |= efp[11][ r1 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[10][(r1 >>= 6)  & 0x3f][0]; v2 |= efp[10][ r1 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[ 9][(r1 >>= 10) & 0x3f][0]; v2 |= efp[ 9][ r1 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[ 8][(r1 >>= 6)  & 0x3f][0]; v2 |= efp[ 8][ r1 & 0x3f][1];
Packit Service 82fcde
Packit Service 82fcde
  v1 |= efp[ 7][ l2         & 0x3f][0]; v2 |= efp[ 7][ l2 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[ 6][(l2 >>= 6)  & 0x3f][0]; v2 |= efp[ 6][ l2 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[ 5][(l2 >>= 10) & 0x3f][0]; v2 |= efp[ 5][ l2 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[ 4][(l2 >>= 6)  & 0x3f][0]; v2 |= efp[ 4][ l2 & 0x3f][1];
Packit Service 82fcde
Packit Service 82fcde
  v1 |= efp[ 3][ l1         & 0x3f][0]; v2 |= efp[ 3][ l1 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[ 2][(l1 >>= 6)  & 0x3f][0]; v2 |= efp[ 2][ l1 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[ 1][(l1 >>= 10) & 0x3f][0]; v2 |= efp[ 1][ l1 & 0x3f][1];
Packit Service 82fcde
  v1 |= efp[ 0][(l1 >>= 6)  & 0x3f][0]; v2 |= efp[ 0][ l1 & 0x3f][1];
Packit Service 82fcde
Packit Service 82fcde
  res[0] = v1; res[1] = v2;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * crypt only: convert from 64 bit to 11 bit ASCII
Packit Service 82fcde
 * prefixing with the salt
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_ufc_output_conversion_r (ufc_long v1, ufc_long v2, const char *salt,
Packit Service 82fcde
			  struct crypt_data * __restrict __data)
Packit Service 82fcde
{
Packit Service 82fcde
  int i, s, shf;
Packit Service 82fcde
Packit Service 82fcde
  __data->crypt_3_buf[0] = salt[0];
Packit Service 82fcde
  __data->crypt_3_buf[1] = salt[1] ? salt[1] : salt[0];
Packit Service 82fcde
Packit Service 82fcde
  for(i = 0; i < 5; i++) {
Packit Service 82fcde
    shf = (26 - 6 * i); /* to cope with MSC compiler bug */
Packit Service 82fcde
    __data->crypt_3_buf[i + 2] = bin_to_ascii((v1 >> shf) & 0x3f);
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  s  = (v2 & 0xf) << 2;
Packit Service 82fcde
  v2 = (v2 >> 2) | ((v1 & 0x3) << 30);
Packit Service 82fcde
Packit Service 82fcde
  for(i = 5; i < 10; i++) {
Packit Service 82fcde
    shf = (56 - 6 * i);
Packit Service 82fcde
    __data->crypt_3_buf[i + 2] = bin_to_ascii((v2 >> shf) & 0x3f);
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  __data->crypt_3_buf[12] = bin_to_ascii(s);
Packit Service 82fcde
  __data->crypt_3_buf[13] = 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#if SHLIB_COMPAT (libcrypt, GLIBC_2_0, GLIBC_2_28)
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * UNIX encrypt function. Takes a bitvector
Packit Service 82fcde
 * represented by one byte per bit and
Packit Service 82fcde
 * encrypt/decrypt according to edflag
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
__encrypt_r (char *__block, int __edflag,
Packit Service 82fcde
	     struct crypt_data * __restrict __data)
Packit Service 82fcde
{
Packit Service 82fcde
  ufc_long l1, l2, r1, r2, res[4];
Packit Service 82fcde
  int i;
Packit Service 82fcde
#ifdef _UFC_32_
Packit Service 82fcde
  long32 *kt;
Packit Service 82fcde
  kt = (long32*)__data->keysched;
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifdef _UFC_64_
Packit Service 82fcde
  long64 *kt;
Packit Service 82fcde
  kt = (long64*)__data->keysched;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  /*
Packit Service 82fcde
   * Undo any salt changes to E expansion
Packit Service 82fcde
   */
Packit Service 82fcde
  _ufc_setup_salt_r("..", __data);
Packit Service 82fcde
Packit Service 82fcde
  /*
Packit Service 82fcde
   * Reverse key table if
Packit Service 82fcde
   * changing operation (encrypt/decrypt)
Packit Service 82fcde
   */
Packit Service 82fcde
  if((__edflag == 0) != (__data->direction == 0)) {
Packit Service 82fcde
    for(i = 0; i < 8; i++) {
Packit Service 82fcde
#ifdef _UFC_32_
Packit Service 82fcde
      long32 x;
Packit Service 82fcde
      x = kt[2 * (15-i)];
Packit Service 82fcde
      kt[2 * (15-i)] = kt[2 * i];
Packit Service 82fcde
      kt[2 * i] = x;
Packit Service 82fcde
Packit Service 82fcde
      x = kt[2 * (15-i) + 1];
Packit Service 82fcde
      kt[2 * (15-i) + 1] = kt[2 * i + 1];
Packit Service 82fcde
      kt[2 * i + 1] = x;
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifdef _UFC_64_
Packit Service 82fcde
      long64 x;
Packit Service 82fcde
      x = kt[15-i];
Packit Service 82fcde
      kt[15-i] = kt[i];
Packit Service 82fcde
      kt[i] = x;
Packit Service 82fcde
#endif
Packit Service 82fcde
      }
Packit Service 82fcde
    __data->direction = __edflag;
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  /*
Packit Service 82fcde
   * Do initial permutation + E expansion
Packit Service 82fcde
   */
Packit Service 82fcde
  i = 0;
Packit Service 82fcde
  for(l1 = 0; i < 24; i++) {
Packit Service 82fcde
    if(__block[initial_perm[esel[i]-1]-1])
Packit Service 82fcde
      l1 |= BITMASK[i];
Packit Service 82fcde
  }
Packit Service 82fcde
  for(l2 = 0; i < 48; i++) {
Packit Service 82fcde
    if(__block[initial_perm[esel[i]-1]-1])
Packit Service 82fcde
      l2 |= BITMASK[i-24];
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  i = 0;
Packit Service 82fcde
  for(r1 = 0; i < 24; i++) {
Packit Service 82fcde
    if(__block[initial_perm[esel[i]-1+32]-1])
Packit Service 82fcde
      r1 |= BITMASK[i];
Packit Service 82fcde
  }
Packit Service 82fcde
  for(r2 = 0; i < 48; i++) {
Packit Service 82fcde
    if(__block[initial_perm[esel[i]-1+32]-1])
Packit Service 82fcde
      r2 |= BITMASK[i-24];
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  /*
Packit Service 82fcde
   * Do DES inner loops + final conversion
Packit Service 82fcde
   */
Packit Service 82fcde
  res[0] = l1; res[1] = l2;
Packit Service 82fcde
  res[2] = r1; res[3] = r2;
Packit Service 82fcde
  _ufc_doit_r((ufc_long)1, __data, &res[0]);
Packit Service 82fcde
Packit Service 82fcde
  /*
Packit Service 82fcde
   * Do final permutations
Packit Service 82fcde
   */
Packit Service 82fcde
  _ufc_dofinalperm_r(res, __data);
Packit Service 82fcde
Packit Service 82fcde
  /*
Packit Service 82fcde
   * And convert to bit array
Packit Service 82fcde
   */
Packit Service 82fcde
  l1 = res[0]; r1 = res[1];
Packit Service 82fcde
  for(i = 0; i < 32; i++) {
Packit Service 82fcde
    *__block++ = (l1 & longmask[i]) != 0;
Packit Service 82fcde
  }
Packit Service 82fcde
  for(i = 0; i < 32; i++) {
Packit Service 82fcde
    *__block++ = (r1 & longmask[i]) != 0;
Packit Service 82fcde
  }
Packit Service 82fcde
}
Packit Service 82fcde
weak_alias (__encrypt_r, encrypt_r)
Packit Service 82fcde
compat_symbol (libcrypt, encrypt_r, encrypt_r, GLIBC_2_0);
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
encrypt (char *__block, int __edflag)
Packit Service 82fcde
{
Packit Service 82fcde
  __encrypt_r(__block, __edflag, &_ufc_foobar);
Packit Service 82fcde
}
Packit Service 82fcde
compat_symbol (libcrypt, encrypt, encrypt, GLIBC_2_0);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * UNIX setkey function. Take a 64 bit DES
Packit Service 82fcde
 * key and setup the machinery.
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
__setkey_r (const char *__key, struct crypt_data * __restrict __data)
Packit Service 82fcde
{
Packit Service 82fcde
  int i,j;
Packit Service 82fcde
  unsigned char c;
Packit Service 82fcde
  unsigned char ktab[8];
Packit Service 82fcde
Packit Service 82fcde
  _ufc_setup_salt_r("..", __data); /* be sure we're initialized */
Packit Service 82fcde
Packit Service 82fcde
  for(i = 0; i < 8; i++) {
Packit Service 82fcde
    for(j = 0, c = 0; j < 8; j++)
Packit Service 82fcde
      c = c << 1 | *__key++;
Packit Service 82fcde
    ktab[i] = c >> 1;
Packit Service 82fcde
  }
Packit Service 82fcde
  _ufc_mk_keytab_r((char *) ktab, __data);
Packit Service 82fcde
}
Packit Service 82fcde
weak_alias (__setkey_r, setkey_r)
Packit Service 82fcde
compat_symbol (libcrypt, setkey_r, setkey_r, GLIBC_2_0);
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
setkey (const char *__key)
Packit Service 82fcde
{
Packit Service 82fcde
  __setkey_r(__key, &_ufc_foobar);
Packit Service 82fcde
}
Packit Service 82fcde
compat_symbol (libcrypt, setkey, setkey, GLIBC_2_0);
Packit Service 82fcde
#endif /* SHLIB_COMPAT (libcrypt, GLIBC_2_0, GLIBC_2_28) */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
__b64_from_24bit (char **cp, int *buflen,
Packit Service 82fcde
		  unsigned int b2, unsigned int b1, unsigned int b0,
Packit Service 82fcde
		  int n)
Packit Service 82fcde
{
Packit Service 82fcde
  unsigned int w = (b2 << 16) | (b1 << 8) | b0;
Packit Service 82fcde
  while (n-- > 0 && (*buflen) > 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      *(*cp)++ = b64t[w & 0x3f];
Packit Service 82fcde
      --(*buflen);
Packit Service 82fcde
      w >>= 6;
Packit Service 82fcde
    }
Packit Service 82fcde
}