static IHidOutputReport ToOutputReport(IHidDevice device, ContinuationPacket continuation) { var report = device.CreateOutputReport(); continuation.WriteTo(report.Data); return(report); }
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)); }
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)); }