public void CanReadObjectAndIgnoreRemainingData() { byte[] data = Convert.FromBase64String("pQECAzguIVggy6rAanAqDpv7VJqZVJWgUVG6jIQvURLOH9Ylf/+nyesiWCDb75V3vgcbm7P0M1pI55cc6EkopDxVV7RXKQfm/xNlNyAIoWd0ZXN0aW5n9Q=="); var map = (CborMap)CborObject.Decode(data, out int read); Assert.Equal(88, data.Length); Assert.Equal(78, read); var keys = map.Keys.Select(k => ((CborInteger)k).Value); Assert.Equal(2, ((CborInteger)map[new CborInteger(1)]).Value); Assert.Equal(-47, ((CborInteger)map[new CborInteger(3)]).Value); Assert.Equal("y6rAanAqDpv7VJqZVJWgUVG6jIQvURLOH9Ylf/+nyes=", Convert.ToBase64String(((CborByteString)map[new CborInteger(-2)]).Value)); Assert.Equal("2++Vd74HG5uz9DNaSOeXHOhJKKQ8VVe0VykH5v8TZTc=", Convert.ToBase64String(((CborByteString)map[new CborInteger(-3)]).Value)); Assert.Equal(8, ((CborInteger)map[new CborInteger(-1)]).Value); // Ensure we ignored the remaining data var encoded = map.Encode(); Assert.Equal("pQECAzguIVggy6rAanAqDpv7VJqZVJWgUVG6jIQvURLOH9Ylf/+nyesiWCDb75V3vgcbm7P0M1pI55cc6EkopDxVV7RXKQfm/xNlNyAI", Convert.ToBase64String(encoded)); Assert.Equal(78, encoded.Length); }
public void Test() { const string hexBuffer = "BF65627974657341016C64657374696E6174696F6E738151027BE4CA91F62F11794CCF66A92B7714066466726F6D58270402023B2DC2EAA3A237C9AB13E3EC0357679DB51EFB63A7DC95980AD81A90D9B0EBD30C695A1B686D65746144617461BF6B6170706C69636174696F6E6474657374FF656E6F6E63651B1E4498A9ECD5A1876A73657269616C697A65727772616469782E7061727469636C65732E6D65737361676562746F58270402023B2DC2EAA3A237C9AB13E3EC0357679DB51EFB63A7DC95980AD81A90D9B0EBD30C695A1B6776657273696F6E1864FF"; byte[] data = hexBuffer.HexToBytes(); CborObject obj = Cbor.Deserialize <CborObject>(data); Assert.NotNull(obj); Assert.Equal(8, obj.Count); }
public void ReadObject() { const string hexBuffer = "A666737472696E6763666F6F666E756D626572FB40283D70A3D70A3D64626F6F6CF5646E756C6CF6656172726179820102666F626A656374A162696401"; CborObject actualObject = Helper.Read <CborObject>(hexBuffer); Assert.NotNull(actualObject); // pairs Assert.Equal(6, actualObject.Count); // string Assert.True(actualObject.TryGetValue("string", out CborValue value)); Assert.Equal(CborValueType.String, value.Type); Assert.IsType <CborString>(value); Assert.Equal("foo", value.Value <string>()); // number Assert.True(actualObject.TryGetValue("number", out value)); Assert.Equal(CborValueType.Double, value.Type); Assert.IsType <CborDouble>(value); Assert.Equal(12.12, value.Value <double>(), 3); // bool Assert.True(actualObject.TryGetValue("bool", out value)); Assert.Equal(CborValueType.Boolean, value.Type); Assert.IsType <CborBoolean>(value); Assert.True(value.Value <bool>()); // null Assert.True(actualObject.TryGetValue("null", out value)); Assert.Equal(CborValueType.Null, value.Type); Assert.IsType <CborNull>(value); // array Assert.True(actualObject.TryGetValue("array", out value)); Assert.Equal(CborValueType.Array, value.Type); Assert.IsType <CborArray>(value); CborArray CborArray = (CborArray)value; Assert.Equal(2, CborArray.Count); Assert.Equal(1, CborArray[0].Value <double>()); Assert.Equal(2, CborArray[1].Value <double>()); // object Assert.True(actualObject.TryGetValue("object", out value)); Assert.Equal(CborValueType.Object, value.Type); Assert.IsType <CborObject>(value); CborObject cborObject = (CborObject)value; Assert.True(cborObject.TryGetValue("id", out value)); Assert.Equal(CborValueType.Positive, value.Type); Assert.Equal(1, value.Value <int>()); }
public AuthenticatorData(byte[] authData) { // Input validation if (authData is null) { throw new Fido2VerificationException("Authenticator data cannot be null"); } if (authData.Length < MinLength) { throw new Fido2VerificationException($"Authenticator data is less than the minimum structure length of {MinLength}"); } // Input parsing var reader = new MemoryReader(authData); RpIdHash = reader.ReadBytes(SHA256HashLenBytes); _flags = (AuthenticatorFlags)reader.ReadByte(); SignCount = reader.ReadUInt32BigEndian(); // Attested credential data is only present if the AT flag is set if (HasAttestedCredentialData) { // Decode attested credential data, which starts at the next byte past the minimum length of the structure. AttestedCredentialData = new AttestedCredentialData(authData.AsMemory(reader.Position), out int bytesRead); reader.Advance(bytesRead); } // Extensions data is only present if the ED flag is set if (HasExtensionsData) { // Read the CBOR object var ext = CborObject.Decode(authData.AsMemory(reader.Position), out int bytesRead); reader.Advance(bytesRead); // Encode the CBOR object back to a byte array. Extensions = new Extensions(ext.Encode()); } // There should be no bytes left over after decoding all data from the structure if (reader.RemainingBytes != 0) { throw new Fido2VerificationException("Leftover bytes decoding AuthenticatorData"); } }
public void WriteObject() { const string hexBuffer = "A666537472696E6763666F6F664E756D626572FB40283D70A3D70A3D64426F6F6CF5644E756C6CF6654172726179820102664F626A656374A162496401"; dynamic obj = new CborObject(); obj.String = "foo"; obj.Number = 12.12; obj.Bool = true; obj.Null = null; obj.Array = new[] { 1, 2 }; obj.Object = new CborObject(); obj.Object.Id = 1; Helper.TestWrite(obj, hexBuffer); }
public void CanRoundtripAttestationObject() { byte[] data = Convert.FromBase64String("o2NmbXRrYW5kcm9pZC1rZXlnYXR0U3RtdKNjYWxnJmN4NWOBWQI4MIICNDCCAdqgAwIBAgIIbP/m0XJp+h0wCgYIKoZIzj0EAwIwZTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUZJRE8yLU5FVC1MSUIxIjAgBgNVBAsTGUF1dGhlbnRpY2F0b3IgQXR0ZXN0YXRpb24xGjAYBgNVBAMTEUFuZHJvaWRLZXlUZXN0aW5nMB4XDTIxMTAyMTIxMjQyOVoXDTIxMTAyMzIxMjQyOVowZTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUZJRE8yLU5FVC1MSUIxIjAgBgNVBAsTGUF1dGhlbnRpY2F0b3IgQXR0ZXN0YXRpb24xGjAYBgNVBAMTEUFuZHJvaWRLZXlUZXN0aW5nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAErD2wtqLp3HpUsGm+08B6OuHU0g1/mfFBQp17sNcT58UEP5hRcLA6gBzYTTSKJguHHObIZKaznpgmhGuoJktQJqN0MHIwcAYKKwYBBAHWeQIBEQRiMGACAQMgAwQBAAIBAiADBAEABCABfDdfwPehWBVL2KIcBZflxAraVzzPoB2bIb9ZUqt97gQQdtUq+XMm5XeYF19E1SnYXDAKv4U9BgIEYXHajTAOoQUxAwIBAr+FPgMCAQAwCgYIKoZIzj0EAwIDSAAwRQIhAO2qKj24OmDeoraK6uQxASCTC6OFkwCX8D9HJFCuWCakAiBIsi0iTFpLWh/Q7Kh1tAtaFTLTLuxGxbd+OTm84pCzAGNzaWdYRjBEAiAeGtIfwX9z0Pxnmm4oYJtRp5RNWoxiHA79k3BabqPiWAIgCSmuGYXZUdXIcI5nc7KQfUxsrx6V9Mw+ArI3zaHj+vloYXV0aERhdGFYnv9czfK4WoSxjg1ak+qI4nnuPi5B6vqMNNQfxy6+8nRAxQAAhVLx0PHQ8dDx0PHQ8dDx0PHQABB21Sr5cybld5gXX0TVKdhcpQECAyYhWCCsPbC2ouncelSwab7TwHo64dTSDX+Z8UFCnXuw1xPnxSJYIAQ/mFFwsDqAHNhNNIomC4cc5shkprOemCaEa6gmS1AmIAGhZ3Rlc3Rpbmf1"); var @object = (CborMap)CborObject.Decode(data); Assert.Equal("android-key", ((CborTextString)@object["fmt"]).Value); Assert.Equal(158, ((CborByteString)@object["authData"]).Value.Length); var attStmt = (CborMap)@object["attStmt"]; Assert.Equal(-7, ((CborInteger)attStmt["alg"]).Value); Assert.Equal(1, ((CborArray)attStmt["x5c"]).Length); Assert.Equal(70, ((CborByteString)attStmt["sig"]).Value.Length); Assert.True(data.AsSpan().SequenceEqual(@object.Encode())); }
public void ObjectComparison() { CborObject obj1 = new CborObject { ["Boolean"] = true, ["Byte"] = 12, ["SByte"] = 13, ["Int16"] = 14, ["UInt16"] = 15, ["Int32"] = 16, ["UInt32"] = 17, ["Int64"] = 18, ["UInt64"] = 19, ["Single"] = 20.21f, ["Double"] = 22.23, ["Decimal"] = 2.71828m, ["String"] = "string", ["DateTime"] = "2014-02-21T19:00:00Z", ["Enum"] = (int)EnumTest.Value1, }; CborObject obj2 = new CborObject { ["Boolean"] = true, ["Byte"] = 12, ["SByte"] = 13, ["Int16"] = 14, ["UInt16"] = 15, ["Int32"] = 16, ["UInt32"] = 17, ["Int64"] = 18, ["UInt64"] = 19, ["Single"] = 20.21f, ["Double"] = 22.23, ["Decimal"] = 2.71828m, ["String"] = "string", ["DateTime"] = "2014-02-21T19:00:00Z", ["Enum"] = (int)EnumTest.Value1, }; Assert.Equal(0, obj1.CompareTo(obj2)); Assert.Equal(obj1, obj2); }
public void WriteObject() { const string hexBuffer = "A666737472696E6763666F6F666E756D626572FB40283D70A3D70A3D64626F6F6CF5646E756C6CF6656172726179820102666F626A656374A162696401"; CborObject obj = new CborObject { ["string"] = "foo", ["number"] = 12.12, ["bool"] = true, ["null"] = null, ["array"] = new CborArray { 1, 2 }, ["object"] = new CborObject { ["id"] = 1 }, }; Helper.TestWrite(obj, hexBuffer); }
public void ToObject() { CborObject obj = new CborObject { ["Boolean"] = true, ["Byte"] = 12, ["SByte"] = 13, ["Int16"] = 14, ["UInt16"] = 15, ["Int32"] = 16, ["UInt32"] = 17, ["Int64"] = 18, ["UInt64"] = 19, ["Single"] = 20.21f, ["Double"] = 22.23, ["Decimal"] = 2.71828m, ["String"] = "string", ["DateTime"] = "2014-02-21T19:00:00Z", ["Enum"] = (int)EnumTest.Value1, }; SimpleObject actual = obj.ToObject <SimpleObject>(); Assert.NotNull(obj); Assert.True(actual.Boolean); Assert.Equal(12, actual.Byte); Assert.Equal(13, actual.SByte); Assert.Equal(14, actual.Int16); Assert.Equal(15, actual.UInt16); Assert.Equal(16, actual.Int32); Assert.Equal(17u, actual.UInt32); Assert.Equal(18, actual.Int64); Assert.Equal(19ul, actual.UInt64); Assert.Equal(20.21f, actual.Single); Assert.Equal(22.23, actual.Double); Assert.Equal(2.71828m, actual.Decimal); Assert.Equal("string", actual.String); Assert.Equal(new DateTime(2014, 02, 21, 19, 0, 0, DateTimeKind.Utc), actual.DateTime); Assert.Equal(EnumTest.Value1, actual.Enum); }
public void FromObject() { SimpleObject obj = new SimpleObject { Boolean = true, Byte = 12, SByte = 13, Int16 = 14, UInt16 = 15, Int32 = 16, UInt32 = 17u, Int64 = 18, UInt64 = 19ul, Single = 20.21f, Double = 22.23, Decimal = 2.71828m, String = "string", DateTime = new DateTime(2014, 02, 21, 19, 0, 0, DateTimeKind.Utc), Enum = EnumTest.Value1 }; CborObject actual = CborObject.FromObject(obj); Assert.NotNull(actual); // pairs Assert.Equal(15, actual.Count); // Boolean Assert.True(actual.TryGetValue("Boolean", out CborValue value)); Assert.Equal(CborValueType.Boolean, value.Type); Assert.True(value.Value <bool>()); // Byte Assert.True(actual.TryGetValue("Byte", out value)); Assert.Equal(CborValueType.Positive, value.Type); Assert.Equal(12, value.Value <byte>()); // SByte Assert.True(actual.TryGetValue("SByte", out value)); Assert.Equal(CborValueType.Positive, value.Type); Assert.Equal(13, value.Value <sbyte>()); // Int16 Assert.True(actual.TryGetValue("Int16", out value)); Assert.Equal(CborValueType.Positive, value.Type); Assert.Equal(14, value.Value <short>()); // UInt16 Assert.True(actual.TryGetValue("UInt16", out value)); Assert.Equal(CborValueType.Positive, value.Type); Assert.Equal(15, value.Value <ushort>()); // Int32 Assert.True(actual.TryGetValue("Int32", out value)); Assert.Equal(CborValueType.Positive, value.Type); Assert.Equal(16, value.Value <int>()); // UInt32 Assert.True(actual.TryGetValue("UInt32", out value)); Assert.Equal(CborValueType.Positive, value.Type); Assert.Equal(17u, value.Value <uint>()); // Int64 Assert.True(actual.TryGetValue("Int64", out value)); Assert.Equal(CborValueType.Positive, value.Type); Assert.Equal(18L, value.Value <long>()); // UInt64 Assert.True(actual.TryGetValue("UInt64", out value)); Assert.Equal(CborValueType.Positive, value.Type); Assert.Equal(19ul, value.Value <ulong>()); // Single Assert.True(actual.TryGetValue("Single", out value)); Assert.Equal(CborValueType.Single, value.Type); Assert.Equal(20.21f, value.Value <float>()); // UInt64 Assert.True(actual.TryGetValue("Double", out value)); Assert.Equal(CborValueType.Double, value.Type); Assert.Equal(22.23, value.Value <double>()); // Decimal Assert.True(actual.TryGetValue("Decimal", out value)); Assert.Equal(CborValueType.Decimal, value.Type); Assert.Equal(2.71828m, value.Value <decimal>()); // String Assert.True(actual.TryGetValue("String", out value)); Assert.Equal(CborValueType.String, value.Type); Assert.Equal("string", value.Value <string>()); // DateTime Assert.True(actual.TryGetValue("DateTime", out value)); Assert.Equal(CborValueType.String, value.Type); Assert.Equal("2014-02-21T19:00:00Z", value.Value <string>()); // Enum Assert.True(actual.TryGetValue("Enum", out value)); Assert.Equal(CborValueType.Positive, value.Type); Assert.Equal((int)EnumTest.Value1, value.Value <int>()); }
public void ReadArray() { string hexBuffer = "8663666F6FFB40283D70A3D70A3DF5F6820102A162696401"; CborArray actualArray = Helper.Read <CborArray>(hexBuffer); Assert.NotNull(actualArray); // values Assert.Equal(6, actualArray.Count); // string CborValue actualString = actualArray[0]; Assert.NotNull(actualString); Assert.Equal(CborValueType.String, actualString.Type); Assert.IsType <CborString>(actualString); Assert.Equal("foo", actualString.Value <string>()); // number CborValue actualNumber = actualArray[1]; Assert.NotNull(actualNumber); Assert.Equal(CborValueType.Double, actualNumber.Type); Assert.IsType <CborDouble>(actualNumber); Assert.Equal(12.12, actualNumber.Value <double>(), 3); // bool CborValue actualBool = actualArray[2]; Assert.NotNull(actualBool); Assert.Equal(CborValueType.Boolean, actualBool.Type); Assert.IsType <CborBoolean>(actualBool); Assert.True(actualBool.Value <bool>()); // null CborValue actualNull = actualArray[3]; Assert.NotNull(actualNull); Assert.Equal(CborValueType.Null, actualNull.Type); // array CborValue actualArrayValue = actualArray[4]; Assert.NotNull(actualArrayValue); Assert.Equal(CborValueType.Array, actualArrayValue.Type); Assert.IsType <CborArray>(actualArrayValue); CborArray CborArray = (CborArray)actualArrayValue; Assert.Equal(2, CborArray.Count); Assert.Equal(1, CborArray[0].Value <double>()); Assert.Equal(2, CborArray[1].Value <double>()); // object CborValue actualObject = actualArray[5]; Assert.NotNull(actualObject); Assert.Equal(CborValueType.Object, actualObject.Type); Assert.IsType <CborObject>(actualObject); CborObject cborObject = (CborObject)actualObject; Assert.True(cborObject.TryGetValue("id", out CborValue value)); Assert.Equal(CborValueType.Positive, value.Type); Assert.Equal(1, value.Value <int>()); }
public CredentialPublicKey(byte[] cpk) : this((CborMap)CborObject.Decode(cpk)) { }