Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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");
            }
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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))
 {
 }