Skip to content

Commit be823a1

Browse files
authored
Support raw ECDH key agreements
1 parent de48b5a commit be823a1

20 files changed

+219
-2
lines changed

src/libraries/Common/src/Interop/Windows/BCrypt/Cng.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ internal static class KeyDerivationFunction
4545
public const string Hash = "HASH"; // BCRYPT_KDF_HASH
4646
public const string Hmac = "HMAC"; // BCRYPT_KDF_HMAC
4747
public const string Tls = "TLS_PRF"; // BCRYPT_KDF_TLS_PRF
48+
public const string Raw = "TRUNCATE"; // BCRYPT_KDF_RAW_SECRET
4849
}
4950
}
5051

src/libraries/Common/src/Interop/Windows/NCrypt/Interop.NCryptDeriveKeyMaterial.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,5 +241,25 @@ internal static unsafe byte[] DeriveKeyMaterialTls(
241241
flags);
242242
}
243243
}
244+
245+
internal static unsafe byte[] DeriveKeyMaterialTruncate(
246+
SafeNCryptSecretHandle secretAgreement,
247+
SecretAgreementFlags flags)
248+
{
249+
if (!OperatingSystem.IsWindowsVersionAtLeast(10))
250+
{
251+
throw new PlatformNotSupportedException();
252+
}
253+
254+
byte[] result = DeriveKeyMaterial(
255+
secretAgreement,
256+
BCryptNative.KeyDerivationFunction.Raw,
257+
ReadOnlySpan<NCryptBuffer>.Empty,
258+
flags);
259+
260+
// Win32 returns the result as little endian. So we need to flip it to big endian.
261+
Array.Reverse(result);
262+
return result;
263+
}
244264
}
245265
}

src/libraries/Common/src/System/Security/Cryptography/ECDiffieHellmanAndroid.Derive.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,16 @@ public override byte[] DeriveKeyTls(ECDiffieHellmanPublicKey otherPartyPublicKey
7272
DeriveSecretAgreement);
7373
}
7474

75+
public override byte[] DeriveRawSecretAgreement(ECDiffieHellmanPublicKey otherPartyPublicKey)
76+
{
77+
ArgumentNullException.ThrowIfNull(otherPartyPublicKey);
78+
ThrowIfDisposed();
79+
80+
byte[]? secretAgreement = DeriveSecretAgreement(otherPartyPublicKey, hasher: null);
81+
Debug.Assert(secretAgreement is not null);
82+
return secretAgreement;
83+
}
84+
7585
/// <summary>
7686
/// Get the secret agreement generated between two parties
7787
/// </summary>

src/libraries/Common/src/System/Security/Cryptography/ECDiffieHellmanCng.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,5 +130,18 @@ public override byte[] DeriveKeyTls(ECDiffieHellmanPublicKey otherPartyPublicKey
130130
Interop.NCrypt.SecretAgreementFlags.None);
131131
}
132132
}
133+
134+
/// <inheritdoc />
135+
public override byte[] DeriveRawSecretAgreement(ECDiffieHellmanPublicKey otherPartyPublicKey)
136+
{
137+
ArgumentNullException.ThrowIfNull(otherPartyPublicKey);
138+
139+
using (SafeNCryptSecretHandle secretAgreement = DeriveSecretAgreementHandle(otherPartyPublicKey))
140+
{
141+
return Interop.NCrypt.DeriveKeyMaterialTruncate(
142+
secretAgreement,
143+
Interop.NCrypt.SecretAgreementFlags.None);
144+
}
145+
}
133146
}
134147
}

src/libraries/Common/src/System/Security/Cryptography/ECDiffieHellmanOpenSsl.Derive.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,17 @@ public override byte[] DeriveKeyTls(ECDiffieHellmanPublicKey otherPartyPublicKey
6969
DeriveSecretAgreement);
7070
}
7171

