/* U2FDevice - A program to allow Raspberry Pi Zeros to act as U2F tokens Copyright (C) 2018 Michael Kuc This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "Controller.hpp" #include "u2f.hpp" #include #include "IO.hpp" #include "LED.hpp" using namespace std; Controller::Controller(const uint32_t startChannel) : channels{}, currChannel{ startChannel } {} void Controller::handleTransaction() { try { if (channels.size() != 0 && chrono::duration_cast(chrono::system_clock::now() - lastMessage) < 5s) toggleACTLED(); else enableACTLED(false); } catch (runtime_error) {} auto msg = U2FMessage::readNonBlock(); if (!msg) return; lastMessage = chrono::system_clock::now(); auto opChannel = msg->cid; if (msg->cmd == U2FHID_INIT) { opChannel = nextChannel(); auto channel = Channel{ opChannel }; try { channels.emplace(opChannel, channel); //In case of wrap-around replace existing one } catch (...) { channels.insert(make_pair(opChannel, channel)); } } channels.at(opChannel).handle(msg); } uint32_t Controller::nextChannel() { do currChannel++; while (currChannel == 0xFFFFFFFF || currChannel == 0); return currChannel; }