Skip to content

Commit c02569b

Browse files
Clean up CompositeMLDsaAlgorithm and add comprehensive tests (#117135)
Co-authored-by: PranavSenthilnathan <[email protected]> Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: Pranav Senthilnathan <[email protected]>
1 parent d136ec9 commit c02569b

File tree

4 files changed

+209
-1
lines changed

4 files changed

+209
-1
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ public sealed class CompositeMLDsaAlgorithm : IEquatable<CompositeMLDsaAlgorithm
1818
/// Gets the name of the algorithm.
1919
/// </summary>
2020
/// <value>
21-
/// An a string representing the algorithm name.
21+
/// A string representing the algorithm name.
2222
/// </value>
2323
public string Name { get; }
2424

2525
/// <summary>
2626
/// Gets the maximum signature size in bytes for the composite algorithm.
2727
/// </summary>
28+
/// <value>
29+
/// The maximum signature size in bytes for the composite algorithm.
30+
/// </value>
2831
public int MaxSignatureSizeInBytes { get; }
2932

3033
internal MLDsaAlgorithm MLDsaAlgorithm { get; }
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
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.Collections.Generic;
5+
using Xunit;
6+
7+
namespace System.Security.Cryptography.Tests
8+
{
9+
public static class CompositeMLDsaAlgorithmTests
10+
{
11+
[Fact]
12+
public static void AlgorithmsHaveExpectedParameters()
13+
{
14+
CompositeMLDsaAlgorithm algorithm;
15+
16+
algorithm = CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pss;
17+
Assert.Equal("MLDSA44-RSA2048-PSS-SHA256", algorithm.Name);
18+
Assert.Equal(2676, algorithm.MaxSignatureSizeInBytes); // MLDsa44 (2420) + RSA2048 (256)
19+
20+
algorithm = CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pkcs15;
21+
Assert.Equal("MLDSA44-RSA2048-PKCS15-SHA256", algorithm.Name);
22+
Assert.Equal(2676, algorithm.MaxSignatureSizeInBytes); // MLDsa44 (2420) + RSA2048 (256)
23+
24+
algorithm = CompositeMLDsaAlgorithm.MLDsa44WithEd25519;
25+
Assert.Equal("MLDSA44-Ed25519-SHA512", algorithm.Name);
26+
Assert.Equal(2484, algorithm.MaxSignatureSizeInBytes); // MLDsa44 (2420) + Ed25519 (64)
27+
28+
algorithm = CompositeMLDsaAlgorithm.MLDsa44WithECDsaP256;
29+
Assert.Equal("MLDSA44-ECDSA-P256-SHA256", algorithm.Name);
30+
Assert.Equal(2492, algorithm.MaxSignatureSizeInBytes); // MLDsa44 (2420) + ECDSA-P256 (72)
31+
32+
algorithm = CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pss;
33+
Assert.Equal("MLDSA65-RSA3072-PSS-SHA512", algorithm.Name);
34+
Assert.Equal(3693, algorithm.MaxSignatureSizeInBytes); // MLDsa65 (3309) + RSA3072 (384)
35+
36+
algorithm = CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pkcs15;
37+
Assert.Equal("MLDSA65-RSA3072-PKCS15-SHA512", algorithm.Name);
38+
Assert.Equal(3693, algorithm.MaxSignatureSizeInBytes); // MLDsa65 (3309) + RSA3072 (384)
39+
40+
algorithm = CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pss;
41+
Assert.Equal("MLDSA65-RSA4096-PSS-SHA512", algorithm.Name);
42+
Assert.Equal(3821, algorithm.MaxSignatureSizeInBytes); // MLDsa65 (3309) + RSA4096 (512)
43+
44+
algorithm = CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pkcs15;
45+
Assert.Equal("MLDSA65-RSA4096-PKCS15-SHA512", algorithm.Name);
46+
Assert.Equal(3821, algorithm.MaxSignatureSizeInBytes); // MLDsa65 (3309) + RSA4096 (512)
47+
48+
algorithm = CompositeMLDsaAlgorithm.MLDsa65WithECDsaP256;
49+
Assert.Equal("MLDSA65-ECDSA-P256-SHA512", algorithm.Name);
50+
Assert.Equal(3381, algorithm.MaxSignatureSizeInBytes); // MLDsa65 (3309) + ECDSA-P256 (72)
51+
52+
algorithm = CompositeMLDsaAlgorithm.MLDsa65WithECDsaP384;
53+
Assert.Equal("MLDSA65-ECDSA-P384-SHA512", algorithm.Name);
54+
Assert.Equal(3413, algorithm.MaxSignatureSizeInBytes); // MLDsa65 (3309) + ECDSA-P384 (104)
55+
56+
algorithm = CompositeMLDsaAlgorithm.MLDsa65WithECDsaBrainpoolP256r1;
57+
Assert.Equal("MLDSA65-ECDSA-brainpoolP256r1-SHA512", algorithm.Name);
58+
Assert.Equal(3381, algorithm.MaxSignatureSizeInBytes); // MLDsa65 (3309) + ECDSA-brainpoolP256r1 (72)
59+
60+
algorithm = CompositeMLDsaAlgorithm.MLDsa65WithEd25519;
61+
Assert.Equal("MLDSA65-Ed25519-SHA512", algorithm.Name);
62+
Assert.Equal(3373, algorithm.MaxSignatureSizeInBytes); // MLDsa65 (3309) + Ed25519 (64)
63+
64+
algorithm = CompositeMLDsaAlgorithm.MLDsa87WithECDsaP384;
65+
Assert.Equal("MLDSA87-ECDSA-P384-SHA512", algorithm.Name);
66+
Assert.Equal(4731, algorithm.MaxSignatureSizeInBytes); // MLDsa87 (4627) + ECDSA-P384 (104)
67+
68+
algorithm = CompositeMLDsaAlgorithm.MLDsa87WithECDsaBrainpoolP384r1;
69+
Assert.Equal("MLDSA87-ECDSA-brainpoolP384r1-SHA512", algorithm.Name);
70+
Assert.Equal(4731, algorithm.MaxSignatureSizeInBytes); // MLDsa87 (4627) + ECDSA-brainpoolP384r1 (104)
71+
72+
algorithm = CompositeMLDsaAlgorithm.MLDsa87WithEd448;
73+
Assert.Equal("MLDSA87-Ed448-SHAKE256", algorithm.Name);
74+
Assert.Equal(4741, algorithm.MaxSignatureSizeInBytes); // MLDsa87 (4627) + Ed448 (114)
75+
76+
algorithm = CompositeMLDsaAlgorithm.MLDsa87WithRSA3072Pss;
77+
Assert.Equal("MLDSA87-RSA3072-PSS-SHA512", algorithm.Name);
78+
Assert.Equal(5011, algorithm.MaxSignatureSizeInBytes); // MLDsa87 (4627) + RSA3072 (384)
79+
80+
algorithm = CompositeMLDsaAlgorithm.MLDsa87WithRSA4096Pss;
81+
Assert.Equal("MLDSA87-RSA4096-PSS-SHA512", algorithm.Name);
82+
Assert.Equal(5139, algorithm.MaxSignatureSizeInBytes); // MLDsa87 (4627) + RSA4096 (512)
83+
84+
algorithm = CompositeMLDsaAlgorithm.MLDsa87WithECDsaP521;
85+
Assert.Equal("MLDSA87-ECDSA-P521-SHA512", algorithm.Name);
86+
Assert.Equal(4766, algorithm.MaxSignatureSizeInBytes); // MLDsa87 (4627) + ECDSA-P521 (139)
87+
}
88+
89+
[Fact]
90+
public static void Algorithms_AreSame()
91+
{
92+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pss, CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pss);
93+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pkcs15, CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pkcs15);
94+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa44WithEd25519, CompositeMLDsaAlgorithm.MLDsa44WithEd25519);
95+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa44WithECDsaP256, CompositeMLDsaAlgorithm.MLDsa44WithECDsaP256);
96+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pss, CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pss);
97+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pkcs15, CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pkcs15);
98+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pss, CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pss);
99+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pkcs15, CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pkcs15);
100+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa65WithECDsaP256, CompositeMLDsaAlgorithm.MLDsa65WithECDsaP256);
101+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa65WithECDsaP384, CompositeMLDsaAlgorithm.MLDsa65WithECDsaP384);
102+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa65WithECDsaBrainpoolP256r1, CompositeMLDsaAlgorithm.MLDsa65WithECDsaBrainpoolP256r1);
103+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa65WithEd25519, CompositeMLDsaAlgorithm.MLDsa65WithEd25519);
104+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa87WithECDsaP384, CompositeMLDsaAlgorithm.MLDsa87WithECDsaP384);
105+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa87WithECDsaBrainpoolP384r1, CompositeMLDsaAlgorithm.MLDsa87WithECDsaBrainpoolP384r1);
106+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa87WithEd448, CompositeMLDsaAlgorithm.MLDsa87WithEd448);
107+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa87WithRSA3072Pss, CompositeMLDsaAlgorithm.MLDsa87WithRSA3072Pss);
108+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa87WithRSA4096Pss, CompositeMLDsaAlgorithm.MLDsa87WithRSA4096Pss);
109+
Assert.Same(CompositeMLDsaAlgorithm.MLDsa87WithECDsaP521, CompositeMLDsaAlgorithm.MLDsa87WithECDsaP521);
110+
}
111+
112+
[Theory]
113+
[MemberData(nameof(CompositeMLDsaAlgorithms))]
114+
public static void Algorithms_Equal(CompositeMLDsaAlgorithm algorithm)
115+
{
116+
AssertExtensions.TrueExpression(algorithm.Equals(algorithm));
117+
AssertExtensions.TrueExpression(algorithm.Equals((object)algorithm));
118+
AssertExtensions.FalseExpression(algorithm.Equals(null));
119+
}
120+
121+
[Theory]
122+
[MemberData(nameof(CompositeMLDsaAlgorithms))]
123+
public static void Algorithms_GetHashCode(CompositeMLDsaAlgorithm algorithm)
124+
{
125+
Assert.Equal(algorithm.Name.GetHashCode(), algorithm.GetHashCode());
126+
}
127+
128+
[Fact]
129+
public static void Algorithms_Equality()
130+
{
131+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pss == CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pss);
132+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pkcs15 == CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pkcs15);
133+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa44WithEd25519 == CompositeMLDsaAlgorithm.MLDsa44WithEd25519);
134+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa44WithECDsaP256 == CompositeMLDsaAlgorithm.MLDsa44WithECDsaP256);
135+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pss == CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pss);
136+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pkcs15 == CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pkcs15);
137+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pss == CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pss);
138+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pkcs15 == CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pkcs15);
139+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa65WithECDsaP256 == CompositeMLDsaAlgorithm.MLDsa65WithECDsaP256);
140+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa65WithECDsaP384 == CompositeMLDsaAlgorithm.MLDsa65WithECDsaP384);
141+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa65WithECDsaBrainpoolP256r1 == CompositeMLDsaAlgorithm.MLDsa65WithECDsaBrainpoolP256r1);
142+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa65WithEd25519 == CompositeMLDsaAlgorithm.MLDsa65WithEd25519);
143+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa87WithECDsaP384 == CompositeMLDsaAlgorithm.MLDsa87WithECDsaP384);
144+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa87WithECDsaBrainpoolP384r1 == CompositeMLDsaAlgorithm.MLDsa87WithECDsaBrainpoolP384r1);
145+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa87WithEd448 == CompositeMLDsaAlgorithm.MLDsa87WithEd448);
146+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa87WithRSA3072Pss == CompositeMLDsaAlgorithm.MLDsa87WithRSA3072Pss);
147+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa87WithRSA4096Pss == CompositeMLDsaAlgorithm.MLDsa87WithRSA4096Pss);
148+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa87WithECDsaP521 == CompositeMLDsaAlgorithm.MLDsa87WithECDsaP521);
149+
150+
// Test some cross-combinations are false
151+
AssertExtensions.FalseExpression(CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pss == CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pkcs15);
152+
AssertExtensions.FalseExpression(CompositeMLDsaAlgorithm.MLDsa44WithEd25519 == CompositeMLDsaAlgorithm.MLDsa65WithEd25519);
153+
AssertExtensions.FalseExpression(CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pss == CompositeMLDsaAlgorithm.MLDsa87WithRSA3072Pss);
154+
AssertExtensions.FalseExpression(CompositeMLDsaAlgorithm.MLDsa87WithECDsaP384 == CompositeMLDsaAlgorithm.MLDsa65WithECDsaP384);
155+
}
156+
157+
[Fact]
158+
public static void Algorithms_Inequality()
159+
{
160+
AssertExtensions.FalseExpression(CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pss != CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pss);
161+
AssertExtensions.FalseExpression(CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pkcs15 != CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pkcs15);
162+
AssertExtensions.FalseExpression(CompositeMLDsaAlgorithm.MLDsa44WithEd25519 != CompositeMLDsaAlgorithm.MLDsa44WithEd25519);
163+
AssertExtensions.FalseExpression(CompositeMLDsaAlgorithm.MLDsa44WithECDsaP256 != CompositeMLDsaAlgorithm.MLDsa44WithECDsaP256);
164+
165+
// Test some cross-combinations are true
166+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pss != CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pkcs15);
167+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa44WithEd25519 != CompositeMLDsaAlgorithm.MLDsa65WithEd25519);
168+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pss != CompositeMLDsaAlgorithm.MLDsa87WithRSA3072Pss);
169+
AssertExtensions.TrueExpression(CompositeMLDsaAlgorithm.MLDsa87WithECDsaP384 != CompositeMLDsaAlgorithm.MLDsa65WithECDsaP384);
170+
}
171+
172+
[Theory]
173+
[MemberData(nameof(CompositeMLDsaAlgorithms))]
174+
public static void Algorithms_ToString(CompositeMLDsaAlgorithm algorithm)
175+
{
176+
Assert.Equal(algorithm.Name, algorithm.ToString());
177+
}
178+
179+
public static IEnumerable<object[]> CompositeMLDsaAlgorithms()
180+
{
181+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pss };
182+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa44WithRSA2048Pkcs15 };
183+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa44WithEd25519 };
184+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa44WithECDsaP256 };
185+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pss };
186+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa65WithRSA3072Pkcs15 };
187+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pss };
188+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa65WithRSA4096Pkcs15 };
189+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa65WithECDsaP256 };
190+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa65WithECDsaP384 };
191+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa65WithECDsaBrainpoolP256r1 };
192+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa65WithEd25519 };
193+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa87WithECDsaP384 };
194+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa87WithECDsaBrainpoolP384r1 };
195+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa87WithEd448 };
196+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa87WithRSA3072Pss };
197+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa87WithRSA4096Pss };
198+
yield return new object[] { CompositeMLDsaAlgorithm.MLDsa87WithECDsaP521 };
199+
}
200+
}
201+
}