72+
/// <inheritdoc />
73+
public override byte[] DeriveRawSecretAgreement(ECDiffieHellmanPublicKey otherPartyPublicKey)
74+
{
75+
ArgumentNullException.ThrowIfNull(otherPartyPublicKey);
76+
ThrowIfDisposed();
77+
78+
byte[]? secretAgreement = DeriveSecretAgreement(otherPartyPublicKey, hasher: null);
79+
Debug.Assert(secretAgreement is not null);
80+
return secretAgreement;
81+
}
82+
7283
/// <summary>
7384
/// Get the secret agreement generated between two parties
7485
/// </summary>

src/libraries/Common/src/System/Security/Cryptography/ECDiffieHellmanSecurityTransforms.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,16 @@ public override byte[] DeriveKeyTls(ECDiffieHellmanPublicKey otherPartyPublicKey
165165
DeriveSecretAgreement);
166166
}
167167

168+
public override byte[] DeriveRawSecretAgreement(ECDiffieHellmanPublicKey otherPartyPublicKey)
169+
{
170+
ArgumentNullException.ThrowIfNull(otherPartyPublicKey);
171+
ThrowIfDisposed();
172+
173+
byte[]? secretAgreement = DeriveSecretAgreement(otherPartyPublicKey, hasher: null);
174+
Debug.Assert(secretAgreement is not null);
175+
return secretAgreement;
176+
}
177+
168178
private byte[]? DeriveSecretAgreement(ECDiffieHellmanPublicKey otherPartyPublicKey, IncrementalHash? hasher)
169179
{
170180
if (!(otherPartyPublicKey is ECDiffieHellmanSecurityTransformsPublicKey secTransPubKey))

src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/ECDiffieHellman/ECDiffieHellmanFactory.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public interface IECDiffieHellmanProvider
1313
bool IsCurveValid(Oid oid);
1414
bool ExplicitCurvesSupported { get; }
1515
bool CanDeriveNewPublicKey { get; }
16+
bool SupportsRawDerivation { get; }
1617
}
1718

1819
public static partial class ECDiffieHellmanFactory
@@ -42,5 +43,7 @@ public static bool IsCurveValid(Oid oid)
4243
public static bool ExplicitCurvesSupported => s_provider.ExplicitCurvesSupported;
4344

4445
public static bool CanDeriveNewPublicKey => s_provider.CanDeriveNewPublicKey;
46+
47+
public static bool SupportsRawDerivation => s_provider.SupportsRawDerivation;
4548
}
4649
}

