diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/stick20_commands.h | 634 |
1 files changed, 322 insertions, 312 deletions
diff --git a/include/stick20_commands.h b/include/stick20_commands.h index 8e758d4..86ac053 100644 --- a/include/stick20_commands.h +++ b/include/stick20_commands.h @@ -1,5 +1,6 @@ #ifndef STICK20_COMMANDS_H #define STICK20_COMMANDS_H + #include "inttypes.h" #include "command.h" #include <string> @@ -8,328 +9,337 @@ namespace nitrokey { -namespace proto { + namespace proto { /* * STICK20 protocol command ids * a superset (almost) of STICK10 */ -namespace stick20 { - - enum class PasswordKind : uint8_t { - User = 'P', - Admin = 'A' - }; - - class ChangeAdminUserPin20Current : 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 ChangeAdminUserPin20New : 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 UnlockUserPassword : Command<CommandID::UNLOCK_USER_PASSWORD> { - public: - struct CommandPayload { - uint8_t kind; - uint8_t user_new_password[20]; - std::string dissect() const { - std::stringstream ss; - ss << " user_new_password:\t" << user_new_password<< 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 : Command<CommandID::ENABLE_CRYPTED_PARI>{ - public: - struct CommandPayload { - uint8_t password[30]; // TODO check w/ firmware - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class DisableEncryptedPartition : Command<CommandID::DISABLE_CRYPTED_PARI>{ - public: - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class EnableHiddenEncryptedPartition :Command<CommandID::ENABLE_HIDDEN_CRYPTED_PARI>{ - public: - struct CommandPayload { - uint8_t password[30]; // TODO check w/ firmware - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class DisableHiddenEncryptedPartition :Command<CommandID::DISABLE_CRYPTED_PARI>{ - public: - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class EnableFirmwareUpdate :Command<CommandID::ENABLE_FIRMWARE_UPDATE>{ - public: - struct CommandPayload { - uint8_t password[30]; // TODO check w/ firmware - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class UpdatePassword :Command<CommandID::CHANGE_UPDATE_PIN>{ - public: - struct CommandPayload { - uint8_t old_password[15]; - uint8_t new_password[15]; - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class ExportFirmware :Command<CommandID::EXPORT_FIRMWARE_TO_FILE>{ - public: - struct CommandPayload { - uint8_t password[30]; - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - - class CreateNewKeys : Command<CommandID::GENERATE_NEW_KEYS> { - public: - struct CommandPayload { - uint8_t kind; - uint8_t admin_password[30]; //CS20_MAX_PASSWORD_LEN - std::string dissect() const { - std::stringstream ss; - ss << " admin_password:\t" << admin_password<< std::endl; - return ss.str(); - } - void setKindPrefixed(){ - kind = 'P'; - } - } __packed; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; - }; - - -class FillSDCardWithRandomChars :Command<CommandID::FILL_SD_CARD_WITH_RANDOM_CHARS>{ - public: - struct CommandPayload { - uint8_t volume_flag; - uint8_t password[30]; - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class SetupHiddenVolume :Command<CommandID::SEND_HIDDEN_VOLUME_SETUP>{ - public: - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class SendPasswordMatrix :Command<CommandID::SEND_PASSWORD_MATRIX>{ - public: - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class SendPasswordMatrixPinData :Command<CommandID::SEND_PASSWORD_MATRIX_PINDATA>{ - public: - struct CommandPayload { - uint8_t pin_data[30]; // TODO how long actually can it be? - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class SendPasswordMatrixSetup :Command<CommandID::SEND_PASSWORD_MATRIX_SETUP>{ - public: - struct CommandPayload { - uint8_t setup_data[30]; // TODO how long actually can it be? - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; + namespace stick20 { + + enum class PasswordKind : uint8_t { + User = 'P', + Admin = 'A' + }; + + class ChangeAdminUserPin20Current : 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 ChangeAdminUserPin20New : 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 UnlockUserPassword : Command<CommandID::UNLOCK_USER_PASSWORD> { + public: + struct CommandPayload { + uint8_t kind; + uint8_t user_new_password[20]; + + std::string dissect() const { + std::stringstream ss; + ss << " user_new_password:\t" << user_new_password << 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 : Command<CommandID::ENABLE_CRYPTED_PARI> { + public: + struct CommandPayload { + uint8_t password[30]; // TODO check w/ firmware + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class DisableEncryptedPartition : Command<CommandID::DISABLE_CRYPTED_PARI> { + public: + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class EnableHiddenEncryptedPartition : Command<CommandID::ENABLE_HIDDEN_CRYPTED_PARI> { + public: + struct CommandPayload { + uint8_t password[30]; // TODO check w/ firmware + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class DisableHiddenEncryptedPartition : Command<CommandID::DISABLE_CRYPTED_PARI> { + public: + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class EnableFirmwareUpdate : Command<CommandID::ENABLE_FIRMWARE_UPDATE> { + public: + struct CommandPayload { + uint8_t password[30]; // TODO check w/ firmware + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class UpdatePassword : Command<CommandID::CHANGE_UPDATE_PIN> { + public: + struct CommandPayload { + uint8_t old_password[15]; + uint8_t new_password[15]; + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class ExportFirmware : Command<CommandID::EXPORT_FIRMWARE_TO_FILE> { + public: + struct CommandPayload { + uint8_t password[30]; + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class CreateNewKeys : Command<CommandID::GENERATE_NEW_KEYS> { + public: + struct CommandPayload { + uint8_t kind; + uint8_t admin_password[30]; //CS20_MAX_PASSWORD_LEN + std::string dissect() const { + std::stringstream ss; + ss << " admin_password:\t" << admin_password << std::endl; + return ss.str(); + } + + void setKindPrefixed() { + kind = 'P'; + } + } __packed; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + + class FillSDCardWithRandomChars : Command<CommandID::FILL_SD_CARD_WITH_RANDOM_CHARS> { + public: + struct CommandPayload { + uint8_t volume_flag; + uint8_t password[30]; + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class SetupHiddenVolume : Command<CommandID::SEND_HIDDEN_VOLUME_SETUP> { + public: + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class SendPasswordMatrix : Command<CommandID::SEND_PASSWORD_MATRIX> { + public: + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class SendPasswordMatrixPinData : Command<CommandID::SEND_PASSWORD_MATRIX_PINDATA> { + public: + struct CommandPayload { + uint8_t pin_data[30]; // TODO how long actually can it be? + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class SendPasswordMatrixSetup : Command<CommandID::SEND_PASSWORD_MATRIX_SETUP> { + public: + struct CommandPayload { + uint8_t setup_data[30]; // TODO how long actually can it be? + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; #define d(x) ss << " "#x":\t" << (int)x << std::endl; - class GetDeviceStatus : Command<CommandID::GET_DEVICE_STATUS> { - public: - static const int OUTPUT_CMD_RESULT_STICK20_STATUS_START = 20 +1; - static const int payload_absolute_begin = 8; - static const int padding_size = OUTPUT_CMD_RESULT_STICK20_STATUS_START - payload_absolute_begin; - struct ResponsePayload { - uint8_t _padding[padding_size]; //TODO confirm padding in Storage firmware - //data starts from 21st byte of packet -> 13th byte of payload - uint8_t command_counter; - uint8_t last_command; - uint8_t status; - uint8_t progress_bar_value; - bool isValid() const { return true; } - - std::string dissect() const { - std::stringstream ss; - d(command_counter); - d(last_command); - d(status); - d(progress_bar_value); - ss << "_padding:\t" - << ::nitrokey::misc::hexdump((const char *)(_padding), - sizeof _padding); - return ss.str(); - } - } __packed; - - typedef Transaction<command_id(), struct EmptyPayload, struct ResponsePayload> - CommandTransaction; - }; - - -class SendPassword :Command<CommandID::SEND_PASSWORD>{ - public: - struct CommandPayload { - uint8_t password[30]; - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class SendNewPassword :Command<CommandID::SEND_NEW_PASSWORD>{ - public: - struct CommandPayload { - uint8_t password[30]; - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; + class GetDeviceStatus : Command<CommandID::GET_DEVICE_STATUS> { + public: + static const int OUTPUT_CMD_RESULT_STICK20_STATUS_START = 20 + 1; + static const int payload_absolute_begin = 8; + static const int padding_size = OUTPUT_CMD_RESULT_STICK20_STATUS_START - payload_absolute_begin; + + struct ResponsePayload { + uint8_t _padding[padding_size]; //TODO confirm padding in Storage firmware + //data starts from 21st byte of packet -> 13th byte of payload + uint8_t command_counter; + uint8_t last_command; + uint8_t status; + uint8_t progress_bar_value; + + bool isValid() const { return true; } + + std::string dissect() const { + std::stringstream ss; + d(command_counter); + d(last_command); + d(status); + d(progress_bar_value); + ss << "_padding:\t" + << ::nitrokey::misc::hexdump((const char *) (_padding), + sizeof _padding); + return ss.str(); + } + } __packed; + + typedef Transaction<command_id(), struct EmptyPayload, struct ResponsePayload> + CommandTransaction; + }; + + + class SendPassword : Command<CommandID::SEND_PASSWORD> { + public: + struct CommandPayload { + uint8_t password[30]; + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class SendNewPassword : Command<CommandID::SEND_NEW_PASSWORD> { + public: + struct CommandPayload { + uint8_t password[30]; + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; // TODO fix original nomenclature -class SendSetReadonlyToUncryptedVolume :Command<CommandID::ENABLE_READWRITE_UNCRYPTED_LUN>{ - public: - struct CommandPayload { - uint8_t password[30]; - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class SendSetReadwriteToUncryptedVolume :Command<CommandID::ENABLE_READWRITE_UNCRYPTED_LUN>{ - public: - struct CommandPayload { - uint8_t password[30]; - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class SendClearNewSdCardFound :Command<CommandID::CLEAR_NEW_SD_CARD_FOUND>{ - public: - struct CommandPayload { - uint8_t password[30]; - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class SendStartup :Command<CommandID::SEND_STARTUP>{ - public: - struct CommandPayload { - uint64_t localtime; // POSIX - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class SendHiddenVolumeSetup :Command<CommandID::SEND_HIDDEN_VOLUME_SETUP>{ - public: - struct CommandPayload { - // TODO HiddenVolumeSetup_tst type - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class LockFirmware :Command<CommandID::SEND_LOCK_STICK_HARDWARE>{ - public: - struct CommandPayload { - uint8_t password[30]; - }; - - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; - -class ProductionTest :Command<CommandID::PRODUCTION_TEST>{ - public: - typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> - CommandTransaction; -}; -} -} + class SendSetReadonlyToUncryptedVolume : Command<CommandID::ENABLE_READWRITE_UNCRYPTED_LUN> { + public: + struct CommandPayload { + uint8_t password[30]; + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class SendSetReadwriteToUncryptedVolume : Command<CommandID::ENABLE_READWRITE_UNCRYPTED_LUN> { + public: + struct CommandPayload { + uint8_t password[30]; + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class SendClearNewSdCardFound : Command<CommandID::CLEAR_NEW_SD_CARD_FOUND> { + public: + struct CommandPayload { + uint8_t password[30]; + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class SendStartup : Command<CommandID::SEND_STARTUP> { + public: + struct CommandPayload { + uint64_t localtime; // POSIX + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class SendHiddenVolumeSetup : Command<CommandID::SEND_HIDDEN_VOLUME_SETUP> { + public: + struct CommandPayload { + // TODO HiddenVolumeSetup_tst type + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class LockFirmware : Command<CommandID::SEND_LOCK_STICK_HARDWARE> { + public: + struct CommandPayload { + uint8_t password[30]; + }; + + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + + class ProductionTest : Command<CommandID::PRODUCTION_TEST> { + public: + typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload> + CommandTransaction; + }; + } + } } #endif |