guido+libpws@0: /* guido+libpws@0: * Copyright (C) 2015 Guido Berhoerster guido+libpws@0: * guido+libpws@0: * Permission is hereby granted, free of charge, to any person obtaining guido+libpws@0: * a copy of this software and associated documentation files (the guido+libpws@0: * "Software"), to deal in the Software without restriction, including guido+libpws@0: * without limitation the rights to use, copy, modify, merge, publish, guido+libpws@0: * distribute, sublicense, and/or sell copies of the Software, and to guido+libpws@0: * permit persons to whom the Software is furnished to do so, subject to guido+libpws@0: * the following conditions: guido+libpws@0: * guido+libpws@0: * The above copyright notice and this permission notice shall be included guido+libpws@0: * in all copies or substantial portions of the Software. guido+libpws@0: * guido+libpws@0: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, guido+libpws@0: * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF guido+libpws@0: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. guido+libpws@0: * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY guido+libpws@0: * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, guido+libpws@0: * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE guido+libpws@0: * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. guido+libpws@0: */ guido+libpws@0: guido+libpws@0: #ifndef PWS_H guido+libpws@0: #define PWS_H guido+libpws@0: guido+libpws@0: #ifdef __cplusplus guido+libpws@0: extern "C" { guido+libpws@0: #endif /* __cplusplus */ guido+libpws@0: guido+libpws@0: #include guido+libpws@0: #include guido+libpws@0: #include guido+libpws@0: guido+libpws@0: #define LIBPWS_VERSION_MAJOR 1 guido+libpws@0: #define LIBPWS_VERSION_MINOR 0 guido+libpws@0: #define LIBPWS_VERSION_MICRO 0 guido+libpws@0: guido+libpws@11: #define PWS3_VERSION 0x030E guido+libpws@0: guido+libpws@0: #define PWS3_MAX_FIELD_SIZE (16 * 1024) guido+libpws@0: #define PWS3_MAX_PASSWORD_LEN 1023 guido+libpws@0: #define PWS3_UUID_SIZE 16 guido+libpws@0: guido+libpws@0: struct pws3_field; guido+libpws@0: struct pws3_record; guido+libpws@0: struct pws3_file; guido+libpws@0: guido+libpws@0: enum pws_error_code { guido+libpws@0: PWS_ERR_GENERIC_ERROR, guido+libpws@0: PWS_ERR_NO_MEMORY, guido+libpws@0: PWS_ERR_IO_ERROR, guido+libpws@0: PWS_ERR_TRUNCATED_FILE, guido+libpws@0: PWS_ERR_INVALID_CHECKSUM, guido+libpws@0: PWS_ERR_INVALID_RECORD, guido+libpws@0: PWS_ERR_INVALID_HEADER, guido+libpws@0: PWS_ERR_UNSUPPORTED_VERSION guido+libpws@0: }; guido+libpws@0: guido+libpws@0: enum pws_data_type { guido+libpws@0: PWS_DATA_TYPE_BYTES, guido+libpws@0: PWS_DATA_TYPE_UUID, guido+libpws@0: PWS_DATA_TYPE_TEXT, guido+libpws@0: PWS_DATA_TYPE_TIME, guido+libpws@0: PWS_DATA_TYPE_UINT8, guido+libpws@0: PWS_DATA_TYPE_UINT16, guido+libpws@0: PWS_DATA_TYPE_UINT32 guido+libpws@0: }; guido+libpws@0: guido+libpws@0: enum pws3_header_field_type { guido+libpws@0: PWS3_HEADER_FIELD_VERSION, /* 0x00 */ guido+libpws@0: PWS3_HEADER_FIELD_UUID, /* 0x01 */ guido+libpws@0: PWS3_HEADER_FIELD_NON_DEFAULT_PREFERENCES, /* 0x02 */ guido+libpws@0: PWS3_HEADER_FIELD_TREE_DISPLAY_STATUS, /* 0x03 */ guido+libpws@0: PWS3_HEADER_FIELD_SAVE_TIMESTAMP, /* 0x04 */ guido+libpws@0: PWS3_HEADER_FIELD_SAVE_USER_HOST, /* 0x05 */ guido+libpws@0: PWS3_HEADER_FIELD_SAVE_APPLICATION, /* 0x06 */ guido+libpws@0: PWS3_HEADER_FIELD_SAVE_USER, /* 0x07 */ guido+libpws@0: PWS3_HEADER_FIELD_SAVE_HOST, /* 0x08 */ guido+libpws@0: PWS3_HEADER_FIELD_DATABASE_NAME, /* 0x09 */ guido+libpws@0: PWS3_HEADER_FIELD_DATABASE_DESCRIPTION, /* 0x0a */ guido+libpws@0: PWS3_HEADER_FIELD_DATABASE_FILTERS, /* 0x0b */ guido+libpws@0: PWS3_HEADER_FIELD_RESERVED_1, /* 0x0c */ guido+libpws@0: PWS3_HEADER_FIELD_RESERVED_2, /* 0x0d */ guido+libpws@0: PWS3_HEADER_FIELD_RESERVED_3, /* 0x0e */ guido+libpws@0: PWS3_HEADER_FIELD_RECENTLY_USED_ENTRIES, /* 0x0f */ guido+libpws@0: PWS3_HEADER_FIELD_NAMED_PASSWORD_POLICIES, /* 0x10 */ guido+libpws@0: PWS3_HEADER_FIELD_EMPTY_GROUPS, /* 0x11 */ guido+libpws@0: PWS3_HEADER_FIELD_YUBICO, /* 0x12 */ guido+libpws@11: PWS3_HEADER_FIELD_PASSWORD_TIMESTAMP, /* 0x13 */ guido+libpws@0: PWS3_HEADER_FIELD_END = 0xff guido+libpws@0: }; guido+libpws@0: guido+libpws@0: enum pws3_record_field_type { guido+libpws@0: PWS3_RECORD_FIELD_UUID = 0x01, guido+libpws@0: PWS3_RECORD_FIELD_GROUP, /* 0x02 */ guido+libpws@0: PWS3_RECORD_FIELD_TITLE, /* 0x03 */ guido+libpws@0: PWS3_RECORD_FIELD_USERNAME, /* 0x04 */ guido+libpws@0: PWS3_RECORD_FIELD_NOTES, /* 0x05 */ guido+libpws@0: PWS3_RECORD_FIELD_PASSWORD, /* 0x06 */ guido+libpws@0: PWS3_RECORD_FIELD_CREATION_TIME, /* 0x07 */ guido+libpws@0: PWS3_RECORD_FIELD_PASSWORD_MODIFICATION_TIME, /* 0x08 */ guido+libpws@0: PWS3_RECORD_FIELD_ACCESS_TIME, /* 0x09 */ guido+libpws@0: PWS3_RECORD_FIELD_PASSWORD_EXPIRY_TIME, /* 0x0a */ guido+libpws@0: PWS3_RECORD_FIELD_RESERVED_1, /* 0x0b */ guido+libpws@0: PWS3_RECORD_FIELD_MODIFICATION_TIME, /* 0x0c */ guido+libpws@0: PWS3_RECORD_FIELD_URL, /* 0x0d */ guido+libpws@0: PWS3_RECORD_FIELD_AUTOTYPE, /* 0x0e */ guido+libpws@0: PWS3_RECORD_FIELD_PASSWORD_HISTORY, /* 0x0f */ guido+libpws@0: PWS3_RECORD_FIELD_PASSWORD_POLICY, /* 0x10 */ guido+libpws@0: PWS3_RECORD_FIELD_PASSWORD_EXPIRY_INTERVAL, /* 0x11 */ guido+libpws@0: PWS3_RECORD_FIELD_RUN_COMMAND, /* 0x12 */ guido+libpws@0: PWS3_RECORD_FIELD_DOUBLE_CLICK_ACTION, /* 0x13 */ guido+libpws@0: PWS3_RECORD_FIELD_EMAIL_ADDRESS, /* 0x14 */ guido+libpws@0: PWS3_RECORD_FIELD_PROTECTED, /* 0x15 */ guido+libpws@0: PWS3_RECORD_FIELD_ALLOWED_PASSWORD_SYMBOLS, /* 0x16 */ guido+libpws@0: PWS3_RECORD_FIELD_SHIFT_DOUBLE_CLICK_ACTION, /* 0x17 */ guido+libpws@0: PWS3_RECORD_FIELD_PASSWORD_POLICY_NAME, /* 0x18 */ guido+libpws@0: PWS3_RECORD_FIELD_KEYBOARD_SHORTCUT, /* 0x19 */ guido+libpws@11: PWS3_RECORD_FIELD_RESERVED_2, /* 0x1a */ guido+libpws@11: PWS3_RECORD_FIELD_TWO_FACTOR_KEY, /* 0x1b */ guido+libpws@11: PWS3_RECORD_FIELD_CREDIT_CARD_NUMBER, /* 0x1c */ guido+libpws@11: PWS3_RECORD_FIELD_CREDIT_CARD_EXPIRATION, /* 0x1d */ guido+libpws@11: PWS3_RECORD_FIELD_CREDIT_CARD_VERIFICATION_VALUE, /* 0x1e */ guido+libpws@11: PWS3_RECORD_FIELD_CREDIT_CARD_PIN, /* 0x1f */ guido+libpws@11: PWS3_RECORD_FIELD_QR_CODE, /* 0x20 */ guido+libpws@11: PWS3_RECORD_FIELD_TESTING_1, /* 0xdf */ guido+libpws@0: PWS3_RECORD_FIELD_END = 0xff guido+libpws@0: }; guido+libpws@0: guido+libpws@0: int pws_init(void); guido+libpws@0: void pws_finalize(void); guido+libpws@0: void pws_set_alloc_functions(void *(*)(size_t), guido+libpws@0: void *(*)(void *, size_t), void (*)(void *, size_t), void *(*)(size_t), guido+libpws@0: void *(*)(void *, size_t), void (*)(void *, size_t)); guido+libpws@0: int pws_generate_uuid(unsigned char [static PWS3_UUID_SIZE]); guido+libpws@0: guido+libpws@0: struct pws3_field * pws3_field_create(int, uint8_t); guido+libpws@0: void pws3_field_destroy(struct pws3_field *); guido+libpws@0: int pws3_field_is_header(struct pws3_field *); guido+libpws@0: uint8_t pws3_field_get_type(struct pws3_field *); guido+libpws@0: enum pws_data_type pws3_field_get_data_type(struct pws3_field *); guido+libpws@0: int pws3_field_set_uuid(struct pws3_field *, guido+libpws@0: const unsigned char [static PWS3_UUID_SIZE]); guido+libpws@0: int pws3_field_set_text(struct pws3_field *, const char [static 1]); guido+libpws@0: int pws3_field_set_time(struct pws3_field *, time_t); guido+libpws@0: int pws3_field_set_uint8(struct pws3_field *, uint8_t); guido+libpws@0: int pws3_field_set_uint16(struct pws3_field *, uint16_t); guido+libpws@0: int pws3_field_set_uint32(struct pws3_field *, uint32_t); guido+libpws@0: int pws3_field_set_bytes(struct pws3_field *, guido+libpws@0: const unsigned char [static 1], size_t); guido+libpws@0: const unsigned char * pws3_field_get_uuid(struct pws3_field *); guido+libpws@0: const char * pws3_field_get_text(struct pws3_field *); guido+libpws@0: time_t pws3_field_get_time(struct pws3_field *); guido+libpws@0: uint8_t pws3_field_get_uint8(struct pws3_field *); guido+libpws@0: uint16_t pws3_field_get_uint16(struct pws3_field *); guido+libpws@0: uint32_t pws3_field_get_uint32(struct pws3_field *); guido+libpws@0: void pws3_field_get_bytes(struct pws3_field *, guido+libpws@0: const unsigned char **, size_t *); guido+libpws@0: guido+libpws@0: void pws3_record_destroy(struct pws3_record *); guido+libpws@0: struct pws3_record * pws3_record_create(void); guido+libpws@0: void pws3_record_set_field(struct pws3_record *, guido+libpws@0: struct pws3_field *); guido+libpws@0: struct pws3_field * pws3_record_get_field(struct pws3_record *, uint8_t); guido+libpws@0: struct pws3_field * pws3_record_remove_field(struct pws3_record *, uint8_t); guido+libpws@0: guido+libpws@0: void pws3_file_destroy(struct pws3_file *); guido+libpws@0: struct pws3_file * pws3_file_create(void); guido+libpws@0: enum pws_error_code pws3_file_get_error_code(struct pws3_file *); guido+libpws@0: const char * pws3_file_get_error_message(struct pws3_file *); guido+libpws@0: int pws3_file_read_mem(struct pws3_file *, const char *, guido+libpws@0: unsigned char *, size_t); guido+libpws@0: int pws3_file_read_stream(struct pws3_file *, const char *, FILE *); guido+libpws@0: int pws3_file_write_mem(struct pws3_file *, const char *, uint32_t, guido+libpws@0: unsigned char **, size_t *); guido+libpws@0: int pws3_file_write_stream(struct pws3_file *, const char *, guido+libpws@0: uint32_t, FILE *); guido+libpws@0: guido+libpws@0: void pws3_file_set_header_field(struct pws3_file *, guido+libpws@0: struct pws3_field *); guido+libpws@0: struct pws3_field * pws3_file_get_header_field(struct pws3_file *, uint8_t); guido+libpws@0: struct pws3_field * pws3_file_remove_header_field(struct pws3_file *, uint8_t); guido+libpws@0: guido+libpws@0: void pws3_file_insert_empty_group(struct pws3_file *, guido+libpws@0: struct pws3_field *); guido+libpws@0: struct pws3_field * pws3_file_get_empty_group(struct pws3_file *, const char *); guido+libpws@0: struct pws3_field * pws3_file_remove_empty_group(struct pws3_file *, guido+libpws@0: const char *); guido+libpws@0: struct pws3_field * pws3_file_first_empty_group(struct pws3_file *); guido+libpws@0: struct pws3_field * pws3_file_last_empty_group(struct pws3_file *); guido+libpws@0: struct pws3_field * pws3_file_next_empty_group(struct pws3_file *, guido+libpws@0: struct pws3_field *); guido+libpws@0: struct pws3_field * pws3_file_prev_empty_group(struct pws3_file *, guido+libpws@0: struct pws3_field *); guido+libpws@0: guido+libpws@0: void pws3_file_insert_record(struct pws3_file *, guido+libpws@0: struct pws3_record *); guido+libpws@0: struct pws3_record * pws3_file_get_record(struct pws3_file *, guido+libpws@0: const unsigned char [static PWS3_UUID_SIZE]); guido+libpws@0: struct pws3_record * pws3_file_remove_record(struct pws3_file *, guido+libpws@0: const unsigned char [static PWS3_UUID_SIZE]); guido+libpws@0: struct pws3_record * pws3_file_first_record(struct pws3_file *); guido+libpws@0: struct pws3_record * pws3_file_last_record(struct pws3_file *); guido+libpws@0: struct pws3_record * pws3_file_next_record(struct pws3_file *, guido+libpws@0: struct pws3_record *); guido+libpws@0: struct pws3_record * pws3_file_prev_record(struct pws3_file *, guido+libpws@0: struct pws3_record *); guido+libpws@0: guido+libpws@0: #ifdef __cplusplus guido+libpws@0: } guido+libpws@0: #endif /* __cplusplus */ guido+libpws@0: guido+libpws@0: #endif /* !PWS_H */