src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/ECDiffieHellman/ECDiffieHellmanTests.NistValidation.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,19 @@ private static void Verify(
223223
HashAlgorithmName zHashAlgorithm,
224224
byte[] iutZ)
225225
{
226-
byte[] result = iut.DeriveKeyFromHash(cavsPublic, zHashAlgorithm);
226+
byte[] deriveHash = iut.DeriveKeyFromHash(cavsPublic, zHashAlgorithm);
227227
byte[] hashedZ = zHasher.ComputeHash(iutZ);
228-
Assert.Equal(hashedZ.ByteArrayToHex(), result.ByteArrayToHex());
228+
Assert.Equal(hashedZ.ByteArrayToHex(), deriveHash.ByteArrayToHex());
229+
230+
if (ECDiffieHellmanFactory.SupportsRawDerivation)
231+
{
232+
byte[] rawDerived = iut.DeriveRawSecretAgreement(cavsPublic);
233+
Assert.Equal(iutZ.ByteArrayToHex(), rawDerived.ByteArrayToHex());
234+
}
235+
else
236+
{
237+
Assert.Throws<PlatformNotSupportedException>(() => iut.DeriveRawSecretAgreement(cavsPublic));
238+
}
229239
}
230240
}
231241
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System;
5+
using System.Security.Cryptography;
6+
using Xunit;
7+
8+
namespace System.Security.Cryptography.EcDiffieHellman.Tests
9+
{
10+
public partial class ECDiffieHellmanTests
11+
{
12+
public static bool DoesNotSupportRawDerivation => !ECDiffieHellmanFactory.SupportsRawDerivation;
13+
14+
[ConditionalFact(typeof(ECDiffieHellmanFactory), nameof(ECDiffieHellmanFactory.SupportsRawDerivation))]
15+
public static void RawDerivation_OtherKeyRequired()
16+
{
17+
using (ECDiffieHellman ecdh = ECDiffieHellmanFactory.Create())
18+
{
19+
AssertExtensions.Throws<ArgumentNullException>(
20+
"otherPartyPublicKey",
21+
() => ecdh.DeriveRawSecretAgreement(null));
22+
}
23+
}
24+
25+
[ConditionalTheory(typeof(ECDiffieHellmanFactory), nameof(ECDiffieHellmanFactory.SupportsRawDerivation))]
26+
[MemberData(nameof(MismatchedKeysizes))]
27+
public static void RawDerivation_SameSizeOtherKeyRequired(int aliceSize, int bobSize)
28+
{
29+
using (ECDiffieHellman alice = ECDiffieHellmanFactory.Create(aliceSize))
30+
using (ECDiffieHellman bob = ECDiffieHellmanFactory.Create(bobSize))
31+
using (ECDiffieHellmanPublicKey bobPublic = bob.PublicKey)
32+
{
33+
AssertExtensions.Throws<ArgumentException>(
34+
"otherPartyPublicKey",
35+
() => alice.DeriveRawSecretAgreement(bobPublic));
36+
}
37+
}
38+
39+
[ConditionalTheory(typeof(ECDiffieHellmanFactory), nameof(ECDiffieHellmanFactory.SupportsRawDerivation))]
40+
[MemberData(nameof(EveryKeysize))]
41+
public static void RawDerivation_DeriveSharedSecret_Agree(int keySize)
42+
{
43+
using (ECDiffieHellman alice = ECDiffieHellmanFactory.Create(keySize))
44+
using (ECDiffieHellman bob = ECDiffieHellmanFactory.Create(keySize))
45+
using (ECDiffieHellmanPublicKey alicePublic = alice.PublicKey)
46+
using (ECDiffieHellmanPublicKey bobPublic = bob.PublicKey)
47+
{
48+
byte[] aliceDerived = alice.DeriveRawSecretAgreement(bobPublic);
49+
byte[] bobDerived = bob.DeriveRawSecretAgreement(alicePublic);
50+
Assert.Equal(aliceDerived, bobDerived);
51+
}
52+
}
53+
54+
[ConditionalFact(typeof(ECDiffieHellmanFactory), nameof(ECDiffieHellmanFactory.SupportsRawDerivation))]
55+
public static void RawDerivation_DeriveSharedSecret_Disagree()
56+
{
57+
using (ECDiffieHellman alice = ECDiffieHellmanFactory.Create(ECCurve.NamedCurves.nistP256))
58+
using (ECDiffieHellman bob = ECDiffieHellmanFactory.Create(ECCurve.NamedCurves.nistP256))
59+
using (ECDiffieHellman eve = ECDiffieHellmanFactory.Create(ECCurve.NamedCurves.nistP256))
60+
using (ECDiffieHellmanPublicKey bobPublic = bob.PublicKey)
61+
using (ECDiffieHellmanPublicKey evePublic = eve.PublicKey)
62+
{
63+
byte[] aliceDerived = alice.DeriveRawSecretAgreement(bobPublic);
64+
byte[] eveDerived = alice.DeriveRawSecretAgreement(evePublic);
65+
66+
Assert.NotEqual(aliceDerived, eveDerived);
67+
}
68+
}
69+
70+
[ConditionalFact(typeof(ECDiffieHellmanFactory), nameof(ECDiffieHellmanFactory.SupportsRawDerivation))]
71+
public static void RawDerivation_DeriveIsStable()
72+
{
73+
using (ECDiffieHellman alice = ECDiffieHellmanFactory.Create(ECCurve.NamedCurves.nistP256))
74+
using (ECDiffieHellman bob = ECDiffieHellmanFactory.Create(ECCurve.NamedCurves.nistP256))
75+
using (ECDiffieHellmanPublicKey bobPublic = bob.PublicKey)
76+
{
77+
byte[] aliceDerived1 = alice.DeriveRawSecretAgreement(bobPublic);
78+
byte[] aliceDerived2 = alice.DeriveRawSecretAgreement(bobPublic);
79+
Assert.Equal(aliceDerived1, aliceDerived2);
80+
}
81+
}
82+
83+
[ConditionalFact(nameof(DoesNotSupportRawDerivation))]
84+
public static void RawDerivation_NotSupported()
85+
{
86+
using (ECDiffieHellman alice = ECDiffieHellmanFactory.Create(ECCurve.NamedCurves.nistP256))
87+
using (ECDiffieHellman bob = ECDiffieHellmanFactory.Create(ECCurve.NamedCurves.nistP256))
88+
using (ECDiffieHellmanPublicKey bobPublic = bob.PublicKey)
89+
{
90+
Assert.Throws<PlatformNotSupportedException>(() => alice.DeriveRawSecretAgreement(bobPublic));
91+
}
92+
}
93+
}
94+
}

