Files
SuperVPN/output/Libraries/BouncyCastle.Crypto/Org/BouncyCastle/Crypto/Parameters/SkeinParameters.cs
2025-10-09 09:57:24 +09:00

226 lines
4.1 KiB
C#

using System;
using System.Collections;
using System.Globalization;
using System.IO;
using System.Text;
using Org.BouncyCastle.Utilities;
namespace Org.BouncyCastle.Crypto.Parameters;
public class SkeinParameters : ICipherParameters
{
public class Builder
{
private IDictionary parameters = Platform.CreateHashtable();
public Builder()
{
}
public Builder(IDictionary paramsMap)
{
IEnumerator enumerator = paramsMap.Keys.GetEnumerator();
while (enumerator.MoveNext())
{
int num = (int)enumerator.Current;
parameters.Add(num, paramsMap[num]);
}
}
public Builder(SkeinParameters parameters)
{
IEnumerator enumerator = parameters.parameters.Keys.GetEnumerator();
while (enumerator.MoveNext())
{
int num = (int)enumerator.Current;
this.parameters.Add(num, parameters.parameters[num]);
}
}
public Builder Set(int type, byte[] value)
{
if (value == null)
{
throw new ArgumentException("Parameter value must not be null.");
}
switch (type)
{
default:
throw new ArgumentException("Parameter types must be in the range 0,5..47,49..62.");
case 0:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:
case 58:
case 59:
case 60:
case 61:
case 62:
if (type == 4)
{
throw new ArgumentException("Parameter type " + 4 + " is reserved for internal use.");
}
parameters.Add(type, value);
return this;
}
}
public Builder SetKey(byte[] key)
{
return Set(0, key);
}
public Builder SetPersonalisation(byte[] personalisation)
{
return Set(8, personalisation);
}
public Builder SetPersonalisation(DateTime date, string emailAddress, string distinguisher)
{
try
{
MemoryStream memoryStream = new MemoryStream();
StreamWriter streamWriter = new StreamWriter(memoryStream, Encoding.UTF8);
streamWriter.Write(date.ToString("YYYYMMDD", CultureInfo.InvariantCulture));
streamWriter.Write(" ");
streamWriter.Write(emailAddress);
streamWriter.Write(" ");
streamWriter.Write(distinguisher);
Platform.Dispose(streamWriter);
return Set(8, memoryStream.ToArray());
}
catch (IOException innerException)
{
throw new InvalidOperationException("Byte I/O failed.", innerException);
}
}
public Builder SetPublicKey(byte[] publicKey)
{
return Set(12, publicKey);
}
public Builder SetKeyIdentifier(byte[] keyIdentifier)
{
return Set(16, keyIdentifier);
}
public Builder SetNonce(byte[] nonce)
{
return Set(20, nonce);
}
public SkeinParameters Build()
{
return new SkeinParameters(parameters);
}
}
public const int PARAM_TYPE_KEY = 0;
public const int PARAM_TYPE_CONFIG = 4;
public const int PARAM_TYPE_PERSONALISATION = 8;
public const int PARAM_TYPE_PUBLIC_KEY = 12;
public const int PARAM_TYPE_KEY_IDENTIFIER = 16;
public const int PARAM_TYPE_NONCE = 20;
public const int PARAM_TYPE_MESSAGE = 48;
public const int PARAM_TYPE_OUTPUT = 63;
private IDictionary parameters;
public SkeinParameters()
: this(Platform.CreateHashtable())
{
}
private SkeinParameters(IDictionary parameters)
{
this.parameters = parameters;
}
public IDictionary GetParameters()
{
return parameters;
}
public byte[] GetKey()
{
return (byte[])parameters[0];
}
public byte[] GetPersonalisation()
{
return (byte[])parameters[8];
}
public byte[] GetPublicKey()
{
return (byte[])parameters[12];
}
public byte[] GetKeyIdentifier()
{
return (byte[])parameters[16];
}
public byte[] GetNonce()
{
return (byte[])parameters[20];
}
}