protected void desFunc()

in cvs/trilead-ssh2-build213/src/com/trilead/ssh2/crypto/cipher/DES.java [284:372]


	protected void desFunc(int[] wKey, byte[] in, int inOff, byte[] out, int outOff)
	{
		int work, right, left;

		left = (in[inOff + 0] & 0xff) << 24;
		left |= (in[inOff + 1] & 0xff) << 16;
		left |= (in[inOff + 2] & 0xff) << 8;
		left |= (in[inOff + 3] & 0xff);

		right = (in[inOff + 4] & 0xff) << 24;
		right |= (in[inOff + 5] & 0xff) << 16;
		right |= (in[inOff + 6] & 0xff) << 8;
		right |= (in[inOff + 7] & 0xff);

		work = ((left >>> 4) ^ right) & 0x0f0f0f0f;
		right ^= work;
		left ^= (work << 4);
		work = ((left >>> 16) ^ right) & 0x0000ffff;
		right ^= work;
		left ^= (work << 16);
		work = ((right >>> 2) ^ left) & 0x33333333;
		left ^= work;
		right ^= (work << 2);
		work = ((right >>> 8) ^ left) & 0x00ff00ff;
		left ^= work;
		right ^= (work << 8);
		right = ((right << 1) | ((right >>> 31) & 1)) & 0xffffffff;
		work = (left ^ right) & 0xaaaaaaaa;
		left ^= work;
		right ^= work;
		left = ((left << 1) | ((left >>> 31) & 1)) & 0xffffffff;

		for (int round = 0; round < 8; round++)
		{
			int fval;

			work = (right << 28) | (right >>> 4);
			work ^= wKey[round * 4 + 0];
			fval = SP7[work & 0x3f];
			fval |= SP5[(work >>> 8) & 0x3f];
			fval |= SP3[(work >>> 16) & 0x3f];
			fval |= SP1[(work >>> 24) & 0x3f];
			work = right ^ wKey[round * 4 + 1];
			fval |= SP8[work & 0x3f];
			fval |= SP6[(work >>> 8) & 0x3f];
			fval |= SP4[(work >>> 16) & 0x3f];
			fval |= SP2[(work >>> 24) & 0x3f];
			left ^= fval;
			work = (left << 28) | (left >>> 4);
			work ^= wKey[round * 4 + 2];
			fval = SP7[work & 0x3f];
			fval |= SP5[(work >>> 8) & 0x3f];
			fval |= SP3[(work >>> 16) & 0x3f];
			fval |= SP1[(work >>> 24) & 0x3f];
			work = left ^ wKey[round * 4 + 3];
			fval |= SP8[work & 0x3f];
			fval |= SP6[(work >>> 8) & 0x3f];
			fval |= SP4[(work >>> 16) & 0x3f];
			fval |= SP2[(work >>> 24) & 0x3f];
			right ^= fval;
		}

		right = (right << 31) | (right >>> 1);
		work = (left ^ right) & 0xaaaaaaaa;
		left ^= work;
		right ^= work;
		left = (left << 31) | (left >>> 1);
		work = ((left >>> 8) ^ right) & 0x00ff00ff;
		right ^= work;
		left ^= (work << 8);
		work = ((left >>> 2) ^ right) & 0x33333333;
		right ^= work;
		left ^= (work << 2);
		work = ((right >>> 16) ^ left) & 0x0000ffff;
		left ^= work;
		right ^= (work << 16);
		work = ((right >>> 4) ^ left) & 0x0f0f0f0f;
		left ^= work;
		right ^= (work << 4);

		out[outOff + 0] = (byte) ((right >>> 24) & 0xff);
		out[outOff + 1] = (byte) ((right >>> 16) & 0xff);
		out[outOff + 2] = (byte) ((right >>> 8) & 0xff);
		out[outOff + 3] = (byte) (right & 0xff);
		out[outOff + 4] = (byte) ((left >>> 24) & 0xff);
		out[outOff + 5] = (byte) ((left >>> 16) & 0xff);
		out[outOff + 6] = (byte) ((left >>> 8) & 0xff);
		out[outOff + 7] = (byte) (left & 0xff);
	}