コード例 #1
0
        static IHidOutputReport ToOutputReport(IHidDevice device, ContinuationPacket continuation)
        {
            var report = device.CreateOutputReport();

            continuation.WriteTo(report.Data);
            return(report);
        }
コード例 #2
0
        public static async Task <FidoU2FHidMessage> ReadFidoU2FHidMessageAsync([NotNull] this IHidDevice device, CancellationToken cancellationToken)
        {
            if (device == null)
            {
                throw new ArgumentNullException(nameof(device));
            }

            var initReport = await device.GetInputReportAsync(cancellationToken);

            var init = InitializationPacket.ReadFrom(initReport.Data);

            var  dataSizeReceived = init.Data.Count;
            var  continuations    = new List <ContinuationPacket>();
            byte index            = 0;

            while (dataSizeReceived < init.PayloadLength)
            {
                var continuationReport = await device.GetInputReportAsync(cancellationToken);

                var continuation = ContinuationPacket.ReadFrom(continuationReport.Data, init.PayloadLength - dataSizeReceived);
                if (continuation.PaketSequence != index)
                {
                    throw new InvalidSequenceNumberException(continuationReport.Data,
                                                             $"The sequence number isn't the expected one, expected {index} but read {continuation.PaketSequence}");
                }
                continuations.Add(continuation);
                dataSizeReceived += continuation.Data.Count;
                index            += 1;
            }

            return(BuildMessage(init, continuations));
        }
コード例 #3
0
        static Tuple <InitializationPacket, List <ContinuationPacket> > MakeOutputPackets(
            int paketLength, FidoU2FHidMessage message)
        {
            var availableInInit         = paketLength - InitializationPacket.NoDataSize;
            var availableInContinuation = paketLength - ContinuationPacket.NoDataSize;
            var data = message.Data;

            var init = new InitializationPacket
            {
                ChannelIdentifier = message.Channel,
                CommandIdentifier = (byte)message.Command,
                PayloadLength     = (ushort)data.Count,
                Data = new ArraySegment <byte>(data.Array, data.Offset,
                                               Math.Min(data.Count, availableInInit))
            };

            var  sizeHandled   = init.Data.Count;
            var  continuations = new List <ContinuationPacket>();
            byte sequence      = 0;

            while (sizeHandled < data.Count)
            {
                var continuation = new ContinuationPacket
                {
                    ChannelIdentifier = message.Channel,
                    PaketSequence     = sequence,
                    Data = new ArraySegment <byte>(data.Array, data.Offset + sizeHandled,
                                                   Math.Min(data.Count - sizeHandled, availableInContinuation))
                };

                continuations.Add(continuation);

                sizeHandled += continuation.Data.Count;
                sequence    += 1;
            }

            return(Tuple.Create(init, continuations));
        }