@@ -144,5 +144,131 @@ public void DecodeMultiSign_IndefiniteLengthArray_ShorterByOne(string hexCborPay
144144 CryptographicException ex = Assert . Throws < CryptographicException > ( ( ) => CoseMessage . DecodeMultiSign ( cborPayload ) ) ;
145145 Assert . Null ( ex . InnerException ) ;
146146 }
147+
148+ [ Theory ]
149+ [ InlineData ( true , true ) ]
150+ [ InlineData ( true , false ) ]
151+ [ InlineData ( false , false ) ]
152+ [ InlineData ( false , true ) ]
153+ public void DecodeMultiSignThrowsIfCriticalHeaderIsMissing ( bool detached , bool useIndefiniteLength )
154+ {
155+ const string AttachedDefiniteHex =
156+ "D8628440A054546869732069732074686520636F6E74656E742E818347A20126" +
157+ "0281182AA05840ECB8C39BE15156FB6567C33634C75396D7FE1042C84FE54B9C" +
158+ "EFA51E674C0CB227A8C08E558B6047668BBE3311749776670D1583A14B3A2DD8" +
159+ "7F63F0FA298452" ;
160+
161+ const string AttachedIndefiniteHex =
162+ "D8628440A054546869732069732074686520636F6E74656E742E818348A20126" +
163+ "029F182AFFA05840F62CB760AC27D393D88ED392D5D4D55A02B0BB75261E75FE" +
164+ "9B346C280DA6B93BE7F5B1B66B74561513EA52CAA2C66FE7474010035C678DA6" +
165+ "B3549D3E671166EB" ;
166+
167+ const string DetachedDefiniteHex =
168+ "D8628440A0F6818347A201260281182AA05840F96CE3D0999F34BE0E3FC62AE2" +
169+ "AB25DD8D88F7154E6FADD5FFFEAF78F89DB97AC3E599ADB555C8442BD520F3F4" +
170+ "8CB6A320B864677E26D1FA79FEDD79C3BCA927" ;
171+
172+ const string DetachedIndefiniteHex =
173+ "D8628440A0F6818348A20126029F182AFFA0584028E95F7F9267CED0061339A7" +
174+ "6602D823774EDA3E8D53B0A4FA436B71B0DBCA6F03F561A67355374AF494648C" +
175+ "941558146F9C22B17542EBAF23497D27635A1829" ;
176+
177+ string inputHex = ( detached , useIndefiniteLength ) switch
178+ {
179+ ( false , false ) => AttachedDefiniteHex ,
180+ ( false , true ) => AttachedIndefiniteHex ,
181+ ( true , false ) => DetachedDefiniteHex ,
182+ ( true , true ) => DetachedIndefiniteHex ,
183+ } ;
184+
185+ AssertExtensions . ThrowsContains < CryptographicException > (
186+ ( ) => CoseMessage . DecodeMultiSign ( ByteUtils . HexToByteArray ( inputHex ) ) ,
187+ "Critical Header '42' missing from protected map." ) ;
188+ }
189+
190+ [ Theory ]
191+ [ InlineData ( true , true ) ]
192+ [ InlineData ( true , false ) ]
193+ [ InlineData ( false , false ) ]
194+ [ InlineData ( false , true ) ]
195+ public void DecodeMultiSignThrowsIfCriticalHeadersIsEmpty ( bool detached , bool useIndefiniteLength )
196+ {
197+ const string AttachedDefiniteHex =
198+ "D8628440A054546869732069732074686520636F6E74656E742E818345A20126" +
199+ "0280A05840B5F9E21078643A74B181ED294AC72C71F20AC5CA7AD037F559C68E" +
200+ "06148429396A4194133763AB6918D747ACEE820CC430C2E891E3E2D5EECF6126" +
201+ "1CEA33C6D4" ;
202+
203+ const string AttachedIndefiniteHex =
204+ "D8628440A054546869732069732074686520636F6E74656E742E818346A20126" +
205+ "029FFFA05840DDF3C0B85415AD1628C0B50C0F3FEDE675C1003484687CDFA3FA" +
206+ "09285D5A31D48ADF11744BE0AE87F0189408A9CF38F0572537E8A786D505B6A6" +
207+ "EE2008B91C74" ;
208+
209+ const string DetachedDefiniteHex =
210+ "D8628440A0F6818345A201260280A05840EB66EE9E064CAB2E2F50244661734D" +
211+ "9AEBD959BD21278E8D4827870DFE10C27B52E3E21D29185FC64526DC3B80C108" +
212+ "548E956E9DBDDC7B23D100C17715AEE163" ;
213+
214+ const string DetachedIndefiniteHex =
215+ "D8628440A0F6818346A20126029FFFA05840FC954ABD1611F7C6EEDD7FE71C3F" +
216+ "62821AD46ED1988500F3309D0C607F0F151A69D0FC7BC968B2C36AEE68AC2B9A" +
217+ "9580DFE1244F6E5F834183497F21EA5900C1" ;
218+
219+ string inputHex = ( detached , useIndefiniteLength ) switch
220+ {
221+ ( false , false ) => AttachedDefiniteHex ,
222+ ( false , true ) => AttachedIndefiniteHex ,
223+ ( true , false ) => DetachedDefiniteHex ,
224+ ( true , true ) => DetachedIndefiniteHex ,
225+ } ;
226+
227+ AssertExtensions . ThrowsContains < CryptographicException > (
228+ ( ) => CoseMessage . DecodeMultiSign ( ByteUtils . HexToByteArray ( inputHex ) ) ,
229+ "Critical Headers must be a CBOR array of at least one element." ) ;
230+ }
231+
232+ [ Theory ]
233+ [ InlineData ( true , true ) ]
234+ [ InlineData ( true , false ) ]
235+ [ InlineData ( false , false ) ]
236+ [ InlineData ( false , true ) ]
237+ public void DecodeMultiSignThrowsIfCriticalHeaderIsOfUnknownType ( bool detached , bool useIndefiniteLength )
238+ {
239+ const string AttachedDefiniteHex =
240+ "D8628440A054546869732069732074686520636F6E74656E742E818347A20126" +
241+ "0281412AA05840FCAFEDBE41693C7BA43FB58E2CF06182BE1BF340122CC5AFD4" +
242+ "F59172C7E95166FF8E98FE9A0C2BEFEA135FD800DE6CA9A281D49B141CB93B17" +
243+ "D992E693540F8A" ;
244+
245+ const string AttachedIndefiniteHex =
246+ "D8628440A054546869732069732074686520636F6E74656E742E818348A20126" +
247+ "029F412AFFA058400D3F4426B26007D731677D99B542E524847FF3927BCA74E4" +
248+ "1823B09D6CA57A0E107F93DFE5DB851F4CEE8C0E4AF83E3540848F026FCD761F" +
249+ "91CA2ED8D5F98134" ;
250+
251+ const string DetachedDefiniteHex =
252+ "D8628440A0F6818347A201260281412AA0584008E0EEF66622FEC926CB651E90" +
253+ "13D8628AB72581533761EDE52972FE6DFBF2C4BADB6C218E8AD1E28F8192DFB2" +
254+ "8A82A4444A74C370AEA6C63AC982EABCD52874" ;
255+
256+ const string DetachedIndefiniteHex =
257+ "D8628440A0F6818348A20126029F412AFFA05840C6DDCA2F35B7B285AB594963" +
258+ "E9DB43CBDC77842256A7D1D31704749C7446AD5A67BBC02F9DBAF8F394ECCCA7" +
259+ "8E8B63E5BB746F0205EE5732DFB2E00EBA3D5F48" ;
260+
261+ string inputHex = ( detached , useIndefiniteLength ) switch
262+ {
263+ ( false , false ) => AttachedDefiniteHex ,
264+ ( false , true ) => AttachedIndefiniteHex ,
265+ ( true , false ) => DetachedDefiniteHex ,
266+ ( true , true ) => DetachedIndefiniteHex ,
267+ } ;
268+
269+ AssertExtensions . ThrowsContains < CryptographicException > (
270+ ( ) => CoseMessage . DecodeMultiSign ( ByteUtils . HexToByteArray ( inputHex ) ) ,
271+ "Header '2' does not accept the specified value." ) ;
272+ }
147273 }
148274}
0 commit comments