diff --git a/NuGet.config b/NuGet.config
index d7ff98733a3537..d74fa2a4c62854 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -9,7 +9,7 @@
-
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index c567a80367fb2e..81b9dc541bcf8e 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -90,13 +90,13 @@
8bb0f2d5f3b6b9dff32e2643642bea09bf6ae38d
-
+
https://github.com/dotnet/emsdk
- 3cbd998b237cdde910fd4c4964207a87dd04c837
+ badf9f97aaf4c2166b17bd6475ca73958c11e309
-
+
https://github.com/dotnet/emsdk
- 3cbd998b237cdde910fd4c4964207a87dd04c837
+ badf9f97aaf4c2166b17bd6475ca73958c11e309
diff --git a/eng/Versions.props b/eng/Versions.props
index 6bd28d7bda1860..9f3768ffab74f1 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -1,11 +1,11 @@
- 8.0.23
+ 8.0.25
8
0
- 23
+ 25
8.0.100
7.0.20
6.0.36
@@ -254,7 +254,7 @@
Note: when the name is updated, make sure to update dependency name in eng/pipelines/common/xplat-setup.yml
like - DarcDependenciesChanged.Microsoft_NET_Workload_Emscripten_Current_Manifest-8_0_100_Transport
-->
- 8.0.23
+ 8.0.25
$(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version)
1.1.87-gba258badda
diff --git a/eng/pipelines/common/evaluate-paths-job.yml b/eng/pipelines/common/evaluate-paths-job.yml
index ebf3c930fb70ae..93e2aa23b9c044 100644
--- a/eng/pipelines/common/evaluate-paths-job.yml
+++ b/eng/pipelines/common/evaluate-paths-job.yml
@@ -28,7 +28,13 @@ jobs:
- job: evaluate_paths
displayName: Evaluate Paths
pool:
- vmImage: 'ubuntu-latest'
+ ${{ if eq(variables['System.TeamProject'], 'public') }}:
+ name: $(DncEngPublicBuildPool)
+ demands: ImageOverride -equals build.azurelinux.3.amd64.open
+ ${{ else }}:
+ name: $(DncEngInternalBuildPool)
+ demands: ImageOverride -equals build.azurelinux.3.amd64
+ os: linux
steps:
- checkout: self
diff --git a/src/libraries/System.Security.Cryptography.Cose/src/System.Security.Cryptography.Cose.csproj b/src/libraries/System.Security.Cryptography.Cose/src/System.Security.Cryptography.Cose.csproj
index e8dc5ff2663a1a..1b411e3ce4f158 100644
--- a/src/libraries/System.Security.Cryptography.Cose/src/System.Security.Cryptography.Cose.csproj
+++ b/src/libraries/System.Security.Cryptography.Cose/src/System.Security.Cryptography.Cose.csproj
@@ -4,8 +4,8 @@
$(NetCoreAppCurrent);$(NetCoreAppPrevious);$(NetCoreAppMinimum);netstandard2.0;$(NetFrameworkMinimum)
true
true
- 1
- false
+ 2
+ true
Provides support for CBOR Object Signing and Encryption (COSE).
diff --git a/src/libraries/System.Security.Cryptography.Cose/src/System/Security/Cryptography/Cose/CoseMessage.cs b/src/libraries/System.Security.Cryptography.Cose/src/System/Security/Cryptography/Cose/CoseMessage.cs
index 6395c966246ff1..39cb6a0a874f7d 100644
--- a/src/libraries/System.Security.Cryptography.Cose/src/System/Security/Cryptography/Cose/CoseMessage.cs
+++ b/src/libraries/System.Security.Cryptography.Cose/src/System/Security/Cryptography/Cose/CoseMessage.cs
@@ -295,10 +295,19 @@ private static void DecodeUnprotectedBucket(CborReader reader, CoseHeaderMap hea
private static void DecodeBucket(CborReader reader, CoseHeaderMap headerParameters)
{
- int? length = reader.ReadStartMap();
- for (int i = 0; i < length; i++)
+ reader.ReadStartMap();
+
+ while (true)
{
- CoseHeaderLabel label = reader.PeekState() switch
+ CborReaderState state = reader.PeekState();
+
+ if (state == CborReaderState.EndMap)
+ {
+ reader.ReadEndMap();
+ break;
+ }
+
+ CoseHeaderLabel label = state switch
{
CborReaderState.UnsignedInteger or CborReaderState.NegativeInteger => new CoseHeaderLabel(reader.ReadInt32()),
CborReaderState.TextString => new CoseHeaderLabel(reader.ReadTextString()),
@@ -306,9 +315,23 @@ private static void DecodeBucket(CborReader reader, CoseHeaderMap headerParamete
};
CoseHeaderValue value = CoseHeaderValue.FromEncodedValue(reader.ReadEncodedValue().Span);
- headerParameters.Add(label, value);
+
+ try
+ {
+ headerParameters.Add(label, value);
+ }
+ catch (ArgumentException e)
+ {
+ // Lift the well-known header value validation into a CryptographicException.
+ if (e.ParamName == "value")
+ {
+ throw new CryptographicException(e.Message);
+ }
+
+ Debug.Fail("Unexpected ArgumentException from CoseHeaderMap.Add");
+ throw new CryptographicException(SR.DecodeErrorWhileDecodingSeeInnerEx, e);
+ }
}
- reader.ReadEndMap();
}
private static byte[]? DecodePayload(CborReader reader)
@@ -563,13 +586,23 @@ internal static bool MissingCriticalHeaders(CoseHeaderMap? protectedHeders, out
return false;
}
+ bool empty = true;
+
var reader = new CborReader(critHeaderValue.EncodedValue);
- int length = reader.ReadStartArray().GetValueOrDefault();
- Debug.Assert(length > 0);
+ reader.ReadStartArray();
- for (int i = 0; i < length; i++)
+ while (true)
{
- CoseHeaderLabel label = reader.PeekState() switch
+ CborReaderState state = reader.PeekState();
+
+ if (state == CborReaderState.EndArray)
+ {
+ reader.ReadEndArray();
+ break;
+ }
+
+ empty = false;
+ CoseHeaderLabel label = state switch
{
CborReaderState.UnsignedInteger or CborReaderState.NegativeInteger => new CoseHeaderLabel(reader.ReadInt32()),
CborReaderState.TextString => new CoseHeaderLabel(reader.ReadTextString()),
@@ -583,6 +616,11 @@ internal static bool MissingCriticalHeaders(CoseHeaderMap? protectedHeders, out
}
}
+ if (empty)
+ {
+ throw new CryptographicException(SR.CriticalHeadersMustBeArrayOfAtLeastOne);
+ }
+
labelName = null;
return false;
}
diff --git a/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.DecodeMultiSign.cs b/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.DecodeMultiSign.cs
index 57fd753af4c011..229ef187377512 100644
--- a/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.DecodeMultiSign.cs
+++ b/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.DecodeMultiSign.cs
@@ -144,5 +144,131 @@ public void DecodeMultiSign_IndefiniteLengthArray_ShorterByOne(string hexCborPay
CryptographicException ex = Assert.Throws(() => CoseMessage.DecodeMultiSign(cborPayload));
Assert.Null(ex.InnerException);
}
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
+ public void DecodeMultiSignThrowsIfCriticalHeaderIsMissing(bool detached, bool useIndefiniteLength)
+ {
+ const string AttachedDefiniteHex =
+ "D8628440A054546869732069732074686520636F6E74656E742E818347A20126" +
+ "0281182AA05840ECB8C39BE15156FB6567C33634C75396D7FE1042C84FE54B9C" +
+ "EFA51E674C0CB227A8C08E558B6047668BBE3311749776670D1583A14B3A2DD8" +
+ "7F63F0FA298452";
+
+ const string AttachedIndefiniteHex =
+ "D8628440A054546869732069732074686520636F6E74656E742E818348A20126" +
+ "029F182AFFA05840F62CB760AC27D393D88ED392D5D4D55A02B0BB75261E75FE" +
+ "9B346C280DA6B93BE7F5B1B66B74561513EA52CAA2C66FE7474010035C678DA6" +
+ "B3549D3E671166EB";
+
+ const string DetachedDefiniteHex =
+ "D8628440A0F6818347A201260281182AA05840F96CE3D0999F34BE0E3FC62AE2" +
+ "AB25DD8D88F7154E6FADD5FFFEAF78F89DB97AC3E599ADB555C8442BD520F3F4" +
+ "8CB6A320B864677E26D1FA79FEDD79C3BCA927";
+
+ const string DetachedIndefiniteHex =
+ "D8628440A0F6818348A20126029F182AFFA0584028E95F7F9267CED0061339A7" +
+ "6602D823774EDA3E8D53B0A4FA436B71B0DBCA6F03F561A67355374AF494648C" +
+ "941558146F9C22B17542EBAF23497D27635A1829";
+
+ string inputHex = (detached, useIndefiniteLength) switch
+ {
+ (false, false) => AttachedDefiniteHex,
+ (false, true) => AttachedIndefiniteHex,
+ (true, false) => DetachedDefiniteHex,
+ (true, true) => DetachedIndefiniteHex,
+ };
+
+ AssertExtensions.ThrowsContains(
+ () => CoseMessage.DecodeMultiSign(ByteUtils.HexToByteArray(inputHex)),
+ "Critical Header '42' missing from protected map.");
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
+ public void DecodeMultiSignThrowsIfCriticalHeadersIsEmpty(bool detached, bool useIndefiniteLength)
+ {
+ const string AttachedDefiniteHex =
+ "D8628440A054546869732069732074686520636F6E74656E742E818345A20126" +
+ "0280A05840B5F9E21078643A74B181ED294AC72C71F20AC5CA7AD037F559C68E" +
+ "06148429396A4194133763AB6918D747ACEE820CC430C2E891E3E2D5EECF6126" +
+ "1CEA33C6D4";
+
+ const string AttachedIndefiniteHex =
+ "D8628440A054546869732069732074686520636F6E74656E742E818346A20126" +
+ "029FFFA05840DDF3C0B85415AD1628C0B50C0F3FEDE675C1003484687CDFA3FA" +
+ "09285D5A31D48ADF11744BE0AE87F0189408A9CF38F0572537E8A786D505B6A6" +
+ "EE2008B91C74";
+
+ const string DetachedDefiniteHex =
+ "D8628440A0F6818345A201260280A05840EB66EE9E064CAB2E2F50244661734D" +
+ "9AEBD959BD21278E8D4827870DFE10C27B52E3E21D29185FC64526DC3B80C108" +
+ "548E956E9DBDDC7B23D100C17715AEE163";
+
+ const string DetachedIndefiniteHex =
+ "D8628440A0F6818346A20126029FFFA05840FC954ABD1611F7C6EEDD7FE71C3F" +
+ "62821AD46ED1988500F3309D0C607F0F151A69D0FC7BC968B2C36AEE68AC2B9A" +
+ "9580DFE1244F6E5F834183497F21EA5900C1";
+
+ string inputHex = (detached, useIndefiniteLength) switch
+ {
+ (false, false) => AttachedDefiniteHex,
+ (false, true) => AttachedIndefiniteHex,
+ (true, false) => DetachedDefiniteHex,
+ (true, true) => DetachedIndefiniteHex,
+ };
+
+ AssertExtensions.ThrowsContains(
+ () => CoseMessage.DecodeMultiSign(ByteUtils.HexToByteArray(inputHex)),
+ "Critical Headers must be a CBOR array of at least one element.");
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
+ public void DecodeMultiSignThrowsIfCriticalHeaderIsOfUnknownType(bool detached, bool useIndefiniteLength)
+ {
+ const string AttachedDefiniteHex =
+ "D8628440A054546869732069732074686520636F6E74656E742E818347A20126" +
+ "0281412AA05840FCAFEDBE41693C7BA43FB58E2CF06182BE1BF340122CC5AFD4" +
+ "F59172C7E95166FF8E98FE9A0C2BEFEA135FD800DE6CA9A281D49B141CB93B17" +
+ "D992E693540F8A";
+
+ const string AttachedIndefiniteHex =
+ "D8628440A054546869732069732074686520636F6E74656E742E818348A20126" +
+ "029F412AFFA058400D3F4426B26007D731677D99B542E524847FF3927BCA74E4" +
+ "1823B09D6CA57A0E107F93DFE5DB851F4CEE8C0E4AF83E3540848F026FCD761F" +
+ "91CA2ED8D5F98134";
+
+ const string DetachedDefiniteHex =
+ "D8628440A0F6818347A201260281412AA0584008E0EEF66622FEC926CB651E90" +
+ "13D8628AB72581533761EDE52972FE6DFBF2C4BADB6C218E8AD1E28F8192DFB2" +
+ "8A82A4444A74C370AEA6C63AC982EABCD52874";
+
+ const string DetachedIndefiniteHex =
+ "D8628440A0F6818348A20126029F412AFFA05840C6DDCA2F35B7B285AB594963" +
+ "E9DB43CBDC77842256A7D1D31704749C7446AD5A67BBC02F9DBAF8F394ECCCA7" +
+ "8E8B63E5BB746F0205EE5732DFB2E00EBA3D5F48";
+
+ string inputHex = (detached, useIndefiniteLength) switch
+ {
+ (false, false) => AttachedDefiniteHex,
+ (false, true) => AttachedIndefiniteHex,
+ (true, false) => DetachedDefiniteHex,
+ (true, true) => DetachedIndefiniteHex,
+ };
+
+ AssertExtensions.ThrowsContains(
+ () => CoseMessage.DecodeMultiSign(ByteUtils.HexToByteArray(inputHex)),
+ "Header '2' does not accept the specified value.");
+ }
}
}
diff --git a/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.DecodeSign1.cs b/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.DecodeSign1.cs
index 8d3fdb27ad5dea..f06db0413a97b2 100644
--- a/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.DecodeSign1.cs
+++ b/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.DecodeSign1.cs
@@ -102,5 +102,130 @@ public void DecodeSign1_IndefiniteLengthArray_ShorterByOne()
CryptographicException ex = Assert.Throws(() => CoseMessage.DecodeSign1(cborPayload));
Assert.Null(ex.InnerException);
}
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
+ public void DecodeSign1ThrowsIfCriticalHeaderIsMissing(bool detached, bool useIndefiniteLength)
+ {
+ const string AttachedDefiniteHex =
+ "D28447A201260281182AA054546869732069732074686520636F6E74656E742E" +
+ "5840F78745BDFA8CDF90ED6EC130BC8D97F43C8A52899920221832A1E758A1E7" +
+ "590827148F6D1A76673E7E9615F628730B19F07707B6FB1C9CD7B6D4E2B3C3F0" +
+ "DEAD";
+
+ const string AttachedIndefiniteHex =
+ "D28448A20126029F182AFFA054546869732069732074686520636F6E74656E74" +
+ "2E58408B07F60298F64453356EAF005C630A4576AF4C66E0327579BB81B5D726" +
+ "3836AA9419B1312298DD47BC10BA22D6DEEE35F1526948BF098915816149B46A" +
+ "3C9981";
+
+ const string DetachedDefiniteHex =
+ "D28447A201260281182AA0F6584089B093A038B0636940F9273EF11214B64CC1" +
+ "BB862305EDEC9C772A3D5089A54A6CBBA00323FA59A593A828F157653DEE15B0" +
+ "EBBDC070D02CDFD13E8A9F2ECA1B";
+
+ const string DetachedIndefiniteHex =
+ "D28448A20126029F182AFFA0F658409B35B9FD294BDF36EEF7494D0EC9E19F6A2" +
+ "106638FD4A2A31B816FED80493772DCEA8B64F6618119E278379F83E1A62BA382" +
+ "21B9F1AC705FAD8612DC6B0478A0";
+
+ string inputHex = (detached, useIndefiniteLength) switch
+ {
+ (false, false) => AttachedDefiniteHex,
+ (false, true) => AttachedIndefiniteHex,
+ (true, false) => DetachedDefiniteHex,
+ (true, true) => DetachedIndefiniteHex,
+ };
+
+ AssertExtensions.ThrowsContains(
+ () => CoseMessage.DecodeSign1(ByteUtils.HexToByteArray(inputHex)),
+ "Critical Header '42' missing from protected map.");
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
+ public void DecodeSign1ThrowsIfCriticalHeadersIsEmpty(bool detached, bool useIndefiniteLength)
+ {
+ const string AttachedDefiniteHex =
+ "D28445A201260280A054546869732069732074686520636F6E74656E742E5840" +
+ "57C7EE86AF06B1ABB002480CE148DFDA06C2CA4AFE83E9C7AE3493EA13E06E9B" +
+ "0A4C713F7FDCDD2F8731103CDA28B83313E411988B88AC7716E43307B5AF22FD";
+
+ const string AttachedIndefiniteHex =
+ "D28446A20126029FFFA054546869732069732074686520636F6E74656E742E58" +
+ "401B941A9C799270827BE5139EC5F3DE4E072913F6473C7278E691D6C58D407A" +
+ "23DB3176383E8429AA558418EE33CB7DFFD2CF251EEC93B6CFC300D0D9679CE5" +
+ "42";
+
+ const string DetachedDefiniteHex =
+ "D28445A201260280A0F658409B0EBC937A969A7D4BB2AA0B1004091EDAA00AE2" +
+ "BBCCBB994B7278C9E50C6C734B3A53CB5B87A99E75F63D16B73757CA23C99CF0" +
+ "8F8F909A1332DAC05D9DB1C0";
+
+ const string DetachedIndefiniteHex =
+ "D28446A20126029FFFA0F65840CA96F1292FEE2B787DC75D91553024E70DD62B" +
+ "EA0BFE284024385C6D9493EEF6F055825E79244B63E76F69A419C3A36B3B1F18" +
+ "34789A23983D685B7CDA231E86";
+
+ string inputHex = (detached, useIndefiniteLength) switch
+ {
+ (false, false) => AttachedDefiniteHex,
+ (false, true) => AttachedIndefiniteHex,
+ (true, false) => DetachedDefiniteHex,
+ (true, true) => DetachedIndefiniteHex,
+ };
+
+ AssertExtensions.ThrowsContains(
+ () => CoseMessage.DecodeSign1(ByteUtils.HexToByteArray(inputHex)),
+ "Critical Headers must be a CBOR array of at least one element.");
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
+ public void DecodeSign1ThrowsIfCriticalHeaderIsOfUnknownType(bool detached, bool useIndefiniteLength)
+ {
+ const string AttachedDefiniteHex =
+ "D28447A201260281412AA054546869732069732074686520636F6E74656E742E" +
+ "58403529AC69F69A80B4055CFFCA88F010390509E0A9D4D0083F23DF46841144" +
+ "B7E9D7CC11E90D0D51103672083449B439B71EAF6B922C011CC471D8E1D577C6" +
+ "B954";
+
+ const string AttachedIndefiniteHex =
+ "D28448A20126029F412AFFA054546869732069732074686520636F6E74656E74" +
+ "2E5840FE8A2CBBBA2A154361BEF0892D11FF621A1DBDCBD1A955020DD7D85ED8" +
+ "15C43B3AB39A32561AAEF679D08FD561339AC9A4E537B2E91DC120A32F406455" +
+ "F3353F";
+
+ const string DetachedDefiniteHex =
+ "D28447A201260281412AA0F65840AB87DA5ABA5A470C7508F5F1724744458407" +
+ "897746890428F877AD593F9D90E5503A6D1B3369AF77952223D5C474CBB8EC62" +
+ "9726F967921A4AB91DC8F86DA1CF";
+
+ const string DetachedIndefiniteHex =
+ "D28448A20126029F412AFFA0F658409613065203B619BE9CEC1CC596F59C7395" +
+ "5AEE8BD492F16B72D2C0F443AE70E5E5B1D615A06A90145078B41A1CA12D4067" +
+ "D6C6CEEB2C19B3747A0926305EBA09";
+
+ string inputHex = (detached, useIndefiniteLength) switch
+ {
+ (false, false) => AttachedDefiniteHex,
+ (false, true) => AttachedIndefiniteHex,
+ (true, false) => DetachedDefiniteHex,
+ (true, true) => DetachedIndefiniteHex,
+ };
+
+ AssertExtensions.ThrowsContains(
+ () => CoseMessage.DecodeSign1(ByteUtils.HexToByteArray(inputHex)),
+ "Header '2' does not accept the specified value.");
+ }
}
}
diff --git a/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.Sign.CustomHeaderMaps.cs b/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.Sign.CustomHeaderMaps.cs
index e7e3fe1ca782b3..af02047626165c 100644
--- a/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.Sign.CustomHeaderMaps.cs
+++ b/src/libraries/System.Security.Cryptography.Cose/tests/CoseMessageTests.Sign.CustomHeaderMaps.cs
@@ -517,12 +517,14 @@ public void SignWithCborNegativeIntegerRepresentationAlgorithmHeaderValue(ulong
Assert.Throws(() => Sign(s_sampleContent, DefaultKey, DefaultHash, protectedHeaders));
}
- [Fact]
- public void SignWithCriticalHeaders()
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public void SignWithCriticalHeaders(bool useIndefiniteLength)
{
CoseHeaderMap protectedHeaders = GetHeaderMapWithAlgorithm(DefaultAlgorithm);
List<(CoseHeaderLabel, ReadOnlyMemory)> expectedProtectedHeaders = GetExpectedProtectedHeaders(DefaultAlgorithm);
- AddCriticalHeaders(protectedHeaders, expectedProtectedHeaders, includeSpecifiedCritHeader: true);
+ AddCriticalHeaders(protectedHeaders, expectedProtectedHeaders, includeSpecifiedCritHeader: true, useIndefiniteLength);
CoseSigner signer = GetCoseSigner(DefaultKey, DefaultHash, protectedHeaders);
ReadOnlySpan encodedMessage = Sign(s_sampleContent, signer);
@@ -530,18 +532,22 @@ public void SignWithCriticalHeaders()
AssertCoseSignMessage(encodedMessage, s_sampleContent, DefaultKey, DefaultAlgorithm, expectedProtectedHeaders);
}
- [Fact]
- public void SignWithCriticalHeaders_NotTransportingTheSpecifiedCriticalHeaderThrows()
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public void SignWithCriticalHeaders_NotTransportingTheSpecifiedCriticalHeaderThrows(bool useIndefiniteLength)
{
CoseHeaderMap protectedHeaders = GetHeaderMapWithAlgorithm(DefaultAlgorithm);
- AddCriticalHeaders(protectedHeaders, null, includeSpecifiedCritHeader: false);
+ AddCriticalHeaders(protectedHeaders, null, includeSpecifiedCritHeader: false, useIndefiniteLength);
CoseSigner signer = GetCoseSigner(DefaultKey, DefaultHash, protectedHeaders);
Assert.Throws("signer", () => Sign(s_sampleContent, signer));
}
- [Fact]
- public void MultiSign_SignWithCriticalHeaders_BodyHeaders()
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public void MultiSign_SignWithCriticalHeaders_BodyHeaders(bool useIndefiniteLength)
{
if (MessageKind != CoseMessageKind.MultiSign)
{
@@ -550,7 +556,7 @@ public void MultiSign_SignWithCriticalHeaders_BodyHeaders()
CoseHeaderMap bodyProtectedHeaders = GetEmptyHeaderMap();
List<(CoseHeaderLabel, ReadOnlyMemory)> expectedBodyProtected = GetEmptyExpectedHeaders();
- AddCriticalHeaders(bodyProtectedHeaders, expectedBodyProtected, includeSpecifiedCritHeader: true);
+ AddCriticalHeaders(bodyProtectedHeaders, expectedBodyProtected, includeSpecifiedCritHeader: true, useIndefiniteLength);
CoseSigner signer = GetCoseSigner(DefaultKey, DefaultHash);
ReadOnlySpan encodedMessage = Sign(s_sampleContent, signer, bodyProtectedHeaders);
@@ -558,8 +564,10 @@ public void MultiSign_SignWithCriticalHeaders_BodyHeaders()
AssertCoseSignMessage(encodedMessage, s_sampleContent, DefaultKey, DefaultAlgorithm, expectedMultiSignBodyProtectedHeaders: expectedBodyProtected);
}
- [Fact]
- public void MultiSign_SignWithCriticalHeaders_NotTransportingTheSpecifiedCriticalHeaderThrows_BodyHeaders()
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public void MultiSign_SignWithCriticalHeaders_NotTransportingTheSpecifiedCriticalHeaderThrows_BodyHeaders(bool useIndefiniteLength)
{
if (MessageKind != CoseMessageKind.MultiSign)
{
@@ -567,14 +575,16 @@ public void MultiSign_SignWithCriticalHeaders_NotTransportingTheSpecifiedCritica
}
CoseHeaderMap bodyProtectedHeaders = GetEmptyHeaderMap();
- AddCriticalHeaders(bodyProtectedHeaders, null, includeSpecifiedCritHeader: false);
+ AddCriticalHeaders(bodyProtectedHeaders, null, includeSpecifiedCritHeader: false, useIndefiniteLength);
CoseSigner signer = GetCoseSigner(DefaultKey, DefaultHash);
Assert.Throws("protectedHeaders", () => Sign(s_sampleContent, signer, bodyProtectedHeaders));
}
- [Fact]
- public void MultiSign_SignWithCriticalHeaders_AddSignature()
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public void MultiSign_SignWithCriticalHeaders_AddSignature(bool useIndefiniteLength)
{
if (MessageKind != CoseMessageKind.MultiSign)
{
@@ -588,7 +598,7 @@ public void MultiSign_SignWithCriticalHeaders_AddSignature()
CoseHeaderMap signProtectedHeaders = GetHeaderMapWithAlgorithm(DefaultAlgorithm);
List<(CoseHeaderLabel, ReadOnlyMemory)> expectedSignProtected = GetExpectedProtectedHeaders(DefaultAlgorithm);
- AddCriticalHeaders(signProtectedHeaders, expectedSignProtected, includeSpecifiedCritHeader: true);
+ AddCriticalHeaders(signProtectedHeaders, expectedSignProtected, includeSpecifiedCritHeader: true, useIndefiniteLength);
CoseSigner signer = GetCoseSigner(DefaultKey, DefaultHash, signProtectedHeaders);
AddSignature(multiSignMsg, s_sampleContent, signer);
@@ -596,8 +606,10 @@ public void MultiSign_SignWithCriticalHeaders_AddSignature()
AssertCoseSignMessage(multiSignMsg.Encode(), s_sampleContent, DefaultKey, DefaultAlgorithm, expectedProtectedHeaders: expectedSignProtected);
}
- [Fact]
- public void MultiSign_SignWithCriticalHeaders_NotTransportingTheSpecifiedCriticalHeaderThrows_AddSignature()
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public void MultiSign_SignWithCriticalHeaders_NotTransportingTheSpecifiedCriticalHeaderThrows_AddSignature(bool useIndefiniteLength)
{
if (MessageKind != CoseMessageKind.MultiSign)
{
@@ -610,18 +622,21 @@ public void MultiSign_SignWithCriticalHeaders_NotTransportingTheSpecifiedCritica
multiSignMsg.RemoveSignature(0);
CoseHeaderMap signProtectedHeaders = GetHeaderMapWithAlgorithm(DefaultAlgorithm);
- AddCriticalHeaders(signProtectedHeaders, null, includeSpecifiedCritHeader: false);
+ AddCriticalHeaders(signProtectedHeaders, null, includeSpecifiedCritHeader: false, useIndefiniteLength);
CoseSigner signer = GetCoseSigner(DefaultKey, DefaultHash, signProtectedHeaders);
Assert.Throws("signer", () => AddSignature(multiSignMsg, s_sampleContent, signer));
}
private static void AddCriticalHeaders(
- CoseHeaderMap protectedHeaders, List<(CoseHeaderLabel, ReadOnlyMemory)>? expectedHeaders, bool includeSpecifiedCritHeader)
+ CoseHeaderMap protectedHeaders,
+ List<(CoseHeaderLabel, ReadOnlyMemory)>? expectedHeaders,
+ bool includeSpecifiedCritHeader,
+ bool useIndefiniteLength)
{
Assert.Equal(expectedHeaders != null, includeSpecifiedCritHeader);
- CoseHeaderValue critValue = CoseHeaderValue.FromEncodedValue(GetDummyCritHeaderValue());
+ CoseHeaderValue critValue = CoseHeaderValue.FromEncodedValue(GetDummyCritHeaderValue(useIndefiniteLength));
protectedHeaders[CoseHeaderLabel.CriticalHeaders] = critValue;
expectedHeaders?.Add((CoseHeaderLabel.CriticalHeaders, critValue.EncodedValue));