Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Security / Cryptography / base64Transforms.cs / 1305376 / base64Transforms.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// [....]
//
//
// Base64Transform.cs
//
// This file contains two ICryptoTransforms: ToBase64Transform and FromBase64Transform
// they may be attached to a CryptoStream in either read or write mode
namespace System.Security.Cryptography {
using System;
using System.IO;
using System.Text;
using System.Diagnostics.Contracts;
#if !SILVERLIGHT
[Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
#endif // !SILVERLIGHT
public enum FromBase64TransformMode {
IgnoreWhiteSpaces = 0,
DoNotIgnoreWhiteSpaces = 1,
}
#if !SILVERLIGHT
[System.Runtime.InteropServices.ComVisible(true)]
public class ToBase64Transform : ICryptoTransform {
// converting to Base64 takes 3 bytes input and generates 4 bytes output
public int InputBlockSize {
get { return(3); }
}
public int OutputBlockSize {
get { return(4); }
}
public bool CanTransformMultipleBlocks {
get { return(false); }
}
public virtual bool CanReuseTransform {
get { return(true); }
}
public int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) {
// Do some validation
if (inputBuffer == null) throw new ArgumentNullException("inputBuffer");
if (inputOffset < 0) throw new ArgumentOutOfRangeException("inputOffset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (inputCount < 0 || (inputCount > inputBuffer.Length)) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidValue"));
if ((inputBuffer.Length - inputCount) < inputOffset) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
Contract.EndContractBlock();
// for now, only convert 3 bytes to 4
char[] temp = new char[4];
Convert.ToBase64CharArray(inputBuffer, inputOffset, 3, temp, 0);
byte[] tempBytes = Encoding.ASCII.GetBytes(temp);
if (tempBytes.Length != 4) throw new CryptographicException(Environment.GetResourceString( "Cryptography_SSE_InvalidDataSize" ));
Buffer.BlockCopy(tempBytes, 0, outputBuffer, outputOffset, tempBytes.Length);
return(tempBytes.Length);
}
public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount) {
// Do some validation
if (inputBuffer == null) throw new ArgumentNullException("inputBuffer");
if (inputOffset < 0) throw new ArgumentOutOfRangeException("inputOffset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (inputCount < 0 || (inputCount > inputBuffer.Length)) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidValue"));
if ((inputBuffer.Length - inputCount) < inputOffset) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
Contract.EndContractBlock();
// Convert.ToBase64CharArray already does padding, so all we have to check is that
// the inputCount wasn't 0
// again, for now only a block at a time
if (inputCount == 0) {
return(new byte[0]);
} else {
char[] temp = new char[4];
Convert.ToBase64CharArray(inputBuffer, inputOffset, inputCount, temp, 0);
byte[] tempBytes = Encoding.ASCII.GetBytes(temp);
return(tempBytes);
}
}
// must implement IDisposable, but in this case there's nothing to do.
public void Dispose() {
Clear();
}
public void Clear() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
}
~ToBase64Transform() {
//
// A finalizer is not necessary here, however since we shipped a finalizer that called
// Dispose(false) in v2.0, we need to keep it around in case any existing code had subclassed
// this transform and expects to have a base class finalizer call its dispose method
//
Dispose(false);
}
}
#endif // !SILVERLIGHT
#if !SILVERLIGHT
[System.Runtime.InteropServices.ComVisible(true)]
#endif // !SILVERLIGHT
public class FromBase64Transform : ICryptoTransform {
private byte[] _inputBuffer = new byte[4];
private int _inputIndex;
private FromBase64TransformMode _whitespaces;
// Constructors
public FromBase64Transform() : this(FromBase64TransformMode.IgnoreWhiteSpaces) {}
public FromBase64Transform(FromBase64TransformMode whitespaces) {
_whitespaces = whitespaces;
_inputIndex = 0;
}
// converting from Base64 generates 3 bytes output from each 4 bytes input block
public int InputBlockSize {
get { return(1); }
}
public int OutputBlockSize {
get { return(3); }
}
public bool CanTransformMultipleBlocks {
get { return(false); }
}
public virtual bool CanReuseTransform {
get { return(true); }
}
[System.Security.SecuritySafeCritical] // auto-generated
public int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) {
// Do some validation
if (inputBuffer == null) throw new ArgumentNullException("inputBuffer");
if (inputOffset < 0) throw new ArgumentOutOfRangeException("inputOffset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (inputCount < 0 || (inputCount > inputBuffer.Length)) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidValue"));
if ((inputBuffer.Length - inputCount) < inputOffset) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
Contract.EndContractBlock();
if (_inputBuffer == null)
throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
byte[] temp = new byte[inputCount];
char[] tempChar;
int effectiveCount;
if (_whitespaces == FromBase64TransformMode.IgnoreWhiteSpaces) {
temp = DiscardWhiteSpaces(inputBuffer, inputOffset, inputCount);
effectiveCount = temp.Length;
} else {
Buffer.InternalBlockCopy(inputBuffer, inputOffset, temp, 0, inputCount);
effectiveCount = inputCount;
}
if (effectiveCount + _inputIndex < 4) {
Buffer.InternalBlockCopy(temp, 0, _inputBuffer, _inputIndex, effectiveCount);
_inputIndex += effectiveCount;
return 0;
}
// Get the number of 4 bytes blocks to transform
int numBlocks = (effectiveCount + _inputIndex) / 4;
byte[] transformBuffer = new byte[_inputIndex + effectiveCount];
Buffer.InternalBlockCopy(_inputBuffer, 0, transformBuffer, 0, _inputIndex);
Buffer.InternalBlockCopy(temp, 0, transformBuffer, _inputIndex, effectiveCount);
_inputIndex = (effectiveCount + _inputIndex) % 4;
Buffer.InternalBlockCopy(temp, effectiveCount - _inputIndex, _inputBuffer, 0, _inputIndex);
#if !SILVERLIGHT
tempChar = Encoding.ASCII.GetChars(transformBuffer, 0, 4*numBlocks);
#else // !SILVERLIGHT
tempChar = Encoding.UTF8.GetChars(transformBuffer, 0, 4 * numBlocks);
#endif // !SILVERLIGHT
byte[] tempBytes = Convert.FromBase64CharArray(tempChar, 0, 4*numBlocks);
Buffer.BlockCopy(tempBytes, 0, outputBuffer, outputOffset, tempBytes.Length);
return(tempBytes.Length);
}
[System.Security.SecuritySafeCritical] // auto-generated
public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount) {
// Do some validation
if (inputBuffer == null) throw new ArgumentNullException("inputBuffer");
if (inputOffset < 0) throw new ArgumentOutOfRangeException("inputOffset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (inputCount < 0 || (inputCount > inputBuffer.Length)) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidValue"));
if ((inputBuffer.Length - inputCount) < inputOffset) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
Contract.EndContractBlock();
if (_inputBuffer == null)
throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
byte[] temp = new byte[inputCount];
char[] tempChar;
int effectiveCount;
if (_whitespaces == FromBase64TransformMode.IgnoreWhiteSpaces) {
temp = DiscardWhiteSpaces(inputBuffer, inputOffset, inputCount);
effectiveCount = temp.Length;
} else {
Buffer.InternalBlockCopy(inputBuffer, inputOffset, temp, 0, inputCount);
effectiveCount = inputCount;
}
if (effectiveCount + _inputIndex < 4) {
Reset();
return (new byte[0]);
}
// Get the number of 4 bytes blocks to transform
int numBlocks = (effectiveCount + _inputIndex) / 4;
byte[] transformBuffer = new byte[_inputIndex + effectiveCount];
Buffer.InternalBlockCopy(_inputBuffer, 0, transformBuffer, 0, _inputIndex);
Buffer.InternalBlockCopy(temp, 0, transformBuffer, _inputIndex, effectiveCount);
_inputIndex = (effectiveCount + _inputIndex) % 4;
Buffer.InternalBlockCopy(temp, effectiveCount - _inputIndex, _inputBuffer, 0, _inputIndex);
#if !SILVERLIGHT
tempChar = Encoding.ASCII.GetChars(transformBuffer, 0, 4*numBlocks);
#else // !SILVERLIGHT
tempChar = Encoding.UTF8.GetChars(transformBuffer, 0, 4 * numBlocks);
#endif // !SILVERLIGHT
byte[] tempBytes = Convert.FromBase64CharArray(tempChar, 0, 4*numBlocks);
// reinitialize the transform
Reset();
return(tempBytes);
}
private byte[] DiscardWhiteSpaces(byte[] inputBuffer, int inputOffset, int inputCount) {
int i, iCount = 0;
for (i=0; i
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- AnnouncementInnerClient11.cs
- WindowsClaimSet.cs
- Rights.cs
- PageAsyncTask.cs
- HtmlInputReset.cs
- Rule.cs
- HtmlContainerControl.cs
- PropertyEmitter.cs
- EntityConnection.cs
- ClientBuildManagerCallback.cs
- TextAdaptor.cs
- XmlWriterTraceListener.cs
- DefaultBinder.cs
- WebPartConnectionsConnectVerb.cs
- RouteItem.cs
- GridViewColumnHeaderAutomationPeer.cs
- XsdCachingReader.cs
- util.cs
- Properties.cs
- ProcessHostServerConfig.cs
- PageBuildProvider.cs
- PropertyManager.cs
- XmlPropertyBag.cs
- ServerIdentity.cs
- XmlDataSourceView.cs
- CodeArgumentReferenceExpression.cs
- MsmqEncryptionAlgorithm.cs
- DrawingVisualDrawingContext.cs
- DbProviderFactories.cs
- NumericUpDownAcceleration.cs
- InstanceDataCollection.cs
- FileSystemEventArgs.cs
- SqlConnectionStringBuilder.cs
- AutomationElementIdentifiers.cs
- Component.cs
- GridView.cs
- TextChange.cs
- _IPv6Address.cs
- propertytag.cs
- RulePatternOps.cs
- DependencyProperty.cs
- HyperlinkAutomationPeer.cs
- QueryComponents.cs
- BrowserCapabilitiesCodeGenerator.cs
- SymLanguageVendor.cs
- ConfigurationStrings.cs
- WinCategoryAttribute.cs
- SqlClientWrapperSmiStreamChars.cs
- DataSysAttribute.cs
- CompilationAssemblyInstallComponent.cs
- DataViewManagerListItemTypeDescriptor.cs
- DesignOnlyAttribute.cs
- MemberCollection.cs
- ObjectViewEntityCollectionData.cs
- RotationValidation.cs
- MenuCommandService.cs
- MailBnfHelper.cs
- ClientSponsor.cs
- RootBrowserWindow.cs
- TargetInvocationException.cs
- DispatchOperation.cs
- CorrelationInitializer.cs
- DataListItem.cs
- Point3DIndependentAnimationStorage.cs
- SpnegoTokenProvider.cs
- BaseComponentEditor.cs
- ImageMapEventArgs.cs
- HandleExceptionArgs.cs
- DataProtection.cs
- MetadataWorkspace.cs
- securitymgrsite.cs
- ScriptDescriptor.cs
- EdmEntityTypeAttribute.cs
- WorkItem.cs
- EntityContainerRelationshipSet.cs
- RegistryConfigurationProvider.cs
- EnumConverter.cs
- PropertyGrid.cs
- AuditLog.cs
- TripleDESCryptoServiceProvider.cs
- IndexedWhereQueryOperator.cs
- XmlSchemaComplexContentRestriction.cs
- Int32Converter.cs
- AmbientEnvironment.cs
- TimeSpanSecondsOrInfiniteConverter.cs
- ColumnWidthChangingEvent.cs
- ExtendLockAsyncResult.cs
- ThemeDictionaryExtension.cs
- ObjectAnimationBase.cs
- Boolean.cs
- SafeFileMappingHandle.cs
- Win32NamedPipes.cs
- WebPartHelpVerb.cs
- DataControlImageButton.cs
- ResourcesBuildProvider.cs
- ValidatingReaderNodeData.cs
- processwaithandle.cs
- XamlGridLengthSerializer.cs
- OdbcErrorCollection.cs
- EventMappingSettingsCollection.cs