//-----------------------------------------------------------------------
//
// Copyright (c) Outercurve Foundation. All rights reserved.
//
//-----------------------------------------------------------------------
namespace DotNetOpenAuth.OpenId.Messages {
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.Messaging.Reflection;
using Org.Mentalis.Security.Cryptography;
///
/// An OpenID direct request from Relying Party to Provider to initiate an association that uses Diffie-Hellman encryption.
///
internal class AssociateDiffieHellmanRequest : AssociateRequest {
///
/// The (only) value we use for the X variable in the Diffie-Hellman algorithm.
///
internal static readonly int DefaultX = 1024;
///
/// The default gen value for the Diffie-Hellman algorithm.
///
internal static readonly byte[] DefaultGen = { 2 };
///
/// The default modulus value for the Diffie-Hellman algorithm.
///
internal static readonly byte[] DefaultMod = {
0, 220, 249, 58, 11, 136, 57, 114, 236, 14, 25, 152, 154, 197, 162,
206, 49, 14, 29, 55, 113, 126, 141, 149, 113, 187, 118, 35, 115, 24,
102, 230, 30, 247, 90, 46, 39, 137, 139, 5, 127, 152, 145, 194, 226,
122, 99, 156, 63, 41, 182, 8, 20, 88, 28, 211, 178, 202, 57, 134, 210,
104, 55, 5, 87, 125, 69, 194, 231, 229, 45, 200, 28, 122, 23, 24, 118,
229, 206, 167, 75, 20, 72, 191, 223, 175, 24, 130, 142, 253, 37, 25,
241, 78, 69, 227, 130, 102, 52, 175, 25, 73, 229, 181, 53, 204, 130,
154, 72, 59, 138, 118, 34, 62, 93, 73, 10, 37, 127, 5, 189, 255, 22,
242, 251, 34, 197, 131, 171 };
///
/// Initializes a new instance of the class.
///
/// The OpenID version this message must comply with.
/// The OpenID Provider endpoint.
internal AssociateDiffieHellmanRequest(Version version, Uri providerEndpoint)
: base(version, providerEndpoint) {
this.DiffieHellmanModulus = DefaultMod;
this.DiffieHellmanGen = DefaultGen;
}
///
/// Gets or sets the openid.dh_modulus value.
///
/// May be null if the default value given in the OpenID spec is to be used.
[MessagePart("openid.dh_modulus", IsRequired = false, AllowEmpty = false)]
internal byte[] DiffieHellmanModulus { get; set; }
///
/// Gets or sets the openid.dh_gen value.
///
/// May be null if the default value given in the OpenID spec is to be used.
[MessagePart("openid.dh_gen", IsRequired = false, AllowEmpty = false)]
internal byte[] DiffieHellmanGen { get; set; }
///
/// Gets or sets the openid.dh_consumer_public value.
///
///
/// This property is initialized with a call to .
///
[MessagePart("openid.dh_consumer_public", IsRequired = true, AllowEmpty = false)]
internal byte[] DiffieHellmanConsumerPublic { get; set; }
///
/// Gets the Diffie-Hellman algorithm.
///
///
/// This property is initialized with a call to .
///
internal DiffieHellman Algorithm { get; private set; }
///
/// Called by the Relying Party to initialize the Diffie-Hellman algorithm and consumer public key properties.
///
internal void InitializeRequest() {
if (this.DiffieHellmanModulus == null || this.DiffieHellmanGen == null) {
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, OpenIdStrings.DiffieHellmanRequiredPropertiesNotSet, string.Join(", ", new string[] { "DiffieHellmanModulus", "DiffieHellmanGen" })));
}
this.Algorithm = new DiffieHellmanManaged(this.DiffieHellmanModulus ?? DefaultMod, this.DiffieHellmanGen ?? DefaultGen, DefaultX);
byte[] consumerPublicKeyExchange = this.Algorithm.CreateKeyExchange();
this.DiffieHellmanConsumerPublic = DiffieHellmanUtilities.EnsurePositive(consumerPublicKeyExchange);
}
}
}