summaryrefslogtreecommitdiffstats
path: root/samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs
diff options
context:
space:
mode:
authorAndrew Arnott <andrewarnott@gmail.com>2009-05-31 22:49:16 -0700
committerAndrew Arnott <andrewarnott@gmail.com>2009-05-31 22:49:16 -0700
commit8b55ee651212f5558e57ff502bb2b1eda3748dbf (patch)
treea0cb30edbe135bd1ce91ca498723d523078d3784 /samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs
parente7cb9e9c127da70ec1a54969ae7770c1b7ce43c3 (diff)
downloadDotNetOpenAuth-8b55ee651212f5558e57ff502bb2b1eda3748dbf.zip
DotNetOpenAuth-8b55ee651212f5558e57ff502bb2b1eda3748dbf.tar.gz
DotNetOpenAuth-8b55ee651212f5558e57ff502bb2b1eda3748dbf.tar.bz2
Promoted PPID identifier provider from the application block to the core library.
Diffstat (limited to 'samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs')
-rw-r--r--samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs122
1 files changed, 0 insertions, 122 deletions
diff --git a/samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs b/samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs
deleted file mode 100644
index 1df7267..0000000
--- a/samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-//-----------------------------------------------------------------------
-// <copyright file="AnonymousIdentifierProviderBase.cs" company="Andrew Arnott">
-// Copyright (c) Andrew Arnott. All rights reserved.
-// </copyright>
-//-----------------------------------------------------------------------
-
-namespace DotNetOpenAuth.ApplicationBlock.Provider {
- using System;
- using System.Collections.Generic;
- using System.Diagnostics.CodeAnalysis;
- using System.Linq;
- using System.Security.Cryptography;
- using System.Text;
- using DotNetOpenAuth.Messaging;
- using DotNetOpenAuth.OpenId;
-
- public abstract class AnonymousIdentifierProviderBase {
- private int newSaltLength = 20;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="AnonymousIdentifierProviderBase"/> class.
- /// </summary>
- /// <param name="baseIdentifier">The base URI on which to append the anonymous part.</param>
- public AnonymousIdentifierProviderBase(Uri baseIdentifier) {
- if (baseIdentifier == null) {
- throw new ArgumentNullException("baseIdentifier");
- }
-
- this.Hasher = HashAlgorithm.Create("SHA256");
- this.Encoder = Encoding.UTF8;
- this.BaseIdentifier = baseIdentifier;
- }
-
- public Uri BaseIdentifier { get; private set; }
-
- protected HashAlgorithm Hasher { get; private set; }
-
- protected Encoding Encoder { get; private set; }
-
- protected int NewSaltLength {
- get {
- return this.newSaltLength;
- }
-
- set {
- if (value <= 0) {
- throw new ArgumentOutOfRangeException("value");
- }
-
- this.newSaltLength = value;
- }
- }
-
- #region IAnonymousIdentifierProvider Members
-
- public Uri GetAnonymousIdentifier(Identifier localIdentifier, Realm relyingPartyRealm) {
- byte[] salt = this.GetHashSaltForLocalIdentifier(localIdentifier);
- string valueToHash = localIdentifier + "#" + (relyingPartyRealm ?? string.Empty);
- byte[] valueAsBytes = this.Encoder.GetBytes(valueToHash);
- byte[] bytesToHash = new byte[valueAsBytes.Length + salt.Length];
- valueAsBytes.CopyTo(bytesToHash, 0);
- salt.CopyTo(bytesToHash, valueAsBytes.Length);
- byte[] hash = this.Hasher.ComputeHash(bytesToHash);
- string base64Hash = Convert.ToBase64String(hash);
- Uri anonymousIdentifier = this.AppendIdentifiers(this.BaseIdentifier, base64Hash);
- return anonymousIdentifier;
- }
-
- #endregion
-
- protected virtual byte[] GetNewSalt() {
- // We COULD use a crypto random function, but for a salt it seems overkill.
- return Util.GetNonCryptoRandomData(this.NewSaltLength);
- }
-
- protected Uri AppendIdentifiers(Uri baseIdentifier, string uriHash) {
- if (baseIdentifier == null) {
- throw new ArgumentNullException("baseIdentifier");
- }
- if (String.IsNullOrEmpty(uriHash)) {
- throw new ArgumentNullException("uriHash");
- }
-
- if (string.IsNullOrEmpty(baseIdentifier.Query)) {
- // The uriHash will appear on the path itself.
- string pathEncoded = Uri.EscapeUriString(uriHash.Replace('/', '_'));
- return new Uri(baseIdentifier, pathEncoded);
- } else {
- // The uriHash will appear on the query string.
- string dataEncoded = Uri.EscapeDataString(uriHash);
- return new Uri(baseIdentifier + dataEncoded);
- }
- }
-
- /// <summary>
- /// Gets the salt to use for generating an anonymous identifier for a given OP local identifier.
- /// </summary>
- /// <param name="localIdentifier">The OP local identifier.</param>
- /// <returns>The salt to use in the hash.</returns>
- /// <remarks>
- /// It is important that this method always return the same value for a given
- /// <paramref name="localIdentifier"/>.
- /// New salts can be generated for local identifiers without previously assigned salt
- /// values by calling <see cref="GetNewSalt"/> or by a custom method.
- /// </remarks>
- protected abstract byte[] GetHashSaltForLocalIdentifier(Identifier localIdentifier);
-
-#if CONTRACTS_FULL
- /// <summary>
- /// Verifies conditions that should be true for any valid state of this object.
- /// </summary>
- [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "Called by code contracts.")]
- [ContractInvariantMethod]
- protected void ObjectInvariant() {
- Contract.Invariant(this.Hasher != null);
- Contract.Invariant(this.Encoder != null);
- Contract.Invariant(this.BaseIdentifier != null);
- Contract.Invariant(this.NewHashLength > 0);
- }
-#endif
- }
-}