src/libraries/System.Security.Cryptography.Cng/tests/ECDiffieHellmanCngProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public bool ExplicitCurvesSupported
3535
}
3636

3737
public bool CanDeriveNewPublicKey => true;
38+
public bool SupportsRawDerivation => PlatformDetection.IsWindows10OrLater;
3839

3940
private static bool NativeOidFriendlyNameExists(string oidFriendlyName)
4041
{

src/libraries/System.Security.Cryptography.Cng/tests/System.Security.Cryptography.Cng.Tests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@
176176
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.ImportExport.cs" />
177177
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.NistValidation.cs"
178178
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.NistValidation.cs" />
179+
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Raw.cs"
180+
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Raw.cs" />
179181
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Tls.cs"
180182
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Tls.cs" />
181183
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Xml.cs"

src/libraries/System.Security.Cryptography.OpenSsl/tests/EcDiffieHellmanOpenSslProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public ECDiffieHellman Create(ECCurve curve)
2727
public bool ExplicitCurvesSupported => _ecdsaProvider.ExplicitCurvesSupported;
2828

2929
public bool CanDeriveNewPublicKey => true;
30+
public bool SupportsRawDerivation => true;
3031
}
3132

3233
public partial class ECDiffieHellmanFactory

src/libraries/System.Security.Cryptography.OpenSsl/tests/System.Security.Cryptography.OpenSsl.Tests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.ImportExport.cs" />
3838
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.NistValidation.cs"
3939
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.NistValidation.cs" />
40+
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Raw.cs"
41+
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Raw.cs" />
4042
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Tls.cs"
4143
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Tls.cs" />
4244
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Xml.cs"

src/libraries/System.Security.Cryptography/ref/System.Security.Cryptography.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,7 @@ protected ECDiffieHellman() { }
969969
public virtual byte[] DeriveKeyFromHmac(System.Security.Cryptography.ECDiffieHellmanPublicKey otherPartyPublicKey, System.Security.Cryptography.HashAlgorithmName hashAlgorithm, byte[]? hmacKey, byte[]? secretPrepend, byte[]? secretAppend) { throw null; }
970970
public virtual byte[] DeriveKeyMaterial(System.Security.Cryptography.ECDiffieHellmanPublicKey otherPartyPublicKey) { throw null; }
971971
public virtual byte[] DeriveKeyTls(System.Security.Cryptography.ECDiffieHellmanPublicKey otherPartyPublicKey, byte[] prfLabel, byte[] prfSeed) { throw null; }
972+
public virtual byte[] DeriveRawSecretAgreement(System.Security.Cryptography.ECDiffieHellmanPublicKey otherPartyPublicKey) { throw null; }
972973
public override void FromXmlString(string xmlString) { }
973974
public override string ToXmlString(bool includePrivateParameters) { throw null; }
974975
}

src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/ECDiffieHellman.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,35 @@ public virtual byte[] DeriveKeyTls(ECDiffieHellmanPublicKey otherPartyPublicKey,
133133
throw DerivedClassMustOverride();
134134
}
135135

