Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / IdentityModel / System / IdentityModel / Psha1DerivedKeyGenerator.cs / 1305376 / Psha1DerivedKeyGenerator.cs
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------
namespace System.IdentityModel
{
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.ServiceModel.Diagnostics;
sealed class Psha1DerivedKeyGenerator
{
byte[] key;
public Psha1DerivedKeyGenerator(byte[] key)
{
if (key == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("key");
}
this.key = key;
}
public byte[] GenerateDerivedKey(byte[] label, byte[] nonce, int derivedKeySize, int position)
{
if (label == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("label");
}
if (nonce == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("nonce");
}
ManagedPsha1 dkcp = new ManagedPsha1(key, label, nonce);
return dkcp.GetDerivedKey(derivedKeySize, position);
}
// private class to do the real work
// Note: Though named ManagedPsha1, this works for both fips and non-fips compliance
sealed class ManagedPsha1
{
byte[] aValue;
byte[] buffer;
byte[] chunk;
KeyedHashAlgorithm hmac;
int index;
int position;
byte[] secret;
byte[] seed;
// assume arguments are already validated
public ManagedPsha1(byte[] secret, byte[] label, byte[] seed)
{
this.secret = secret;
this.seed = DiagnosticUtility.Utility.AllocateByteArray(checked(label.Length + seed.Length));
label.CopyTo(this.seed, 0);
seed.CopyTo(this.seed, label.Length);
this.aValue = this.seed;
this.chunk = new byte[0];
this.index = 0;
this.position = 0;
this.hmac = CryptoHelper.NewHmacSha1KeyedHashAlgorithm(secret);
this.buffer = DiagnosticUtility.Utility.AllocateByteArray(checked(this.hmac.HashSize / 8 + this.seed.Length));
}
public byte[] GetDerivedKey(int derivedKeySize, int position)
{
if (derivedKeySize < 0)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("derivedKeySize", SR.GetString(SR.ValueMustBeNonNegative)));
}
if (this.position > position)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("position", SR.GetString(SR.ValueMustBeInRange, 0, this.position)));
}
// Seek to the desired position in the pseudo-random stream.
while (this.position < position)
{
GetByte();
}
int sizeInBytes = derivedKeySize / 8;
byte[] derivedKey = new byte[sizeInBytes];
for (int i = 0; i < sizeInBytes; i++)
{
derivedKey[i] = GetByte();
}
return derivedKey;
}
byte GetByte()
{
if (index >= chunk.Length)
{
// Calculate A(i) = HMAC_SHA1(secret, A(i-1)).
hmac.Initialize();
this.aValue = hmac.ComputeHash(this.aValue);
// Calculate P_SHA1(secret, seed)[j] = HMAC_SHA1(secret, A(j+1) || seed).
this.aValue.CopyTo(buffer, 0);
this.seed.CopyTo(buffer, this.aValue.Length);
hmac.Initialize();
this.chunk = hmac.ComputeHash(buffer);
index = 0;
}
position++;
return chunk[index++];
}
}
}
}
// 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
- RoleService.cs
- WebServiceMethodData.cs
- Console.cs
- XmlDocumentFragment.cs
- RawStylusActions.cs
- CustomPopupPlacement.cs
- TargetException.cs
- XmlMapping.cs
- TargetParameterCountException.cs
- FlagPanel.cs
- SchemaImporterExtensionElement.cs
- DiscoveryEndpoint.cs
- IgnoreDeviceFilterElementCollection.cs
- DispatcherHookEventArgs.cs
- TitleStyle.cs
- EnumType.cs
- StringOutput.cs
- SynchronizationLockException.cs
- SemanticResolver.cs
- DataAdapter.cs
- TargetConverter.cs
- UnhandledExceptionEventArgs.cs
- PiiTraceSource.cs
- TextProperties.cs
- ContextStack.cs
- SoapObjectInfo.cs
- TextTreeExtractElementUndoUnit.cs
- CultureInfoConverter.cs
- AssemblyBuilderData.cs
- Control.cs
- ListItemCollection.cs
- TraceSwitch.cs
- XPathPatternParser.cs
- VisualStyleRenderer.cs
- BookmarkWorkItem.cs
- DropDownButton.cs
- HierarchicalDataBoundControlAdapter.cs
- FamilyTypeface.cs
- GroupBox.cs
- SqlParameter.cs
- NumberSubstitution.cs
- IncrementalCompileAnalyzer.cs
- NestPullup.cs
- CharEnumerator.cs
- SqlDataSourceRefreshSchemaForm.cs
- Publisher.cs
- ServiceAuthorizationBehavior.cs
- HtmlInputText.cs
- TablePattern.cs
- SubstitutionList.cs
- FormViewRow.cs
- ListViewCancelEventArgs.cs
- SqlCacheDependencyDatabase.cs
- VirtualDirectoryMapping.cs
- MsmqTransportReceiveParameters.cs
- BaseValidator.cs
- PocoPropertyAccessorStrategy.cs
- XmlArrayAttribute.cs
- GuidConverter.cs
- DbMetaDataFactory.cs
- DiffuseMaterial.cs
- WebPartConnection.cs
- WeakReference.cs
- XsltSettings.cs
- JumpTask.cs
- PassportAuthentication.cs
- XmlSchemaAppInfo.cs
- WasHostedComPlusFactory.cs
- ThreadExceptionEvent.cs
- MessageContractMemberAttribute.cs
- Viewport2DVisual3D.cs
- ParamArrayAttribute.cs
- TaskExtensions.cs
- Span.cs
- SuppressMessageAttribute.cs
- AspCompat.cs
- ButtonFlatAdapter.cs
- ControlCachePolicy.cs
- BindingValueChangedEventArgs.cs
- Pair.cs
- MoveSizeWinEventHandler.cs
- HttpConfigurationSystem.cs
- CriticalExceptions.cs
- SQLGuidStorage.cs
- OleDbPropertySetGuid.cs
- FileCodeGroup.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- BidirectionalDictionary.cs
- MessageQueuePermissionAttribute.cs
- DateTimeFormatInfo.cs
- SecurityElement.cs
- QueuePathDialog.cs
- CodeStatement.cs
- ControlPaint.cs
- HttpClientProtocol.cs
- XmlWrappingReader.cs
- SortDescription.cs
- ProcessThread.cs
- ColumnResizeUndoUnit.cs
- MatrixUtil.cs