summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NK_C_API.cc7
-rw-r--r--NK_C_API.h2
-rw-r--r--NitrokeyManager.cc21
-rw-r--r--include/NitrokeyManager.h3
-rw-r--r--include/stick10_commands.h15
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){
diff --git a/NK_C_API.h b/NK_C_API.h
index 28bc0fa..db441c4 100644
--- a/NK_C_API.h
+++ b/NK_C_API.h
@@ -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>