培训考核三期,新版培训,网页版培训登录器
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

221 lines
8.7 KiB

#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Collections;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Utilities;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Engines
{
public class Dstu7624WrapEngine
: IWrapper
{
private KeyParameter param;
private Dstu7624Engine engine;
private bool forWrapping;
private int blockSize;
public Dstu7624WrapEngine(int blockSizeBits)
{
engine = new Dstu7624Engine(blockSizeBits);
param = null;
blockSize = blockSizeBits / 8;
}
public string AlgorithmName
{
get { return "Dstu7624WrapEngine"; }
}
public void Init(bool forWrapping, ICipherParameters parameters)
{
this.forWrapping = forWrapping;
if (parameters is KeyParameter)
{
this.param = (KeyParameter)parameters;
engine.Init(forWrapping, param);
}
else
{
throw new ArgumentException("Bad parameters passed to Dstu7624WrapEngine");
}
}
public byte[] Wrap(byte[] input, int inOff, int length)
{
if (!forWrapping)
throw new InvalidOperationException("Not set for wrapping");
if (length % blockSize != 0)
throw new ArgumentException("Padding not supported");
int n = 2 * (1 + length / blockSize);
int V = (n - 1) * 6;
byte[] buffer = new byte[length + blockSize];
Array.Copy(input, inOff, buffer, 0, length);
//Console.WriteLine(BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
byte[] B = new byte[blockSize / 2];
Array.Copy(buffer, 0, B, 0, blockSize / 2);
//Console.WriteLine("B0: "+ BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));
IList bTemp = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
int bHalfBlocksLen = buffer.Length - blockSize / 2;
int bufOff = blockSize / 2;
while (bHalfBlocksLen != 0)
{
byte[] temp = new byte[blockSize / 2];
Array.Copy(buffer, bufOff, temp, 0, blockSize / 2);
//Console.WriteLine(BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
//Console.WriteLine(buffer.Length);
//Console.WriteLine("b: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(temp));
bTemp.Add(temp);
bHalfBlocksLen -= blockSize / 2;
bufOff += blockSize / 2;
}
for (int j = 0; j < V; j++)
{
Array.Copy(B, 0, buffer, 0, blockSize / 2);
Array.Copy((byte[])bTemp[0], 0, buffer, blockSize / 2, blockSize / 2);
engine.ProcessBlock(buffer, 0, buffer, 0);
byte[] intArray = Pack.UInt32_To_LE((uint)(j + 1));
for (int byteNum = 0; byteNum < intArray.Length; byteNum++)
{
buffer[byteNum + blockSize / 2] ^= intArray[byteNum];
}
Array.Copy(buffer, blockSize / 2, B, 0, blockSize / 2);
for (int i = 2; i < n; i++)
{
Array.Copy((byte[])bTemp[i - 1], 0, (byte[])bTemp[i - 2], 0, blockSize / 2);
}
Array.Copy(buffer, 0, (byte[])bTemp[n - 2], 0, blockSize / 2);
//Console.WriteLine("B" + j.ToString() + ": " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));
//Console.WriteLine("b: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[0]));
//Console.WriteLine("b: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[1]));
//Console.WriteLine("b: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[2]));
//Console.WriteLine(BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
}
Array.Copy(B, 0, buffer, 0, blockSize / 2);
bufOff = blockSize / 2;
for (int i = 0; i < n - 1; i++)
{
Array.Copy((byte[])bTemp[i], 0, buffer, bufOff, blockSize / 2);
bufOff += blockSize / 2;
}
return buffer;
}
public byte[] Unwrap(byte[] input, int inOff, int length)
{
if (forWrapping)
throw new InvalidOperationException("not set for unwrapping");
if (length % blockSize != 0)
throw new ArgumentException("Padding not supported");
int n = 2 * length / blockSize;
int V = (n - 1) * 6;
byte[] buffer = new byte[length];
Array.Copy(input, inOff, buffer, 0, length);
byte[] B = new byte[blockSize / 2];
Array.Copy(buffer, 0, B, 0, blockSize / 2);
//Console.WriteLine("B18: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));
IList bTemp = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
int bHalfBlocksLen = buffer.Length - blockSize / 2;
int bufOff = blockSize / 2;
while (bHalfBlocksLen != 0)
{
byte[] temp = new byte[blockSize / 2];
Array.Copy(buffer, bufOff, temp, 0, blockSize / 2);
//Console.WriteLine(BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
//Console.WriteLine(buffer.Length);
//Console.WriteLine("b: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(temp));
bTemp.Add(temp);
bHalfBlocksLen -= blockSize / 2;
bufOff += blockSize / 2;
}
for (int j = 0; j < V; j++)
{
Array.Copy((byte[])bTemp[n - 2], 0, buffer, 0, blockSize / 2);
Array.Copy(B, 0, buffer, blockSize / 2, blockSize / 2);
byte[] intArray = Pack.UInt32_To_LE((uint)(V - j));
for (int byteNum = 0; byteNum < intArray.Length; byteNum++)
{
buffer[byteNum + blockSize / 2] ^= intArray[byteNum];
}
//Console.WriteLine(BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
engine.ProcessBlock(buffer, 0, buffer, 0);
//Console.WriteLine(BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
Array.Copy(buffer, 0, B, 0, blockSize / 2);
for (int i = 2; i < n; i++)
{
Array.Copy((byte[])bTemp[n - i - 1], 0, (byte[])bTemp[n - i], 0, blockSize / 2);
}
Array.Copy(buffer, blockSize / 2, (byte[])bTemp[0], 0, blockSize / 2);
//Console.WriteLine("B" + (V - j - 1).ToString() + ": " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));
//Console.WriteLine("b: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[0]));
//Console.WriteLine("b: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[1]));
//Console.WriteLine("b: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[2]));
//Console.WriteLine(BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
}
Array.Copy(B, 0, buffer, 0, blockSize / 2);
bufOff = blockSize / 2;
for (int i = 0; i < n - 1; i++)
{
Array.Copy((byte[])bTemp[i], 0, buffer, bufOff, blockSize / 2);
bufOff += blockSize / 2;
}
byte diff = 0;
for (int i = buffer.Length - blockSize; i < buffer.Length; ++i)
{
diff |= buffer[i];
}
if (diff != 0)
throw new InvalidCipherTextException("checksum failed");
return Arrays.CopyOfRange(buffer, 0, buffer.Length - blockSize);
}
}
}
#pragma warning restore
#endif