public void SetEncodedValue_KnownHeaders_ThrowIf_IncorrectValue(SetValueMethod method) { if (method == SetValueMethod.AddShortcut) { return; } var writer = new CborWriter(); writer.WriteNull(); byte[] encodedNullValue = writer.Encode(); var map = new CoseHeaderMap(); // only accepts int or tstr Assert.Throws <ArgumentException>("value", () => SetEncodedValue(map, CoseHeaderLabel.Algorithm, encodedNullValue, method)); // [ +label ] (non-empty array) Assert.Throws <ArgumentException>("value", () => SetEncodedValue(map, CoseHeaderLabel.CriticalHeaders, encodedNullValue, method)); writer.Reset(); writer.WriteStartArray(0); writer.WriteEndArray(); Assert.Throws <ArgumentException>("value", () => SetEncodedValue(map, CoseHeaderLabel.CriticalHeaders, writer.Encode(), method)); // tstr / uint Assert.Throws <ArgumentException>("value", () => SetEncodedValue(map, CoseHeaderLabel.ContentType, encodedNullValue, method)); // bstr Assert.Throws <ArgumentException>("value", () => SetEncodedValue(map, CoseHeaderLabel.KeyIdentifier, encodedNullValue, method)); }
static ReadOnlyMemory <byte> EncodeAndReset(CborWriter writer) { ReadOnlyMemory <byte> encodedValue = writer.Encode(); writer.Reset(); return(encodedValue); }
public void VerifyThrowsIfIncorrectIntegerAlgorithm(int incorrectAlg) { CoseSigner signer = GetCoseSigner(DefaultKey, DefaultHash); // Template header signer.ProtectedHeaders.Add(new CoseHeaderLabel(42), 42); string hexTemplateHeaders = "47A20126182A182A"; string hexCborMessage = Sign(s_sampleContent, signer).ByteArrayToHex(); // Creaft a encoded protected map that replaces the "Template value" map. var writer = new CborWriter(); writer.WriteStartMap(1); writer.WriteInt32(1); writer.WriteInt32(incorrectAlg); writer.WriteEndMap(); byte[] newMap = writer.Encode(); writer.Reset(); writer.WriteByteString(newMap); string hexNewMap = writer.Encode().ByteArrayToHex(); hexCborMessage = ReplaceFirst(hexCborMessage, hexTemplateHeaders, hexNewMap); CoseMessage msg = Decode(ByteUtils.HexToByteArray(hexCborMessage)); Assert.Throws <CryptographicException>(() => Verify(msg, DefaultKey, s_sampleContent)); }
public static void Reset_NonTrivialWriter_HappyPath() { // Set up: build a nontrivial writer state. // Favor maps and Ctap2 canonicalization since // since that utilizes most of the moving parts. var writer = new CborWriter(conformanceMode: CborConformanceMode.Ctap2Canonical); for (int i = 0; i < 10; i++) { if (i % 2 == 0) { writer.WriteStartMap(100); } else { writer.WriteStartArray(100); } } writer.WriteStartMap(3); writer.WriteInt32(1); // key writer.WriteInt32(2); // value writer.WriteInt32(-1); // key writer.WriteInt32(1); // value // End set up Assert.Equal(11, writer.CurrentDepth); Assert.True(writer.BytesWritten > 11, "must have written a nontrivial number of bytes to the buffer"); writer.Reset(); Assert.Equal(0, writer.CurrentDepth); Assert.Equal(0, writer.BytesWritten); // Write an object from scratch and validate that it is correct writer.WriteInt32(42); Assert.Equal(new byte[] { 0x18, 0x2a }, writer.Encode()); }
public void WriteCoseKey(ECDsaCosePublicKey publicKey) { _ctap2Writer.Reset(); _ctap2Writer.WriteECParametersAsCosePublicKey(publicKey.ECParameters, publicKey.HashAlgorithmName); _ctap2Writer.Encode(_writeBuffer); }