Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Security / Cryptography / RSAPKCS1KeyExchangeFormatter.cs / 1305376 / RSAPKCS1KeyExchangeFormatter.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// [....]
//
namespace System.Security.Cryptography {
using System.Globalization;
using System.Diagnostics.Contracts;
[System.Runtime.InteropServices.ComVisible(true)]
public class RSAPKCS1KeyExchangeFormatter : AsymmetricKeyExchangeFormatter {
RandomNumberGenerator RngValue;
RSA _rsaKey;
//
// public constructors
//
public RSAPKCS1KeyExchangeFormatter() {}
public RSAPKCS1KeyExchangeFormatter(AsymmetricAlgorithm key) {
if (key == null)
throw new ArgumentNullException("key");
Contract.EndContractBlock();
_rsaKey = (RSA) key;
}
//
// public properties
//
public override String Parameters {
get { return " "; }
}
public RandomNumberGenerator Rng {
get { return RngValue; }
set { RngValue = value; }
}
//
// public methods
//
public override void SetKey(AsymmetricAlgorithm key) {
if (key == null)
throw new ArgumentNullException("key");
Contract.EndContractBlock();
_rsaKey = (RSA) key;
}
[System.Security.SecuritySafeCritical] // auto-generated
public override byte[] CreateKeyExchange(byte[] rgbData) {
if (_rsaKey == null)
throw new CryptographicUnexpectedOperationException(Environment.GetResourceString("Cryptography_MissingKey"));
byte[] rgbKeyEx;
if (_rsaKey is RSACryptoServiceProvider) {
rgbKeyEx = ((RSACryptoServiceProvider) _rsaKey).Encrypt(rgbData, false);
}
else {
int cb = _rsaKey.KeySize/8;
if ((rgbData.Length + 11) > cb)
throw new CryptographicException(Environment.GetResourceString("Cryptography_Padding_EncDataTooBig", cb-11));
byte[] rgbInput = new byte[cb];
//
// We want to pad to the following format:
// 00 || 02 || PS || 00 || D
//
// PS - pseudorandom non zero bytes
// D - data
//
if (RngValue == null) {
RngValue = RandomNumberGenerator.Create();
}
Rng.GetNonZeroBytes(rgbInput);
rgbInput[0] = 0;
rgbInput[1] = 2;
rgbInput[cb-rgbData.Length-1] = 0;
Buffer.InternalBlockCopy(rgbData, 0, rgbInput, cb-rgbData.Length, rgbData.Length);
//
// Now encrypt the value and return it. (apply public key)
//
rgbKeyEx = _rsaKey.EncryptValue(rgbInput);
}
return rgbKeyEx;
}
public override byte[] CreateKeyExchange(byte[] rgbData, Type symAlgType) {
return CreateKeyExchange(rgbData);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// [....]
//
namespace System.Security.Cryptography {
using System.Globalization;
using System.Diagnostics.Contracts;
[System.Runtime.InteropServices.ComVisible(true)]
public class RSAPKCS1KeyExchangeFormatter : AsymmetricKeyExchangeFormatter {
RandomNumberGenerator RngValue;
RSA _rsaKey;
//
// public constructors
//
public RSAPKCS1KeyExchangeFormatter() {}
public RSAPKCS1KeyExchangeFormatter(AsymmetricAlgorithm key) {
if (key == null)
throw new ArgumentNullException("key");
Contract.EndContractBlock();
_rsaKey = (RSA) key;
}
//
// public properties
//
public override String Parameters {
get { return " "; }
}
public RandomNumberGenerator Rng {
get { return RngValue; }
set { RngValue = value; }
}
//
// public methods
//
public override void SetKey(AsymmetricAlgorithm key) {
if (key == null)
throw new ArgumentNullException("key");
Contract.EndContractBlock();
_rsaKey = (RSA) key;
}
[System.Security.SecuritySafeCritical] // auto-generated
public override byte[] CreateKeyExchange(byte[] rgbData) {
if (_rsaKey == null)
throw new CryptographicUnexpectedOperationException(Environment.GetResourceString("Cryptography_MissingKey"));
byte[] rgbKeyEx;
if (_rsaKey is RSACryptoServiceProvider) {
rgbKeyEx = ((RSACryptoServiceProvider) _rsaKey).Encrypt(rgbData, false);
}
else {
int cb = _rsaKey.KeySize/8;
if ((rgbData.Length + 11) > cb)
throw new CryptographicException(Environment.GetResourceString("Cryptography_Padding_EncDataTooBig", cb-11));
byte[] rgbInput = new byte[cb];
//
// We want to pad to the following format:
// 00 || 02 || PS || 00 || D
//
// PS - pseudorandom non zero bytes
// D - data
//
if (RngValue == null) {
RngValue = RandomNumberGenerator.Create();
}
Rng.GetNonZeroBytes(rgbInput);
rgbInput[0] = 0;
rgbInput[1] = 2;
rgbInput[cb-rgbData.Length-1] = 0;
Buffer.InternalBlockCopy(rgbData, 0, rgbInput, cb-rgbData.Length, rgbData.Length);
//
// Now encrypt the value and return it. (apply public key)
//
rgbKeyEx = _rsaKey.EncryptValue(rgbInput);
}
return rgbKeyEx;
}
public override byte[] CreateKeyExchange(byte[] rgbData, Type symAlgType) {
return CreateKeyExchange(rgbData);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Brush.cs
- EventSetter.cs
- EventLogTraceListener.cs
- DbExpressionVisitor.cs
- GroupBoxAutomationPeer.cs
- IndexingContentUnit.cs
- TextTabProperties.cs
- VectorAnimation.cs
- ResourceDictionary.cs
- BaseParser.cs
- ExtensionWindow.cs
- HandlerBase.cs
- Timer.cs
- ClientSponsor.cs
- SHA256.cs
- COM2FontConverter.cs
- EdmType.cs
- SplashScreenNativeMethods.cs
- ControlUtil.cs
- ElementFactory.cs
- CellRelation.cs
- InfocardInteractiveChannelInitializer.cs
- FigureHelper.cs
- StoreItemCollection.Loader.cs
- SourceCollection.cs
- FontDifferentiator.cs
- ConstraintEnumerator.cs
- XmlSerializerSection.cs
- NotificationContext.cs
- PartEditor.cs
- GradientBrush.cs
- XmlExceptionHelper.cs
- XPathDocumentBuilder.cs
- PagerSettings.cs
- TextEditorDragDrop.cs
- RankException.cs
- Buffer.cs
- SetStateEventArgs.cs
- SqlDataSourceConfigureFilterForm.cs
- ConnectionManagementElementCollection.cs
- UrlMappingsSection.cs
- CqlErrorHelper.cs
- Group.cs
- BaseDataBoundControl.cs
- XPathItem.cs
- FileDataSourceCache.cs
- OperationSelectorBehavior.cs
- Point3DValueSerializer.cs
- ZipIOExtraFieldElement.cs
- SettingsProperty.cs
- TextTreeFixupNode.cs
- ByteStorage.cs
- TableHeaderCell.cs
- BooleanToVisibilityConverter.cs
- XmlValueConverter.cs
- FragmentQueryProcessor.cs
- OptimisticConcurrencyException.cs
- CompositeScriptReferenceEventArgs.cs
- XmlMapping.cs
- SignedPkcs7.cs
- MarkupCompiler.cs
- OutputCacheModule.cs
- PropertyReferenceExtension.cs
- WebPartExportVerb.cs
- ParallelEnumerable.cs
- SimpleHandlerFactory.cs
- DetailsViewRowCollection.cs
- XmlWrappingWriter.cs
- TextTreePropertyUndoUnit.cs
- PrivateUnsafeNativeCompoundFileMethods.cs
- XPathNodePointer.cs
- Win32Exception.cs
- MultiTrigger.cs
- BindingEntityInfo.cs
- TrueReadOnlyCollection.cs
- MetafileHeaderWmf.cs
- ModelItemCollectionImpl.cs
- TextServicesManager.cs
- BaseValidator.cs
- AssociativeAggregationOperator.cs
- TargetControlTypeAttribute.cs
- ControlCommandSet.cs
- LoadWorkflowByKeyAsyncResult.cs
- ToolStripSeparatorRenderEventArgs.cs
- Activity.cs
- updateconfighost.cs
- FormatConvertedBitmap.cs
- TrackingSection.cs
- EventWaitHandleSecurity.cs
- QfeChecker.cs
- AppDomainManager.cs
- DetailsViewUpdateEventArgs.cs
- DataTransferEventArgs.cs
- FieldToken.cs
- WebServiceErrorEvent.cs
- WebPartConnectionsCloseVerb.cs
- CollectionEditVerbManager.cs
- CompilationUtil.cs
- VisualTarget.cs
- HtmlTableRow.cs