136+
/// <summary>
137+
/// Derive raw key material.
138+
/// </summary>
139+
/// <param name="otherPartyPublicKey">The public key of the party with which to derive a mutual secret.</param>
140+
/// <returns>The raw key agreement.</returns>
141+
/// <remarks>
142+
/// Care must be taking when using the raw derived secret agreement value. The raw value is expected to be used
143+
/// as input in to a Key Derivation Function, and not used directly as key material.
144+
/// </remarks>
145+
/// <exception cref="ArgumentNullException">
146+
/// <paramref name="otherPartyPublicKey"/> is <see langword="null" />.
147+
/// </exception>
148+
/// <exception cref="ArgumentException">
149+
/// <paramref name="otherPartyPublicKey"/> is over a different curve than this key.
150+
/// </exception>
151+
/// <exception cref="NotImplementedException">
152+
/// A derived implementation has not provided an implementation of the method.
153+
/// </exception>
154+
/// <exception cref="PlatformNotSupportedException">
155+
/// The current platform does not support raw key agreement.
156+
/// </exception>
157+
/// <exception cref="ObjectDisposedException">
158+
/// The object has already been disposed.
159+
/// </exception>
160+
public virtual byte[] DeriveRawSecretAgreement(ECDiffieHellmanPublicKey otherPartyPublicKey)
161+
{
162+
throw DerivedClassMustOverride();
163+
}
164+
136165
private static NotImplementedException DerivedClassMustOverride()
137166
{
138167
return new NotImplementedException(SR.NotSupported_SubclassOverride);

src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/ECDiffieHellmanWrapper.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ public override byte[] DeriveKeyFromHmac(
4343
public override byte[] DeriveKeyTls(ECDiffieHellmanPublicKey otherPartyPublicKey, byte[] prfLabel, byte[] prfSeed) =>
4444
_wrapped.DeriveKeyTls(Unwrap(otherPartyPublicKey), prfLabel, prfSeed);
4545

46+
public override byte[] DeriveRawSecretAgreement(ECDiffieHellmanPublicKey otherPartyPublicKey) =>
47+
_wrapped.DeriveRawSecretAgreement(Unwrap(otherPartyPublicKey));
48+
4649
public override void FromXmlString(string xmlString) => _wrapped.FromXmlString(xmlString);
4750

4851
public override string ToXmlString(bool includePrivateParameters) =>

src/libraries/System.Security.Cryptography/tests/DefaultECDiffieHellmanProvider.Android.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public bool IsCurveValid(Oid oid)
2121

2222
public bool CanDeriveNewPublicKey => false;
2323

24+
public bool SupportsRawDerivation => true;
25+
2426
private static bool IsValueOrFriendlyNameValid(string friendlyNameOrValue)
2527
{
2628
if (string.IsNullOrEmpty(friendlyNameOrValue))

src/libraries/System.Security.Cryptography/tests/DefaultECDiffieHellmanProvider.Unix.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public bool ExplicitCurvesSupported
3535
}
3636

3737
public bool CanDeriveNewPublicKey { get; } = !PlatformDetection.IsiOS && !PlatformDetection.IstvOS && !PlatformDetection.IsMacCatalyst;
38+
public bool SupportsRawDerivation => true;
3839

3940
private static bool IsValueOrFriendlyNameValid(string friendlyNameOrValue)
4041
{

src/libraries/System.Security.Cryptography/tests/DefaultECDiffieHellmanProvider.Windows.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public bool ExplicitCurvesSupported
2323
}
2424

2525
public bool CanDeriveNewPublicKey => true;
26+
public bool SupportsRawDerivation => PlatformDetection.IsWindows10OrLater;
2627

2728
private static bool NativeOidFriendlyNameExists(string oidFriendlyName)
2829
{

src/libraries/System.Security.Cryptography/tests/System.Security.Cryptography.Tests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@
127127
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.ImportExport.cs" />
128128
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.NistValidation.cs"
129129
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.NistValidation.cs" />
130+
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Raw.cs"
131+
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Raw.cs" />
130132
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Tls.cs"
131133
Link="CommonTest\System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Tls.cs" />
132134
<Compile Include="$(CommonTestPath)System\Security\Cryptography\AlgorithmImplementations\ECDiffieHellman\ECDiffieHellmanTests.Xml.cs"

0 commit comments

Comments
 (0)