src/libraries/Microsoft.Bcl.Cryptography/tests/Microsoft.Bcl.Cryptography.Tests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@
118118
Link="CommonTest\System\Security\Cryptography\PlatformSupport.cs" />
119119
<Compile Include="$(CommonTestPath)System\Security\Cryptography\CngKeyWrapper.cs"
120120
Link="TestCommon\System\Security\Cryptography\CngKeyWrapper.cs" />
121+
<Compile Include="$(CommonTestPath)System\Security\Cryptography\CompositeMLDsaAlgorithmTests.cs"
122+
Link="CommonTest\System\Security\Cryptography\CompositeMLDsaAlgorithmTests.cs" />
121123
<Compile Include="$(CommonTestPath)System\Security\Cryptography\MLDsaAlgorithmTests.cs"
122124
Link="CommonTest\System\Security\Cryptography\MLDsaAlgorithmTests.cs" />
123125
<Compile Include="$(CommonTestPath)System\Security\Cryptography\MLKemAlgorithmTests.cs"

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
@@ -223,6 +223,8 @@
223223
Link="ProductionCode\Common\System\Net\MultiArrayBuffer.cs" />
224224
<Compile Include="$(CommonPath)System\Net\StreamBuffer.cs"
225225
Link="ProductionCode\Common\System\Net\StreamBuffer.cs" />
226+
<Compile Include="$(CommonTestPath)System\Security\Cryptography\CompositeMLDsaAlgorithmTests.cs"
227+
Link="CommonTest\System\Security\Cryptography\CompositeMLDsaAlgorithmTests.cs" />
226228
<Compile Include="$(CommonTestPath)System\Security\Cryptography\MLDsaAlgorithmTests.cs"
227229
Link="CommonTest\System\Security\Cryptography\MLDsaAlgorithmTests.cs" />
228230
<Compile Include="$(CommonTestPath)System\Security\Cryptography\MLKemAlgorithmTests.cs"

0 commit comments

Comments
 (0)