int init_default_conversion;
int process_mac_extensions;
- struct archive_string password;
char init_decryption;
/* Decryption buffer. */
init_traditional_PKWARE_decryption(struct archive_read *a)
{
struct zip *zip = (struct zip *)(a->format->data);
+ const char *passphrase;
const void *p;
uint8_t crcchk;
int r;
if (zip->tctx_valid)
return (ARCHIVE_OK);
- if (archive_strlen(&zip->password) == 0) {
+ passphrase = __archive_read_next_passphrase(a);
+ if (passphrase == NULL) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"Passowrd required for this entry");
return (ARCHIVE_FAILED);
/*
* Initialize ctx for Traditional PKWARE Decyption.
*/
- r = trad_enc_init(&zip->tctx, zip->password.s,
- archive_strlen(&zip->password), p, ENC_HEADER_SIZE, &crcchk);
+ r = trad_enc_init(&zip->tctx, passphrase, strlen(passphrase),
+ p, ENC_HEADER_SIZE, &crcchk);
if (crcchk != zip->entry->decdat || r != 0) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"Incorrect passowrd");
init_WinZip_AES_decryption(struct archive_read *a)
{
struct zip *zip = (struct zip *)(a->format->data);
+ const char *passphrase;
const void *p;
const uint8_t *pv;
size_t key_len, salt_len;
if (zip->cctx_valid || zip->hctx_valid)
return (ARCHIVE_OK);
- if (archive_strlen(&zip->password) == 0) {
+ passphrase = __archive_read_next_passphrase(a);
+ if (passphrase == NULL) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"Passowrd required for this entry");
return (ARCHIVE_FAILED);
goto truncated;
memset(derived_key, 0, sizeof(derived_key));
- archive_pbkdf2_sha1(zip->password.s, archive_strlen(&zip->password),
+ archive_pbkdf2_sha1(passphrase, strlen(passphrase),
p, salt_len, 1000, derived_key, key_len * 2 + 2);
/* Check password verification value. */
zip_entry = next_zip_entry;
}
}
- if (zip->password.s != NULL) {
- /* Clean password characters up. */
- memset(zip->password.s, 0, archive_strlen(&zip->password));
- archive_string_free(&zip->password);
- }
free(zip->decrypted_buffer);
if (zip->cctx_valid)
archive_decrypto_aes_ctr_release(&zip->cctx);
} else if (strcmp(key, "mac-ext") == 0) {
zip->process_mac_extensions = (val != NULL && val[0] != 0);
return (ARCHIVE_OK);
- } else if (strcmp(key, "password") == 0) {
- if (val != NULL)
- archive_strcpy(&zip->password, val);
- else
- archive_string_empty(&zip->password);
- return (ARCHIVE_OK);
}
/* Note: The "warn" return is just to inform the options
if (zip->hctx_valid)
archive_hmac_sha1_cleanup(&zip->hctx);
zip->tctx_valid = zip->cctx_valid = zip->hctx_valid = 0;
+ __archive_read_reset_passphrase(a);
/* Search ahead for the next local file header. */
__archive_read_consume(a, zip->unconsumed);
if (zip->hctx_valid)
archive_hmac_sha1_cleanup(&zip->hctx);
zip->tctx_valid = zip->cctx_valid = zip->hctx_valid = 0;
+ __archive_read_reset_passphrase(a);
/* File entries are sorted by the header offset, we should mostly
* use __archive_read_consume to advance a read point to avoid redundant
enum compression requested_compression;
int init_default_conversion;
enum encryption encryption_type;
- struct archive_string password;
#define ZIP_FLAG_AVOID_ZIP64 1
#define ZIP_FLAG_FORCE_ZIP64 2
ret = ARCHIVE_FATAL;
}
return (ret);
- } else if (strcmp(key, "password") == 0) {
- if (val == NULL || val[0] == 0) {
- archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
- "%s: password option needs its value",
- a->format_name);
- } else {
- archive_strcpy(&zip->password, val);
- ret = ARCHIVE_OK;
- }
- return (ret);
} else if (strcmp(key, "zip64") == 0) {
/*
* Bias decisions about Zip64: force them to be
}
free(zip->buf);
archive_entry_free(zip->entry);
- if (zip->password.s != NULL) {
- memset(zip->password.s, 0, archive_strlen(&zip->password));
- archive_string_free(&zip->password);
- }
if (zip->cctx_valid)
archive_encrypto_aes_ctr_release(&zip->cctx);
if (zip->hctx_valid)
init_traditional_pkware_encryption(struct archive_write *a)
{
struct zip *zip = a->format_data;
+ const char *passphrase;
uint8_t key[TRAD_HEADER_SIZE];
uint8_t key_encrypted[TRAD_HEADER_SIZE];
int ret;
- if (zip->password.s == NULL
- || archive_strlen(&zip->password) == 0) {
+ passphrase = __archive_write_get_passphrase(a);
+ if (passphrase == NULL) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
- "Encryption needs password");
+ "Encryption needs passphrase");
return ARCHIVE_FAILED;
}
if (archive_random(key, sizeof(key)-1) != ARCHIVE_OK) {
"Can't generate random number for encryption");
return ARCHIVE_FATAL;
}
- trad_enc_init(&zip->tctx, zip->password.s,
- archive_strlen(&zip->password));
+ trad_enc_init(&zip->tctx, passphrase, strlen(passphrase));
/* Set the last key code which will be used as a check code
- * for ferifying password in decryption. */
+ * for verifying passphrase in decryption. */
key[TRAD_HEADER_SIZE-1] = zip->trad_chkdat;
trad_enc_encrypt_update(&zip->tctx, key, TRAD_HEADER_SIZE,
key_encrypted, TRAD_HEADER_SIZE);
init_winzip_aes_encryption(struct archive_write *a)
{
struct zip *zip = a->format_data;
+ const char *passphrase;
size_t key_len, salt_len;
uint8_t salt[16 + 2];
uint8_t derived_key[MAX_DERIVED_KEY_BUF_SIZE];
int ret;
- if (zip->password.s == NULL
- || archive_strlen(&zip->password) == 0) {
+ passphrase = __archive_write_get_passphrase(a);
+ if (passphrase == NULL) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
- "Encryption needs password");
+ "Encryption needs passphrase");
return (ARCHIVE_FAILED);
}
if (zip->entry_encryption == ENCRYPTION_WINZIP_AES128) {
"Can't generate random number for encryption");
return (ARCHIVE_FATAL);
}
- archive_pbkdf2_sha1(zip->password.s, archive_strlen(&zip->password),
+ archive_pbkdf2_sha1(passphrase, strlen(passphrase),
salt, salt_len, 1000, derived_key, key_len * 2 + 2);
ret = archive_encrypto_aes_ctr_init(&zip->cctx, derived_key, key_len);
return;
}
assertEqualIntA(a, ARCHIVE_OK,
- archive_write_set_options(a, "zip:password=password1234"));
+ archive_write_set_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK,
archive_write_set_options(a, "zip:experimental"));
assertEqualIntA(a, ARCHIVE_OK,
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
verify_contents(a, 1, 1);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
/* Streaming reader doesn't see mode information from Central Directory. */
verify_contents(a, 0, 1);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
/* Streaming reader doesn't see mode information from Central Directory. */
verify_contents(a, 0, 0);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
verify_contents(a, 1, 1);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
verify_contents(a, 1, 0);
return;
}
assertEqualIntA(a, ARCHIVE_OK,
- archive_write_set_options(a, "zip:password=password1234"));
+ archive_write_set_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK,
archive_write_set_options(a, "zip:experimental"));
assertEqualIntA(a, ARCHIVE_OK,
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
verify_contents(a, 1, 1);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
/* Streaming reader doesn't see mode information from Central Directory. */
verify_contents(a, 0, 1);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
/* Streaming reader doesn't see mode information from Central Directory. */
verify_contents(a, 0, 0);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
verify_contents(a, 1, 1);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
verify_contents(a, 1, 0);
return;
}
assertEqualIntA(a, ARCHIVE_OK,
- archive_write_set_options(a, "zip:password=password1234"));
+ archive_write_set_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK,
archive_write_set_options(a, "zip:experimental"));
assertEqualIntA(a, ARCHIVE_OK,
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
verify_contents(a, 1, 1);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
/* Streaming reader doesn't see mode information from Central Directory. */
verify_contents(a, 0, 1);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
/* Streaming reader doesn't see mode information from Central Directory. */
verify_contents(a, 0, 0);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
verify_contents(a, 1, 1);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_set_options(a, "zip:password=password1234"));
+ archive_read_add_passphrase(a, "password1234"));
assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
verify_contents(a, 1, 0);