diff options
| -rw-r--r-- | NK_C_API.cc | 7 | ||||
| -rw-r--r-- | NK_C_API.h | 2 | ||||
| -rw-r--r-- | NitrokeyManager.cc | 21 | ||||
| -rw-r--r-- | include/NitrokeyManager.h | 3 | ||||
| -rw-r--r-- | include/stick10_commands.h | 15 | 
5 files changed, 40 insertions, 8 deletions
| diff --git a/NK_C_API.cc b/NK_C_API.cc index cc35794..4d9b17e 100644 --- a/NK_C_API.cc +++ b/NK_C_API.cc @@ -28,7 +28,7 @@ extern uint32_t NK_get_hotp_code(uint8_t slot_number){  extern uint32_t NK_get_totp_code(uint8_t slot_number, uint64_t challenge, uint64_t last_totp_time,                                   uint8_t last_interval){      auto m = NitrokeyManager::instance(); -    return m->get_TOTP_code(slot_number, 0, 0, 0); +    return m->get_TOTP_code(slot_number, challenge, last_totp_time, last_interval);  }  extern int NK_erase_hotp_slot(uint8_t slot_number) { @@ -46,9 +46,10 @@ extern int NK_write_hotp_slot(uint8_t slot_number, const char *slot_name, const      return m->write_HOTP_slot(slot_number, slot_name, secret, hotp_counter, temporary_password);  } -extern int NK_write_totp_slot(uint8_t slot_number, const char *secret, uint16_t time_window) { +extern int NK_write_totp_slot(uint8_t slot_number, const char *slot_name, const char *secret, uint16_t time_window, +                              const char *temporary_password) {      auto m = NitrokeyManager::instance(); -    return m->write_TOTP_slot(slot_number, secret, time_window); +    return m->write_TOTP_slot(slot_number, slot_name, secret, time_window, temporary_password);  }  extern const char* NK_get_totp_slot_name(uint8_t slot_number){ @@ -16,7 +16,7 @@ extern const char * NK_get_totp_slot_name(uint8_t slot_number);  extern const char * NK_get_hotp_slot_name(uint8_t slot_number);  extern int NK_erase_slot(uint8_t slot_number);  extern int NK_write_hotp_slot(uint8_t slot_number, const char *slot_name, const char *secret, uint8_t hotp_counter, const char *temporary_password); -extern int NK_write_totp_slot(uint8_t slot_number, const char *secret, uint16_t time_window); +extern int NK_write_totp_slot(uint8_t slot_number, const char *slot_name, const char *secret, uint16_t time_window, const char *temporary_password);  extern uint32_t NK_get_hotp_code(uint8_t slot_number);  extern uint32_t NK_get_totp_code(uint8_t slot_number, uint64_t challenge, uint64_t last_totp_time, uint8_t last_interval);  } diff --git a/NitrokeyManager.cc b/NitrokeyManager.cc index 6058cbb..5955330 100644 --- a/NitrokeyManager.cc +++ b/NitrokeyManager.cc @@ -8,7 +8,7 @@ namespace nitrokey{      void initialize(T& st){ bzero(&st, sizeof(st)); }      template <typename T> -    auto get_payload(){ +    typename T::CommandPayload get_payload(){          //Create, initialize and return by value command payload          typename T::CommandPayload st;          bzero(&st, sizeof(st)); @@ -119,9 +119,26 @@ namespace nitrokey{          return false;      } -    bool NitrokeyManager::write_TOTP_slot(uint8_t slot_number, const char *secret, uint16_t time_window) { +    bool NitrokeyManager::write_TOTP_slot(uint8_t slot_number, const char *slot_name, const char *secret, +                                              uint16_t time_window, const char *temporary_password) {          assert(is_valid_totp_slot_number(slot_number)); +        assert(strlen(secret)==20); //160 bits +        assert(strlen(slot_name)<=15); +          slot_number = get_internal_slot_number_for_totp(slot_number); +        auto payload = get_payload<WriteToTOTPSlot>(); +        payload.slot_number = slot_number; +        strcpy((char *) payload.slot_secret, secret); +        strcpy((char *) payload.slot_name, slot_name); +        payload.slot_interval = time_window; //FIXME naming +        payload.slot_config; //TODO + +        auto auth = get_payload<Authorize>(); +        strcpy((char *) (auth.temporary_password), temporary_password); +        auth.crc_to_authorize = WriteToTOTPSlot::CommandTransaction::getCRC(payload); +        Authorize::CommandTransaction::run(*device, auth); + +        auto resp = WriteToTOTPSlot::CommandTransaction::run(*device, payload);          return false;      } diff --git a/include/NitrokeyManager.h b/include/NitrokeyManager.h index 37b628d..551bea7 100644 --- a/include/NitrokeyManager.h +++ b/include/NitrokeyManager.h @@ -20,7 +20,8 @@ namespace nitrokey {          bool authorize(const char *pin, const char *temporary_password);          bool write_HOTP_slot(uint8_t slot_number, const char *slot_name, const char *secret, uint64_t hotp_counter,                                       const char *temporary_password); -        bool write_TOTP_slot(uint8_t slot_number, const char *secret, uint16_t time_window); +        bool write_TOTP_slot(uint8_t slot_number, const char *slot_name, const char *secret, +                                     uint16_t time_window, const char *temporary_password);          uint32_t get_HOTP_code(uint8_t slot_number);          uint32_t get_TOTP_code(uint8_t slot_number, uint64_t challenge, uint64_t last_totp_time,                                         uint8_t last_interval); diff --git a/include/stick10_commands.h b/include/stick10_commands.h index d15ee73..13842fb 100644 --- a/include/stick10_commands.h +++ b/include/stick10_commands.h @@ -116,7 +116,20 @@ class WriteToTOTPSlot : Command<CommandID::WRITE_TO_SLOT> {      uint8_t slot_token_id[13];      uint16_t slot_interval; -    bool isValid() const { return !(slot_number & 0xF0); } +    bool isValid() const { return !(slot_number & 0xF0); } //TODO check +      std::string dissect() const { +          std::stringstream ss; +          ss << "slot_number:\t" << (int)(slot_number) << std::endl; +          ss << "slot_name:\t" << slot_name << std::endl; +          ss << "slot_secret:\t" << slot_secret << std::endl; +          ss << "slot_config:\t" << std::bitset<8>((int)slot_config) << std::endl; +          ss << "slot_token_id:\t"; +          for (auto i : slot_token_id) +              ss << std::hex << std::setw(2) << std::setfill('0')<< (int) i << " " ; +          ss << std::endl; +          ss << "slot_interval:\t" << (int)slot_interval << std::endl; +          return ss.str(); +      }    } __packed;    typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> | 
