diff options
-rw-r--r-- | include/command_id.h | 6 | ||||
-rw-r--r-- | include/stick20_commands.h | 54 |
2 files changed, 59 insertions, 1 deletions
diff --git a/include/command_id.h b/include/command_id.h index 37aa5d2..87d270e 100644 --- a/include/command_id.h +++ b/include/command_id.h @@ -5,6 +5,9 @@ namespace nitrokey { namespace proto { +#define STICK20_CMD_START_VALUE 0x20 + + enum class CommandID : uint8_t { GET_STATUS = 0x00, WRITE_TO_SLOT = 0x01, @@ -29,6 +32,9 @@ enum class CommandID : uint8_t { CHANGE_USER_PIN = 0x14, CHANGE_ADMIN_PIN = 0x15, + STICK20_CMD_SEND_PASSWORD = STICK20_CMD_START_VALUE + 18, + STICK20_CMD_SEND_NEW_PASSWORD = STICK20_CMD_START_VALUE + 19, + ENABLE_CRYPTED_PARI = 0x20, DISABLE_CRYPTED_PARI, ENABLE_HIDDEN_CRYPTED_PARI, diff --git a/include/stick20_commands.h b/include/stick20_commands.h index b84d436..66fad15 100644 --- a/include/stick20_commands.h +++ b/include/stick20_commands.h @@ -1,15 +1,67 @@ #ifndef STICK20_COMMANDS_H #define STICK20_COMMANDS_H #include "inttypes.h" +#include "command.h" +//#include <string> +//#include <sstream> +#include "device_proto.h" + namespace nitrokey { namespace proto { /* * STICK20 protocol command ids -* a superset of STICK10 +* a superset (almost) of STICK10 */ namespace stick20 { + + enum class PasswordKind : uint8_t { + User = 'P', + Admin = 'A' + }; + + class ChangeAdminPin20Current : Command<CommandID::STICK20_CMD_SEND_PASSWORD> { + public: + struct CommandPayload { + uint8_t kind; + uint8_t old_pin[20]; + std::string dissect() const { + std::stringstream ss; + ss << " old_pin:\t" << old_pin<< std::endl; + return ss.str(); + } + void set_kind(PasswordKind k){ + kind = (uint8_t)k; + } + } __packed; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + + class ChangeAdminPin20New : Command<CommandID::STICK20_CMD_SEND_NEW_PASSWORD> { + public: + + struct CommandPayload { + uint8_t kind; + uint8_t new_pin[20]; + std::string dissect() const { + std::stringstream ss; + ss << " new_pin:\t" << new_pin<< std::endl; + return ss.str(); + } + void set_kind(PasswordKind k){ + kind = (uint8_t)k; + } + + } __packed; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + class EnableEncryptedPartition : semantics::non_constructible { public: struct CommandPayload { |