Rizin
unix-like reverse engineering framework and cli tools
zip_file_set_encryption.c File Reference
#include "zipint.h"
#include <stdlib.h>
#include <string.h>

Go to the source code of this file.

Functions

ZIP_EXTERN int zip_file_set_encryption (zip_t *za, zip_uint64_t idx, zip_uint16_t method, const char *password)
 

Function Documentation

◆ zip_file_set_encryption()

ZIP_EXTERN int zip_file_set_encryption ( zip_t za,
zip_uint64_t  idx,
zip_uint16_t  method,
const char *  password 
)

Definition at line 41 of file zip_file_set_encryption.c.

41  {
42  zip_entry_t *e;
43  zip_uint16_t old_method;
44 
45  if (idx >= za->nentry) {
47  return -1;
48  }
49 
50  if (ZIP_IS_RDONLY(za)) {
52  return -1;
53  }
54 
57  return -1;
58  }
59 
60  e = za->entry + idx;
61 
62  old_method = (e->orig == NULL ? ZIP_EM_NONE : e->orig->encryption_method);
63 
64  if (method == old_method && password == NULL) {
65  if (e->changes) {
66  if (e->changes->changed & ZIP_DIRENT_PASSWORD) {
67  _zip_crypto_clear(e->changes->password, strlen(e->changes->password));
68  free(e->changes->password);
69  e->changes->password = (e->orig == NULL ? NULL : e->orig->password);
70  }
71  e->changes->changed &= ~(ZIP_DIRENT_ENCRYPTION_METHOD | ZIP_DIRENT_PASSWORD);
72  if (e->changes->changed == 0) {
73  _zip_dirent_free(e->changes);
74  e->changes = NULL;
75  }
76  }
77  }
78  else {
79  char *our_password = NULL;
80 
81  if (password) {
82  if ((our_password = strdup(password)) == NULL) {
84  return -1;
85  }
86  }
87 
88  if (e->changes == NULL) {
89  if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) {
90  if (our_password) {
91  _zip_crypto_clear(our_password, strlen(our_password));
92  }
93  free(our_password);
95  return -1;
96  }
97  }
98 
99  e->changes->encryption_method = method;
100  e->changes->changed |= ZIP_DIRENT_ENCRYPTION_METHOD;
101  if (password) {
102  e->changes->password = our_password;
103  e->changes->changed |= ZIP_DIRENT_PASSWORD;
104  }
105  else {
106  if (e->changes->changed & ZIP_DIRENT_PASSWORD) {
107  _zip_crypto_clear(e->changes->password, strlen(e->changes->password));
108  free(e->changes->password);
109  e->changes->password = e->orig ? e->orig->password : NULL;
110  e->changes->changed &= ~ZIP_DIRENT_PASSWORD;
111  }
112  }
113  }
114 
115  return 0;
116 }
#define e(frag)
#define NULL
Definition: cris-opc.c:27
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
ZIP_EXTERN void zip_error_set(zip_error_t *_Nullable, int, int)
Definition: zip_error.c:126
#define ZIP_ER_MEMORY
Definition: zip.h:119
#define ZIP_ER_ENCRNOTSUPP
Definition: zip.h:129
#define ZIP_EM_NONE
Definition: zip.h:177
#define ZIP_ER_RDONLY
Definition: zip.h:130
#define ZIP_ER_INVAL
Definition: zip.h:123
return strdup("=SP r13\n" "=LR r14\n" "=PC r15\n" "=A0 r0\n" "=A1 r1\n" "=A2 r2\n" "=A3 r3\n" "=ZF zf\n" "=SF nf\n" "=OF vf\n" "=CF cf\n" "=SN or0\n" "gpr lr .32 56 0\n" "gpr pc .32 60 0\n" "gpr cpsr .32 64 0 ____tfiae_________________qvczn\n" "gpr or0 .32 68 0\n" "gpr tf .1 64.5 0 thumb\n" "gpr ef .1 64.9 0 endian\n" "gpr jf .1 64.24 0 java\n" "gpr qf .1 64.27 0 sticky_overflow\n" "gpr vf .1 64.28 0 overflow\n" "gpr cf .1 64.29 0 carry\n" "gpr zf .1 64.30 0 zero\n" "gpr nf .1 64.31 0 negative\n" "gpr itc .4 64.10 0 if_then_count\n" "gpr gef .4 64.16 0 great_or_equal\n" "gpr r0 .32 0 0\n" "gpr r1 .32 4 0\n" "gpr r2 .32 8 0\n" "gpr r3 .32 12 0\n" "gpr r4 .32 16 0\n" "gpr r5 .32 20 0\n" "gpr r6 .32 24 0\n" "gpr r7 .32 28 0\n" "gpr r8 .32 32 0\n" "gpr r9 .32 36 0\n" "gpr r10 .32 40 0\n" "gpr r11 .32 44 0\n" "gpr r12 .32 48 0\n" "gpr r13 .32 52 0\n" "gpr r14 .32 56 0\n" "gpr r15 .32 60 0\n" "gpr r16 .32 64 0\n" "gpr r17 .32 68 0\n")
int idx
Definition: setup.py:197
Definition: zipint.h:408
zip_error_t error
Definition: zipint.h:281
zip_entry_t * entry
Definition: zipint.h:294
zip_uint64_t nentry
Definition: zipint.h:292
zip_dirent_t * _zip_dirent_clone(const zip_dirent_t *sde)
Definition: zip_dirent.c:215
void _zip_dirent_free(zip_dirent_t *zde)
Definition: zip_dirent.c:258
zip_encryption_implementation _zip_get_encryption_implementation(zip_uint16_t em, int operation)
uint16_t zip_uint16_t
Definition: zipconf.h:35
#define ZIP_CODEC_ENCODE
Definition: zipint.h:108
#define ZIP_DIRENT_PASSWORD
Definition: zipint.h:323
#define ZIP_IS_RDONLY(za)
Definition: zipint.h:479
#define _zip_crypto_clear(b, l)
Definition: zipint.h:489
#define ZIP_DIRENT_ENCRYPTION_METHOD
Definition: zipint.h:322
zip_t * za
Definition: ziptool.c:79

References _zip_crypto_clear, _zip_dirent_clone(), _zip_dirent_free(), _zip_get_encryption_implementation(), e, zip::entry, zip::error, free(), setup::idx, zip::nentry, NULL, strdup(), za, ZIP_CODEC_ENCODE, ZIP_DIRENT_ENCRYPTION_METHOD, ZIP_DIRENT_PASSWORD, ZIP_EM_NONE, ZIP_ER_ENCRNOTSUPP, ZIP_ER_INVAL, ZIP_ER_MEMORY, ZIP_ER_RDONLY, zip_error_set(), and ZIP_IS_RDONLY.

Referenced by set_file_encryption().