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.
 
 

110 lines
2.5 KiB

namespace com.hitrust.Security.Cryptography
{
using System;
using System.Security.Cryptography;
public abstract class RC4 : SymmetricAlgorithm
{
private RNGCryptoServiceProvider m_RNG;
protected RC4()
{
base.KeySizeValue = 0x80;
}
public new static RC4 Create()
{
return Create("ARCFOUR");
}
public new static RC4 Create(string AlgName)
{
try {
if ((AlgName.ToUpper() == "RC4") || (AlgName.ToLower() == "org.mentalis.security.cryptography.rc4cryptoserviceprovider")) {
return new RC4CryptoServiceProvider();
}
if ((AlgName.ToUpper() == "ARCFOUR") || (AlgName.ToLower() == "org.mentalis.security.cryptography.arcfourmanaged")) {
return new ARCFourManaged();
}
} catch {}
return null;
}
public override void GenerateIV() {}
public override void GenerateKey()
{
byte[] key = new byte[this.KeySize / 8];
this.GetRNGCSP().GetBytes(key);
this.Key = key;
}
protected RNGCryptoServiceProvider GetRNGCSP()
{
if (this.m_RNG == null) {
this.m_RNG = new RNGCryptoServiceProvider();
}
return this.m_RNG;
}
public override int BlockSize
{
get { return 8; }
set
{
if ((value != 8) && (value != 0)) {
throw new CryptographicException("RC4 is a stream cipher, not a block cipher.");
}
}
}
public override int FeedbackSize
{
get { throw new CryptographicException("RC4 doesn't use the feedback size property."); }
set { throw new CryptographicException("RC4 doesn't use the feedback size property."); }
}
public override byte[] IV
{
get { return new byte[1]; }
set
{
if ((value != null) && (value.Length > 1)) {
throw new CryptographicException("RC4 doesn't use an Initialization Vector.");
}
}
}
public override KeySizes[] LegalBlockSizes
{
get { return new KeySizes[] {new KeySizes(8, 8, 0)}; }
}
public override KeySizes[] LegalKeySizes
{
get { return new KeySizes[] {new KeySizes(8, 0x800, 8)}; }
}
public override CipherMode Mode
{
get { return CipherMode.OFB; }
set
{
if (value != CipherMode.OFB) {
throw new CryptographicException("RC4 only supports OFB.");
}
}
}
public override PaddingMode Padding
{
get { return PaddingMode.None; }
set
{
if (value != PaddingMode.None) {
throw new CryptographicException("RC4 is a stream cipher, not a block cipher.");
}
}
}
}
}