diff --git a/CodePush.podspec b/CodePush.podspec
index a20d1ea64..8fb376484 100644
--- a/CodePush.podspec
+++ b/CodePush.podspec
@@ -10,7 +10,7 @@ Pod::Spec.new do |s|
s.license = package['license']
s.homepage = package['homepage']
s.source = { :git => 'https://github.com/microsoft/react-native-code-push.git', :tag => "v#{s.version}"}
- s.ios.deployment_target = '9.0'
+ s.ios.deployment_target = '15.0'
s.tvos.deployment_target = '9.0'
s.preserve_paths = '*.js'
s.library = 'z'
diff --git a/ios/CodePush/SSZipArchive/Common.h b/ios/CodePush/SSZipArchive/Common.h
deleted file mode 100644
index 7a92f1344..000000000
--- a/ios/CodePush/SSZipArchive/Common.h
+++ /dev/null
@@ -1,81 +0,0 @@
-#ifndef SSZipCommon
-#define SSZipCommon
-
-/* tm_unz contain date/time info */
-typedef struct tm_unz_s
-{
- unsigned int tm_sec; /* seconds after the minute - [0,59] */
- unsigned int tm_min; /* minutes after the hour - [0,59] */
- unsigned int tm_hour; /* hours since midnight - [0,23] */
- unsigned int tm_mday; /* day of the month - [1,31] */
- unsigned int tm_mon; /* months since January - [0,11] */
- unsigned int tm_year; /* years - [1980..2044] */
-} tm_unz;
-
-typedef struct unz_file_info_s
-{
- unsigned long version; /* version made by 2 bytes */
- unsigned long version_needed; /* version needed to extract 2 bytes */
- unsigned long flag; /* general purpose bit flag 2 bytes */
- unsigned long compression_method; /* compression method 2 bytes */
- unsigned long dosDate; /* last mod file date in Dos fmt 4 bytes */
- unsigned long crc; /* crc-32 4 bytes */
- unsigned long compressed_size; /* compressed size 4 bytes */
- unsigned long uncompressed_size; /* uncompressed size 4 bytes */
- unsigned long size_filename; /* filename length 2 bytes */
- unsigned long size_file_extra; /* extra field length 2 bytes */
- unsigned long size_file_comment; /* file comment length 2 bytes */
-
- unsigned long disk_num_start; /* disk number start 2 bytes */
- unsigned long internal_fa; /* internal file attributes 2 bytes */
- unsigned long external_fa; /* external file attributes 4 bytes */
-
- tm_unz tmu_date;
-} unz_file_info;
-
-/* unz_file_info contain information about a file in the zipfile */
-typedef struct unz_file_info64_s
-{
- unsigned long version; /* version made by 2 bytes */
- unsigned long version_needed; /* version needed to extract 2 bytes */
- unsigned long flag; /* general purpose bit flag 2 bytes */
- unsigned long compression_method; /* compression method 2 bytes */
- unsigned long dosDate; /* last mod file date in Dos fmt 4 bytes */
- unsigned long crc; /* crc-32 4 bytes */
- unsigned long long compressed_size; /* compressed size 8 bytes */
- unsigned long long uncompressed_size; /* uncompressed size 8 bytes */
- unsigned long size_filename; /* filename length 2 bytes */
- unsigned long size_file_extra; /* extra field length 2 bytes */
- unsigned long size_file_comment; /* file comment length 2 bytes */
-
- unsigned long disk_num_start; /* disk number start 2 bytes */
- unsigned long internal_fa; /* internal file attributes 2 bytes */
- unsigned long external_fa; /* external file attributes 4 bytes */
-
- tm_unz tmu_date;
- unsigned long long disk_offset;
- unsigned long size_file_extra_internal;
-} unz_file_info64;
-
-typedef struct unz_global_info_s
-{
- unsigned long number_entry; /* total number of entries in
- the central dir on this disk */
-
- unsigned long number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/
-
-
- unsigned long size_comment; /* size of the global comment of the zipfile */
-} unz_global_info;
-
-typedef struct unz_global_info64
-{
- unsigned long long number_entry; /* total number of entries in
- the central dir on this disk */
-
- unsigned long number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/
-
- unsigned long size_comment; /* size of the global comment of the zipfile */
-} unz_global_info64;
-
-#endif
\ No newline at end of file
diff --git a/ios/CodePush/SSZipArchive/Info.plist b/ios/CodePush/SSZipArchive/Info.plist
new file mode 100644
index 000000000..d3de8eefb
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/Info.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(CURRENT_PROJECT_VERSION)
+ NSPrincipalClass
+
+
+
diff --git a/ios/CodePush/SSZipArchive/README.md b/ios/CodePush/SSZipArchive/README.md
index 54ad4931a..cdab69e58 100644
--- a/ios/CodePush/SSZipArchive/README.md
+++ b/ios/CodePush/SSZipArchive/README.md
@@ -1 +1 @@
-The source code in this folder is taken from [https://github.com/ZipArchive/ZipArchive/tree/35fe9b6af48527cde0b5db52287474ed3a32d75f/SSZipArchive](https://github.com/ZipArchive/ZipArchive/tree/35fe9b6af48527cde0b5db52287474ed3a32d75f/SSZipArchive) which is [MIT licensed](https://github.com/ZipArchive/ZipArchive/blob/35fe9b6af48527cde0b5db52287474ed3a32d75f/LICENSE.txt).
\ No newline at end of file
+The source code in this folder is taken from [https://github.com/ZipArchive/ZipArchive/tree/2.5.5/SSZipArchive](https://github.com/ZipArchive/ZipArchive/tree/2.5.5/SSZipArchive) which is [MIT licensed](https://github.com/ZipArchive/ZipArchive/blob/2.5.5/LICENSE.txt).
\ No newline at end of file
diff --git a/ios/CodePush/SSZipArchive/SSZipArchive.h b/ios/CodePush/SSZipArchive/SSZipArchive.h
index b18cab9f8..778746445 100644
--- a/ios/CodePush/SSZipArchive/SSZipArchive.h
+++ b/ios/CodePush/SSZipArchive/SSZipArchive.h
@@ -3,56 +3,157 @@
// SSZipArchive
//
// Created by Sam Soffes on 7/21/10.
-// Copyright (c) Sam Soffes 2010-2015. All rights reserved.
//
#ifndef _SSZIPARCHIVE_H
#define _SSZIPARCHIVE_H
#import
-#include "Common.h"
+
+#import "SSZipCommon.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+extern NSString *const SSZipArchiveErrorDomain;
+typedef NS_ENUM(NSInteger, SSZipArchiveErrorCode) {
+ SSZipArchiveErrorCodeFailedOpenZipFile = -1,
+ SSZipArchiveErrorCodeFailedOpenFileInZip = -2,
+ SSZipArchiveErrorCodeFileInfoNotLoadable = -3,
+ SSZipArchiveErrorCodeFileContentNotReadable = -4,
+ SSZipArchiveErrorCodeFailedToWriteFile = -5,
+ SSZipArchiveErrorCodeInvalidArguments = -6,
+ SSZipArchiveErrorCodeSymlinkEscapesTargetDirectory = -7,
+};
@protocol SSZipArchiveDelegate;
@interface SSZipArchive : NSObject
+// Password check
++ (BOOL)isFilePasswordProtectedAtPath:(NSString *)path;
++ (BOOL)isPasswordValidForArchiveAtPath:(NSString *)path password:(NSString *)pw error:(NSError * _Nullable * _Nullable)error NS_SWIFT_NOTHROW;
+
+// Total payload size
++ (NSNumber *)payloadSizeForArchiveAtPath:(NSString *)path error:(NSError **)error;
+
// Unzip
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination;
-+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(id)delegate;
++ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(nullable id)delegate;
+
++ (BOOL)unzipFileAtPath:(NSString *)path
+ toDestination:(NSString *)destination
+ overwrite:(BOOL)overwrite
+ password:(nullable NSString *)password
+ error:(NSError * *)error;
+
++ (BOOL)unzipFileAtPath:(NSString *)path
+ toDestination:(NSString *)destination
+ overwrite:(BOOL)overwrite
+ password:(nullable NSString *)password
+ error:(NSError * *)error
+ delegate:(nullable id)delegate NS_REFINED_FOR_SWIFT;
+
++ (BOOL)unzipFileAtPath:(NSString *)path
+ toDestination:(NSString *)destination
+ preserveAttributes:(BOOL)preserveAttributes
+ overwrite:(BOOL)overwrite
+ password:(nullable NSString *)password
+ error:(NSError * *)error
+ delegate:(nullable id)delegate;
+
++ (BOOL)unzipFileAtPath:(NSString *)path
+ toDestination:(NSString *)destination
+ progressHandler:(void (^_Nullable)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
+ completionHandler:(void (^_Nullable)(NSString *path, BOOL succeeded, NSError * _Nullable error))completionHandler;
-+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError * *)error;
-+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError * *)error delegate:(id)delegate;
++ (BOOL)unzipFileAtPath:(NSString *)path
+ toDestination:(NSString *)destination
+ overwrite:(BOOL)overwrite
+ password:(nullable NSString *)password
+ progressHandler:(void (^_Nullable)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
+ completionHandler:(void (^_Nullable)(NSString *path, BOOL succeeded, NSError * _Nullable error))completionHandler;
+ (BOOL)unzipFileAtPath:(NSString *)path
- toDestination:(NSString *)destination
- progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
- completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler;
+ toDestination:(NSString *)destination
+ preserveAttributes:(BOOL)preserveAttributes
+ overwrite:(BOOL)overwrite
+ nestedZipLevel:(NSInteger)nestedZipLevel
+ password:(nullable NSString *)password
+ error:(NSError **)error
+ delegate:(nullable id)delegate
+ progressHandler:(void (^_Nullable)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
+ completionHandler:(void (^_Nullable)(NSString *path, BOOL succeeded, NSError * _Nullable error))completionHandler;
+ (BOOL)unzipFileAtPath:(NSString *)path
- toDestination:(NSString *)destination
- overwrite:(BOOL)overwrite
- password:(NSString *)password
- progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
- completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler;
+ toDestination:(NSString *)destination
+ preserveAttributes:(BOOL)preserveAttributes
+ overwrite:(BOOL)overwrite
+ symlinksValidWithin:(nullable NSString *)symlinksValidWithin
+ nestedZipLevel:(NSInteger)nestedZipLevel
+ password:(nullable NSString *)password
+ error:(NSError **)error
+ delegate:(nullable id)delegate
+ progressHandler:(void (^_Nullable)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
+ completionHandler:(void (^_Nullable)(NSString *path, BOOL succeeded, NSError * _Nullable error))completionHandler;
// Zip
+// default compression level is Z_DEFAULT_COMPRESSION (from "zlib.h")
+// keepParentDirectory: if YES, then unzipping will give `directoryName/fileName`. If NO, then unzipping will just give `fileName`. Default is NO.
// without password
-+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths;
++ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths;
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath;
-+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirector;
-// with password, password could be nil
-+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(NSString *)password;
-+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath withPassword:(NSString *)password;
-+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory withPassword:(NSString *)password;
-
-- (instancetype)initWithPath:(NSString *)path;
-@property (NS_NONATOMIC_IOSONLY, readonly, getter = isOpen) BOOL open;
-- (BOOL)writeFile:(NSString *)path withPassword:(NSString *)password;
-- (BOOL)writeFileAtPath:(NSString *)path withFileName:(NSString *)fileName withPassword:(NSString *)password;
-- (BOOL)writeData:(NSData *)data filename:(NSString *)filename withPassword:(NSString *)password;
-@property (NS_NONATOMIC_IOSONLY, readonly, getter = isClosed) BOOL close;
++ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory;
+
+// with optional password, default encryption is AES
+// don't use AES if you need compatibility with native macOS unzip and Archive Utility
++ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(nullable NSString *)password;
++ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(nullable NSString *)password progressHandler:(void(^ _Nullable)(NSUInteger entryNumber, NSUInteger total))progressHandler;
++ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath withPassword:(nullable NSString *)password;
++ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory withPassword:(nullable NSString *)password;
++ (BOOL)createZipFileAtPath:(NSString *)path
+ withContentsOfDirectory:(NSString *)directoryPath
+ keepParentDirectory:(BOOL)keepParentDirectory
+ withPassword:(nullable NSString *)password
+ andProgressHandler:(void(^ _Nullable)(NSUInteger entryNumber, NSUInteger total))progressHandler;
++ (BOOL)createZipFileAtPath:(NSString *)path
+ withContentsOfDirectory:(NSString *)directoryPath
+ keepParentDirectory:(BOOL)keepParentDirectory
+ compressionLevel:(int)compressionLevel
+ password:(nullable NSString *)password
+ AES:(BOOL)aes
+ progressHandler:(void(^ _Nullable)(NSUInteger entryNumber, NSUInteger total))progressHandler;
+//suport symlink compress --file
++ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(nullable NSString *)password keepSymlinks:(BOOL)keeplinks;
+//suport symlink compress --directory
++ (BOOL)createZipFileAtPath:(NSString *)path
+ withContentsOfDirectory:(NSString *)directoryPath
+ keepParentDirectory:(BOOL)keepParentDirectory
+ compressionLevel:(int)compressionLevel
+ password:(nullable NSString *)password
+ AES:(BOOL)aes
+ progressHandler:(void(^ _Nullable)(NSUInteger entryNumber, NSUInteger total))progressHandler
+ keepSymlinks:(BOOL)keeplinks;
+
+- (instancetype)init NS_UNAVAILABLE;
+- (instancetype)initWithPath:(NSString *)path NS_DESIGNATED_INITIALIZER;
+- (BOOL)open;
+- (BOOL)openForAppending;
+
+/// write empty folder
+- (BOOL)writeFolderAtPath:(NSString *)path withFolderName:(NSString *)folderName withPassword:(nullable NSString *)password;
+/// write file
+- (BOOL)writeFile:(NSString *)path withPassword:(nullable NSString *)password;
+- (BOOL)writeFileAtPath:(NSString *)path withFileName:(nullable NSString *)fileName withPassword:(nullable NSString *)password;
+- (BOOL)writeFileAtPath:(NSString *)path withFileName:(nullable NSString *)fileName compressionLevel:(int)compressionLevel password:(nullable NSString *)password AES:(BOOL)aes;
+///write symlink files
+- (BOOL)writeSymlinkFileAtPath:(NSString *)path withFileName:(nullable NSString *)fileName compressionLevel:(int)compressionLevel password:(nullable NSString *)password AES:(BOOL)aes;
+/// write data
+- (BOOL)writeData:(NSData *)data filename:(nullable NSString *)filename withPassword:(nullable NSString *)password;
+- (BOOL)writeData:(NSData *)data filename:(nullable NSString *)filename compressionLevel:(int)compressionLevel password:(nullable NSString *)password AES:(BOOL)aes;
+
+- (BOOL)close;
@end
@@ -69,8 +170,9 @@
- (void)zipArchiveDidUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath unzippedFilePath:(NSString *)unzippedFilePath;
- (void)zipArchiveProgressEvent:(unsigned long long)loaded total:(unsigned long long)total;
-- (void)zipArchiveDidUnzipArchiveFile:(NSString *)zipFile entryPath:(NSString *)entryPath destPath:(NSString *)destPath;
@end
+NS_ASSUME_NONNULL_END
+
#endif /* _SSZIPARCHIVE_H */
diff --git a/ios/CodePush/SSZipArchive/SSZipArchive.m b/ios/CodePush/SSZipArchive/SSZipArchive.m
index c4491d2d0..584fc221f 100644
--- a/ios/CodePush/SSZipArchive/SSZipArchive.m
+++ b/ios/CodePush/SSZipArchive/SSZipArchive.m
@@ -3,29 +3,215 @@
// SSZipArchive
//
// Created by Sam Soffes on 7/21/10.
-// Copyright (c) Sam Soffes 2010-2015. All rights reserved.
//
-#import "SSZipArchive.h"
-#include "unzip.h"
-#include "zip.h"
-#import "zlib.h"
-#import "zconf.h"
+#import "SSZipArchive.h"
+#include "minizip/mz_compat.h"
+#include "minizip/mz_zip.h"
+#include "minizip/mz_os.h"
+#include
#include
+NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
+
#define CHUNK 16384
+int _zipOpenEntry(zipFile entry, NSString *name, const zip_fileinfo *zipfi, int level, NSString *password, BOOL aes);
+BOOL _fileIsSymbolicLink(const unz_file_info *fileInfo);
+
+#ifndef API_AVAILABLE
+// Xcode 7- compatibility
+#define API_AVAILABLE(...)
+#endif
+
+@interface NSData(SSZipArchive)
+- (NSString *)_base64RFC4648 API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0));
+- (NSString *)_hexString;
+@end
+
+@interface NSString (SSZipArchive)
+- (NSString *)_sanitizedPath;
+- (BOOL)_escapesTargetDirectory:(NSString *)targetDirectory;
+@end
+
@interface SSZipArchive ()
-+ (NSDate *)_dateWithMSDOSFormat:(UInt32)msdosDateTime;
+- (instancetype)init NS_DESIGNATED_INITIALIZER;
@end
@implementation SSZipArchive
{
+ /// path for zip file
NSString *_path;
- NSString *_filename;
zipFile _zip;
}
+#pragma mark - Password check
+
++ (BOOL)isFilePasswordProtectedAtPath:(NSString *)path {
+ // Begin opening
+ zipFile zip = unzOpen(path.fileSystemRepresentation);
+ if (zip == NULL) {
+ return NO;
+ }
+
+ BOOL passwordProtected = NO;
+ int ret = unzGoToFirstFile(zip);
+ if (ret == UNZ_OK) {
+ do {
+ ret = unzOpenCurrentFile(zip);
+ if (ret != UNZ_OK) {
+ // attempting with an arbitrary password to workaround `unzOpenCurrentFile` limitation on AES encrypted files
+ ret = unzOpenCurrentFilePassword(zip, "");
+ unzCloseCurrentFile(zip);
+ if (ret == UNZ_OK || ret == MZ_PASSWORD_ERROR) {
+ passwordProtected = YES;
+ }
+ break;
+ }
+ unz_file_info fileInfo = {};
+ ret = unzGetCurrentFileInfo(zip, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
+ unzCloseCurrentFile(zip);
+ if (ret != UNZ_OK) {
+ break;
+ } else if ((fileInfo.flag & MZ_ZIP_FLAG_ENCRYPTED) == 1) {
+ passwordProtected = YES;
+ break;
+ }
+
+ ret = unzGoToNextFile(zip);
+ } while (ret == UNZ_OK);
+ }
+
+ unzClose(zip);
+ return passwordProtected;
+}
+
++ (BOOL)isPasswordValidForArchiveAtPath:(NSString *)path password:(NSString *)pw error:(NSError **)error {
+ if (error) {
+ *error = nil;
+ }
+
+ zipFile zip = unzOpen(path.fileSystemRepresentation);
+ if (zip == NULL) {
+ if (error) {
+ *error = [NSError errorWithDomain:SSZipArchiveErrorDomain
+ code:SSZipArchiveErrorCodeFailedOpenZipFile
+ userInfo:@{NSLocalizedDescriptionKey: @"failed to open zip file"}];
+ }
+ return NO;
+ }
+
+ // Initialize passwordValid to YES (No password required)
+ BOOL passwordValid = YES;
+ int ret = unzGoToFirstFile(zip);
+ if (ret == UNZ_OK) {
+ do {
+ if (pw.length == 0) {
+ ret = unzOpenCurrentFile(zip);
+ } else {
+ ret = unzOpenCurrentFilePassword(zip, [pw cStringUsingEncoding:NSUTF8StringEncoding]);
+ }
+ if (ret != UNZ_OK) {
+ if (ret != MZ_PASSWORD_ERROR) {
+ if (error) {
+ *error = [NSError errorWithDomain:SSZipArchiveErrorDomain
+ code:SSZipArchiveErrorCodeFailedOpenFileInZip
+ userInfo:@{NSLocalizedDescriptionKey: @"failed to open file in zip archive"}];
+ }
+ }
+ passwordValid = NO;
+ break;
+ }
+ unz_file_info fileInfo = {};
+ ret = unzGetCurrentFileInfo(zip, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
+ if (ret != UNZ_OK) {
+ if (error) {
+ *error = [NSError errorWithDomain:SSZipArchiveErrorDomain
+ code:SSZipArchiveErrorCodeFileInfoNotLoadable
+ userInfo:@{NSLocalizedDescriptionKey: @"failed to retrieve info for file"}];
+ }
+ passwordValid = NO;
+ break;
+ } else if ((fileInfo.flag & 1) == 1) {
+ unsigned char buffer[10] = {0};
+ int readBytes = unzReadCurrentFile(zip, buffer, (unsigned)MIN(10UL,fileInfo.uncompressed_size));
+ if (readBytes < 0) {
+ // Let's assume error Z_DATA_ERROR is caused by an invalid password
+ // Let's assume other errors are caused by Content Not Readable
+ if (readBytes != Z_DATA_ERROR) {
+ if (error) {
+ *error = [NSError errorWithDomain:SSZipArchiveErrorDomain
+ code:SSZipArchiveErrorCodeFileContentNotReadable
+ userInfo:@{NSLocalizedDescriptionKey: @"failed to read contents of file entry"}];
+ }
+ }
+ passwordValid = NO;
+ break;
+ }
+ passwordValid = YES;
+ break;
+ }
+
+ unzCloseCurrentFile(zip);
+ ret = unzGoToNextFile(zip);
+ } while (ret == UNZ_OK);
+ }
+
+ unzClose(zip);
+ return passwordValid;
+}
+
++ (NSNumber *)payloadSizeForArchiveAtPath:(NSString *)path error:(NSError **)error {
+ if (error) {
+ *error = nil;
+ }
+
+ zipFile zip = unzOpen(path.fileSystemRepresentation);
+ if (zip == NULL) {
+ if (error) {
+ *error = [NSError errorWithDomain:SSZipArchiveErrorDomain
+ code:SSZipArchiveErrorCodeFailedOpenZipFile
+ userInfo:@{NSLocalizedDescriptionKey: @"failed to open zip file"}];
+ }
+ return @0;
+ }
+
+ unsigned long long totalSize = 0;
+ int ret = unzGoToFirstFile(zip);
+ if (ret == UNZ_OK) {
+ do {
+ ret = unzOpenCurrentFile(zip);
+ if (ret != UNZ_OK) {
+ if (error) {
+ *error = [NSError errorWithDomain:SSZipArchiveErrorDomain
+ code:SSZipArchiveErrorCodeFailedOpenFileInZip
+ userInfo:@{NSLocalizedDescriptionKey: @"failed to open file in zip archive"}];
+ }
+ break;
+ }
+ unz_file_info fileInfo = {};
+ ret = unzGetCurrentFileInfo(zip, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
+ if (ret != UNZ_OK) {
+ if (error) {
+ *error = [NSError errorWithDomain:SSZipArchiveErrorDomain
+ code:SSZipArchiveErrorCodeFileInfoNotLoadable
+ userInfo:@{NSLocalizedDescriptionKey: @"failed to retrieve info for file"}];
+ }
+ break;
+ }
+
+ totalSize += fileInfo.uncompressed_size;
+
+ unzCloseCurrentFile(zip);
+ ret = unzGoToNextFile(zip);
+ } while (ret == UNZ_OK);
+ }
+
+ unzClose(zip);
+
+ return [NSNumber numberWithUnsignedLongLong:totalSize];
+}
+
#pragma mark - Unzipping
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination
@@ -33,19 +219,24 @@ + (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination
return [self unzipFileAtPath:path toDestination:destination delegate:nil];
}
-+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error
++ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(nullable NSString *)password error:(NSError **)error
{
- return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:error delegate:nil progressHandler:nil completionHandler:nil];
+ return [self unzipFileAtPath:path toDestination:destination preserveAttributes:YES overwrite:overwrite password:password error:error delegate:nil progressHandler:nil completionHandler:nil];
}
-+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(id)delegate
++ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(nullable id)delegate
{
- return [self unzipFileAtPath:path toDestination:destination overwrite:YES password:nil error:nil delegate:delegate progressHandler:nil completionHandler:nil];
+ return [self unzipFileAtPath:path toDestination:destination preserveAttributes:YES overwrite:YES password:nil error:nil delegate:delegate progressHandler:nil completionHandler:nil];
}
-+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error delegate:(id)delegate
++ (BOOL)unzipFileAtPath:(NSString *)path
+ toDestination:(NSString *)destination
+ overwrite:(BOOL)overwrite
+ password:(nullable NSString *)password
+ error:(NSError **)error
+ delegate:(nullable id)delegate
{
- return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:error delegate:delegate progressHandler:nil completionHandler:nil];
+ return [self unzipFileAtPath:path toDestination:destination preserveAttributes:YES overwrite:overwrite password:password error:error delegate:delegate progressHandler:nil completionHandler:nil];
}
+ (BOOL)unzipFileAtPath:(NSString *)path
@@ -53,34 +244,102 @@ + (BOOL)unzipFileAtPath:(NSString *)path
overwrite:(BOOL)overwrite
password:(NSString *)password
progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
- completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler
+ completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError * _Nullable error))completionHandler
{
- return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:nil delegate:nil progressHandler:progressHandler completionHandler:completionHandler];
+ return [self unzipFileAtPath:path toDestination:destination preserveAttributes:YES overwrite:overwrite password:password error:nil delegate:nil progressHandler:progressHandler completionHandler:completionHandler];
}
+ (BOOL)unzipFileAtPath:(NSString *)path
toDestination:(NSString *)destination
- progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
- completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler
+ progressHandler:(void (^_Nullable)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
+ completionHandler:(void (^_Nullable)(NSString *path, BOOL succeeded, NSError * _Nullable error))completionHandler
{
- return [self unzipFileAtPath:path toDestination:destination overwrite:YES password:nil error:nil delegate:nil progressHandler:progressHandler completionHandler:completionHandler];
+ return [self unzipFileAtPath:path toDestination:destination preserveAttributes:YES overwrite:YES password:nil error:nil delegate:nil progressHandler:progressHandler completionHandler:completionHandler];
}
+ (BOOL)unzipFileAtPath:(NSString *)path
toDestination:(NSString *)destination
+ preserveAttributes:(BOOL)preserveAttributes
overwrite:(BOOL)overwrite
- password:(NSString *)password
+ password:(nullable NSString *)password
+ error:(NSError * *)error
+ delegate:(nullable id)delegate
+{
+ return [self unzipFileAtPath:path toDestination:destination preserveAttributes:preserveAttributes overwrite:overwrite password:password error:error delegate:delegate progressHandler:nil completionHandler:nil];
+}
+
++ (BOOL)unzipFileAtPath:(NSString *)path
+ toDestination:(NSString *)destination
+ preserveAttributes:(BOOL)preserveAttributes
+ overwrite:(BOOL)overwrite
+ password:(nullable NSString *)password
error:(NSError **)error
- delegate:(id)delegate
- progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
- completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler
+ delegate:(nullable id)delegate
+ progressHandler:(void (^_Nullable)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
+ completionHandler:(void (^_Nullable)(NSString *path, BOOL succeeded, NSError * _Nullable error))completionHandler
+{
+ return [self unzipFileAtPath:path toDestination:destination preserveAttributes:preserveAttributes overwrite:overwrite nestedZipLevel:0 password:password error:error delegate:delegate progressHandler:progressHandler completionHandler:completionHandler];
+}
+
++ (BOOL)unzipFileAtPath:(NSString *)path
+ toDestination:(NSString *)destination
+ preserveAttributes:(BOOL)preserveAttributes
+ overwrite:(BOOL)overwrite
+ nestedZipLevel:(NSInteger)nestedZipLevel
+ password:(nullable NSString *)password
+ error:(NSError **)error
+ delegate:(nullable id)delegate
+ progressHandler:(void (^_Nullable)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
+ completionHandler:(void (^_Nullable)(NSString *path, BOOL succeeded, NSError * _Nullable error))completionHandler
{
+ return [self unzipFileAtPath:path
+ toDestination:destination
+ preserveAttributes:preserveAttributes
+ overwrite:overwrite
+ symlinksValidWithin:destination
+ nestedZipLevel:nestedZipLevel
+ password:password
+ error:error
+ delegate:delegate
+ progressHandler:progressHandler
+ completionHandler:completionHandler];
+}
+
+
++ (BOOL)unzipFileAtPath:(NSString *)path
+ toDestination:(NSString *)destination
+ preserveAttributes:(BOOL)preserveAttributes
+ overwrite:(BOOL)overwrite
+ symlinksValidWithin:(nullable NSString *)symlinksValidWithin
+ nestedZipLevel:(NSInteger)nestedZipLevel
+ password:(nullable NSString *)password
+ error:(NSError **)error
+ delegate:(nullable id)delegate
+ progressHandler:(void (^_Nullable)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
+ completionHandler:(void (^_Nullable)(NSString *path, BOOL succeeded, NSError * _Nullable error))completionHandler
+{
+ // Guard against empty strings
+ if (path.length == 0 || destination.length == 0)
+ {
+ NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"received invalid argument(s)"};
+ NSError *err = [NSError errorWithDomain:SSZipArchiveErrorDomain code:SSZipArchiveErrorCodeInvalidArguments userInfo:userInfo];
+ if (error)
+ {
+ *error = err;
+ }
+ if (completionHandler)
+ {
+ completionHandler(nil, NO, err);
+ }
+ return NO;
+ }
+
// Begin opening
- zipFile zip = unzOpen((const char*)[path UTF8String]);
+ zipFile zip = unzOpen(path.fileSystemRepresentation);
if (zip == NULL)
{
NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"failed to open zip file"};
- NSError *err = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:-1 userInfo:userInfo];
+ NSError *err = [NSError errorWithDomain:SSZipArchiveErrorDomain code:SSZipArchiveErrorCodeFailedOpenZipFile userInfo:userInfo];
if (error)
{
*error = err;
@@ -93,17 +352,19 @@ + (BOOL)unzipFileAtPath:(NSString *)path
}
NSDictionary * fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
- unsigned long long fileSize = [fileAttributes[NSFileSize] unsignedLongLongValue];
+ unsigned long long fileSize = [[fileAttributes objectForKey:NSFileSize] unsignedLongLongValue];
unsigned long long currentPosition = 0;
- unz_global_info globalInfo = {0ul, 0ul};
+ unz_global_info globalInfo = {};
unzGetGlobalInfo(zip, &globalInfo);
// Begin unzipping
- if (unzGoToFirstFile(zip) != UNZ_OK)
+ int ret = 0;
+ ret = unzGoToFirstFile(zip);
+ if (ret != UNZ_OK && ret != MZ_END_OF_LIST)
{
NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"failed to open first file in zip file"};
- NSError *err = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:-2 userInfo:userInfo];
+ NSError *err = [NSError errorWithDomain:SSZipArchiveErrorDomain code:SSZipArchiveErrorCodeFailedOpenFileInZip userInfo:userInfo];
if (error)
{
*error = err;
@@ -112,35 +373,41 @@ + (BOOL)unzipFileAtPath:(NSString *)path
{
completionHandler(nil, NO, err);
}
+ unzClose(zip);
return NO;
}
BOOL success = YES;
BOOL canceled = NO;
- int ret = 0;
- int crc_ret =0;
+ int crc_ret = 0;
unsigned char buffer[4096] = {0};
NSFileManager *fileManager = [NSFileManager defaultManager];
- NSMutableSet *directoriesModificationDates = [[NSMutableSet alloc] init];
+ NSMutableArray *directoriesModificationDates = [[NSMutableArray alloc] init];
// Message delegate
if ([delegate respondsToSelector:@selector(zipArchiveWillUnzipArchiveAtPath:zipInfo:)]) {
[delegate zipArchiveWillUnzipArchiveAtPath:path zipInfo:globalInfo];
}
if ([delegate respondsToSelector:@selector(zipArchiveProgressEvent:total:)]) {
- [delegate zipArchiveProgressEvent:(NSInteger)currentPosition total:(NSInteger)fileSize];
+ [delegate zipArchiveProgressEvent:currentPosition total:fileSize];
}
- NSInteger currentFileNumber = 0;
+ NSInteger currentFileNumber = -1;
+ NSError *unzippingError;
do {
+ currentFileNumber++;
+ if (ret == MZ_END_OF_LIST) {
+ break;
+ }
@autoreleasepool {
- if ([password length] == 0) {
+ if (password.length == 0) {
ret = unzOpenCurrentFile(zip);
} else {
- ret = unzOpenCurrentFilePassword(zip, [password cStringUsingEncoding:NSASCIIStringEncoding]);
+ ret = unzOpenCurrentFilePassword(zip, [password cStringUsingEncoding:NSUTF8StringEncoding]);
}
if (ret != UNZ_OK) {
+ unzippingError = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:SSZipArchiveErrorCodeFailedOpenFileInZip userInfo:@{NSLocalizedDescriptionKey: @"failed to open file in zip file"}];
success = NO;
break;
}
@@ -151,6 +418,7 @@ + (BOOL)unzipFileAtPath:(NSString *)path
ret = unzGetCurrentFileInfo(zip, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
if (ret != UNZ_OK) {
+ unzippingError = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:SSZipArchiveErrorCodeFileInfoNotLoadable userInfo:@{NSLocalizedDescriptionKey: @"failed to retrieve info for file"}];
success = NO;
unzCloseCurrentFile(zip);
break;
@@ -162,7 +430,8 @@ + (BOOL)unzipFileAtPath:(NSString *)path
if ([delegate respondsToSelector:@selector(zipArchiveShouldUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {
if (![delegate zipArchiveShouldUnzipFileAtIndex:currentFileNumber
totalFiles:(NSInteger)globalInfo.number_entry
- archivePath:path fileInfo:fileInfo]) {
+ archivePath:path
+ fileInfo:fileInfo]) {
success = NO;
canceled = YES;
break;
@@ -177,59 +446,67 @@ + (BOOL)unzipFileAtPath:(NSString *)path
}
char *filename = (char *)malloc(fileInfo.size_filename + 1);
+ if (filename == NULL)
+ {
+ success = NO;
+ break;
+ }
+
unzGetCurrentFileInfo(zip, &fileInfo, filename, fileInfo.size_filename + 1, NULL, 0, NULL, 0);
filename[fileInfo.size_filename] = '\0';
- //
- // Determine whether this is a symbolic link:
- // - File is stored with 'version made by' value of UNIX (3),
- // as per http://www.pkware.com/documents/casestudies/APPNOTE.TXT
- // in the upper byte of the version field.
- // - BSD4.4 st_mode constants are stored in the high 16 bits of the
- // external file attributes (defacto standard, verified against libarchive)
- //
- // The original constants can be found here:
- // http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/include/sys/stat.h
- //
- const uLong ZipUNIXVersion = 3;
- const uLong BSD_SFMT = 0170000;
- const uLong BSD_IFLNK = 0120000;
+ BOOL fileIsSymbolicLink = _fileIsSymbolicLink(&fileInfo);
- BOOL fileIsSymbolicLink = NO;
- if (((fileInfo.version >> 8) == ZipUNIXVersion) && BSD_IFLNK == (BSD_SFMT & (fileInfo.external_fa >> 16))) {
- fileIsSymbolicLink = NO;
+ NSString * strPath = [SSZipArchive _filenameStringWithCString:filename
+ version_made_by:fileInfo.version
+ general_purpose_flag:fileInfo.flag
+ size:fileInfo.size_filename];
+ if ([strPath hasPrefix:@"__MACOSX/"]) {
+ // ignoring resource forks: https://superuser.com/questions/104500/what-is-macosx-folder
+ unzCloseCurrentFile(zip);
+ ret = unzGoToNextFile(zip);
+ free(filename);
+ continue;
}
// Check if it contains directory
- NSString *strPath = @(filename);
BOOL isDirectory = NO;
if (filename[fileInfo.size_filename-1] == '/' || filename[fileInfo.size_filename-1] == '\\') {
isDirectory = YES;
}
free(filename);
- // Contains a path
- if ([strPath rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"/\\"]].location != NSNotFound) {
- strPath = [strPath stringByReplacingOccurrencesOfString:@"\\" withString:@"/"];
+ // Sanitize paths in the file name.
+ strPath = [strPath _sanitizedPath];
+ if (!strPath.length) {
+ // if filename data is unsalvageable, we default to currentFileNumber
+ strPath = @(currentFileNumber).stringValue;
}
NSString *fullPath = [destination stringByAppendingPathComponent:strPath];
NSError *err = nil;
- NSDate *modDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate];
- NSDictionary *directoryAttr = @{NSFileCreationDate: modDate, NSFileModificationDate: modDate};
-
+ NSDictionary *directoryAttr;
+ if (preserveAttributes) {
+ NSDate *modDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.mz_dos_date];
+ directoryAttr = @{NSFileCreationDate: modDate, NSFileModificationDate: modDate};
+ [directoriesModificationDates addObject: @{@"path": fullPath, @"modDate": modDate}];
+ }
if (isDirectory) {
- [fileManager createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:directoryAttr error:&err];
+ [fileManager createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:directoryAttr error:&err];
} else {
- [fileManager createDirectoryAtPath:[fullPath stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:directoryAttr error:&err];
+ [fileManager createDirectoryAtPath:fullPath.stringByDeletingLastPathComponent withIntermediateDirectories:YES attributes:directoryAttr error:&err];
}
- if (nil != err) {
+ if (err != nil) {
+ if ([err.domain isEqualToString:NSCocoaErrorDomain] &&
+ err.code == 640) {
+ unzippingError = err;
+ unzCloseCurrentFile(zip);
+ success = NO;
+ break;
+ }
NSLog(@"[SSZipArchive] Error: %@", err.localizedDescription);
}
- if(!fileIsSymbolicLink)
- [directoriesModificationDates addObject: @{@"path": fullPath, @"modDate": modDate}];
-
if ([fileManager fileExistsAtPath:fullPath] && !isDirectory && !overwrite) {
//FIXME: couldBe CRC Check?
unzCloseCurrentFile(zip);
@@ -237,92 +514,208 @@ + (BOOL)unzipFileAtPath:(NSString *)path
continue;
}
- if (!fileIsSymbolicLink) {
- FILE *fp = fopen((const char*)[fullPath UTF8String], "wb");
- while (fp) {
- int readBytes = unzReadCurrentFile(zip, buffer, 4096);
-
- if (readBytes > 0) {
- fwrite(buffer, readBytes, 1, fp );
- } else {
- break;
- }
- }
-
- if (fp) {
- if ([[[fullPath pathExtension] lowercaseString] isEqualToString:@"zip"]) {
- NSLog(@"Unzipping nested .zip file: %@", [fullPath lastPathComponent]);
- if ([self unzipFileAtPath:fullPath toDestination:[fullPath stringByDeletingLastPathComponent] overwrite:overwrite password:password error:nil delegate:nil]) {
- [[NSFileManager defaultManager] removeItemAtPath:fullPath error:nil];
+ if (isDirectory && !fileIsSymbolicLink) {
+ // nothing to read/write for a directory
+ } else if (!fileIsSymbolicLink) {
+ // ensure we are not creating stale file entries
+ int readBytes = unzReadCurrentFile(zip, buffer, 4096);
+ if (readBytes >= 0) {
+ FILE *fp = fopen(fullPath.fileSystemRepresentation, "wb");
+ while (fp) {
+ if (readBytes > 0) {
+ if (0 == fwrite(buffer, readBytes, 1, fp)) {
+ if (ferror(fp)) {
+ NSString *message = [NSString stringWithFormat:@"Failed to write file (check your free space)"];
+ NSLog(@"[SSZipArchive] %@", message);
+ success = NO;
+ unzippingError = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:SSZipArchiveErrorCodeFailedToWriteFile userInfo:@{NSLocalizedDescriptionKey: message}];
+ break;
+ }
+ }
+ } else {
+ break;
+ }
+ readBytes = unzReadCurrentFile(zip, buffer, 4096);
+ if (readBytes < 0) {
+ // Let's assume error Z_DATA_ERROR is caused by an invalid password
+ // Let's assume other errors are caused by Content Not Readable
+ success = NO;
}
}
- fclose(fp);
-
- // Set the original datetime property
- if (fileInfo.dosDate != 0) {
- NSDate *orgDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate];
- NSDictionary *attr = @{NSFileModificationDate: orgDate};
+ if (fp) {
+ fclose(fp);
- if (attr) {
- if ([fileManager setAttributes:attr ofItemAtPath:fullPath error:nil] == NO) {
- // Can't set attributes
- NSLog(@"[SSZipArchive] Failed to set attributes - whilst setting modification date");
+ if (nestedZipLevel
+ && [fullPath.pathExtension.lowercaseString isEqualToString:@"zip"]
+ && [self unzipFileAtPath:fullPath
+ toDestination:fullPath.stringByDeletingLastPathComponent
+ preserveAttributes:preserveAttributes
+ overwrite:overwrite
+ symlinksValidWithin:symlinksValidWithin
+ nestedZipLevel:nestedZipLevel - 1
+ password:password
+ error:nil
+ delegate:nil
+ progressHandler:nil
+ completionHandler:nil]) {
+ [directoriesModificationDates removeLastObject];
+ [[NSFileManager defaultManager] removeItemAtPath:fullPath error:nil];
+ } else if (preserveAttributes) {
+
+ // Set the original datetime property
+ if (fileInfo.mz_dos_date != 0) {
+ NSDate *orgDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.mz_dos_date];
+ NSDictionary *attr = @{NSFileModificationDate: orgDate};
+
+ if (attr) {
+ if (![fileManager setAttributes:attr ofItemAtPath:fullPath error:nil]) {
+ // Can't set attributes
+ NSLog(@"[SSZipArchive] Failed to set attributes - whilst setting modification date");
+ }
+ }
+ }
+
+ // Set the original permissions on the file (+read/write to solve #293)
+ uLong permissions = fileInfo.external_fa >> 16 | 0b110000000;
+ if (permissions != 0) {
+ // Store it into a NSNumber
+ NSNumber *permissionsValue = @(permissions);
+
+ // Retrieve any existing attributes
+ NSMutableDictionary *attrs = [[NSMutableDictionary alloc] initWithDictionary:[fileManager attributesOfItemAtPath:fullPath error:nil]];
+
+ // Set the value in the attributes dict
+ [attrs setObject:permissionsValue forKey:NSFilePosixPermissions];
+
+ // Update attributes
+ if (![fileManager setAttributes:attrs ofItemAtPath:fullPath error:nil]) {
+ // Unable to set the permissions attribute
+ NSLog(@"[SSZipArchive] Failed to set attributes - whilst setting permissions");
+ }
}
}
}
-
- // Set the original permissions on the file
- uLong permissions = fileInfo.external_fa >> 16;
- if (permissions != 0) {
- // Store it into a NSNumber
- NSNumber *permissionsValue = @(permissions);
-
- // Retrieve any existing attributes
- NSMutableDictionary *attrs = [[NSMutableDictionary alloc] initWithDictionary:[fileManager attributesOfItemAtPath:fullPath error:nil]];
-
- // Set the value in the attributes dict
- attrs[NSFilePosixPermissions] = permissionsValue;
-
- // Update attributes
- if ([fileManager setAttributes:attrs ofItemAtPath:fullPath error:nil] == NO) {
- // Unable to set the permissions attribute
- NSLog(@"[SSZipArchive] Failed to set attributes - whilst setting permissions");
+ else
+ {
+ // if we couldn't open file descriptor we can validate global errno to see the reason
+ int errnoSave = errno;
+ BOOL isSeriousError = NO;
+ switch (errnoSave) {
+ case EISDIR:
+ // Is a directory
+ // assumed case
+ break;
+
+ case ENOSPC:
+ case EMFILE:
+ // No space left on device
+ // or
+ // Too many open files
+ isSeriousError = YES;
+ break;
+
+ default:
+ // ignore case
+ // Just log the error
+ {
+ NSError *errorObject = [NSError errorWithDomain:NSPOSIXErrorDomain
+ code:errnoSave
+ userInfo:nil];
+ NSLog(@"[SSZipArchive] Failed to open file on unzipping.(%@)", errorObject);
+ }
+ break;
}
-#if !__has_feature(objc_arc)
- [attrs release];
-#endif
+ if (isSeriousError) {
+ // serious case
+ unzippingError = [NSError errorWithDomain:NSPOSIXErrorDomain
+ code:errnoSave
+ userInfo:nil];
+ unzCloseCurrentFile(zip);
+ // Log the error
+ NSLog(@"[SSZipArchive] Failed to open file on unzipping.(%@)", unzippingError);
+
+ // Break unzipping
+ success = NO;
+ break;
+ }
}
+ } else {
+ // Let's assume error Z_DATA_ERROR is caused by an invalid password
+ // Let's assume other errors are caused by Content Not Readable
+ success = NO;
+ break;
}
}
else
{
// Assemble the path for the symbolic link
- NSMutableString* destinationPath = [NSMutableString string];
+ NSMutableString *destinationPath = [NSMutableString string];
int bytesRead = 0;
- while((bytesRead = unzReadCurrentFile(zip, buffer, 4096)) > 0)
+ while ((bytesRead = unzReadCurrentFile(zip, buffer, 4096)) > 0)
{
- buffer[bytesRead] = (int)0;
- [destinationPath appendString:@((const char*)buffer)];
+ buffer[bytesRead] = 0;
+ [destinationPath appendString:@((const char *)buffer)];
+ }
+ if (bytesRead < 0) {
+ // Let's assume error Z_DATA_ERROR is caused by an invalid password
+ // Let's assume other errors are caused by Content Not Readable
+ success = NO;
+ break;
}
- // Create the symbolic link (making sure it stays relative if it was relative before)
- int symlinkError = symlink([destinationPath cStringUsingEncoding:NSUTF8StringEncoding],
- [fullPath cStringUsingEncoding:NSUTF8StringEncoding]);
+ // compose symlink full path
+ NSString *symlinkFullDestinationPath = destinationPath;
+ if (![symlinkFullDestinationPath isAbsolutePath]) {
+ symlinkFullDestinationPath = [[fullPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:destinationPath];
+ }
- if(symlinkError != 0)
- {
- NSLog(@"Failed to create symbolic link at \"%@\" to \"%@\". symlink() error code: %d", fullPath, destinationPath, errno);
+ if (symlinksValidWithin != nil && [symlinkFullDestinationPath _escapesTargetDirectory: symlinksValidWithin]) {
+ NSString *message = [NSString stringWithFormat:@"Symlink escapes target directory \"~%@ -> %@\"", strPath, destinationPath];
+ NSLog(@"[SSZipArchive] %@", message);
+ success = NO;
+ unzippingError = [NSError errorWithDomain:SSZipArchiveErrorDomain code:SSZipArchiveErrorCodeSymlinkEscapesTargetDirectory userInfo:@{NSLocalizedDescriptionKey: message}];
+ } else {
+ // Check if the symlink exists and delete it if we're overwriting
+ if (overwrite)
+ {
+ if ([fileManager fileExistsAtPath:fullPath])
+ {
+ NSError *localError = nil;
+ BOOL removeSuccess = [fileManager removeItemAtPath:fullPath error:&localError];
+ if (!removeSuccess)
+ {
+ NSString *message = [NSString stringWithFormat:@"Failed to delete existing symbolic link at \"%@\"", localError.localizedDescription];
+ NSLog(@"[SSZipArchive] %@", message);
+ success = NO;
+ unzippingError = [NSError errorWithDomain:SSZipArchiveErrorDomain code:localError.code userInfo:@{NSLocalizedDescriptionKey: message}];
+ }
+ }
+ }
+
+ // Create the symbolic link (making sure it stays relative if it was relative before)
+ int symlinkError = symlink([destinationPath cStringUsingEncoding:NSUTF8StringEncoding],
+ [fullPath cStringUsingEncoding:NSUTF8StringEncoding]);
+
+ if (symlinkError != 0)
+ {
+ // Bubble the error up to the completion handler
+ NSString *message = [NSString stringWithFormat:@"Failed to create symbolic link at \"%@\" to \"%@\" - symlink() error code: %d", fullPath, destinationPath, errno];
+ NSLog(@"[SSZipArchive] %@", message);
+ success = NO;
+ unzippingError = [NSError errorWithDomain:NSPOSIXErrorDomain code:symlinkError userInfo:@{NSLocalizedDescriptionKey: message}];
+ }
}
}
- crc_ret = unzCloseCurrentFile( zip );
- if (crc_ret == UNZ_CRCERROR) {
- //CRC ERROR
- return NO;
+ crc_ret = unzCloseCurrentFile(zip);
+ if (crc_ret == MZ_CRC_ERROR) {
+ // CRC ERROR
+ success = NO;
+ break;
}
- ret = unzGoToNextFile( zip );
+ ret = unzGoToNextFile(zip);
// Message delegate
if ([delegate respondsToSelector:@selector(zipArchiveDidUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {
@@ -333,13 +726,12 @@ + (BOOL)unzipFileAtPath:(NSString *)path
archivePath:path unzippedFilePath: fullPath];
}
- currentFileNumber++;
if (progressHandler)
{
progressHandler(strPath, fileInfo, currentFileNumber, globalInfo.number_entry);
}
}
- } while(ret == UNZ_OK && ret != UNZ_END_OF_LIST_OF_FILE);
+ } while (ret == UNZ_OK && success);
// Close
unzClose(zip);
@@ -347,20 +739,18 @@ + (BOOL)unzipFileAtPath:(NSString *)path
// The process of decompressing the .zip archive causes the modification times on the folders
// to be set to the present time. So, when we are done, they need to be explicitly set.
// set the modification date on all of the directories.
- NSError * err = nil;
- for (NSDictionary * d in directoriesModificationDates) {
- if (![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate: d[@"modDate"]} ofItemAtPath:d[@"path"] error:&err]) {
- NSLog(@"[SSZipArchive] Set attributes failed for directory: %@.", d[@"path"]);
- }
- if (err) {
- NSLog(@"[SSZipArchive] Error setting directory file modification date attribute: %@",err.localizedDescription);
+ if (success && preserveAttributes) {
+ NSError * err = nil;
+ for (NSDictionary * d in directoriesModificationDates) {
+ if (![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate: [d objectForKey:@"modDate"]} ofItemAtPath:[d objectForKey:@"path"] error:&err]) {
+ NSLog(@"[SSZipArchive] Set attributes failed for directory: %@.", [d objectForKey:@"path"]);
+ }
+ if (err) {
+ NSLog(@"[SSZipArchive] Error setting directory file modification date attribute: %@", err.localizedDescription);
+ }
}
}
-#if !__has_feature(objc_arc)
- [directoriesModificationDates release];
-#endif
-
// Message delegate
if (success && [delegate respondsToSelector:@selector(zipArchiveDidUnzipArchiveAtPath:zipInfo:unzippedPath:)]) {
[delegate zipArchiveDidUnzipArchiveAtPath:path zipInfo:globalInfo unzippedPath:destination];
@@ -370,94 +760,277 @@ + (BOOL)unzipFileAtPath:(NSString *)path
[delegate zipArchiveProgressEvent:fileSize total:fileSize];
}
+ NSError *retErr = nil;
+ if (crc_ret == MZ_CRC_ERROR)
+ {
+ NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"crc check failed for file"};
+ retErr = [NSError errorWithDomain:SSZipArchiveErrorDomain code:SSZipArchiveErrorCodeFileInfoNotLoadable userInfo:userInfo];
+ }
+
+ if (error) {
+ if (unzippingError) {
+ *error = unzippingError;
+ }
+ else {
+ *error = retErr;
+ }
+ }
if (completionHandler)
{
- completionHandler(path, YES, nil);
+ if (unzippingError) {
+ completionHandler(path, success, unzippingError);
+ }
+ else
+ {
+ completionHandler(path, success, retErr);
+ }
}
return success;
}
#pragma mark - Zipping
-+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths
++ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths
{
return [SSZipArchive createZipFileAtPath:path withFilesAtPaths:paths withPassword:nil];
}
-+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath{
++ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath {
return [SSZipArchive createZipFileAtPath:path withContentsOfDirectory:directoryPath withPassword:nil];
}
-+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirector{
- return [SSZipArchive createZipFileAtPath:path withContentsOfDirectory:directoryPath keepParentDirectory:keepParentDirector withPassword:nil];
++ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory {
+ return [SSZipArchive createZipFileAtPath:path withContentsOfDirectory:directoryPath keepParentDirectory:keepParentDirectory withPassword:nil];
}
-+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(NSString *)password
++ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(NSString *)password {
+ return [self createZipFileAtPath:path withFilesAtPaths:paths withPassword:password progressHandler:nil];
+}
+
++ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(NSString *)password progressHandler:(void(^ _Nullable)(NSUInteger entryNumber, NSUInteger total))progressHandler
{
- BOOL success = NO;
SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];
- if ([zipArchive open]) {
+ BOOL success = [zipArchive open];
+ if (success) {
+ NSUInteger total = paths.count, complete = 0;
for (NSString *filePath in paths) {
- [zipArchive writeFile:filePath withPassword:password];
+ success &= [zipArchive writeFile:filePath withPassword:password];
+ if (progressHandler) {
+ complete++;
+ progressHandler(complete, total);
+ }
}
- success = [zipArchive close];
+ success &= [zipArchive close];
}
-
-#if !__has_feature(objc_arc)
- [zipArchive release];
-#endif
-
return success;
}
-+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath withPassword:(NSString *)password{
- return [self createZipFileAtPath:path withContentsOfDirectory:directoryPath keepParentDirectory:NO withPassword:password];
++ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath withPassword:(nullable NSString *)password {
+ return [SSZipArchive createZipFileAtPath:path withContentsOfDirectory:directoryPath keepParentDirectory:NO withPassword:password];
+}
+
+
++ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory withPassword:(nullable NSString *)password {
+ return [SSZipArchive createZipFileAtPath:path
+ withContentsOfDirectory:directoryPath
+ keepParentDirectory:keepParentDirectory
+ withPassword:password
+ andProgressHandler:nil
+ ];
}
++ (BOOL)createZipFileAtPath:(NSString *)path
+ withContentsOfDirectory:(NSString *)directoryPath
+ keepParentDirectory:(BOOL)keepParentDirectory
+ withPassword:(nullable NSString *)password
+ andProgressHandler:(void(^ _Nullable)(NSUInteger entryNumber, NSUInteger total))progressHandler {
+ return [self createZipFileAtPath:path withContentsOfDirectory:directoryPath keepParentDirectory:keepParentDirectory compressionLevel:Z_DEFAULT_COMPRESSION password:password AES:YES progressHandler:progressHandler];
+}
-+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory withPassword:(NSString *)password{
- BOOL success = NO;
++ (BOOL)createZipFileAtPath:(NSString *)path
+ withContentsOfDirectory:(NSString *)directoryPath
+ keepParentDirectory:(BOOL)keepParentDirectory
+ compressionLevel:(int)compressionLevel
+ password:(nullable NSString *)password
+ AES:(BOOL)aes
+ progressHandler:(void(^ _Nullable)(NSUInteger entryNumber, NSUInteger total))progressHandler {
- NSFileManager *fileManager = nil;
SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];
-
- if ([zipArchive open]) {
- // use a local filemanager (queue/thread compatibility)
- fileManager = [[NSFileManager alloc] init];
+ BOOL success = [zipArchive open];
+ if (success) {
+ // use a local fileManager (queue/thread compatibility)
+ NSFileManager *fileManager = [[NSFileManager alloc] init];
NSDirectoryEnumerator *dirEnumerator = [fileManager enumeratorAtPath:directoryPath];
- NSString *fileName;
- while ((fileName = [dirEnumerator nextObject])) {
- BOOL isDir;
+ NSArray *allObjects = dirEnumerator.allObjects;
+ NSUInteger total = allObjects.count, complete = 0;
+ if (keepParentDirectory && !total) {
+ allObjects = @[@""];
+ total = 1;
+ }
+ for (__strong NSString *fileName in allObjects) {
NSString *fullFilePath = [directoryPath stringByAppendingPathComponent:fileName];
+ if ([fullFilePath isEqualToString:path]) {
+ NSLog(@"[SSZipArchive] the archive path and the file path: %@ are the same, which is forbidden.", fullFilePath);
+ continue;
+ }
+
+ if (keepParentDirectory) {
+ fileName = [directoryPath.lastPathComponent stringByAppendingPathComponent:fileName];
+ }
+
+ BOOL isDir;
[fileManager fileExistsAtPath:fullFilePath isDirectory:&isDir];
if (!isDir) {
- if (keepParentDirectory)
- {
- fileName = [[directoryPath lastPathComponent] stringByAppendingPathComponent:fileName];
+ // file
+ success &= [zipArchive writeFileAtPath:fullFilePath withFileName:fileName compressionLevel:compressionLevel password:password AES:aes];
+ } else {
+ // directory
+ if (![fileManager enumeratorAtPath:fullFilePath].nextObject) {
+ // empty directory
+ success &= [zipArchive writeFolderAtPath:fullFilePath withFolderName:fileName withPassword:password];
}
- [zipArchive writeFileAtPath:fullFilePath withFileName:fileName withPassword:password];
}
- else
- {
- if([[NSFileManager defaultManager] subpathsOfDirectoryAtPath:fullFilePath error:nil].count == 0)
- {
- NSString *tempName = [fullFilePath stringByAppendingPathComponent:@".DS_Store"];
- [@"" writeToFile:tempName atomically:YES encoding:NSUTF8StringEncoding error:nil];
- [zipArchive writeFileAtPath:tempName withFileName:[fileName stringByAppendingPathComponent:@".DS_Store"] withPassword:password];
- [[NSFileManager defaultManager] removeItemAtPath:tempName error:nil];
+ if (progressHandler) {
+ complete++;
+ progressHandler(complete, total);
+ }
+ }
+ success &= [zipArchive close];
+ }
+ return success;
+}
+
++ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(nullable NSString *)password keepSymlinks:(BOOL)keeplinks {
+ if (!keeplinks) {
+ return [SSZipArchive createZipFileAtPath:path withFilesAtPaths:paths withPassword:password];
+ } else {
+ SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];
+ BOOL success = [zipArchive open];
+ if (success) {
+ for (NSString *filePath in paths) {
+ //is symlink
+ if (mz_os_is_symlink(filePath.fileSystemRepresentation) == MZ_OK) {
+ success &= [zipArchive writeSymlinkFileAtPath:filePath withFileName:nil compressionLevel:Z_DEFAULT_COMPRESSION password:password AES:YES];
+ } else {
+ success &= [zipArchive writeFile:filePath withPassword:password];
+ }
+ }
+ success &= [zipArchive close];
+ }
+ return success;
+ }
+}
+
++ (BOOL)createZipFileAtPath:(NSString *)path
+ withContentsOfDirectory:(NSString *)directoryPath
+ keepParentDirectory:(BOOL)keepParentDirectory
+ compressionLevel:(int)compressionLevel
+ password:(nullable NSString *)password
+ AES:(BOOL)aes
+ progressHandler:(void(^ _Nullable)(NSUInteger entryNumber, NSUInteger total))progressHandler
+ keepSymlinks:(BOOL)keeplinks {
+ if (!keeplinks) {
+ return [SSZipArchive createZipFileAtPath:path
+ withContentsOfDirectory:directoryPath
+ keepParentDirectory:keepParentDirectory
+ compressionLevel:compressionLevel
+ password:password
+ AES:aes
+ progressHandler:progressHandler];
+ } else {
+ SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];
+ BOOL success = [zipArchive open];
+ if (success) {
+ // use a local fileManager (queue/thread compatibility)
+ NSFileManager *fileManager = [[NSFileManager alloc] init];
+ NSDirectoryEnumerator *dirEnumerator = [fileManager enumeratorAtPath:directoryPath];
+ NSArray *allObjects = dirEnumerator.allObjects;
+ NSUInteger total = allObjects.count, complete = 0;
+ if (keepParentDirectory && !total) {
+ allObjects = @[@""];
+ total = 1;
+ }
+ for (__strong NSString *fileName in allObjects) {
+ NSString *fullFilePath = [directoryPath stringByAppendingPathComponent:fileName];
+
+ if (keepParentDirectory) {
+ fileName = [directoryPath.lastPathComponent stringByAppendingPathComponent:fileName];
+ }
+ //is symlink
+ BOOL isSymlink = NO;
+ if (mz_os_is_symlink(fullFilePath.fileSystemRepresentation) == MZ_OK)
+ isSymlink = YES;
+ BOOL isDir;
+ [fileManager fileExistsAtPath:fullFilePath isDirectory:&isDir];
+ if (!isDir || isSymlink) {
+ // file or symlink
+ if (!isSymlink) {
+ success &= [zipArchive writeFileAtPath:fullFilePath withFileName:fileName compressionLevel:compressionLevel password:password AES:aes];
+ } else {
+ success &= [zipArchive writeSymlinkFileAtPath:fullFilePath withFileName:fileName compressionLevel:compressionLevel password:password AES:aes];
+ }
+ } else {
+ // directory
+ if (![fileManager enumeratorAtPath:fullFilePath].nextObject) {
+ // empty directory
+ success &= [zipArchive writeFolderAtPath:fullFilePath withFolderName:fileName withPassword:password];
+ }
+ }
+ if (progressHandler) {
+ complete++;
+ progressHandler(complete, total);
}
}
+ success &= [zipArchive close];
}
- success = [zipArchive close];
+ return success;
+ }
+}
+
+- (BOOL)writeSymlinkFileAtPath:(NSString *)path withFileName:(nullable NSString *)fileName compressionLevel:(int)compressionLevel password:(nullable NSString *)password AES:(BOOL)aes
+{
+ NSAssert((_zip != NULL), @"Attempting to write to an archive which was never opened");
+ //read symlink
+ char link_path[1024];
+ int32_t err = MZ_OK;
+ err = mz_os_read_symlink(path.fileSystemRepresentation, link_path, sizeof(link_path));
+ if (err != MZ_OK) {
+ NSLog(@"[SSZipArchive] Failed to read sylink");
+ return NO;
+ }
+
+ if (!fileName) {
+ fileName = path.lastPathComponent;
}
-#if !__has_feature(objc_arc)
- [fileManager release];
- [zipArchive release];
-#endif
+ zip_fileinfo zipInfo = {};
+ [SSZipArchive zipInfo:&zipInfo setAttributesOfItemAtPath:path];
- return success;
+ //unpdate zipInfo.external_fa
+ uint32_t target_attrib = 0;
+ uint32_t src_attrib = 0;
+ uint32_t src_sys = 0;
+ mz_os_get_file_attribs(path.fileSystemRepresentation, &src_attrib);
+ src_sys = MZ_HOST_SYSTEM(MZ_VERSION_MADEBY);
+
+ if ((src_sys != MZ_HOST_SYSTEM_MSDOS) && (src_sys != MZ_HOST_SYSTEM_WINDOWS_NTFS)) {
+ /* High bytes are OS specific attributes, low byte is always DOS attributes */
+ if (mz_zip_attrib_convert(src_sys, src_attrib, MZ_HOST_SYSTEM_MSDOS, &target_attrib) == MZ_OK)
+ zipInfo.external_fa = target_attrib;
+ zipInfo.external_fa |= (src_attrib << 16);
+ } else {
+ zipInfo.external_fa = src_attrib;
+ }
+
+ uint16_t version_madeby = 3 << 8;//UNIX
+ int error = zipOpenNewFileInZip5(_zip, fileName.fileSystemRepresentation, &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, compressionLevel, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, password.UTF8String, 0, aes, version_madeby, 0, 0);
+ zipWriteInFileInZip(_zip, link_path, (uint32_t)strlen(link_path));
+ zipCloseFileInZip(_zip);
+ return error == ZIP_OK;
}
+// disabling `init` because designated initializer is `initWithPath:`
+- (instancetype)init { @throw nil; }
+// designated initializer
- (instancetype)initWithPath:(NSString *)path
{
if ((self = [super init])) {
@@ -467,153 +1040,92 @@ - (instancetype)initWithPath:(NSString *)path
}
-#if !__has_feature(objc_arc)
-- (void)dealloc
-{
- [_path release];
- [super dealloc];
-}
-#endif
-
-
- (BOOL)open
{
- NSAssert((_zip == NULL), @"Attempting open an archive which is already open");
- _zip = zipOpen([_path UTF8String], APPEND_STATUS_CREATE);
+ NSAssert((_zip == NULL), @"Attempting to open an archive which is already open");
+ _zip = zipOpen(_path.fileSystemRepresentation, APPEND_STATUS_CREATE);
return (NULL != _zip);
}
-
-- (void)zipInfo:(zip_fileinfo*)zipInfo setDate:(NSDate*)date
+- (BOOL)openForAppending
{
- NSCalendar *currentCalendar = [NSCalendar currentCalendar];
-#if defined(__IPHONE_8_0) || defined(__MAC_10_10)
- uint flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
-#else
- uint flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
-#endif
- NSDateComponents *components = [currentCalendar components:flags fromDate:date];
- zipInfo->tmz_date.tm_sec = (unsigned int)components.second;
- zipInfo->tmz_date.tm_min = (unsigned int)components.minute;
- zipInfo->tmz_date.tm_hour = (unsigned int)components.hour;
- zipInfo->tmz_date.tm_mday = (unsigned int)components.day;
- zipInfo->tmz_date.tm_mon = (unsigned int)components.month - 1;
- zipInfo->tmz_date.tm_year = (unsigned int)components.year;
+ NSAssert((_zip == NULL), @"Attempting to open an archive which is already open");
+ _zip = zipOpen(_path.fileSystemRepresentation, APPEND_STATUS_ADDINZIP);
+ return (NULL != _zip);
}
-- (BOOL)writeFolderAtPath:(NSString *)path withFolderName:(NSString *)folderName withPassword:(NSString *)password
+- (BOOL)writeFolderAtPath:(NSString *)path withFolderName:(NSString *)folderName withPassword:(nullable NSString *)password
{
NSAssert((_zip != NULL), @"Attempting to write to an archive which was never opened");
- zip_fileinfo zipInfo = {{0}};
+ zip_fileinfo zipInfo = {};
- NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error: nil];
- if( attr )
- {
- NSDate *fileDate = (NSDate *)attr[NSFileModificationDate];
- if( fileDate )
- {
- [self zipInfo:&zipInfo setDate: fileDate ];
- }
-
- // Write permissions into the external attributes, for details on this see here: http://unix.stackexchange.com/a/14727
- // Get the permissions value from the files attributes
- NSNumber *permissionsValue = (NSNumber *)attr[NSFilePosixPermissions];
- if (permissionsValue) {
- // Get the short value for the permissions
- short permissionsShort = permissionsValue.shortValue;
-
- // Convert this into an octal by adding 010000, 010000 being the flag for a regular file
- NSInteger permissionsOctal = 0100000 + permissionsShort;
-
- // Convert this into a long value
- uLong permissionsLong = @(permissionsOctal).unsignedLongValue;
-
- // Store this into the external file attributes once it has been shifted 16 places left to form part of the second from last byte
- zipInfo.external_fa = permissionsLong << 16L;
- }
- }
+ [SSZipArchive zipInfo:&zipInfo setAttributesOfItemAtPath:path];
- unsigned int len = 0;
- zipOpenNewFileInZip3(_zip, [[folderName stringByAppendingString:@"/"] UTF8String], &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_NO_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL,
- Z_DEFAULT_STRATEGY, [password UTF8String], 0);
- zipWriteInFileInZip(_zip, &len, 0);
+ int error = _zipOpenEntry(_zip, [folderName stringByAppendingString:@"/"], &zipInfo, Z_NO_COMPRESSION, password, NO);
+ const void *buffer = NULL;
+ zipWriteInFileInZip(_zip, buffer, 0);
zipCloseFileInZip(_zip);
- return YES;
+ return error == ZIP_OK;
}
-- (BOOL)writeFile:(NSString *)path withPassword:(NSString *)password;
+- (BOOL)writeFile:(NSString *)path withPassword:(nullable NSString *)password
{
return [self writeFileAtPath:path withFileName:nil withPassword:password];
}
+- (BOOL)writeFileAtPath:(NSString *)path withFileName:(nullable NSString *)fileName withPassword:(nullable NSString *)password
+{
+ return [self writeFileAtPath:path withFileName:fileName compressionLevel:Z_DEFAULT_COMPRESSION password:password AES:YES];
+}
+
// supports writing files with logical folder/directory structure
// *path* is the absolute path of the file that will be compressed
// *fileName* is the relative name of the file how it is stored within the zip e.g. /folder/subfolder/text1.txt
-- (BOOL)writeFileAtPath:(NSString *)path withFileName:(NSString *)fileName withPassword:(NSString *)password
+- (BOOL)writeFileAtPath:(NSString *)path withFileName:(nullable NSString *)fileName compressionLevel:(int)compressionLevel password:(nullable NSString *)password AES:(BOOL)aes
{
NSAssert((_zip != NULL), @"Attempting to write to an archive which was never opened");
- FILE *input = fopen([path UTF8String], "r");
+ FILE *input = fopen(path.fileSystemRepresentation, "r");
if (NULL == input) {
return NO;
}
- const char *afileName;
if (!fileName) {
- afileName = [path.lastPathComponent UTF8String];
- }
- else {
- afileName = [fileName UTF8String];
+ fileName = path.lastPathComponent;
}
- zip_fileinfo zipInfo = {{0}};
+ zip_fileinfo zipInfo = {};
- NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error: nil];
- if( attr )
+ [SSZipArchive zipInfo:&zipInfo setAttributesOfItemAtPath:path];
+
+ void *buffer = malloc(CHUNK);
+ if (buffer == NULL)
{
- NSDate *fileDate = (NSDate *)attr[NSFileModificationDate];
- if( fileDate )
- {
- [self zipInfo:&zipInfo setDate: fileDate ];
- }
-
- // Write permissions into the external attributes, for details on this see here: http://unix.stackexchange.com/a/14727
- // Get the permissions value from the files attributes
- NSNumber *permissionsValue = (NSNumber *)attr[NSFilePosixPermissions];
- if (permissionsValue) {
- // Get the short value for the permissions
- short permissionsShort = permissionsValue.shortValue;
-
- // Convert this into an octal by adding 010000, 010000 being the flag for a regular file
- NSInteger permissionsOctal = 0100000 + permissionsShort;
-
- // Convert this into a long value
- uLong permissionsLong = @(permissionsOctal).unsignedLongValue;
-
- // Store this into the external file attributes once it has been shifted 16 places left to form part of the second from last byte
- zipInfo.external_fa = permissionsLong << 16L;
- }
+ fclose(input);
+ return NO;
}
- zipOpenNewFileInZip3(_zip, afileName, &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, [password UTF8String], 0);
-
- void *buffer = malloc(CHUNK);
- unsigned int len = 0;
+ int error = _zipOpenEntry(_zip, fileName, &zipInfo, compressionLevel, password, aes);
- while (!feof(input))
+ while (!feof(input) && !ferror(input))
{
- len = (unsigned int) fread(buffer, 1, CHUNK, input);
+ unsigned int len = (unsigned int) fread(buffer, 1, CHUNK, input);
zipWriteInFileInZip(_zip, buffer, len);
}
zipCloseFileInZip(_zip);
free(buffer);
fclose(input);
- return YES;
+ return error == ZIP_OK;
}
-- (BOOL)writeData:(NSData *)data filename:(NSString *)filename withPassword:(NSString *)password;
+- (BOOL)writeData:(NSData *)data filename:(nullable NSString *)filename withPassword:(nullable NSString *)password
+{
+ return [self writeData:data filename:filename compressionLevel:Z_DEFAULT_COMPRESSION password:password AES:YES];
+}
+
+- (BOOL)writeData:(NSData *)data filename:(nullable NSString *)filename compressionLevel:(int)compressionLevel password:(nullable NSString *)password AES:(BOOL)aes
{
if (!_zip) {
return NO;
@@ -621,27 +1133,158 @@ - (BOOL)writeData:(NSData *)data filename:(NSString *)filename withPassword:(NSS
if (!data) {
return NO;
}
- zip_fileinfo zipInfo = {{0,0,0,0,0,0},0,0,0};
- [self zipInfo:&zipInfo setDate:[NSDate date]];
+ zip_fileinfo zipInfo = {};
+ [SSZipArchive zipInfo:&zipInfo setDate:[NSDate date]];
- zipOpenNewFileInZip3(_zip, [filename UTF8String], &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, [password UTF8String], 0);
+ int error = _zipOpenEntry(_zip, filename, &zipInfo, compressionLevel, password, aes);
zipWriteInFileInZip(_zip, data.bytes, (unsigned int)data.length);
zipCloseFileInZip(_zip);
- return YES;
+ return error == ZIP_OK;
}
-
- (BOOL)close
{
NSAssert((_zip != NULL), @"[SSZipArchive] Attempting to close an archive which was never opened");
- zipClose(_zip, NULL);
- return YES;
+ int error = zipClose(_zip, NULL);
+ _zip = nil;
+ return error == ZIP_OK;
}
#pragma mark - Private
++ (NSString *)_filenameStringWithCString:(const char *)filename
+ version_made_by:(uint16_t)version_made_by
+ general_purpose_flag:(uint16_t)flag
+ size:(uint16_t)size_filename {
+
+ // Respect Language encoding flag only reading filename as UTF-8 when this is set
+ // when file entry created on dos system.
+ //
+ // https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
+ // Bit 11: Language encoding flag (EFS). If this bit is set,
+ // the filename and comment fields for this file
+ // MUST be encoded using UTF-8. (see APPENDIX D)
+ uint16_t made_by = version_made_by >> 8;
+ BOOL made_on_dos = made_by == 0;
+ BOOL languageEncoding = (flag & (1 << 11)) != 0;
+ if (!languageEncoding && made_on_dos) {
+ // APPNOTE.TXT D.1:
+ // D.2 If general purpose bit 11 is unset, the file name and comment should conform
+ // to the original ZIP character encoding. If general purpose bit 11 is set, the
+ // filename and comment must support The Unicode Standard, Version 4.1.0 or
+ // greater using the character encoding form defined by the UTF-8 storage
+ // specification. The Unicode Standard is published by the The Unicode
+ // Consortium (www.unicode.org). UTF-8 encoded data stored within ZIP files
+ // is expected to not include a byte order mark (BOM).
+
+ // Code Page 437 corresponds to kCFStringEncodingDOSLatinUS
+ NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingDOSLatinUS);
+ NSString* strPath = [NSString stringWithCString:filename encoding:encoding];
+ if (strPath) {
+ return strPath;
+ }
+ }
+
+ // attempting unicode encoding
+ NSString * strPath = @(filename);
+ if (strPath) {
+ return strPath;
+ }
+
+ // if filename is non-unicode, detect and transform Encoding
+ NSData *data = [NSData dataWithBytes:(const void *)filename length:sizeof(unsigned char) * size_filename];
+// Testing availability of @available (https://stackoverflow.com/a/46927445/1033581)
+#if __clang_major__ < 9
+ // Xcode 8-
+ if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber10_9_2) {
+#else
+ // Xcode 9+
+ if (@available(macOS 10.10, iOS 8.0, watchOS 2.0, tvOS 9.0, *)) {
+#endif
+ // supported encodings are in [NSString availableStringEncodings]
+ [NSString stringEncodingForData:data encodingOptions:nil convertedString:&strPath usedLossyConversion:nil];
+ } else {
+ // fallback to a simple manual detect for macOS 10.9 or older
+ NSArray *encodings = @[@(kCFStringEncodingGB_18030_2000), @(kCFStringEncodingShiftJIS)];
+ for (NSNumber *encoding in encodings) {
+ strPath = [NSString stringWithCString:filename encoding:(NSStringEncoding)CFStringConvertEncodingToNSStringEncoding(encoding.unsignedIntValue)];
+ if (strPath) {
+ break;
+ }
+ }
+ }
+ if (strPath) {
+ return strPath;
+ }
+
+ // if filename encoding is non-detected, we default to something based on data
+ // _hexString is more readable than _base64RFC4648 for debugging unknown encodings
+ strPath = [data _hexString];
+ return strPath;
+}
+
++ (void)zipInfo:(zip_fileinfo *)zipInfo setAttributesOfItemAtPath:(NSString *)path
+{
+ NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error: nil];
+ if (attr)
+ {
+ NSDate *fileDate = (NSDate *)[attr objectForKey:NSFileModificationDate];
+ if (fileDate)
+ {
+ [self zipInfo:zipInfo setDate:fileDate];
+ }
+
+ // Write permissions into the external attributes, for details on this see here: https://unix.stackexchange.com/a/14727
+ // Get the permissions value from the files attributes
+ NSNumber *permissionsValue = (NSNumber *)[attr objectForKey:NSFilePosixPermissions];
+ if (permissionsValue != nil) {
+ // Get the short value for the permissions
+ short permissionsShort = permissionsValue.shortValue;
+
+ // Convert this into an octal by adding 010000, 010000 being the flag for a regular file
+ NSInteger permissionsOctal = 0100000 + permissionsShort;
+
+ // Convert this into a long value
+ uLong permissionsLong = @(permissionsOctal).unsignedLongValue;
+
+ // Store this into the external file attributes once it has been shifted 16 places left to form part of the second from last byte
+
+ // Casted back to an unsigned int to match type of external_fa in minizip
+ zipInfo->external_fa = (unsigned int)(permissionsLong << 16L);
+ }
+ }
+}
+
++ (void)zipInfo:(zip_fileinfo *)zipInfo setDate:(NSDate *)date
+{
+ NSCalendar *currentCalendar = SSZipArchive._gregorian;
+ NSCalendarUnit flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
+ NSDateComponents *components = [currentCalendar components:flags fromDate:date];
+ struct tm tmz_date;
+ tmz_date.tm_sec = (unsigned int)components.second;
+ tmz_date.tm_min = (unsigned int)components.minute;
+ tmz_date.tm_hour = (unsigned int)components.hour;
+ tmz_date.tm_mday = (unsigned int)components.day;
+ // ISO/IEC 9899 struct tm is 0-indexed for January but NSDateComponents for gregorianCalendar is 1-indexed for January
+ tmz_date.tm_mon = (unsigned int)components.month - 1;
+ // ISO/IEC 9899 struct tm is 0-indexed for AD 1900 but NSDateComponents for gregorianCalendar is 1-indexed for AD 1
+ tmz_date.tm_year = (unsigned int)components.year - 1900;
+ zipInfo->mz_dos_date = mz_zip_tm_to_dosdate(&tmz_date);
+}
+
++ (NSCalendar *)_gregorian
+{
+ static NSCalendar *gregorian;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
+ });
+
+ return gregorian;
+}
+
// Format from http://newsgroups.derkeiler.com/Archive/Comp/comp.os.msdos.programmer/2009-04/msg00060.html
// Two consecutive words, or a longword, YYYYYYYMMMMDDDDD hhhhhmmmmmmsssss
// YYYYYYY is years from 1980 = 0
@@ -651,6 +1294,9 @@ - (BOOL)close
// 7423 = 0111 0100 0010 0011 - 01110 100001 00011 = 14 33 3 = 14:33:06
+ (NSDate *)_dateWithMSDOSFormat:(UInt32)msdosDateTime
{
+ // the whole `_dateWithMSDOSFormat:` method is equivalent but faster than this one line,
+ // essentially because `mktime` is slow:
+ //NSDate *date = [NSDate dateWithTimeIntervalSince1970:dosdate_to_time_t(msdosDateTime)];
static const UInt32 kYearMask = 0xFE000000;
static const UInt32 kMonthMask = 0x1E00000;
static const UInt32 kDayMask = 0x1F0000;
@@ -658,34 +1304,193 @@ + (NSDate *)_dateWithMSDOSFormat:(UInt32)msdosDateTime
static const UInt32 kMinuteMask = 0x7E0;
static const UInt32 kSecondMask = 0x1F;
- static NSCalendar *gregorian;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
-#if defined(__IPHONE_8_0) || defined(__MAC_10_10)
- gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
+ NSAssert(0xFFFFFFFF == (kYearMask | kMonthMask | kDayMask | kHourMask | kMinuteMask | kSecondMask), @"[SSZipArchive] MSDOS date masks don't add up");
+
+ NSDateComponents *components = [[NSDateComponents alloc] init];
+ components.year = 1980 + ((msdosDateTime & kYearMask) >> 25);
+ components.month = (msdosDateTime & kMonthMask) >> 21;
+ components.day = (msdosDateTime & kDayMask) >> 16;
+ components.hour = (msdosDateTime & kHourMask) >> 11;
+ components.minute = (msdosDateTime & kMinuteMask) >> 5;
+ components.second = (msdosDateTime & kSecondMask) * 2;
+
+ NSDate *date = [self._gregorian dateFromComponents:components];
+ return date;
+}
+
+@end
+
+int _zipOpenEntry(zipFile entry, NSString *name, const zip_fileinfo *zipfi, int level, NSString *password, BOOL aes)
+{
+ // https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
+ uint16_t made_on_darwin = 19 << 8;
+ //MZ_ZIP_FLAG_UTF8
+ uint16_t flag_base = 1 << 11;
+ return zipOpenNewFileInZip5(entry, name.fileSystemRepresentation, zipfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, level, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, password.UTF8String, 0, aes, made_on_darwin, flag_base, 1);
+}
+
+#pragma mark - Private tools for file info
+
+BOOL _fileIsSymbolicLink(const unz_file_info *fileInfo)
+{
+ //
+ // Determine whether this is a symbolic link:
+ // - File is stored with 'version made by' value of UNIX (3),
+ // as per https://www.pkware.com/documents/casestudies/APPNOTE.TXT
+ // in the upper byte of the version field.
+ // - BSD4.4 st_mode constants are stored in the high 16 bits of the
+ // external file attributes (defacto standard, verified against libarchive)
+ //
+ // The original constants can be found here:
+ // https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/include/sys/stat.h
+ //
+ const uLong ZipUNIXVersion = 3;
+ const uLong BSD_SFMT = 0170000;
+ const uLong BSD_IFLNK = 0120000;
+
+ BOOL fileIsSymbolicLink = ((fileInfo->version >> 8) == ZipUNIXVersion) && BSD_IFLNK == (BSD_SFMT & (fileInfo->external_fa >> 16));
+ return fileIsSymbolicLink;
+}
+
+#pragma mark - Private tools for unreadable encodings
+
+@implementation NSData (SSZipArchive)
+
+// `base64EncodedStringWithOptions` uses a base64 alphabet with '+' and '/'.
+// we got those alternatives to make it compatible with filenames: https://en.wikipedia.org/wiki/Base64
+// * modified Base64 encoding for IMAP mailbox names (RFC 3501): uses '+' and ','
+// * modified Base64 for URL and filenames (RFC 4648): uses '-' and '_'
+- (NSString *)_base64RFC4648
+{
+ NSString *strName = [self base64EncodedStringWithOptions:0];
+ strName = [strName stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
+ strName = [strName stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
+ return strName;
+}
+
+// initWithBytesNoCopy from NSProgrammer, Jan 25 '12: https://stackoverflow.com/a/9009321/1033581
+// hexChars from Peter, Aug 19 '14: https://stackoverflow.com/a/25378464/1033581
+// not implemented as too lengthy: a potential mapping improvement from Moose, Nov 3 '15: https://stackoverflow.com/a/33501154/1033581
+- (NSString *)_hexString
+{
+ const char *hexChars = "0123456789ABCDEF";
+ NSUInteger length = self.length;
+ const unsigned char *bytes = self.bytes;
+ char *chars = malloc(length * 2);
+ if (chars == NULL) {
+ // we directly raise an exception instead of using NSAssert to make sure assertion is not disabled as this is irrecoverable
+ [NSException raise:@"NSInternalInconsistencyException" format:@"failed malloc" arguments:nil];
+ return nil;
+ }
+ char *s = chars;
+ NSUInteger i = length;
+ while (i--) {
+ *s++ = hexChars[*bytes >> 4];
+ *s++ = hexChars[*bytes & 0xF];
+ bytes++;
+ }
+ NSString *str = [[NSString alloc] initWithBytesNoCopy:chars
+ length:length * 2
+ encoding:NSASCIIStringEncoding
+ freeWhenDone:YES];
+ return str;
+}
+
+@end
+
+#pragma mark Private tools for security
+
+@implementation NSString (SSZipArchive)
+
+// One implementation alternative would be to use the algorithm found at mz_path_resolve from https://github.com/nmoinvaz/minizip/blob/dev/mz_os.c,
+// but making sure to work with unichar values and not ascii values to avoid breaking Unicode characters containing 2E ('.') or 2F ('/') in their decomposition
+/// Sanitize path traversal characters to prevent directory backtracking. Ignoring these characters mimicks the default behavior of the Unarchiving tool on macOS.
+- (NSString *)_sanitizedPath
+{
+ // Change Windows paths to Unix paths: https://en.wikipedia.org/wiki/Path_(computing)
+ // Possible improvement: only do this if the archive was created on a non-Unix system
+ NSString *strPath = [self stringByReplacingOccurrencesOfString:@"\\" withString:@"/"];
+
+ // Percent-encode file path (where path is defined by https://tools.ietf.org/html/rfc8089)
+ // The key part is to allow characters "." and "/" and disallow "%".
+ // CharacterSet.urlPathAllowed seems to do the job
+#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 || __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 || __WATCH_OS_VERSION_MIN_REQUIRED >= 20000 || __TV_OS_VERSION_MIN_REQUIRED >= 90000)
+ strPath = [strPath stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLPathAllowedCharacterSet];
#else
- gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
+ // Testing availability of @available (https://stackoverflow.com/a/46927445/1033581)
+#if __clang_major__ < 9
+ // Xcode 8-
+ if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber10_8_4) {
+#else
+ // Xcode 9+
+ if (@available(macOS 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0, *)) {
+#endif
+ strPath = [strPath stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLPathAllowedCharacterSet];
+ } else {
+ strPath = [strPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+ }
#endif
- });
- NSDateComponents *components = [[NSDateComponents alloc] init];
+ // `NSString.stringByAddingPercentEncodingWithAllowedCharacters:` may theorically fail: https://stackoverflow.com/questions/33558933/
+ // But because we auto-detect encoding using `NSString.stringEncodingForData:encodingOptions:convertedString:usedLossyConversion:`,
+ // we likely already prevent UTF-16, UTF-32 and invalid Unicode in the form of unpaired surrogate chars: https://stackoverflow.com/questions/53043876/
+ // To be on the safe side, we will still perform a guard check.
+ if (strPath == nil) {
+ return nil;
+ }
- NSAssert(0xFFFFFFFF == (kYearMask | kMonthMask | kDayMask | kHourMask | kMinuteMask | kSecondMask), @"[SSZipArchive] MSDOS date masks don't add up");
+ // Add scheme "file:///" to support sanitation on names with a colon like "file:a/../../../usr/bin"
+ strPath = [@"file:///" stringByAppendingString:strPath];
- [components setYear:1980 + ((msdosDateTime & kYearMask) >> 25)];
- [components setMonth:(msdosDateTime & kMonthMask) >> 21];
- [components setDay:(msdosDateTime & kDayMask) >> 16];
- [components setHour:(msdosDateTime & kHourMask) >> 11];
- [components setMinute:(msdosDateTime & kMinuteMask) >> 5];
- [components setSecond:(msdosDateTime & kSecondMask) * 2];
+ // Sanitize path traversal characters to prevent directory backtracking. Ignoring these characters mimicks the default behavior of the Unarchiving tool on macOS.
+ // "../../../../../../../../../../../tmp/test.txt" -> "tmp/test.txt"
+ // "a/b/../c.txt" -> "a/c.txt"
+ strPath = [NSURL URLWithString:strPath].standardizedURL.absoluteString;
- NSDate *date = [NSDate dateWithTimeInterval:0 sinceDate:[gregorian dateFromComponents:components]];
+ // Remove the "file:///" scheme
+ strPath = strPath.length < 8 ? @"" : [strPath substringFromIndex:8];
-#if !__has_feature(objc_arc)
- [components release];
+ // Remove the percent-encoding
+#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 || __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 || __WATCH_OS_VERSION_MIN_REQUIRED >= 20000 || __TV_OS_VERSION_MIN_REQUIRED >= 90000)
+ strPath = strPath.stringByRemovingPercentEncoding;
+#else
+ // Testing availability of @available (https://stackoverflow.com/a/46927445/1033581)
+#if __clang_major__ < 9
+ // Xcode 8-
+ if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber10_8_4) {
+#else
+ // Xcode 9+
+ if (@available(macOS 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0, *)) {
+#endif
+ strPath = strPath.stringByRemovingPercentEncoding;
+ } else {
+ strPath = [strPath stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+ }
#endif
- return date;
+ return strPath;
+}
+
+/// Detects if the path represented in this string is pointing outside of the targetDirectory passed as argument.
+///
+/// Helps detecting and avoiding a security vulnerability described here:
+/// https://nvd.nist.gov/vuln/detail/CVE-2022-36943
+- (BOOL)_escapesTargetDirectory:(NSString *)targetDirectory {
+ NSString *standardizedPath = [[self stringByStandardizingPath] stringByResolvingSymlinksInPath];
+ NSString *standardizedTargetPath = [[targetDirectory stringByStandardizingPath] stringByResolvingSymlinksInPath];
+
+ NSArray *targetPathComponents = [standardizedTargetPath pathComponents];
+ NSArray *pathComponents = [standardizedPath pathComponents];
+
+ if (pathComponents.count < targetPathComponents.count) return YES;
+
+ for (int idx = 0; idx < targetPathComponents.count; idx++) {
+ if (![pathComponents[idx] isEqual: targetPathComponents[idx]]) {
+ return YES;
+ }
+ }
+
+ return NO;
}
-@end
\ No newline at end of file
+@end
diff --git a/ios/CodePush/SSZipArchive/SSZipCommon.h b/ios/CodePush/SSZipArchive/SSZipCommon.h
new file mode 100644
index 000000000..6c775734b
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/SSZipCommon.h
@@ -0,0 +1,71 @@
+#ifndef SSZipCommon
+#define SSZipCommon
+
+// typedefs moved from mz_compat.h to here for public access
+
+/* unz_global_info structure contain global data about the ZIPfile
+ These data comes from the end of central dir */
+typedef struct unz_global_info64_s
+{
+ uint64_t number_entry; /* total number of entries in the central dir on this disk */
+ uint32_t number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP */
+ uint16_t size_comment; /* size of the global comment of the zipfile */
+} unz_global_info64;
+
+
+typedef struct unz_global_info_s
+{
+ uint32_t number_entry; /* total number of entries in the central dir on this disk */
+ uint32_t number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP */
+ uint16_t size_comment; /* size of the global comment of the zipfile */
+} unz_global_info;
+
+/* unz_file_info contain information about a file in the zipfile */
+/* https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT */
+typedef struct unz_file_info64_s
+{
+ uint16_t version; /* version made by 2 bytes */
+ uint16_t version_needed; /* version needed to extract 2 bytes */
+ uint16_t flag; /* general purpose bit flag 2 bytes */
+ uint16_t compression_method; /* compression method 2 bytes */
+ uint32_t dos_date; /* last mod file date in Dos fmt 4 bytes */
+ struct tm tmu_date;
+ uint32_t crc; /* crc-32 4 bytes */
+ uint64_t compressed_size; /* compressed size 8 bytes */
+ uint64_t uncompressed_size; /* uncompressed size 8 bytes */
+ uint16_t size_filename; /* filename length 2 bytes */
+ uint16_t size_file_extra; /* extra field length 2 bytes */
+ uint16_t size_file_comment; /* file comment length 2 bytes */
+
+ uint32_t disk_num_start; /* disk number start 4 bytes */
+ uint16_t internal_fa; /* internal file attributes 2 bytes */
+ uint32_t external_fa; /* external file attributes 4 bytes */
+
+ uint64_t disk_offset;
+
+ uint16_t size_file_extra_internal;
+} unz_file_info64;
+
+typedef struct unz_file_info_s
+{
+ uint16_t version; /* version made by 2 bytes */
+ uint16_t version_needed; /* version needed to extract 2 bytes */
+ uint16_t flag; /* general purpose bit flag 2 bytes */
+ uint16_t compression_method; /* compression method 2 bytes */
+ uint32_t dos_date; /* last mod file date in Dos fmt 4 bytes */
+ struct tm tmu_date;
+ uint32_t crc; /* crc-32 4 bytes */
+ uint32_t compressed_size; /* compressed size 4 bytes */
+ uint32_t uncompressed_size; /* uncompressed size 4 bytes */
+ uint16_t size_filename; /* filename length 2 bytes */
+ uint16_t size_file_extra; /* extra field length 2 bytes */
+ uint16_t size_file_comment; /* file comment length 2 bytes */
+
+ uint16_t disk_num_start; /* disk number start 2 bytes */
+ uint16_t internal_fa; /* internal file attributes 2 bytes */
+ uint32_t external_fa; /* external file attributes 4 bytes */
+
+ uint64_t disk_offset;
+} unz_file_info;
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/Supporting Files/PrivacyInfo.xcprivacy b/ios/CodePush/SSZipArchive/Supporting Files/PrivacyInfo.xcprivacy
new file mode 100644
index 000000000..276f7610d
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/Supporting Files/PrivacyInfo.xcprivacy
@@ -0,0 +1,23 @@
+
+
+
+
+ NSPrivacyTracking
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyAccessedAPITypes
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryFileTimestamp
+ NSPrivacyAccessedAPITypeReasons
+
+ C617.1
+
+
+
+
+
diff --git a/ios/CodePush/SSZipArchive/aes/aes.h b/ios/CodePush/SSZipArchive/aes/aes.h
deleted file mode 100644
index 44682c391..000000000
--- a/ios/CodePush/SSZipArchive/aes/aes.h
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
----------------------------------------------------------------------------
-Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.
-
-The redistribution and use of this software (with or without changes)
-is allowed without the payment of fees or royalties provided that:
-
- source code distributions include the above copyright notice, this
- list of conditions and the following disclaimer;
-
- binary distributions include the above copyright notice, this list
- of conditions and the following disclaimer in their documentation.
-
-This software is provided 'as is' with no explicit or implied warranties
-in respect of its operation, including, but not limited to, correctness
-and fitness for purpose.
----------------------------------------------------------------------------
-Issue Date: 20/12/2007
-
- This file contains the definitions required to use AES in C. See aesopt.h
- for optimisation details.
-*/
-
-#ifndef _AES_H
-#define _AES_H
-
-#include
-
-/* This include is used to find 8 & 32 bit unsigned integer types */
-#include "brg_types.h"
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-#define AES_128 /* if a fast 128 bit key scheduler is needed */
-#define AES_192 /* if a fast 192 bit key scheduler is needed */
-#define AES_256 /* if a fast 256 bit key scheduler is needed */
-#define AES_VAR /* if variable key size scheduler is needed */
-#define AES_MODES /* if support is needed for modes */
-
-/* The following must also be set in assembler files if being used */
-
-#define AES_ENCRYPT /* if support for encryption is needed */
-#define AES_DECRYPT /* if support for decryption is needed */
-#define AES_REV_DKS /* define to reverse decryption key schedule */
-
-#define AES_BLOCK_SIZE 16 /* the AES block size in bytes */
-#define N_COLS 4 /* the number of columns in the state */
-
-/* The key schedule length is 11, 13 or 15 16-byte blocks for 128, */
-/* 192 or 256-bit keys respectively. That is 176, 208 or 240 bytes */
-/* or 44, 52 or 60 32-bit words. */
-
-#if defined( AES_VAR ) || defined( AES_256 )
-#define KS_LENGTH 60
-#elif defined( AES_192 )
-#define KS_LENGTH 52
-#else
-#define KS_LENGTH 44
-#endif
-
-#define AES_RETURN INT_RETURN
-
-/* the character array 'inf' in the following structures is used */
-/* to hold AES context information. This AES code uses cx->inf.b[0] */
-/* to hold the number of rounds multiplied by 16. The other three */
-/* elements can be used by code that implements additional modes */
-
-typedef union
-{ uint_32t l;
- uint_8t b[4];
-} aes_inf;
-
-typedef struct
-{ uint_32t ks[KS_LENGTH];
- aes_inf inf;
-} aes_encrypt_ctx;
-
-typedef struct
-{ uint_32t ks[KS_LENGTH];
- aes_inf inf;
-} aes_decrypt_ctx;
-
-/* This routine must be called before first use if non-static */
-/* tables are being used */
-
-AES_RETURN aes_init(void);
-
-/* Key lengths in the range 16 <= key_len <= 32 are given in bytes, */
-/* those in the range 128 <= key_len <= 256 are given in bits */
-
-#if defined( AES_ENCRYPT )
-
-#if defined( AES_128 ) || defined( AES_VAR)
-AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]);
-#endif
-
-#if defined( AES_192 ) || defined( AES_VAR)
-AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]);
-#endif
-
-#if defined( AES_256 ) || defined( AES_VAR)
-AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]);
-#endif
-
-#if defined( AES_VAR )
-AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]);
-#endif
-
-AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1]);
-
-#endif
-
-#if defined( AES_DECRYPT )
-
-#if defined( AES_128 ) || defined( AES_VAR)
-AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]);
-#endif
-
-#if defined( AES_192 ) || defined( AES_VAR)
-AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]);
-#endif
-
-#if defined( AES_256 ) || defined( AES_VAR)
-AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]);
-#endif
-
-#if defined( AES_VAR )
-AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]);
-#endif
-
-AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1]);
-
-#endif
-
-#if defined( AES_MODES )
-
-/* Multiple calls to the following subroutines for multiple block */
-/* ECB, CBC, CFB, OFB and CTR mode encryption can be used to handle */
-/* long messages incremantally provided that the context AND the iv */
-/* are preserved between all such calls. For the ECB and CBC modes */
-/* each individual call within a series of incremental calls must */
-/* process only full blocks (i.e. len must be a multiple of 16) but */
-/* the CFB, OFB and CTR mode calls can handle multiple incremental */
-/* calls of any length. Each mode is reset when a new AES key is */
-/* set but ECB and CBC operations can be reset without setting a */
-/* new key by setting a new IV value. To reset CFB, OFB and CTR */
-/* without setting the key, aes_mode_reset() must be called and the */
-/* IV must be set. NOTE: All these calls update the IV on exit so */
-/* this has to be reset if a new operation with the same IV as the */
-/* previous one is required (or decryption follows encryption with */
-/* the same IV array). */
-
-AES_RETURN aes_test_alignment_detection(unsigned int n);
-
-AES_RETURN aes_ecb_encrypt(const unsigned char *ibuf, unsigned char *obuf,
- int len, const aes_encrypt_ctx cx[1]);
-
-AES_RETURN aes_ecb_decrypt(const unsigned char *ibuf, unsigned char *obuf,
- int len, const aes_decrypt_ctx cx[1]);
-
-AES_RETURN aes_cbc_encrypt(const unsigned char *ibuf, unsigned char *obuf,
- int len, unsigned char *iv, const aes_encrypt_ctx cx[1]);
-
-AES_RETURN aes_cbc_decrypt(const unsigned char *ibuf, unsigned char *obuf,
- int len, unsigned char *iv, const aes_decrypt_ctx cx[1]);
-
-AES_RETURN aes_mode_reset(aes_encrypt_ctx cx[1]);
-
-AES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf,
- int len, unsigned char *iv, aes_encrypt_ctx cx[1]);
-
-AES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf,
- int len, unsigned char *iv, aes_encrypt_ctx cx[1]);
-
-#define aes_ofb_encrypt aes_ofb_crypt
-#define aes_ofb_decrypt aes_ofb_crypt
-
-AES_RETURN aes_ofb_crypt(const unsigned char *ibuf, unsigned char *obuf,
- int len, unsigned char *iv, aes_encrypt_ctx cx[1]);
-
-typedef void cbuf_inc(unsigned char *cbuf);
-
-#define aes_ctr_encrypt aes_ctr_crypt
-#define aes_ctr_decrypt aes_ctr_crypt
-
-AES_RETURN aes_ctr_crypt(const unsigned char *ibuf, unsigned char *obuf,
- int len, unsigned char *cbuf, cbuf_inc ctr_inc, aes_encrypt_ctx cx[1]);
-
-#endif
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/aes_via_ace.h b/ios/CodePush/SSZipArchive/aes/aes_via_ace.h
deleted file mode 100644
index cb2aa1bab..000000000
--- a/ios/CodePush/SSZipArchive/aes/aes_via_ace.h
+++ /dev/null
@@ -1,541 +0,0 @@
-/*
-Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.
-
-The redistribution and use of this software (with or without changes)
-is allowed without the payment of fees or royalties provided that:
-
- source code distributions include the above copyright notice, this
- list of conditions and the following disclaimer;
-
- binary distributions include the above copyright notice, this list
- of conditions and the following disclaimer in their documentation.
-
-This software is provided 'as is' with no explicit or implied warranties
-in respect of its operation, including, but not limited to, correctness
-and fitness for purpose.
----------------------------------------------------------------------------
-Issue Date: 20/12/2007
-*/
-
-#ifndef AES_VIA_ACE_H
-#define AES_VIA_ACE_H
-
-#if defined( _MSC_VER )
-# define INLINE __inline
-#elif defined( __GNUC__ )
-# define INLINE static inline
-#else
-# error VIA ACE requires Microsoft or GNU C
-#endif
-
-#define NEH_GENERATE 1
-#define NEH_LOAD 2
-#define NEH_HYBRID 3
-
-#define MAX_READ_ATTEMPTS 1000
-
-/* VIA Nehemiah RNG and ACE Feature Mask Values */
-
-#define NEH_CPU_IS_VIA 0x00000001
-#define NEH_CPU_READ 0x00000010
-#define NEH_CPU_MASK 0x00000011
-
-#define NEH_RNG_PRESENT 0x00000004
-#define NEH_RNG_ENABLED 0x00000008
-#define NEH_ACE_PRESENT 0x00000040
-#define NEH_ACE_ENABLED 0x00000080
-#define NEH_RNG_FLAGS (NEH_RNG_PRESENT | NEH_RNG_ENABLED)
-#define NEH_ACE_FLAGS (NEH_ACE_PRESENT | NEH_ACE_ENABLED)
-#define NEH_FLAGS_MASK (NEH_RNG_FLAGS | NEH_ACE_FLAGS)
-
-/* VIA Nehemiah Advanced Cryptography Engine (ACE) Control Word Values */
-
-#define NEH_GEN_KEY 0x00000000 /* generate key schedule */
-#define NEH_LOAD_KEY 0x00000080 /* load schedule from memory */
-#define NEH_ENCRYPT 0x00000000 /* encryption */
-#define NEH_DECRYPT 0x00000200 /* decryption */
-#define NEH_KEY128 0x00000000+0x0a /* 128 bit key */
-#define NEH_KEY192 0x00000400+0x0c /* 192 bit key */
-#define NEH_KEY256 0x00000800+0x0e /* 256 bit key */
-
-#define NEH_ENC_GEN (NEH_ENCRYPT | NEH_GEN_KEY)
-#define NEH_DEC_GEN (NEH_DECRYPT | NEH_GEN_KEY)
-#define NEH_ENC_LOAD (NEH_ENCRYPT | NEH_LOAD_KEY)
-#define NEH_DEC_LOAD (NEH_DECRYPT | NEH_LOAD_KEY)
-
-#define NEH_ENC_GEN_DATA {\
- NEH_ENC_GEN | NEH_KEY128, 0, 0, 0,\
- NEH_ENC_GEN | NEH_KEY192, 0, 0, 0,\
- NEH_ENC_GEN | NEH_KEY256, 0, 0, 0 }
-
-#define NEH_ENC_LOAD_DATA {\
- NEH_ENC_LOAD | NEH_KEY128, 0, 0, 0,\
- NEH_ENC_LOAD | NEH_KEY192, 0, 0, 0,\
- NEH_ENC_LOAD | NEH_KEY256, 0, 0, 0 }
-
-#define NEH_ENC_HYBRID_DATA {\
- NEH_ENC_GEN | NEH_KEY128, 0, 0, 0,\
- NEH_ENC_LOAD | NEH_KEY192, 0, 0, 0,\
- NEH_ENC_LOAD | NEH_KEY256, 0, 0, 0 }
-
-#define NEH_DEC_GEN_DATA {\
- NEH_DEC_GEN | NEH_KEY128, 0, 0, 0,\
- NEH_DEC_GEN | NEH_KEY192, 0, 0, 0,\
- NEH_DEC_GEN | NEH_KEY256, 0, 0, 0 }
-
-#define NEH_DEC_LOAD_DATA {\
- NEH_DEC_LOAD | NEH_KEY128, 0, 0, 0,\
- NEH_DEC_LOAD | NEH_KEY192, 0, 0, 0,\
- NEH_DEC_LOAD | NEH_KEY256, 0, 0, 0 }
-
-#define NEH_DEC_HYBRID_DATA {\
- NEH_DEC_GEN | NEH_KEY128, 0, 0, 0,\
- NEH_DEC_LOAD | NEH_KEY192, 0, 0, 0,\
- NEH_DEC_LOAD | NEH_KEY256, 0, 0, 0 }
-
-#define neh_enc_gen_key(x) ((x) == 128 ? (NEH_ENC_GEN | NEH_KEY128) : \
- (x) == 192 ? (NEH_ENC_GEN | NEH_KEY192) : (NEH_ENC_GEN | NEH_KEY256))
-
-#define neh_enc_load_key(x) ((x) == 128 ? (NEH_ENC_LOAD | NEH_KEY128) : \
- (x) == 192 ? (NEH_ENC_LOAD | NEH_KEY192) : (NEH_ENC_LOAD | NEH_KEY256))
-
-#define neh_enc_hybrid_key(x) ((x) == 128 ? (NEH_ENC_GEN | NEH_KEY128) : \
- (x) == 192 ? (NEH_ENC_LOAD | NEH_KEY192) : (NEH_ENC_LOAD | NEH_KEY256))
-
-#define neh_dec_gen_key(x) ((x) == 128 ? (NEH_DEC_GEN | NEH_KEY128) : \
- (x) == 192 ? (NEH_DEC_GEN | NEH_KEY192) : (NEH_DEC_GEN | NEH_KEY256))
-
-#define neh_dec_load_key(x) ((x) == 128 ? (NEH_DEC_LOAD | NEH_KEY128) : \
- (x) == 192 ? (NEH_DEC_LOAD | NEH_KEY192) : (NEH_DEC_LOAD | NEH_KEY256))
-
-#define neh_dec_hybrid_key(x) ((x) == 128 ? (NEH_DEC_GEN | NEH_KEY128) : \
- (x) == 192 ? (NEH_DEC_LOAD | NEH_KEY192) : (NEH_DEC_LOAD | NEH_KEY256))
-
-#if defined( _MSC_VER ) && ( _MSC_VER > 1200 )
-#define aligned_auto(type, name, no, stride) __declspec(align(stride)) type name[no]
-#else
-#define aligned_auto(type, name, no, stride) \
- unsigned char _##name[no * sizeof(type) + stride]; \
- type *name = (type*)(16 * ((((unsigned long)(_##name)) + stride - 1) / stride))
-#endif
-
-#if defined( _MSC_VER ) && ( _MSC_VER > 1200 )
-#define aligned_array(type, name, no, stride) __declspec(align(stride)) type name[no]
-#elif defined( __GNUC__ )
-#define aligned_array(type, name, no, stride) type name[no] __attribute__ ((aligned(stride)))
-#else
-#define aligned_array(type, name, no, stride) type name[no]
-#endif
-
-/* VIA ACE codeword */
-
-static unsigned char via_flags = 0;
-
-#if defined ( _MSC_VER ) && ( _MSC_VER > 800 )
-
-#define NEH_REKEY __asm pushfd __asm popfd
-#define NEH_AES __asm _emit 0xf3 __asm _emit 0x0f __asm _emit 0xa7
-#define NEH_ECB NEH_AES __asm _emit 0xc8
-#define NEH_CBC NEH_AES __asm _emit 0xd0
-#define NEH_CFB NEH_AES __asm _emit 0xe0
-#define NEH_OFB NEH_AES __asm _emit 0xe8
-#define NEH_RNG __asm _emit 0x0f __asm _emit 0xa7 __asm _emit 0xc0
-
-INLINE int has_cpuid(void)
-{ char ret_value;
- __asm
- { pushfd /* save EFLAGS register */
- mov eax,[esp] /* copy it to eax */
- mov edx,0x00200000 /* CPUID bit position */
- xor eax,edx /* toggle the CPUID bit */
- push eax /* attempt to set EFLAGS to */
- popfd /* the new value */
- pushfd /* get the new EFLAGS value */
- pop eax /* into eax */
- xor eax,[esp] /* xor with original value */
- and eax,edx /* has CPUID bit changed? */
- setne al /* set to 1 if we have been */
- mov ret_value,al /* able to change it */
- popfd /* restore original EFLAGS */
- }
- return (int)ret_value;
-}
-
-INLINE int is_via_cpu(void)
-{ char ret_value;
- __asm
- { push ebx
- xor eax,eax /* use CPUID to get vendor */
- cpuid /* identity string */
- xor eax,eax /* is it "CentaurHauls" ? */
- sub ebx,0x746e6543 /* 'Cent' */
- or eax,ebx
- sub edx,0x48727561 /* 'aurH' */
- or eax,edx
- sub ecx,0x736c7561 /* 'auls' */
- or eax,ecx
- sete al /* set to 1 if it is VIA ID */
- mov dl,NEH_CPU_READ /* mark CPU type as read */
- or dl,al /* & store result in flags */
- mov [via_flags],dl /* set VIA detected flag */
- mov ret_value,al /* able to change it */
- pop ebx
- }
- return (int)ret_value;
-}
-
-INLINE int read_via_flags(void)
-{ char ret_value = 0;
- __asm
- { mov eax,0xC0000000 /* Centaur extended CPUID */
- cpuid
- mov edx,0xc0000001 /* >= 0xc0000001 if support */
- cmp eax,edx /* for VIA extended feature */
- jnae no_rng /* flags is available */
- mov eax,edx /* read Centaur extended */
- cpuid /* feature flags */
- mov eax,NEH_FLAGS_MASK /* mask out and save */
- and eax,edx /* the RNG and ACE flags */
- or [via_flags],al /* present & enabled flags */
- mov ret_value,al /* able to change it */
-no_rng:
- }
- return (int)ret_value;
-}
-
-INLINE unsigned int via_rng_in(void *buf)
-{ char ret_value = 0x1f;
- __asm
- { push edi
- mov edi,buf /* input buffer address */
- xor edx,edx /* try to fetch 8 bytes */
- NEH_RNG /* do RNG read operation */
- and ret_value,al /* count of bytes returned */
- pop edi
- }
- return (int)ret_value;
-}
-
-INLINE void via_ecb_op5(
- const void *k, const void *c, const void *s, void *d, int l)
-{ __asm
- { push ebx
- NEH_REKEY
- mov ebx, (k)
- mov edx, (c)
- mov esi, (s)
- mov edi, (d)
- mov ecx, (l)
- NEH_ECB
- pop ebx
- }
-}
-
-INLINE void via_cbc_op6(
- const void *k, const void *c, const void *s, void *d, int l, void *v)
-{ __asm
- { push ebx
- NEH_REKEY
- mov ebx, (k)
- mov edx, (c)
- mov esi, (s)
- mov edi, (d)
- mov ecx, (l)
- mov eax, (v)
- NEH_CBC
- pop ebx
- }
-}
-
-INLINE void via_cbc_op7(
- const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)
-{ __asm
- { push ebx
- NEH_REKEY
- mov ebx, (k)
- mov edx, (c)
- mov esi, (s)
- mov edi, (d)
- mov ecx, (l)
- mov eax, (v)
- NEH_CBC
- mov esi, eax
- mov edi, (w)
- movsd
- movsd
- movsd
- movsd
- pop ebx
- }
-}
-
-INLINE void via_cfb_op6(
- const void *k, const void *c, const void *s, void *d, int l, void *v)
-{ __asm
- { push ebx
- NEH_REKEY
- mov ebx, (k)
- mov edx, (c)
- mov esi, (s)
- mov edi, (d)
- mov ecx, (l)
- mov eax, (v)
- NEH_CFB
- pop ebx
- }
-}
-
-INLINE void via_cfb_op7(
- const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)
-{ __asm
- { push ebx
- NEH_REKEY
- mov ebx, (k)
- mov edx, (c)
- mov esi, (s)
- mov edi, (d)
- mov ecx, (l)
- mov eax, (v)
- NEH_CFB
- mov esi, eax
- mov edi, (w)
- movsd
- movsd
- movsd
- movsd
- pop ebx
- }
-}
-
-INLINE void via_ofb_op6(
- const void *k, const void *c, const void *s, void *d, int l, void *v)
-{ __asm
- { push ebx
- NEH_REKEY
- mov ebx, (k)
- mov edx, (c)
- mov esi, (s)
- mov edi, (d)
- mov ecx, (l)
- mov eax, (v)
- NEH_OFB
- pop ebx
- }
-}
-
-#elif defined( __GNUC__ )
-
-#define NEH_REKEY asm("pushfl\n popfl\n\t")
-#define NEH_ECB asm(".byte 0xf3, 0x0f, 0xa7, 0xc8\n\t")
-#define NEH_CBC asm(".byte 0xf3, 0x0f, 0xa7, 0xd0\n\t")
-#define NEH_CFB asm(".byte 0xf3, 0x0f, 0xa7, 0xe0\n\t")
-#define NEH_OFB asm(".byte 0xf3, 0x0f, 0xa7, 0xe8\n\t")
-#define NEH_RNG asm(".byte 0x0f, 0xa7, 0xc0\n\t");
-
-INLINE int has_cpuid(void)
-{ int val;
- asm("pushfl\n\t");
- asm("movl 0(%esp),%eax\n\t");
- asm("xor $0x00200000,%eax\n\t");
- asm("pushl %eax\n\t");
- asm("popfl\n\t");
- asm("pushfl\n\t");
- asm("popl %eax\n\t");
- asm("xorl 0(%esp),%edx\n\t");
- asm("andl $0x00200000,%eax\n\t");
- asm("movl %%eax,%0\n\t" : "=m" (val));
- asm("popfl\n\t");
- return val ? 1 : 0;
-}
-
-INLINE int is_via_cpu(void)
-{ int val;
- asm("pushl %ebx\n\t");
- asm("xorl %eax,%eax\n\t");
- asm("cpuid\n\t");
- asm("xorl %eax,%eax\n\t");
- asm("subl $0x746e6543,%ebx\n\t");
- asm("orl %ebx,%eax\n\t");
- asm("subl $0x48727561,%edx\n\t");
- asm("orl %edx,%eax\n\t");
- asm("subl $0x736c7561,%ecx\n\t");
- asm("orl %ecx,%eax\n\t");
- asm("movl %%eax,%0\n\t" : "=m" (val));
- asm("popl %ebx\n\t");
- val = (val ? 0 : 1);
- via_flags = (val | NEH_CPU_READ);
- return val;
-}
-
-INLINE int read_via_flags(void)
-{ unsigned char val;
- asm("movl $0xc0000000,%eax\n\t");
- asm("cpuid\n\t");
- asm("movl $0xc0000001,%edx\n\t");
- asm("cmpl %edx,%eax\n\t");
- asm("setae %al\n\t");
- asm("movb %%al,%0\n\t" : "=m" (val));
- if(!val) return 0;
- asm("movl $0xc0000001,%eax\n\t");
- asm("cpuid\n\t");
- asm("movb %%dl,%0\n\t" : "=m" (val));
- val &= NEH_FLAGS_MASK;
- via_flags |= val;
- return (int) val;
-}
-
-INLINE int via_rng_in(void *buf)
-{ int val;
- asm("pushl %edi\n\t");
- asm("movl %0,%%edi\n\t" : : "m" (buf));
- asm("xorl %edx,%edx\n\t");
- NEH_RNG
- asm("andl $0x0000001f,%eax\n\t");
- asm("movl %%eax,%0\n\t" : "=m" (val));
- asm("popl %edi\n\t");
- return val;
-}
-
-INLINE volatile void via_ecb_op5(
- const void *k, const void *c, const void *s, void *d, int l)
-{
- asm("pushl %ebx\n\t");
- NEH_REKEY;
- asm("movl %0, %%ebx\n\t" : : "m" (k));
- asm("movl %0, %%edx\n\t" : : "m" (c));
- asm("movl %0, %%esi\n\t" : : "m" (s));
- asm("movl %0, %%edi\n\t" : : "m" (d));
- asm("movl %0, %%ecx\n\t" : : "m" (l));
- NEH_ECB;
- asm("popl %ebx\n\t");
-}
-
-INLINE volatile void via_cbc_op6(
- const void *k, const void *c, const void *s, void *d, int l, void *v)
-{
- asm("pushl %ebx\n\t");
- NEH_REKEY;
- asm("movl %0, %%ebx\n\t" : : "m" (k));
- asm("movl %0, %%edx\n\t" : : "m" (c));
- asm("movl %0, %%esi\n\t" : : "m" (s));
- asm("movl %0, %%edi\n\t" : : "m" (d));
- asm("movl %0, %%ecx\n\t" : : "m" (l));
- asm("movl %0, %%eax\n\t" : : "m" (v));
- NEH_CBC;
- asm("popl %ebx\n\t");
-}
-
-INLINE volatile void via_cbc_op7(
- const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)
-{
- asm("pushl %ebx\n\t");
- NEH_REKEY;
- asm("movl %0, %%ebx\n\t" : : "m" (k));
- asm("movl %0, %%edx\n\t" : : "m" (c));
- asm("movl %0, %%esi\n\t" : : "m" (s));
- asm("movl %0, %%edi\n\t" : : "m" (d));
- asm("movl %0, %%ecx\n\t" : : "m" (l));
- asm("movl %0, %%eax\n\t" : : "m" (v));
- NEH_CBC;
- asm("movl %eax,%esi\n\t");
- asm("movl %0, %%edi\n\t" : : "m" (w));
- asm("movsl; movsl; movsl; movsl\n\t");
- asm("popl %ebx\n\t");
-}
-
-INLINE volatile void via_cfb_op6(
- const void *k, const void *c, const void *s, void *d, int l, void *v)
-{
- asm("pushl %ebx\n\t");
- NEH_REKEY;
- asm("movl %0, %%ebx\n\t" : : "m" (k));
- asm("movl %0, %%edx\n\t" : : "m" (c));
- asm("movl %0, %%esi\n\t" : : "m" (s));
- asm("movl %0, %%edi\n\t" : : "m" (d));
- asm("movl %0, %%ecx\n\t" : : "m" (l));
- asm("movl %0, %%eax\n\t" : : "m" (v));
- NEH_CFB;
- asm("popl %ebx\n\t");
-}
-
-INLINE volatile void via_cfb_op7(
- const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)
-{
- asm("pushl %ebx\n\t");
- NEH_REKEY;
- asm("movl %0, %%ebx\n\t" : : "m" (k));
- asm("movl %0, %%edx\n\t" : : "m" (c));
- asm("movl %0, %%esi\n\t" : : "m" (s));
- asm("movl %0, %%edi\n\t" : : "m" (d));
- asm("movl %0, %%ecx\n\t" : : "m" (l));
- asm("movl %0, %%eax\n\t" : : "m" (v));
- NEH_CFB;
- asm("movl %eax,%esi\n\t");
- asm("movl %0, %%edi\n\t" : : "m" (w));
- asm("movsl; movsl; movsl; movsl\n\t");
- asm("popl %ebx\n\t");
-}
-
-INLINE volatile void via_ofb_op6(
- const void *k, const void *c, const void *s, void *d, int l, void *v)
-{
- asm("pushl %ebx\n\t");
- NEH_REKEY;
- asm("movl %0, %%ebx\n\t" : : "m" (k));
- asm("movl %0, %%edx\n\t" : : "m" (c));
- asm("movl %0, %%esi\n\t" : : "m" (s));
- asm("movl %0, %%edi\n\t" : : "m" (d));
- asm("movl %0, %%ecx\n\t" : : "m" (l));
- asm("movl %0, %%eax\n\t" : : "m" (v));
- NEH_OFB;
- asm("popl %ebx\n\t");
-}
-
-#else
-#error VIA ACE is not available with this compiler
-#endif
-
-INLINE int via_ace_test(void)
-{
- return has_cpuid() && is_via_cpu() && ((read_via_flags() & NEH_ACE_FLAGS) == NEH_ACE_FLAGS);
-}
-
-#define VIA_ACE_AVAILABLE (((via_flags & NEH_ACE_FLAGS) == NEH_ACE_FLAGS) \
- || (via_flags & NEH_CPU_READ) && (via_flags & NEH_CPU_IS_VIA) || via_ace_test())
-
-INLINE int via_rng_test(void)
-{
- return has_cpuid() && is_via_cpu() && ((read_via_flags() & NEH_RNG_FLAGS) == NEH_RNG_FLAGS);
-}
-
-#define VIA_RNG_AVAILABLE (((via_flags & NEH_RNG_FLAGS) == NEH_RNG_FLAGS) \
- || (via_flags & NEH_CPU_READ) && (via_flags & NEH_CPU_IS_VIA) || via_rng_test())
-
-INLINE int read_via_rng(void *buf, int count)
-{ int nbr, max_reads, lcnt = count;
- unsigned char *p, *q;
- aligned_auto(unsigned char, bp, 64, 16);
-
- if(!VIA_RNG_AVAILABLE)
- return 0;
-
- do
- {
- max_reads = MAX_READ_ATTEMPTS;
- do
- nbr = via_rng_in(bp);
- while
- (nbr == 0 && --max_reads);
-
- lcnt -= nbr;
- p = (unsigned char*)buf; q = bp;
- while(nbr--)
- *p++ = *q++;
- }
- while
- (lcnt && max_reads);
-
- return count - lcnt;
-}
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/aescrypt.c b/ios/CodePush/SSZipArchive/aes/aescrypt.c
deleted file mode 100644
index 99141cf86..000000000
--- a/ios/CodePush/SSZipArchive/aes/aescrypt.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
----------------------------------------------------------------------------
-Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.
-
-The redistribution and use of this software (with or without changes)
-is allowed without the payment of fees or royalties provided that:
-
- source code distributions include the above copyright notice, this
- list of conditions and the following disclaimer;
-
- binary distributions include the above copyright notice, this list
- of conditions and the following disclaimer in their documentation.
-
-This software is provided 'as is' with no explicit or implied warranties
-in respect of its operation, including, but not limited to, correctness
-and fitness for purpose.
----------------------------------------------------------------------------
-Issue Date: 20/12/2007
-*/
-
-#include "aesopt.h"
-#include "aestab.h"
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-#define si(y,x,k,c) (s(y,c) = word_in(x, c) ^ (k)[c])
-#define so(y,x,c) word_out(y, c, s(x,c))
-
-#if defined(ARRAYS)
-#define locals(y,x) x[4],y[4]
-#else
-#define locals(y,x) x##0,x##1,x##2,x##3,y##0,y##1,y##2,y##3
-#endif
-
-#define l_copy(y, x) s(y,0) = s(x,0); s(y,1) = s(x,1); \
- s(y,2) = s(x,2); s(y,3) = s(x,3);
-#define state_in(y,x,k) si(y,x,k,0); si(y,x,k,1); si(y,x,k,2); si(y,x,k,3)
-#define state_out(y,x) so(y,x,0); so(y,x,1); so(y,x,2); so(y,x,3)
-#define round(rm,y,x,k) rm(y,x,k,0); rm(y,x,k,1); rm(y,x,k,2); rm(y,x,k,3)
-
-#if ( FUNCS_IN_C & ENCRYPTION_IN_C )
-
-/* Visual C++ .Net v7.1 provides the fastest encryption code when using
- Pentium optimiation with small code but this is poor for decryption
- so we need to control this with the following VC++ pragmas
-*/
-
-#if defined( _MSC_VER ) && !defined( _WIN64 )
-#pragma optimize( "s", on )
-#endif
-
-/* Given the column (c) of the output state variable, the following
- macros give the input state variables which are needed in its
- computation for each row (r) of the state. All the alternative
- macros give the same end values but expand into different ways
- of calculating these values. In particular the complex macro
- used for dynamically variable block sizes is designed to expand
- to a compile time constant whenever possible but will expand to
- conditional clauses on some branches (I am grateful to Frank
- Yellin for this construction)
-*/
-
-#define fwd_var(x,r,c)\
- ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\
- : r == 1 ? ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0))\
- : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\
- : ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2)))
-
-#if defined(FT4_SET)
-#undef dec_fmvars
-#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,n),fwd_var,rf1,c))
-#elif defined(FT1_SET)
-#undef dec_fmvars
-#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(f,n),fwd_var,rf1,c))
-#else
-#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ fwd_mcol(no_table(x,t_use(s,box),fwd_var,rf1,c)))
-#endif
-
-#if defined(FL4_SET)
-#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,l),fwd_var,rf1,c))
-#elif defined(FL1_SET)
-#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(f,l),fwd_var,rf1,c))
-#else
-#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ no_table(x,t_use(s,box),fwd_var,rf1,c))
-#endif
-
-AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1])
-{ uint_32t locals(b0, b1);
- const uint_32t *kp;
-#if defined( dec_fmvars )
- dec_fmvars; /* declare variables for fwd_mcol() if needed */
-#endif
-
- if( cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16 )
- return EXIT_FAILURE;
-
- kp = cx->ks;
- state_in(b0, in, kp);
-
-#if (ENC_UNROLL == FULL)
-
- switch(cx->inf.b[0])
- {
- case 14 * 16:
- round(fwd_rnd, b1, b0, kp + 1 * N_COLS);
- round(fwd_rnd, b0, b1, kp + 2 * N_COLS);
- kp += 2 * N_COLS;
- case 12 * 16:
- round(fwd_rnd, b1, b0, kp + 1 * N_COLS);
- round(fwd_rnd, b0, b1, kp + 2 * N_COLS);
- kp += 2 * N_COLS;
- case 10 * 16:
- round(fwd_rnd, b1, b0, kp + 1 * N_COLS);
- round(fwd_rnd, b0, b1, kp + 2 * N_COLS);
- round(fwd_rnd, b1, b0, kp + 3 * N_COLS);
- round(fwd_rnd, b0, b1, kp + 4 * N_COLS);
- round(fwd_rnd, b1, b0, kp + 5 * N_COLS);
- round(fwd_rnd, b0, b1, kp + 6 * N_COLS);
- round(fwd_rnd, b1, b0, kp + 7 * N_COLS);
- round(fwd_rnd, b0, b1, kp + 8 * N_COLS);
- round(fwd_rnd, b1, b0, kp + 9 * N_COLS);
- round(fwd_lrnd, b0, b1, kp +10 * N_COLS);
- }
-
-#else
-
-#if (ENC_UNROLL == PARTIAL)
- { uint_32t rnd;
- for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd)
- {
- kp += N_COLS;
- round(fwd_rnd, b1, b0, kp);
- kp += N_COLS;
- round(fwd_rnd, b0, b1, kp);
- }
- kp += N_COLS;
- round(fwd_rnd, b1, b0, kp);
-#else
- { uint_32t rnd;
- for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd)
- {
- kp += N_COLS;
- round(fwd_rnd, b1, b0, kp);
- l_copy(b0, b1);
- }
-#endif
- kp += N_COLS;
- round(fwd_lrnd, b0, b1, kp);
- }
-#endif
-
- state_out(out, b0);
- return EXIT_SUCCESS;
-}
-
-#endif
-
-#if ( FUNCS_IN_C & DECRYPTION_IN_C)
-
-/* Visual C++ .Net v7.1 provides the fastest encryption code when using
- Pentium optimiation with small code but this is poor for decryption
- so we need to control this with the following VC++ pragmas
-*/
-
-#if defined( _MSC_VER ) && !defined( _WIN64 )
-#pragma optimize( "t", on )
-#endif
-
-/* Given the column (c) of the output state variable, the following
- macros give the input state variables which are needed in its
- computation for each row (r) of the state. All the alternative
- macros give the same end values but expand into different ways
- of calculating these values. In particular the complex macro
- used for dynamically variable block sizes is designed to expand
- to a compile time constant whenever possible but will expand to
- conditional clauses on some branches (I am grateful to Frank
- Yellin for this construction)
-*/
-
-#define inv_var(x,r,c)\
- ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\
- : r == 1 ? ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2))\
- : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\
- : ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0)))
-
-#if defined(IT4_SET)
-#undef dec_imvars
-#define inv_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,n),inv_var,rf1,c))
-#elif defined(IT1_SET)
-#undef dec_imvars
-#define inv_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(i,n),inv_var,rf1,c))
-#else
-#define inv_rnd(y,x,k,c) (s(y,c) = inv_mcol((k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c)))
-#endif
-
-#if defined(IL4_SET)
-#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,l),inv_var,rf1,c))
-#elif defined(IL1_SET)
-#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(i,l),inv_var,rf1,c))
-#else
-#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c))
-#endif
-
-/* This code can work with the decryption key schedule in the */
-/* order that is used for encrytpion (where the 1st decryption */
-/* round key is at the high end ot the schedule) or with a key */
-/* schedule that has been reversed to put the 1st decryption */
-/* round key at the low end of the schedule in memory (when */
-/* AES_REV_DKS is defined) */
-
-#ifdef AES_REV_DKS
-#define key_ofs 0
-#define rnd_key(n) (kp + n * N_COLS)
-#else
-#define key_ofs 1
-#define rnd_key(n) (kp - n * N_COLS)
-#endif
-
-AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1])
-{ uint_32t locals(b0, b1);
-#if defined( dec_imvars )
- dec_imvars; /* declare variables for inv_mcol() if needed */
-#endif
- const uint_32t *kp;
-
- if( cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16 )
- return EXIT_FAILURE;
-
- kp = cx->ks + (key_ofs ? (cx->inf.b[0] >> 2) : 0);
- state_in(b0, in, kp);
-
-#if (DEC_UNROLL == FULL)
-
- kp = cx->ks + (key_ofs ? 0 : (cx->inf.b[0] >> 2));
- switch(cx->inf.b[0])
- {
- case 14 * 16:
- round(inv_rnd, b1, b0, rnd_key(-13));
- round(inv_rnd, b0, b1, rnd_key(-12));
- case 12 * 16:
- round(inv_rnd, b1, b0, rnd_key(-11));
- round(inv_rnd, b0, b1, rnd_key(-10));
- case 10 * 16:
- round(inv_rnd, b1, b0, rnd_key(-9));
- round(inv_rnd, b0, b1, rnd_key(-8));
- round(inv_rnd, b1, b0, rnd_key(-7));
- round(inv_rnd, b0, b1, rnd_key(-6));
- round(inv_rnd, b1, b0, rnd_key(-5));
- round(inv_rnd, b0, b1, rnd_key(-4));
- round(inv_rnd, b1, b0, rnd_key(-3));
- round(inv_rnd, b0, b1, rnd_key(-2));
- round(inv_rnd, b1, b0, rnd_key(-1));
- round(inv_lrnd, b0, b1, rnd_key( 0));
- }
-
-#else
-
-#if (DEC_UNROLL == PARTIAL)
- { uint_32t rnd;
- for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd)
- {
- kp = rnd_key(1);
- round(inv_rnd, b1, b0, kp);
- kp = rnd_key(1);
- round(inv_rnd, b0, b1, kp);
- }
- kp = rnd_key(1);
- round(inv_rnd, b1, b0, kp);
-#else
- { uint_32t rnd;
- for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd)
- {
- kp = rnd_key(1);
- round(inv_rnd, b1, b0, kp);
- l_copy(b0, b1);
- }
-#endif
- kp = rnd_key(1);
- round(inv_lrnd, b0, b1, kp);
- }
-#endif
-
- state_out(out, b0);
- return EXIT_SUCCESS;
-}
-
-#endif
-
-#if defined(__cplusplus)
-}
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/aeskey.c b/ios/CodePush/SSZipArchive/aes/aeskey.c
deleted file mode 100644
index 0378f0cf6..000000000
--- a/ios/CodePush/SSZipArchive/aes/aeskey.c
+++ /dev/null
@@ -1,548 +0,0 @@
-/*
----------------------------------------------------------------------------
-Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.
-
-The redistribution and use of this software (with or without changes)
-is allowed without the payment of fees or royalties provided that:
-
- source code distributions include the above copyright notice, this
- list of conditions and the following disclaimer;
-
- binary distributions include the above copyright notice, this list
- of conditions and the following disclaimer in their documentation.
-
-This software is provided 'as is' with no explicit or implied warranties
-in respect of its operation, including, but not limited to, correctness
-and fitness for purpose.
----------------------------------------------------------------------------
-Issue Date: 20/12/2007
-*/
-
-#include "aesopt.h"
-#include "aestab.h"
-
-#ifdef USE_VIA_ACE_IF_PRESENT
-# include "aes_via_ace.h"
-#endif
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-/* Initialise the key schedule from the user supplied key. The key
- length can be specified in bytes, with legal values of 16, 24
- and 32, or in bits, with legal values of 128, 192 and 256. These
- values correspond with Nk values of 4, 6 and 8 respectively.
-
- The following macros implement a single cycle in the key
- schedule generation process. The number of cycles needed
- for each cx->n_col and nk value is:
-
- nk = 4 5 6 7 8
- ------------------------------
- cx->n_col = 4 10 9 8 7 7
- cx->n_col = 5 14 11 10 9 9
- cx->n_col = 6 19 15 12 11 11
- cx->n_col = 7 21 19 16 13 14
- cx->n_col = 8 29 23 19 17 14
-*/
-
-#if defined( REDUCE_CODE_SIZE )
-# define ls_box ls_sub
- uint_32t ls_sub(const uint_32t t, const uint_32t n);
-# define inv_mcol im_sub
- uint_32t im_sub(const uint_32t x);
-# ifdef ENC_KS_UNROLL
-# undef ENC_KS_UNROLL
-# endif
-# ifdef DEC_KS_UNROLL
-# undef DEC_KS_UNROLL
-# endif
-#endif
-
-#if (FUNCS_IN_C & ENC_KEYING_IN_C)
-
-#if defined(AES_128) || defined( AES_VAR )
-
-#define ke4(k,i) \
-{ k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \
- k[4*(i)+5] = ss[1] ^= ss[0]; \
- k[4*(i)+6] = ss[2] ^= ss[1]; \
- k[4*(i)+7] = ss[3] ^= ss[2]; \
-}
-
-AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1])
-{ uint_32t ss[4];
-
- cx->ks[0] = ss[0] = word_in(key, 0);
- cx->ks[1] = ss[1] = word_in(key, 1);
- cx->ks[2] = ss[2] = word_in(key, 2);
- cx->ks[3] = ss[3] = word_in(key, 3);
-
-#ifdef ENC_KS_UNROLL
- ke4(cx->ks, 0); ke4(cx->ks, 1);
- ke4(cx->ks, 2); ke4(cx->ks, 3);
- ke4(cx->ks, 4); ke4(cx->ks, 5);
- ke4(cx->ks, 6); ke4(cx->ks, 7);
- ke4(cx->ks, 8);
-#else
- { uint_32t i;
- for(i = 0; i < 9; ++i)
- ke4(cx->ks, i);
- }
-#endif
- ke4(cx->ks, 9);
- cx->inf.l = 0;
- cx->inf.b[0] = 10 * 16;
-
-#ifdef USE_VIA_ACE_IF_PRESENT
- if(VIA_ACE_AVAILABLE)
- cx->inf.b[1] = 0xff;
-#endif
- return EXIT_SUCCESS;
-}
-
-#endif
-
-#if defined(AES_192) || defined( AES_VAR )
-
-#define kef6(k,i) \
-{ k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \
- k[6*(i)+ 7] = ss[1] ^= ss[0]; \
- k[6*(i)+ 8] = ss[2] ^= ss[1]; \
- k[6*(i)+ 9] = ss[3] ^= ss[2]; \
-}
-
-#define ke6(k,i) \
-{ kef6(k,i); \
- k[6*(i)+10] = ss[4] ^= ss[3]; \
- k[6*(i)+11] = ss[5] ^= ss[4]; \
-}
-
-AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1])
-{ uint_32t ss[6];
-
- cx->ks[0] = ss[0] = word_in(key, 0);
- cx->ks[1] = ss[1] = word_in(key, 1);
- cx->ks[2] = ss[2] = word_in(key, 2);
- cx->ks[3] = ss[3] = word_in(key, 3);
- cx->ks[4] = ss[4] = word_in(key, 4);
- cx->ks[5] = ss[5] = word_in(key, 5);
-
-#ifdef ENC_KS_UNROLL
- ke6(cx->ks, 0); ke6(cx->ks, 1);
- ke6(cx->ks, 2); ke6(cx->ks, 3);
- ke6(cx->ks, 4); ke6(cx->ks, 5);
- ke6(cx->ks, 6);
-#else
- { uint_32t i;
- for(i = 0; i < 7; ++i)
- ke6(cx->ks, i);
- }
-#endif
- kef6(cx->ks, 7);
- cx->inf.l = 0;
- cx->inf.b[0] = 12 * 16;
-
-#ifdef USE_VIA_ACE_IF_PRESENT
- if(VIA_ACE_AVAILABLE)
- cx->inf.b[1] = 0xff;
-#endif
- return EXIT_SUCCESS;
-}
-
-#endif
-
-#if defined(AES_256) || defined( AES_VAR )
-
-#define kef8(k,i) \
-{ k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \
- k[8*(i)+ 9] = ss[1] ^= ss[0]; \
- k[8*(i)+10] = ss[2] ^= ss[1]; \
- k[8*(i)+11] = ss[3] ^= ss[2]; \
-}
-
-#define ke8(k,i) \
-{ kef8(k,i); \
- k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); \
- k[8*(i)+13] = ss[5] ^= ss[4]; \
- k[8*(i)+14] = ss[6] ^= ss[5]; \
- k[8*(i)+15] = ss[7] ^= ss[6]; \
-}
-
-AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1])
-{ uint_32t ss[8];
-
- cx->ks[0] = ss[0] = word_in(key, 0);
- cx->ks[1] = ss[1] = word_in(key, 1);
- cx->ks[2] = ss[2] = word_in(key, 2);
- cx->ks[3] = ss[3] = word_in(key, 3);
- cx->ks[4] = ss[4] = word_in(key, 4);
- cx->ks[5] = ss[5] = word_in(key, 5);
- cx->ks[6] = ss[6] = word_in(key, 6);
- cx->ks[7] = ss[7] = word_in(key, 7);
-
-#ifdef ENC_KS_UNROLL
- ke8(cx->ks, 0); ke8(cx->ks, 1);
- ke8(cx->ks, 2); ke8(cx->ks, 3);
- ke8(cx->ks, 4); ke8(cx->ks, 5);
-#else
- { uint_32t i;
- for(i = 0; i < 6; ++i)
- ke8(cx->ks, i);
- }
-#endif
- kef8(cx->ks, 6);
- cx->inf.l = 0;
- cx->inf.b[0] = 14 * 16;
-
-#ifdef USE_VIA_ACE_IF_PRESENT
- if(VIA_ACE_AVAILABLE)
- cx->inf.b[1] = 0xff;
-#endif
- return EXIT_SUCCESS;
-}
-
-#endif
-
-#if defined( AES_VAR )
-
-AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1])
-{
- switch(key_len)
- {
- case 16: case 128: return aes_encrypt_key128(key, cx);
- case 24: case 192: return aes_encrypt_key192(key, cx);
- case 32: case 256: return aes_encrypt_key256(key, cx);
- default: return EXIT_FAILURE;
- }
-}
-
-#endif
-
-#endif
-
-#if (FUNCS_IN_C & DEC_KEYING_IN_C)
-
-/* this is used to store the decryption round keys */
-/* in forward or reverse order */
-
-#ifdef AES_REV_DKS
-#define v(n,i) ((n) - (i) + 2 * ((i) & 3))
-#else
-#define v(n,i) (i)
-#endif
-
-#if DEC_ROUND == NO_TABLES
-#define ff(x) (x)
-#else
-#define ff(x) inv_mcol(x)
-#if defined( dec_imvars )
-#define d_vars dec_imvars
-#endif
-#endif
-
-#if defined(AES_128) || defined( AES_VAR )
-
-#define k4e(k,i) \
-{ k[v(40,(4*(i))+4)] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \
- k[v(40,(4*(i))+5)] = ss[1] ^= ss[0]; \
- k[v(40,(4*(i))+6)] = ss[2] ^= ss[1]; \
- k[v(40,(4*(i))+7)] = ss[3] ^= ss[2]; \
-}
-
-#if 1
-
-#define kdf4(k,i) \
-{ ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \
- ss[1] = ss[1] ^ ss[3]; \
- ss[2] = ss[2] ^ ss[3]; \
- ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \
- ss[i % 4] ^= ss[4]; \
- ss[4] ^= k[v(40,(4*(i)))]; k[v(40,(4*(i))+4)] = ff(ss[4]); \
- ss[4] ^= k[v(40,(4*(i))+1)]; k[v(40,(4*(i))+5)] = ff(ss[4]); \
- ss[4] ^= k[v(40,(4*(i))+2)]; k[v(40,(4*(i))+6)] = ff(ss[4]); \
- ss[4] ^= k[v(40,(4*(i))+3)]; k[v(40,(4*(i))+7)] = ff(ss[4]); \
-}
-
-#define kd4(k,i) \
-{ ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \
- ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \
- k[v(40,(4*(i))+4)] = ss[4] ^= k[v(40,(4*(i)))]; \
- k[v(40,(4*(i))+5)] = ss[4] ^= k[v(40,(4*(i))+1)]; \
- k[v(40,(4*(i))+6)] = ss[4] ^= k[v(40,(4*(i))+2)]; \
- k[v(40,(4*(i))+7)] = ss[4] ^= k[v(40,(4*(i))+3)]; \
-}
-
-#define kdl4(k,i) \
-{ ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \
- k[v(40,(4*(i))+4)] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \
- k[v(40,(4*(i))+5)] = ss[1] ^ ss[3]; \
- k[v(40,(4*(i))+6)] = ss[0]; \
- k[v(40,(4*(i))+7)] = ss[1]; \
-}
-
-#else
-
-#define kdf4(k,i) \
-{ ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ff(ss[0]); \
- ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ff(ss[1]); \
- ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ff(ss[2]); \
- ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ff(ss[3]); \
-}
-
-#define kd4(k,i) \
-{ ss[4] = ls_box(ss[3],3) ^ t_use(r,c)[i]; \
- ss[0] ^= ss[4]; ss[4] = ff(ss[4]); k[v(40,(4*(i))+ 4)] = ss[4] ^= k[v(40,(4*(i)))]; \
- ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[4] ^= k[v(40,(4*(i))+ 1)]; \
- ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[4] ^= k[v(40,(4*(i))+ 2)]; \
- ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[4] ^= k[v(40,(4*(i))+ 3)]; \
-}
-
-#define kdl4(k,i) \
-{ ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ss[0]; \
- ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[1]; \
- ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[2]; \
- ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[3]; \
-}
-
-#endif
-
-AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1])
-{ uint_32t ss[5];
-#if defined( d_vars )
- d_vars;
-#endif
- cx->ks[v(40,(0))] = ss[0] = word_in(key, 0);
- cx->ks[v(40,(1))] = ss[1] = word_in(key, 1);
- cx->ks[v(40,(2))] = ss[2] = word_in(key, 2);
- cx->ks[v(40,(3))] = ss[3] = word_in(key, 3);
-
-#ifdef DEC_KS_UNROLL
- kdf4(cx->ks, 0); kd4(cx->ks, 1);
- kd4(cx->ks, 2); kd4(cx->ks, 3);
- kd4(cx->ks, 4); kd4(cx->ks, 5);
- kd4(cx->ks, 6); kd4(cx->ks, 7);
- kd4(cx->ks, 8); kdl4(cx->ks, 9);
-#else
- { uint_32t i;
- for(i = 0; i < 10; ++i)
- k4e(cx->ks, i);
-#if !(DEC_ROUND == NO_TABLES)
- for(i = N_COLS; i < 10 * N_COLS; ++i)
- cx->ks[i] = inv_mcol(cx->ks[i]);
-#endif
- }
-#endif
- cx->inf.l = 0;
- cx->inf.b[0] = 10 * 16;
-
-#ifdef USE_VIA_ACE_IF_PRESENT
- if(VIA_ACE_AVAILABLE)
- cx->inf.b[1] = 0xff;
-#endif
- return EXIT_SUCCESS;
-}
-
-#endif
-
-#if defined(AES_192) || defined( AES_VAR )
-
-#define k6ef(k,i) \
-{ k[v(48,(6*(i))+ 6)] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \
- k[v(48,(6*(i))+ 7)] = ss[1] ^= ss[0]; \
- k[v(48,(6*(i))+ 8)] = ss[2] ^= ss[1]; \
- k[v(48,(6*(i))+ 9)] = ss[3] ^= ss[2]; \
-}
-
-#define k6e(k,i) \
-{ k6ef(k,i); \
- k[v(48,(6*(i))+10)] = ss[4] ^= ss[3]; \
- k[v(48,(6*(i))+11)] = ss[5] ^= ss[4]; \
-}
-
-#define kdf6(k,i) \
-{ ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ff(ss[0]); \
- ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ff(ss[1]); \
- ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ff(ss[2]); \
- ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ff(ss[3]); \
- ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ff(ss[4]); \
- ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ff(ss[5]); \
-}
-
-#define kd6(k,i) \
-{ ss[6] = ls_box(ss[5],3) ^ t_use(r,c)[i]; \
- ss[0] ^= ss[6]; ss[6] = ff(ss[6]); k[v(48,(6*(i))+ 6)] = ss[6] ^= k[v(48,(6*(i)))]; \
- ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[6] ^= k[v(48,(6*(i))+ 1)]; \
- ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[6] ^= k[v(48,(6*(i))+ 2)]; \
- ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[6] ^= k[v(48,(6*(i))+ 3)]; \
- ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ss[6] ^= k[v(48,(6*(i))+ 4)]; \
- ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ss[6] ^= k[v(48,(6*(i))+ 5)]; \
-}
-
-#define kdl6(k,i) \
-{ ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ss[0]; \
- ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[1]; \
- ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[2]; \
- ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[3]; \
-}
-
-AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1])
-{ uint_32t ss[7];
-#if defined( d_vars )
- d_vars;
-#endif
- cx->ks[v(48,(0))] = ss[0] = word_in(key, 0);
- cx->ks[v(48,(1))] = ss[1] = word_in(key, 1);
- cx->ks[v(48,(2))] = ss[2] = word_in(key, 2);
- cx->ks[v(48,(3))] = ss[3] = word_in(key, 3);
-
-#ifdef DEC_KS_UNROLL
- cx->ks[v(48,(4))] = ff(ss[4] = word_in(key, 4));
- cx->ks[v(48,(5))] = ff(ss[5] = word_in(key, 5));
- kdf6(cx->ks, 0); kd6(cx->ks, 1);
- kd6(cx->ks, 2); kd6(cx->ks, 3);
- kd6(cx->ks, 4); kd6(cx->ks, 5);
- kd6(cx->ks, 6); kdl6(cx->ks, 7);
-#else
- cx->ks[v(48,(4))] = ss[4] = word_in(key, 4);
- cx->ks[v(48,(5))] = ss[5] = word_in(key, 5);
- { uint_32t i;
-
- for(i = 0; i < 7; ++i)
- k6e(cx->ks, i);
- k6ef(cx->ks, 7);
-#if !(DEC_ROUND == NO_TABLES)
- for(i = N_COLS; i < 12 * N_COLS; ++i)
- cx->ks[i] = inv_mcol(cx->ks[i]);
-#endif
- }
-#endif
- cx->inf.l = 0;
- cx->inf.b[0] = 12 * 16;
-
-#ifdef USE_VIA_ACE_IF_PRESENT
- if(VIA_ACE_AVAILABLE)
- cx->inf.b[1] = 0xff;
-#endif
- return EXIT_SUCCESS;
-}
-
-#endif
-
-#if defined(AES_256) || defined( AES_VAR )
-
-#define k8ef(k,i) \
-{ k[v(56,(8*(i))+ 8)] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \
- k[v(56,(8*(i))+ 9)] = ss[1] ^= ss[0]; \
- k[v(56,(8*(i))+10)] = ss[2] ^= ss[1]; \
- k[v(56,(8*(i))+11)] = ss[3] ^= ss[2]; \
-}
-
-#define k8e(k,i) \
-{ k8ef(k,i); \
- k[v(56,(8*(i))+12)] = ss[4] ^= ls_box(ss[3],0); \
- k[v(56,(8*(i))+13)] = ss[5] ^= ss[4]; \
- k[v(56,(8*(i))+14)] = ss[6] ^= ss[5]; \
- k[v(56,(8*(i))+15)] = ss[7] ^= ss[6]; \
-}
-
-#define kdf8(k,i) \
-{ ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ff(ss[0]); \
- ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ff(ss[1]); \
- ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ff(ss[2]); \
- ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ff(ss[3]); \
- ss[4] ^= ls_box(ss[3],0); k[v(56,(8*(i))+12)] = ff(ss[4]); \
- ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ff(ss[5]); \
- ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ff(ss[6]); \
- ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ff(ss[7]); \
-}
-
-#define kd8(k,i) \
-{ ss[8] = ls_box(ss[7],3) ^ t_use(r,c)[i]; \
- ss[0] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+ 8)] = ss[8] ^= k[v(56,(8*(i)))]; \
- ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[8] ^= k[v(56,(8*(i))+ 1)]; \
- ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[8] ^= k[v(56,(8*(i))+ 2)]; \
- ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[8] ^= k[v(56,(8*(i))+ 3)]; \
- ss[8] = ls_box(ss[3],0); \
- ss[4] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+12)] = ss[8] ^= k[v(56,(8*(i))+ 4)]; \
- ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ss[8] ^= k[v(56,(8*(i))+ 5)]; \
- ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ss[8] ^= k[v(56,(8*(i))+ 6)]; \
- ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ss[8] ^= k[v(56,(8*(i))+ 7)]; \
-}
-
-#define kdl8(k,i) \
-{ ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ss[0]; \
- ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[1]; \
- ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[2]; \
- ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[3]; \
-}
-
-AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1])
-{ uint_32t ss[9];
-#if defined( d_vars )
- d_vars;
-#endif
- cx->ks[v(56,(0))] = ss[0] = word_in(key, 0);
- cx->ks[v(56,(1))] = ss[1] = word_in(key, 1);
- cx->ks[v(56,(2))] = ss[2] = word_in(key, 2);
- cx->ks[v(56,(3))] = ss[3] = word_in(key, 3);
-
-#ifdef DEC_KS_UNROLL
- cx->ks[v(56,(4))] = ff(ss[4] = word_in(key, 4));
- cx->ks[v(56,(5))] = ff(ss[5] = word_in(key, 5));
- cx->ks[v(56,(6))] = ff(ss[6] = word_in(key, 6));
- cx->ks[v(56,(7))] = ff(ss[7] = word_in(key, 7));
- kdf8(cx->ks, 0); kd8(cx->ks, 1);
- kd8(cx->ks, 2); kd8(cx->ks, 3);
- kd8(cx->ks, 4); kd8(cx->ks, 5);
- kdl8(cx->ks, 6);
-#else
- cx->ks[v(56,(4))] = ss[4] = word_in(key, 4);
- cx->ks[v(56,(5))] = ss[5] = word_in(key, 5);
- cx->ks[v(56,(6))] = ss[6] = word_in(key, 6);
- cx->ks[v(56,(7))] = ss[7] = word_in(key, 7);
- { uint_32t i;
-
- for(i = 0; i < 6; ++i)
- k8e(cx->ks, i);
- k8ef(cx->ks, 6);
-#if !(DEC_ROUND == NO_TABLES)
- for(i = N_COLS; i < 14 * N_COLS; ++i)
- cx->ks[i] = inv_mcol(cx->ks[i]);
-#endif
- }
-#endif
- cx->inf.l = 0;
- cx->inf.b[0] = 14 * 16;
-
-#ifdef USE_VIA_ACE_IF_PRESENT
- if(VIA_ACE_AVAILABLE)
- cx->inf.b[1] = 0xff;
-#endif
- return EXIT_SUCCESS;
-}
-
-#endif
-
-#if defined( AES_VAR )
-
-AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1])
-{
- switch(key_len)
- {
- case 16: case 128: return aes_decrypt_key128(key, cx);
- case 24: case 192: return aes_decrypt_key192(key, cx);
- case 32: case 256: return aes_decrypt_key256(key, cx);
- default: return EXIT_FAILURE;
- }
-}
-
-#endif
-
-#endif
-
-#if defined(__cplusplus)
-}
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/aesopt.h b/ios/CodePush/SSZipArchive/aes/aesopt.h
deleted file mode 100644
index 8851425e1..000000000
--- a/ios/CodePush/SSZipArchive/aes/aesopt.h
+++ /dev/null
@@ -1,739 +0,0 @@
-/*
----------------------------------------------------------------------------
-Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.
-
-The redistribution and use of this software (with or without changes)
-is allowed without the payment of fees or royalties provided that:
-
- source code distributions include the above copyright notice, this
- list of conditions and the following disclaimer;
-
- binary distributions include the above copyright notice, this list
- of conditions and the following disclaimer in their documentation.
-
-This software is provided 'as is' with no explicit or implied warranties
-in respect of its operation, including, but not limited to, correctness
-and fitness for purpose.
----------------------------------------------------------------------------
-Issue Date: 20/12/2007
-
- This file contains the compilation options for AES (Rijndael) and code
- that is common across encryption, key scheduling and table generation.
-
- OPERATION
-
- These source code files implement the AES algorithm Rijndael designed by
- Joan Daemen and Vincent Rijmen. This version is designed for the standard
- block size of 16 bytes and for key sizes of 128, 192 and 256 bits (16, 24
- and 32 bytes).
-
- This version is designed for flexibility and speed using operations on
- 32-bit words rather than operations on bytes. It can be compiled with
- either big or little endian internal byte order but is faster when the
- native byte order for the processor is used.
-
- THE CIPHER INTERFACE
-
- The cipher interface is implemented as an array of bytes in which lower
- AES bit sequence indexes map to higher numeric significance within bytes.
-
- uint_8t (an unsigned 8-bit type)
- uint_32t (an unsigned 32-bit type)
- struct aes_encrypt_ctx (structure for the cipher encryption context)
- struct aes_decrypt_ctx (structure for the cipher decryption context)
- AES_RETURN the function return type
-
- C subroutine calls:
-
- AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]);
- AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]);
- AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]);
- AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out,
- const aes_encrypt_ctx cx[1]);
-
- AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]);
- AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]);
- AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]);
- AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out,
- const aes_decrypt_ctx cx[1]);
-
- IMPORTANT NOTE: If you are using this C interface with dynamic tables make sure that
- you call aes_init() before AES is used so that the tables are initialised.
-
- C++ aes class subroutines:
-
- Class AESencrypt for encryption
-
- Construtors:
- AESencrypt(void)
- AESencrypt(const unsigned char *key) - 128 bit key
- Members:
- AES_RETURN key128(const unsigned char *key)
- AES_RETURN key192(const unsigned char *key)
- AES_RETURN key256(const unsigned char *key)
- AES_RETURN encrypt(const unsigned char *in, unsigned char *out) const
-
- Class AESdecrypt for encryption
- Construtors:
- AESdecrypt(void)
- AESdecrypt(const unsigned char *key) - 128 bit key
- Members:
- AES_RETURN key128(const unsigned char *key)
- AES_RETURN key192(const unsigned char *key)
- AES_RETURN key256(const unsigned char *key)
- AES_RETURN decrypt(const unsigned char *in, unsigned char *out) const
-*/
-
-#if !defined( _AESOPT_H )
-#define _AESOPT_H
-
-#if defined( __cplusplus )
-#include "aescpp.h"
-#else
-#include "aes.h"
-#endif
-
-/* PLATFORM SPECIFIC INCLUDES */
-
-#include "brg_endian.h"
-
-/* CONFIGURATION - THE USE OF DEFINES
-
- Later in this section there are a number of defines that control the
- operation of the code. In each section, the purpose of each define is
- explained so that the relevant form can be included or excluded by
- setting either 1's or 0's respectively on the branches of the related
- #if clauses. The following local defines should not be changed.
-*/
-
-#define ENCRYPTION_IN_C 1
-#define DECRYPTION_IN_C 2
-#define ENC_KEYING_IN_C 4
-#define DEC_KEYING_IN_C 8
-
-#define NO_TABLES 0
-#define ONE_TABLE 1
-#define FOUR_TABLES 4
-#define NONE 0
-#define PARTIAL 1
-#define FULL 2
-
-/* --- START OF USER CONFIGURED OPTIONS --- */
-
-/* 1. BYTE ORDER WITHIN 32 BIT WORDS
-
- The fundamental data processing units in Rijndael are 8-bit bytes. The
- input, output and key input are all enumerated arrays of bytes in which
- bytes are numbered starting at zero and increasing to one less than the
- number of bytes in the array in question. This enumeration is only used
- for naming bytes and does not imply any adjacency or order relationship
- from one byte to another. When these inputs and outputs are considered
- as bit sequences, bits 8*n to 8*n+7 of the bit sequence are mapped to
- byte[n] with bit 8n+i in the sequence mapped to bit 7-i within the byte.
- In this implementation bits are numbered from 0 to 7 starting at the
- numerically least significant end of each byte (bit n represents 2^n).
-
- However, Rijndael can be implemented more efficiently using 32-bit
- words by packing bytes into words so that bytes 4*n to 4*n+3 are placed
- into word[n]. While in principle these bytes can be assembled into words
- in any positions, this implementation only supports the two formats in
- which bytes in adjacent positions within words also have adjacent byte
- numbers. This order is called big-endian if the lowest numbered bytes
- in words have the highest numeric significance and little-endian if the
- opposite applies.
-
- This code can work in either order irrespective of the order used by the
- machine on which it runs. Normally the internal byte order will be set
- to the order of the processor on which the code is to be run but this
- define can be used to reverse this in special situations
-
- WARNING: Assembler code versions rely on PLATFORM_BYTE_ORDER being set.
- This define will hence be redefined later (in section 4) if necessary
-*/
-
-#if 1
-# define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER
-#elif 0
-# define ALGORITHM_BYTE_ORDER IS_LITTLE_ENDIAN
-#elif 0
-# define ALGORITHM_BYTE_ORDER IS_BIG_ENDIAN
-#else
-# error The algorithm byte order is not defined
-#endif
-
-/* 2. VIA ACE SUPPORT */
-
-#if !defined(__APPLE__) && defined( __GNUC__ ) && defined( __i386__ ) \
- || defined( _WIN32 ) && defined( _M_IX86 ) \
- && !(defined( _WIN64 ) || defined( _WIN32_WCE ) || defined( _MSC_VER ) && ( _MSC_VER <= 800 ))
-# define VIA_ACE_POSSIBLE
-#endif
-
-/* Define this option if support for the VIA ACE is required. This uses
- inline assembler instructions and is only implemented for the Microsoft,
- Intel and GCC compilers. If VIA ACE is known to be present, then defining
- ASSUME_VIA_ACE_PRESENT will remove the ordinary encryption/decryption
- code. If USE_VIA_ACE_IF_PRESENT is defined then VIA ACE will be used if
- it is detected (both present and enabled) but the normal AES code will
- also be present.
-
- When VIA ACE is to be used, all AES encryption contexts MUST be 16 byte
- aligned; other input/output buffers do not need to be 16 byte aligned
- but there are very large performance gains if this can be arranged.
- VIA ACE also requires the decryption key schedule to be in reverse
- order (which later checks below ensure).
-*/
-
-#if 1 && defined( VIA_ACE_POSSIBLE ) && !defined( USE_VIA_ACE_IF_PRESENT )
-# define USE_VIA_ACE_IF_PRESENT
-#endif
-
-#if 0 && defined( VIA_ACE_POSSIBLE ) && !defined( ASSUME_VIA_ACE_PRESENT )
-# define ASSUME_VIA_ACE_PRESENT
-# endif
-
-/* 3. ASSEMBLER SUPPORT
-
- This define (which can be on the command line) enables the use of the
- assembler code routines for encryption, decryption and key scheduling
- as follows:
-
- ASM_X86_V1C uses the assembler (aes_x86_v1.asm) with large tables for
- encryption and decryption and but with key scheduling in C
- ASM_X86_V2 uses assembler (aes_x86_v2.asm) with compressed tables for
- encryption, decryption and key scheduling
- ASM_X86_V2C uses assembler (aes_x86_v2.asm) with compressed tables for
- encryption and decryption and but with key scheduling in C
- ASM_AMD64_C uses assembler (aes_amd64.asm) with compressed tables for
- encryption and decryption and but with key scheduling in C
-
- Change one 'if 0' below to 'if 1' to select the version or define
- as a compilation option.
-*/
-
-#if 0 && !defined( ASM_X86_V1C )
-# define ASM_X86_V1C
-#elif 0 && !defined( ASM_X86_V2 )
-# define ASM_X86_V2
-#elif 0 && !defined( ASM_X86_V2C )
-# define ASM_X86_V2C
-#elif 0 && !defined( ASM_AMD64_C )
-# define ASM_AMD64_C
-#endif
-
-#if (defined ( ASM_X86_V1C ) || defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )) \
- && !defined( _M_IX86 ) || defined( ASM_AMD64_C ) && !defined( _M_X64 )
-# error Assembler code is only available for x86 and AMD64 systems
-#endif
-
-/* 4. FAST INPUT/OUTPUT OPERATIONS.
-
- On some machines it is possible to improve speed by transferring the
- bytes in the input and output arrays to and from the internal 32-bit
- variables by addressing these arrays as if they are arrays of 32-bit
- words. On some machines this will always be possible but there may
- be a large performance penalty if the byte arrays are not aligned on
- the normal word boundaries. On other machines this technique will
- lead to memory access errors when such 32-bit word accesses are not
- properly aligned. The option SAFE_IO avoids such problems but will
- often be slower on those machines that support misaligned access
- (especially so if care is taken to align the input and output byte
- arrays on 32-bit word boundaries). If SAFE_IO is not defined it is
- assumed that access to byte arrays as if they are arrays of 32-bit
- words will not cause problems when such accesses are misaligned.
-*/
-#if 1 && !defined( _MSC_VER )
-# define SAFE_IO
-#endif
-
-/* 5. LOOP UNROLLING
-
- The code for encryption and decrytpion cycles through a number of rounds
- that can be implemented either in a loop or by expanding the code into a
- long sequence of instructions, the latter producing a larger program but
- one that will often be much faster. The latter is called loop unrolling.
- There are also potential speed advantages in expanding two iterations in
- a loop with half the number of iterations, which is called partial loop
- unrolling. The following options allow partial or full loop unrolling
- to be set independently for encryption and decryption
-*/
-#if 1
-# define ENC_UNROLL FULL
-#elif 0
-# define ENC_UNROLL PARTIAL
-#else
-# define ENC_UNROLL NONE
-#endif
-
-#if 1
-# define DEC_UNROLL FULL
-#elif 0
-# define DEC_UNROLL PARTIAL
-#else
-# define DEC_UNROLL NONE
-#endif
-
-#if 1
-# define ENC_KS_UNROLL
-#endif
-
-#if 1
-# define DEC_KS_UNROLL
-#endif
-
-/* 6. FAST FINITE FIELD OPERATIONS
-
- If this section is included, tables are used to provide faster finite
- field arithmetic (this has no effect if FIXED_TABLES is defined).
-*/
-#if 1
-# define FF_TABLES
-#endif
-
-/* 7. INTERNAL STATE VARIABLE FORMAT
-
- The internal state of Rijndael is stored in a number of local 32-bit
- word varaibles which can be defined either as an array or as individual
- names variables. Include this section if you want to store these local
- varaibles in arrays. Otherwise individual local variables will be used.
-*/
-#if 1
-# define ARRAYS
-#endif
-
-/* 8. FIXED OR DYNAMIC TABLES
-
- When this section is included the tables used by the code are compiled
- statically into the binary file. Otherwise the subroutine aes_init()
- must be called to compute them before the code is first used.
-*/
-#if 1 && !(defined( _MSC_VER ) && ( _MSC_VER <= 800 ))
-# define FIXED_TABLES
-#endif
-
-/* 9. MASKING OR CASTING FROM LONGER VALUES TO BYTES
-
- In some systems it is better to mask longer values to extract bytes
- rather than using a cast. This option allows this choice.
-*/
-#if 0
-# define to_byte(x) ((uint_8t)(x))
-#else
-# define to_byte(x) ((x) & 0xff)
-#endif
-
-/* 10. TABLE ALIGNMENT
-
- On some sytsems speed will be improved by aligning the AES large lookup
- tables on particular boundaries. This define should be set to a power of
- two giving the desired alignment. It can be left undefined if alignment
- is not needed. This option is specific to the Microsft VC++ compiler -
- it seems to sometimes cause trouble for the VC++ version 6 compiler.
-*/
-
-#if 1 && defined( _MSC_VER ) && ( _MSC_VER >= 1300 )
-# define TABLE_ALIGN 32
-#endif
-
-/* 11. REDUCE CODE AND TABLE SIZE
-
- This replaces some expanded macros with function calls if AES_ASM_V2 or
- AES_ASM_V2C are defined
-*/
-
-#if 1 && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))
-# define REDUCE_CODE_SIZE
-#endif
-
-/* 12. TABLE OPTIONS
-
- This cipher proceeds by repeating in a number of cycles known as 'rounds'
- which are implemented by a round function which can optionally be speeded
- up using tables. The basic tables are each 256 32-bit words, with either
- one or four tables being required for each round function depending on
- how much speed is required. The encryption and decryption round functions
- are different and the last encryption and decrytpion round functions are
- different again making four different round functions in all.
-
- This means that:
- 1. Normal encryption and decryption rounds can each use either 0, 1
- or 4 tables and table spaces of 0, 1024 or 4096 bytes each.
- 2. The last encryption and decryption rounds can also use either 0, 1
- or 4 tables and table spaces of 0, 1024 or 4096 bytes each.
-
- Include or exclude the appropriate definitions below to set the number
- of tables used by this implementation.
-*/
-
-#if 1 /* set tables for the normal encryption round */
-# define ENC_ROUND FOUR_TABLES
-#elif 0
-# define ENC_ROUND ONE_TABLE
-#else
-# define ENC_ROUND NO_TABLES
-#endif
-
-#if 1 /* set tables for the last encryption round */
-# define LAST_ENC_ROUND FOUR_TABLES
-#elif 0
-# define LAST_ENC_ROUND ONE_TABLE
-#else
-# define LAST_ENC_ROUND NO_TABLES
-#endif
-
-#if 1 /* set tables for the normal decryption round */
-# define DEC_ROUND FOUR_TABLES
-#elif 0
-# define DEC_ROUND ONE_TABLE
-#else
-# define DEC_ROUND NO_TABLES
-#endif
-
-#if 1 /* set tables for the last decryption round */
-# define LAST_DEC_ROUND FOUR_TABLES
-#elif 0
-# define LAST_DEC_ROUND ONE_TABLE
-#else
-# define LAST_DEC_ROUND NO_TABLES
-#endif
-
-/* The decryption key schedule can be speeded up with tables in the same
- way that the round functions can. Include or exclude the following
- defines to set this requirement.
-*/
-#if 1
-# define KEY_SCHED FOUR_TABLES
-#elif 0
-# define KEY_SCHED ONE_TABLE
-#else
-# define KEY_SCHED NO_TABLES
-#endif
-
-/* ---- END OF USER CONFIGURED OPTIONS ---- */
-
-/* VIA ACE support is only available for VC++ and GCC */
-
-#if !defined( _MSC_VER ) && !defined( __GNUC__ )
-# if defined( ASSUME_VIA_ACE_PRESENT )
-# undef ASSUME_VIA_ACE_PRESENT
-# endif
-# if defined( USE_VIA_ACE_IF_PRESENT )
-# undef USE_VIA_ACE_IF_PRESENT
-# endif
-#endif
-
-#if defined( ASSUME_VIA_ACE_PRESENT ) && !defined( USE_VIA_ACE_IF_PRESENT )
-# define USE_VIA_ACE_IF_PRESENT
-#endif
-
-#if defined( USE_VIA_ACE_IF_PRESENT ) && !defined ( AES_REV_DKS )
-# define AES_REV_DKS
-#endif
-
-/* Assembler support requires the use of platform byte order */
-
-#if ( defined( ASM_X86_V1C ) || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) ) \
- && (ALGORITHM_BYTE_ORDER != PLATFORM_BYTE_ORDER)
-# undef ALGORITHM_BYTE_ORDER
-# define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER
-#endif
-
-/* In this implementation the columns of the state array are each held in
- 32-bit words. The state array can be held in various ways: in an array
- of words, in a number of individual word variables or in a number of
- processor registers. The following define maps a variable name x and
- a column number c to the way the state array variable is to be held.
- The first define below maps the state into an array x[c] whereas the
- second form maps the state into a number of individual variables x0,
- x1, etc. Another form could map individual state colums to machine
- register names.
-*/
-
-#if defined( ARRAYS )
-# define s(x,c) x[c]
-#else
-# define s(x,c) x##c
-#endif
-
-/* This implementation provides subroutines for encryption, decryption
- and for setting the three key lengths (separately) for encryption
- and decryption. Since not all functions are needed, masks are set
- up here to determine which will be implemented in C
-*/
-
-#if !defined( AES_ENCRYPT )
-# define EFUNCS_IN_C 0
-#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \
- || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C )
-# define EFUNCS_IN_C ENC_KEYING_IN_C
-#elif !defined( ASM_X86_V2 )
-# define EFUNCS_IN_C ( ENCRYPTION_IN_C | ENC_KEYING_IN_C )
-#else
-# define EFUNCS_IN_C 0
-#endif
-
-#if !defined( AES_DECRYPT )
-# define DFUNCS_IN_C 0
-#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \
- || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C )
-# define DFUNCS_IN_C DEC_KEYING_IN_C
-#elif !defined( ASM_X86_V2 )
-# define DFUNCS_IN_C ( DECRYPTION_IN_C | DEC_KEYING_IN_C )
-#else
-# define DFUNCS_IN_C 0
-#endif
-
-#define FUNCS_IN_C ( EFUNCS_IN_C | DFUNCS_IN_C )
-
-/* END OF CONFIGURATION OPTIONS */
-
-#define RC_LENGTH (5 * (AES_BLOCK_SIZE / 4 - 2))
-
-/* Disable or report errors on some combinations of options */
-
-#if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES
-# undef LAST_ENC_ROUND
-# define LAST_ENC_ROUND NO_TABLES
-#elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES
-# undef LAST_ENC_ROUND
-# define LAST_ENC_ROUND ONE_TABLE
-#endif
-
-#if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE
-# undef ENC_UNROLL
-# define ENC_UNROLL NONE
-#endif
-
-#if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES
-# undef LAST_DEC_ROUND
-# define LAST_DEC_ROUND NO_TABLES
-#elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES
-# undef LAST_DEC_ROUND
-# define LAST_DEC_ROUND ONE_TABLE
-#endif
-
-#if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE
-# undef DEC_UNROLL
-# define DEC_UNROLL NONE
-#endif
-
-#if defined( bswap32 )
-# define aes_sw32 bswap32
-#elif defined( bswap_32 )
-# define aes_sw32 bswap_32
-#else
-# define brot(x,n) (((uint_32t)(x) << n) | ((uint_32t)(x) >> (32 - n)))
-# define aes_sw32(x) ((brot((x),8) & 0x00ff00ff) | (brot((x),24) & 0xff00ff00))
-#endif
-
-/* upr(x,n): rotates bytes within words by n positions, moving bytes to
- higher index positions with wrap around into low positions
- ups(x,n): moves bytes by n positions to higher index positions in
- words but without wrap around
- bval(x,n): extracts a byte from a word
-
- WARNING: The definitions given here are intended only for use with
- unsigned variables and with shift counts that are compile
- time constants
-*/
-
-#if ( ALGORITHM_BYTE_ORDER == IS_LITTLE_ENDIAN )
-# define upr(x,n) (((uint_32t)(x) << (8 * (n))) | ((uint_32t)(x) >> (32 - 8 * (n))))
-# define ups(x,n) ((uint_32t) (x) << (8 * (n)))
-# define bval(x,n) to_byte((x) >> (8 * (n)))
-# define bytes2word(b0, b1, b2, b3) \
- (((uint_32t)(b3) << 24) | ((uint_32t)(b2) << 16) | ((uint_32t)(b1) << 8) | (b0))
-#endif
-
-#if ( ALGORITHM_BYTE_ORDER == IS_BIG_ENDIAN )
-# define upr(x,n) (((uint_32t)(x) >> (8 * (n))) | ((uint_32t)(x) << (32 - 8 * (n))))
-# define ups(x,n) ((uint_32t) (x) >> (8 * (n)))
-# define bval(x,n) to_byte((x) >> (24 - 8 * (n)))
-# define bytes2word(b0, b1, b2, b3) \
- (((uint_32t)(b0) << 24) | ((uint_32t)(b1) << 16) | ((uint_32t)(b2) << 8) | (b3))
-#endif
-
-#if defined( SAFE_IO )
-# define word_in(x,c) bytes2word(((const uint_8t*)(x)+4*c)[0], ((const uint_8t*)(x)+4*c)[1], \
- ((const uint_8t*)(x)+4*c)[2], ((const uint_8t*)(x)+4*c)[3])
-# define word_out(x,c,v) { ((uint_8t*)(x)+4*c)[0] = bval(v,0); ((uint_8t*)(x)+4*c)[1] = bval(v,1); \
- ((uint_8t*)(x)+4*c)[2] = bval(v,2); ((uint_8t*)(x)+4*c)[3] = bval(v,3); }
-#elif ( ALGORITHM_BYTE_ORDER == PLATFORM_BYTE_ORDER )
-# define word_in(x,c) (*((uint_32t*)(x)+(c)))
-# define word_out(x,c,v) (*((uint_32t*)(x)+(c)) = (v))
-#else
-# define word_in(x,c) aes_sw32(*((uint_32t*)(x)+(c)))
-# define word_out(x,c,v) (*((uint_32t*)(x)+(c)) = aes_sw32(v))
-#endif
-
-/* the finite field modular polynomial and elements */
-
-#define WPOLY 0x011b
-#define BPOLY 0x1b
-
-/* multiply four bytes in GF(2^8) by 'x' {02} in parallel */
-
-#define gf_c1 0x80808080
-#define gf_c2 0x7f7f7f7f
-#define gf_mulx(x) ((((x) & gf_c2) << 1) ^ ((((x) & gf_c1) >> 7) * BPOLY))
-
-/* The following defines provide alternative definitions of gf_mulx that might
- give improved performance if a fast 32-bit multiply is not available. Note
- that a temporary variable u needs to be defined where gf_mulx is used.
-
-#define gf_mulx(x) (u = (x) & gf_c1, u |= (u >> 1), ((x) & gf_c2) << 1) ^ ((u >> 3) | (u >> 6))
-#define gf_c4 (0x01010101 * BPOLY)
-#define gf_mulx(x) (u = (x) & gf_c1, ((x) & gf_c2) << 1) ^ ((u - (u >> 7)) & gf_c4)
-*/
-
-/* Work out which tables are needed for the different options */
-
-#if defined( ASM_X86_V1C )
-# if defined( ENC_ROUND )
-# undef ENC_ROUND
-# endif
-# define ENC_ROUND FOUR_TABLES
-# if defined( LAST_ENC_ROUND )
-# undef LAST_ENC_ROUND
-# endif
-# define LAST_ENC_ROUND FOUR_TABLES
-# if defined( DEC_ROUND )
-# undef DEC_ROUND
-# endif
-# define DEC_ROUND FOUR_TABLES
-# if defined( LAST_DEC_ROUND )
-# undef LAST_DEC_ROUND
-# endif
-# define LAST_DEC_ROUND FOUR_TABLES
-# if defined( KEY_SCHED )
-# undef KEY_SCHED
-# define KEY_SCHED FOUR_TABLES
-# endif
-#endif
-
-#if ( FUNCS_IN_C & ENCRYPTION_IN_C ) || defined( ASM_X86_V1C )
-# if ENC_ROUND == ONE_TABLE
-# define FT1_SET
-# elif ENC_ROUND == FOUR_TABLES
-# define FT4_SET
-# else
-# define SBX_SET
-# endif
-# if LAST_ENC_ROUND == ONE_TABLE
-# define FL1_SET
-# elif LAST_ENC_ROUND == FOUR_TABLES
-# define FL4_SET
-# elif !defined( SBX_SET )
-# define SBX_SET
-# endif
-#endif
-
-#if ( FUNCS_IN_C & DECRYPTION_IN_C ) || defined( ASM_X86_V1C )
-# if DEC_ROUND == ONE_TABLE
-# define IT1_SET
-# elif DEC_ROUND == FOUR_TABLES
-# define IT4_SET
-# else
-# define ISB_SET
-# endif
-# if LAST_DEC_ROUND == ONE_TABLE
-# define IL1_SET
-# elif LAST_DEC_ROUND == FOUR_TABLES
-# define IL4_SET
-# elif !defined(ISB_SET)
-# define ISB_SET
-# endif
-#endif
-
-#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )))
-# if ((FUNCS_IN_C & ENC_KEYING_IN_C) || (FUNCS_IN_C & DEC_KEYING_IN_C))
-# if KEY_SCHED == ONE_TABLE
-# if !defined( FL1_SET ) && !defined( FL4_SET )
-# define LS1_SET
-# endif
-# elif KEY_SCHED == FOUR_TABLES
-# if !defined( FL4_SET )
-# define LS4_SET
-# endif
-# elif !defined( SBX_SET )
-# define SBX_SET
-# endif
-# endif
-# if (FUNCS_IN_C & DEC_KEYING_IN_C)
-# if KEY_SCHED == ONE_TABLE
-# define IM1_SET
-# elif KEY_SCHED == FOUR_TABLES
-# define IM4_SET
-# elif !defined( SBX_SET )
-# define SBX_SET
-# endif
-# endif
-#endif
-
-/* generic definitions of Rijndael macros that use tables */
-
-#define no_table(x,box,vf,rf,c) bytes2word( \
- box[bval(vf(x,0,c),rf(0,c))], \
- box[bval(vf(x,1,c),rf(1,c))], \
- box[bval(vf(x,2,c),rf(2,c))], \
- box[bval(vf(x,3,c),rf(3,c))])
-
-#define one_table(x,op,tab,vf,rf,c) \
- ( tab[bval(vf(x,0,c),rf(0,c))] \
- ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \
- ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \
- ^ op(tab[bval(vf(x,3,c),rf(3,c))],3))
-
-#define four_tables(x,tab,vf,rf,c) \
- ( tab[0][bval(vf(x,0,c),rf(0,c))] \
- ^ tab[1][bval(vf(x,1,c),rf(1,c))] \
- ^ tab[2][bval(vf(x,2,c),rf(2,c))] \
- ^ tab[3][bval(vf(x,3,c),rf(3,c))])
-
-#define vf1(x,r,c) (x)
-#define rf1(r,c) (r)
-#define rf2(r,c) ((8+r-c)&3)
-
-/* perform forward and inverse column mix operation on four bytes in long word x in */
-/* parallel. NOTE: x must be a simple variable, NOT an expression in these macros. */
-
-#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )))
-
-#if defined( FM4_SET ) /* not currently used */
-# define fwd_mcol(x) four_tables(x,t_use(f,m),vf1,rf1,0)
-#elif defined( FM1_SET ) /* not currently used */
-# define fwd_mcol(x) one_table(x,upr,t_use(f,m),vf1,rf1,0)
-#else
-# define dec_fmvars uint_32t g2
-# define fwd_mcol(x) (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1))
-#endif
-
-#if defined( IM4_SET )
-# define inv_mcol(x) four_tables(x,t_use(i,m),vf1,rf1,0)
-#elif defined( IM1_SET )
-# define inv_mcol(x) one_table(x,upr,t_use(i,m),vf1,rf1,0)
-#else
-# define dec_imvars uint_32t g2, g4, g9
-# define inv_mcol(x) (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \
- (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1))
-#endif
-
-#if defined( FL4_SET )
-# define ls_box(x,c) four_tables(x,t_use(f,l),vf1,rf2,c)
-#elif defined( LS4_SET )
-# define ls_box(x,c) four_tables(x,t_use(l,s),vf1,rf2,c)
-#elif defined( FL1_SET )
-# define ls_box(x,c) one_table(x,upr,t_use(f,l),vf1,rf2,c)
-#elif defined( LS1_SET )
-# define ls_box(x,c) one_table(x,upr,t_use(l,s),vf1,rf2,c)
-#else
-# define ls_box(x,c) no_table(x,t_use(s,box),vf1,rf2,c)
-#endif
-
-#endif
-
-#if defined( ASM_X86_V1C ) && defined( AES_DECRYPT ) && !defined( ISB_SET )
-# define ISB_SET
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/aestab.c b/ios/CodePush/SSZipArchive/aes/aestab.c
deleted file mode 100644
index 6d193aff2..000000000
--- a/ios/CodePush/SSZipArchive/aes/aestab.c
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
----------------------------------------------------------------------------
-Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.
-
-The redistribution and use of this software (with or without changes)
-is allowed without the payment of fees or royalties provided that:
-
- source code distributions include the above copyright notice, this
- list of conditions and the following disclaimer;
-
- binary distributions include the above copyright notice, this list
- of conditions and the following disclaimer in their documentation.
-
-This software is provided 'as is' with no explicit or implied warranties
-in respect of its operation, including, but not limited to, correctness
-and fitness for purpose.
----------------------------------------------------------------------------
-Issue Date: 20/12/2007
-*/
-
-#define DO_TABLES
-
-#include "aes.h"
-#include "aesopt.h"
-
-#if defined(FIXED_TABLES)
-
-#define sb_data(w) {\
- w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\
- w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\
- w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\
- w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\
- w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\
- w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\
- w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\
- w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\
- w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\
- w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\
- w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\
- w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\
- w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\
- w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\
- w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\
- w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\
- w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\
- w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\
- w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\
- w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\
- w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\
- w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\
- w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\
- w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\
- w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\
- w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\
- w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\
- w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\
- w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\
- w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\
- w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\
- w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) }
-
-#define isb_data(w) {\
- w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\
- w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\
- w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\
- w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\
- w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\
- w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\
- w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\
- w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\
- w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\
- w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\
- w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\
- w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\
- w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\
- w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\
- w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\
- w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\
- w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\
- w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\
- w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\
- w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\
- w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\
- w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\
- w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\
- w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\
- w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\
- w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\
- w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\
- w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\
- w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\
- w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\
- w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\
- w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) }
-
-#define mm_data(w) {\
- w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\
- w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\
- w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\
- w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\
- w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\
- w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\
- w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\
- w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\
- w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\
- w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\
- w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\
- w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\
- w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\
- w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\
- w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\
- w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\
- w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\
- w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\
- w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\
- w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\
- w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\
- w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\
- w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\
- w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\
- w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\
- w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\
- w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\
- w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\
- w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\
- w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\
- w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\
- w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) }
-
-#define rc_data(w) {\
- w(0x01), w(0x02), w(0x04), w(0x08), w(0x10),w(0x20), w(0x40), w(0x80),\
- w(0x1b), w(0x36) }
-
-#define h0(x) (x)
-
-#define w0(p) bytes2word(p, 0, 0, 0)
-#define w1(p) bytes2word(0, p, 0, 0)
-#define w2(p) bytes2word(0, 0, p, 0)
-#define w3(p) bytes2word(0, 0, 0, p)
-
-#define u0(p) bytes2word(f2(p), p, p, f3(p))
-#define u1(p) bytes2word(f3(p), f2(p), p, p)
-#define u2(p) bytes2word(p, f3(p), f2(p), p)
-#define u3(p) bytes2word(p, p, f3(p), f2(p))
-
-#define v0(p) bytes2word(fe(p), f9(p), fd(p), fb(p))
-#define v1(p) bytes2word(fb(p), fe(p), f9(p), fd(p))
-#define v2(p) bytes2word(fd(p), fb(p), fe(p), f9(p))
-#define v3(p) bytes2word(f9(p), fd(p), fb(p), fe(p))
-
-#endif
-
-#if defined(FIXED_TABLES) || !defined(FF_TABLES)
-
-#define f2(x) ((x<<1) ^ (((x>>7) & 1) * WPOLY))
-#define f4(x) ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY))
-#define f8(x) ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \
- ^ (((x>>5) & 4) * WPOLY))
-#define f3(x) (f2(x) ^ x)
-#define f9(x) (f8(x) ^ x)
-#define fb(x) (f8(x) ^ f2(x) ^ x)
-#define fd(x) (f8(x) ^ f4(x) ^ x)
-#define fe(x) (f8(x) ^ f4(x) ^ f2(x))
-
-#else
-
-#define f2(x) ((x) ? pow[log[x] + 0x19] : 0)
-#define f3(x) ((x) ? pow[log[x] + 0x01] : 0)
-#define f9(x) ((x) ? pow[log[x] + 0xc7] : 0)
-#define fb(x) ((x) ? pow[log[x] + 0x68] : 0)
-#define fd(x) ((x) ? pow[log[x] + 0xee] : 0)
-#define fe(x) ((x) ? pow[log[x] + 0xdf] : 0)
-
-#endif
-
-#include "aestab.h"
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-#if defined(FIXED_TABLES)
-
-/* implemented in case of wrong call for fixed tables */
-
-AES_RETURN aes_init(void)
-{
- return EXIT_SUCCESS;
-}
-
-#else /* Generate the tables for the dynamic table option */
-
-#if defined(FF_TABLES)
-
-#define gf_inv(x) ((x) ? pow[ 255 - log[x]] : 0)
-
-#else
-
-/* It will generally be sensible to use tables to compute finite
- field multiplies and inverses but where memory is scarse this
- code might sometimes be better. But it only has effect during
- initialisation so its pretty unimportant in overall terms.
-*/
-
-/* return 2 ^ (n - 1) where n is the bit number of the highest bit
- set in x with x in the range 1 < x < 0x00000200. This form is
- used so that locals within fi can be bytes rather than words
-*/
-
-static uint_8t hibit(const uint_32t x)
-{ uint_8t r = (uint_8t)((x >> 1) | (x >> 2));
-
- r |= (r >> 2);
- r |= (r >> 4);
- return (r + 1) >> 1;
-}
-
-/* return the inverse of the finite field element x */
-
-static uint_8t gf_inv(const uint_8t x)
-{ uint_8t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0;
-
- if(x < 2)
- return x;
-
- for( ; ; )
- {
- if(n1)
- while(n2 >= n1) /* divide polynomial p2 by p1 */
- {
- n2 /= n1; /* shift smaller polynomial left */
- p2 ^= (p1 * n2) & 0xff; /* and remove from larger one */
- v2 ^= v1 * n2; /* shift accumulated value and */
- n2 = hibit(p2); /* add into result */
- }
- else
- return v1;
-
- if(n2) /* repeat with values swapped */
- while(n1 >= n2)
- {
- n1 /= n2;
- p1 ^= p2 * n1;
- v1 ^= v2 * n1;
- n1 = hibit(p1);
- }
- else
- return v2;
- }
-}
-
-#endif
-
-/* The forward and inverse affine transformations used in the S-box */
-uint_8t fwd_affine(const uint_8t x)
-{ uint_32t w = x;
- w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4);
- return 0x63 ^ ((w ^ (w >> 8)) & 0xff);
-}
-
-uint_8t inv_affine(const uint_8t x)
-{ uint_32t w = x;
- w = (w << 1) ^ (w << 3) ^ (w << 6);
- return 0x05 ^ ((w ^ (w >> 8)) & 0xff);
-}
-
-static int init = 0;
-
-AES_RETURN aes_init(void)
-{ uint_32t i, w;
-
-#if defined(FF_TABLES)
-
- uint_8t pow[512], log[256];
-
- if(init)
- return EXIT_SUCCESS;
- /* log and power tables for GF(2^8) finite field with
- WPOLY as modular polynomial - the simplest primitive
- root is 0x03, used here to generate the tables
- */
-
- i = 0; w = 1;
- do
- {
- pow[i] = (uint_8t)w;
- pow[i + 255] = (uint_8t)w;
- log[w] = (uint_8t)i++;
- w ^= (w << 1) ^ (w & 0x80 ? WPOLY : 0);
- }
- while (w != 1);
-
-#else
- if(init)
- return EXIT_SUCCESS;
-#endif
-
- for(i = 0, w = 1; i < RC_LENGTH; ++i)
- {
- t_set(r,c)[i] = bytes2word(w, 0, 0, 0);
- w = f2(w);
- }
-
- for(i = 0; i < 256; ++i)
- { uint_8t b;
-
- b = fwd_affine(gf_inv((uint_8t)i));
- w = bytes2word(f2(b), b, b, f3(b));
-
-#if defined( SBX_SET )
- t_set(s,box)[i] = b;
-#endif
-
-#if defined( FT1_SET ) /* tables for a normal encryption round */
- t_set(f,n)[i] = w;
-#endif
-#if defined( FT4_SET )
- t_set(f,n)[0][i] = w;
- t_set(f,n)[1][i] = upr(w,1);
- t_set(f,n)[2][i] = upr(w,2);
- t_set(f,n)[3][i] = upr(w,3);
-#endif
- w = bytes2word(b, 0, 0, 0);
-
-#if defined( FL1_SET ) /* tables for last encryption round (may also */
- t_set(f,l)[i] = w; /* be used in the key schedule) */
-#endif
-#if defined( FL4_SET )
- t_set(f,l)[0][i] = w;
- t_set(f,l)[1][i] = upr(w,1);
- t_set(f,l)[2][i] = upr(w,2);
- t_set(f,l)[3][i] = upr(w,3);
-#endif
-
-#if defined( LS1_SET ) /* table for key schedule if t_set(f,l) above is*/
- t_set(l,s)[i] = w; /* not of the required form */
-#endif
-#if defined( LS4_SET )
- t_set(l,s)[0][i] = w;
- t_set(l,s)[1][i] = upr(w,1);
- t_set(l,s)[2][i] = upr(w,2);
- t_set(l,s)[3][i] = upr(w,3);
-#endif
-
- b = gf_inv(inv_affine((uint_8t)i));
- w = bytes2word(fe(b), f9(b), fd(b), fb(b));
-
-#if defined( IM1_SET ) /* tables for the inverse mix column operation */
- t_set(i,m)[b] = w;
-#endif
-#if defined( IM4_SET )
- t_set(i,m)[0][b] = w;
- t_set(i,m)[1][b] = upr(w,1);
- t_set(i,m)[2][b] = upr(w,2);
- t_set(i,m)[3][b] = upr(w,3);
-#endif
-
-#if defined( ISB_SET )
- t_set(i,box)[i] = b;
-#endif
-#if defined( IT1_SET ) /* tables for a normal decryption round */
- t_set(i,n)[i] = w;
-#endif
-#if defined( IT4_SET )
- t_set(i,n)[0][i] = w;
- t_set(i,n)[1][i] = upr(w,1);
- t_set(i,n)[2][i] = upr(w,2);
- t_set(i,n)[3][i] = upr(w,3);
-#endif
- w = bytes2word(b, 0, 0, 0);
-#if defined( IL1_SET ) /* tables for last decryption round */
- t_set(i,l)[i] = w;
-#endif
-#if defined( IL4_SET )
- t_set(i,l)[0][i] = w;
- t_set(i,l)[1][i] = upr(w,1);
- t_set(i,l)[2][i] = upr(w,2);
- t_set(i,l)[3][i] = upr(w,3);
-#endif
- }
- init = 1;
- return EXIT_SUCCESS;
-}
-
-#endif
-
-#if defined(__cplusplus)
-}
-#endif
-
diff --git a/ios/CodePush/SSZipArchive/aes/aestab.h b/ios/CodePush/SSZipArchive/aes/aestab.h
deleted file mode 100644
index 21fc73616..000000000
--- a/ios/CodePush/SSZipArchive/aes/aestab.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
----------------------------------------------------------------------------
-Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.
-
-The redistribution and use of this software (with or without changes)
-is allowed without the payment of fees or royalties provided that:
-
- source code distributions include the above copyright notice, this
- list of conditions and the following disclaimer;
-
- binary distributions include the above copyright notice, this list
- of conditions and the following disclaimer in their documentation.
-
-This software is provided 'as is' with no explicit or implied warranties
-in respect of its operation, including, but not limited to, correctness
-and fitness for purpose.
----------------------------------------------------------------------------
-Issue Date: 20/12/2007
-
- This file contains the code for declaring the tables needed to implement
- AES. The file aesopt.h is assumed to be included before this header file.
- If there are no global variables, the definitions here can be used to put
- the AES tables in a structure so that a pointer can then be added to the
- AES context to pass them to the AES routines that need them. If this
- facility is used, the calling program has to ensure that this pointer is
- managed appropriately. In particular, the value of the t_dec(in,it) item
- in the table structure must be set to zero in order to ensure that the
- tables are initialised. In practice the three code sequences in aeskey.c
- that control the calls to aes_init() and the aes_init() routine itself will
- have to be changed for a specific implementation. If global variables are
- available it will generally be preferable to use them with the precomputed
- FIXED_TABLES option that uses static global tables.
-
- The following defines can be used to control the way the tables
- are defined, initialised and used in embedded environments that
- require special features for these purposes
-
- the 't_dec' construction is used to declare fixed table arrays
- the 't_set' construction is used to set fixed table values
- the 't_use' construction is used to access fixed table values
-
- 256 byte tables:
-
- t_xxx(s,box) => forward S box
- t_xxx(i,box) => inverse S box
-
- 256 32-bit word OR 4 x 256 32-bit word tables:
-
- t_xxx(f,n) => forward normal round
- t_xxx(f,l) => forward last round
- t_xxx(i,n) => inverse normal round
- t_xxx(i,l) => inverse last round
- t_xxx(l,s) => key schedule table
- t_xxx(i,m) => key schedule table
-
- Other variables and tables:
-
- t_xxx(r,c) => the rcon table
-*/
-
-#if !defined( _AESTAB_H )
-#define _AESTAB_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#define t_dec(m,n) t_##m##n
-#define t_set(m,n) t_##m##n
-#define t_use(m,n) t_##m##n
-
-#if defined(FIXED_TABLES)
-# if !defined( __GNUC__ ) && (defined( __MSDOS__ ) || defined( __WIN16__ ))
-/* make tables far data to avoid using too much DGROUP space (PG) */
-# define CONST const far
-# else
-# define CONST const
-# endif
-#else
-# define CONST
-#endif
-
-#if defined(DO_TABLES)
-# define EXTERN
-#else
-# define EXTERN extern
-#endif
-
-#if defined(_MSC_VER) && defined(TABLE_ALIGN)
-#define ALIGN __declspec(align(TABLE_ALIGN))
-#else
-#define ALIGN
-#endif
-
-#if defined( __WATCOMC__ ) && ( __WATCOMC__ >= 1100 )
-# define XP_DIR __cdecl
-#else
-# define XP_DIR
-#endif
-
-#if defined(DO_TABLES) && defined(FIXED_TABLES)
-#define d_1(t,n,b,e) EXTERN ALIGN CONST XP_DIR t n[256] = b(e)
-#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256] = { b(e), b(f), b(g), b(h) }
-EXTERN ALIGN CONST uint_32t t_dec(r,c)[RC_LENGTH] = rc_data(w0);
-#else
-#define d_1(t,n,b,e) EXTERN ALIGN CONST XP_DIR t n[256]
-#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256]
-EXTERN ALIGN CONST uint_32t t_dec(r,c)[RC_LENGTH];
-#endif
-
-#if defined( SBX_SET )
- d_1(uint_8t, t_dec(s,box), sb_data, h0);
-#endif
-#if defined( ISB_SET )
- d_1(uint_8t, t_dec(i,box), isb_data, h0);
-#endif
-
-#if defined( FT1_SET )
- d_1(uint_32t, t_dec(f,n), sb_data, u0);
-#endif
-#if defined( FT4_SET )
- d_4(uint_32t, t_dec(f,n), sb_data, u0, u1, u2, u3);
-#endif
-
-#if defined( FL1_SET )
- d_1(uint_32t, t_dec(f,l), sb_data, w0);
-#endif
-#if defined( FL4_SET )
- d_4(uint_32t, t_dec(f,l), sb_data, w0, w1, w2, w3);
-#endif
-
-#if defined( IT1_SET )
- d_1(uint_32t, t_dec(i,n), isb_data, v0);
-#endif
-#if defined( IT4_SET )
- d_4(uint_32t, t_dec(i,n), isb_data, v0, v1, v2, v3);
-#endif
-
-#if defined( IL1_SET )
- d_1(uint_32t, t_dec(i,l), isb_data, w0);
-#endif
-#if defined( IL4_SET )
- d_4(uint_32t, t_dec(i,l), isb_data, w0, w1, w2, w3);
-#endif
-
-#if defined( LS1_SET )
-#if defined( FL1_SET )
-#undef LS1_SET
-#else
- d_1(uint_32t, t_dec(l,s), sb_data, w0);
-#endif
-#endif
-
-#if defined( LS4_SET )
-#if defined( FL4_SET )
-#undef LS4_SET
-#else
- d_4(uint_32t, t_dec(l,s), sb_data, w0, w1, w2, w3);
-#endif
-#endif
-
-#if defined( IM1_SET )
- d_1(uint_32t, t_dec(i,m), mm_data, v0);
-#endif
-#if defined( IM4_SET )
- d_4(uint_32t, t_dec(i,m), mm_data, v0, v1, v2, v3);
-#endif
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/brg_endian.h b/ios/CodePush/SSZipArchive/aes/brg_endian.h
deleted file mode 100644
index 82e48f0bc..000000000
--- a/ios/CodePush/SSZipArchive/aes/brg_endian.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
----------------------------------------------------------------------------
-Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.
-
-The redistribution and use of this software (with or without changes)
-is allowed without the payment of fees or royalties provided that:
-
- source code distributions include the above copyright notice, this
- list of conditions and the following disclaimer;
-
- binary distributions include the above copyright notice, this list
- of conditions and the following disclaimer in their documentation.
-
-This software is provided 'as is' with no explicit or implied warranties
-in respect of its operation, including, but not limited to, correctness
-and fitness for purpose.
----------------------------------------------------------------------------
-Issue Date: 20/12/2007
-*/
-
-#ifndef _BRG_ENDIAN_H
-#define _BRG_ENDIAN_H
-
-#define IS_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */
-#define IS_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */
-
-/* Include files where endian defines and byteswap functions may reside */
-#if defined( __sun )
-# include
-#elif defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __NetBSD__ )
-# include
-#elif defined( BSD ) && ( BSD >= 199103 ) || defined( __APPLE__ ) || \
- defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ )
-# include
-#elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
-# if !defined( __MINGW32__ ) && !defined( _AIX )
-# include
-# if !defined( __BEOS__ )
-# include
-# endif
-# endif
-#endif
-
-/* Now attempt to set the define for platform byte order using any */
-/* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which */
-/* seem to encompass most endian symbol definitions */
-
-#if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN )
-# if defined( BYTE_ORDER ) && BYTE_ORDER == BIG_ENDIAN
-# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
-# elif defined( BYTE_ORDER ) && BYTE_ORDER == LITTLE_ENDIAN
-# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
-# endif
-#elif defined( BIG_ENDIAN )
-# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
-#elif defined( LITTLE_ENDIAN )
-# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
-#endif
-
-#if defined( _BIG_ENDIAN ) && defined( _LITTLE_ENDIAN )
-# if defined( _BYTE_ORDER ) && _BYTE_ORDER == _BIG_ENDIAN
-# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
-# elif defined( _BYTE_ORDER ) && _BYTE_ORDER == _LITTLE_ENDIAN
-# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
-# endif
-#elif defined( _BIG_ENDIAN )
-# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
-#elif defined( _LITTLE_ENDIAN )
-# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
-#endif
-
-#if defined( __BIG_ENDIAN ) && defined( __LITTLE_ENDIAN )
-# if defined( __BYTE_ORDER ) && __BYTE_ORDER == __BIG_ENDIAN
-# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
-# elif defined( __BYTE_ORDER ) && __BYTE_ORDER == __LITTLE_ENDIAN
-# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
-# endif
-#elif defined( __BIG_ENDIAN )
-# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
-#elif defined( __LITTLE_ENDIAN )
-# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
-#endif
-
-#if defined( __BIG_ENDIAN__ ) && defined( __LITTLE_ENDIAN__ )
-# if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __BIG_ENDIAN__
-# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
-# elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __LITTLE_ENDIAN__
-# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
-# endif
-#elif defined( __BIG_ENDIAN__ )
-# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
-#elif defined( __LITTLE_ENDIAN__ )
-# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
-#endif
-
-/* if the platform byte order could not be determined, then try to */
-/* set this define using common machine defines */
-#if !defined(PLATFORM_BYTE_ORDER)
-
-#if defined( __alpha__ ) || defined( __alpha ) || defined( i386 ) || \
- defined( __i386__ ) || defined( _M_I86 ) || defined( _M_IX86 ) || \
- defined( __OS2__ ) || defined( sun386 ) || defined( __TURBOC__ ) || \
- defined( vax ) || defined( vms ) || defined( VMS ) || \
- defined( __VMS ) || defined( _M_X64 )
-# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
-
-#elif defined( AMIGA ) || defined( applec ) || defined( __AS400__ ) || \
- defined( _CRAY ) || defined( __hppa ) || defined( __hp9000 ) || \
- defined( ibm370 ) || defined( mc68000 ) || defined( m68k ) || \
- defined( __MRC__ ) || defined( __MVS__ ) || defined( __MWERKS__ ) || \
- defined( sparc ) || defined( __sparc) || defined( SYMANTEC_C ) || \
- defined( __VOS__ ) || defined( __TIGCC__ ) || defined( __TANDEM ) || \
- defined( THINK_C ) || defined( __VMCMS__ ) || defined( _AIX )
-# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
-
-#elif 0 /* **** EDIT HERE IF NECESSARY **** */
-# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
-#elif 0 /* **** EDIT HERE IF NECESSARY **** */
-# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
-#else
-# error Please edit lines 126 or 128 in brg_endian.h to set the platform byte order
-#endif
-
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/brg_types.h b/ios/CodePush/SSZipArchive/aes/brg_types.h
deleted file mode 100644
index 40d4af5bd..000000000
--- a/ios/CodePush/SSZipArchive/aes/brg_types.h
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
----------------------------------------------------------------------------
-Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.
-
-The redistribution and use of this software (with or without changes)
-is allowed without the payment of fees or royalties provided that:
-
- source code distributions include the above copyright notice, this
- list of conditions and the following disclaimer;
-
- binary distributions include the above copyright notice, this list
- of conditions and the following disclaimer in their documentation.
-
-This software is provided 'as is' with no explicit or implied warranties
-in respect of its operation, including, but not limited to, correctness
-and fitness for purpose.
----------------------------------------------------------------------------
-Issue Date: 20/12/2007
-
- The unsigned integer types defined here are of the form uint_t where
- is the length of the type; for example, the unsigned 32-bit type is
- 'uint_32t'. These are NOT the same as the 'C99 integer types' that are
- defined in the inttypes.h and stdint.h headers since attempts to use these
- types have shown that support for them is still highly variable. However,
- since the latter are of the form uint_t, a regular expression search
- and replace (in VC++ search on 'uint_{:z}t' and replace with 'uint\1_t')
- can be used to convert the types used here to the C99 standard types.
-*/
-
-#ifndef _BRG_TYPES_H
-#define _BRG_TYPES_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#include
-
-#if defined( _MSC_VER ) && ( _MSC_VER >= 1300 )
-# include
-# define ptrint_t intptr_t
-#elif defined( __ECOS__ )
-# define intptr_t unsigned int
-# define ptrint_t intptr_t
-#elif defined( __GNUC__ ) && ( __GNUC__ >= 3 )
-# include
-# define ptrint_t intptr_t
-#else
-# define ptrint_t int
-#endif
-
-#ifndef BRG_UI8
-# define BRG_UI8
-# if UCHAR_MAX == 255u
- typedef unsigned char uint_8t;
-# else
-# error Please define uint_8t as an 8-bit unsigned integer type in brg_types.h
-# endif
-#endif
-
-#ifndef BRG_UI16
-# define BRG_UI16
-# if USHRT_MAX == 65535u
- typedef unsigned short uint_16t;
-# else
-# error Please define uint_16t as a 16-bit unsigned short type in brg_types.h
-# endif
-#endif
-
-#ifndef BRG_UI32
-# define BRG_UI32
-# if UINT_MAX == 4294967295u
-# define li_32(h) 0x##h##u
- typedef unsigned int uint_32t;
-# elif ULONG_MAX == 4294967295u
-# define li_32(h) 0x##h##ul
- typedef unsigned long uint_32t;
-# elif defined( _CRAY )
-# error This code needs 32-bit data types, which Cray machines do not provide
-# else
-# error Please define uint_32t as a 32-bit unsigned integer type in brg_types.h
-# endif
-#endif
-
-#ifndef BRG_UI64
-# if defined( __BORLANDC__ ) && !defined( __MSDOS__ )
-# define BRG_UI64
-# define li_64(h) 0x##h##ui64
- typedef unsigned __int64 uint_64t;
-# elif defined( _MSC_VER ) && ( _MSC_VER < 1300 ) /* 1300 == VC++ 7.0 */
-# define BRG_UI64
-# define li_64(h) 0x##h##ui64
- typedef unsigned __int64 uint_64t;
-# elif defined( __sun ) && defined( ULONG_MAX ) && ULONG_MAX == 0xfffffffful
-# define BRG_UI64
-# define li_64(h) 0x##h##ull
- typedef unsigned long long uint_64t;
-# elif defined( __MVS__ )
-# define BRG_UI64
-# define li_64(h) 0x##h##ull
- typedef unsigned int long long uint_64t;
-# elif defined( UINT_MAX ) && UINT_MAX > 4294967295u
-# if UINT_MAX == 18446744073709551615u
-# define BRG_UI64
-# define li_64(h) 0x##h##u
- typedef unsigned int uint_64t;
-# endif
-# elif defined( ULONG_MAX ) && ULONG_MAX > 4294967295u
-# if ULONG_MAX == 18446744073709551615ul
-# define BRG_UI64
-# define li_64(h) 0x##h##ul
- typedef unsigned long uint_64t;
-# endif
-# elif defined( ULLONG_MAX ) && ULLONG_MAX > 4294967295u
-# if ULLONG_MAX == 18446744073709551615ull
-# define BRG_UI64
-# define li_64(h) 0x##h##ull
- typedef unsigned long long uint_64t;
-# endif
-# elif defined( ULONG_LONG_MAX ) && ULONG_LONG_MAX > 4294967295u
-# if ULONG_LONG_MAX == 18446744073709551615ull
-# define BRG_UI64
-# define li_64(h) 0x##h##ull
- typedef unsigned long long uint_64t;
-# endif
-# endif
-#endif
-
-#if !defined( BRG_UI64 )
-# if defined( NEED_UINT_64T )
-# error Please define uint_64t as an unsigned 64 bit type in brg_types.h
-# endif
-#endif
-
-#ifndef RETURN_VALUES
-# define RETURN_VALUES
-# if defined( DLL_EXPORT )
-# if defined( _MSC_VER ) || defined ( __INTEL_COMPILER )
-# define VOID_RETURN __declspec( dllexport ) void __stdcall
-# define INT_RETURN __declspec( dllexport ) int __stdcall
-# elif defined( __GNUC__ )
-# define VOID_RETURN __declspec( __dllexport__ ) void
-# define INT_RETURN __declspec( __dllexport__ ) int
-# else
-# error Use of the DLL is only available on the Microsoft, Intel and GCC compilers
-# endif
-# elif defined( DLL_IMPORT )
-# if defined( _MSC_VER ) || defined ( __INTEL_COMPILER )
-# define VOID_RETURN __declspec( dllimport ) void __stdcall
-# define INT_RETURN __declspec( dllimport ) int __stdcall
-# elif defined( __GNUC__ )
-# define VOID_RETURN __declspec( __dllimport__ ) void
-# define INT_RETURN __declspec( __dllimport__ ) int
-# else
-# error Use of the DLL is only available on the Microsoft, Intel and GCC compilers
-# endif
-# elif defined( __WATCOMC__ )
-# define VOID_RETURN void __cdecl
-# define INT_RETURN int __cdecl
-# else
-# define VOID_RETURN void
-# define INT_RETURN int
-# endif
-#endif
-
-/* These defines are used to detect and set the memory alignment of pointers.
- Note that offsets are in bytes.
-
- ALIGN_OFFSET(x,n) return the positive or zero offset of
- the memory addressed by the pointer 'x'
- from an address that is aligned on an
- 'n' byte boundary ('n' is a power of 2)
-
- ALIGN_FLOOR(x,n) return a pointer that points to memory
- that is aligned on an 'n' byte boundary
- and is not higher than the memory address
- pointed to by 'x' ('n' is a power of 2)
-
- ALIGN_CEIL(x,n) return a pointer that points to memory
- that is aligned on an 'n' byte boundary
- and is not lower than the memory address
- pointed to by 'x' ('n' is a power of 2)
-*/
-
-#define ALIGN_OFFSET(x,n) (((ptrint_t)(x)) & ((n) - 1))
-#define ALIGN_FLOOR(x,n) ((uint_8t*)(x) - ( ((ptrint_t)(x)) & ((n) - 1)))
-#define ALIGN_CEIL(x,n) ((uint_8t*)(x) + (-((ptrint_t)(x)) & ((n) - 1)))
-
-/* These defines are used to declare buffers in a way that allows
- faster operations on longer variables to be used. In all these
- defines 'size' must be a power of 2 and >= 8. NOTE that the
- buffer size is in bytes but the type length is in bits
-
- UNIT_TYPEDEF(x,size) declares a variable 'x' of length
- 'size' bits
-
- BUFR_TYPEDEF(x,size,bsize) declares a buffer 'x' of length 'bsize'
- bytes defined as an array of variables
- each of 'size' bits (bsize must be a
- multiple of size / 8)
-
- UNIT_CAST(x,size) casts a variable to a type of
- length 'size' bits
-
- UPTR_CAST(x,size) casts a pointer to a pointer to a
- varaiable of length 'size' bits
-*/
-
-#define UI_TYPE(size) uint_##size##t
-#define UNIT_TYPEDEF(x,size) typedef UI_TYPE(size) x
-#define BUFR_TYPEDEF(x,size,bsize) typedef UI_TYPE(size) x[bsize / (size >> 3)]
-#define UNIT_CAST(x,size) ((UI_TYPE(size) )(x))
-#define UPTR_CAST(x,size) ((UI_TYPE(size)*)(x))
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/entropy.c b/ios/CodePush/SSZipArchive/aes/entropy.c
deleted file mode 100644
index 5840a9725..000000000
--- a/ios/CodePush/SSZipArchive/aes/entropy.c
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifdef _WIN32
-#include
-#else
-#include
-#include
-#include
-#endif
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-#ifdef _WIN32
-int entropy_fun(unsigned char buf[], unsigned int len)
-{
- HCRYPTPROV provider;
- unsigned __int64 pentium_tsc[1];
- unsigned int i;
- int result = 0;
-
-
- if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
- {
- result = CryptGenRandom(provider, len, buf);
- CryptReleaseContext(provider, 0);
- if (result)
- return len;
- }
-
- QueryPerformanceCounter((LARGE_INTEGER *)pentium_tsc);
-
- for(i = 0; i < 8 && i < len; ++i)
- buf[i] = ((unsigned char*)pentium_tsc)[i];
-
- return i;
-}
-#else
-int entropy_fun(unsigned char buf[], unsigned int len)
-{
- int frand = open("/dev/random", O_RDONLY);
- int rlen = 0;
- if (frand != -1)
- {
- rlen = (int)read(frand, buf, len);
- close(frand);
- }
- return rlen;
-}
-#endif
-
-#if defined(__cplusplus)
-}
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/entropy.h b/ios/CodePush/SSZipArchive/aes/entropy.h
deleted file mode 100644
index 306620c81..000000000
--- a/ios/CodePush/SSZipArchive/aes/entropy.h
+++ /dev/null
@@ -1,16 +0,0 @@
-
-#ifndef _ENTROPY_FUN_H
-#define _ENTROPY_FUN_H
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-int entropy_fun(unsigned char buf[], unsigned int len);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/fileenc.c b/ios/CodePush/SSZipArchive/aes/fileenc.c
deleted file mode 100644
index 505703683..000000000
--- a/ios/CodePush/SSZipArchive/aes/fileenc.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- ---------------------------------------------------------------------------
- Copyright (c) 2002, Dr Brian Gladman < >, Worcester, UK.
- All rights reserved.
-
- LICENSE TERMS
-
- The free distribution and use of this software in both source and binary
- form is allowed (with or without changes) provided that:
-
- 1. distributions of this source code include the above copyright
- notice, this list of conditions and the following disclaimer;
-
- 2. distributions in binary form include the above copyright
- notice, this list of conditions and the following disclaimer
- in the documentation and/or other associated materials;
-
- 3. the copyright holder's name is not used to endorse products
- built using this software without specific written permission.
-
- ALTERNATIVELY, provided that this notice is retained in full, this product
- may be distributed under the terms of the GNU General Public License (GPL),
- in which case the provisions of the GPL apply INSTEAD OF those given above.
-
- DISCLAIMER
-
- This software is provided 'as is' with no explicit or implied warranties
- in respect of its properties, including, but not limited to, correctness
- and/or fitness for purpose.
- -------------------------------------------------------------------------
- Issue Date: 24/01/2003
-
- This file implements password based file encryption and authentication
- using AES in CTR mode, HMAC-SHA1 authentication and RFC2898 password
- based key derivation.
-
- */
-
-#include
-
-#include "fileenc.h"
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-/* subroutine for data encryption/decryption */
-/* this could be speeded up a lot by aligning */
-/* buffers and using 32 bit operations */
-
-static void encr_data(unsigned char data[], unsigned long d_len, fcrypt_ctx cx[1])
-{
- unsigned long i = 0, pos = cx->encr_pos;
-
- while (i < d_len) {
- if (pos == AES_BLOCK_SIZE) {
- unsigned int j = 0;
- /* increment encryption nonce */
- while (j < 8 && !++cx->nonce[j])
- ++j;
- /* encrypt the nonce to form next xor buffer */
- aes_encrypt(cx->nonce, cx->encr_bfr, cx->encr_ctx);
- pos = 0;
- }
-
- data[i++] ^= cx->encr_bfr[pos++];
- }
-
- cx->encr_pos = (unsigned int)pos;
-}
-
-int fcrypt_init(
- int mode, /* the mode to be used (input) */
- const unsigned char pwd[], /* the user specified password (input) */
- unsigned int pwd_len, /* the length of the password (input) */
- const unsigned char salt[], /* the salt (input) */
-#ifdef PASSWORD_VERIFIER
- unsigned char pwd_ver[PWD_VER_LENGTH], /* 2 byte password verifier (output) */
-#endif
- fcrypt_ctx cx[1]) /* the file encryption context (output) */
-{
- unsigned char kbuf[2 * MAX_KEY_LENGTH + PWD_VER_LENGTH];
-
- if (pwd_len > MAX_PWD_LENGTH)
- return PASSWORD_TOO_LONG;
-
- if (mode < 1 || mode > 3)
- return BAD_MODE;
-
- cx->mode = mode;
- cx->pwd_len = pwd_len;
-
- /* derive the encryption and authentication keys and the password verifier */
- derive_key(pwd, pwd_len, salt, SALT_LENGTH(mode), KEYING_ITERATIONS,
- kbuf, 2 * KEY_LENGTH(mode) + PWD_VER_LENGTH);
-
- /* initialise the encryption nonce and buffer pos */
- cx->encr_pos = AES_BLOCK_SIZE;
- /* if we need a random component in the encryption */
- /* nonce, this is where it would have to be set */
- memset(cx->nonce, 0, AES_BLOCK_SIZE * sizeof(unsigned char));
-
- /* initialise for encryption using key 1 */
- aes_encrypt_key(kbuf, KEY_LENGTH(mode), cx->encr_ctx);
-
- /* initialise for authentication using key 2 */
- hmac_sha_begin(cx->auth_ctx);
- hmac_sha_key(kbuf + KEY_LENGTH(mode), KEY_LENGTH(mode), cx->auth_ctx);
-
-#ifdef PASSWORD_VERIFIER
- memcpy(pwd_ver, kbuf + 2 * KEY_LENGTH(mode), PWD_VER_LENGTH);
-#endif
-
- return GOOD_RETURN;
-}
-
-/* perform 'in place' encryption and authentication */
-
-void fcrypt_encrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1])
-{
- encr_data(data, data_len, cx);
- hmac_sha_data(data, data_len, cx->auth_ctx);
-}
-
-/* perform 'in place' authentication and decryption */
-
-void fcrypt_decrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1])
-{
- hmac_sha_data(data, data_len, cx->auth_ctx);
- encr_data(data, data_len, cx);
-}
-
-/* close encryption/decryption and return the MAC value */
-
-int fcrypt_end(unsigned char mac[], fcrypt_ctx cx[1])
-{
- hmac_sha_end(mac, MAC_LENGTH(cx->mode), cx->auth_ctx);
- return MAC_LENGTH(cx->mode); /* return MAC length in bytes */
-}
-
-#if defined(__cplusplus)
-}
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/fileenc.h b/ios/CodePush/SSZipArchive/aes/fileenc.h
deleted file mode 100644
index ba64a7c32..000000000
--- a/ios/CodePush/SSZipArchive/aes/fileenc.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- ---------------------------------------------------------------------------
- Copyright (c) 2002, Dr Brian Gladman < >, Worcester, UK.
- All rights reserved.
-
- LICENSE TERMS
-
- The free distribution and use of this software in both source and binary
- form is allowed (with or without changes) provided that:
-
- 1. distributions of this source code include the above copyright
- notice, this list of conditions and the following disclaimer;
-
- 2. distributions in binary form include the above copyright
- notice, this list of conditions and the following disclaimer
- in the documentation and/or other associated materials;
-
- 3. the copyright holder's name is not used to endorse products
- built using this software without specific written permission.
-
- ALTERNATIVELY, provided that this notice is retained in full, this product
- may be distributed under the terms of the GNU General Public License (GPL),
- in which case the provisions of the GPL apply INSTEAD OF those given above.
-
- DISCLAIMER
-
- This software is provided 'as is' with no explicit or implied warranties
- in respect of its properties, including, but not limited to, correctness
- and/or fitness for purpose.
- ---------------------------------------------------------------------------
- Issue Date: 24/01/2003
-
- This file contains the header file for fileenc.c, which implements password
- based file encryption and authentication using AES in CTR mode, HMAC-SHA1
- authentication and RFC2898 password based key derivation.
-*/
-
-#ifndef _FENC_H
-#define _FENC_H
-
-#include "aes.h"
-#include "hmac.h"
-#include "pwd2key.h"
-
-#define PASSWORD_VERIFIER
-
-#define MAX_KEY_LENGTH 32
-#define MAX_PWD_LENGTH 128
-#define MAX_SALT_LENGTH 16
-#define KEYING_ITERATIONS 1000
-
-#ifdef PASSWORD_VERIFIER
-#define PWD_VER_LENGTH 2
-#else
-#define PWD_VER_LENGTH 0
-#endif
-
-#define GOOD_RETURN 0
-#define PASSWORD_TOO_LONG -100
-#define BAD_MODE -101
-
-/*
- Field lengths (in bytes) versus File Encryption Mode (0 < mode < 4)
-
- Mode Key Salt MAC Overhead
- 1 16 8 10 18
- 2 24 12 10 22
- 3 32 16 10 26
-
- The following macros assume that the mode value is correct.
-*/
-
-#define KEY_LENGTH(mode) (8 * (mode & 3) + 8)
-#define SALT_LENGTH(mode) (4 * (mode & 3) + 4)
-#define MAC_LENGTH(mode) (10)
-
-/* the context for file encryption */
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-typedef struct
-{ unsigned char nonce[AES_BLOCK_SIZE]; /* the CTR nonce */
- unsigned char encr_bfr[AES_BLOCK_SIZE]; /* encrypt buffer */
- aes_encrypt_ctx encr_ctx[1]; /* encryption context */
- hmac_ctx auth_ctx[1]; /* authentication context */
- unsigned int encr_pos; /* block position (enc) */
- unsigned int pwd_len; /* password length */
- unsigned int mode; /* File encryption mode */
-} fcrypt_ctx;
-
-/* initialise file encryption or decryption */
-
-int fcrypt_init(
- int mode, /* the mode to be used (input) */
- const unsigned char pwd[], /* the user specified password (input) */
- unsigned int pwd_len, /* the length of the password (input) */
- const unsigned char salt[], /* the salt (input) */
-#ifdef PASSWORD_VERIFIER
- unsigned char pwd_ver[PWD_VER_LENGTH], /* 2 byte password verifier (output) */
-#endif
- fcrypt_ctx cx[1]); /* the file encryption context (output) */
-
-/* perform 'in place' encryption or decryption and authentication */
-
-void fcrypt_encrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1]);
-void fcrypt_decrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1]);
-
-/* close encryption/decryption and return the MAC value */
-/* the return value is the length of the MAC */
-
-int fcrypt_end(unsigned char mac[], /* the MAC value (output) */
- fcrypt_ctx cx[1]); /* the context (input) */
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/hmac.c b/ios/CodePush/SSZipArchive/aes/hmac.c
deleted file mode 100644
index c71b14ea4..000000000
--- a/ios/CodePush/SSZipArchive/aes/hmac.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- ---------------------------------------------------------------------------
- Copyright (c) 2002, Dr Brian Gladman, Worcester, UK. All rights reserved.
-
- LICENSE TERMS
-
- The free distribution and use of this software in both source and binary
- form is allowed (with or without changes) provided that:
-
- 1. distributions of this source code include the above copyright
- notice, this list of conditions and the following disclaimer;
-
- 2. distributions in binary form include the above copyright
- notice, this list of conditions and the following disclaimer
- in the documentation and/or other associated materials;
-
- 3. the copyright holder's name is not used to endorse products
- built using this software without specific written permission.
-
- ALTERNATIVELY, provided that this notice is retained in full, this product
- may be distributed under the terms of the GNU General Public License (GPL),
- in which case the provisions of the GPL apply INSTEAD OF those given above.
-
- DISCLAIMER
-
- This software is provided 'as is' with no explicit or implied warranties
- in respect of its properties, including, but not limited to, correctness
- and/or fitness for purpose.
- ---------------------------------------------------------------------------
- Issue Date: 26/08/2003
-
- This is an implementation of HMAC, the FIPS standard keyed hash function
-*/
-
-#include "hmac.h"
-#include "brg_types.h"
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-/* initialise the HMAC context to zero */
-void hmac_sha_begin(hmac_ctx cx[1])
-{
- memset(cx, 0, sizeof(hmac_ctx));
-}
-
-/* input the HMAC key (can be called multiple times) */
-int hmac_sha_key(const unsigned char key[], unsigned long key_len, hmac_ctx cx[1])
-{
- if(cx->klen == HMAC_IN_DATA) /* error if further key input */
- return HMAC_BAD_MODE; /* is attempted in data mode */
-
- if(cx->klen + key_len > HASH_INPUT_SIZE) /* if the key has to be hashed */
- {
- if(cx->klen <= HASH_INPUT_SIZE) /* if the hash has not yet been */
- { /* started, initialise it and */
- sha_begin(cx->ctx); /* hash stored key characters */
- sha_hash(cx->key, cx->klen, cx->ctx);
- }
-
- sha_hash(key, key_len, cx->ctx); /* hash long key data into hash */
- }
- else /* otherwise store key data */
- memcpy(cx->key + cx->klen, key, key_len);
-
- cx->klen += key_len; /* update the key length count */
- return HMAC_OK;
-}
-
-/* input the HMAC data (can be called multiple times) - */
-/* note that this call terminates the key input phase */
-void hmac_sha_data(const unsigned char data[], unsigned long data_len, hmac_ctx cx[1])
-{ unsigned int i;
-
- if(cx->klen != HMAC_IN_DATA) /* if not yet in data phase */
- {
- if(cx->klen > HASH_INPUT_SIZE) /* if key is being hashed */
- { /* complete the hash and */
- sha_end(cx->key, cx->ctx); /* store the result as the */
- cx->klen = HASH_OUTPUT_SIZE; /* key and set new length */
- }
-
- /* pad the key if necessary */
- memset(cx->key + cx->klen, 0, HASH_INPUT_SIZE - cx->klen);
-
- /* xor ipad into key value */
- for(i = 0; i < (HASH_INPUT_SIZE >> 2); ++i)
- ((uint_32t*)cx->key)[i] ^= 0x36363636;
-
- /* and start hash operation */
- sha_begin(cx->ctx);
- sha_hash(cx->key, HASH_INPUT_SIZE, cx->ctx);
-
- /* mark as now in data mode */
- cx->klen = HMAC_IN_DATA;
- }
-
- /* hash the data (if any) */
- if(data_len)
- sha_hash(data, data_len, cx->ctx);
-}
-
-/* compute and output the MAC value */
-void hmac_sha_end(unsigned char mac[], unsigned long mac_len, hmac_ctx cx[1])
-{ unsigned char dig[HASH_OUTPUT_SIZE];
- unsigned int i;
-
- /* if no data has been entered perform a null data phase */
- if(cx->klen != HMAC_IN_DATA)
- hmac_sha_data((const unsigned char*)0, 0, cx);
-
- sha_end(dig, cx->ctx); /* complete the inner hash */
-
- /* set outer key value using opad and removing ipad */
- for(i = 0; i < (HASH_INPUT_SIZE >> 2); ++i)
- ((uint_32t*)cx->key)[i] ^= 0x36363636 ^ 0x5c5c5c5c;
-
- /* perform the outer hash operation */
- sha_begin(cx->ctx);
- sha_hash(cx->key, HASH_INPUT_SIZE, cx->ctx);
- sha_hash(dig, HASH_OUTPUT_SIZE, cx->ctx);
- sha_end(dig, cx->ctx);
-
- /* output the hash value */
- for(i = 0; i < mac_len; ++i)
- mac[i] = dig[i];
-}
-
-/* 'do it all in one go' subroutine */
-void hmac_sha(const unsigned char key[], unsigned long key_len,
- const unsigned char data[], unsigned long data_len,
- unsigned char mac[], unsigned long mac_len)
-{ hmac_ctx cx[1];
-
- hmac_sha_begin(cx);
- hmac_sha_key(key, key_len, cx);
- hmac_sha_data(data, data_len, cx);
- hmac_sha_end(mac, mac_len, cx);
-}
-
-#if defined(__cplusplus)
-}
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/hmac.h b/ios/CodePush/SSZipArchive/aes/hmac.h
deleted file mode 100644
index 643037c92..000000000
--- a/ios/CodePush/SSZipArchive/aes/hmac.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- ---------------------------------------------------------------------------
- Copyright (c) 2002, Dr Brian Gladman, Worcester, UK. All rights reserved.
-
- LICENSE TERMS
-
- The free distribution and use of this software in both source and binary
- form is allowed (with or without changes) provided that:
-
- 1. distributions of this source code include the above copyright
- notice, this list of conditions and the following disclaimer;
-
- 2. distributions in binary form include the above copyright
- notice, this list of conditions and the following disclaimer
- in the documentation and/or other associated materials;
-
- 3. the copyright holder's name is not used to endorse products
- built using this software without specific written permission.
-
- ALTERNATIVELY, provided that this notice is retained in full, this product
- may be distributed under the terms of the GNU General Public License (GPL),
- in which case the provisions of the GPL apply INSTEAD OF those given above.
-
- DISCLAIMER
-
- This software is provided 'as is' with no explicit or implied warranties
- in respect of its properties, including, but not limited to, correctness
- and/or fitness for purpose.
- ---------------------------------------------------------------------------
- Issue Date: 26/08/2003
-
- This is an implementation of HMAC, the FIPS standard keyed hash function
-*/
-
-#ifndef _HMAC_H
-#define _HMAC_H
-
-#include
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-#define USE_SHA1
-
-#if !defined(USE_SHA1) && !defined(USE_SHA256)
-#error define USE_SHA1 or USE_SHA256 to set the HMAC hash algorithm
-#endif
-
-#ifdef USE_SHA1
-
-#include "sha1.h"
-
-#define HASH_INPUT_SIZE SHA1_BLOCK_SIZE
-#define HASH_OUTPUT_SIZE SHA1_DIGEST_SIZE
-#define sha_ctx sha1_ctx
-#define sha_begin sha1_begin
-#define sha_hash sha1_hash
-#define sha_end sha1_end
-
-#endif
-
-#ifdef USE_SHA256
-
-#include "sha2.h"
-
-#define HASH_INPUT_SIZE SHA256_BLOCK_SIZE
-#define HASH_OUTPUT_SIZE SHA256_DIGEST_SIZE
-#define sha_ctx sha256_ctx
-#define sha_begin sha256_begin
-#define sha_hash sha256_hash
-#define sha_end sha256_end
-
-#endif
-
-#define HMAC_OK 0
-#define HMAC_BAD_MODE -1
-#define HMAC_IN_DATA 0xffffffff
-
-typedef struct
-{ unsigned char key[HASH_INPUT_SIZE];
- sha_ctx ctx[1];
- unsigned long klen;
-} hmac_ctx;
-
-void hmac_sha_begin(hmac_ctx cx[1]);
-
-int hmac_sha_key(const unsigned char key[], unsigned long key_len, hmac_ctx cx[1]);
-
-void hmac_sha_data(const unsigned char data[], unsigned long data_len, hmac_ctx cx[1]);
-
-void hmac_sha_end(unsigned char mac[], unsigned long mac_len, hmac_ctx cx[1]);
-
-void hmac_sha(const unsigned char key[], unsigned long key_len,
- const unsigned char data[], unsigned long data_len,
- unsigned char mac[], unsigned long mac_len);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/prng.c b/ios/CodePush/SSZipArchive/aes/prng.c
deleted file mode 100644
index 2f910907c..000000000
--- a/ios/CodePush/SSZipArchive/aes/prng.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- ---------------------------------------------------------------------------
- Copyright (c) 2002, Dr Brian Gladman < >, Worcester, UK.
- All rights reserved.
-
- LICENSE TERMS
-
- The free distribution and use of this software in both source and binary
- form is allowed (with or without changes) provided that:
-
- 1. distributions of this source code include the above copyright
- notice, this list of conditions and the following disclaimer;
-
- 2. distributions in binary form include the above copyright
- notice, this list of conditions and the following disclaimer
- in the documentation and/or other associated materials;
-
- 3. the copyright holder's name is not used to endorse products
- built using this software without specific written permission.
-
- ALTERNATIVELY, provided that this notice is retained in full, this product
- may be distributed under the terms of the GNU General Public License (GPL),
- in which case the provisions of the GPL apply INSTEAD OF those given above.
-
- DISCLAIMER
-
- This software is provided 'as is' with no explicit or implied warranties
- in respect of its properties, including, but not limited to, correctness
- and/or fitness for purpose.
- ---------------------------------------------------------------------------
- Issue Date: 24/01/2003
-
- This file implements a random data pool based on the use of an external
- entropy function. It is based on the ideas advocated by Peter Gutmann in
- his work on pseudo random sequence generators. It is not a 'paranoid'
- random sequence generator and no attempt is made to protect the pool
- from prying eyes either by memory locking or by techniques to obscure
- its location in memory.
-*/
-
-#include
-#include "prng.h"
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-/* mix a random data pool using the SHA1 compression function (as */
-/* suggested by Peter Gutmann in his paper on random pools) */
-
-static void prng_mix(unsigned char buf[])
-{ unsigned int i, len;
- sha1_ctx ctx[1];
-
- /*lint -e{663} unusual array to pointer conversion */
- for(i = 0; i < PRNG_POOL_SIZE; i += SHA1_DIGEST_SIZE)
- {
- /* copy digest size pool block into SHA1 hash block */
- memcpy(ctx->hash, buf + (i ? i : PRNG_POOL_SIZE)
- - SHA1_DIGEST_SIZE, SHA1_DIGEST_SIZE);
-
- /* copy data from pool into the SHA1 data buffer */
- len = PRNG_POOL_SIZE - i;
- memcpy(ctx->wbuf, buf + i, (len > SHA1_BLOCK_SIZE ? SHA1_BLOCK_SIZE : len));
-
- if(len < SHA1_BLOCK_SIZE)
- memcpy(((char*)ctx->wbuf) + len, buf, SHA1_BLOCK_SIZE - len);
-
- /* compress using the SHA1 compression function */
- sha1_compile(ctx);
-
- /* put digest size block back into the random pool */
- memcpy(buf + i, ctx->hash, SHA1_DIGEST_SIZE);
- }
-}
-
-/* refresh the output buffer and update the random pool by adding */
-/* entropy and remixing */
-
-static void update_pool(prng_ctx ctx[1])
-{ unsigned int i = 0;
-
- /* transfer random pool data to the output buffer */
- memcpy(ctx->obuf, ctx->rbuf, PRNG_POOL_SIZE);
-
- /* enter entropy data into the pool */
- while(i < PRNG_POOL_SIZE)
- i += ctx->entropy(ctx->rbuf + i, PRNG_POOL_SIZE - i);
-
- /* invert and xor the original pool data into the pool */
- for(i = 0; i < PRNG_POOL_SIZE; ++i)
- ctx->rbuf[i] ^= ~ctx->obuf[i];
-
- /* mix the pool and the output buffer */
- prng_mix(ctx->rbuf);
- prng_mix(ctx->obuf);
-}
-
-void prng_init(prng_entropy_fn fun, prng_ctx ctx[1])
-{ int i;
-
- /* clear the buffers and the counter in the context */
- memset(ctx, 0, sizeof(prng_ctx));
-
- /* set the pointer to the entropy collection function */
- ctx->entropy = fun;
-
- /* initialise the random data pool */
- update_pool(ctx);
-
- /* mix the pool a minimum number of times */
- for(i = 0; i < PRNG_MIN_MIX; ++i)
- prng_mix(ctx->rbuf);
-
- /* update the pool to prime the pool output buffer */
- update_pool(ctx);
-}
-
-/* provide random bytes from the random data pool */
-
-void prng_rand(unsigned char data[], unsigned int data_len, prng_ctx ctx[1])
-{ unsigned char *rp = data;
- unsigned int len, pos = ctx->pos;
-
- while(data_len)
- {
- /* transfer 'data_len' bytes (or the number of bytes remaining */
- /* the pool output buffer if less) into the output */
- len = (data_len < PRNG_POOL_SIZE - pos ? data_len : PRNG_POOL_SIZE - pos);
- memcpy(rp, ctx->obuf + pos, len);
- rp += len; /* update ouput buffer position pointer */
- pos += len; /* update pool output buffer pointer */
- data_len -= len; /* update the remaining data count */
-
- /* refresh the random pool if necessary */
- if(pos == PRNG_POOL_SIZE)
- {
- update_pool(ctx); pos = 0;
- }
- }
-
- ctx->pos = pos;
-}
-
-void prng_end(prng_ctx ctx[1])
-{
- /* ensure the data in the context is destroyed */
- memset(ctx, 0, sizeof(prng_ctx));
-}
-
-#if defined(__cplusplus)
-}
-#endif
-
diff --git a/ios/CodePush/SSZipArchive/aes/prng.h b/ios/CodePush/SSZipArchive/aes/prng.h
deleted file mode 100644
index f934b5192..000000000
--- a/ios/CodePush/SSZipArchive/aes/prng.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- ---------------------------------------------------------------------------
- Copyright (c) 2002, Dr Brian Gladman < >, Worcester, UK.
- All rights reserved.
-
- LICENSE TERMS
-
- The free distribution and use of this software in both source and binary
- form is allowed (with or without changes) provided that:
-
- 1. distributions of this source code include the above copyright
- notice, this list of conditions and the following disclaimer;
-
- 2. distributions in binary form include the above copyright
- notice, this list of conditions and the following disclaimer
- in the documentation and/or other associated materials;
-
- 3. the copyright holder's name is not used to endorse products
- built using this software without specific written permission.
-
- ALTERNATIVELY, provided that this notice is retained in full, this product
- may be distributed under the terms of the GNU General Public License (GPL),
- in which case the provisions of the GPL apply INSTEAD OF those given above.
-
- DISCLAIMER
-
- This software is provided 'as is' with no explicit or implied warranties
- in respect of its properties, including, but not limited to, correctness
- and/or fitness for purpose.
- ---------------------------------------------------------------------------
- Issue Date: 24/01/2003
-
- This is the header file for an implementation of a random data pool based on
- the use of an external entropy function (inspired by Peter Gutmann's work).
-*/
-
-#ifndef _PRNG_H
-#define _PRNG_H
-
-#include "sha1.h"
-
-#define PRNG_POOL_LEN 256 /* minimum random pool size */
-#define PRNG_MIN_MIX 20 /* min initial pool mixing iterations */
-
-/* ensure that pool length is a multiple of the SHA1 digest size */
-
-#define PRNG_POOL_SIZE (SHA1_DIGEST_SIZE * (1 + (PRNG_POOL_LEN - 1) / SHA1_DIGEST_SIZE))
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-/* A function for providing entropy is a parameter in the prng_init() */
-/* call. This function has the following form and returns a maximum */
-/* of 'len' bytes of pseudo random data in the buffer 'buf'. It can */
-/* return less than 'len' bytes but will be repeatedly called for more */
-/* data in this case. */
-
-typedef int (*prng_entropy_fn)(unsigned char buf[], unsigned int len);
-
-typedef struct
-{ unsigned char rbuf[PRNG_POOL_SIZE]; /* the random pool */
- unsigned char obuf[PRNG_POOL_SIZE]; /* pool output buffer */
- unsigned int pos; /* output buffer position */
- prng_entropy_fn entropy; /* entropy function pointer */
-} prng_ctx;
-
-/* initialise the random stream generator */
-void prng_init(prng_entropy_fn fun, prng_ctx ctx[1]);
-
-/* obtain random bytes from the generator */
-void prng_rand(unsigned char data[], unsigned int data_len, prng_ctx ctx[1]);
-
-/* close the random stream generator */
-void prng_end(prng_ctx ctx[1]);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/pwd2key.c b/ios/CodePush/SSZipArchive/aes/pwd2key.c
deleted file mode 100644
index e4cc5c2b3..000000000
--- a/ios/CodePush/SSZipArchive/aes/pwd2key.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- ---------------------------------------------------------------------------
- Copyright (c) 2002, Dr Brian Gladman, Worcester, UK. All rights reserved.
-
- LICENSE TERMS
-
- The free distribution and use of this software in both source and binary
- form is allowed (with or without changes) provided that:
-
- 1. distributions of this source code include the above copyright
- notice, this list of conditions and the following disclaimer;
-
- 2. distributions in binary form include the above copyright
- notice, this list of conditions and the following disclaimer
- in the documentation and/or other associated materials;
-
- 3. the copyright holder's name is not used to endorse products
- built using this software without specific written permission.
-
- ALTERNATIVELY, provided that this notice is retained in full, this product
- may be distributed under the terms of the GNU General Public License (GPL),
- in which case the provisions of the GPL apply INSTEAD OF those given above.
-
- DISCLAIMER
-
- This software is provided 'as is' with no explicit or implied warranties
- in respect of its properties, including, but not limited to, correctness
- and/or fitness for purpose.
- ---------------------------------------------------------------------------
- Issue Date: 26/08/2003
-
- This is an implementation of RFC2898, which specifies key derivation from
- a password and a salt value.
-*/
-
-#include
-#include "hmac.h"
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-void derive_key(const unsigned char pwd[], /* the PASSWORD */
- unsigned int pwd_len, /* and its length */
- const unsigned char salt[], /* the SALT and its */
- unsigned int salt_len, /* length */
- unsigned int iter, /* the number of iterations */
- unsigned char key[], /* space for the output key */
- unsigned int key_len)/* and its required length */
-{
- unsigned int i, j, k, n_blk;
- unsigned char uu[HASH_OUTPUT_SIZE], ux[HASH_OUTPUT_SIZE];
- hmac_ctx c1[1], c2[1], c3[1];
-
- /* set HMAC context (c1) for password */
- hmac_sha_begin(c1);
- hmac_sha_key(pwd, pwd_len, c1);
-
- /* set HMAC context (c2) for password and salt */
- memcpy(c2, c1, sizeof(hmac_ctx));
- hmac_sha_data(salt, salt_len, c2);
-
- /* find the number of SHA blocks in the key */
- n_blk = 1 + (key_len - 1) / HASH_OUTPUT_SIZE;
-
- for(i = 0; i < n_blk; ++i) /* for each block in key */
- {
- /* ux[] holds the running xor value */
- memset(ux, 0, HASH_OUTPUT_SIZE);
-
- /* set HMAC context (c3) for password and salt */
- memcpy(c3, c2, sizeof(hmac_ctx));
-
- /* enter additional data for 1st block into uu */
- uu[0] = (unsigned char)((i + 1) >> 24);
- uu[1] = (unsigned char)((i + 1) >> 16);
- uu[2] = (unsigned char)((i + 1) >> 8);
- uu[3] = (unsigned char)(i + 1);
-
- /* this is the key mixing iteration */
- for(j = 0, k = 4; j < iter; ++j)
- {
- /* add previous round data to HMAC */
- hmac_sha_data(uu, k, c3);
-
- /* obtain HMAC for uu[] */
- hmac_sha_end(uu, HASH_OUTPUT_SIZE, c3);
-
- /* xor into the running xor block */
- for(k = 0; k < HASH_OUTPUT_SIZE; ++k)
- ux[k] ^= uu[k];
-
- /* set HMAC context (c3) for password */
- memcpy(c3, c1, sizeof(hmac_ctx));
- }
-
- /* compile key blocks into the key output */
- j = 0; k = i * HASH_OUTPUT_SIZE;
- while(j < HASH_OUTPUT_SIZE && k < key_len)
- key[k++] = ux[j++];
- }
-}
diff --git a/ios/CodePush/SSZipArchive/aes/pwd2key.h b/ios/CodePush/SSZipArchive/aes/pwd2key.h
deleted file mode 100644
index 99c1ecc18..000000000
--- a/ios/CodePush/SSZipArchive/aes/pwd2key.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- ---------------------------------------------------------------------------
- Copyright (c) 2002, Dr Brian Gladman, Worcester, UK. All rights reserved.
-
- LICENSE TERMS
-
- The free distribution and use of this software in both source and binary
- form is allowed (with or without changes) provided that:
-
- 1. distributions of this source code include the above copyright
- notice, this list of conditions and the following disclaimer;
-
- 2. distributions in binary form include the above copyright
- notice, this list of conditions and the following disclaimer
- in the documentation and/or other associated materials;
-
- 3. the copyright holder's name is not used to endorse products
- built using this software without specific written permission.
-
- ALTERNATIVELY, provided that this notice is retained in full, this product
- may be distributed under the terms of the GNU General Public License (GPL),
- in which case the provisions of the GPL apply INSTEAD OF those given above.
-
- DISCLAIMER
-
- This software is provided 'as is' with no explicit or implied warranties
- in respect of its properties, including, but not limited to, correctness
- and/or fitness for purpose.
- ---------------------------------------------------------------------------
- Issue Date: 26/08/2003
-
- This is an implementation of RFC2898, which specifies key derivation from
- a password and a salt value.
-*/
-
-#ifndef PWD2KEY_H
-#define PWD2KEY_H
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-void derive_key(
- const unsigned char pwd[], /* the PASSWORD, and */
- unsigned int pwd_len, /* its length */
- const unsigned char salt[], /* the SALT and its */
- unsigned int salt_len, /* length */
- unsigned int iter, /* the number of iterations */
- unsigned char key[], /* space for the output key */
- unsigned int key_len); /* and its required length */
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/sha1.c b/ios/CodePush/SSZipArchive/aes/sha1.c
deleted file mode 100644
index 0fbf05e6f..000000000
--- a/ios/CodePush/SSZipArchive/aes/sha1.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- ---------------------------------------------------------------------------
- Copyright (c) 2002, Dr Brian Gladman, Worcester, UK. All rights reserved.
-
- LICENSE TERMS
-
- The free distribution and use of this software in both source and binary
- form is allowed (with or without changes) provided that:
-
- 1. distributions of this source code include the above copyright
- notice, this list of conditions and the following disclaimer;
-
- 2. distributions in binary form include the above copyright
- notice, this list of conditions and the following disclaimer
- in the documentation and/or other associated materials;
-
- 3. the copyright holder's name is not used to endorse products
- built using this software without specific written permission.
-
- ALTERNATIVELY, provided that this notice is retained in full, this product
- may be distributed under the terms of the GNU General Public License (GPL),
- in which case the provisions of the GPL apply INSTEAD OF those given above.
-
- DISCLAIMER
-
- This software is provided 'as is' with no explicit or implied warranties
- in respect of its properties, including, but not limited to, correctness
- and/or fitness for purpose.
- ---------------------------------------------------------------------------
- Issue Date: 01/08/2005
-
- This is a byte oriented version of SHA1 that operates on arrays of bytes
- stored in memory.
-*/
-
-#include /* for memcpy() etc. */
-
-#include "sha1.h"
-#include "brg_endian.h"
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-#if defined( _MSC_VER ) && ( _MSC_VER > 800 )
-#pragma intrinsic(memcpy)
-#endif
-
-#if 0 && defined(_MSC_VER)
-#define rotl32 _lrotl
-#define rotr32 _lrotr
-#else
-#define rotl32(x,n) (((x) << n) | ((x) >> (32 - n)))
-#define rotr32(x,n) (((x) >> n) | ((x) << (32 - n)))
-#endif
-
-#if !defined(bswap_32)
-#define bswap_32(x) ((rotr32((x), 24) & 0x00ff00ff) | (rotr32((x), 8) & 0xff00ff00))
-#endif
-
-#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
-#define SWAP_BYTES
-#else
-#undef SWAP_BYTES
-#endif
-
-#if defined(SWAP_BYTES)
-#define bsw_32(p,n) \
- { int _i = (n); while(_i--) ((uint_32t*)p)[_i] = bswap_32(((uint_32t*)p)[_i]); }
-#else
-#define bsw_32(p,n)
-#endif
-
-#define SHA1_MASK (SHA1_BLOCK_SIZE - 1)
-
-#if 0
-
-#define ch(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
-#define parity(x,y,z) ((x) ^ (y) ^ (z))
-#define maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
-
-#else /* Discovered by Rich Schroeppel and Colin Plumb */
-
-#define ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
-#define parity(x,y,z) ((x) ^ (y) ^ (z))
-#define maj(x,y,z) (((x) & (y)) | ((z) & ((x) ^ (y))))
-
-#endif
-
-/* Compile 64 bytes of hash data into SHA1 context. Note */
-/* that this routine assumes that the byte order in the */
-/* ctx->wbuf[] at this point is in such an order that low */
-/* address bytes in the ORIGINAL byte stream will go in */
-/* this buffer to the high end of 32-bit words on BOTH big */
-/* and little endian systems */
-
-#ifdef ARRAY
-#define q(v,n) v[n]
-#else
-#define q(v,n) v##n
-#endif
-
-#define one_cycle(v,a,b,c,d,e,f,k,h) \
- q(v,e) += rotr32(q(v,a),27) + \
- f(q(v,b),q(v,c),q(v,d)) + k + h; \
- q(v,b) = rotr32(q(v,b), 2)
-
-#define five_cycle(v,f,k,i) \
- one_cycle(v, 0,1,2,3,4, f,k,hf(i )); \
- one_cycle(v, 4,0,1,2,3, f,k,hf(i+1)); \
- one_cycle(v, 3,4,0,1,2, f,k,hf(i+2)); \
- one_cycle(v, 2,3,4,0,1, f,k,hf(i+3)); \
- one_cycle(v, 1,2,3,4,0, f,k,hf(i+4))
-
-VOID_RETURN sha1_compile(sha1_ctx ctx[1])
-{ uint_32t *w = ctx->wbuf;
-
-#ifdef ARRAY
- uint_32t v[5];
- memcpy(v, ctx->hash, 5 * sizeof(uint_32t));
-#else
- uint_32t v0, v1, v2, v3, v4;
- v0 = ctx->hash[0]; v1 = ctx->hash[1];
- v2 = ctx->hash[2]; v3 = ctx->hash[3];
- v4 = ctx->hash[4];
-#endif
-
-#define hf(i) w[i]
-
- five_cycle(v, ch, 0x5a827999, 0);
- five_cycle(v, ch, 0x5a827999, 5);
- five_cycle(v, ch, 0x5a827999, 10);
- one_cycle(v,0,1,2,3,4, ch, 0x5a827999, hf(15)); \
-
-#undef hf
-#define hf(i) (w[(i) & 15] = rotl32( \
- w[((i) + 13) & 15] ^ w[((i) + 8) & 15] \
- ^ w[((i) + 2) & 15] ^ w[(i) & 15], 1))
-
- one_cycle(v,4,0,1,2,3, ch, 0x5a827999, hf(16));
- one_cycle(v,3,4,0,1,2, ch, 0x5a827999, hf(17));
- one_cycle(v,2,3,4,0,1, ch, 0x5a827999, hf(18));
- one_cycle(v,1,2,3,4,0, ch, 0x5a827999, hf(19));
-
- five_cycle(v, parity, 0x6ed9eba1, 20);
- five_cycle(v, parity, 0x6ed9eba1, 25);
- five_cycle(v, parity, 0x6ed9eba1, 30);
- five_cycle(v, parity, 0x6ed9eba1, 35);
-
- five_cycle(v, maj, 0x8f1bbcdc, 40);
- five_cycle(v, maj, 0x8f1bbcdc, 45);
- five_cycle(v, maj, 0x8f1bbcdc, 50);
- five_cycle(v, maj, 0x8f1bbcdc, 55);
-
- five_cycle(v, parity, 0xca62c1d6, 60);
- five_cycle(v, parity, 0xca62c1d6, 65);
- five_cycle(v, parity, 0xca62c1d6, 70);
- five_cycle(v, parity, 0xca62c1d6, 75);
-
-#ifdef ARRAY
- ctx->hash[0] += v[0]; ctx->hash[1] += v[1];
- ctx->hash[2] += v[2]; ctx->hash[3] += v[3];
- ctx->hash[4] += v[4];
-#else
- ctx->hash[0] += v0; ctx->hash[1] += v1;
- ctx->hash[2] += v2; ctx->hash[3] += v3;
- ctx->hash[4] += v4;
-#endif
-}
-
-VOID_RETURN sha1_begin(sha1_ctx ctx[1])
-{
- ctx->count[0] = ctx->count[1] = 0;
- ctx->hash[0] = 0x67452301;
- ctx->hash[1] = 0xefcdab89;
- ctx->hash[2] = 0x98badcfe;
- ctx->hash[3] = 0x10325476;
- ctx->hash[4] = 0xc3d2e1f0;
-}
-
-/* SHA1 hash data in an array of bytes into hash buffer and */
-/* call the hash_compile function as required. */
-
-VOID_RETURN sha1_hash(const unsigned char data[], unsigned long len, sha1_ctx ctx[1])
-{ uint_32t pos = (uint_32t)(ctx->count[0] & SHA1_MASK),
- space = SHA1_BLOCK_SIZE - pos;
- const unsigned char *sp = data;
-
- if((ctx->count[0] += len) < len)
- ++(ctx->count[1]);
-
- while(len >= space) /* tranfer whole blocks if possible */
- {
- memcpy(((unsigned char*)ctx->wbuf) + pos, sp, space);
- sp += space; len -= space; space = SHA1_BLOCK_SIZE; pos = 0;
- bsw_32(ctx->wbuf, SHA1_BLOCK_SIZE >> 2);
- sha1_compile(ctx);
- }
-
- memcpy(((unsigned char*)ctx->wbuf) + pos, sp, len);
-}
-
-/* SHA1 final padding and digest calculation */
-
-VOID_RETURN sha1_end(unsigned char hval[], sha1_ctx ctx[1])
-{ uint_32t i = (uint_32t)(ctx->count[0] & SHA1_MASK);
-
- /* put bytes in the buffer in an order in which references to */
- /* 32-bit words will put bytes with lower addresses into the */
- /* top of 32 bit words on BOTH big and little endian machines */
- bsw_32(ctx->wbuf, (i + 3) >> 2);
-
- /* we now need to mask valid bytes and add the padding which is */
- /* a single 1 bit and as many zero bits as necessary. Note that */
- /* we can always add the first padding byte here because the */
- /* buffer always has at least one empty slot */
- ctx->wbuf[i >> 2] &= 0xffffff80 << 8 * (~i & 3);
- ctx->wbuf[i >> 2] |= 0x00000080 << 8 * (~i & 3);
-
- /* we need 9 or more empty positions, one for the padding byte */
- /* (above) and eight for the length count. If there is not */
- /* enough space, pad and empty the buffer */
- if(i > SHA1_BLOCK_SIZE - 9)
- {
- if(i < 60) ctx->wbuf[15] = 0;
- sha1_compile(ctx);
- i = 0;
- }
- else /* compute a word index for the empty buffer positions */
- i = (i >> 2) + 1;
-
- while(i < 14) /* and zero pad all but last two positions */
- ctx->wbuf[i++] = 0;
-
- /* the following 32-bit length fields are assembled in the */
- /* wrong byte order on little endian machines but this is */
- /* corrected later since they are only ever used as 32-bit */
- /* word values. */
- ctx->wbuf[14] = (ctx->count[1] << 3) | (ctx->count[0] >> 29);
- ctx->wbuf[15] = ctx->count[0] << 3;
- sha1_compile(ctx);
-
- /* extract the hash value as bytes in case the hash buffer is */
- /* misaligned for 32-bit words */
- for(i = 0; i < SHA1_DIGEST_SIZE; ++i)
- hval[i] = (unsigned char)(ctx->hash[i >> 2] >> (8 * (~i & 3)));
-}
-
-VOID_RETURN sha1(unsigned char hval[], const unsigned char data[], unsigned long len)
-{ sha1_ctx cx[1];
-
- sha1_begin(cx); sha1_hash(data, len, cx); sha1_end(hval, cx);
-}
-
-#if defined(__cplusplus)
-}
-#endif
diff --git a/ios/CodePush/SSZipArchive/aes/sha1.h b/ios/CodePush/SSZipArchive/aes/sha1.h
deleted file mode 100644
index bace6afe9..000000000
--- a/ios/CodePush/SSZipArchive/aes/sha1.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- ---------------------------------------------------------------------------
- Copyright (c) 2002, Dr Brian Gladman, Worcester, UK. All rights reserved.
-
- LICENSE TERMS
-
- The free distribution and use of this software in both source and binary
- form is allowed (with or without changes) provided that:
-
- 1. distributions of this source code include the above copyright
- notice, this list of conditions and the following disclaimer;
-
- 2. distributions in binary form include the above copyright
- notice, this list of conditions and the following disclaimer
- in the documentation and/or other associated materials;
-
- 3. the copyright holder's name is not used to endorse products
- built using this software without specific written permission.
-
- ALTERNATIVELY, provided that this notice is retained in full, this product
- may be distributed under the terms of the GNU General Public License (GPL),
- in which case the provisions of the GPL apply INSTEAD OF those given above.
-
- DISCLAIMER
-
- This software is provided 'as is' with no explicit or implied warranties
- in respect of its properties, including, but not limited to, correctness
- and/or fitness for purpose.
- ---------------------------------------------------------------------------
- Issue Date: 01/08/2005
-*/
-
-#ifndef _SHA1_H
-#define _SHA1_H
-
-#include
-#include "brg_types.h"
-
-#define SHA1_BLOCK_SIZE 64
-#define SHA1_DIGEST_SIZE 20
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-/* type to hold the SHA256 context */
-
-typedef struct
-{ uint_32t count[2];
- uint_32t hash[5];
- uint_32t wbuf[16];
-} sha1_ctx;
-
-/* Note that these prototypes are the same for both bit and */
-/* byte oriented implementations. However the length fields */
-/* are in bytes or bits as appropriate for the version used */
-/* and bit sequences are input as arrays of bytes in which */
-/* bit sequences run from the most to the least significant */
-/* end of each byte */
-
-VOID_RETURN sha1_compile(sha1_ctx ctx[1]);
-
-VOID_RETURN sha1_begin(sha1_ctx ctx[1]);
-VOID_RETURN sha1_hash(const unsigned char data[], unsigned long len, sha1_ctx ctx[1]);
-VOID_RETURN sha1_end(unsigned char hval[], sha1_ctx ctx[1]);
-VOID_RETURN sha1(unsigned char hval[], const unsigned char data[], unsigned long len);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/include/ZipArchive.h b/ios/CodePush/SSZipArchive/include/ZipArchive.h
new file mode 100644
index 000000000..e81fc9b6e
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/include/ZipArchive.h
@@ -0,0 +1,25 @@
+//
+// ZipArchive.h
+// ZipArchive
+//
+// Created by Serhii Mumriak on 12/1/15.
+//
+
+#import
+
+//! Project version number for ZipArchive.
+FOUNDATION_EXPORT double ZipArchiveVersionNumber;
+
+//! Project version string for ZipArchive.
+FOUNDATION_EXPORT const unsigned char ZipArchiveVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+// This is to account for the many different ways this library gets imported.
+#if __has_include()
+#import
+#elif __has_include("../SSZipArchive.h")
+#import "../SSZipArchive.h"
+#else
+#import "SSZipArchive.h"
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/LICENSE b/ios/CodePush/SSZipArchive/minizip/LICENSE
new file mode 100644
index 000000000..3b6c4e142
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/LICENSE
@@ -0,0 +1,17 @@
+Condition of use and distribution are the same as zlib:
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgement in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
diff --git a/ios/CodePush/SSZipArchive/minizip/crypt.h b/ios/CodePush/SSZipArchive/minizip/crypt.h
deleted file mode 100644
index 46c63fb3e..000000000
--- a/ios/CodePush/SSZipArchive/minizip/crypt.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/* crypt.h -- base code for traditional PKWARE encryption
- Version 1.01e, February 12th, 2005
-
- Copyright (C) 1998-2005 Gilles Vollant
- Modifications for Info-ZIP crypting
- Copyright (C) 2003 Terry Thorsen
-
- This code is a modified version of crypting code in Info-ZIP distribution
-
- Copyright (C) 1990-2000 Info-ZIP. All rights reserved.
-
- See the Info-ZIP LICENSE file version 2000-Apr-09 or later for terms of use
- which also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
-
- The encryption/decryption parts of this source code (as opposed to the
- non-echoing password parts) were originally written in Europe. The
- whole source package can be freely distributed, including from the USA.
- (Prior to January 2000, re-export from the US was a violation of US law.)
-
- This encryption code is a direct transcription of the algorithm from
- Roger Schlafly, described by Phil Katz in the file appnote.txt. This
- file (appnote.txt) is distributed with the PKZIP program (even in the
- version without encryption capabilities).
-
- If you don't need crypting in your application, just define symbols
- NOCRYPT and NOUNCRYPT.
-*/
-
-#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
-
-/***********************************************************************
- * Return the next byte in the pseudo-random sequence
- */
-static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
-{
- unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
- * unpredictable manner on 16-bit systems; not a problem
- * with any known compiler so far, though */
-
- temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
- return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
-}
-
-/***********************************************************************
- * Update the encryption keys with the next byte of plain text
- */
-static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
-{
- (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
- (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
- (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
- {
- register int keyshift = (int)((*(pkeys+1)) >> 24);
- (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
- }
- return c;
-}
-
-
-/***********************************************************************
- * Initialize the encryption keys and the random header according to
- * the given password.
- */
-static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
-{
- *(pkeys+0) = 305419896L;
- *(pkeys+1) = 591751049L;
- *(pkeys+2) = 878082192L;
- while (*passwd != 0) {
- update_keys(pkeys,pcrc_32_tab,(int)*passwd);
- passwd++;
- }
-}
-
-#define zdecode(pkeys,pcrc_32_tab,c) \
- (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
-
-#define zencode(pkeys,pcrc_32_tab,c,t) \
- (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
-
-#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
-
-#define RAND_HEAD_LEN 12
- /* "last resort" source for second part of crypt seed pattern */
-# ifndef ZCR_SEED2
-# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
-# endif
-
-static int crypthead(const char* passwd, /* password string */
- unsigned char* buf, /* where to write header */
- int bufSize,
- unsigned long* pkeys,
- const unsigned long* pcrc_32_tab,
- unsigned long crcForCrypting)
-{
- int n; /* index in random header */
- int t; /* temporary */
- int c; /* random byte */
- unsigned char header[RAND_HEAD_LEN-2]; /* random header */
- static unsigned calls = 0; /* ensure different random header each time */
-
- if (bufSize> 7) & 0xff;
- header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
- }
- /* Encrypt random header (last two bytes is high word of crc) */
- init_keys(passwd, pkeys, pcrc_32_tab);
- for (n = 0; n < RAND_HEAD_LEN-2; n++)
- {
- buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
- }
- buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
- buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
- return n;
-}
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/ioapi.c b/ios/CodePush/SSZipArchive/minizip/ioapi.c
deleted file mode 100644
index 857f7b9be..000000000
--- a/ios/CodePush/SSZipArchive/minizip/ioapi.c
+++ /dev/null
@@ -1,369 +0,0 @@
-/* ioapi.h -- IO base function header for compress/uncompress .zip
- part of the MiniZip project
-
- Copyright (C) 1998-2010 Gilles Vollant
- http://www.winimage.com/zLibDll/minizip.html
- Modifications for Zip64 support
- Copyright (C) 2009-2010 Mathias Svensson
- http://result42.com
-
- This program is distributed under the terms of the same license as zlib.
- See the accompanying LICENSE file for the full text of the license.
-*/
-
-#include
-#include
-
-#include "ioapi.h"
-
-#if defined(_WIN32)
-# define snprintf _snprintf
-#endif
-
-#ifdef __APPLE__
-/* In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions */
-# define FOPEN_FUNC(filename, mode) fopen(filename, mode)
-# define FTELLO_FUNC(stream) ftello(stream)
-# define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
-#else
-# define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
-# define FTELLO_FUNC(stream) ftello64(stream)
-# define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
-#endif
-
-/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
-#ifndef SEEK_CUR
-# define SEEK_CUR 1
-#endif
-#ifndef SEEK_END
-# define SEEK_END 2
-#endif
-#ifndef SEEK_SET
-# define SEEK_SET 0
-#endif
-
-voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)
-{
- if (pfilefunc->zfile_func64.zopen64_file != NULL)
- return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
- return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode);
-}
-
-voidpf call_zopendisk64 OF((const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, int number_disk, int mode))
-{
- if (pfilefunc->zfile_func64.zopendisk64_file != NULL)
- return (*(pfilefunc->zfile_func64.zopendisk64_file)) (pfilefunc->zfile_func64.opaque,filestream,number_disk,mode);
- return (*(pfilefunc->zopendisk32_file))(pfilefunc->zfile_func64.opaque,filestream,number_disk,mode);
-}
-
-long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)
-{
- uLong offsetTruncated;
- if (pfilefunc->zfile_func64.zseek64_file != NULL)
- return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
- offsetTruncated = (uLong)offset;
- if (offsetTruncated != offset)
- return -1;
- return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin);
-}
-
-ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)
-{
- uLong tell_uLong;
- if (pfilefunc->zfile_func64.zseek64_file != NULL)
- return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
- tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
- if ((tell_uLong) == 0xffffffff)
- return (ZPOS64_T)-1;
- return tell_uLong;
-}
-
-void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)
-{
- p_filefunc64_32->zfile_func64.zopen64_file = NULL;
- p_filefunc64_32->zfile_func64.zopendisk64_file = NULL;
- p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
- p_filefunc64_32->zopendisk32_file = p_filefunc32->zopendisk_file;
- p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
- p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
- p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
- p_filefunc64_32->zfile_func64.ztell64_file = NULL;
- p_filefunc64_32->zfile_func64.zseek64_file = NULL;
- p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file;
- p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
- p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
- p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
- p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
-}
-
-static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
-static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
-static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));
-static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));
-static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
-static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));
-static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
-
-typedef struct
-{
- FILE *file;
- int filenameLength;
- void *filename;
-} FILE_IOPOSIX;
-
-static voidpf file_build_ioposix(FILE *file, const char *filename)
-{
- FILE_IOPOSIX *ioposix = NULL;
- if (file == NULL)
- return NULL;
- ioposix = (FILE_IOPOSIX*)malloc(sizeof(FILE_IOPOSIX));
- ioposix->file = file;
- ioposix->filenameLength = (int)strlen(filename) + 1;
- ioposix->filename = (char*)malloc(ioposix->filenameLength * sizeof(char));
- strncpy(ioposix->filename, filename, ioposix->filenameLength);
- return (voidpf)ioposix;
-}
-
-static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
-{
- FILE* file = NULL;
- const char* mode_fopen = NULL;
- if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
- mode_fopen = "rb";
- else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
- mode_fopen = "r+b";
- else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
- mode_fopen = "wb";
-
- if ((filename != NULL) && (mode_fopen != NULL))
- {
- file = fopen(filename, mode_fopen);
- return file_build_ioposix(file, filename);
- }
- return file;
-}
-
-static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
-{
- FILE* file = NULL;
- const char* mode_fopen = NULL;
- if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
- mode_fopen = "rb";
- else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
- mode_fopen = "r+b";
- else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
- mode_fopen = "wb";
-
- if ((filename != NULL) && (mode_fopen != NULL))
- {
- file = FOPEN_FUNC((const char*)filename, mode_fopen);
- return file_build_ioposix(file, (const char*)filename);
- }
- return file;
-}
-
-static voidpf ZCALLBACK fopendisk64_file_func (voidpf opaque, voidpf stream, int number_disk, int mode)
-{
- FILE_IOPOSIX *ioposix = NULL;
- char *diskFilename = NULL;
- voidpf ret = NULL;
- int i = 0;
-
- if (stream == NULL)
- return NULL;
- ioposix = (FILE_IOPOSIX*)stream;
- diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char));
- strncpy(diskFilename, ioposix->filename, ioposix->filenameLength);
- for (i = ioposix->filenameLength - 1; i >= 0; i -= 1)
- {
- if (diskFilename[i] != '.')
- continue;
- snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02d", number_disk + 1);
- break;
- }
- if (i >= 0)
- ret = fopen64_file_func(opaque, diskFilename, mode);
- free(diskFilename);
- return ret;
-}
-
-static voidpf ZCALLBACK fopendisk_file_func (voidpf opaque, voidpf stream, int number_disk, int mode)
-{
- FILE_IOPOSIX *ioposix = NULL;
- char *diskFilename = NULL;
- voidpf ret = NULL;
- int i = 0;
-
- if (stream == NULL)
- return NULL;
- ioposix = (FILE_IOPOSIX*)stream;
- diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char));
- strncpy(diskFilename, ioposix->filename, ioposix->filenameLength);
- for (i = ioposix->filenameLength - 1; i >= 0; i -= 1)
- {
- if (diskFilename[i] != '.')
- continue;
- snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02d", number_disk + 1);
- break;
- }
- if (i >= 0)
- ret = fopen_file_func(opaque, diskFilename, mode);
- free(diskFilename);
- return ret;
-}
-
-static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
-{
- FILE_IOPOSIX *ioposix = NULL;
- uLong ret;
- if (stream == NULL)
- return -1;
- ioposix = (FILE_IOPOSIX*)stream;
- ret = (uLong)fread(buf, 1, (size_t)size, ioposix->file);
- return ret;
-}
-
-static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
-{
- FILE_IOPOSIX *ioposix = NULL;
- uLong ret;
- if (stream == NULL)
- return -1;
- ioposix = (FILE_IOPOSIX*)stream;
- ret = (uLong)fwrite(buf, 1, (size_t)size, ioposix->file);
- return ret;
-}
-
-static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
-{
- FILE_IOPOSIX *ioposix = NULL;
- long ret = -1;
- if (stream == NULL)
- return ret;
- ioposix = (FILE_IOPOSIX*)stream;
- ret = ftell(ioposix->file);
- return ret;
-}
-
-static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
-{
- FILE_IOPOSIX *ioposix = NULL;
- ZPOS64_T ret = -1;
- if (stream == NULL)
- return ret;
- ioposix = (FILE_IOPOSIX*)stream;
- ret = FTELLO_FUNC(ioposix->file);
- return ret;
-}
-
-static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin)
-{
- FILE_IOPOSIX *ioposix = NULL;
- int fseek_origin = 0;
- long ret = 0;
-
- if (stream == NULL)
- return -1;
- ioposix = (FILE_IOPOSIX*)stream;
-
- switch (origin)
- {
- case ZLIB_FILEFUNC_SEEK_CUR:
- fseek_origin = SEEK_CUR;
- break;
- case ZLIB_FILEFUNC_SEEK_END:
- fseek_origin = SEEK_END;
- break;
- case ZLIB_FILEFUNC_SEEK_SET:
- fseek_origin = SEEK_SET;
- break;
- default:
- return -1;
- }
- if (fseek(ioposix->file, offset, fseek_origin) != 0)
- ret = -1;
- return ret;
-}
-
-static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)
-{
- FILE_IOPOSIX *ioposix = NULL;
- int fseek_origin = 0;
- long ret = 0;
-
- if (stream == NULL)
- return -1;
- ioposix = (FILE_IOPOSIX*)stream;
-
- switch (origin)
- {
- case ZLIB_FILEFUNC_SEEK_CUR:
- fseek_origin = SEEK_CUR;
- break;
- case ZLIB_FILEFUNC_SEEK_END:
- fseek_origin = SEEK_END;
- break;
- case ZLIB_FILEFUNC_SEEK_SET:
- fseek_origin = SEEK_SET;
- break;
- default:
- return -1;
- }
-
- if(FSEEKO_FUNC(ioposix->file, offset, fseek_origin) != 0)
- ret = -1;
-
- return ret;
-}
-
-
-static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
-{
- FILE_IOPOSIX *ioposix = NULL;
- int ret = -1;
- if (stream == NULL)
- return ret;
- ioposix = (FILE_IOPOSIX*)stream;
- if (ioposix->filename != NULL)
- free(ioposix->filename);
- ret = fclose(ioposix->file);
- free(ioposix);
- return ret;
-}
-
-static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
-{
- FILE_IOPOSIX *ioposix = NULL;
- int ret = -1;
- if (stream == NULL)
- return ret;
- ioposix = (FILE_IOPOSIX*)stream;
- ret = ferror(ioposix->file);
- return ret;
-}
-
-void fill_fopen_filefunc (zlib_filefunc_def* pzlib_filefunc_def)
-{
- pzlib_filefunc_def->zopen_file = fopen_file_func;
- pzlib_filefunc_def->zopendisk_file = fopendisk_file_func;
- pzlib_filefunc_def->zread_file = fread_file_func;
- pzlib_filefunc_def->zwrite_file = fwrite_file_func;
- pzlib_filefunc_def->ztell_file = ftell_file_func;
- pzlib_filefunc_def->zseek_file = fseek_file_func;
- pzlib_filefunc_def->zclose_file = fclose_file_func;
- pzlib_filefunc_def->zerror_file = ferror_file_func;
- pzlib_filefunc_def->opaque = NULL;
-}
-
-void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def)
-{
- pzlib_filefunc_def->zopen64_file = fopen64_file_func;
- pzlib_filefunc_def->zopendisk64_file = fopendisk64_file_func;
- pzlib_filefunc_def->zread_file = fread_file_func;
- pzlib_filefunc_def->zwrite_file = fwrite_file_func;
- pzlib_filefunc_def->ztell64_file = ftell64_file_func;
- pzlib_filefunc_def->zseek64_file = fseek64_file_func;
- pzlib_filefunc_def->zclose_file = fclose_file_func;
- pzlib_filefunc_def->zerror_file = ferror_file_func;
- pzlib_filefunc_def->opaque = NULL;
-}
diff --git a/ios/CodePush/SSZipArchive/minizip/ioapi.h b/ios/CodePush/SSZipArchive/minizip/ioapi.h
deleted file mode 100644
index 742fae502..000000000
--- a/ios/CodePush/SSZipArchive/minizip/ioapi.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/* ioapi.h -- IO base function header for compress/uncompress .zip
- part of the MiniZip project
-
- Copyright (C) 1998-2010 Gilles Vollant
- http://www.winimage.com/zLibDll/minizip.html
- Modifications for Zip64 support
- Copyright (C) 2009-2010 Mathias Svensson
- http://result42.com
-
- This program is distributed under the terms of the same license as zlib.
- See the accompanying LICENSE file for the full text of the license.
-*/
-
-#ifndef _ZLIBIOAPI64_H
-#define _ZLIBIOAPI64_H
-
-#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
-# ifndef __USE_FILE_OFFSET64
-# define __USE_FILE_OFFSET64
-# endif
-# ifndef __USE_LARGEFILE64
-# define __USE_LARGEFILE64
-# endif
-# ifndef _LARGEFILE64_SOURCE
-# define _LARGEFILE64_SOURCE
-# endif
-# ifndef _FILE_OFFSET_BIT
-# define _FILE_OFFSET_BIT 64
-# endif
-#endif
-
-#include
-#include
-#include "zlib.h"
-
-#if defined(USE_FILE32API)
-# define fopen64 fopen
-# define ftello64 ftell
-# define fseeko64 fseek
-#else
-# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
-# define fopen64 fopen
-# define ftello64 ftello
-# define fseeko64 fseeko
-# endif
-# ifdef _MSC_VER
-# define fopen64 fopen
-# if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC)))
-# define ftello64 _ftelli64
-# define fseeko64 _fseeki64
-# else /* old MSC */
-# define ftello64 ftell
-# define fseeko64 fseek
-# endif
-# endif
-#endif
-
-/* a type choosen by DEFINE */
-#ifdef HAVE_64BIT_INT_CUSTOM
-typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T;
-#else
-# ifdef HAS_STDINT_H
-# include "stdint.h"
- typedef uint64_t ZPOS64_T;
-# else
-# if defined(_MSC_VER) || defined(__BORLANDC__)
- typedef unsigned __int64 ZPOS64_T;
-# else
- typedef unsigned long long int ZPOS64_T;
-# endif
-# endif
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define ZLIB_FILEFUNC_SEEK_CUR (1)
-#define ZLIB_FILEFUNC_SEEK_END (2)
-#define ZLIB_FILEFUNC_SEEK_SET (0)
-
-#define ZLIB_FILEFUNC_MODE_READ (1)
-#define ZLIB_FILEFUNC_MODE_WRITE (2)
-#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
-#define ZLIB_FILEFUNC_MODE_EXISTING (4)
-#define ZLIB_FILEFUNC_MODE_CREATE (8)
-
-#ifndef ZCALLBACK
-# if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || \
- defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
-# define ZCALLBACK CALLBACK
-# else
-# define ZCALLBACK
-# endif
-#endif
-
-typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
-typedef voidpf (ZCALLBACK *opendisk_file_func) OF((voidpf opaque, voidpf stream, int number_disk, int mode));
-typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
-typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
-typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
-typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
-
-typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
-typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
-
-/* here is the "old" 32 bits structure structure */
-typedef struct zlib_filefunc_def_s
-{
- open_file_func zopen_file;
- opendisk_file_func zopendisk_file;
- read_file_func zread_file;
- write_file_func zwrite_file;
- tell_file_func ztell_file;
- seek_file_func zseek_file;
- close_file_func zclose_file;
- testerror_file_func zerror_file;
- voidpf opaque;
-} zlib_filefunc_def;
-
-typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream));
-typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
-typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode));
-typedef voidpf (ZCALLBACK *opendisk64_file_func)OF((voidpf opaque, voidpf stream, int number_disk, int mode));
-
-typedef struct zlib_filefunc64_def_s
-{
- open64_file_func zopen64_file;
- opendisk64_file_func zopendisk64_file;
- read_file_func zread_file;
- write_file_func zwrite_file;
- tell64_file_func ztell64_file;
- seek64_file_func zseek64_file;
- close_file_func zclose_file;
- testerror_file_func zerror_file;
- voidpf opaque;
-} zlib_filefunc64_def;
-
-void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
-void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def));
-
-/* now internal definition, only for zip.c and unzip.h */
-typedef struct zlib_filefunc64_32_def_s
-{
- zlib_filefunc64_def zfile_func64;
- open_file_func zopen32_file;
- opendisk_file_func zopendisk32_file;
- tell_file_func ztell32_file;
- seek_file_func zseek32_file;
-} zlib_filefunc64_32_def;
-
-#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size))
-#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size))
-/*#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream))*/
-/*#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode))*/
-#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream))
-#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream))
-
-voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode));
-voidpf call_zopendisk64 OF((const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, int number_disk, int mode));
-long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin));
-ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream));
-
-void fill_zlib_filefunc64_32_def_from_filefunc32 OF((zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32));
-
-#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode)))
-#define ZOPENDISK64(filefunc,filestream,diskn,mode) (call_zopendisk64((&(filefunc)),(filestream),(diskn),(mode)))
-#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream)))
-#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode)))
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz.h b/ios/CodePush/SSZipArchive/minizip/mz.h
new file mode 100644
index 000000000..a085f24e7
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz.h
@@ -0,0 +1,273 @@
+/* mz.h -- Errors codes, zip flags and magic
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_H
+#define MZ_H
+
+/***************************************************************************/
+
+/* MZ_VERSION */
+#define MZ_VERSION ("3.0.9")
+#define MZ_VERSION_BUILD (030009)
+
+/* MZ_ERROR */
+#define MZ_OK (0) /* zlib */
+#define MZ_STREAM_ERROR (-1) /* zlib */
+#define MZ_DATA_ERROR (-3) /* zlib */
+#define MZ_MEM_ERROR (-4) /* zlib */
+#define MZ_BUF_ERROR (-5) /* zlib */
+#define MZ_VERSION_ERROR (-6) /* zlib */
+
+#define MZ_END_OF_LIST (-100)
+#define MZ_END_OF_STREAM (-101)
+
+#define MZ_PARAM_ERROR (-102)
+#define MZ_FORMAT_ERROR (-103)
+#define MZ_INTERNAL_ERROR (-104)
+#define MZ_CRC_ERROR (-105)
+#define MZ_CRYPT_ERROR (-106)
+#define MZ_EXIST_ERROR (-107)
+#define MZ_PASSWORD_ERROR (-108)
+#define MZ_SUPPORT_ERROR (-109)
+#define MZ_HASH_ERROR (-110)
+#define MZ_OPEN_ERROR (-111)
+#define MZ_CLOSE_ERROR (-112)
+#define MZ_SEEK_ERROR (-113)
+#define MZ_TELL_ERROR (-114)
+#define MZ_READ_ERROR (-115)
+#define MZ_WRITE_ERROR (-116)
+#define MZ_SIGN_ERROR (-117)
+#define MZ_SYMLINK_ERROR (-118)
+
+/* MZ_OPEN */
+#define MZ_OPEN_MODE_READ (0x01)
+#define MZ_OPEN_MODE_WRITE (0x02)
+#define MZ_OPEN_MODE_READWRITE (MZ_OPEN_MODE_READ | MZ_OPEN_MODE_WRITE)
+#define MZ_OPEN_MODE_APPEND (0x04)
+#define MZ_OPEN_MODE_CREATE (0x08)
+#define MZ_OPEN_MODE_EXISTING (0x10)
+
+/* MZ_SEEK */
+#define MZ_SEEK_SET (0)
+#define MZ_SEEK_CUR (1)
+#define MZ_SEEK_END (2)
+
+/* MZ_COMPRESS */
+#define MZ_COMPRESS_METHOD_STORE (0)
+#define MZ_COMPRESS_METHOD_DEFLATE (8)
+#define MZ_COMPRESS_METHOD_BZIP2 (12)
+#define MZ_COMPRESS_METHOD_LZMA (14)
+#define MZ_COMPRESS_METHOD_ZSTD (93)
+#define MZ_COMPRESS_METHOD_XZ (95)
+#define MZ_COMPRESS_METHOD_AES (99)
+
+#define MZ_COMPRESS_LEVEL_DEFAULT (-1)
+#define MZ_COMPRESS_LEVEL_FAST (2)
+#define MZ_COMPRESS_LEVEL_NORMAL (6)
+#define MZ_COMPRESS_LEVEL_BEST (9)
+
+/* MZ_ZIP_FLAG */
+#define MZ_ZIP_FLAG_ENCRYPTED (1 << 0)
+#define MZ_ZIP_FLAG_LZMA_EOS_MARKER (1 << 1)
+#define MZ_ZIP_FLAG_DEFLATE_MAX (1 << 1)
+#define MZ_ZIP_FLAG_DEFLATE_NORMAL (0)
+#define MZ_ZIP_FLAG_DEFLATE_FAST (1 << 2)
+#define MZ_ZIP_FLAG_DEFLATE_SUPER_FAST (MZ_ZIP_FLAG_DEFLATE_FAST | \
+ MZ_ZIP_FLAG_DEFLATE_MAX)
+#define MZ_ZIP_FLAG_DATA_DESCRIPTOR (1 << 3)
+#define MZ_ZIP_FLAG_UTF8 (1 << 11)
+#define MZ_ZIP_FLAG_MASK_LOCAL_INFO (1 << 13)
+
+/* MZ_ZIP_EXTENSION */
+#define MZ_ZIP_EXTENSION_ZIP64 (0x0001)
+#define MZ_ZIP_EXTENSION_NTFS (0x000a)
+#define MZ_ZIP_EXTENSION_AES (0x9901)
+#define MZ_ZIP_EXTENSION_UNIX1 (0x000d)
+#define MZ_ZIP_EXTENSION_SIGN (0x10c5)
+#define MZ_ZIP_EXTENSION_HASH (0x1a51)
+#define MZ_ZIP_EXTENSION_CDCD (0xcdcd)
+
+/* MZ_ZIP64 */
+#define MZ_ZIP64_AUTO (0)
+#define MZ_ZIP64_FORCE (1)
+#define MZ_ZIP64_DISABLE (2)
+
+/* MZ_HOST_SYSTEM */
+#define MZ_HOST_SYSTEM(VERSION_MADEBY) ((uint8_t)(VERSION_MADEBY >> 8))
+#define MZ_HOST_SYSTEM_MSDOS (0)
+#define MZ_HOST_SYSTEM_UNIX (3)
+#define MZ_HOST_SYSTEM_WINDOWS_NTFS (10)
+#define MZ_HOST_SYSTEM_RISCOS (13)
+#define MZ_HOST_SYSTEM_OSX_DARWIN (19)
+
+/* MZ_PKCRYPT */
+#define MZ_PKCRYPT_HEADER_SIZE (12)
+
+/* MZ_AES */
+#define MZ_AES_VERSION (1)
+#define MZ_AES_ENCRYPTION_MODE_128 (0x01)
+#define MZ_AES_ENCRYPTION_MODE_192 (0x02)
+#define MZ_AES_ENCRYPTION_MODE_256 (0x03)
+#define MZ_AES_KEY_LENGTH(MODE) (8 * (MODE & 3) + 8)
+#define MZ_AES_KEY_LENGTH_MAX (32)
+#define MZ_AES_BLOCK_SIZE (16)
+#define MZ_AES_HEADER_SIZE(MODE) ((4 * (MODE & 3) + 4) + 2)
+#define MZ_AES_FOOTER_SIZE (10)
+
+/* MZ_HASH */
+#define MZ_HASH_MD5 (10)
+#define MZ_HASH_MD5_SIZE (16)
+#define MZ_HASH_SHA1 (20)
+#define MZ_HASH_SHA1_SIZE (20)
+#define MZ_HASH_SHA224 (22)
+#define MZ_HASH_SHA224_SIZE (28)
+#define MZ_HASH_SHA256 (23)
+#define MZ_HASH_SHA256_SIZE (32)
+#define MZ_HASH_SHA384 (24)
+#define MZ_HASH_SHA384_SIZE (48)
+#define MZ_HASH_SHA512 (25)
+#define MZ_HASH_SHA512_SIZE (64)
+#define MZ_HASH_MAX_SIZE (256)
+
+/* MZ_ENCODING */
+#define MZ_ENCODING_CODEPAGE_437 (437)
+#define MZ_ENCODING_CODEPAGE_932 (932)
+#define MZ_ENCODING_CODEPAGE_936 (936)
+#define MZ_ENCODING_CODEPAGE_950 (950)
+#define MZ_ENCODING_UTF8 (65001)
+
+/* MZ_UTILITY */
+#define MZ_UNUSED(SYMBOL) ((void)SYMBOL)
+
+#if defined(_WIN32) && defined(MZ_EXPORTS)
+#define MZ_EXPORT __declspec(dllexport)
+#else
+#define MZ_EXPORT
+#endif
+
+/***************************************************************************/
+
+#include /* size_t, NULL, malloc */
+#include /* time_t, time() */
+#include /* memset, strncpy, strlen */
+#include
+
+#if defined(HAVE_STDINT_H)
+# include
+#elif defined(__has_include)
+# if __has_include()
+# include
+# endif
+#endif
+
+#ifndef INT8_MAX
+typedef signed char int8_t;
+#endif
+#ifndef INT16_MAX
+typedef short int16_t;
+#endif
+#ifndef INT32_MAX
+typedef int int32_t;
+#endif
+#ifndef INT64_MAX
+typedef long long int64_t;
+#endif
+#ifndef UINT8_MAX
+typedef unsigned char uint8_t;
+#endif
+#ifndef UINT16_MAX
+typedef unsigned short uint16_t;
+#endif
+#ifndef UINT32_MAX
+typedef unsigned int uint32_t;
+#endif
+#ifndef UINT64_MAX
+typedef unsigned long long uint64_t;
+#endif
+
+#if defined(HAVE_INTTYPES_H)
+# include
+#elif defined(__has_include)
+# if __has_include()
+# include
+# endif
+#endif
+
+#ifndef PRId8
+# define PRId8 "hhd"
+#endif
+#ifndef PRIu8
+# define PRIu8 "hhu"
+#endif
+#ifndef PRIx8
+# define PRIx8 "hhx"
+#endif
+#ifndef PRId16
+# define PRId16 "hd"
+#endif
+#ifndef PRIu16
+# define PRIu16 "hu"
+#endif
+#ifndef PRIx16
+# define PRIx16 "hx"
+#endif
+#ifndef PRId32
+# define PRId32 "d"
+#endif
+#ifndef PRIu32
+# define PRIu32 "u"
+#endif
+#ifndef PRIx32
+# define PRIx32 "x"
+#endif
+#if ULONG_MAX == 0xfffffffful
+# ifndef PRId64
+# define PRId64 "ld"
+# endif
+# ifndef PRIu64
+# define PRIu64 "lu"
+# endif
+# ifndef PRIx64
+# define PRIx64 "lx"
+# endif
+#else
+# ifndef PRId64
+# define PRId64 "lld"
+# endif
+# ifndef PRIu64
+# define PRIu64 "llu"
+# endif
+# ifndef PRIx64
+# define PRIx64 "llx"
+# endif
+#endif
+
+#ifndef INT16_MAX
+# define INT16_MAX 32767
+#endif
+#ifndef INT32_MAX
+# define INT32_MAX 2147483647L
+#endif
+#ifndef INT64_MAX
+# define INT64_MAX 9223372036854775807LL
+#endif
+#ifndef UINT16_MAX
+# define UINT16_MAX 65535U
+#endif
+#ifndef UINT32_MAX
+# define UINT32_MAX 4294967295UL
+#endif
+#ifndef UINT64_MAX
+# define UINT64_MAX 18446744073709551615ULL
+#endif
+
+/***************************************************************************/
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_compat.c b/ios/CodePush/SSZipArchive/minizip/mz_compat.c
new file mode 100644
index 000000000..9f251d576
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_compat.c
@@ -0,0 +1,1306 @@
+/* mz_compat.c -- Backwards compatible interface for older versions
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+ Copyright (C) 1998-2010 Gilles Vollant
+ https://www.winimage.com/zLibDll/minizip.html
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+
+ WARNING: Be very careful updating/overwriting this file.
+ It has specific changes for SSZipArchive support with some structs moved to SSZipCommon for public access
+*/
+
+#include "mz.h"
+#include "mz_os.h"
+#include "mz_strm.h"
+#include "mz_strm_mem.h"
+#include "mz_strm_os.h"
+#include "mz_strm_zlib.h"
+#include "mz_zip.h"
+
+#include /* SEEK */
+
+#include "mz_compat.h"
+
+/***************************************************************************/
+
+typedef struct mz_compat_s {
+ void *stream;
+ void *handle;
+ uint64_t entry_index;
+ int64_t entry_pos;
+ int64_t total_out;
+} mz_compat;
+
+/***************************************************************************/
+
+typedef struct mz_stream_ioapi_s {
+ mz_stream stream;
+ void *handle;
+ zlib_filefunc_def filefunc;
+ zlib_filefunc64_def filefunc64;
+} mz_stream_ioapi;
+
+/***************************************************************************/
+
+static int32_t mz_stream_ioapi_open(void *stream, const char *path, int32_t mode);
+static int32_t mz_stream_ioapi_is_open(void *stream);
+static int32_t mz_stream_ioapi_read(void *stream, void *buf, int32_t size);
+static int32_t mz_stream_ioapi_write(void *stream, const void *buf, int32_t size);
+static int64_t mz_stream_ioapi_tell(void *stream);
+static int32_t mz_stream_ioapi_seek(void *stream, int64_t offset, int32_t origin);
+static int32_t mz_stream_ioapi_close(void *stream);
+static int32_t mz_stream_ioapi_error(void *stream);
+static void *mz_stream_ioapi_create(void **stream);
+static void mz_stream_ioapi_delete(void **stream);
+
+/***************************************************************************/
+
+static mz_stream_vtbl mz_stream_ioapi_vtbl = {
+ mz_stream_ioapi_open,
+ mz_stream_ioapi_is_open,
+ mz_stream_ioapi_read,
+ mz_stream_ioapi_write,
+ mz_stream_ioapi_tell,
+ mz_stream_ioapi_seek,
+ mz_stream_ioapi_close,
+ mz_stream_ioapi_error,
+ mz_stream_ioapi_create,
+ mz_stream_ioapi_delete,
+ NULL,
+ NULL
+};
+
+/***************************************************************************/
+
+static int32_t mz_stream_ioapi_open(void *stream, const char *path, int32_t mode) {
+ mz_stream_ioapi *ioapi = (mz_stream_ioapi *)stream;
+ int32_t ioapi_mode = 0;
+
+ if ((mode & MZ_OPEN_MODE_READWRITE) == MZ_OPEN_MODE_READ)
+ ioapi_mode = ZLIB_FILEFUNC_MODE_READ;
+ else if (mode & MZ_OPEN_MODE_APPEND)
+ ioapi_mode = ZLIB_FILEFUNC_MODE_EXISTING;
+ else if (mode & MZ_OPEN_MODE_CREATE)
+ ioapi_mode = ZLIB_FILEFUNC_MODE_CREATE;
+ else
+ return MZ_OPEN_ERROR;
+
+ if (ioapi->filefunc64.zopen64_file)
+ ioapi->handle = ioapi->filefunc64.zopen64_file(ioapi->filefunc64.opaque, path, ioapi_mode);
+ else if (ioapi->filefunc.zopen_file)
+ ioapi->handle = ioapi->filefunc.zopen_file(ioapi->filefunc.opaque, path, ioapi_mode);
+
+ if (!ioapi->handle)
+ return MZ_PARAM_ERROR;
+
+ return MZ_OK;
+}
+
+static int32_t mz_stream_ioapi_is_open(void *stream) {
+ mz_stream_ioapi *ioapi = (mz_stream_ioapi *)stream;
+ if (!ioapi->handle)
+ return MZ_OPEN_ERROR;
+ return MZ_OK;
+}
+
+static int32_t mz_stream_ioapi_read(void *stream, void *buf, int32_t size) {
+ mz_stream_ioapi *ioapi = (mz_stream_ioapi *)stream;
+ read_file_func zread = NULL;
+ void *opaque = NULL;
+
+ if (mz_stream_ioapi_is_open(stream) != MZ_OK)
+ return MZ_OPEN_ERROR;
+
+ if (ioapi->filefunc64.zread_file) {
+ zread = ioapi->filefunc64.zread_file;
+ opaque = ioapi->filefunc64.opaque;
+ } else if (ioapi->filefunc.zread_file) {
+ zread = ioapi->filefunc.zread_file;
+ opaque = ioapi->filefunc.opaque;
+ } else
+ return MZ_PARAM_ERROR;
+
+ return (int32_t)zread(opaque, ioapi->handle, buf, size);
+}
+
+static int32_t mz_stream_ioapi_write(void *stream, const void *buf, int32_t size) {
+ mz_stream_ioapi *ioapi = (mz_stream_ioapi *)stream;
+ write_file_func zwrite = NULL;
+ int32_t written = 0;
+ void *opaque = NULL;
+
+ if (mz_stream_ioapi_is_open(stream) != MZ_OK)
+ return MZ_OPEN_ERROR;
+
+ if (ioapi->filefunc64.zwrite_file) {
+ zwrite = ioapi->filefunc64.zwrite_file;
+ opaque = ioapi->filefunc64.opaque;
+ } else if (ioapi->filefunc.zwrite_file) {
+ zwrite = ioapi->filefunc.zwrite_file;
+ opaque = ioapi->filefunc.opaque;
+ } else
+ return MZ_PARAM_ERROR;
+
+ written = (int32_t)zwrite(opaque, ioapi->handle, buf, size);
+ return written;
+}
+
+static int64_t mz_stream_ioapi_tell(void *stream) {
+ mz_stream_ioapi *ioapi = (mz_stream_ioapi *)stream;
+
+ if (mz_stream_ioapi_is_open(stream) != MZ_OK)
+ return MZ_OPEN_ERROR;
+
+ if (ioapi->filefunc64.ztell64_file)
+ return ioapi->filefunc64.ztell64_file(ioapi->filefunc64.opaque, ioapi->handle);
+ else if (ioapi->filefunc.ztell_file)
+ return ioapi->filefunc.ztell_file(ioapi->filefunc.opaque, ioapi->handle);
+
+ return MZ_INTERNAL_ERROR;
+}
+
+static int32_t mz_stream_ioapi_seek(void *stream, int64_t offset, int32_t origin) {
+ mz_stream_ioapi *ioapi = (mz_stream_ioapi *)stream;
+
+ if (mz_stream_ioapi_is_open(stream) != MZ_OK)
+ return MZ_OPEN_ERROR;
+
+ if (ioapi->filefunc64.zseek64_file) {
+ if (ioapi->filefunc64.zseek64_file(ioapi->filefunc64.opaque, ioapi->handle, offset, origin) != 0)
+ return MZ_INTERNAL_ERROR;
+ } else if (ioapi->filefunc.zseek_file) {
+ if (ioapi->filefunc.zseek_file(ioapi->filefunc.opaque, ioapi->handle, (int32_t)offset, origin) != 0)
+ return MZ_INTERNAL_ERROR;
+ } else
+ return MZ_PARAM_ERROR;
+
+ return MZ_OK;
+}
+
+static int32_t mz_stream_ioapi_close(void *stream) {
+ mz_stream_ioapi *ioapi = (mz_stream_ioapi *)stream;
+ close_file_func zclose = NULL;
+ void *opaque = NULL;
+
+ if (mz_stream_ioapi_is_open(stream) != MZ_OK)
+ return MZ_OPEN_ERROR;
+
+ if (ioapi->filefunc.zclose_file) {
+ zclose = ioapi->filefunc.zclose_file;
+ opaque = ioapi->filefunc.opaque;
+ } else if (ioapi->filefunc64.zclose_file) {
+ zclose = ioapi->filefunc64.zclose_file;
+ opaque = ioapi->filefunc64.opaque;
+ } else
+ return MZ_PARAM_ERROR;
+
+ if (zclose(opaque, ioapi->handle) != 0)
+ return MZ_CLOSE_ERROR;
+ ioapi->handle = NULL;
+ return MZ_OK;
+}
+
+static int32_t mz_stream_ioapi_error(void *stream) {
+ mz_stream_ioapi *ioapi = (mz_stream_ioapi *)stream;
+ testerror_file_func zerror = NULL;
+ void *opaque = NULL;
+
+ if (mz_stream_ioapi_is_open(stream) != MZ_OK)
+ return MZ_OPEN_ERROR;
+
+ if (ioapi->filefunc.zerror_file) {
+ zerror = ioapi->filefunc.zerror_file;
+ opaque = ioapi->filefunc.opaque;
+ } else if (ioapi->filefunc64.zerror_file) {
+ zerror = ioapi->filefunc64.zerror_file;
+ opaque = ioapi->filefunc64.opaque;
+ } else
+ return MZ_PARAM_ERROR;
+
+ return zerror(opaque, ioapi->handle);
+}
+
+static int32_t mz_stream_ioapi_set_filefunc(void *stream, zlib_filefunc_def *filefunc) {
+ mz_stream_ioapi *ioapi = (mz_stream_ioapi *)stream;
+ memcpy(&ioapi->filefunc, filefunc, sizeof(zlib_filefunc_def));
+ return MZ_OK;
+}
+
+static int32_t mz_stream_ioapi_set_filefunc64(void *stream, zlib_filefunc64_def *filefunc) {
+ mz_stream_ioapi *ioapi = (mz_stream_ioapi *)stream;
+ memcpy(&ioapi->filefunc64, filefunc, sizeof(zlib_filefunc64_def));
+ return MZ_OK;
+}
+
+static void *mz_stream_ioapi_create(void **stream) {
+ mz_stream_ioapi *ioapi = NULL;
+
+ ioapi = (mz_stream_ioapi *)calloc(1, sizeof(mz_stream_ioapi));
+ if (ioapi)
+ ioapi->stream.vtbl = &mz_stream_ioapi_vtbl;
+ if (stream)
+ *stream = ioapi;
+
+ return ioapi;
+}
+
+static void mz_stream_ioapi_delete(void **stream) {
+ mz_stream_ioapi *ioapi = NULL;
+ if (!stream)
+ return;
+ ioapi = (mz_stream_ioapi *)*stream;
+ if (ioapi)
+ free(ioapi);
+ *stream = NULL;
+}
+
+/***************************************************************************/
+
+void fill_fopen_filefunc(zlib_filefunc_def *pzlib_filefunc_def) {
+ /* For 32-bit file support only, compile with MZ_FILE32_API */
+ if (pzlib_filefunc_def)
+ memset(pzlib_filefunc_def, 0, sizeof(zlib_filefunc_def));
+}
+
+void fill_fopen64_filefunc(zlib_filefunc64_def *pzlib_filefunc_def) {
+ /* All mz_stream_os_* support large files if compilation supports it */
+ if (pzlib_filefunc_def)
+ memset(pzlib_filefunc_def, 0, sizeof(zlib_filefunc64_def));
+}
+
+void fill_win32_filefunc(zlib_filefunc_def *pzlib_filefunc_def) {
+ /* Handled by mz_stream_os_win32 */
+ if (pzlib_filefunc_def)
+ memset(pzlib_filefunc_def, 0, sizeof(zlib_filefunc_def));
+}
+
+void fill_win32_filefunc64(zlib_filefunc64_def *pzlib_filefunc_def) {
+ /* Automatically supported in mz_stream_os_win32 */
+ if (pzlib_filefunc_def)
+ memset(pzlib_filefunc_def, 0, sizeof(zlib_filefunc64_def));
+}
+
+void fill_win32_filefunc64A(zlib_filefunc64_def *pzlib_filefunc_def) {
+ /* Automatically supported in mz_stream_os_win32 */
+ if (pzlib_filefunc_def)
+ memset(pzlib_filefunc_def, 0, sizeof(zlib_filefunc64_def));
+}
+
+/* NOTE: fill_win32_filefunc64W is no longer necessary since wide-character
+ support is automatically handled by the underlying os stream. Do not
+ pass wide-characters to zipOpen or unzOpen. */
+
+void fill_memory_filefunc(zlib_filefunc_def *pzlib_filefunc_def) {
+ /* Use opaque to indicate which stream interface to create */
+ if (pzlib_filefunc_def) {
+ memset(pzlib_filefunc_def, 0, sizeof(zlib_filefunc_def));
+ pzlib_filefunc_def->opaque = mz_stream_mem_get_interface();
+ }
+}
+
+/***************************************************************************/
+
+static int32_t zipConvertAppendToStreamMode(int append) {
+ int32_t mode = MZ_OPEN_MODE_WRITE;
+ switch (append) {
+ case APPEND_STATUS_CREATE:
+ mode |= MZ_OPEN_MODE_CREATE;
+ break;
+ case APPEND_STATUS_CREATEAFTER:
+ mode |= MZ_OPEN_MODE_CREATE | MZ_OPEN_MODE_APPEND;
+ break;
+ case APPEND_STATUS_ADDINZIP:
+ mode |= MZ_OPEN_MODE_READ | MZ_OPEN_MODE_APPEND;
+ break;
+ }
+ return mode;
+}
+
+zipFile zipOpen(const char *path, int append) {
+ return zipOpen2(path, append, NULL, NULL);
+}
+
+zipFile zipOpen64(const void *path, int append) {
+ return zipOpen2(path, append, NULL, NULL);
+}
+
+zipFile zipOpen2(const char *path, int append, const char **globalcomment,
+ zlib_filefunc_def *pzlib_filefunc_def) {
+ zipFile zip = NULL;
+ int32_t mode = zipConvertAppendToStreamMode(append);
+ void *stream = NULL;
+
+ if (pzlib_filefunc_def) {
+ if (pzlib_filefunc_def->zopen_file) {
+ if (!mz_stream_ioapi_create(&stream))
+ return NULL;
+ mz_stream_ioapi_set_filefunc(stream, pzlib_filefunc_def);
+ } else if (pzlib_filefunc_def->opaque) {
+ if (!mz_stream_create(&stream, (mz_stream_vtbl *)pzlib_filefunc_def->opaque))
+ return NULL;
+ }
+ }
+
+ if (!stream) {
+ if (!mz_stream_os_create(&stream))
+ return NULL;
+ }
+
+ if (mz_stream_open(stream, path, mode) != MZ_OK) {
+ mz_stream_delete(&stream);
+ return NULL;
+ }
+
+ zip = zipOpen_MZ(stream, append, globalcomment);
+
+ if (!zip) {
+ mz_stream_delete(&stream);
+ return NULL;
+ }
+
+ return zip;
+}
+
+zipFile zipOpen2_64(const void *path, int append, const char **globalcomment,
+ zlib_filefunc64_def *pzlib_filefunc_def) {
+ zipFile zip = NULL;
+ int32_t mode = zipConvertAppendToStreamMode(append);
+ void *stream = NULL;
+
+ if (pzlib_filefunc_def) {
+ if (pzlib_filefunc_def->zopen64_file) {
+ if (!mz_stream_ioapi_create(&stream))
+ return NULL;
+ mz_stream_ioapi_set_filefunc64(stream, pzlib_filefunc_def);
+ } else if (pzlib_filefunc_def->opaque) {
+ if (!mz_stream_create(&stream, (mz_stream_vtbl *)pzlib_filefunc_def->opaque))
+ return NULL;
+ }
+ }
+
+ if (!stream) {
+ if (!mz_stream_os_create(&stream))
+ return NULL;
+ }
+
+ if (mz_stream_open(stream, path, mode) != MZ_OK) {
+ mz_stream_delete(&stream);
+ return NULL;
+ }
+
+ zip = zipOpen_MZ(stream, append, globalcomment);
+
+ if (!zip) {
+ mz_stream_delete(&stream);
+ return NULL;
+ }
+
+ return zip;
+}
+
+zipFile zipOpen_MZ(void *stream, int append, const char **globalcomment) {
+ mz_compat *compat = NULL;
+ int32_t err = MZ_OK;
+ int32_t mode = zipConvertAppendToStreamMode(append);
+ void *handle = NULL;
+
+ mz_zip_create(&handle);
+ err = mz_zip_open(handle, stream, mode);
+
+ if (err != MZ_OK) {
+ mz_zip_delete(&handle);
+ return NULL;
+ }
+
+ if (globalcomment)
+ mz_zip_get_comment(handle, globalcomment);
+
+ compat = (mz_compat *)calloc(1, sizeof(mz_compat));
+ if (compat) {
+ compat->handle = handle;
+ compat->stream = stream;
+ } else {
+ mz_zip_delete(&handle);
+ }
+
+ return (zipFile)compat;
+}
+
+void* zipGetHandle_MZ(zipFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ if (!compat)
+ return NULL;
+ return compat->handle;
+}
+
+void* zipGetStream_MZ(zipFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ if (!compat)
+ return NULL;
+ return (void *)compat->stream;
+}
+
+int zipOpenNewFileInZip5(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int windowBits, int memLevel, int strategy, const char *password,
+ unsigned long crc_for_crypting, signed char aes, unsigned long version_madeby, unsigned long flag_base, int zip64) {
+ mz_compat *compat = (mz_compat *)file;
+ mz_zip_file file_info;
+
+ MZ_UNUSED(strategy);
+ MZ_UNUSED(memLevel);
+ MZ_UNUSED(windowBits);
+ MZ_UNUSED(size_extrafield_local);
+ MZ_UNUSED(extrafield_local);
+ MZ_UNUSED(crc_for_crypting);
+
+ if (!compat)
+ return ZIP_PARAMERROR;
+
+ memset(&file_info, 0, sizeof(file_info));
+
+ if (zipfi) {
+ uint64_t dos_date = 0;
+
+ if (zipfi->mz_dos_date != 0)
+ dos_date = zipfi->mz_dos_date;
+ else
+ dos_date = mz_zip_tm_to_dosdate(&zipfi->tmz_date);
+
+ file_info.modified_date = mz_zip_dosdate_to_time_t(dos_date);
+ file_info.external_fa = zipfi->external_fa;
+ file_info.internal_fa = zipfi->internal_fa;
+ }
+
+ if (!filename)
+ filename = "-";
+
+ file_info.compression_method = (uint16_t)compression_method;
+ file_info.filename = filename;
+ /* file_info.extrafield_local = extrafield_local; */
+ /* file_info.extrafield_local_size = size_extrafield_local; */
+ file_info.extrafield = extrafield_global;
+ file_info.extrafield_size = size_extrafield_global;
+ file_info.version_madeby = (uint16_t)version_madeby;
+ file_info.comment = comment;
+ if (file_info.comment)
+ file_info.comment_size = (uint16_t)strlen(file_info.comment);
+ file_info.flag = (uint16_t)flag_base;
+ if (zip64)
+ file_info.zip64 = MZ_ZIP64_FORCE;
+ else
+ file_info.zip64 = MZ_ZIP64_DISABLE;
+#ifdef HAVE_WZAES
+ if ((aes && password) || (raw && (file_info.flag & MZ_ZIP_FLAG_ENCRYPTED)))
+ file_info.aes_version = MZ_AES_VERSION;
+#endif
+
+ return mz_zip_entry_write_open(compat->handle, &file_info, (int16_t)level, (uint8_t)raw, password);
+}
+
+int zipOpenNewFileInZip4_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int windowBits, int memLevel, int strategy, const char *password,
+ unsigned long crc_for_crypting, unsigned long version_madeby, unsigned long flag_base, int zip64) {
+ return zipOpenNewFileInZip5(file, filename, zipfi, extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global, comment, compression_method, level, raw, windowBits,
+ memLevel, strategy, password, crc_for_crypting, 0, version_madeby, flag_base, zip64);
+}
+
+int zipOpenNewFileInZip4(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int windowBits, int memLevel, int strategy, const char *password,
+ unsigned long crc_for_crypting, unsigned long version_madeby, unsigned long flag_base) {
+ return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global, comment, compression_method, level, raw, windowBits,
+ memLevel, strategy, password, crc_for_crypting, version_madeby, flag_base, 0);
+}
+
+int zipOpenNewFileInZip3(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int windowBits, int memLevel, int strategy, const char *password,
+ unsigned long crc_for_crypting) {
+ return zipOpenNewFileInZip3_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global, comment, compression_method, level, raw, windowBits,
+ memLevel, strategy, password, crc_for_crypting, 0);
+}
+
+int zipOpenNewFileInZip3_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int windowBits, int memLevel, int strategy, const char *password,
+ unsigned long crc_for_crypting, int zip64) {
+ return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global, comment, compression_method, level, raw, windowBits,
+ memLevel, strategy, password, crc_for_crypting, MZ_VERSION_MADEBY, 0, zip64);
+}
+
+int zipOpenNewFileInZip2(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw) {
+ return zipOpenNewFileInZip3_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global, comment, compression_method, level, raw,
+ 0, 0, 0, NULL, 0, 0);
+}
+
+int zipOpenNewFileInZip2_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int zip64) {
+ return zipOpenNewFileInZip3_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global, comment, compression_method, level, raw, 0,
+ 0, 0, NULL, 0, zip64);
+}
+
+int zipOpenNewFileInZip(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level) {
+ return zipOpenNewFileInZip_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global, comment, compression_method, level, 0);
+}
+
+int zipOpenNewFileInZip_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int zip64) {
+ return zipOpenNewFileInZip2_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global, comment, compression_method, level, 0, zip64);
+}
+
+int zipWriteInFileInZip(zipFile file, const void *buf, uint32_t len) {
+ mz_compat *compat = (mz_compat *)file;
+ int32_t written = 0;
+ if (!compat || len >= INT32_MAX)
+ return ZIP_PARAMERROR;
+ written = mz_zip_entry_write(compat->handle, buf, (int32_t)len);
+ if ((written < 0) || ((uint32_t)written != len))
+ return ZIP_ERRNO;
+ return ZIP_OK;
+}
+
+int zipCloseFileInZipRaw(zipFile file, unsigned long uncompressed_size, uint32_t crc32) {
+ return zipCloseFileInZipRaw64(file, uncompressed_size, crc32);
+}
+
+int zipCloseFileInZipRaw64(zipFile file, uint64_t uncompressed_size, uint32_t crc32) {
+ mz_compat *compat = (mz_compat *)file;
+ if (!compat)
+ return ZIP_PARAMERROR;
+ return mz_zip_entry_close_raw(compat->handle, (int64_t)uncompressed_size, crc32);
+}
+
+int zipCloseFileInZip(zipFile file) {
+ return zipCloseFileInZip64(file);
+}
+
+int zipCloseFileInZip64(zipFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ if (!compat)
+ return ZIP_PARAMERROR;
+ return mz_zip_entry_close(compat->handle);
+}
+
+int zipClose(zipFile file, const char *global_comment) {
+ return zipClose_64(file, global_comment);
+}
+
+int zipClose_64(zipFile file, const char *global_comment) {
+ return zipClose2_64(file, global_comment, MZ_VERSION_MADEBY);
+}
+
+int zipClose2_64(zipFile file, const char *global_comment, uint16_t version_madeby) {
+ mz_compat *compat = (mz_compat *)file;
+ int32_t err = MZ_OK;
+
+ if (compat->handle)
+ err = zipClose2_MZ(file, global_comment, version_madeby);
+
+ if (compat->stream) {
+ mz_stream_close(compat->stream);
+ mz_stream_delete(&compat->stream);
+ }
+
+ free(compat);
+
+ return err;
+}
+
+/* Only closes the zip handle, does not close the stream */
+int zipClose_MZ(zipFile file, const char *global_comment) {
+ return zipClose2_MZ(file, global_comment, MZ_VERSION_MADEBY);
+}
+
+/* Only closes the zip handle, does not close the stream */
+int zipClose2_MZ(zipFile file, const char *global_comment, uint16_t version_madeby) {
+ mz_compat *compat = (mz_compat *)file;
+ int32_t err = MZ_OK;
+
+ if (!compat)
+ return ZIP_PARAMERROR;
+ if (!compat->handle)
+ return err;
+
+ if (global_comment)
+ mz_zip_set_comment(compat->handle, global_comment);
+
+ mz_zip_set_version_madeby(compat->handle, version_madeby);
+ err = mz_zip_close(compat->handle);
+ mz_zip_delete(&compat->handle);
+
+ return err;
+}
+
+/***************************************************************************/
+
+unzFile unzOpen(const char *path) {
+ return unzOpen64(path);
+}
+
+unzFile unzOpen64(const void *path) {
+ return unzOpen2(path, NULL);
+}
+
+unzFile unzOpen2(const char *path, zlib_filefunc_def *pzlib_filefunc_def) {
+ unzFile unz = NULL;
+ void *stream = NULL;
+
+ if (pzlib_filefunc_def) {
+ if (pzlib_filefunc_def->zopen_file) {
+ if (!mz_stream_ioapi_create(&stream))
+ return NULL;
+ mz_stream_ioapi_set_filefunc(stream, pzlib_filefunc_def);
+ } else if (pzlib_filefunc_def->opaque) {
+ if (!mz_stream_create(&stream, (mz_stream_vtbl *)pzlib_filefunc_def->opaque))
+ return NULL;
+ }
+ }
+
+ if (!stream) {
+ if (!mz_stream_os_create(&stream))
+ return NULL;
+ }
+
+ if (mz_stream_open(stream, path, MZ_OPEN_MODE_READ) != MZ_OK) {
+ mz_stream_delete(&stream);
+ return NULL;
+ }
+
+ unz = unzOpen_MZ(stream);
+ if (!unz) {
+ mz_stream_close(stream);
+ mz_stream_delete(&stream);
+ return NULL;
+ }
+ return unz;
+}
+
+unzFile unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def) {
+ unzFile unz = NULL;
+ void *stream = NULL;
+
+ if (pzlib_filefunc_def) {
+ if (pzlib_filefunc_def->zopen64_file) {
+ if (!mz_stream_ioapi_create(&stream))
+ return NULL;
+ mz_stream_ioapi_set_filefunc64(stream, pzlib_filefunc_def);
+ } else if (pzlib_filefunc_def->opaque) {
+ if (!mz_stream_create(&stream, (mz_stream_vtbl *)pzlib_filefunc_def->opaque))
+ return NULL;
+ }
+ }
+
+ if (!stream) {
+ if (!mz_stream_os_create(&stream))
+ return NULL;
+ }
+
+ if (mz_stream_open(stream, path, MZ_OPEN_MODE_READ) != MZ_OK) {
+ mz_stream_delete(&stream);
+ return NULL;
+ }
+
+ unz = unzOpen_MZ(stream);
+ if (!unz) {
+ mz_stream_close(stream);
+ mz_stream_delete(&stream);
+ return NULL;
+ }
+ return unz;
+}
+
+void* unzGetHandle_MZ(unzFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ if (!compat)
+ return NULL;
+ return compat->handle;
+}
+
+void* unzGetStream_MZ(unzFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ if (!compat)
+ return NULL;
+ return compat->stream;
+}
+
+unzFile unzOpen_MZ(void *stream) {
+ mz_compat *compat = NULL;
+ int32_t err = MZ_OK;
+ void *handle = NULL;
+
+ mz_zip_create(&handle);
+ err = mz_zip_open(handle, stream, MZ_OPEN_MODE_READ);
+
+ if (err != MZ_OK) {
+ mz_zip_delete(&handle);
+ return NULL;
+ }
+
+ compat = (mz_compat *)calloc(1, sizeof(mz_compat));
+ if (compat) {
+ compat->handle = handle;
+ compat->stream = stream;
+
+ mz_zip_goto_first_entry(compat->handle);
+ } else {
+ mz_zip_delete(&handle);
+ }
+
+ return (unzFile)compat;
+}
+
+int unzClose(unzFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ int32_t err = MZ_OK;
+
+ if (!compat)
+ return UNZ_PARAMERROR;
+
+ if (compat->handle)
+ err = unzClose_MZ(file);
+
+ if (compat->stream) {
+ mz_stream_close(compat->stream);
+ mz_stream_delete(&compat->stream);
+ }
+
+ free(compat);
+
+ return err;
+}
+
+/* Only closes the zip handle, does not close the stream */
+int unzClose_MZ(unzFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ int32_t err = MZ_OK;
+
+ if (!compat)
+ return UNZ_PARAMERROR;
+
+ err = mz_zip_close(compat->handle);
+ mz_zip_delete(&compat->handle);
+
+ return err;
+}
+
+int unzGetGlobalInfo(unzFile file, unz_global_info* pglobal_info32) {
+ mz_compat *compat = (mz_compat *)file;
+ unz_global_info64 global_info64;
+ int32_t err = MZ_OK;
+
+ memset(pglobal_info32, 0, sizeof(unz_global_info));
+ if (!compat)
+ return UNZ_PARAMERROR;
+
+ err = unzGetGlobalInfo64(file, &global_info64);
+ if (err == MZ_OK) {
+ pglobal_info32->number_entry = (uint32_t)global_info64.number_entry;
+ pglobal_info32->size_comment = global_info64.size_comment;
+ pglobal_info32->number_disk_with_CD = global_info64.number_disk_with_CD;
+ }
+ return err;
+}
+
+int unzGetGlobalInfo64(unzFile file, unz_global_info64 *pglobal_info) {
+ mz_compat *compat = (mz_compat *)file;
+ const char *comment_ptr = NULL;
+ int32_t err = MZ_OK;
+
+ memset(pglobal_info, 0, sizeof(unz_global_info64));
+ if (!compat)
+ return UNZ_PARAMERROR;
+ err = mz_zip_get_comment(compat->handle, &comment_ptr);
+ if (err == MZ_OK)
+ pglobal_info->size_comment = (uint16_t)strlen(comment_ptr);
+ if ((err == MZ_OK) || (err == MZ_EXIST_ERROR))
+ err = mz_zip_get_number_entry(compat->handle, &pglobal_info->number_entry);
+ if (err == MZ_OK)
+ err = mz_zip_get_disk_number_with_cd(compat->handle, &pglobal_info->number_disk_with_CD);
+ return err;
+}
+
+int unzGetGlobalComment(unzFile file, char *comment, unsigned long comment_size) {
+ mz_compat *compat = (mz_compat *)file;
+ const char *comment_ptr = NULL;
+ int32_t err = MZ_OK;
+
+ if (!comment || !comment_size)
+ return UNZ_PARAMERROR;
+ err = mz_zip_get_comment(compat->handle, &comment_ptr);
+ if (err == MZ_OK) {
+ strncpy(comment, comment_ptr, comment_size - 1);
+ comment[comment_size - 1] = 0;
+ }
+ return err;
+}
+
+int unzOpenCurrentFile3(unzFile file, int *method, int *level, int raw, const char *password) {
+ mz_compat *compat = (mz_compat *)file;
+ mz_zip_file *file_info = NULL;
+ int32_t err = MZ_OK;
+ void *stream = NULL;
+
+ if (!compat)
+ return UNZ_PARAMERROR;
+ if (method)
+ *method = 0;
+ if (level)
+ *level = 0;
+
+ if (mz_zip_entry_is_open(compat->handle) == MZ_OK) {
+ /* zlib minizip does not error out here if close returns errors */
+ unzCloseCurrentFile(file);
+ }
+
+ compat->total_out = 0;
+ err = mz_zip_entry_read_open(compat->handle, (uint8_t)raw, password);
+ if (err == MZ_OK)
+ err = mz_zip_entry_get_info(compat->handle, &file_info);
+ if (err == MZ_OK) {
+ if (method) {
+ *method = file_info->compression_method;
+ }
+
+ if (level) {
+ *level = 6;
+ switch (file_info->flag & 0x06) {
+ case MZ_ZIP_FLAG_DEFLATE_SUPER_FAST:
+ *level = 1;
+ break;
+ case MZ_ZIP_FLAG_DEFLATE_FAST:
+ *level = 2;
+ break;
+ case MZ_ZIP_FLAG_DEFLATE_MAX:
+ *level = 9;
+ break;
+ }
+ }
+ }
+ if (err == MZ_OK)
+ err = mz_zip_get_stream(compat->handle, &stream);
+ if (err == MZ_OK)
+ compat->entry_pos = mz_stream_tell(stream);
+ return err;
+}
+
+int unzOpenCurrentFile(unzFile file) {
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
+}
+
+int unzOpenCurrentFilePassword(unzFile file, const char *password) {
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
+}
+
+int unzOpenCurrentFile2(unzFile file, int *method, int *level, int raw) {
+ return unzOpenCurrentFile3(file, method, level, raw, NULL);
+}
+
+int unzReadCurrentFile(unzFile file, void *buf, uint32_t len) {
+ mz_compat *compat = (mz_compat *)file;
+ int32_t err = MZ_OK;
+ if (!compat || len >= INT32_MAX)
+ return UNZ_PARAMERROR;
+ err = mz_zip_entry_read(compat->handle, buf, (int32_t)len);
+ if (err > 0)
+ compat->total_out += (uint32_t)err;
+ return err;
+}
+
+int unzCloseCurrentFile(unzFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ int32_t err = MZ_OK;
+ if (!compat)
+ return UNZ_PARAMERROR;
+ err = mz_zip_entry_close(compat->handle);
+ return err;
+}
+
+int unzGetCurrentFileInfo(unzFile file, unz_file_info *pfile_info, char *filename,
+ unsigned long filename_size, void *extrafield, unsigned long extrafield_size, char *comment,
+ unsigned long comment_size) {
+ mz_compat *compat = (mz_compat *)file;
+ mz_zip_file *file_info = NULL;
+ uint16_t bytes_to_copy = 0;
+ int32_t err = MZ_OK;
+
+ if (!compat)
+ return UNZ_PARAMERROR;
+
+ err = mz_zip_entry_get_info(compat->handle, &file_info);
+ if (err != MZ_OK)
+ return err;
+
+ if (pfile_info) {
+ pfile_info->version = file_info->version_madeby;
+ pfile_info->version_needed = file_info->version_needed;
+ pfile_info->flag = file_info->flag;
+ pfile_info->compression_method = file_info->compression_method;
+ pfile_info->mz_dos_date = mz_zip_time_t_to_dos_date(file_info->modified_date);
+ //mz_zip_time_t_to_tm(file_info->modified_date, &pfile_info->tmu_date);
+ //pfile_info->tmu_date.tm_year += 1900;
+ pfile_info->crc = file_info->crc;
+
+ pfile_info->size_filename = file_info->filename_size;
+ pfile_info->size_file_extra = file_info->extrafield_size;
+ pfile_info->size_file_comment = file_info->comment_size;
+
+ pfile_info->disk_num_start = (uint16_t)file_info->disk_number;
+ pfile_info->internal_fa = file_info->internal_fa;
+ pfile_info->external_fa = file_info->external_fa;
+
+ pfile_info->compressed_size = (uint32_t)file_info->compressed_size;
+ pfile_info->uncompressed_size = (uint32_t)file_info->uncompressed_size;
+ }
+ if (filename_size > 0 && filename && file_info->filename) {
+ bytes_to_copy = (uint16_t)filename_size;
+ if (bytes_to_copy > file_info->filename_size)
+ bytes_to_copy = file_info->filename_size;
+ memcpy(filename, file_info->filename, bytes_to_copy);
+ if (bytes_to_copy < filename_size)
+ filename[bytes_to_copy] = 0;
+ }
+ if (extrafield_size > 0 && extrafield) {
+ bytes_to_copy = (uint16_t)extrafield_size;
+ if (bytes_to_copy > file_info->extrafield_size)
+ bytes_to_copy = file_info->extrafield_size;
+ memcpy(extrafield, file_info->extrafield, bytes_to_copy);
+ }
+ if (comment_size > 0 && comment && file_info->comment) {
+ bytes_to_copy = (uint16_t)comment_size;
+ if (bytes_to_copy > file_info->comment_size)
+ bytes_to_copy = file_info->comment_size;
+ memcpy(comment, file_info->comment, bytes_to_copy);
+ if (bytes_to_copy < comment_size)
+ comment[bytes_to_copy] = 0;
+ }
+ return err;
+}
+
+int unzGetCurrentFileInfo64(unzFile file, unz_file_info64 * pfile_info, char *filename,
+ unsigned long filename_size, void *extrafield, unsigned long extrafield_size, char *comment,
+ unsigned long comment_size) {
+ mz_compat *compat = (mz_compat *)file;
+ mz_zip_file *file_info = NULL;
+ uint16_t bytes_to_copy = 0;
+ int32_t err = MZ_OK;
+
+ if (!compat)
+ return UNZ_PARAMERROR;
+
+ err = mz_zip_entry_get_info(compat->handle, &file_info);
+ if (err != MZ_OK)
+ return err;
+
+ if (pfile_info) {
+ pfile_info->version = file_info->version_madeby;
+ pfile_info->version_needed = file_info->version_needed;
+ pfile_info->flag = file_info->flag;
+ pfile_info->compression_method = file_info->compression_method;
+ pfile_info->mz_dos_date = mz_zip_time_t_to_dos_date(file_info->modified_date);
+ //mz_zip_time_t_to_tm(file_info->modified_date, &pfile_info->tmu_date);
+ //pfile_info->tmu_date.tm_year += 1900;
+ pfile_info->crc = file_info->crc;
+
+ pfile_info->size_filename = file_info->filename_size;
+ pfile_info->size_file_extra = file_info->extrafield_size;
+ pfile_info->size_file_comment = file_info->comment_size;
+
+ pfile_info->disk_num_start = file_info->disk_number;
+ pfile_info->internal_fa = file_info->internal_fa;
+ pfile_info->external_fa = file_info->external_fa;
+
+ pfile_info->compressed_size = (uint64_t)file_info->compressed_size;
+ pfile_info->uncompressed_size = (uint64_t)file_info->uncompressed_size;
+ }
+ if (filename_size > 0 && filename && file_info->filename) {
+ bytes_to_copy = (uint16_t)filename_size;
+ if (bytes_to_copy > file_info->filename_size)
+ bytes_to_copy = file_info->filename_size;
+ memcpy(filename, file_info->filename, bytes_to_copy);
+ if (bytes_to_copy < filename_size)
+ filename[bytes_to_copy] = 0;
+ }
+ if (extrafield_size > 0 && extrafield) {
+ bytes_to_copy = (uint16_t)extrafield_size;
+ if (bytes_to_copy > file_info->extrafield_size)
+ bytes_to_copy = file_info->extrafield_size;
+ memcpy(extrafield, file_info->extrafield, bytes_to_copy);
+ }
+ if (comment_size > 0 && comment && file_info->comment) {
+ bytes_to_copy = (uint16_t)comment_size;
+ if (bytes_to_copy > file_info->comment_size)
+ bytes_to_copy = file_info->comment_size;
+ memcpy(comment, file_info->comment, bytes_to_copy);
+ if (bytes_to_copy < comment_size)
+ comment[bytes_to_copy] = 0;
+ }
+ return err;
+}
+
+int unzGoToFirstFile(unzFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ if (!compat)
+ return UNZ_PARAMERROR;
+ compat->entry_index = 0;
+ return mz_zip_goto_first_entry(compat->handle);
+}
+
+int unzGoToNextFile(unzFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ int32_t err = MZ_OK;
+ if (!compat)
+ return UNZ_PARAMERROR;
+ err = mz_zip_goto_next_entry(compat->handle);
+ if (err != MZ_END_OF_LIST)
+ compat->entry_index += 1;
+ return err;
+}
+
+int unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func) {
+ mz_compat *compat = (mz_compat *)file;
+ mz_zip_file *file_info = NULL;
+ uint64_t preserve_index = 0;
+ int32_t err = MZ_OK;
+ int32_t result = 0;
+
+ if (!compat)
+ return UNZ_PARAMERROR;
+
+ preserve_index = compat->entry_index;
+
+ err = mz_zip_goto_first_entry(compat->handle);
+ while (err == MZ_OK) {
+ err = mz_zip_entry_get_info(compat->handle, &file_info);
+ if (err != MZ_OK)
+ break;
+
+ if ((intptr_t)filename_compare_func > 2) {
+ result = filename_compare_func(file, filename, file_info->filename);
+ } else {
+ int32_t case_sensitive = (int32_t)(intptr_t)filename_compare_func;
+ result = mz_path_compare_wc(filename, file_info->filename, !case_sensitive);
+ }
+
+ if (result == 0)
+ return MZ_OK;
+
+ err = mz_zip_goto_next_entry(compat->handle);
+ }
+
+ compat->entry_index = preserve_index;
+ return err;
+}
+
+/***************************************************************************/
+
+int unzGetFilePos(unzFile file, unz_file_pos *file_pos) {
+ unz64_file_pos file_pos64;
+ int32_t err = 0;
+
+ err = unzGetFilePos64(file, &file_pos64);
+ if (err < 0)
+ return err;
+
+ file_pos->pos_in_zip_directory = (uint32_t)file_pos64.pos_in_zip_directory;
+ file_pos->num_of_file = (uint32_t)file_pos64.num_of_file;
+ return err;
+}
+
+int unzGoToFilePos(unzFile file, unz_file_pos *file_pos) {
+ mz_compat *compat = (mz_compat *)file;
+ unz64_file_pos file_pos64;
+
+ if (!compat || !file_pos)
+ return UNZ_PARAMERROR;
+
+ file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
+ file_pos64.num_of_file = file_pos->num_of_file;
+
+ return unzGoToFilePos64(file, &file_pos64);
+}
+
+int unzGetFilePos64(unzFile file, unz64_file_pos *file_pos) {
+ mz_compat *compat = (mz_compat *)file;
+ int64_t offset = 0;
+
+ if (!compat || !file_pos)
+ return UNZ_PARAMERROR;
+
+ offset = unzGetOffset64(file);
+ if (offset < 0)
+ return (int)offset;
+
+ file_pos->pos_in_zip_directory = offset;
+ file_pos->num_of_file = compat->entry_index;
+ return UNZ_OK;
+}
+
+int unzGoToFilePos64(unzFile file, const unz64_file_pos *file_pos) {
+ mz_compat *compat = (mz_compat *)file;
+ int32_t err = MZ_OK;
+
+ if (!compat || !file_pos)
+ return UNZ_PARAMERROR;
+
+ err = mz_zip_goto_entry(compat->handle, file_pos->pos_in_zip_directory);
+ if (err == MZ_OK)
+ compat->entry_index = file_pos->num_of_file;
+ return err;
+}
+
+unsigned long unzGetOffset(unzFile file) {
+ return (uint32_t)unzGetOffset64(file);
+}
+
+int64_t unzGetOffset64(unzFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ if (!compat)
+ return UNZ_PARAMERROR;
+ return mz_zip_get_entry(compat->handle);
+}
+
+int unzSetOffset(unzFile file, unsigned long pos) {
+ return unzSetOffset64(file, pos);
+}
+
+int unzSetOffset64(unzFile file, int64_t pos) {
+ mz_compat *compat = (mz_compat *)file;
+ if (!compat)
+ return UNZ_PARAMERROR;
+ return (int)mz_zip_goto_entry(compat->handle, pos);
+}
+
+int unzGetLocalExtrafield(unzFile file, void *buf, unsigned int len) {
+ mz_compat *compat = (mz_compat *)file;
+ mz_zip_file *file_info = NULL;
+ int32_t err = MZ_OK;
+ int32_t bytes_to_copy = 0;
+
+ if (!compat || !buf || len >= INT32_MAX)
+ return UNZ_PARAMERROR;
+
+ err = mz_zip_entry_get_local_info(compat->handle, &file_info);
+ if (err != MZ_OK)
+ return err;
+
+ bytes_to_copy = (int32_t)len;
+ if (bytes_to_copy > file_info->extrafield_size)
+ bytes_to_copy = file_info->extrafield_size;
+
+ memcpy(buf, file_info->extrafield, bytes_to_copy);
+ return MZ_OK;
+}
+
+int32_t unzTell(unzFile file) {
+ return unztell(file);
+}
+
+int32_t unztell(unzFile file) {
+ return (int32_t)unztell64(file);
+}
+
+uint64_t unzTell64(unzFile file) {
+ return unztell64(file);
+}
+
+uint64_t unztell64(unzFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ if (!compat)
+ return UNZ_PARAMERROR;
+ return compat->total_out;
+}
+
+int unzSeek(unzFile file, int32_t offset, int origin) {
+ return unzSeek64(file, offset, origin);
+}
+
+int unzSeek64(unzFile file, int64_t offset, int origin) {
+ mz_compat *compat = (mz_compat *)file;
+ mz_zip_file *file_info = NULL;
+ int64_t position = 0;
+ int32_t err = MZ_OK;
+ void *stream = NULL;
+
+ if (!compat)
+ return UNZ_PARAMERROR;
+ err = mz_zip_entry_get_info(compat->handle, &file_info);
+ if (err != MZ_OK)
+ return err;
+ if (file_info->compression_method != MZ_COMPRESS_METHOD_STORE)
+ return UNZ_ERRNO;
+
+ if (origin == SEEK_SET)
+ position = offset;
+ else if (origin == SEEK_CUR)
+ position = compat->total_out + offset;
+ else if (origin == SEEK_END)
+ position = (int64_t)file_info->compressed_size + offset;
+ else
+ return UNZ_PARAMERROR;
+
+ if (position > (int64_t)file_info->compressed_size)
+ return UNZ_PARAMERROR;
+
+ err = mz_zip_get_stream(compat->handle, &stream);
+ if (err == MZ_OK)
+ err = mz_stream_seek(stream, compat->entry_pos + position, MZ_SEEK_SET);
+ if (err == MZ_OK)
+ compat->total_out = position;
+ return err;
+}
+
+int unzEndOfFile(unzFile file) {
+ return unzeof(file);
+}
+
+int unzeof(unzFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ mz_zip_file *file_info = NULL;
+ int32_t err = MZ_OK;
+
+ if (!compat)
+ return UNZ_PARAMERROR;
+ err = mz_zip_entry_get_info(compat->handle, &file_info);
+ if (err != MZ_OK)
+ return err;
+ if (compat->total_out == (int64_t)file_info->uncompressed_size)
+ return 1;
+ return 0;
+}
+
+void* unzGetStream(unzFile file) {
+ mz_compat *compat = (mz_compat *)file;
+ if (!compat)
+ return NULL;
+ return (void *)compat->stream;
+}
+
+/***************************************************************************/
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_compat.h b/ios/CodePush/SSZipArchive/minizip/mz_compat.h
new file mode 100644
index 000000000..6192166f5
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_compat.h
@@ -0,0 +1,346 @@
+/* mz_compat.h -- Backwards compatible interface for older versions
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+ Copyright (C) 1998-2010 Gilles Vollant
+ https://www.winimage.com/zLibDll/minizip.html
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+
+ WARNING: Be very careful updating/overwriting this file.
+ It has specific changes for SSZipArchive support with some structs moved to SSZipCommon for public access
+*/
+
+#ifndef MZ_COMPAT_H
+#define MZ_COMPAT_H
+
+#include "mz.h"
+#include "../SSZipCommon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+#if defined(HAVE_ZLIB) && defined(MAX_MEM_LEVEL)
+#ifndef DEF_MEM_LEVEL
+# if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+# else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+# endif
+#endif
+#endif
+#ifndef MAX_WBITS
+#define MAX_WBITS 15 //removed () to suppress warning about ambiguous expansion of macro -SSZipArchive
+#endif
+#ifndef DEF_MEM_LEVEL
+#define DEF_MEM_LEVEL (8)
+#endif
+
+#ifndef ZEXPORT
+# define ZEXPORT MZ_EXPORT
+#endif
+
+/***************************************************************************/
+
+#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+ from (void*) without cast */
+typedef struct TagzipFile__ { int unused; } zip_file__;
+typedef zip_file__ *zipFile;
+#else
+typedef void *zipFile;
+#endif
+
+/***************************************************************************/
+
+typedef uint64_t ZPOS64_T;
+
+#ifndef ZCALLBACK
+#define ZCALLBACK
+#endif
+
+typedef void* (ZCALLBACK *open_file_func) (void *opaque, const char *filename, int mode);
+typedef void* (ZCALLBACK *open64_file_func) (void *opaque, const void *filename, int mode);
+typedef unsigned long (ZCALLBACK *read_file_func) (void *opaque, void *stream, void* buf, unsigned long size);
+typedef unsigned long (ZCALLBACK *write_file_func) (void *opaque, void *stream, const void* buf,
+ unsigned long size);
+typedef int (ZCALLBACK *close_file_func) (void *opaque, void *stream);
+typedef int (ZCALLBACK *testerror_file_func)(void *opaque, void *stream);
+typedef long (ZCALLBACK *tell_file_func) (void *opaque, void *stream);
+typedef ZPOS64_T (ZCALLBACK *tell64_file_func) (void *opaque, void *stream);
+typedef long (ZCALLBACK *seek_file_func) (void *opaque, void *stream, unsigned long offset, int origin);
+typedef long (ZCALLBACK *seek64_file_func) (void *opaque, void *stream, ZPOS64_T offset, int origin);
+
+typedef struct zlib_filefunc_def_s
+{
+ open_file_func zopen_file;
+ read_file_func zread_file;
+ write_file_func zwrite_file;
+ tell_file_func ztell_file;
+ seek_file_func zseek_file;
+ close_file_func zclose_file;
+ testerror_file_func zerror_file;
+ void* opaque;
+} zlib_filefunc_def;
+
+typedef struct zlib_filefunc64_def_s
+{
+ open64_file_func zopen64_file;
+ read_file_func zread_file;
+ write_file_func zwrite_file;
+ tell64_file_func ztell64_file;
+ seek64_file_func zseek64_file;
+ close_file_func zclose_file;
+ testerror_file_func zerror_file;
+ void* opaque;
+} zlib_filefunc64_def;
+
+/***************************************************************************/
+
+#define ZLIB_FILEFUNC_SEEK_SET (0)
+#define ZLIB_FILEFUNC_SEEK_CUR (1)
+#define ZLIB_FILEFUNC_SEEK_END (2)
+
+#define ZLIB_FILEFUNC_MODE_READ (1)
+#define ZLIB_FILEFUNC_MODE_WRITE (2)
+#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
+
+#define ZLIB_FILEFUNC_MODE_EXISTING (4)
+#define ZLIB_FILEFUNC_MODE_CREATE (8)
+
+/***************************************************************************/
+
+ZEXPORT void fill_fopen_filefunc(zlib_filefunc_def *pzlib_filefunc_def);
+ZEXPORT void fill_fopen64_filefunc(zlib_filefunc64_def *pzlib_filefunc_def);
+ZEXPORT void fill_win32_filefunc(zlib_filefunc_def *pzlib_filefunc_def);
+ZEXPORT void fill_win32_filefunc64(zlib_filefunc64_def *pzlib_filefunc_def);
+ZEXPORT void fill_win32_filefunc64A(zlib_filefunc64_def *pzlib_filefunc_def);
+ZEXPORT void fill_memory_filefunc(zlib_filefunc_def *pzlib_filefunc_def);
+
+/***************************************************************************/
+
+
+// SSZipArchive 2.x+ uses dos_date
+#define MZ_COMPAT_VERSION 120
+
+#if MZ_COMPAT_VERSION <= 110
+#define mz_dos_date dosDate
+#else
+#define mz_dos_date dos_date
+#endif
+
+typedef struct tm tm_unz;
+typedef struct tm tm_zip;
+
+typedef struct {
+ uint32_t mz_dos_date;
+ struct tm tmz_date;
+ uint16_t internal_fa; /* internal file attributes 2 bytes */
+ uint32_t external_fa; /* external file attributes 4 bytes */
+} zip_fileinfo;
+
+typedef const char *zipcharpc;
+
+/***************************************************************************/
+
+#define ZIP_OK (0)
+#define ZIP_EOF (0)
+#define ZIP_ERRNO (-1)
+#define ZIP_PARAMERROR (-102)
+#define ZIP_BADZIPFILE (-103)
+#define ZIP_INTERNALERROR (-104)
+
+#ifndef Z_DEFLATED
+#define Z_DEFLATED 8 //removed () to suppress warning about ambiguous expansion of macro -SSZipArchive
+#endif
+#define Z_BZIP2ED (12)
+
+#define APPEND_STATUS_CREATE (0)
+#define APPEND_STATUS_CREATEAFTER (1)
+#define APPEND_STATUS_ADDINZIP (2)
+
+/***************************************************************************/
+/* Writing a zip file */
+
+ZEXPORT zipFile zipOpen(const char *path, int append);
+ZEXPORT zipFile zipOpen64(const void *path, int append);
+ZEXPORT zipFile zipOpen2(const char *path, int append, const char **globalcomment,
+ zlib_filefunc_def *pzlib_filefunc_def);
+
+ZEXPORT zipFile zipOpen2_64(const void *path, int append, const char **globalcomment,
+ zlib_filefunc64_def *pzlib_filefunc_def);
+ZEXPORT zipFile zipOpen_MZ(void *stream, int append, const char **globalcomment);
+
+ZEXPORT void* zipGetHandle_MZ(zipFile);
+ZEXPORT void* zipGetStream_MZ(zipFile file);
+
+ZEXPORT int zipOpenNewFileInZip(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level);
+ZEXPORT int zipOpenNewFileInZip_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int zip64);
+ZEXPORT int zipOpenNewFileInZip2(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw);
+ZEXPORT int zipOpenNewFileInZip2_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int zip64);
+ZEXPORT int zipOpenNewFileInZip3(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int windowBits, int memLevel, int strategy, const char *password,
+ unsigned long crc_for_crypting);
+ZEXPORT int zipOpenNewFileInZip3_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int windowBits, int memLevel, int strategy, const char *password,
+ unsigned long crc_for_crypting, int zip64);
+ZEXPORT int zipOpenNewFileInZip4(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int windowBits, int memLevel, int strategy, const char *password,
+ unsigned long crc_for_crypting, unsigned long version_madeby, unsigned long flag_base);
+ZEXPORT int zipOpenNewFileInZip4_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int windowBits, int memLevel, int strategy, const char *password,
+ unsigned long crc_for_crypting, unsigned long version_madeby, unsigned long flag_base, int zip64);
+ZEXPORT int zipOpenNewFileInZip5(zipFile file, const char *filename, const zip_fileinfo *zipfi,
+ const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
+ uint16_t size_extrafield_global, const char *comment, int compression_method, int level,
+ int raw, int windowBits, int memLevel, int strategy, const char *password,
+ unsigned long crc_for_crypting, signed char aes, unsigned long version_madeby, unsigned long flag_base, int zip64);
+
+ZEXPORT int zipWriteInFileInZip(zipFile file, const void *buf, uint32_t len);
+
+ZEXPORT int zipCloseFileInZipRaw(zipFile file, unsigned long uncompressed_size, uint32_t crc32);
+ZEXPORT int zipCloseFileInZipRaw64(zipFile file, uint64_t uncompressed_size, uint32_t crc32);
+ZEXPORT int zipCloseFileInZip(zipFile file);
+ZEXPORT int zipCloseFileInZip64(zipFile file);
+
+ZEXPORT int zipClose(zipFile file, const char *global_comment);
+ZEXPORT int zipClose_64(zipFile file, const char *global_comment);
+ZEXPORT int zipClose2_64(zipFile file, const char *global_comment, uint16_t version_madeby);
+ int zipClose_MZ(zipFile file, const char *global_comment);
+ int zipClose2_MZ(zipFile file, const char *global_comment, uint16_t version_madeby);
+
+/***************************************************************************/
+
+#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+ from (void*) without cast */
+typedef struct TagunzFile__ { int unused; } unz_file__;
+typedef unz_file__ *unzFile;
+#else
+typedef void *unzFile;
+#endif
+
+/***************************************************************************/
+
+#define UNZ_OK (0)
+#define UNZ_END_OF_LIST_OF_FILE (-100)
+#define UNZ_ERRNO (-1)
+#define UNZ_EOF (0)
+#define UNZ_PARAMERROR (-102)
+#define UNZ_BADZIPFILE (-103)
+#define UNZ_INTERNALERROR (-104)
+#define UNZ_CRCERROR (-105)
+#define UNZ_BADPASSWORD (-106)
+
+/***************************************************************************/
+
+typedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2);
+typedef int (*unzIteratorFunction)(unzFile file);
+typedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename,
+ uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment,
+ uint16_t comment_size);
+
+/***************************************************************************/
+/* Reading a zip file */
+
+ZEXPORT unzFile unzOpen(const char *path);
+ZEXPORT unzFile unzOpen64(const void *path);
+ZEXPORT unzFile unzOpen2(const char *path, zlib_filefunc_def *pzlib_filefunc_def);
+ZEXPORT unzFile unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def);
+ unzFile unzOpen_MZ(void *stream);
+
+ZEXPORT int unzClose(unzFile file);
+ZEXPORT int unzClose_MZ(unzFile file);
+
+ZEXPORT void* unzGetHandle_MZ(unzFile file);
+ZEXPORT void* unzGetStream_MZ(zipFile file);
+
+ZEXPORT int unzGetGlobalInfo(unzFile file, unz_global_info* pglobal_info32);
+ZEXPORT int unzGetGlobalInfo64(unzFile file, unz_global_info64 *pglobal_info);
+ZEXPORT int unzGetGlobalComment(unzFile file, char *comment, unsigned long comment_size);
+
+ZEXPORT int unzOpenCurrentFile(unzFile file);
+ZEXPORT int unzOpenCurrentFilePassword(unzFile file, const char *password);
+ZEXPORT int unzOpenCurrentFile2(unzFile file, int *method, int *level, int raw);
+ZEXPORT int unzOpenCurrentFile3(unzFile file, int *method, int *level, int raw, const char *password);
+ZEXPORT int unzReadCurrentFile(unzFile file, void *buf, uint32_t len);
+ZEXPORT int unzCloseCurrentFile(unzFile file);
+
+ZEXPORT int unzGetCurrentFileInfo(unzFile file, unz_file_info *pfile_info, char *filename,
+ unsigned long filename_size, void *extrafield, unsigned long extrafield_size, char *comment,
+ unsigned long comment_size);
+ZEXPORT int unzGetCurrentFileInfo64(unzFile file, unz_file_info64 * pfile_info, char *filename,
+ unsigned long filename_size, void *extrafield, unsigned long extrafield_size, char *comment,
+ unsigned long comment_size);
+
+ZEXPORT int unzGoToFirstFile(unzFile file);
+ZEXPORT int unzGoToNextFile(unzFile file);
+ZEXPORT int unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func);
+
+ZEXPORT int unzGetLocalExtrafield(unzFile file, void *buf, unsigned int len);
+
+/***************************************************************************/
+/* Raw access to zip file */
+
+typedef struct unz_file_pos_s {
+ uint32_t pos_in_zip_directory; /* offset in zip file directory */
+ uint32_t num_of_file; /* # of file */
+} unz_file_pos;
+
+ZEXPORT int unzGetFilePos(unzFile file, unz_file_pos *file_pos);
+ZEXPORT int unzGoToFilePos(unzFile file, unz_file_pos *file_pos);
+
+typedef struct unz64_file_pos_s {
+ int64_t pos_in_zip_directory; /* offset in zip file directory */
+ uint64_t num_of_file; /* # of file */
+} unz64_file_pos;
+
+ZEXPORT int unzGetFilePos64(unzFile file, unz64_file_pos *file_pos);
+ZEXPORT int unzGoToFilePos64(unzFile file, const unz64_file_pos *file_pos);
+
+ZEXPORT int64_t unzGetOffset64(unzFile file);
+ZEXPORT unsigned long
+ unzGetOffset(unzFile file);
+ZEXPORT int unzSetOffset64(unzFile file, int64_t pos);
+ZEXPORT int unzSetOffset(unzFile file, unsigned long pos);
+ZEXPORT int32_t unztell(unzFile file);
+ZEXPORT int32_t unzTell(unzFile file);
+ZEXPORT uint64_t unztell64(unzFile file);
+ZEXPORT uint64_t unzTell64(unzFile file);
+ZEXPORT int unzSeek(unzFile file, int32_t offset, int origin);
+ZEXPORT int unzSeek64(unzFile file, int64_t offset, int origin);
+ZEXPORT int unzEndOfFile(unzFile file);
+ZEXPORT int unzeof(unzFile file);
+ZEXPORT void* unzGetStream(unzFile file);
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_crypt.c b/ios/CodePush/SSZipArchive/minizip/mz_crypt.c
new file mode 100644
index 000000000..86b97d909
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_crypt.c
@@ -0,0 +1,187 @@
+/* mz_crypt.c -- Crypto/hash functions
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_os.h"
+#include "mz_crypt.h"
+
+#if defined(HAVE_ZLIB)
+# if !defined(ZLIB_COMPAT)
+# include "zlib-ng.h"
+# define ZLIB_PREFIX(x) zng_##x
+# else
+# include "zlib.h"
+# define ZLIB_PREFIX(x) x
+# endif
+#elif defined(HAVE_LZMA)
+# include "lzma.h"
+#endif
+
+/***************************************************************************/
+
+#if defined(MZ_ZIP_NO_CRYPTO)
+int32_t mz_crypt_rand(uint8_t *buf, int32_t size) {
+ return mz_os_rand(buf, size);
+}
+#endif
+
+uint32_t mz_crypt_crc32_update(uint32_t value, const uint8_t *buf, int32_t size) {
+#if defined(HAVE_ZLIB)
+ /* Define z_crc_t in zlib 1.2.5 and less or if using zlib-ng */
+# if (ZLIB_VERNUM < 0x1270)
+ typedef unsigned long z_crc_t;
+# else
+ typedef uint32_t z_crc_t;
+# endif
+ return (uint32_t)ZLIB_PREFIX(crc32)((z_crc_t)value, buf, (uInt)size);
+#elif defined(HAVE_LZMA)
+ return (uint32_t)lzma_crc32(buf, (size_t)size, (uint32_t)value);
+#else
+ static uint32_t crc32_table[256] = {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+ };
+ value = ~value;
+
+ while (size > 0) {
+ value = (value >> 8) ^ crc32_table[(value ^ *buf) & 0xFF];
+
+ buf += 1;
+ size -= 1;
+ }
+
+ return ~value;
+#endif
+}
+
+#if defined(HAVE_WZAES)
+int32_t mz_crypt_pbkdf2(uint8_t *password, int32_t password_length, uint8_t *salt,
+ int32_t salt_length, uint16_t iteration_count, uint8_t *key, uint16_t key_length) {
+ void *hmac1 = NULL;
+ void *hmac2 = NULL;
+ void *hmac3 = NULL;
+ int32_t err = MZ_OK;
+ uint16_t i = 0;
+ uint16_t j = 0;
+ uint16_t k = 0;
+ uint16_t block_count = 0;
+ uint8_t uu[MZ_HASH_SHA1_SIZE];
+ uint8_t ux[MZ_HASH_SHA1_SIZE];
+
+ if (!password || !salt || !key)
+ return MZ_PARAM_ERROR;
+
+ memset(key, 0, key_length);
+
+ mz_crypt_hmac_create(&hmac1);
+ mz_crypt_hmac_create(&hmac2);
+ mz_crypt_hmac_create(&hmac3);
+
+ mz_crypt_hmac_set_algorithm(hmac1, MZ_HASH_SHA1);
+ mz_crypt_hmac_set_algorithm(hmac2, MZ_HASH_SHA1);
+ mz_crypt_hmac_set_algorithm(hmac3, MZ_HASH_SHA1);
+
+ err = mz_crypt_hmac_init(hmac1, password, password_length);
+ if (err == MZ_OK)
+ err = mz_crypt_hmac_init(hmac2, password, password_length);
+ if (err == MZ_OK)
+ err = mz_crypt_hmac_update(hmac2, salt, salt_length);
+
+ block_count = 1 + ((uint16_t)key_length - 1) / MZ_HASH_SHA1_SIZE;
+
+ for (i = 0; (err == MZ_OK) && (i < block_count); i += 1) {
+ memset(ux, 0, sizeof(ux));
+
+ err = mz_crypt_hmac_copy(hmac2, hmac3);
+ if (err != MZ_OK)
+ break;
+
+ uu[0] = (uint8_t)((i + 1) >> 24);
+ uu[1] = (uint8_t)((i + 1) >> 16);
+ uu[2] = (uint8_t)((i + 1) >> 8);
+ uu[3] = (uint8_t)(i + 1);
+
+ for (j = 0, k = 4; j < iteration_count; j += 1) {
+ err = mz_crypt_hmac_update(hmac3, uu, k);
+ if (err == MZ_OK)
+ err = mz_crypt_hmac_end(hmac3, uu, sizeof(uu));
+ if (err != MZ_OK)
+ break;
+
+ for (k = 0; k < MZ_HASH_SHA1_SIZE; k += 1)
+ ux[k] ^= uu[k];
+
+ err = mz_crypt_hmac_copy(hmac1, hmac3);
+ if (err != MZ_OK)
+ break;
+ }
+
+ if (err != MZ_OK)
+ break;
+
+ j = 0;
+ k = i * MZ_HASH_SHA1_SIZE;
+
+ while (j < MZ_HASH_SHA1_SIZE && k < key_length)
+ key[k++] = ux[j++];
+ }
+
+ /* hmac3 uses the same provider as hmac2, so it must be deleted
+ before the context is destroyed. */
+ mz_crypt_hmac_delete(&hmac3);
+ mz_crypt_hmac_delete(&hmac1);
+ mz_crypt_hmac_delete(&hmac2);
+
+ return err;
+}
+#endif
+
+/***************************************************************************/
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_crypt.h b/ios/CodePush/SSZipArchive/minizip/mz_crypt.h
new file mode 100644
index 000000000..de9ccd669
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_crypt.h
@@ -0,0 +1,65 @@
+/* mz_crypt.h -- Crypto/hash functions
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_CRYPT_H
+#define MZ_CRYPT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+uint32_t mz_crypt_crc32_update(uint32_t value, const uint8_t *buf, int32_t size);
+
+int32_t mz_crypt_pbkdf2(uint8_t *password, int32_t password_length, uint8_t *salt,
+ int32_t salt_length, uint16_t iteration_count, uint8_t *key, uint16_t key_length);
+
+/***************************************************************************/
+
+int32_t mz_crypt_rand(uint8_t *buf, int32_t size);
+
+void mz_crypt_sha_reset(void *handle);
+int32_t mz_crypt_sha_begin(void *handle);
+int32_t mz_crypt_sha_update(void *handle, const void *buf, int32_t size);
+int32_t mz_crypt_sha_end(void *handle, uint8_t *digest, int32_t digest_size);
+void mz_crypt_sha_set_algorithm(void *handle, uint16_t algorithm);
+void* mz_crypt_sha_create(void **handle);
+void mz_crypt_sha_delete(void **handle);
+
+void mz_crypt_aes_reset(void *handle);
+int32_t mz_crypt_aes_encrypt(void *handle, uint8_t *buf, int32_t size);
+int32_t mz_crypt_aes_decrypt(void *handle, uint8_t *buf, int32_t size);
+int32_t mz_crypt_aes_set_encrypt_key(void *handle, const void *key, int32_t key_length);
+int32_t mz_crypt_aes_set_decrypt_key(void *handle, const void *key, int32_t key_length);
+void mz_crypt_aes_set_mode(void *handle, int32_t mode);
+void* mz_crypt_aes_create(void **handle);
+void mz_crypt_aes_delete(void **handle);
+
+void mz_crypt_hmac_reset(void *handle);
+int32_t mz_crypt_hmac_init(void *handle, const void *key, int32_t key_length);
+int32_t mz_crypt_hmac_update(void *handle, const void *buf, int32_t size);
+int32_t mz_crypt_hmac_end(void *handle, uint8_t *digest, int32_t digest_size);
+int32_t mz_crypt_hmac_copy(void *src_handle, void *target_handle);
+void mz_crypt_hmac_set_algorithm(void *handle, uint16_t algorithm);
+void* mz_crypt_hmac_create(void **handle);
+void mz_crypt_hmac_delete(void **handle);
+
+int32_t mz_crypt_sign(uint8_t *message, int32_t message_size, uint8_t *cert_data, int32_t cert_data_size,
+ const char *cert_pwd, uint8_t **signature, int32_t *signature_size);
+int32_t mz_crypt_sign_verify(uint8_t *message, int32_t message_size, uint8_t *signature, int32_t signature_size);
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_crypt_apple.c b/ios/CodePush/SSZipArchive/minizip/mz_crypt_apple.c
new file mode 100644
index 000000000..6acab3e17
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_crypt_apple.c
@@ -0,0 +1,526 @@
+/* mz_crypt_apple.c -- Crypto/hash functions for Apple
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+/***************************************************************************/
+
+int32_t mz_crypt_rand(uint8_t *buf, int32_t size) {
+ if (SecRandomCopyBytes(kSecRandomDefault, size, buf) != errSecSuccess)
+ return 0;
+ return size;
+}
+
+/***************************************************************************/
+
+typedef struct mz_crypt_sha_s {
+ union {
+ CC_SHA1_CTX ctx1;
+ CC_SHA256_CTX ctx256;
+ CC_SHA512_CTX ctx512;
+ };
+ int32_t error;
+ int32_t initialized;
+ uint16_t algorithm;
+} mz_crypt_sha;
+
+/***************************************************************************/
+
+static const uint8_t mz_crypt_sha_digest_size[] = {
+ MZ_HASH_SHA1_SIZE, 0, MZ_HASH_SHA224_SIZE,
+ MZ_HASH_SHA256_SIZE, MZ_HASH_SHA384_SIZE, MZ_HASH_SHA512_SIZE
+};
+
+/***************************************************************************/
+
+void mz_crypt_sha_reset(void *handle) {
+ mz_crypt_sha *sha = (mz_crypt_sha *)handle;
+
+ sha->error = 0;
+ sha->initialized = 0;
+}
+
+int32_t mz_crypt_sha_begin(void *handle) {
+ mz_crypt_sha *sha = (mz_crypt_sha *)handle;
+
+ if (!sha)
+ return MZ_PARAM_ERROR;
+
+ mz_crypt_sha_reset(handle);
+
+ switch (sha->algorithm) {
+ case MZ_HASH_SHA1:
+ sha->error = CC_SHA1_Init(&sha->ctx1);
+ break;
+ case MZ_HASH_SHA224:
+ sha->error = CC_SHA224_Init(&sha->ctx256);
+ break;
+ case MZ_HASH_SHA256:
+ sha->error = CC_SHA256_Init(&sha->ctx256);
+ break;
+ case MZ_HASH_SHA384:
+ sha->error = CC_SHA384_Init(&sha->ctx512);
+ break;
+ case MZ_HASH_SHA512:
+ sha->error = CC_SHA512_Init(&sha->ctx512);
+ break;
+ default:
+ return MZ_PARAM_ERROR;
+ }
+
+ if (!sha->error)
+ return MZ_HASH_ERROR;
+
+ sha->initialized = 1;
+ return MZ_OK;
+}
+
+int32_t mz_crypt_sha_update(void *handle, const void *buf, int32_t size) {
+ mz_crypt_sha *sha = (mz_crypt_sha *)handle;
+
+ if (!sha || !buf || !sha->initialized)
+ return MZ_PARAM_ERROR;
+
+ switch (sha->algorithm) {
+ case MZ_HASH_SHA1:
+ sha->error = CC_SHA1_Update(&sha->ctx1, buf, size);
+ break;
+ case MZ_HASH_SHA224:
+ sha->error = CC_SHA224_Update(&sha->ctx256, buf, size);
+ break;
+ case MZ_HASH_SHA256:
+ sha->error = CC_SHA256_Update(&sha->ctx256, buf, size);
+ break;
+ case MZ_HASH_SHA384:
+ sha->error = CC_SHA384_Update(&sha->ctx512, buf, size);
+ break;
+ case MZ_HASH_SHA512:
+ sha->error = CC_SHA512_Update(&sha->ctx512, buf, size);
+ break;
+ }
+
+ if (!sha->error)
+ return MZ_HASH_ERROR;
+
+ return size;
+}
+
+int32_t mz_crypt_sha_end(void *handle, uint8_t *digest, int32_t digest_size) {
+ mz_crypt_sha *sha = (mz_crypt_sha *)handle;
+
+ if (!sha || !digest || !sha->initialized)
+ return MZ_PARAM_ERROR;
+ if (digest_size < mz_crypt_sha_digest_size[sha->algorithm - MZ_HASH_SHA1])
+ return MZ_PARAM_ERROR;
+
+ switch (sha->algorithm) {
+ case MZ_HASH_SHA1:
+ sha->error = CC_SHA1_Final(digest, &sha->ctx1);
+ break;
+ case MZ_HASH_SHA224:
+ sha->error = CC_SHA224_Final(digest, &sha->ctx256);
+ break;
+ case MZ_HASH_SHA256:
+ sha->error = CC_SHA256_Final(digest, &sha->ctx256);
+ break;
+ case MZ_HASH_SHA384:
+ sha->error = CC_SHA384_Final(digest, &sha->ctx512);
+ break;
+ case MZ_HASH_SHA512:
+ sha->error = CC_SHA512_Final(digest, &sha->ctx512);
+ break;
+ }
+
+ if (!sha->error)
+ return MZ_HASH_ERROR;
+
+ return MZ_OK;
+}
+
+void mz_crypt_sha_set_algorithm(void *handle, uint16_t algorithm) {
+ mz_crypt_sha *sha = (mz_crypt_sha *)handle;
+ if (MZ_HASH_SHA1 <= algorithm && algorithm <= MZ_HASH_SHA512)
+ sha->algorithm = algorithm;
+}
+
+void *mz_crypt_sha_create(void **handle) {
+ mz_crypt_sha *sha = NULL;
+
+ sha = (mz_crypt_sha *)calloc(1, sizeof(mz_crypt_sha));
+ if (sha) {
+ memset(sha, 0, sizeof(mz_crypt_sha));
+ sha->algorithm = MZ_HASH_SHA256;
+ }
+ if (handle)
+ *handle = sha;
+
+ return sha;
+}
+
+void mz_crypt_sha_delete(void **handle) {
+ mz_crypt_sha *sha = NULL;
+ if (!handle)
+ return;
+ sha = (mz_crypt_sha *)*handle;
+ if (sha) {
+ mz_crypt_sha_reset(*handle);
+ free(sha);
+ }
+ *handle = NULL;
+}
+
+/***************************************************************************/
+
+typedef struct mz_crypt_aes_s {
+ CCCryptorRef crypt;
+ int32_t mode;
+ int32_t error;
+} mz_crypt_aes;
+
+/***************************************************************************/
+
+void mz_crypt_aes_reset(void *handle) {
+ mz_crypt_aes *aes = (mz_crypt_aes *)handle;
+
+ if (aes->crypt)
+ CCCryptorRelease(aes->crypt);
+ aes->crypt = NULL;
+}
+
+int32_t mz_crypt_aes_encrypt(void *handle, uint8_t *buf, int32_t size) {
+ mz_crypt_aes *aes = (mz_crypt_aes *)handle;
+ size_t data_moved = 0;
+
+ if (!aes || !buf)
+ return MZ_PARAM_ERROR;
+ if (size != MZ_AES_BLOCK_SIZE)
+ return MZ_PARAM_ERROR;
+
+ aes->error = CCCryptorUpdate(aes->crypt, buf, size, buf, size, &data_moved);
+
+ if (aes->error != kCCSuccess)
+ return MZ_HASH_ERROR;
+
+ return size;
+}
+
+int32_t mz_crypt_aes_decrypt(void *handle, uint8_t *buf, int32_t size) {
+ mz_crypt_aes *aes = (mz_crypt_aes *)handle;
+ size_t data_moved = 0;
+
+ if (!aes || !buf)
+ return MZ_PARAM_ERROR;
+ if (size != MZ_AES_BLOCK_SIZE)
+ return MZ_PARAM_ERROR;
+
+ aes->error = CCCryptorUpdate(aes->crypt, buf, size, buf, size, &data_moved);
+
+ if (aes->error != kCCSuccess)
+ return MZ_HASH_ERROR;
+
+ return size;
+}
+
+int32_t mz_crypt_aes_set_encrypt_key(void *handle, const void *key, int32_t key_length) {
+ mz_crypt_aes *aes = (mz_crypt_aes *)handle;
+
+ if (!aes || !key || !key_length)
+ return MZ_PARAM_ERROR;
+
+ mz_crypt_aes_reset(handle);
+
+ aes->error = CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES, kCCOptionECBMode,
+ key, key_length, NULL, &aes->crypt);
+
+ if (aes->error != kCCSuccess)
+ return MZ_HASH_ERROR;
+
+ return MZ_OK;
+}
+
+int32_t mz_crypt_aes_set_decrypt_key(void *handle, const void *key, int32_t key_length) {
+ mz_crypt_aes *aes = (mz_crypt_aes *)handle;
+
+ if (!aes || !key || !key_length)
+ return MZ_PARAM_ERROR;
+
+ mz_crypt_aes_reset(handle);
+
+ aes->error = CCCryptorCreate(kCCDecrypt, kCCAlgorithmAES, kCCOptionECBMode,
+ key, key_length, NULL, &aes->crypt);
+
+ if (aes->error != kCCSuccess)
+ return MZ_HASH_ERROR;
+
+ return MZ_OK;
+}
+
+void mz_crypt_aes_set_mode(void *handle, int32_t mode) {
+ mz_crypt_aes *aes = (mz_crypt_aes *)handle;
+ aes->mode = mode;
+}
+
+void *mz_crypt_aes_create(void **handle) {
+ mz_crypt_aes *aes = NULL;
+
+ aes = (mz_crypt_aes *)calloc(1, sizeof(mz_crypt_aes));
+ if (handle)
+ *handle = aes;
+
+ return aes;
+}
+
+void mz_crypt_aes_delete(void **handle) {
+ mz_crypt_aes *aes = NULL;
+ if (!handle)
+ return;
+ aes = (mz_crypt_aes *)*handle;
+ if (aes) {
+ mz_crypt_aes_reset(*handle);
+ free(aes);
+ }
+ *handle = NULL;
+}
+
+/***************************************************************************/
+
+typedef struct mz_crypt_hmac_s {
+ CCHmacContext ctx;
+ int32_t initialized;
+ int32_t error;
+ uint16_t algorithm;
+} mz_crypt_hmac;
+
+/***************************************************************************/
+
+static void mz_crypt_hmac_free(void *handle) {
+ mz_crypt_hmac *hmac = (mz_crypt_hmac *)handle;
+ memset(&hmac->ctx, 0, sizeof(hmac->ctx));
+}
+
+void mz_crypt_hmac_reset(void *handle) {
+ mz_crypt_hmac *hmac = (mz_crypt_hmac *)handle;
+ mz_crypt_hmac_free(handle);
+ hmac->error = 0;
+}
+
+int32_t mz_crypt_hmac_init(void *handle, const void *key, int32_t key_length) {
+ mz_crypt_hmac *hmac = (mz_crypt_hmac *)handle;
+ CCHmacAlgorithm algorithm = 0;
+
+ if (!hmac || !key)
+ return MZ_PARAM_ERROR;
+
+ mz_crypt_hmac_reset(handle);
+
+ if (hmac->algorithm == MZ_HASH_SHA1)
+ algorithm = kCCHmacAlgSHA1;
+ else if (hmac->algorithm == MZ_HASH_SHA256)
+ algorithm = kCCHmacAlgSHA256;
+ else
+ return MZ_PARAM_ERROR;
+
+ CCHmacInit(&hmac->ctx, algorithm, key, key_length);
+ return MZ_OK;
+}
+
+int32_t mz_crypt_hmac_update(void *handle, const void *buf, int32_t size) {
+ mz_crypt_hmac *hmac = (mz_crypt_hmac *)handle;
+
+ if (!hmac || !buf)
+ return MZ_PARAM_ERROR;
+
+ CCHmacUpdate(&hmac->ctx, buf, size);
+ return MZ_OK;
+}
+
+int32_t mz_crypt_hmac_end(void *handle, uint8_t *digest, int32_t digest_size) {
+ mz_crypt_hmac *hmac = (mz_crypt_hmac *)handle;
+
+ if (!hmac || !digest)
+ return MZ_PARAM_ERROR;
+
+ if (hmac->algorithm == MZ_HASH_SHA1) {
+ if (digest_size < MZ_HASH_SHA1_SIZE)
+ return MZ_BUF_ERROR;
+ CCHmacFinal(&hmac->ctx, digest);
+ } else {
+ if (digest_size < MZ_HASH_SHA256_SIZE)
+ return MZ_BUF_ERROR;
+ CCHmacFinal(&hmac->ctx, digest);
+ }
+
+ return MZ_OK;
+}
+
+void mz_crypt_hmac_set_algorithm(void *handle, uint16_t algorithm) {
+ mz_crypt_hmac *hmac = (mz_crypt_hmac *)handle;
+ hmac->algorithm = algorithm;
+}
+
+int32_t mz_crypt_hmac_copy(void *src_handle, void *target_handle) {
+ mz_crypt_hmac *source = (mz_crypt_hmac *)src_handle;
+ mz_crypt_hmac *target = (mz_crypt_hmac *)target_handle;
+
+ if (!source || !target)
+ return MZ_PARAM_ERROR;
+
+ memcpy(&target->ctx, &source->ctx, sizeof(CCHmacContext));
+ return MZ_OK;
+}
+
+void *mz_crypt_hmac_create(void **handle) {
+ mz_crypt_hmac *hmac = NULL;
+
+ hmac = (mz_crypt_hmac *)calloc(1, sizeof(mz_crypt_hmac));
+ if (hmac)
+ hmac->algorithm = MZ_HASH_SHA256;
+ if (handle)
+ *handle = hmac;
+
+ return hmac;
+}
+
+void mz_crypt_hmac_delete(void **handle) {
+ mz_crypt_hmac *hmac = NULL;
+ if (!handle)
+ return;
+ hmac = (mz_crypt_hmac *)*handle;
+ if (hmac) {
+ mz_crypt_hmac_free(*handle);
+ free(hmac);
+ }
+ *handle = NULL;
+}
+
+/***************************************************************************/
+
+#if defined(MZ_ZIP_SIGNING)
+int32_t mz_crypt_sign(uint8_t *message, int32_t message_size, uint8_t *cert_data, int32_t cert_data_size,
+ const char *cert_pwd, uint8_t **signature, int32_t *signature_size) {
+ CFStringRef password_ref = NULL;
+ CFDictionaryRef options_dict = NULL;
+ CFDictionaryRef identity_trust = NULL;
+ CFDataRef signature_out = NULL;
+ CFDataRef pkcs12_data = NULL;
+ CFArrayRef items = 0;
+ SecIdentityRef identity = NULL;
+ SecTrustRef trust = NULL;
+ OSStatus status = noErr;
+ const void *options_key[2] = {kSecImportExportPassphrase, kSecReturnRef};
+ const void *options_values[2] = {0, kCFBooleanTrue};
+ int32_t err = MZ_SIGN_ERROR;
+
+ if (!message || !cert_data || !signature || !signature_size)
+ return MZ_PARAM_ERROR;
+
+ *signature = NULL;
+ *signature_size = 0;
+
+ password_ref = CFStringCreateWithCString(0, cert_pwd, kCFStringEncodingUTF8);
+ options_values[0] = password_ref;
+
+ options_dict = CFDictionaryCreate(0, options_key, options_values, 2, 0, 0);
+ if (options_dict)
+ pkcs12_data = CFDataCreate(0, cert_data, cert_data_size);
+ if (pkcs12_data)
+ status = SecPKCS12Import(pkcs12_data, options_dict, &items);
+ if (status == noErr)
+ identity_trust = CFArrayGetValueAtIndex(items, 0);
+ if (identity_trust)
+ identity = (SecIdentityRef)CFDictionaryGetValue(identity_trust, kSecImportItemIdentity);
+ if (identity)
+ trust = (SecTrustRef)CFDictionaryGetValue(identity_trust, kSecImportItemTrust);
+ if (trust) {
+ status = CMSEncodeContent(identity, NULL, NULL, FALSE, 0, message, message_size, &signature_out);
+
+ if (status == errSecSuccess) {
+ *signature_size = CFDataGetLength(signature_out);
+ *signature = (uint8_t *)malloc(*signature_size);
+
+ memcpy(*signature, CFDataGetBytePtr(signature_out), *signature_size);
+
+ err = MZ_OK;
+ }
+ }
+
+ if (signature_out)
+ CFRelease(signature_out);
+ if (items)
+ CFRelease(items);
+ if (pkcs12_data)
+ CFRelease(pkcs12_data);
+ if (options_dict)
+ CFRelease(options_dict);
+ if (password_ref)
+ CFRelease(password_ref);
+
+ return err;
+}
+
+int32_t mz_crypt_sign_verify(uint8_t *message, int32_t message_size, uint8_t *signature, int32_t signature_size) {
+ CMSDecoderRef decoder = NULL;
+ CMSSignerStatus signer_status = 0;
+ CFDataRef message_out = NULL;
+ SecPolicyRef trust_policy = NULL;
+ OSStatus status = noErr;
+ OSStatus verify_status = noErr;
+ size_t signer_count = 0;
+ size_t i = 0;
+ int32_t err = MZ_SIGN_ERROR;
+
+ if (!message || !signature)
+ return MZ_PARAM_ERROR;
+
+ status = CMSDecoderCreate(&decoder);
+ if (status == errSecSuccess)
+ status = CMSDecoderUpdateMessage(decoder, signature, signature_size);
+ if (status == errSecSuccess)
+ status = CMSDecoderFinalizeMessage(decoder);
+ if (status == errSecSuccess)
+ trust_policy = SecPolicyCreateBasicX509();
+
+ if (status == errSecSuccess && trust_policy) {
+ CMSDecoderGetNumSigners(decoder, &signer_count);
+ if (signer_count > 0)
+ err = MZ_OK;
+ for (i = 0; i < signer_count; i += 1) {
+ status = CMSDecoderCopySignerStatus(decoder, i, trust_policy, TRUE, &signer_status, NULL, &verify_status);
+ if (status != errSecSuccess || verify_status != 0 || signer_status != kCMSSignerValid) {
+ err = MZ_SIGN_ERROR;
+ break;
+ }
+ }
+ }
+
+ if (err == MZ_OK) {
+ status = CMSDecoderCopyContent(decoder, &message_out);
+ if ((status != errSecSuccess) ||
+ (CFDataGetLength(message_out) != message_size) ||
+ (memcmp(message, CFDataGetBytePtr(message_out), message_size) != 0))
+ err = MZ_SIGN_ERROR;
+ }
+
+ if (trust_policy)
+ CFRelease(trust_policy);
+ if (decoder)
+ CFRelease(decoder);
+
+ return err;
+}
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_os.c b/ios/CodePush/SSZipArchive/minizip/mz_os.c
new file mode 100644
index 000000000..afbbdb40a
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_os.c
@@ -0,0 +1,348 @@
+/* mz_os.c -- System functions
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+ Copyright (C) 1998-2010 Gilles Vollant
+ https://www.winimage.com/zLibDll/minizip.html
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_crypt.h"
+#include "mz_os.h"
+#include "mz_strm.h"
+#include "mz_strm_os.h"
+
+#include /* tolower */
+
+/***************************************************************************/
+
+int32_t mz_path_combine(char *path, const char *join, int32_t max_path) {
+ int32_t path_len = 0;
+
+ if (!path || !join || !max_path)
+ return MZ_PARAM_ERROR;
+
+ path_len = (int32_t)strlen(path);
+
+ if (path_len == 0) {
+ strncpy(path, join, max_path - 1);
+ path[max_path - 1] = 0;
+ } else {
+ mz_path_append_slash(path, max_path, MZ_PATH_SLASH_PLATFORM);
+ path_len = (int32_t)strlen(path);
+ if (max_path > path_len)
+ strncat(path, join, max_path - path_len - 1);
+ }
+
+ return MZ_OK;
+}
+
+int32_t mz_path_append_slash(char *path, int32_t max_path, char slash) {
+ int32_t path_len = (int32_t)strlen(path);
+ if ((path_len + 2) >= max_path)
+ return MZ_BUF_ERROR;
+ if (path[path_len - 1] != '\\' && path[path_len - 1] != '/') {
+ path[path_len] = slash;
+ path[path_len + 1] = 0;
+ }
+ return MZ_OK;
+}
+
+int32_t mz_path_remove_slash(char *path) {
+ int32_t path_len = (int32_t)strlen(path);
+ while (path_len > 0) {
+ if (path[path_len - 1] == '\\' || path[path_len - 1] == '/')
+ path[path_len - 1] = 0;
+ else
+ break;
+
+ path_len -= 1;
+ }
+ return MZ_OK;
+}
+
+int32_t mz_path_has_slash(const char *path) {
+ int32_t path_len = (int32_t)strlen(path);
+ if (path[path_len - 1] != '\\' && path[path_len - 1] != '/')
+ return MZ_EXIST_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_path_convert_slashes(char *path, char slash) {
+ int32_t i = 0;
+
+ for (i = 0; i < (int32_t)strlen(path); i += 1) {
+ if (path[i] == '\\' || path[i] == '/')
+ path[i] = slash;
+ }
+ return MZ_OK;
+}
+
+int32_t mz_path_compare_wc(const char *path, const char *wildcard, uint8_t ignore_case) {
+ while (*path != 0) {
+ switch (*wildcard) {
+ case '*':
+
+ if (*(wildcard + 1) == 0)
+ return MZ_OK;
+
+ while (*path != 0) {
+ if (mz_path_compare_wc(path, (wildcard + 1), ignore_case) == MZ_OK)
+ return MZ_OK;
+
+ path += 1;
+ }
+
+ return MZ_EXIST_ERROR;
+
+ default:
+ /* Ignore differences in path slashes on platforms */
+ if ((*path == '\\' && *wildcard == '/') || (*path == '/' && *wildcard == '\\'))
+ break;
+
+ if (ignore_case) {
+ if (tolower(*path) != tolower(*wildcard))
+ return MZ_EXIST_ERROR;
+ } else {
+ if (*path != *wildcard)
+ return MZ_EXIST_ERROR;
+ }
+
+ break;
+ }
+
+ path += 1;
+ wildcard += 1;
+ }
+
+ if ((*wildcard != 0) && (*wildcard != '*'))
+ return MZ_EXIST_ERROR;
+
+ return MZ_OK;
+}
+
+int32_t mz_path_resolve(const char *path, char *output, int32_t max_output) {
+ const char *source = path;
+ const char *check = output;
+ char *target = output;
+
+ if (max_output <= 0)
+ return MZ_PARAM_ERROR;
+
+ while (*source != 0 && max_output > 1) {
+ check = source;
+ if ((*check == '\\') || (*check == '/'))
+ check += 1;
+
+ if ((source == path) || (target == output) || (check != source)) {
+ /* Skip double paths */
+ if ((*check == '\\') || (*check == '/')) {
+ source += 1;
+ continue;
+ }
+ if (*check == '.') {
+ check += 1;
+
+ /* Remove . if at end of string and not at the beginning */
+ if ((*check == 0) && (source != path && target != output)) {
+ /* Copy last slash */
+ *target = *source;
+ target += 1;
+ max_output -= 1;
+ source += (check - source);
+ continue;
+ }
+ /* Remove . if not at end of string */
+ else if ((*check == '\\') || (*check == '/')) {
+ source += (check - source);
+ /* Skip slash if at beginning of string */
+ if (target == output && *source != 0)
+ source += 1;
+ continue;
+ }
+ /* Go to parent directory .. */
+ else if (*check == '.') {
+ check += 1;
+ if ((*check == 0) || (*check == '\\' || *check == '/')) {
+ source += (check - source);
+
+ /* Search backwards for previous slash */
+ if (target != output) {
+ target -= 1;
+ do {
+ if ((*target == '\\') || (*target == '/'))
+ break;
+
+ target -= 1;
+ max_output += 1;
+ } while (target > output);
+ }
+
+ if ((target == output) && (*source != 0))
+ source += 1;
+ if ((*target == '\\' || *target == '/') && (*source == 0))
+ target += 1;
+
+ *target = 0;
+ continue;
+ }
+ }
+ }
+ }
+
+ *target = *source;
+
+ source += 1;
+ target += 1;
+ max_output -= 1;
+ }
+
+ *target = 0;
+
+ if (*path == 0)
+ return MZ_INTERNAL_ERROR;
+
+ return MZ_OK;
+}
+
+int32_t mz_path_remove_filename(char *path) {
+ char *path_ptr = NULL;
+
+ if (!path)
+ return MZ_PARAM_ERROR;
+
+ path_ptr = path + strlen(path) - 1;
+
+ while (path_ptr > path) {
+ if ((*path_ptr == '/') || (*path_ptr == '\\')) {
+ *path_ptr = 0;
+ break;
+ }
+
+ path_ptr -= 1;
+ }
+
+ if (path_ptr == path)
+ *path_ptr = 0;
+
+ return MZ_OK;
+}
+
+int32_t mz_path_remove_extension(char *path) {
+ char *path_ptr = NULL;
+
+ if (!path)
+ return MZ_PARAM_ERROR;
+
+ path_ptr = path + strlen(path) - 1;
+
+ while (path_ptr > path) {
+ if ((*path_ptr == '/') || (*path_ptr == '\\'))
+ break;
+ if (*path_ptr == '.') {
+ *path_ptr = 0;
+ break;
+ }
+
+ path_ptr -= 1;
+ }
+
+ if (path_ptr == path)
+ *path_ptr = 0;
+
+ return MZ_OK;
+}
+
+int32_t mz_path_get_filename(const char *path, const char **filename) {
+ const char *match = NULL;
+
+ if (!path || !filename)
+ return MZ_PARAM_ERROR;
+
+ *filename = NULL;
+
+ for (match = path; *match != 0; match += 1) {
+ if ((*match == '\\') || (*match == '/'))
+ *filename = match + 1;
+ }
+
+ if (!*filename)
+ return MZ_EXIST_ERROR;
+
+ return MZ_OK;
+}
+
+int32_t mz_dir_make(const char *path) {
+ int32_t err = MZ_OK;
+ char *current_dir = NULL;
+ char *match = NULL;
+ char hold = 0;
+
+ current_dir = strdup(path);
+ if (!current_dir)
+ return MZ_MEM_ERROR;
+
+ mz_path_remove_slash(current_dir);
+
+ err = mz_os_make_dir(current_dir);
+ if (err != MZ_OK) {
+ match = current_dir + 1;
+ while (1) {
+ while (*match != 0 && *match != '\\' && *match != '/')
+ match += 1;
+ hold = *match;
+ *match = 0;
+
+ err = mz_os_make_dir(current_dir);
+ if (err != MZ_OK)
+ break;
+ if (hold == 0)
+ break;
+
+ *match = hold;
+ match += 1;
+ }
+ }
+
+ free(current_dir);
+ return err;
+}
+
+int32_t mz_file_get_crc(const char *path, uint32_t *result_crc) {
+ void *stream = NULL;
+ uint32_t crc32 = 0;
+ int32_t read = 0;
+ int32_t err = MZ_OK;
+ uint8_t buf[16384];
+
+ mz_stream_os_create(&stream);
+
+ err = mz_stream_os_open(stream, path, MZ_OPEN_MODE_READ);
+
+ if (err == MZ_OK) {
+ do {
+ read = mz_stream_os_read(stream, buf, sizeof(buf));
+
+ if (read < 0) {
+ err = read;
+ break;
+ }
+
+ crc32 = mz_crypt_crc32_update(crc32, buf, read);
+ } while ((err == MZ_OK) && (read > 0));
+
+ mz_stream_os_close(stream);
+ }
+
+ *result_crc = crc32;
+
+ mz_stream_os_delete(&stream);
+
+ return err;
+}
+
+/***************************************************************************/
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_os.h b/ios/CodePush/SSZipArchive/minizip/mz_os.h
new file mode 100644
index 000000000..4505bc393
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_os.h
@@ -0,0 +1,176 @@
+/* mz_os.h -- System functions
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_OS_H
+#define MZ_OS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+#if defined(__APPLE__)
+# define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_OSX_DARWIN)
+#elif defined(__riscos__)
+# define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_RISCOS)
+#elif defined(_WIN32)
+# define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_WINDOWS_NTFS)
+#else
+# define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_UNIX)
+#endif
+
+#if defined(HAVE_LZMA) || defined(HAVE_LIBCOMP)
+# define MZ_VERSION_MADEBY_ZIP_VERSION (63)
+#elif defined(HAVE_WZAES)
+# define MZ_VERSION_MADEBY_ZIP_VERSION (51)
+#elif defined(HAVE_BZIP2)
+# define MZ_VERSION_MADEBY_ZIP_VERSION (46)
+#else
+# define MZ_VERSION_MADEBY_ZIP_VERSION (45)
+#endif
+
+#define MZ_VERSION_MADEBY ((MZ_VERSION_MADEBY_HOST_SYSTEM << 8) | \
+ (MZ_VERSION_MADEBY_ZIP_VERSION))
+
+#define MZ_PATH_SLASH_UNIX ('/')
+#define MZ_PATH_SLASH_WINDOWS ('\\')
+#if defined(_WIN32)
+# define MZ_PATH_SLASH_PLATFORM (MZ_PATH_SLASH_WINDOWS)
+#else
+# define MZ_PATH_SLASH_PLATFORM (MZ_PATH_SLASH_UNIX)
+#endif
+
+/***************************************************************************/
+
+#if defined(_WIN32)
+struct dirent {
+ char d_name[256];
+};
+typedef void* DIR;
+#else
+#include
+#endif
+
+/***************************************************************************/
+/* Shared functions */
+
+int32_t mz_path_combine(char *path, const char *join, int32_t max_path);
+/* Combines two paths */
+
+int32_t mz_path_append_slash(char *path, int32_t max_path, char slash);
+/* Appends a path slash on to the end of the path */
+
+int32_t mz_path_remove_slash(char *path);
+/* Removes a path slash from the end of the path */
+
+int32_t mz_path_has_slash(const char *path);
+/* Returns whether or not the path ends with slash */
+
+int32_t mz_path_convert_slashes(char *path, char slash);
+/* Converts the slashes in a path */
+
+int32_t mz_path_compare_wc(const char *path, const char *wildcard, uint8_t ignore_case);
+/* Compare two paths with wildcard */
+
+int32_t mz_path_resolve(const char *path, char *target, int32_t max_target);
+/* Resolves path */
+
+int32_t mz_path_remove_filename(char *path);
+/* Remove the filename from a path */
+
+int32_t mz_path_remove_extension(char *path);
+/* Remove the extension from a path */
+
+int32_t mz_path_get_filename(const char *path, const char **filename);
+/* Get the filename from a path */
+
+int32_t mz_dir_make(const char *path);
+/* Creates a directory recursively */
+
+int32_t mz_file_get_crc(const char *path, uint32_t *result_crc);
+/* Gets the crc32 hash of a file */
+
+/***************************************************************************/
+/* Platform specific functions */
+
+wchar_t *mz_os_unicode_string_create(const char *string, int32_t encoding);
+/* Create unicode string from a utf8 string */
+
+void mz_os_unicode_string_delete(wchar_t **string);
+/* Delete a unicode string that was created */
+
+uint8_t *mz_os_utf8_string_create(const char *string, int32_t encoding);
+/* Create a utf8 string from a string with another encoding */
+
+void mz_os_utf8_string_delete(uint8_t **string);
+/* Delete a utf8 string that was created */
+
+int32_t mz_os_rand(uint8_t *buf, int32_t size);
+/* Random number generator (not cryptographically secure) */
+
+int32_t mz_os_rename(const char *source_path, const char *target_path);
+/* Rename a file */
+
+int32_t mz_os_unlink(const char *path);
+/* Delete an existing file */
+
+int32_t mz_os_file_exists(const char *path);
+/* Check to see if a file exists */
+
+int64_t mz_os_get_file_size(const char *path);
+/* Gets the length of a file */
+
+int32_t mz_os_get_file_date(const char *path, time_t *modified_date, time_t *accessed_date, time_t *creation_date);
+/* Gets a file's modified, access, and creation dates if supported */
+
+int32_t mz_os_set_file_date(const char *path, time_t modified_date, time_t accessed_date, time_t creation_date);
+/* Sets a file's modified, access, and creation dates if supported */
+
+int32_t mz_os_get_file_attribs(const char *path, uint32_t *attributes);
+/* Gets a file's attributes */
+
+int32_t mz_os_set_file_attribs(const char *path, uint32_t attributes);
+/* Sets a file's attributes */
+
+int32_t mz_os_make_dir(const char *path);
+/* Recursively creates a directory */
+
+DIR* mz_os_open_dir(const char *path);
+/* Opens a directory for listing */
+struct
+dirent* mz_os_read_dir(DIR *dir);
+/* Reads a directory listing entry */
+
+int32_t mz_os_close_dir(DIR *dir);
+/* Closes a directory that has been opened for listing */
+
+int32_t mz_os_is_dir(const char *path);
+/* Checks to see if path is a directory */
+
+int32_t mz_os_is_symlink(const char *path);
+/* Checks to see if path is a symbolic link */
+
+int32_t mz_os_make_symlink(const char *path, const char *target_path);
+/* Creates a symbolic link pointing to a target */
+
+int32_t mz_os_read_symlink(const char *path, char *target_path, int32_t max_target_path);
+/* Gets the target path for a symbolic link */
+
+uint64_t mz_os_ms_time(void);
+/* Gets the time in milliseconds */
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_os_posix.c b/ios/CodePush/SSZipArchive/minizip/mz_os_posix.c
new file mode 100644
index 000000000..980ffbf1e
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_os_posix.c
@@ -0,0 +1,350 @@
+/* mz_os_posix.c -- System functions for posix
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_strm.h"
+#include "mz_os.h"
+
+#include /* rename */
+#include
+#if defined(HAVE_ICONV)
+#include
+#endif
+
+#include
+#include
+
+#ifndef _WIN32
+# include
+# include
+#endif
+#if defined(__APPLE__)
+# include
+# include
+#endif
+
+#if defined(HAVE_GETRANDOM)
+# include
+#endif
+#if defined(HAVE_LIBBSD)
+# include /* arc4random_buf */
+#endif
+
+/***************************************************************************/
+
+#if defined(HAVE_ICONV)
+uint8_t *mz_os_utf8_string_create(const char *string, int32_t encoding) {
+ iconv_t cd;
+ const char *from_encoding = NULL;
+ size_t result = 0;
+ size_t string_length = 0;
+ size_t string_utf8_size = 0;
+ uint8_t *string_utf8 = NULL;
+ uint8_t *string_utf8_ptr = NULL;
+
+ if (!string)
+ return NULL;
+
+ if (encoding == MZ_ENCODING_CODEPAGE_437)
+ from_encoding = "CP437";
+ else if (encoding == MZ_ENCODING_CODEPAGE_932)
+ from_encoding = "CP932";
+ else if (encoding == MZ_ENCODING_CODEPAGE_936)
+ from_encoding = "CP936";
+ else if (encoding == MZ_ENCODING_CODEPAGE_950)
+ from_encoding = "CP950";
+ else if (encoding == MZ_ENCODING_UTF8)
+ from_encoding = "UTF-8";
+ else
+ return NULL;
+
+ cd = iconv_open("UTF-8", from_encoding);
+ if (cd == (iconv_t)-1)
+ return NULL;
+
+ string_length = strlen(string);
+ string_utf8_size = string_length * 2;
+ string_utf8 = (uint8_t *)calloc((int32_t)(string_utf8_size + 1), sizeof(char));
+ string_utf8_ptr = string_utf8;
+
+ if (string_utf8) {
+ result = iconv(cd, (char **)&string, &string_length,
+ (char **)&string_utf8_ptr, &string_utf8_size);
+ }
+
+ iconv_close(cd);
+
+ if (result == (size_t)-1) {
+ free(string_utf8);
+ string_utf8 = NULL;
+ }
+
+ return string_utf8;
+}
+#else
+uint8_t *mz_os_utf8_string_create(const char *string, int32_t encoding) {
+ return (uint8_t *)strdup(string);
+}
+#endif
+
+void mz_os_utf8_string_delete(uint8_t **string) {
+ if (string) {
+ free(*string);
+ *string = NULL;
+ }
+}
+
+/***************************************************************************/
+
+#if defined(HAVE_GETRANDOM)
+int32_t mz_os_rand(uint8_t *buf, int32_t size) {
+ int32_t left = size;
+ int32_t written = 0;
+
+ while (left > 0) {
+ written = getrandom(buf, left, 0);
+ if (written < 0)
+ return MZ_INTERNAL_ERROR;
+
+ buf += written;
+ left -= written;
+ }
+ return size - left;
+}
+#elif defined(HAVE_ARC4RANDOM_BUF)
+int32_t mz_os_rand(uint8_t *buf, int32_t size) {
+ if (size < 0)
+ return 0;
+ arc4random_buf(buf, (uint32_t)size);
+ return size;
+}
+#elif defined(HAVE_ARC4RANDOM)
+int32_t mz_os_rand(uint8_t *buf, int32_t size) {
+ int32_t left = size;
+ for (; left > 2; left -= 3, buf += 3) {
+ uint32_t val = arc4random();
+
+ buf[0] = (val) & 0xFF;
+ buf[1] = (val >> 8) & 0xFF;
+ buf[2] = (val >> 16) & 0xFF;
+ }
+ for (; left > 0; left--, buf++) {
+ *buf = arc4random() & 0xFF;
+ }
+ return size - left;
+}
+#else
+int32_t mz_os_rand(uint8_t *buf, int32_t size) {
+ static unsigned calls = 0;
+ int32_t i = 0;
+
+ /* Ensure different random header each time */
+ if (++calls == 1) {
+ #define PI_SEED 3141592654UL
+ srand((unsigned)(time(NULL) ^ PI_SEED));
+ }
+
+ while (i < size)
+ buf[i++] = (rand() >> 7) & 0xff;
+
+ return size;
+}
+#endif
+
+int32_t mz_os_rename(const char *source_path, const char *target_path) {
+ if (rename(source_path, target_path) == -1)
+ return MZ_EXIST_ERROR;
+
+ return MZ_OK;
+}
+
+int32_t mz_os_unlink(const char *path) {
+ if (unlink(path) == -1)
+ return MZ_EXIST_ERROR;
+
+ return MZ_OK;
+}
+
+int32_t mz_os_file_exists(const char *path) {
+ struct stat path_stat;
+
+ memset(&path_stat, 0, sizeof(path_stat));
+ if (stat(path, &path_stat) == 0)
+ return MZ_OK;
+ return MZ_EXIST_ERROR;
+}
+
+int64_t mz_os_get_file_size(const char *path) {
+ struct stat path_stat;
+
+ memset(&path_stat, 0, sizeof(path_stat));
+ if (stat(path, &path_stat) == 0) {
+ /* Stat returns size taken up by directory entry, so return 0 */
+ if (S_ISDIR(path_stat.st_mode))
+ return 0;
+
+ return path_stat.st_size;
+ }
+
+ return 0;
+}
+
+int32_t mz_os_get_file_date(const char *path, time_t *modified_date, time_t *accessed_date, time_t *creation_date) {
+ struct stat path_stat;
+ char *name = NULL;
+ int32_t err = MZ_INTERNAL_ERROR;
+
+ memset(&path_stat, 0, sizeof(path_stat));
+
+ if (strcmp(path, "-") != 0) {
+ /* Not all systems allow stat'ing a file with / appended */
+ name = strdup(path);
+ mz_path_remove_slash(name);
+
+ if (stat(name, &path_stat) == 0) {
+ if (modified_date)
+ *modified_date = path_stat.st_mtime;
+ if (accessed_date)
+ *accessed_date = path_stat.st_atime;
+ /* Creation date not supported */
+ if (creation_date)
+ *creation_date = 0;
+
+ err = MZ_OK;
+ }
+
+ free(name);
+ }
+
+ return err;
+}
+
+int32_t mz_os_set_file_date(const char *path, time_t modified_date, time_t accessed_date, time_t creation_date) {
+ struct utimbuf ut;
+
+ ut.actime = accessed_date;
+ ut.modtime = modified_date;
+
+ /* Creation date not supported */
+ MZ_UNUSED(creation_date);
+
+ if (utime(path, &ut) != 0)
+ return MZ_INTERNAL_ERROR;
+
+ return MZ_OK;
+}
+
+int32_t mz_os_get_file_attribs(const char *path, uint32_t *attributes) {
+ struct stat path_stat;
+ int32_t err = MZ_OK;
+
+ memset(&path_stat, 0, sizeof(path_stat));
+ if (lstat(path, &path_stat) == -1)
+ err = MZ_INTERNAL_ERROR;
+ *attributes = path_stat.st_mode;
+ return err;
+}
+
+int32_t mz_os_set_file_attribs(const char *path, uint32_t attributes) {
+ int32_t err = MZ_OK;
+
+ if (chmod(path, (mode_t)attributes) == -1)
+ err = MZ_INTERNAL_ERROR;
+
+ return err;
+}
+
+int32_t mz_os_make_dir(const char *path) {
+ int32_t err = 0;
+
+ err = mkdir(path, 0755);
+
+ if (err != 0 && errno != EEXIST)
+ return MZ_INTERNAL_ERROR;
+
+ return MZ_OK;
+}
+
+DIR* mz_os_open_dir(const char *path) {
+ return opendir(path);
+}
+
+struct dirent* mz_os_read_dir(DIR *dir) {
+ if (!dir)
+ return NULL;
+ return readdir(dir);
+}
+
+int32_t mz_os_close_dir(DIR *dir) {
+ if (!dir)
+ return MZ_PARAM_ERROR;
+ if (closedir(dir) == -1)
+ return MZ_INTERNAL_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_os_is_dir(const char *path) {
+ struct stat path_stat;
+
+ memset(&path_stat, 0, sizeof(path_stat));
+ stat(path, &path_stat);
+ if (S_ISDIR(path_stat.st_mode))
+ return MZ_OK;
+
+ return MZ_EXIST_ERROR;
+}
+
+int32_t mz_os_is_symlink(const char *path) {
+ struct stat path_stat;
+
+ memset(&path_stat, 0, sizeof(path_stat));
+ lstat(path, &path_stat);
+ if (S_ISLNK(path_stat.st_mode))
+ return MZ_OK;
+
+ return MZ_EXIST_ERROR;
+}
+
+int32_t mz_os_make_symlink(const char *path, const char *target_path) {
+ if (symlink(target_path, path) != 0)
+ return MZ_INTERNAL_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_os_read_symlink(const char *path, char *target_path, int32_t max_target_path) {
+ size_t length = 0;
+
+ length = (size_t)readlink(path, target_path, max_target_path - 1);
+ if (length == (size_t)-1)
+ return MZ_EXIST_ERROR;
+
+ target_path[length] = 0;
+ return MZ_OK;
+}
+
+uint64_t mz_os_ms_time(void) {
+ struct timespec ts;
+
+#if defined(__APPLE__)
+ clock_serv_t cclock;
+ mach_timespec_t mts;
+
+ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
+ clock_get_time(cclock, &mts);
+ mach_port_deallocate(mach_task_self(), cclock);
+
+ ts.tv_sec = mts.tv_sec;
+ ts.tv_nsec = mts.tv_nsec;
+#else
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+#endif
+
+ return ((uint64_t)ts.tv_sec * 1000) + ((uint64_t)ts.tv_nsec / 1000000);
+}
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm.c b/ios/CodePush/SSZipArchive/minizip/mz_strm.c
new file mode 100644
index 000000000..35d4c62fd
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm.c
@@ -0,0 +1,556 @@
+/* mz_strm.c -- Stream interface
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_strm.h"
+
+/***************************************************************************/
+
+#define MZ_STREAM_FIND_SIZE (1024)
+
+/***************************************************************************/
+
+int32_t mz_stream_open(void *stream, const char *path, int32_t mode) {
+ mz_stream *strm = (mz_stream *)stream;
+ if (!strm || !strm->vtbl || !strm->vtbl->open)
+ return MZ_STREAM_ERROR;
+ return strm->vtbl->open(strm, path, mode);
+}
+
+int32_t mz_stream_is_open(void *stream) {
+ mz_stream *strm = (mz_stream *)stream;
+ if (!strm || !strm->vtbl || !strm->vtbl->is_open)
+ return MZ_STREAM_ERROR;
+ return strm->vtbl->is_open(strm);
+}
+
+int32_t mz_stream_read(void *stream, void *buf, int32_t size) {
+ mz_stream *strm = (mz_stream *)stream;
+ if (!strm || !strm->vtbl || !strm->vtbl->read)
+ return MZ_PARAM_ERROR;
+ if (mz_stream_is_open(stream) != MZ_OK)
+ return MZ_STREAM_ERROR;
+ return strm->vtbl->read(strm, buf, size);
+}
+
+static int32_t mz_stream_read_value(void *stream, uint64_t *value, int32_t len) {
+ uint8_t buf[8];
+ int32_t n = 0;
+ int32_t i = 0;
+
+ *value = 0;
+ if (mz_stream_read(stream, buf, len) == len) {
+ for (n = 0; n < len; n += 1, i += 8)
+ *value += ((uint64_t)buf[n]) << i;
+ } else if (mz_stream_error(stream))
+ return MZ_STREAM_ERROR;
+ else
+ return MZ_END_OF_STREAM;
+
+ return MZ_OK;
+}
+
+int32_t mz_stream_read_uint8(void *stream, uint8_t *value) {
+ int32_t err = MZ_OK;
+ uint64_t value64 = 0;
+
+ *value = 0;
+ err = mz_stream_read_value(stream, &value64, sizeof(uint8_t));
+ if (err == MZ_OK)
+ *value = (uint8_t)value64;
+ return err;
+}
+
+int32_t mz_stream_read_uint16(void *stream, uint16_t *value) {
+ int32_t err = MZ_OK;
+ uint64_t value64 = 0;
+
+ *value = 0;
+ err = mz_stream_read_value(stream, &value64, sizeof(uint16_t));
+ if (err == MZ_OK)
+ *value = (uint16_t)value64;
+ return err;
+}
+
+int32_t mz_stream_read_uint32(void *stream, uint32_t *value) {
+ int32_t err = MZ_OK;
+ uint64_t value64 = 0;
+
+ *value = 0;
+ err = mz_stream_read_value(stream, &value64, sizeof(uint32_t));
+ if (err == MZ_OK)
+ *value = (uint32_t)value64;
+ return err;
+}
+
+int32_t mz_stream_read_int64(void *stream, int64_t *value) {
+ return mz_stream_read_value(stream, (uint64_t *)value, sizeof(uint64_t));
+}
+
+int32_t mz_stream_read_uint64(void *stream, uint64_t *value) {
+ return mz_stream_read_value(stream, value, sizeof(uint64_t));
+}
+
+int32_t mz_stream_write(void *stream, const void *buf, int32_t size) {
+ mz_stream *strm = (mz_stream *)stream;
+ if (size == 0)
+ return size;
+ if (!strm || !strm->vtbl || !strm->vtbl->write)
+ return MZ_PARAM_ERROR;
+ if (mz_stream_is_open(stream) != MZ_OK)
+ return MZ_STREAM_ERROR;
+ return strm->vtbl->write(strm, buf, size);
+}
+
+static int32_t mz_stream_write_value(void *stream, uint64_t value, int32_t len) {
+ uint8_t buf[8];
+ int32_t n = 0;
+
+ for (n = 0; n < len; n += 1) {
+ buf[n] = (uint8_t)(value & 0xff);
+ value >>= 8;
+ }
+
+ if (value != 0) {
+ /* Data overflow - hack for ZIP64 (X Roche) */
+ for (n = 0; n < len; n += 1)
+ buf[n] = 0xff;
+ }
+
+ if (mz_stream_write(stream, buf, len) != len)
+ return MZ_STREAM_ERROR;
+
+ return MZ_OK;
+}
+
+int32_t mz_stream_write_uint8(void *stream, uint8_t value) {
+ return mz_stream_write_value(stream, value, sizeof(uint8_t));
+}
+
+int32_t mz_stream_write_uint16(void *stream, uint16_t value) {
+ return mz_stream_write_value(stream, value, sizeof(uint16_t));
+}
+
+int32_t mz_stream_write_uint32(void *stream, uint32_t value) {
+ return mz_stream_write_value(stream, value, sizeof(uint32_t));
+}
+
+int32_t mz_stream_write_int64(void *stream, int64_t value) {
+ return mz_stream_write_value(stream, (uint64_t)value, sizeof(uint64_t));
+}
+
+int32_t mz_stream_write_uint64(void *stream, uint64_t value) {
+ return mz_stream_write_value(stream, value, sizeof(uint64_t));
+}
+
+int32_t mz_stream_copy(void *target, void *source, int32_t len) {
+ return mz_stream_copy_stream(target, NULL, source, NULL, len);
+}
+
+int32_t mz_stream_copy_to_end(void *target, void *source) {
+ return mz_stream_copy_stream_to_end(target, NULL, source, NULL);
+}
+
+int32_t mz_stream_copy_stream(void *target, mz_stream_write_cb write_cb, void *source,
+ mz_stream_read_cb read_cb, int32_t len) {
+ uint8_t buf[16384];
+ int32_t bytes_to_copy = 0;
+ int32_t read = 0;
+ int32_t written = 0;
+
+ if (!write_cb)
+ write_cb = mz_stream_write;
+ if (!read_cb)
+ read_cb = mz_stream_read;
+
+ while (len > 0) {
+ bytes_to_copy = len;
+ if (bytes_to_copy > (int32_t)sizeof(buf))
+ bytes_to_copy = sizeof(buf);
+ read = read_cb(source, buf, bytes_to_copy);
+ if (read <= 0)
+ return MZ_STREAM_ERROR;
+ written = write_cb(target, buf, read);
+ if (written != read)
+ return MZ_STREAM_ERROR;
+ len -= read;
+ }
+
+ return MZ_OK;
+}
+
+int32_t mz_stream_copy_stream_to_end(void *target, mz_stream_write_cb write_cb, void *source,
+ mz_stream_read_cb read_cb) {
+ uint8_t buf[16384];
+ int32_t read = 0;
+ int32_t written = 0;
+
+ if (!write_cb)
+ write_cb = mz_stream_write;
+ if (!read_cb)
+ read_cb = mz_stream_read;
+
+ read = read_cb(source, buf, sizeof(buf));
+ while (read > 0) {
+ written = write_cb(target, buf, read);
+ if (written != read)
+ return MZ_STREAM_ERROR;
+ read = read_cb(source, buf, sizeof(buf));
+ }
+
+ if (read < 0)
+ return MZ_STREAM_ERROR;
+
+ return MZ_OK;
+}
+
+int64_t mz_stream_tell(void *stream) {
+ mz_stream *strm = (mz_stream *)stream;
+ if (!strm || !strm->vtbl || !strm->vtbl->tell)
+ return MZ_PARAM_ERROR;
+ if (mz_stream_is_open(stream) != MZ_OK)
+ return MZ_STREAM_ERROR;
+ return strm->vtbl->tell(strm);
+}
+
+int32_t mz_stream_seek(void *stream, int64_t offset, int32_t origin) {
+ mz_stream *strm = (mz_stream *)stream;
+ if (!strm || !strm->vtbl || !strm->vtbl->seek)
+ return MZ_PARAM_ERROR;
+ if (mz_stream_is_open(stream) != MZ_OK)
+ return MZ_STREAM_ERROR;
+ if (origin == MZ_SEEK_SET && offset < 0)
+ return MZ_SEEK_ERROR;
+ return strm->vtbl->seek(strm, offset, origin);
+}
+
+int32_t mz_stream_find(void *stream, const void *find, int32_t find_size, int64_t max_seek, int64_t *position) {
+ uint8_t buf[MZ_STREAM_FIND_SIZE];
+ int32_t buf_pos = 0;
+ int32_t read_size = sizeof(buf);
+ int32_t read = 0;
+ int64_t read_pos = 0;
+ int64_t start_pos = 0;
+ int64_t disk_pos = 0;
+ int32_t i = 0;
+ uint8_t first = 1;
+ int32_t err = MZ_OK;
+
+ if (!stream || !find || !position)
+ return MZ_PARAM_ERROR;
+ if (find_size < 0 || find_size >= (int32_t)sizeof(buf))
+ return MZ_PARAM_ERROR;
+
+ *position = -1;
+
+ start_pos = mz_stream_tell(stream);
+
+ while (read_pos < max_seek) {
+ if (read_size > (int32_t)(max_seek - read_pos - buf_pos) && (max_seek - read_pos - buf_pos) < (int64_t)sizeof(buf))
+ read_size = (int32_t)(max_seek - read_pos - buf_pos);
+
+ read = mz_stream_read(stream, buf + buf_pos, read_size);
+ if ((read <= 0) || (read + buf_pos < find_size))
+ break;
+
+ for (i = 0; i <= read + buf_pos - find_size; i += 1) {
+ if (memcmp(&buf[i], find, find_size) != 0)
+ continue;
+
+ disk_pos = mz_stream_tell(stream);
+
+ /* Seek to position on disk where the data was found */
+ err = mz_stream_seek(stream, disk_pos - ((int64_t)read + buf_pos - i), MZ_SEEK_SET);
+ if (err != MZ_OK)
+ return MZ_EXIST_ERROR;
+
+ *position = start_pos + read_pos + i;
+ return MZ_OK;
+ }
+
+ if (first) {
+ read -= find_size;
+ read_size -= find_size;
+ buf_pos = find_size;
+ first = 0;
+ }
+
+ memmove(buf, buf + read, find_size);
+ read_pos += read;
+ }
+
+ return MZ_EXIST_ERROR;
+}
+
+int32_t mz_stream_find_reverse(void *stream, const void *find, int32_t find_size, int64_t max_seek, int64_t *position) {
+ uint8_t buf[MZ_STREAM_FIND_SIZE];
+ int32_t buf_pos = 0;
+ int32_t read_size = MZ_STREAM_FIND_SIZE;
+ int64_t read_pos = 0;
+ int32_t read = 0;
+ int64_t start_pos = 0;
+ int64_t disk_pos = 0;
+ uint8_t first = 1;
+ int32_t i = 0;
+ int32_t err = MZ_OK;
+
+ if (!stream || !find || !position)
+ return MZ_PARAM_ERROR;
+ if (find_size < 0 || find_size >= (int32_t)sizeof(buf))
+ return MZ_PARAM_ERROR;
+
+ *position = -1;
+
+ start_pos = mz_stream_tell(stream);
+
+ while (read_pos < max_seek) {
+ if (read_size > (int32_t)(max_seek - read_pos) && (max_seek - read_pos) < (int64_t)sizeof(buf))
+ read_size = (int32_t)(max_seek - read_pos);
+
+ if (mz_stream_seek(stream, start_pos - (read_pos + read_size), MZ_SEEK_SET) != MZ_OK)
+ break;
+ read = mz_stream_read(stream, buf, read_size);
+ if ((read <= 0) || (read + buf_pos < find_size))
+ break;
+ if (read + buf_pos < MZ_STREAM_FIND_SIZE)
+ memmove(buf + MZ_STREAM_FIND_SIZE - (read + buf_pos), buf, read);
+
+ for (i = find_size; i <= (read + buf_pos); i += 1) {
+ if (memcmp(&buf[MZ_STREAM_FIND_SIZE - i], find, find_size) != 0)
+ continue;
+
+ disk_pos = mz_stream_tell(stream);
+
+ /* Seek to position on disk where the data was found */
+ err = mz_stream_seek(stream, disk_pos + buf_pos - i, MZ_SEEK_SET);
+ if (err != MZ_OK)
+ return MZ_EXIST_ERROR;
+
+ *position = start_pos - (read_pos - buf_pos + i);
+ return MZ_OK;
+ }
+
+ if (first) {
+ read -= find_size;
+ read_size -= find_size;
+ buf_pos = find_size;
+ first = 0;
+ }
+
+ if (read == 0)
+ break;
+
+ memmove(buf + read_size, buf, find_size);
+ read_pos += read;
+ }
+
+ return MZ_EXIST_ERROR;
+}
+
+int32_t mz_stream_close(void *stream) {
+ mz_stream *strm = (mz_stream *)stream;
+ if (!strm || !strm->vtbl || !strm->vtbl->close)
+ return MZ_PARAM_ERROR;
+ if (mz_stream_is_open(stream) != MZ_OK)
+ return MZ_STREAM_ERROR;
+ return strm->vtbl->close(strm);
+}
+
+int32_t mz_stream_error(void *stream) {
+ mz_stream *strm = (mz_stream *)stream;
+ if (!strm || !strm->vtbl || !strm->vtbl->error)
+ return MZ_PARAM_ERROR;
+ return strm->vtbl->error(strm);
+}
+
+int32_t mz_stream_set_base(void *stream, void *base) {
+ mz_stream *strm = (mz_stream *)stream;
+ strm->base = (mz_stream *)base;
+ return MZ_OK;
+}
+
+void* mz_stream_get_interface(void *stream) {
+ mz_stream *strm = (mz_stream *)stream;
+ if (!strm || !strm->vtbl)
+ return NULL;
+ return (void *)strm->vtbl;
+}
+
+int32_t mz_stream_get_prop_int64(void *stream, int32_t prop, int64_t *value) {
+ mz_stream *strm = (mz_stream *)stream;
+ if (!strm || !strm->vtbl || !strm->vtbl->get_prop_int64)
+ return MZ_PARAM_ERROR;
+ return strm->vtbl->get_prop_int64(stream, prop, value);
+}
+
+int32_t mz_stream_set_prop_int64(void *stream, int32_t prop, int64_t value) {
+ mz_stream *strm = (mz_stream *)stream;
+ if (!strm || !strm->vtbl || !strm->vtbl->set_prop_int64)
+ return MZ_PARAM_ERROR;
+ return strm->vtbl->set_prop_int64(stream, prop, value);
+}
+
+void *mz_stream_create(void **stream, mz_stream_vtbl *vtbl) {
+ if (!stream || !vtbl || !vtbl->create)
+ return NULL;
+ return vtbl->create(stream);
+}
+
+void mz_stream_delete(void **stream) {
+ mz_stream *strm = NULL;
+ if (!stream)
+ return;
+ strm = (mz_stream *)*stream;
+ if (strm && strm->vtbl && strm->vtbl->destroy)
+ strm->vtbl->destroy(stream);
+ *stream = NULL;
+}
+
+/***************************************************************************/
+
+typedef struct mz_stream_raw_s {
+ mz_stream stream;
+ int64_t total_in;
+ int64_t total_out;
+ int64_t max_total_in;
+} mz_stream_raw;
+
+/***************************************************************************/
+
+int32_t mz_stream_raw_open(void *stream, const char *path, int32_t mode) {
+ MZ_UNUSED(stream);
+ MZ_UNUSED(path);
+ MZ_UNUSED(mode);
+
+ return MZ_OK;
+}
+
+int32_t mz_stream_raw_is_open(void *stream) {
+ mz_stream_raw *raw = (mz_stream_raw *)stream;
+ return mz_stream_is_open(raw->stream.base);
+}
+
+int32_t mz_stream_raw_read(void *stream, void *buf, int32_t size) {
+ mz_stream_raw *raw = (mz_stream_raw *)stream;
+ int32_t bytes_to_read = size;
+ int32_t read = 0;
+
+ if (raw->max_total_in > 0) {
+ if ((int64_t)bytes_to_read > (raw->max_total_in - raw->total_in))
+ bytes_to_read = (int32_t)(raw->max_total_in - raw->total_in);
+ }
+
+ read = mz_stream_read(raw->stream.base, buf, bytes_to_read);
+
+ if (read > 0) {
+ raw->total_in += read;
+ raw->total_out += read;
+ }
+
+ return read;
+}
+
+int32_t mz_stream_raw_write(void *stream, const void *buf, int32_t size) {
+ mz_stream_raw *raw = (mz_stream_raw *)stream;
+ int32_t written = 0;
+
+ written = mz_stream_write(raw->stream.base, buf, size);
+
+ if (written > 0) {
+ raw->total_out += written;
+ raw->total_in += written;
+ }
+
+ return written;
+}
+
+int64_t mz_stream_raw_tell(void *stream) {
+ mz_stream_raw *raw = (mz_stream_raw *)stream;
+ return mz_stream_tell(raw->stream.base);
+}
+
+int32_t mz_stream_raw_seek(void *stream, int64_t offset, int32_t origin) {
+ mz_stream_raw *raw = (mz_stream_raw *)stream;
+ return mz_stream_seek(raw->stream.base, offset, origin);
+}
+
+int32_t mz_stream_raw_close(void *stream) {
+ MZ_UNUSED(stream);
+ return MZ_OK;
+}
+
+int32_t mz_stream_raw_error(void *stream) {
+ mz_stream_raw *raw = (mz_stream_raw *)stream;
+ return mz_stream_error(raw->stream.base);
+}
+
+int32_t mz_stream_raw_get_prop_int64(void *stream, int32_t prop, int64_t *value) {
+ mz_stream_raw *raw = (mz_stream_raw *)stream;
+ switch (prop) {
+ case MZ_STREAM_PROP_TOTAL_IN:
+ *value = raw->total_in;
+ return MZ_OK;
+ case MZ_STREAM_PROP_TOTAL_OUT:
+ *value = raw->total_out;
+ return MZ_OK;
+ }
+ return MZ_EXIST_ERROR;
+}
+
+int32_t mz_stream_raw_set_prop_int64(void *stream, int32_t prop, int64_t value) {
+ mz_stream_raw *raw = (mz_stream_raw *)stream;
+ switch (prop) {
+ case MZ_STREAM_PROP_TOTAL_IN_MAX:
+ raw->max_total_in = value;
+ return MZ_OK;
+ }
+ return MZ_EXIST_ERROR;
+}
+
+/***************************************************************************/
+
+static mz_stream_vtbl mz_stream_raw_vtbl = {
+ mz_stream_raw_open,
+ mz_stream_raw_is_open,
+ mz_stream_raw_read,
+ mz_stream_raw_write,
+ mz_stream_raw_tell,
+ mz_stream_raw_seek,
+ mz_stream_raw_close,
+ mz_stream_raw_error,
+ mz_stream_raw_create,
+ mz_stream_raw_delete,
+ mz_stream_raw_get_prop_int64,
+ mz_stream_raw_set_prop_int64
+};
+
+/***************************************************************************/
+
+void *mz_stream_raw_create(void **stream) {
+ mz_stream_raw *raw = NULL;
+
+ raw = (mz_stream_raw *)calloc(1, sizeof(mz_stream_raw));
+ if (raw)
+ raw->stream.vtbl = &mz_stream_raw_vtbl;
+ if (stream)
+ *stream = raw;
+
+ return raw;
+}
+
+void mz_stream_raw_delete(void **stream) {
+ mz_stream_raw *raw = NULL;
+ if (!stream)
+ return;
+ raw = (mz_stream_raw *)*stream;
+ if (raw)
+ free(raw);
+ *stream = NULL;
+}
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm.h b/ios/CodePush/SSZipArchive/minizip/mz_strm.h
new file mode 100644
index 000000000..5f88015d0
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm.h
@@ -0,0 +1,132 @@
+/* mz_strm.h -- Stream interface
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_STREAM_H
+#define MZ_STREAM_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+#define MZ_STREAM_PROP_TOTAL_IN (1)
+#define MZ_STREAM_PROP_TOTAL_IN_MAX (2)
+#define MZ_STREAM_PROP_TOTAL_OUT (3)
+#define MZ_STREAM_PROP_TOTAL_OUT_MAX (4)
+#define MZ_STREAM_PROP_HEADER_SIZE (5)
+#define MZ_STREAM_PROP_FOOTER_SIZE (6)
+#define MZ_STREAM_PROP_DISK_SIZE (7)
+#define MZ_STREAM_PROP_DISK_NUMBER (8)
+#define MZ_STREAM_PROP_COMPRESS_LEVEL (9)
+#define MZ_STREAM_PROP_COMPRESS_METHOD (10)
+#define MZ_STREAM_PROP_COMPRESS_WINDOW (11)
+
+/***************************************************************************/
+
+typedef int32_t (*mz_stream_open_cb) (void *stream, const char *path, int32_t mode);
+typedef int32_t (*mz_stream_is_open_cb) (void *stream);
+typedef int32_t (*mz_stream_read_cb) (void *stream, void *buf, int32_t size);
+typedef int32_t (*mz_stream_write_cb) (void *stream, const void *buf, int32_t size);
+typedef int64_t (*mz_stream_tell_cb) (void *stream);
+typedef int32_t (*mz_stream_seek_cb) (void *stream, int64_t offset, int32_t origin);
+typedef int32_t (*mz_stream_close_cb) (void *stream);
+typedef int32_t (*mz_stream_error_cb) (void *stream);
+typedef void* (*mz_stream_create_cb) (void **stream);
+typedef void (*mz_stream_destroy_cb) (void **stream);
+
+typedef int32_t (*mz_stream_get_prop_int64_cb) (void *stream, int32_t prop, int64_t *value);
+typedef int32_t (*mz_stream_set_prop_int64_cb) (void *stream, int32_t prop, int64_t value);
+
+typedef int32_t (*mz_stream_find_cb) (void *stream, const void *find, int32_t find_size,
+ int64_t max_seek, int64_t *position);
+
+/***************************************************************************/
+
+typedef struct mz_stream_vtbl_s {
+ mz_stream_open_cb open;
+ mz_stream_is_open_cb is_open;
+ mz_stream_read_cb read;
+ mz_stream_write_cb write;
+ mz_stream_tell_cb tell;
+ mz_stream_seek_cb seek;
+ mz_stream_close_cb close;
+ mz_stream_error_cb error;
+ mz_stream_create_cb create;
+ mz_stream_destroy_cb destroy;
+
+ mz_stream_get_prop_int64_cb get_prop_int64;
+ mz_stream_set_prop_int64_cb set_prop_int64;
+} mz_stream_vtbl;
+
+typedef struct mz_stream_s {
+ mz_stream_vtbl *vtbl;
+ struct mz_stream_s *base;
+} mz_stream;
+
+/***************************************************************************/
+
+int32_t mz_stream_open(void *stream, const char *path, int32_t mode);
+int32_t mz_stream_is_open(void *stream);
+int32_t mz_stream_read(void *stream, void *buf, int32_t size);
+int32_t mz_stream_read_uint8(void *stream, uint8_t *value);
+int32_t mz_stream_read_uint16(void *stream, uint16_t *value);
+int32_t mz_stream_read_uint32(void *stream, uint32_t *value);
+int32_t mz_stream_read_int64(void *stream, int64_t *value);
+int32_t mz_stream_read_uint64(void *stream, uint64_t *value);
+int32_t mz_stream_write(void *stream, const void *buf, int32_t size);
+int32_t mz_stream_write_uint8(void *stream, uint8_t value);
+int32_t mz_stream_write_uint16(void *stream, uint16_t value);
+int32_t mz_stream_write_uint32(void *stream, uint32_t value);
+int32_t mz_stream_write_int64(void *stream, int64_t value);
+int32_t mz_stream_write_uint64(void *stream, uint64_t value);
+int32_t mz_stream_copy(void *target, void *source, int32_t len);
+int32_t mz_stream_copy_to_end(void *target, void *source);
+int32_t mz_stream_copy_stream(void *target, mz_stream_write_cb write_cb, void *source, mz_stream_read_cb read_cb, int32_t len);
+int32_t mz_stream_copy_stream_to_end(void *target, mz_stream_write_cb write_cb, void *source, mz_stream_read_cb read_cb);
+int64_t mz_stream_tell(void *stream);
+int32_t mz_stream_seek(void *stream, int64_t offset, int32_t origin);
+int32_t mz_stream_find(void *stream, const void *find, int32_t find_size, int64_t max_seek, int64_t *position);
+int32_t mz_stream_find_reverse(void *stream, const void *find, int32_t find_size, int64_t max_seek, int64_t *position);
+int32_t mz_stream_close(void *stream);
+int32_t mz_stream_error(void *stream);
+
+int32_t mz_stream_set_base(void *stream, void *base);
+void* mz_stream_get_interface(void *stream);
+int32_t mz_stream_get_prop_int64(void *stream, int32_t prop, int64_t *value);
+int32_t mz_stream_set_prop_int64(void *stream, int32_t prop, int64_t value);
+
+void* mz_stream_create(void **stream, mz_stream_vtbl *vtbl);
+void mz_stream_delete(void **stream);
+
+/***************************************************************************/
+
+int32_t mz_stream_raw_open(void *stream, const char *filename, int32_t mode);
+int32_t mz_stream_raw_is_open(void *stream);
+int32_t mz_stream_raw_read(void *stream, void *buf, int32_t size);
+int32_t mz_stream_raw_write(void *stream, const void *buf, int32_t size);
+int64_t mz_stream_raw_tell(void *stream);
+int32_t mz_stream_raw_seek(void *stream, int64_t offset, int32_t origin);
+int32_t mz_stream_raw_close(void *stream);
+int32_t mz_stream_raw_error(void *stream);
+
+int32_t mz_stream_raw_get_prop_int64(void *stream, int32_t prop, int64_t *value);
+int32_t mz_stream_raw_set_prop_int64(void *stream, int32_t prop, int64_t value);
+
+void* mz_stream_raw_create(void **stream);
+void mz_stream_raw_delete(void **stream);
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.c b/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.c
new file mode 100644
index 000000000..3081d5372
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.c
@@ -0,0 +1,383 @@
+/* mz_strm_buf.c -- Stream for buffering reads/writes
+ part of the minizip-ng project
+
+ This version of ioapi is designed to buffer IO.
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_strm.h"
+#include "mz_strm_buf.h"
+
+/***************************************************************************/
+
+static mz_stream_vtbl mz_stream_buffered_vtbl = {
+ mz_stream_buffered_open,
+ mz_stream_buffered_is_open,
+ mz_stream_buffered_read,
+ mz_stream_buffered_write,
+ mz_stream_buffered_tell,
+ mz_stream_buffered_seek,
+ mz_stream_buffered_close,
+ mz_stream_buffered_error,
+ mz_stream_buffered_create,
+ mz_stream_buffered_delete,
+ NULL,
+ NULL
+};
+
+/***************************************************************************/
+
+typedef struct mz_stream_buffered_s {
+ mz_stream stream;
+ int32_t error;
+ char readbuf[INT16_MAX];
+ int32_t readbuf_len;
+ int32_t readbuf_pos;
+ int32_t readbuf_hits;
+ int32_t readbuf_misses;
+ char writebuf[INT16_MAX];
+ int32_t writebuf_len;
+ int32_t writebuf_pos;
+ int32_t writebuf_hits;
+ int32_t writebuf_misses;
+ int64_t position;
+} mz_stream_buffered;
+
+/***************************************************************************/
+
+#if 0
+# define mz_stream_buffered_print printf
+#else
+# define mz_stream_buffered_print(fmt,...)
+#endif
+
+/***************************************************************************/
+
+static int32_t mz_stream_buffered_reset(void *stream) {
+ mz_stream_buffered *buffered = (mz_stream_buffered *)stream;
+
+ buffered->readbuf_len = 0;
+ buffered->readbuf_pos = 0;
+ buffered->writebuf_len = 0;
+ buffered->writebuf_pos = 0;
+ buffered->position = 0;
+
+ return MZ_OK;
+}
+
+int32_t mz_stream_buffered_open(void *stream, const char *path, int32_t mode) {
+ mz_stream_buffered *buffered = (mz_stream_buffered *)stream;
+ mz_stream_buffered_print("Buffered - Open (mode %" PRId32 ")\n", mode);
+ mz_stream_buffered_reset(buffered);
+ return mz_stream_open(buffered->stream.base, path, mode);
+}
+
+int32_t mz_stream_buffered_is_open(void *stream) {
+ mz_stream_buffered *buffered = (mz_stream_buffered *)stream;
+ return mz_stream_is_open(buffered->stream.base);
+}
+
+static int32_t mz_stream_buffered_flush(void *stream, int32_t *written) {
+ mz_stream_buffered *buffered = (mz_stream_buffered *)stream;
+ int32_t total_bytes_written = 0;
+ int32_t bytes_to_write = buffered->writebuf_len;
+ int32_t bytes_left_to_write = buffered->writebuf_len;
+ int32_t bytes_written = 0;
+
+ *written = 0;
+
+ while (bytes_left_to_write > 0) {
+ bytes_written = mz_stream_write(buffered->stream.base,
+ buffered->writebuf + (bytes_to_write - bytes_left_to_write), bytes_left_to_write);
+
+ if (bytes_written != bytes_left_to_write)
+ return MZ_WRITE_ERROR;
+
+ buffered->writebuf_misses += 1;
+
+ mz_stream_buffered_print("Buffered - Write flush (%" PRId32 ":%" PRId32 " len %" PRId32 ")\n",
+ bytes_to_write, bytes_left_to_write, buffered->writebuf_len);
+
+ total_bytes_written += bytes_written;
+ bytes_left_to_write -= bytes_written;
+ buffered->position += bytes_written;
+ }
+
+ buffered->writebuf_len = 0;
+ buffered->writebuf_pos = 0;
+
+ *written = total_bytes_written;
+ return MZ_OK;
+}
+
+int32_t mz_stream_buffered_read(void *stream, void *buf, int32_t size) {
+ mz_stream_buffered *buffered = (mz_stream_buffered *)stream;
+ int32_t buf_len = 0;
+ int32_t bytes_to_read = 0;
+ int32_t bytes_to_copy = 0;
+ int32_t bytes_left_to_read = size;
+ int32_t bytes_read = 0;
+ int32_t bytes_flushed = 0;
+
+ mz_stream_buffered_print("Buffered - Read (size %" PRId32 " pos %" PRId64 ")\n", size, buffered->position);
+
+ if (buffered->writebuf_len > 0) {
+ int64_t position = buffered->position + buffered->writebuf_pos
+
+ mz_stream_buffered_print("Buffered - Switch from write to read, flushing (pos %" PRId64 ")\n", position);
+
+ mz_stream_buffered_flush(stream, &bytes_flushed);
+ mz_stream_buffered_seek(stream, position, MZ_SEEK_SET);
+ }
+
+ while (bytes_left_to_read > 0) {
+ if ((buffered->readbuf_len == 0) || (buffered->readbuf_pos == buffered->readbuf_len)) {
+ if (buffered->readbuf_len == sizeof(buffered->readbuf)) {
+ buffered->readbuf_pos = 0;
+ buffered->readbuf_len = 0;
+ }
+
+ bytes_to_read = (int32_t)sizeof(buffered->readbuf) - (buffered->readbuf_len - buffered->readbuf_pos);
+ bytes_read = mz_stream_read(buffered->stream.base, buffered->readbuf + buffered->readbuf_pos, bytes_to_read);
+ if (bytes_read < 0)
+ return bytes_read;
+
+ buffered->readbuf_misses += 1;
+ buffered->readbuf_len += bytes_read;
+ buffered->position += bytes_read;
+
+ mz_stream_buffered_print("Buffered - Filled (read %" PRId32 "/%" PRId32 " buf %" PRId32 ":%" PRId32 " pos %" PRId64 ")\n",
+ bytes_read, bytes_to_read, buffered->readbuf_pos, buffered->readbuf_len, buffered->position);
+
+ if (bytes_read == 0)
+ break;
+ }
+
+ if ((buffered->readbuf_len - buffered->readbuf_pos) > 0) {
+ bytes_to_copy = buffered->readbuf_len - buffered->readbuf_pos;
+ if (bytes_to_copy > bytes_left_to_read)
+ bytes_to_copy = bytes_left_to_read;
+
+ memcpy((char *)buf + buf_len, buffered->readbuf + buffered->readbuf_pos, bytes_to_copy);
+
+ buf_len += bytes_to_copy;
+ bytes_left_to_read -= bytes_to_copy;
+
+ buffered->readbuf_hits += 1;
+ buffered->readbuf_pos += bytes_to_copy;
+
+ mz_stream_buffered_print("Buffered - Emptied (copied %" PRId32 " remaining %" PRId32 " buf %" PRId32 ":%" PRId32 " pos %" PRId64 ")\n",
+ bytes_to_copy, bytes_left_to_read, buffered->readbuf_pos, buffered->readbuf_len, buffered->position);
+ }
+ }
+
+ return size - bytes_left_to_read;
+}
+
+int32_t mz_stream_buffered_write(void *stream, const void *buf, int32_t size) {
+ mz_stream_buffered *buffered = (mz_stream_buffered *)stream;
+ int32_t bytes_to_write = size;
+ int32_t bytes_left_to_write = size;
+ int32_t bytes_to_copy = 0;
+ int32_t bytes_used = 0;
+ int32_t bytes_flushed = 0;
+ int32_t err = MZ_OK;
+
+
+ mz_stream_buffered_print("Buffered - Write (size %" PRId32 " len %" PRId32 " pos %" PRId64 ")\n",
+ size, buffered->writebuf_len, buffered->position);
+
+ if (buffered->readbuf_len > 0) {
+ buffered->position -= buffered->readbuf_len;
+ buffered->position += buffered->readbuf_pos;
+
+ buffered->readbuf_len = 0;
+ buffered->readbuf_pos = 0;
+
+ mz_stream_buffered_print("Buffered - Switch from read to write (pos %" PRId64 ")\n", buffered->position);
+
+ err = mz_stream_seek(buffered->stream.base, buffered->position, MZ_SEEK_SET);
+ if (err != MZ_OK)
+ return err;
+ }
+
+ while (bytes_left_to_write > 0) {
+ bytes_used = buffered->writebuf_len;
+ if (bytes_used > buffered->writebuf_pos)
+ bytes_used = buffered->writebuf_pos;
+ bytes_to_copy = (int32_t)sizeof(buffered->writebuf) - bytes_used;
+ if (bytes_to_copy > bytes_left_to_write)
+ bytes_to_copy = bytes_left_to_write;
+
+ if (bytes_to_copy == 0) {
+ err = mz_stream_buffered_flush(stream, &bytes_flushed);
+ if (err != MZ_OK)
+ return err;
+ if (bytes_flushed == 0)
+ return 0;
+
+ continue;
+ }
+
+ memcpy(buffered->writebuf + buffered->writebuf_pos,
+ (const char *)buf + (bytes_to_write - bytes_left_to_write), bytes_to_copy);
+
+ mz_stream_buffered_print("Buffered - Write copy (remaining %" PRId32 " write %" PRId32 ":%" PRId32 " len %" PRId32 ")\n",
+ bytes_to_copy, bytes_to_write, bytes_left_to_write, buffered->writebuf_len);
+
+ bytes_left_to_write -= bytes_to_copy;
+
+ buffered->writebuf_pos += bytes_to_copy;
+ buffered->writebuf_hits += 1;
+ if (buffered->writebuf_pos > buffered->writebuf_len)
+ buffered->writebuf_len += buffered->writebuf_pos - buffered->writebuf_len;
+ }
+
+ return size - bytes_left_to_write;
+}
+
+int64_t mz_stream_buffered_tell(void *stream) {
+ mz_stream_buffered *buffered = (mz_stream_buffered *)stream;
+ int64_t position = mz_stream_tell(buffered->stream.base);
+
+ buffered->position = position;
+
+ mz_stream_buffered_print("Buffered - Tell (pos %" PRId64 " readpos %" PRId32 " writepos %" PRId32 ")\n",
+ buffered->position, buffered->readbuf_pos, buffered->writebuf_pos);
+
+ if (buffered->readbuf_len > 0)
+ position -= ((int64_t)buffered->readbuf_len - buffered->readbuf_pos);
+ if (buffered->writebuf_len > 0)
+ position += buffered->writebuf_pos;
+ return position;
+}
+
+int32_t mz_stream_buffered_seek(void *stream, int64_t offset, int32_t origin) {
+ mz_stream_buffered *buffered = (mz_stream_buffered *)stream;
+ int32_t bytes_flushed = 0;
+ int32_t err = MZ_OK;
+
+ mz_stream_buffered_print("Buffered - Seek (origin %" PRId32 " offset %" PRId64 " pos %" PRId64 ")\n",
+ origin, offset, buffered->position);
+
+ switch (origin) {
+ case MZ_SEEK_SET:
+
+ if ((buffered->readbuf_len > 0) && (offset < buffered->position) &&
+ (offset >= buffered->position - buffered->readbuf_len)) {
+ buffered->readbuf_pos = (int32_t)(offset - (buffered->position - buffered->readbuf_len));
+ return MZ_OK;
+ }
+ if (buffered->writebuf_len > 0) {
+ if ((offset >= buffered->position) && (offset <= buffered->position + buffered->writebuf_len)) {
+ buffered->writebuf_pos = (int32_t)(offset - buffered->position);
+ return MZ_OK;
+ }
+ }
+
+ err = mz_stream_buffered_flush(stream, &bytes_flushed);
+ if (err != MZ_OK)
+ return err;
+
+ buffered->position = offset;
+ break;
+
+ case MZ_SEEK_CUR:
+
+ if (buffered->readbuf_len > 0) {
+ if (offset <= ((int64_t)buffered->readbuf_len - buffered->readbuf_pos)) {
+ buffered->readbuf_pos += (uint32_t)offset;
+ return MZ_OK;
+ }
+ offset -= ((int64_t)buffered->readbuf_len - buffered->readbuf_pos);
+ buffered->position += offset;
+ }
+ if (buffered->writebuf_len > 0) {
+ if (offset <= ((int64_t)buffered->writebuf_len - buffered->writebuf_pos)) {
+ buffered->writebuf_pos += (uint32_t)offset;
+ return MZ_OK;
+ }
+ /* offset -= (buffered->writebuf_len - buffered->writebuf_pos); */
+ }
+
+ err = mz_stream_buffered_flush(stream, &bytes_flushed);
+ if (err != MZ_OK)
+ return err;
+
+ break;
+
+ case MZ_SEEK_END:
+
+ if (buffered->writebuf_len > 0) {
+ buffered->writebuf_pos = buffered->writebuf_len;
+ return MZ_OK;
+ }
+ break;
+ }
+
+ buffered->readbuf_len = 0;
+ buffered->readbuf_pos = 0;
+ buffered->writebuf_len = 0;
+ buffered->writebuf_pos = 0;
+
+ return mz_stream_seek(buffered->stream.base, offset, origin);
+}
+
+int32_t mz_stream_buffered_close(void *stream) {
+ mz_stream_buffered *buffered = (mz_stream_buffered *)stream;
+ int32_t bytes_flushed = 0;
+
+ mz_stream_buffered_flush(stream, &bytes_flushed);
+ mz_stream_buffered_print("Buffered - Close (flushed %" PRId32 ")\n", bytes_flushed);
+
+ if (buffered->readbuf_hits + buffered->readbuf_misses > 0) {
+ mz_stream_buffered_print("Buffered - Read efficiency %.02f%%\n",
+ (buffered->readbuf_hits / ((float)buffered->readbuf_hits + buffered->readbuf_misses)) * 100);
+ }
+
+ if (buffered->writebuf_hits + buffered->writebuf_misses > 0) {
+ mz_stream_buffered_print("Buffered - Write efficiency %.02f%%\n",
+ (buffered->writebuf_hits / ((float)buffered->writebuf_hits + buffered->writebuf_misses)) * 100);
+ }
+
+ mz_stream_buffered_reset(buffered);
+
+ return mz_stream_close(buffered->stream.base);
+}
+
+int32_t mz_stream_buffered_error(void *stream) {
+ mz_stream_buffered *buffered = (mz_stream_buffered *)stream;
+ return mz_stream_error(buffered->stream.base);
+}
+
+void *mz_stream_buffered_create(void **stream) {
+ mz_stream_buffered *buffered = NULL;
+
+ buffered = (mz_stream_buffered *)calloc(1, sizeof(mz_stream_buffered));
+ if (buffered)
+ buffered->stream.vtbl = &mz_stream_buffered_vtbl;
+ if (stream)
+ *stream = buffered;
+
+ return buffered;
+}
+
+void mz_stream_buffered_delete(void **stream) {
+ mz_stream_buffered *buffered = NULL;
+ if (!stream)
+ return;
+ buffered = (mz_stream_buffered *)*stream;
+ if (buffered)
+ free(buffered);
+ *stream = NULL;
+}
+
+void *mz_stream_buffered_get_interface(void) {
+ return (void *)&mz_stream_buffered_vtbl;
+}
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.h b/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.h
new file mode 100644
index 000000000..93eea268b
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.h
@@ -0,0 +1,42 @@
+/* mz_strm_buf.h -- Stream for buffering reads/writes
+ part of the minizip-ng project
+
+ This version of ioapi is designed to buffer IO.
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_STREAM_BUFFERED_H
+#define MZ_STREAM_BUFFERED_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+int32_t mz_stream_buffered_open(void *stream, const char *path, int32_t mode);
+int32_t mz_stream_buffered_is_open(void *stream);
+int32_t mz_stream_buffered_read(void *stream, void *buf, int32_t size);
+int32_t mz_stream_buffered_write(void *stream, const void *buf, int32_t size);
+int64_t mz_stream_buffered_tell(void *stream);
+int32_t mz_stream_buffered_seek(void *stream, int64_t offset, int32_t origin);
+int32_t mz_stream_buffered_close(void *stream);
+int32_t mz_stream_buffered_error(void *stream);
+
+void* mz_stream_buffered_create(void **stream);
+void mz_stream_buffered_delete(void **stream);
+
+void* mz_stream_buffered_get_interface(void);
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.c b/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.c
new file mode 100644
index 000000000..9a78dc1bd
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.c
@@ -0,0 +1,269 @@
+/* mz_strm_mem.c -- Stream for memory access
+ part of the minizip-ng project
+
+ This interface is designed to access memory rather than files.
+ We do use a region of memory to put data in to and take it out of.
+
+ Based on Unzip ioapi.c version 0.22, May 19th, 2003
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+ Copyright (C) 2003 Justin Fletcher
+ Copyright (C) 1998-2003 Gilles Vollant
+ https://www.winimage.com/zLibDll/minizip.html
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_strm.h"
+#include "mz_strm_mem.h"
+
+/***************************************************************************/
+
+static mz_stream_vtbl mz_stream_mem_vtbl = {
+ mz_stream_mem_open,
+ mz_stream_mem_is_open,
+ mz_stream_mem_read,
+ mz_stream_mem_write,
+ mz_stream_mem_tell,
+ mz_stream_mem_seek,
+ mz_stream_mem_close,
+ mz_stream_mem_error,
+ mz_stream_mem_create,
+ mz_stream_mem_delete,
+ NULL,
+ NULL
+};
+
+/***************************************************************************/
+
+typedef struct mz_stream_mem_s {
+ mz_stream stream;
+ int32_t mode;
+ uint8_t *buffer; /* Memory buffer pointer */
+ int32_t size; /* Size of the memory buffer */
+ int32_t limit; /* Furthest we've written */
+ int32_t position; /* Current position in the memory */
+ int32_t grow_size; /* Size to grow when full */
+} mz_stream_mem;
+
+/***************************************************************************/
+
+static int32_t mz_stream_mem_set_size(void *stream, int32_t size) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ int32_t new_size = size;
+ uint8_t *new_buf = NULL;
+
+ new_buf = (uint8_t *)malloc((uint32_t)new_size);
+ if (!new_buf)
+ return MZ_BUF_ERROR;
+
+ if (mem->buffer) {
+ memcpy(new_buf, mem->buffer, mem->size);
+ free(mem->buffer);
+ }
+
+ mem->buffer = new_buf;
+ mem->size = new_size;
+ return MZ_OK;
+}
+
+int32_t mz_stream_mem_open(void *stream, const char *path, int32_t mode) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ int32_t err = MZ_OK;
+
+ MZ_UNUSED(path);
+
+ mem->mode = mode;
+ mem->limit = 0;
+ mem->position = 0;
+
+ if (mem->mode & MZ_OPEN_MODE_CREATE)
+ err = mz_stream_mem_set_size(stream, mem->grow_size);
+ else
+ mem->limit = mem->size;
+
+ return err;
+}
+
+int32_t mz_stream_mem_is_open(void *stream) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ if (!mem->buffer)
+ return MZ_OPEN_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_stream_mem_read(void *stream, void *buf, int32_t size) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+
+ if (size > mem->size - mem->position)
+ size = mem->size - mem->position;
+ if (mem->position + size > mem->limit)
+ size = mem->limit - mem->position;
+
+ if (size <= 0)
+ return 0;
+
+ memcpy(buf, mem->buffer + mem->position, size);
+ mem->position += size;
+
+ return size;
+}
+
+int32_t mz_stream_mem_write(void *stream, const void *buf, int32_t size) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ int32_t new_size = 0;
+ int32_t err = MZ_OK;
+
+ if (!size)
+ return size;
+
+ if (size > mem->size - mem->position) {
+ if (mem->mode & MZ_OPEN_MODE_CREATE) {
+ new_size = mem->size;
+ if (size < mem->grow_size)
+ new_size += mem->grow_size;
+ else
+ new_size += size;
+
+ err = mz_stream_mem_set_size(stream, new_size);
+ if (err != MZ_OK)
+ return err;
+ } else {
+ size = mem->size - mem->position;
+ }
+ }
+
+ memcpy(mem->buffer + mem->position, buf, size);
+
+ mem->position += size;
+ if (mem->position > mem->limit)
+ mem->limit = mem->position;
+
+ return size;
+}
+
+int64_t mz_stream_mem_tell(void *stream) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ return mem->position;
+}
+
+int32_t mz_stream_mem_seek(void *stream, int64_t offset, int32_t origin) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ int64_t new_pos = 0;
+ int32_t err = MZ_OK;
+
+ switch (origin) {
+ case MZ_SEEK_CUR:
+ new_pos = mem->position + offset;
+ break;
+ case MZ_SEEK_END:
+ new_pos = mem->limit + offset;
+ break;
+ case MZ_SEEK_SET:
+ new_pos = offset;
+ break;
+ default:
+ return MZ_SEEK_ERROR;
+ }
+
+ if (new_pos > mem->size) {
+ if ((mem->mode & MZ_OPEN_MODE_CREATE) == 0)
+ return MZ_SEEK_ERROR;
+
+ err = mz_stream_mem_set_size(stream, (int32_t)new_pos);
+ if (err != MZ_OK)
+ return err;
+ } else if (new_pos < 0) {
+ return MZ_SEEK_ERROR;
+ }
+
+ mem->position = (int32_t)new_pos;
+ return MZ_OK;
+}
+
+int32_t mz_stream_mem_close(void *stream) {
+ MZ_UNUSED(stream);
+
+ /* We never return errors */
+ return MZ_OK;
+}
+
+int32_t mz_stream_mem_error(void *stream) {
+ MZ_UNUSED(stream);
+
+ /* We never return errors */
+ return MZ_OK;
+}
+
+void mz_stream_mem_set_buffer(void *stream, void *buf, int32_t size) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ mem->buffer = (uint8_t *)buf;
+ mem->size = size;
+ mem->limit = size;
+}
+
+int32_t mz_stream_mem_get_buffer(void *stream, const void **buf) {
+ return mz_stream_mem_get_buffer_at(stream, 0, buf);
+}
+
+int32_t mz_stream_mem_get_buffer_at(void *stream, int64_t position, const void **buf) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ if (!buf || position < 0 || !mem->buffer|| mem->size < position)
+ return MZ_SEEK_ERROR;
+ *buf = mem->buffer + position;
+ return MZ_OK;
+}
+
+int32_t mz_stream_mem_get_buffer_at_current(void *stream, const void **buf) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ return mz_stream_mem_get_buffer_at(stream, mem->position, buf);
+}
+
+void mz_stream_mem_get_buffer_length(void *stream, int32_t *length) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ *length = mem->limit;
+}
+
+void mz_stream_mem_set_buffer_limit(void *stream, int32_t limit) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ mem->limit = limit;
+}
+
+void mz_stream_mem_set_grow_size(void *stream, int32_t grow_size) {
+ mz_stream_mem *mem = (mz_stream_mem *)stream;
+ mem->grow_size = grow_size;
+}
+
+void *mz_stream_mem_create(void **stream) {
+ mz_stream_mem *mem = NULL;
+
+ mem = (mz_stream_mem *)calloc(1, sizeof(mz_stream_mem));
+ if (mem) {
+ mem->stream.vtbl = &mz_stream_mem_vtbl;
+ mem->grow_size = 4096;
+ }
+ if (stream)
+ *stream = mem;
+
+ return mem;
+}
+
+void mz_stream_mem_delete(void **stream) {
+ mz_stream_mem *mem = NULL;
+ if (!stream)
+ return;
+ mem = (mz_stream_mem *)*stream;
+ if (mem) {
+ if ((mem->mode & MZ_OPEN_MODE_CREATE) && (mem->buffer))
+ free(mem->buffer);
+ free(mem);
+ }
+ *stream = NULL;
+}
+
+void *mz_stream_mem_get_interface(void) {
+ return (void *)&mz_stream_mem_vtbl;
+}
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.h b/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.h
new file mode 100644
index 000000000..22a12deae
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.h
@@ -0,0 +1,48 @@
+/* mz_strm_mem.h -- Stream for memory access
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_STREAM_MEM_H
+#define MZ_STREAM_MEM_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+int32_t mz_stream_mem_open(void *stream, const char *filename, int32_t mode);
+int32_t mz_stream_mem_is_open(void *stream);
+int32_t mz_stream_mem_read(void *stream, void *buf, int32_t size);
+int32_t mz_stream_mem_write(void *stream, const void *buf, int32_t size);
+int64_t mz_stream_mem_tell(void *stream);
+int32_t mz_stream_mem_seek(void *stream, int64_t offset, int32_t origin);
+int32_t mz_stream_mem_close(void *stream);
+int32_t mz_stream_mem_error(void *stream);
+
+void mz_stream_mem_set_buffer(void *stream, void *buf, int32_t size);
+int32_t mz_stream_mem_get_buffer(void *stream, const void **buf);
+int32_t mz_stream_mem_get_buffer_at(void *stream, int64_t position, const void **buf);
+int32_t mz_stream_mem_get_buffer_at_current(void *stream, const void **buf);
+void mz_stream_mem_get_buffer_length(void *stream, int32_t *length);
+void mz_stream_mem_set_buffer_limit(void *stream, int32_t limit);
+void mz_stream_mem_set_grow_size(void *stream, int32_t grow_size);
+
+void* mz_stream_mem_create(void **stream);
+void mz_stream_mem_delete(void **stream);
+
+void* mz_stream_mem_get_interface(void);
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_os.h b/ios/CodePush/SSZipArchive/minizip/mz_strm_os.h
new file mode 100644
index 000000000..83d292b95
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_os.h
@@ -0,0 +1,40 @@
+/* mz_sstrm_os.h -- Stream for filesystem access
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_STREAM_OS_H
+#define MZ_STREAM_OS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+int32_t mz_stream_os_open(void *stream, const char *path, int32_t mode);
+int32_t mz_stream_os_is_open(void *stream);
+int32_t mz_stream_os_read(void *stream, void *buf, int32_t size);
+int32_t mz_stream_os_write(void *stream, const void *buf, int32_t size);
+int64_t mz_stream_os_tell(void *stream);
+int32_t mz_stream_os_seek(void *stream, int64_t offset, int32_t origin);
+int32_t mz_stream_os_close(void *stream);
+int32_t mz_stream_os_error(void *stream);
+
+void* mz_stream_os_create(void **stream);
+void mz_stream_os_delete(void **stream);
+
+void* mz_stream_os_get_interface(void);
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_os_posix.c b/ios/CodePush/SSZipArchive/minizip/mz_strm_os_posix.c
new file mode 100644
index 000000000..60ff502de
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_os_posix.c
@@ -0,0 +1,203 @@
+/* mz_strm_posix.c -- Stream for filesystem access for posix/linux
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+ Modifications for Zip64 support
+ Copyright (C) 2009-2010 Mathias Svensson
+ http://result42.com
+ Copyright (C) 1998-2010 Gilles Vollant
+ https://www.winimage.com/zLibDll/minizip.html
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_strm.h"
+#include "mz_strm_os.h"
+
+#include /* fopen, fread.. */
+#include
+
+/***************************************************************************/
+
+#define fopen64 fopen
+#ifndef MZ_FILE32_API
+# ifndef NO_FSEEKO
+# define ftello64 ftello
+# define fseeko64 fseeko
+# elif defined(_MSC_VER) && (_MSC_VER >= 1400)
+# define ftello64 _ftelli64
+# define fseeko64 _fseeki64
+# endif
+#endif
+#ifndef ftello64
+# define ftello64 ftell
+#endif
+#ifndef fseeko64
+# define fseeko64 fseek
+#endif
+
+/***************************************************************************/
+
+static mz_stream_vtbl mz_stream_os_vtbl = {
+ mz_stream_os_open,
+ mz_stream_os_is_open,
+ mz_stream_os_read,
+ mz_stream_os_write,
+ mz_stream_os_tell,
+ mz_stream_os_seek,
+ mz_stream_os_close,
+ mz_stream_os_error,
+ mz_stream_os_create,
+ mz_stream_os_delete,
+ NULL,
+ NULL
+};
+
+/***************************************************************************/
+
+typedef struct mz_stream_posix_s {
+ mz_stream stream;
+ int32_t error;
+ FILE *handle;
+} mz_stream_posix;
+
+/***************************************************************************/
+
+int32_t mz_stream_os_open(void *stream, const char *path, int32_t mode) {
+ mz_stream_posix *posix = (mz_stream_posix *)stream;
+ const char *mode_fopen = NULL;
+
+ if (!path)
+ return MZ_PARAM_ERROR;
+
+ if ((mode & MZ_OPEN_MODE_READWRITE) == MZ_OPEN_MODE_READ)
+ mode_fopen = "rb";
+ else if (mode & MZ_OPEN_MODE_APPEND)
+ mode_fopen = "r+b";
+ else if (mode & MZ_OPEN_MODE_CREATE)
+ mode_fopen = "wb";
+ else
+ return MZ_OPEN_ERROR;
+
+ posix->handle = fopen64(path, mode_fopen);
+ if (!posix->handle) {
+ posix->error = errno;
+ return MZ_OPEN_ERROR;
+ }
+
+ if (mode & MZ_OPEN_MODE_APPEND)
+ return mz_stream_os_seek(stream, 0, MZ_SEEK_END);
+
+ return MZ_OK;
+}
+
+int32_t mz_stream_os_is_open(void *stream) {
+ mz_stream_posix *posix = (mz_stream_posix *)stream;
+ if (!posix->handle)
+ return MZ_OPEN_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_stream_os_read(void *stream, void *buf, int32_t size) {
+ mz_stream_posix *posix = (mz_stream_posix *)stream;
+ int32_t read = (int32_t)fread(buf, 1, (size_t)size, posix->handle);
+ if (read < size && ferror(posix->handle)) {
+ posix->error = errno;
+ return MZ_READ_ERROR;
+ }
+ return read;
+}
+
+int32_t mz_stream_os_write(void *stream, const void *buf, int32_t size) {
+ mz_stream_posix *posix = (mz_stream_posix *)stream;
+ int32_t written = (int32_t)fwrite(buf, 1, (size_t)size, posix->handle);
+ if (written < size && ferror(posix->handle)) {
+ posix->error = errno;
+ return MZ_WRITE_ERROR;
+ }
+ return written;
+}
+
+int64_t mz_stream_os_tell(void *stream) {
+ mz_stream_posix *posix = (mz_stream_posix *)stream;
+ int64_t position = ftello64(posix->handle);
+ if (position == -1) {
+ posix->error = errno;
+ return MZ_TELL_ERROR;
+ }
+ return position;
+}
+
+int32_t mz_stream_os_seek(void *stream, int64_t offset, int32_t origin) {
+ mz_stream_posix *posix = (mz_stream_posix *)stream;
+ int32_t fseek_origin = 0;
+
+ switch (origin) {
+ case MZ_SEEK_CUR:
+ fseek_origin = SEEK_CUR;
+ break;
+ case MZ_SEEK_END:
+ fseek_origin = SEEK_END;
+ break;
+ case MZ_SEEK_SET:
+ fseek_origin = SEEK_SET;
+ break;
+ default:
+ return MZ_SEEK_ERROR;
+ }
+
+ if (fseeko64(posix->handle, offset, fseek_origin) != 0) {
+ posix->error = errno;
+ return MZ_SEEK_ERROR;
+ }
+
+ return MZ_OK;
+}
+
+int32_t mz_stream_os_close(void *stream) {
+ mz_stream_posix *posix = (mz_stream_posix *)stream;
+ int32_t closed = 0;
+ if (posix->handle) {
+ closed = fclose(posix->handle);
+ posix->handle = NULL;
+ }
+ if (closed != 0) {
+ posix->error = errno;
+ return MZ_CLOSE_ERROR;
+ }
+ return MZ_OK;
+}
+
+int32_t mz_stream_os_error(void *stream) {
+ mz_stream_posix *posix = (mz_stream_posix *)stream;
+ return posix->error;
+}
+
+void *mz_stream_os_create(void **stream) {
+ mz_stream_posix *posix = NULL;
+
+ posix = (mz_stream_posix *)calloc(1, sizeof(mz_stream_posix));
+ if (posix)
+ posix->stream.vtbl = &mz_stream_os_vtbl;
+ if (stream)
+ *stream = posix;
+
+ return posix;
+}
+
+void mz_stream_os_delete(void **stream) {
+ mz_stream_posix *posix = NULL;
+ if (!stream)
+ return;
+ posix = (mz_stream_posix *)*stream;
+ if (posix)
+ free(posix);
+ *stream = NULL;
+}
+
+void *mz_stream_os_get_interface(void) {
+ return (void *)&mz_stream_os_vtbl;
+}
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.c b/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.c
new file mode 100644
index 000000000..1791b15ae
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.c
@@ -0,0 +1,334 @@
+/* mz_strm_pkcrypt.c -- Code for traditional PKWARE encryption
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+ Copyright (C) 1998-2005 Gilles Vollant
+ Modifications for Info-ZIP crypting
+ https://www.winimage.com/zLibDll/minizip.html
+ Copyright (C) 2003 Terry Thorsen
+
+ This code is a modified version of crypting code in Info-ZIP distribution
+
+ Copyright (C) 1990-2000 Info-ZIP. All rights reserved.
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+
+ This encryption code is a direct transcription of the algorithm from
+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This
+ file (appnote.txt) is distributed with the PKZIP program (even in the
+ version without encryption capabilities).
+*/
+
+#include "mz.h"
+#include "mz_crypt.h"
+#include "mz_strm.h"
+#include "mz_strm_pkcrypt.h"
+
+/***************************************************************************/
+
+static mz_stream_vtbl mz_stream_pkcrypt_vtbl = {
+ mz_stream_pkcrypt_open,
+ mz_stream_pkcrypt_is_open,
+ mz_stream_pkcrypt_read,
+ mz_stream_pkcrypt_write,
+ mz_stream_pkcrypt_tell,
+ mz_stream_pkcrypt_seek,
+ mz_stream_pkcrypt_close,
+ mz_stream_pkcrypt_error,
+ mz_stream_pkcrypt_create,
+ mz_stream_pkcrypt_delete,
+ mz_stream_pkcrypt_get_prop_int64,
+ mz_stream_pkcrypt_set_prop_int64
+};
+
+/***************************************************************************/
+
+typedef struct mz_stream_pkcrypt_s {
+ mz_stream stream;
+ int32_t error;
+ int16_t initialized;
+ uint8_t buffer[UINT16_MAX];
+ int64_t total_in;
+ int64_t max_total_in;
+ int64_t total_out;
+ uint32_t keys[3]; /* keys defining the pseudo-random sequence */
+ uint8_t verify1;
+ uint8_t verify2;
+ const char *password;
+} mz_stream_pkcrypt;
+
+/***************************************************************************/
+
+#define mz_stream_pkcrypt_decode(strm, c) \
+ (mz_stream_pkcrypt_update_keys(strm, \
+ c ^= mz_stream_pkcrypt_decrypt_byte(strm)))
+
+#define mz_stream_pkcrypt_encode(strm, c, t) \
+ (t = mz_stream_pkcrypt_decrypt_byte(strm), \
+ mz_stream_pkcrypt_update_keys(strm, (uint8_t)c), (uint8_t)(t^(c)))
+
+/***************************************************************************/
+
+static uint8_t mz_stream_pkcrypt_decrypt_byte(void *stream) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+
+ unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an */
+ /* unpredictable manner on 16-bit systems; not a problem */
+ /* with any known compiler so far, though. */
+
+ temp = pkcrypt->keys[2] | 2;
+ return (uint8_t)(((temp * (temp ^ 1)) >> 8) & 0xff);
+}
+
+static uint8_t mz_stream_pkcrypt_update_keys(void *stream, uint8_t c) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ uint8_t buf = c;
+
+ pkcrypt->keys[0] = (uint32_t)~mz_crypt_crc32_update(~pkcrypt->keys[0], &buf, 1);
+
+ pkcrypt->keys[1] += pkcrypt->keys[0] & 0xff;
+ pkcrypt->keys[1] *= 134775813L;
+ pkcrypt->keys[1] += 1;
+
+ buf = (uint8_t)(pkcrypt->keys[1] >> 24);
+ pkcrypt->keys[2] = (uint32_t)~mz_crypt_crc32_update(~pkcrypt->keys[2], &buf, 1);
+
+ return (uint8_t)c;
+}
+
+static void mz_stream_pkcrypt_init_keys(void *stream, const char *password) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+
+ pkcrypt->keys[0] = 305419896L;
+ pkcrypt->keys[1] = 591751049L;
+ pkcrypt->keys[2] = 878082192L;
+
+ while (*password != 0) {
+ mz_stream_pkcrypt_update_keys(stream, (uint8_t)*password);
+ password += 1;
+ }
+}
+
+/***************************************************************************/
+
+int32_t mz_stream_pkcrypt_open(void *stream, const char *path, int32_t mode) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ uint16_t t = 0;
+ int16_t i = 0;
+ uint8_t verify1 = 0;
+ uint8_t verify2 = 0;
+ uint8_t header[MZ_PKCRYPT_HEADER_SIZE];
+ const char *password = path;
+
+ pkcrypt->total_in = 0;
+ pkcrypt->total_out = 0;
+ pkcrypt->initialized = 0;
+
+ if (mz_stream_is_open(pkcrypt->stream.base) != MZ_OK)
+ return MZ_OPEN_ERROR;
+
+ if (!password)
+ password = pkcrypt->password;
+ if (!password)
+ return MZ_PARAM_ERROR;
+
+ mz_stream_pkcrypt_init_keys(stream, password);
+
+ if (mode & MZ_OPEN_MODE_WRITE) {
+ /* First generate RAND_HEAD_LEN - 2 random bytes. */
+ mz_crypt_rand(header, MZ_PKCRYPT_HEADER_SIZE - 2);
+
+ /* Encrypt random header (last two bytes is high word of crc) */
+ for (i = 0; i < MZ_PKCRYPT_HEADER_SIZE - 2; i++)
+ header[i] = mz_stream_pkcrypt_encode(stream, header[i], t);
+
+ header[i++] = mz_stream_pkcrypt_encode(stream, pkcrypt->verify1, t);
+ header[i++] = mz_stream_pkcrypt_encode(stream, pkcrypt->verify2, t);
+
+ if (mz_stream_write(pkcrypt->stream.base, header, sizeof(header)) != sizeof(header))
+ return MZ_WRITE_ERROR;
+
+ pkcrypt->total_out += MZ_PKCRYPT_HEADER_SIZE;
+ } else if (mode & MZ_OPEN_MODE_READ) {
+ if (mz_stream_read(pkcrypt->stream.base, header, sizeof(header)) != sizeof(header))
+ return MZ_READ_ERROR;
+
+ for (i = 0; i < MZ_PKCRYPT_HEADER_SIZE - 2; i++)
+ header[i] = mz_stream_pkcrypt_decode(stream, header[i]);
+
+ verify1 = mz_stream_pkcrypt_decode(stream, header[i++]);
+ verify2 = mz_stream_pkcrypt_decode(stream, header[i++]);
+
+ /* Older versions used 2 byte check, newer versions use 1 byte check. */
+ MZ_UNUSED(verify1);
+ if ((verify2 != 0) && (verify2 != pkcrypt->verify2))
+ return MZ_PASSWORD_ERROR;
+
+ pkcrypt->total_in += MZ_PKCRYPT_HEADER_SIZE;
+ }
+
+ pkcrypt->initialized = 1;
+ return MZ_OK;
+}
+
+int32_t mz_stream_pkcrypt_is_open(void *stream) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ if (!pkcrypt->initialized)
+ return MZ_OPEN_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_stream_pkcrypt_read(void *stream, void *buf, int32_t size) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ uint8_t *buf_ptr = (uint8_t *)buf;
+ int32_t bytes_to_read = size;
+ int32_t read = 0;
+ int32_t i = 0;
+
+ if ((int64_t)bytes_to_read > (pkcrypt->max_total_in - pkcrypt->total_in))
+ bytes_to_read = (int32_t)(pkcrypt->max_total_in - pkcrypt->total_in);
+
+ read = mz_stream_read(pkcrypt->stream.base, buf, bytes_to_read);
+
+ for (i = 0; i < read; i++)
+ buf_ptr[i] = mz_stream_pkcrypt_decode(stream, buf_ptr[i]);
+
+ if (read > 0)
+ pkcrypt->total_in += read;
+
+ return read;
+}
+
+int32_t mz_stream_pkcrypt_write(void *stream, const void *buf, int32_t size) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ const uint8_t *buf_ptr = (const uint8_t *)buf;
+ int32_t bytes_to_write = sizeof(pkcrypt->buffer);
+ int32_t total_written = 0;
+ int32_t written = 0;
+ int32_t i = 0;
+ uint16_t t = 0;
+
+ if (size < 0)
+ return MZ_PARAM_ERROR;
+
+ do {
+ if (bytes_to_write > (size - total_written))
+ bytes_to_write = (size - total_written);
+
+ for (i = 0; i < bytes_to_write; i += 1) {
+ pkcrypt->buffer[i] = mz_stream_pkcrypt_encode(stream, *buf_ptr, t);
+ buf_ptr += 1;
+ }
+
+ written = mz_stream_write(pkcrypt->stream.base, pkcrypt->buffer, bytes_to_write);
+ if (written < 0)
+ return written;
+
+ total_written += written;
+ } while (total_written < size && written > 0);
+
+ pkcrypt->total_out += total_written;
+ return total_written;
+}
+
+int64_t mz_stream_pkcrypt_tell(void *stream) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ return mz_stream_tell(pkcrypt->stream.base);
+}
+
+int32_t mz_stream_pkcrypt_seek(void *stream, int64_t offset, int32_t origin) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ return mz_stream_seek(pkcrypt->stream.base, offset, origin);
+}
+
+int32_t mz_stream_pkcrypt_close(void *stream) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ pkcrypt->initialized = 0;
+ return MZ_OK;
+}
+
+int32_t mz_stream_pkcrypt_error(void *stream) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ return pkcrypt->error;
+}
+
+void mz_stream_pkcrypt_set_password(void *stream, const char *password) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ pkcrypt->password = password;
+}
+
+void mz_stream_pkcrypt_set_verify(void *stream, uint8_t verify1, uint8_t verify2) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ pkcrypt->verify1 = verify1;
+ pkcrypt->verify2 = verify2;
+}
+
+void mz_stream_pkcrypt_get_verify(void *stream, uint8_t *verify1, uint8_t *verify2) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ *verify1 = pkcrypt->verify1;
+ *verify2 = pkcrypt->verify2;
+}
+
+int32_t mz_stream_pkcrypt_get_prop_int64(void *stream, int32_t prop, int64_t *value) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ switch (prop) {
+ case MZ_STREAM_PROP_TOTAL_IN:
+ *value = pkcrypt->total_in;
+ break;
+ case MZ_STREAM_PROP_TOTAL_OUT:
+ *value = pkcrypt->total_out;
+ break;
+ case MZ_STREAM_PROP_TOTAL_IN_MAX:
+ *value = pkcrypt->max_total_in;
+ break;
+ case MZ_STREAM_PROP_HEADER_SIZE:
+ *value = MZ_PKCRYPT_HEADER_SIZE;
+ break;
+ case MZ_STREAM_PROP_FOOTER_SIZE:
+ *value = 0;
+ break;
+ default:
+ return MZ_EXIST_ERROR;
+ }
+ return MZ_OK;
+}
+
+int32_t mz_stream_pkcrypt_set_prop_int64(void *stream, int32_t prop, int64_t value) {
+ mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream;
+ switch (prop) {
+ case MZ_STREAM_PROP_TOTAL_IN_MAX:
+ pkcrypt->max_total_in = value;
+ break;
+ default:
+ return MZ_EXIST_ERROR;
+ }
+ return MZ_OK;
+}
+
+void *mz_stream_pkcrypt_create(void **stream) {
+ mz_stream_pkcrypt *pkcrypt = NULL;
+
+ pkcrypt = (mz_stream_pkcrypt *)calloc(1, sizeof(mz_stream_pkcrypt));
+ if (pkcrypt)
+ pkcrypt->stream.vtbl = &mz_stream_pkcrypt_vtbl;
+ if (stream)
+ *stream = pkcrypt;
+
+ return pkcrypt;
+}
+
+void mz_stream_pkcrypt_delete(void **stream) {
+ mz_stream_pkcrypt *pkcrypt = NULL;
+ if (!stream)
+ return;
+ pkcrypt = (mz_stream_pkcrypt *)*stream;
+ if (pkcrypt)
+ free(pkcrypt);
+ *stream = NULL;
+}
+
+void *mz_stream_pkcrypt_get_interface(void) {
+ return (void *)&mz_stream_pkcrypt_vtbl;
+}
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.h b/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.h
new file mode 100644
index 000000000..1d6fb465c
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.h
@@ -0,0 +1,46 @@
+/* mz_strm_pkcrypt.h -- Code for traditional PKWARE encryption
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_STREAM_PKCRYPT_H
+#define MZ_STREAM_PKCRYPT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+int32_t mz_stream_pkcrypt_open(void *stream, const char *filename, int32_t mode);
+int32_t mz_stream_pkcrypt_is_open(void *stream);
+int32_t mz_stream_pkcrypt_read(void *stream, void *buf, int32_t size);
+int32_t mz_stream_pkcrypt_write(void *stream, const void *buf, int32_t size);
+int64_t mz_stream_pkcrypt_tell(void *stream);
+int32_t mz_stream_pkcrypt_seek(void *stream, int64_t offset, int32_t origin);
+int32_t mz_stream_pkcrypt_close(void *stream);
+int32_t mz_stream_pkcrypt_error(void *stream);
+
+void mz_stream_pkcrypt_set_password(void *stream, const char *password);
+void mz_stream_pkcrypt_set_verify(void *stream, uint8_t verify1, uint8_t verify2);
+void mz_stream_pkcrypt_get_verify(void *stream, uint8_t *verify1, uint8_t *verify2);
+int32_t mz_stream_pkcrypt_get_prop_int64(void *stream, int32_t prop, int64_t *value);
+int32_t mz_stream_pkcrypt_set_prop_int64(void *stream, int32_t prop, int64_t value);
+
+void* mz_stream_pkcrypt_create(void **stream);
+void mz_stream_pkcrypt_delete(void **stream);
+
+void* mz_stream_pkcrypt_get_interface(void);
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_split.c b/ios/CodePush/SSZipArchive/minizip/mz_strm_split.c
new file mode 100644
index 000000000..faf833fe0
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_split.c
@@ -0,0 +1,429 @@
+/* mz_strm_split.c -- Stream for split files
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_os.h"
+#include "mz_strm.h"
+#include "mz_strm_split.h"
+
+#include /* snprintf */
+
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+# define snprintf _snprintf
+#endif
+
+/***************************************************************************/
+
+#define MZ_ZIP_MAGIC_DISKHEADER (0x08074b50)
+
+/***************************************************************************/
+
+static mz_stream_vtbl mz_stream_split_vtbl = {
+ mz_stream_split_open,
+ mz_stream_split_is_open,
+ mz_stream_split_read,
+ mz_stream_split_write,
+ mz_stream_split_tell,
+ mz_stream_split_seek,
+ mz_stream_split_close,
+ mz_stream_split_error,
+ mz_stream_split_create,
+ mz_stream_split_delete,
+ mz_stream_split_get_prop_int64,
+ mz_stream_split_set_prop_int64
+};
+
+/***************************************************************************/
+
+typedef struct mz_stream_split_s {
+ mz_stream stream;
+ int32_t is_open;
+ int64_t disk_size;
+ int64_t total_in;
+ int64_t total_in_disk;
+ int64_t total_out;
+ int64_t total_out_disk;
+ int32_t mode;
+ char *path_cd;
+ char *path_disk;
+ uint32_t path_disk_size;
+ int32_t number_disk;
+ int32_t current_disk;
+ int64_t current_disk_size;
+ int32_t reached_end;
+} mz_stream_split;
+
+/***************************************************************************/
+
+#if 0
+# define mz_stream_split_print printf
+#else
+# define mz_stream_split_print(fmt, ...)
+#endif
+
+/***************************************************************************/
+
+static int32_t mz_stream_split_open_disk(void *stream, int32_t number_disk) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ uint32_t magic = 0;
+ int64_t position = 0;
+ int32_t i = 0;
+ int32_t err = MZ_OK;
+ int16_t disk_part = 0;
+
+ /* Check if we are reading or writing a disk part or the cd disk */
+ if (number_disk >= 0) {
+ if ((split->mode & MZ_OPEN_MODE_WRITE) == 0)
+ disk_part = MZ_OPEN_MODE_READ;
+ else if (split->disk_size > 0)
+ disk_part = MZ_OPEN_MODE_WRITE;
+ }
+
+ /* Construct disk path */
+ if (disk_part > 0) {
+ for (i = (int32_t)strlen(split->path_disk) - 1; i >= 0; i -= 1) {
+ if (split->path_disk[i] != '.')
+ continue;
+ snprintf(&split->path_disk[i], split->path_disk_size - (uint32_t)i,
+ ".z%02" PRId32, number_disk + 1);
+ break;
+ }
+ } else {
+ strncpy(split->path_disk, split->path_cd, split->path_disk_size - 1);
+ split->path_disk[split->path_disk_size - 1] = 0;
+ }
+
+ mz_stream_split_print("Split - Goto disk - %s (disk %" PRId32 ")\n", split->path_disk, number_disk);
+
+ /* If disk part doesn't exist during reading then return MZ_EXIST_ERROR */
+ if (disk_part == MZ_OPEN_MODE_READ)
+ err = mz_os_file_exists(split->path_disk);
+
+ if (err == MZ_OK)
+ err = mz_stream_open(split->stream.base, split->path_disk, split->mode);
+
+ if (err == MZ_OK) {
+ split->total_in_disk = 0;
+ split->total_out_disk = 0;
+ split->current_disk = number_disk;
+
+ if (split->mode & MZ_OPEN_MODE_WRITE) {
+ if ((split->current_disk == 0) && (split->disk_size > 0)) {
+ err = mz_stream_write_uint32(split->stream.base, MZ_ZIP_MAGIC_DISKHEADER);
+
+ split->total_out_disk += 4;
+ split->total_out += split->total_out_disk;
+ }
+ } else if (split->mode & MZ_OPEN_MODE_READ) {
+ if (split->current_disk == 0) {
+ err = mz_stream_read_uint32(split->stream.base, &magic);
+ if (magic != MZ_ZIP_MAGIC_DISKHEADER)
+ err = MZ_FORMAT_ERROR;
+ }
+ }
+ }
+
+ if (err == MZ_OK) {
+ /* Get the size of the current disk we are on */
+ position = mz_stream_tell(split->stream.base);
+ mz_stream_seek(split->stream.base, 0, MZ_SEEK_END);
+ split->current_disk_size = mz_stream_tell(split->stream.base);
+ mz_stream_seek(split->stream.base, position, MZ_SEEK_SET);
+
+ split->is_open = 1;
+ }
+
+ return err;
+}
+
+static int32_t mz_stream_split_close_disk(void *stream) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+
+ if (mz_stream_is_open(split->stream.base) != MZ_OK)
+ return MZ_OK;
+
+ mz_stream_split_print("Split - Close disk\n");
+ return mz_stream_close(split->stream.base);
+}
+
+static int32_t mz_stream_split_goto_disk(void *stream, int32_t number_disk) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ int32_t err = MZ_OK;
+ int32_t err_is_open = MZ_OK;
+
+ err_is_open = mz_stream_is_open(split->stream.base);
+
+ if ((split->disk_size == 0) && (split->mode & MZ_OPEN_MODE_WRITE)) {
+ if (err_is_open != MZ_OK)
+ err = mz_stream_split_open_disk(stream, number_disk);
+ } else if ((number_disk != split->current_disk) || (err_is_open != MZ_OK)) {
+ err = mz_stream_split_close_disk(stream);
+ if (err == MZ_OK) {
+ err = mz_stream_split_open_disk(stream, number_disk);
+ if (err == MZ_OK)
+ split->number_disk = number_disk;
+ }
+ }
+
+ return err;
+}
+
+int32_t mz_stream_split_open(void *stream, const char *path, int32_t mode) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ int32_t number_disk = 0;
+
+ split->mode = mode;
+ split->path_cd = strdup(path);
+
+ if (!split->path_cd)
+ return MZ_MEM_ERROR;
+
+ mz_stream_split_print("Split - Open - %s (disk %" PRId32 ")\n", split->path_cd, number_disk);
+
+ split->path_disk_size = (uint32_t)strlen(path) + 10;
+ split->path_disk = (char *)malloc(split->path_disk_size);
+
+ if (!split->path_disk) {
+ free(split->path_cd);
+ return MZ_MEM_ERROR;
+ }
+
+ strncpy(split->path_disk, path, split->path_disk_size - 1);
+ split->path_disk[split->path_disk_size - 1] = 0;
+
+ if ((mode & MZ_OPEN_MODE_WRITE) && ((mode & MZ_OPEN_MODE_APPEND) == 0)) {
+ number_disk = 0;
+ split->current_disk = -1;
+ } else {
+ number_disk = -1;
+ split->current_disk = 0;
+ }
+
+ return mz_stream_split_goto_disk(stream, number_disk);
+}
+
+int32_t mz_stream_split_is_open(void *stream) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ if (split->is_open != 1)
+ return MZ_OPEN_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_stream_split_read(void *stream, void *buf, int32_t size) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ int32_t bytes_left = size;
+ int32_t read = 0;
+ int32_t err = MZ_OK;
+ uint8_t *buf_ptr = (uint8_t *)buf;
+
+ err = mz_stream_split_goto_disk(stream, split->number_disk);
+ if (err != MZ_OK)
+ return err;
+
+ while (bytes_left > 0) {
+ read = mz_stream_read(split->stream.base, buf_ptr, bytes_left);
+
+ mz_stream_split_print("Split - Read disk - %" PRId32 "\n", read);
+
+ if (read < 0)
+ return read;
+ if (read == 0) {
+ if (split->current_disk < 0) /* No more disks to goto */
+ break;
+ err = mz_stream_split_goto_disk(stream, split->current_disk + 1);
+ if (err == MZ_EXIST_ERROR) {
+ split->current_disk = -1;
+ break;
+ }
+ if (err != MZ_OK)
+ return err;
+ }
+
+ bytes_left -= read;
+ buf_ptr += read;
+ split->total_in += read;
+ split->total_in_disk += read;
+ }
+ return size - bytes_left;
+}
+
+int32_t mz_stream_split_write(void *stream, const void *buf, int32_t size) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ int64_t position = 0;
+ int32_t written = 0;
+ int32_t bytes_left = size;
+ int32_t bytes_to_write = 0;
+ int32_t bytes_avail = 0;
+ int32_t number_disk = -1;
+ int32_t err = MZ_OK;
+ const uint8_t *buf_ptr = (const uint8_t *)buf;
+
+ position = mz_stream_tell(split->stream.base);
+
+ while (bytes_left > 0) {
+ bytes_to_write = bytes_left;
+
+ if (split->disk_size > 0) {
+ if ((split->total_out_disk == split->disk_size && split->total_out > 0) ||
+ (split->number_disk == -1 && split->number_disk != split->current_disk)) {
+ if (split->number_disk != -1)
+ number_disk = split->current_disk + 1;
+
+ err = mz_stream_split_goto_disk(stream, number_disk);
+ if (err != MZ_OK)
+ return err;
+
+ position = 0;
+ }
+
+ if (split->number_disk != -1) {
+ bytes_avail = (int32_t)(split->disk_size - split->total_out_disk);
+ if (bytes_to_write > bytes_avail)
+ bytes_to_write = bytes_avail;
+ }
+ }
+
+ written = mz_stream_write(split->stream.base, buf_ptr, bytes_to_write);
+ if (written != bytes_to_write)
+ return MZ_WRITE_ERROR;
+
+ mz_stream_split_print("Split - Write disk - %" PRId32 "\n", written);
+
+ bytes_left -= written;
+ buf_ptr += written;
+
+ split->total_out += written;
+ split->total_out_disk += written;
+
+ position += written;
+ if (position > split->current_disk_size)
+ split->current_disk_size = position;
+ }
+
+ return size - bytes_left;
+}
+
+int64_t mz_stream_split_tell(void *stream) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ int32_t err = MZ_OK;
+ err = mz_stream_split_goto_disk(stream, split->number_disk);
+ if (err != MZ_OK)
+ return err;
+ return mz_stream_tell(split->stream.base);
+}
+
+int32_t mz_stream_split_seek(void *stream, int64_t offset, int32_t origin) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ int64_t disk_left = 0;
+ int64_t position = 0;
+ int32_t err = MZ_OK;
+
+ err = mz_stream_split_goto_disk(stream, split->number_disk);
+
+ if (err != MZ_OK)
+ return err;
+
+ mz_stream_split_print("Split - Seek disk - %" PRId64 " (origin %" PRId32 ")\n", offset, origin);
+
+ if ((origin == MZ_SEEK_CUR) && (split->number_disk != -1)) {
+ position = mz_stream_tell(split->stream.base);
+ disk_left = split->current_disk_size - position;
+
+ while (offset > disk_left) {
+ err = mz_stream_split_goto_disk(stream, split->current_disk + 1);
+ if (err != MZ_OK)
+ return err;
+
+ offset -= disk_left;
+ disk_left = split->current_disk_size;
+ }
+ }
+
+ return mz_stream_seek(split->stream.base, offset, origin);
+}
+
+int32_t mz_stream_split_close(void *stream) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ int32_t err = MZ_OK;
+
+ err = mz_stream_split_close_disk(stream);
+ split->is_open = 0;
+ return err;
+}
+
+int32_t mz_stream_split_error(void *stream) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ return mz_stream_error(split->stream.base);
+}
+
+int32_t mz_stream_split_get_prop_int64(void *stream, int32_t prop, int64_t *value) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ switch (prop) {
+ case MZ_STREAM_PROP_TOTAL_OUT:
+ *value = split->total_out;
+ break;
+ case MZ_STREAM_PROP_DISK_NUMBER:
+ *value = split->number_disk;
+ break;
+ case MZ_STREAM_PROP_DISK_SIZE:
+ *value = split->disk_size;
+ break;
+ default:
+ return MZ_EXIST_ERROR;
+ }
+ return MZ_OK;
+}
+
+int32_t mz_stream_split_set_prop_int64(void *stream, int32_t prop, int64_t value) {
+ mz_stream_split *split = (mz_stream_split *)stream;
+ switch (prop) {
+ case MZ_STREAM_PROP_DISK_NUMBER:
+ split->number_disk = (int32_t)value;
+ break;
+ case MZ_STREAM_PROP_DISK_SIZE:
+ split->disk_size = value;
+ break;
+ default:
+ return MZ_EXIST_ERROR;
+ }
+ return MZ_OK;
+}
+
+void *mz_stream_split_create(void **stream) {
+ mz_stream_split *split = NULL;
+
+ split = (mz_stream_split *)calloc(1, sizeof(mz_stream_split));
+ if (split)
+ split->stream.vtbl = &mz_stream_split_vtbl;
+ if (stream)
+ *stream = split;
+
+ return split;
+}
+
+void mz_stream_split_delete(void **stream) {
+ mz_stream_split *split = NULL;
+ if (!stream)
+ return;
+ split = (mz_stream_split *)*stream;
+ if (split) {
+ if (split->path_cd)
+ free(split->path_cd);
+ if (split->path_disk)
+ free(split->path_disk);
+
+ free(split);
+ }
+ *stream = NULL;
+}
+
+void *mz_stream_split_get_interface(void) {
+ return (void *)&mz_stream_split_vtbl;
+}
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_split.h b/ios/CodePush/SSZipArchive/minizip/mz_strm_split.h
new file mode 100644
index 000000000..d03054b56
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_split.h
@@ -0,0 +1,43 @@
+/* mz_strm_split.h -- Stream for split files
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_STREAM_SPLIT_H
+#define MZ_STREAM_SPLIT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+int32_t mz_stream_split_open(void *stream, const char *filename, int32_t mode);
+int32_t mz_stream_split_is_open(void *stream);
+int32_t mz_stream_split_read(void *stream, void *buf, int32_t size);
+int32_t mz_stream_split_write(void *stream, const void *buf, int32_t size);
+int64_t mz_stream_split_tell(void *stream);
+int32_t mz_stream_split_seek(void *stream, int64_t offset, int32_t origin);
+int32_t mz_stream_split_close(void *stream);
+int32_t mz_stream_split_error(void *stream);
+
+int32_t mz_stream_split_get_prop_int64(void *stream, int32_t prop, int64_t *value);
+int32_t mz_stream_split_set_prop_int64(void *stream, int32_t prop, int64_t value);
+
+void* mz_stream_split_create(void **stream);
+void mz_stream_split_delete(void **stream);
+
+void* mz_stream_split_get_interface(void);
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.c b/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.c
new file mode 100644
index 000000000..bf2deb76b
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.c
@@ -0,0 +1,360 @@
+/* mz_strm_wzaes.c -- Stream for WinZip AES encryption
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+ Copyright (C) 1998-2010 Brian Gladman, Worcester, UK
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_crypt.h"
+#include "mz_strm.h"
+#include "mz_strm_wzaes.h"
+
+/***************************************************************************/
+
+#define MZ_AES_KEYING_ITERATIONS (1000)
+#define MZ_AES_SALT_LENGTH(MODE) (4 * (MODE & 3) + 4)
+#define MZ_AES_SALT_LENGTH_MAX (16)
+#define MZ_AES_PW_LENGTH_MAX (128)
+#define MZ_AES_PW_VERIFY_SIZE (2)
+#define MZ_AES_AUTHCODE_SIZE (10)
+
+/***************************************************************************/
+
+static mz_stream_vtbl mz_stream_wzaes_vtbl = {
+ mz_stream_wzaes_open,
+ mz_stream_wzaes_is_open,
+ mz_stream_wzaes_read,
+ mz_stream_wzaes_write,
+ mz_stream_wzaes_tell,
+ mz_stream_wzaes_seek,
+ mz_stream_wzaes_close,
+ mz_stream_wzaes_error,
+ mz_stream_wzaes_create,
+ mz_stream_wzaes_delete,
+ mz_stream_wzaes_get_prop_int64,
+ mz_stream_wzaes_set_prop_int64
+};
+
+/***************************************************************************/
+
+typedef struct mz_stream_wzaes_s {
+ mz_stream stream;
+ int32_t mode;
+ int32_t error;
+ int16_t initialized;
+ uint8_t buffer[UINT16_MAX];
+ int64_t total_in;
+ int64_t max_total_in;
+ int64_t total_out;
+ int16_t encryption_mode;
+ const char *password;
+ void *aes;
+ uint32_t crypt_pos;
+ uint8_t crypt_block[MZ_AES_BLOCK_SIZE];
+ void *hmac;
+ uint8_t nonce[MZ_AES_BLOCK_SIZE];
+} mz_stream_wzaes;
+
+/***************************************************************************/
+
+int32_t mz_stream_wzaes_open(void *stream, const char *path, int32_t mode) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ uint16_t salt_length = 0;
+ uint16_t password_length = 0;
+ uint16_t key_length = 0;
+ uint8_t kbuf[2 * MZ_AES_KEY_LENGTH_MAX + MZ_AES_PW_VERIFY_SIZE];
+ uint8_t verify[MZ_AES_PW_VERIFY_SIZE];
+ uint8_t verify_expected[MZ_AES_PW_VERIFY_SIZE];
+ uint8_t salt_value[MZ_AES_SALT_LENGTH_MAX];
+ const char *password = path;
+
+ wzaes->total_in = 0;
+ wzaes->total_out = 0;
+ wzaes->initialized = 0;
+
+ if (mz_stream_is_open(wzaes->stream.base) != MZ_OK)
+ return MZ_OPEN_ERROR;
+
+ if (!password)
+ password = wzaes->password;
+ if (!password)
+ return MZ_PARAM_ERROR;
+ password_length = (uint16_t)strlen(password);
+ if (password_length > MZ_AES_PW_LENGTH_MAX)
+ return MZ_PARAM_ERROR;
+
+ if (wzaes->encryption_mode < 1 || wzaes->encryption_mode > 3)
+ return MZ_PARAM_ERROR;
+
+ salt_length = MZ_AES_SALT_LENGTH(wzaes->encryption_mode);
+
+ if (mode & MZ_OPEN_MODE_WRITE) {
+ mz_crypt_rand(salt_value, salt_length);
+ } else if (mode & MZ_OPEN_MODE_READ) {
+ if (mz_stream_read(wzaes->stream.base, salt_value, salt_length) != salt_length)
+ return MZ_READ_ERROR;
+ }
+
+ key_length = MZ_AES_KEY_LENGTH(wzaes->encryption_mode);
+
+ /* Derive the encryption and authentication keys and the password verifier */
+ mz_crypt_pbkdf2((uint8_t *)password, password_length, salt_value, salt_length,
+ MZ_AES_KEYING_ITERATIONS, kbuf, 2 * key_length + MZ_AES_PW_VERIFY_SIZE);
+
+ /* Initialize the encryption nonce and buffer pos */
+ wzaes->crypt_pos = MZ_AES_BLOCK_SIZE;
+ memset(wzaes->nonce, 0, sizeof(wzaes->nonce));
+
+ /* Initialize for encryption using key 1 */
+ mz_crypt_aes_reset(wzaes->aes);
+ mz_crypt_aes_set_mode(wzaes->aes, wzaes->encryption_mode);
+ mz_crypt_aes_set_encrypt_key(wzaes->aes, kbuf, key_length);
+
+ /* Initialize for authentication using key 2 */
+ mz_crypt_hmac_reset(wzaes->hmac);
+ mz_crypt_hmac_set_algorithm(wzaes->hmac, MZ_HASH_SHA1);
+ mz_crypt_hmac_init(wzaes->hmac, kbuf + key_length, key_length);
+
+ memcpy(verify, kbuf + (2 * key_length), MZ_AES_PW_VERIFY_SIZE);
+
+ if (mode & MZ_OPEN_MODE_WRITE) {
+ if (mz_stream_write(wzaes->stream.base, salt_value, salt_length) != salt_length)
+ return MZ_WRITE_ERROR;
+
+ wzaes->total_out += salt_length;
+
+ if (mz_stream_write(wzaes->stream.base, verify, MZ_AES_PW_VERIFY_SIZE) != MZ_AES_PW_VERIFY_SIZE)
+ return MZ_WRITE_ERROR;
+
+ wzaes->total_out += MZ_AES_PW_VERIFY_SIZE;
+ } else if (mode & MZ_OPEN_MODE_READ) {
+ wzaes->total_in += salt_length;
+
+ if (mz_stream_read(wzaes->stream.base, verify_expected, MZ_AES_PW_VERIFY_SIZE) != MZ_AES_PW_VERIFY_SIZE)
+ return MZ_READ_ERROR;
+
+ wzaes->total_in += MZ_AES_PW_VERIFY_SIZE;
+
+ if (memcmp(verify_expected, verify, MZ_AES_PW_VERIFY_SIZE) != 0)
+ return MZ_PASSWORD_ERROR;
+ }
+
+ wzaes->mode = mode;
+ wzaes->initialized = 1;
+
+ return MZ_OK;
+}
+
+int32_t mz_stream_wzaes_is_open(void *stream) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ if (!wzaes->initialized)
+ return MZ_OPEN_ERROR;
+ return MZ_OK;
+}
+
+static int32_t mz_stream_wzaes_ctr_encrypt(void *stream, uint8_t *buf, int32_t size) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ uint32_t pos = wzaes->crypt_pos;
+ uint32_t i = 0;
+ int32_t err = MZ_OK;
+
+ while (i < (uint32_t)size) {
+ if (pos == MZ_AES_BLOCK_SIZE) {
+ uint32_t j = 0;
+
+ /* Increment encryption nonce */
+ while (j < 8 && !++wzaes->nonce[j])
+ j += 1;
+
+ /* Encrypt the nonce to form next xor buffer */
+ memcpy(wzaes->crypt_block, wzaes->nonce, MZ_AES_BLOCK_SIZE);
+ mz_crypt_aes_encrypt(wzaes->aes, wzaes->crypt_block, sizeof(wzaes->crypt_block));
+ pos = 0;
+ }
+
+ buf[i++] ^= wzaes->crypt_block[pos++];
+ }
+
+ wzaes->crypt_pos = pos;
+ return err;
+}
+
+int32_t mz_stream_wzaes_read(void *stream, void *buf, int32_t size) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ int64_t max_total_in = 0;
+ int32_t bytes_to_read = size;
+ int32_t read = 0;
+
+ max_total_in = wzaes->max_total_in - MZ_AES_FOOTER_SIZE;
+ if ((int64_t)bytes_to_read > (max_total_in - wzaes->total_in))
+ bytes_to_read = (int32_t)(max_total_in - wzaes->total_in);
+
+ read = mz_stream_read(wzaes->stream.base, buf, bytes_to_read);
+
+ if (read > 0) {
+ mz_crypt_hmac_update(wzaes->hmac, (uint8_t *)buf, read);
+ mz_stream_wzaes_ctr_encrypt(stream, (uint8_t *)buf, read);
+
+ wzaes->total_in += read;
+ }
+
+ return read;
+}
+
+int32_t mz_stream_wzaes_write(void *stream, const void *buf, int32_t size) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ const uint8_t *buf_ptr = (const uint8_t *)buf;
+ int32_t bytes_to_write = sizeof(wzaes->buffer);
+ int32_t total_written = 0;
+ int32_t written = 0;
+
+ if (size < 0)
+ return MZ_PARAM_ERROR;
+
+ do {
+ if (bytes_to_write > (size - total_written))
+ bytes_to_write = (size - total_written);
+
+ memcpy(wzaes->buffer, buf_ptr, bytes_to_write);
+ buf_ptr += bytes_to_write;
+
+ mz_stream_wzaes_ctr_encrypt(stream, (uint8_t *)wzaes->buffer, bytes_to_write);
+ mz_crypt_hmac_update(wzaes->hmac, wzaes->buffer, bytes_to_write);
+
+ written = mz_stream_write(wzaes->stream.base, wzaes->buffer, bytes_to_write);
+ if (written < 0)
+ return written;
+
+ total_written += written;
+ } while (total_written < size && written > 0);
+
+ wzaes->total_out += total_written;
+ return total_written;
+}
+
+int64_t mz_stream_wzaes_tell(void *stream) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ return mz_stream_tell(wzaes->stream.base);
+}
+
+int32_t mz_stream_wzaes_seek(void *stream, int64_t offset, int32_t origin) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ return mz_stream_seek(wzaes->stream.base, offset, origin);
+}
+
+int32_t mz_stream_wzaes_close(void *stream) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ uint8_t expected_hash[MZ_AES_AUTHCODE_SIZE];
+ uint8_t computed_hash[MZ_HASH_SHA1_SIZE];
+
+ mz_crypt_hmac_end(wzaes->hmac, computed_hash, sizeof(computed_hash));
+
+ if (wzaes->mode & MZ_OPEN_MODE_WRITE) {
+ if (mz_stream_write(wzaes->stream.base, computed_hash, MZ_AES_AUTHCODE_SIZE) != MZ_AES_AUTHCODE_SIZE)
+ return MZ_WRITE_ERROR;
+
+ wzaes->total_out += MZ_AES_AUTHCODE_SIZE;
+ } else if (wzaes->mode & MZ_OPEN_MODE_READ) {
+ if (mz_stream_read(wzaes->stream.base, expected_hash, MZ_AES_AUTHCODE_SIZE) != MZ_AES_AUTHCODE_SIZE)
+ return MZ_READ_ERROR;
+
+ wzaes->total_in += MZ_AES_AUTHCODE_SIZE;
+
+ /* If entire entry was not read this will fail */
+ if (memcmp(computed_hash, expected_hash, MZ_AES_AUTHCODE_SIZE) != 0)
+ return MZ_CRC_ERROR;
+ }
+
+ wzaes->initialized = 0;
+ return MZ_OK;
+}
+
+int32_t mz_stream_wzaes_error(void *stream) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ return wzaes->error;
+}
+
+void mz_stream_wzaes_set_password(void *stream, const char *password) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ wzaes->password = password;
+}
+
+void mz_stream_wzaes_set_encryption_mode(void *stream, int16_t encryption_mode) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ wzaes->encryption_mode = encryption_mode;
+}
+
+int32_t mz_stream_wzaes_get_prop_int64(void *stream, int32_t prop, int64_t *value) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ switch (prop) {
+ case MZ_STREAM_PROP_TOTAL_IN:
+ *value = wzaes->total_in;
+ break;
+ case MZ_STREAM_PROP_TOTAL_OUT:
+ *value = wzaes->total_out;
+ break;
+ case MZ_STREAM_PROP_TOTAL_IN_MAX:
+ *value = wzaes->max_total_in;
+ break;
+ case MZ_STREAM_PROP_HEADER_SIZE:
+ *value = MZ_AES_SALT_LENGTH((int64_t)wzaes->encryption_mode) + MZ_AES_PW_VERIFY_SIZE;
+ break;
+ case MZ_STREAM_PROP_FOOTER_SIZE:
+ *value = MZ_AES_AUTHCODE_SIZE;
+ break;
+ default:
+ return MZ_EXIST_ERROR;
+ }
+ return MZ_OK;
+}
+
+int32_t mz_stream_wzaes_set_prop_int64(void *stream, int32_t prop, int64_t value) {
+ mz_stream_wzaes *wzaes = (mz_stream_wzaes *)stream;
+ switch (prop) {
+ case MZ_STREAM_PROP_TOTAL_IN_MAX:
+ wzaes->max_total_in = value;
+ break;
+ default:
+ return MZ_EXIST_ERROR;
+ }
+ return MZ_OK;
+}
+
+void *mz_stream_wzaes_create(void **stream) {
+ mz_stream_wzaes *wzaes = NULL;
+
+ wzaes = (mz_stream_wzaes *)calloc(1, sizeof(mz_stream_wzaes));
+ if (wzaes) {
+ wzaes->stream.vtbl = &mz_stream_wzaes_vtbl;
+ wzaes->encryption_mode = MZ_AES_ENCRYPTION_MODE_256;
+
+ mz_crypt_hmac_create(&wzaes->hmac);
+ mz_crypt_aes_create(&wzaes->aes);
+ }
+ if (stream)
+ *stream = wzaes;
+
+ return wzaes;
+}
+
+void mz_stream_wzaes_delete(void **stream) {
+ mz_stream_wzaes *wzaes = NULL;
+ if (!stream)
+ return;
+ wzaes = (mz_stream_wzaes *)*stream;
+ if (wzaes) {
+ mz_crypt_aes_delete(&wzaes->aes);
+ mz_crypt_hmac_delete(&wzaes->hmac);
+ free(wzaes);
+ }
+ *stream = NULL;
+}
+
+void *mz_stream_wzaes_get_interface(void) {
+ return (void *)&mz_stream_wzaes_vtbl;
+}
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.h b/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.h
new file mode 100644
index 000000000..5163c80c8
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.h
@@ -0,0 +1,46 @@
+/* mz_strm_wzaes.h -- Stream for WinZIP AES encryption
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_STREAM_WZAES_SHA1_H
+#define MZ_STREAM_WZAES_SHA1_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+int32_t mz_stream_wzaes_open(void *stream, const char *filename, int32_t mode);
+int32_t mz_stream_wzaes_is_open(void *stream);
+int32_t mz_stream_wzaes_read(void *stream, void *buf, int32_t size);
+int32_t mz_stream_wzaes_write(void *stream, const void *buf, int32_t size);
+int64_t mz_stream_wzaes_tell(void *stream);
+int32_t mz_stream_wzaes_seek(void *stream, int64_t offset, int32_t origin);
+int32_t mz_stream_wzaes_close(void *stream);
+int32_t mz_stream_wzaes_error(void *stream);
+
+void mz_stream_wzaes_set_password(void *stream, const char *password);
+void mz_stream_wzaes_set_encryption_mode(void *stream, int16_t encryption_mode);
+
+int32_t mz_stream_wzaes_get_prop_int64(void *stream, int32_t prop, int64_t *value);
+int32_t mz_stream_wzaes_set_prop_int64(void *stream, int32_t prop, int64_t value);
+
+void* mz_stream_wzaes_create(void **stream);
+void mz_stream_wzaes_delete(void **stream);
+
+void* mz_stream_wzaes_get_interface(void);
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.c b/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.c
new file mode 100644
index 000000000..b7ac4d1a6
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.c
@@ -0,0 +1,389 @@
+/* mz_strm_zlib.c -- Stream for zlib inflate/deflate
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_strm.h"
+#include "mz_strm_zlib.h"
+
+#if !defined(ZLIB_COMPAT)
+# include "zlib-ng.h"
+#else
+# include "zlib.h"
+#endif
+
+/***************************************************************************/
+
+#if !defined(ZLIB_COMPAT)
+# define ZLIB_PREFIX(x) zng_ ## x
+ typedef zng_stream zlib_stream;
+#else
+# define ZLIB_PREFIX(x) x
+ typedef z_stream zlib_stream;
+#endif
+
+#if !defined(DEF_MEM_LEVEL)
+# if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+# else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+# endif
+#endif
+
+/***************************************************************************/
+
+static mz_stream_vtbl mz_stream_zlib_vtbl = {
+ mz_stream_zlib_open,
+ mz_stream_zlib_is_open,
+ mz_stream_zlib_read,
+ mz_stream_zlib_write,
+ mz_stream_zlib_tell,
+ mz_stream_zlib_seek,
+ mz_stream_zlib_close,
+ mz_stream_zlib_error,
+ mz_stream_zlib_create,
+ mz_stream_zlib_delete,
+ mz_stream_zlib_get_prop_int64,
+ mz_stream_zlib_set_prop_int64
+};
+
+/***************************************************************************/
+
+typedef struct mz_stream_zlib_s {
+ mz_stream stream;
+ zlib_stream zstream;
+ uint8_t buffer[INT16_MAX];
+ int32_t buffer_len;
+ int64_t total_in;
+ int64_t total_out;
+ int64_t max_total_in;
+ int8_t initialized;
+ int16_t level;
+ int32_t window_bits;
+ int32_t mode;
+ int32_t error;
+} mz_stream_zlib;
+
+/***************************************************************************/
+
+int32_t mz_stream_zlib_open(void *stream, const char *path, int32_t mode) {
+ mz_stream_zlib *zlib = (mz_stream_zlib *)stream;
+
+ MZ_UNUSED(path);
+
+ zlib->zstream.data_type = Z_BINARY;
+ zlib->zstream.zalloc = Z_NULL;
+ zlib->zstream.zfree = Z_NULL;
+ zlib->zstream.opaque = Z_NULL;
+ zlib->zstream.total_in = 0;
+ zlib->zstream.total_out = 0;
+
+ zlib->total_in = 0;
+ zlib->total_out = 0;
+
+ if (mode & MZ_OPEN_MODE_WRITE) {
+#ifdef MZ_ZIP_NO_COMPRESSION
+ return MZ_SUPPORT_ERROR;
+#else
+ zlib->zstream.next_out = zlib->buffer;
+ zlib->zstream.avail_out = sizeof(zlib->buffer);
+
+ zlib->error = ZLIB_PREFIX(deflateInit2)(&zlib->zstream, (int8_t)zlib->level, Z_DEFLATED,
+ zlib->window_bits, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
+#endif
+ } else if (mode & MZ_OPEN_MODE_READ) {
+#ifdef MZ_ZIP_NO_DECOMPRESSION
+ return MZ_SUPPORT_ERROR;
+#else
+ zlib->zstream.next_in = zlib->buffer;
+ zlib->zstream.avail_in = 0;
+
+ zlib->error = ZLIB_PREFIX(inflateInit2)(&zlib->zstream, zlib->window_bits);
+#endif
+ }
+
+ if (zlib->error != Z_OK)
+ return MZ_OPEN_ERROR;
+
+ zlib->initialized = 1;
+ zlib->mode = mode;
+ return MZ_OK;
+}
+
+int32_t mz_stream_zlib_is_open(void *stream) {
+ mz_stream_zlib *zlib = (mz_stream_zlib *)stream;
+ if (zlib->initialized != 1)
+ return MZ_OPEN_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_stream_zlib_read(void *stream, void *buf, int32_t size) {
+#ifdef MZ_ZIP_NO_DECOMPRESSION
+ MZ_UNUSED(stream);
+ MZ_UNUSED(buf);
+ MZ_UNUSED(size);
+ return MZ_SUPPORT_ERROR;
+#else
+ mz_stream_zlib *zlib = (mz_stream_zlib *)stream;
+ uint64_t total_in_before = 0;
+ uint64_t total_in_after = 0;
+ uint64_t total_out_before = 0;
+ uint64_t total_out_after = 0;
+ uint32_t total_in = 0;
+ uint32_t total_out = 0;
+ uint32_t in_bytes = 0;
+ uint32_t out_bytes = 0;
+ int32_t bytes_to_read = sizeof(zlib->buffer);
+ int32_t read = 0;
+ int32_t err = Z_OK;
+
+ zlib->zstream.next_out = (Bytef *)buf;
+ zlib->zstream.avail_out = (uInt)size;
+
+ do {
+ if (zlib->zstream.avail_in == 0) {
+ if (zlib->max_total_in > 0) {
+ if ((int64_t)bytes_to_read > (zlib->max_total_in - zlib->total_in))
+ bytes_to_read = (int32_t)(zlib->max_total_in - zlib->total_in);
+ }
+
+ read = mz_stream_read(zlib->stream.base, zlib->buffer, bytes_to_read);
+
+ if (read < 0)
+ return read;
+
+ zlib->zstream.next_in = zlib->buffer;
+ zlib->zstream.avail_in = read;
+ }
+
+ total_in_before = zlib->zstream.avail_in;
+ total_out_before = zlib->zstream.total_out;
+
+ err = ZLIB_PREFIX(inflate)(&zlib->zstream, Z_SYNC_FLUSH);
+ if ((err >= Z_OK) && (zlib->zstream.msg)) {
+ zlib->error = Z_DATA_ERROR;
+ break;
+ }
+
+ total_in_after = zlib->zstream.avail_in;
+ total_out_after = zlib->zstream.total_out;
+
+ in_bytes = (uint32_t)(total_in_before - total_in_after);
+ out_bytes = (uint32_t)(total_out_after - total_out_before);
+
+ total_in += in_bytes;
+ total_out += out_bytes;
+
+ zlib->total_in += in_bytes;
+ zlib->total_out += out_bytes;
+
+ if (err == Z_STREAM_END)
+ break;
+ if (err != Z_OK) {
+ zlib->error = err;
+ break;
+ }
+ } while (zlib->zstream.avail_out > 0);
+
+ if (zlib->error != 0) {
+ /* Zlib errors are compatible with MZ */
+ return zlib->error;
+ }
+
+ return total_out;
+#endif
+}
+
+#ifndef MZ_ZIP_NO_COMPRESSION
+static int32_t mz_stream_zlib_flush(void *stream) {
+ mz_stream_zlib *zlib = (mz_stream_zlib *)stream;
+ if (mz_stream_write(zlib->stream.base, zlib->buffer, zlib->buffer_len) != zlib->buffer_len)
+ return MZ_WRITE_ERROR;
+ return MZ_OK;
+}
+
+static int32_t mz_stream_zlib_deflate(void *stream, int flush) {
+ mz_stream_zlib *zlib = (mz_stream_zlib *)stream;
+ uint64_t total_out_before = 0;
+ uint64_t total_out_after = 0;
+ int32_t out_bytes = 0;
+ int32_t err = Z_OK;
+
+ do {
+ if (zlib->zstream.avail_out == 0) {
+ err = mz_stream_zlib_flush(zlib);
+ if (err != MZ_OK)
+ return err;
+
+ zlib->zstream.avail_out = sizeof(zlib->buffer);
+ zlib->zstream.next_out = zlib->buffer;
+
+ zlib->buffer_len = 0;
+ }
+
+ total_out_before = zlib->zstream.total_out;
+ err = ZLIB_PREFIX(deflate)(&zlib->zstream, flush);
+ total_out_after = zlib->zstream.total_out;
+
+ out_bytes = (uint32_t)(total_out_after - total_out_before);
+
+ zlib->buffer_len += out_bytes;
+ zlib->total_out += out_bytes;
+
+ if (err == Z_STREAM_END)
+ break;
+ if (err != Z_OK) {
+ zlib->error = err;
+ return MZ_DATA_ERROR;
+ }
+ } while ((zlib->zstream.avail_in > 0) || (flush == Z_FINISH && err == Z_OK));
+
+ return MZ_OK;
+}
+#endif
+
+int32_t mz_stream_zlib_write(void *stream, const void *buf, int32_t size) {
+#ifdef MZ_ZIP_NO_COMPRESSION
+ MZ_UNUSED(stream);
+ MZ_UNUSED(buf);
+ MZ_UNUSED(size);
+ return MZ_SUPPORT_ERROR;
+#else
+ mz_stream_zlib *zlib = (mz_stream_zlib *)stream;
+ int32_t err = MZ_OK;
+
+ zlib->zstream.next_in = (Bytef *)(intptr_t)buf;
+ zlib->zstream.avail_in = (uInt)size;
+
+ err = mz_stream_zlib_deflate(stream, Z_NO_FLUSH);
+ if (err != MZ_OK) {
+ return err;
+ }
+
+ zlib->total_in += size;
+ return size;
+#endif
+}
+
+int64_t mz_stream_zlib_tell(void *stream) {
+ MZ_UNUSED(stream);
+
+ return MZ_TELL_ERROR;
+}
+
+int32_t mz_stream_zlib_seek(void *stream, int64_t offset, int32_t origin) {
+ MZ_UNUSED(stream);
+ MZ_UNUSED(offset);
+ MZ_UNUSED(origin);
+
+ return MZ_SEEK_ERROR;
+}
+
+int32_t mz_stream_zlib_close(void *stream) {
+ mz_stream_zlib *zlib = (mz_stream_zlib *)stream;
+
+ if (zlib->mode & MZ_OPEN_MODE_WRITE) {
+#ifdef MZ_ZIP_NO_COMPRESSION
+ return MZ_SUPPORT_ERROR;
+#else
+ mz_stream_zlib_deflate(stream, Z_FINISH);
+ mz_stream_zlib_flush(stream);
+
+ ZLIB_PREFIX(deflateEnd)(&zlib->zstream);
+#endif
+ } else if (zlib->mode & MZ_OPEN_MODE_READ) {
+#ifdef MZ_ZIP_NO_DECOMPRESSION
+ return MZ_SUPPORT_ERROR;
+#else
+ ZLIB_PREFIX(inflateEnd)(&zlib->zstream);
+#endif
+ }
+
+ zlib->initialized = 0;
+
+ if (zlib->error != Z_OK)
+ return MZ_CLOSE_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_stream_zlib_error(void *stream) {
+ mz_stream_zlib *zlib = (mz_stream_zlib *)stream;
+ return zlib->error;
+}
+
+int32_t mz_stream_zlib_get_prop_int64(void *stream, int32_t prop, int64_t *value) {
+ mz_stream_zlib *zlib = (mz_stream_zlib *)stream;
+ switch (prop) {
+ case MZ_STREAM_PROP_TOTAL_IN:
+ *value = zlib->total_in;
+ break;
+ case MZ_STREAM_PROP_TOTAL_IN_MAX:
+ *value = zlib->max_total_in;
+ break;
+ case MZ_STREAM_PROP_TOTAL_OUT:
+ *value = zlib->total_out;
+ break;
+ case MZ_STREAM_PROP_HEADER_SIZE:
+ *value = 0;
+ break;
+ case MZ_STREAM_PROP_COMPRESS_WINDOW:
+ *value = zlib->window_bits;
+ break;
+ default:
+ return MZ_EXIST_ERROR;
+ }
+ return MZ_OK;
+}
+
+int32_t mz_stream_zlib_set_prop_int64(void *stream, int32_t prop, int64_t value) {
+ mz_stream_zlib *zlib = (mz_stream_zlib *)stream;
+ switch (prop) {
+ case MZ_STREAM_PROP_COMPRESS_LEVEL:
+ zlib->level = (int16_t)value;
+ break;
+ case MZ_STREAM_PROP_TOTAL_IN_MAX:
+ zlib->max_total_in = value;
+ break;
+ case MZ_STREAM_PROP_COMPRESS_WINDOW:
+ zlib->window_bits = (int32_t)value;
+ break;
+ default:
+ return MZ_EXIST_ERROR;
+ }
+ return MZ_OK;
+}
+
+void *mz_stream_zlib_create(void **stream) {
+ mz_stream_zlib *zlib = NULL;
+
+ zlib = (mz_stream_zlib *)calloc(1, sizeof(mz_stream_zlib));
+ if (zlib) {
+ zlib->stream.vtbl = &mz_stream_zlib_vtbl;
+ zlib->level = Z_DEFAULT_COMPRESSION;
+ zlib->window_bits = -MAX_WBITS;
+ }
+ if (stream)
+ *stream = zlib;
+
+ return zlib;
+}
+
+void mz_stream_zlib_delete(void **stream) {
+ mz_stream_zlib *zlib = NULL;
+ if (!stream)
+ return;
+ zlib = (mz_stream_zlib *)*stream;
+ if (zlib)
+ free(zlib);
+ *stream = NULL;
+}
+
+void *mz_stream_zlib_get_interface(void) {
+ return (void *)&mz_stream_zlib_vtbl;
+}
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.h b/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.h
new file mode 100644
index 000000000..4bdcdf813
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.h
@@ -0,0 +1,43 @@
+/* mz_strm_zlib.h -- Stream for zlib inflate/deflate
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_STREAM_ZLIB_H
+#define MZ_STREAM_ZLIB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+int32_t mz_stream_zlib_open(void *stream, const char *filename, int32_t mode);
+int32_t mz_stream_zlib_is_open(void *stream);
+int32_t mz_stream_zlib_read(void *stream, void *buf, int32_t size);
+int32_t mz_stream_zlib_write(void *stream, const void *buf, int32_t size);
+int64_t mz_stream_zlib_tell(void *stream);
+int32_t mz_stream_zlib_seek(void *stream, int64_t offset, int32_t origin);
+int32_t mz_stream_zlib_close(void *stream);
+int32_t mz_stream_zlib_error(void *stream);
+
+int32_t mz_stream_zlib_get_prop_int64(void *stream, int32_t prop, int64_t *value);
+int32_t mz_stream_zlib_set_prop_int64(void *stream, int32_t prop, int64_t value);
+
+void* mz_stream_zlib_create(void **stream);
+void mz_stream_zlib_delete(void **stream);
+
+void* mz_stream_zlib_get_interface(void);
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_zip.c b/ios/CodePush/SSZipArchive/minizip/mz_zip.c
new file mode 100644
index 000000000..e80550f0e
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_zip.c
@@ -0,0 +1,2782 @@
+/* zip.c -- Zip manipulation
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+ Copyright (C) 2009-2010 Mathias Svensson
+ Modifications for Zip64 support
+ http://result42.com
+ Copyright (C) 2007-2008 Even Rouault
+ Modifications of Unzip for Zip64
+ Copyright (C) 1998-2010 Gilles Vollant
+ https://www.winimage.com/zLibDll/minizip.html
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_crypt.h"
+#include "mz_strm.h"
+#ifdef HAVE_BZIP2
+# include "mz_strm_bzip.h"
+#endif
+#ifdef HAVE_LIBCOMP
+# include "mz_strm_libcomp.h"
+#endif
+#ifdef HAVE_LZMA
+# include "mz_strm_lzma.h"
+#endif
+#include "mz_strm_mem.h"
+#ifdef HAVE_PKCRYPT
+# include "mz_strm_pkcrypt.h"
+#endif
+#ifdef HAVE_WZAES
+# include "mz_strm_wzaes.h"
+#endif
+#ifdef HAVE_ZLIB
+# include "mz_strm_zlib.h"
+#endif
+#ifdef HAVE_ZSTD
+# include "mz_strm_zstd.h"
+#endif
+
+#include "mz_zip.h"
+
+#include /* tolower */
+#include /* snprintf */
+
+#if defined(_MSC_VER) || defined(__MINGW32__)
+# define localtime_r(t1, t2) (localtime_s(t2, t1) == 0 ? t1 : NULL)
+#endif
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+# define snprintf _snprintf
+#endif
+
+/***************************************************************************/
+
+#define MZ_ZIP_MAGIC_LOCALHEADER (0x04034b50)
+#define MZ_ZIP_MAGIC_LOCALHEADERU8 { 0x50, 0x4b, 0x03, 0x04 }
+#define MZ_ZIP_MAGIC_CENTRALHEADER (0x02014b50)
+#define MZ_ZIP_MAGIC_CENTRALHEADERU8 { 0x50, 0x4b, 0x01, 0x02 }
+#define MZ_ZIP_MAGIC_ENDHEADER (0x06054b50)
+#define MZ_ZIP_MAGIC_ENDHEADERU8 { 0x50, 0x4b, 0x05, 0x06 }
+#define MZ_ZIP_MAGIC_ENDHEADER64 (0x06064b50)
+#define MZ_ZIP_MAGIC_ENDLOCHEADER64 (0x07064b50)
+#define MZ_ZIP_MAGIC_DATADESCRIPTOR (0x08074b50)
+#define MZ_ZIP_MAGIC_DATADESCRIPTORU8 { 0x50, 0x4b, 0x07, 0x08 }
+
+#define MZ_ZIP_SIZE_LD_ITEM (30)
+#define MZ_ZIP_SIZE_CD_ITEM (46)
+#define MZ_ZIP_SIZE_CD_LOCATOR64 (20)
+#define MZ_ZIP_SIZE_MAX_DATA_DESCRIPTOR (24)
+
+#define MZ_ZIP_OFFSET_CRC_SIZES (14)
+#define MZ_ZIP_UNCOMPR_SIZE64_CUSHION (2 * 1024 * 1024)
+
+#ifndef MZ_ZIP_EOCD_MAX_BACK
+#define MZ_ZIP_EOCD_MAX_BACK (1 << 20)
+#endif
+
+/***************************************************************************/
+
+typedef struct mz_zip_s {
+ mz_zip_file file_info;
+ mz_zip_file local_file_info;
+
+ void *stream; /* main stream */
+ void *cd_stream; /* pointer to the stream with the cd */
+ void *cd_mem_stream; /* memory stream for central directory */
+ void *compress_stream; /* compression stream */
+ void *crypt_stream; /* encryption stream */
+ void *file_info_stream; /* memory stream for storing file info */
+ void *local_file_info_stream; /* memory stream for storing local file info */
+
+ int32_t open_mode;
+ uint8_t recover;
+ uint8_t data_descriptor;
+
+ uint32_t disk_number_with_cd; /* number of the disk with the central dir */
+ int64_t disk_offset_shift; /* correction for zips that have wrong offset start of cd */
+
+ int64_t cd_start_pos; /* pos of the first file in the central dir stream */
+ int64_t cd_current_pos; /* pos of the current file in the central dir */
+ int64_t cd_offset; /* offset of start of central directory */
+ int64_t cd_size; /* size of the central directory */
+ uint32_t cd_signature; /* signature of central directory */
+
+ uint8_t entry_scanned; /* entry header information read ok */
+ uint8_t entry_opened; /* entry is open for read/write */
+ uint8_t entry_raw; /* entry opened with raw mode */
+ uint32_t entry_crc32; /* entry crc32 */
+
+ uint64_t number_entry;
+
+ uint16_t version_madeby;
+ char *comment;
+} mz_zip;
+
+/***************************************************************************/
+
+#if 0
+# define mz_zip_print printf
+#else
+# define mz_zip_print(fmt, ...)
+#endif
+
+/***************************************************************************/
+
+/* Locate the end of central directory */
+static int32_t mz_zip_search_eocd(void *stream, int64_t *central_pos) {
+ int64_t file_size = 0;
+ int64_t max_back = MZ_ZIP_EOCD_MAX_BACK;
+ uint8_t find[4] = MZ_ZIP_MAGIC_ENDHEADERU8;
+ int32_t err = MZ_OK;
+
+ err = mz_stream_seek(stream, 0, MZ_SEEK_END);
+ if (err != MZ_OK)
+ return err;
+
+ file_size = mz_stream_tell(stream);
+
+ if (max_back <= 0 || max_back > file_size)
+ max_back = file_size;
+
+ return mz_stream_find_reverse(stream, (const void *)find, sizeof(find), max_back, central_pos);
+}
+
+/* Locate the end of central directory 64 of a zip file */
+static int32_t mz_zip_search_zip64_eocd(void *stream, const int64_t end_central_offset, int64_t *central_pos) {
+ int64_t offset = 0;
+ uint32_t value32 = 0;
+ int32_t err = MZ_OK;
+
+ *central_pos = 0;
+
+ /* Zip64 end of central directory locator */
+ err = mz_stream_seek(stream, end_central_offset - MZ_ZIP_SIZE_CD_LOCATOR64, MZ_SEEK_SET);
+ /* Read locator signature */
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint32(stream, &value32);
+ if (value32 != MZ_ZIP_MAGIC_ENDLOCHEADER64)
+ err = MZ_FORMAT_ERROR;
+ }
+ /* Number of the disk with the start of the zip64 end of central directory */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(stream, &value32);
+ /* Relative offset of the zip64 end of central directory record8 */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint64(stream, (uint64_t *)&offset);
+ /* Total number of disks */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(stream, &value32);
+ /* Goto end of central directory record */
+ if (err == MZ_OK)
+ err = mz_stream_seek(stream, (int64_t)offset, MZ_SEEK_SET);
+ /* The signature */
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint32(stream, &value32);
+ if (value32 != MZ_ZIP_MAGIC_ENDHEADER64)
+ err = MZ_FORMAT_ERROR;
+ }
+
+ if (err == MZ_OK)
+ *central_pos = offset;
+
+ return err;
+}
+
+#ifdef HAVE_PKCRYPT
+/* Get PKWARE traditional encryption verifier */
+static uint16_t mz_zip_get_pk_verify(uint32_t dos_date, uint64_t crc, uint16_t flag)
+{
+ /* Info-ZIP modification to ZipCrypto format: if bit 3 of the general
+ * purpose bit flag is set, it uses high byte of 16-bit File Time. */
+ if (flag & MZ_ZIP_FLAG_DATA_DESCRIPTOR)
+ return ((dos_date >> 16) & 0xff) << 8 | ((dos_date >> 8) & 0xff);
+ return ((crc >> 16) & 0xff) << 8 | ((crc >> 24) & 0xff);
+}
+#endif
+
+/* Get info about the current file in the zip file */
+static int32_t mz_zip_entry_read_header(void *stream, uint8_t local, mz_zip_file *file_info, void *file_extra_stream) {
+ uint64_t ntfs_time = 0;
+ uint32_t reserved = 0;
+ uint32_t magic = 0;
+ uint32_t dos_date = 0;
+ uint32_t field_pos = 0;
+ uint16_t field_type = 0;
+ uint16_t field_length = 0;
+ uint32_t field_length_read = 0;
+ uint16_t ntfs_attrib_id = 0;
+ uint16_t ntfs_attrib_size = 0;
+ uint16_t linkname_size;
+ uint16_t value16 = 0;
+ uint32_t value32 = 0;
+ int64_t extrafield_pos = 0;
+ int64_t comment_pos = 0;
+ int64_t linkname_pos = 0;
+ int64_t saved_pos = 0;
+ int32_t err = MZ_OK;
+ char *linkname = NULL;
+
+ memset(file_info, 0, sizeof(mz_zip_file));
+
+ /* Check the magic */
+ err = mz_stream_read_uint32(stream, &magic);
+ if (err == MZ_END_OF_STREAM)
+ err = MZ_END_OF_LIST;
+ else if (magic == MZ_ZIP_MAGIC_ENDHEADER || magic == MZ_ZIP_MAGIC_ENDHEADER64)
+ err = MZ_END_OF_LIST;
+ else if ((local) && (magic != MZ_ZIP_MAGIC_LOCALHEADER))
+ err = MZ_FORMAT_ERROR;
+ else if ((!local) && (magic != MZ_ZIP_MAGIC_CENTRALHEADER))
+ err = MZ_FORMAT_ERROR;
+
+ /* Read header fields */
+ if (err == MZ_OK) {
+ if (!local)
+ err = mz_stream_read_uint16(stream, &file_info->version_madeby);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(stream, &file_info->version_needed);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(stream, &file_info->flag);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(stream, &file_info->compression_method);
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint32(stream, &dos_date);
+ file_info->modified_date = mz_zip_dosdate_to_time_t(dos_date);
+ }
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(stream, &file_info->crc);
+#ifdef HAVE_PKCRYPT
+ if (err == MZ_OK && file_info->flag & MZ_ZIP_FLAG_ENCRYPTED) {
+ /* Use dos_date from header instead of derived from time in zip extensions */
+ file_info->pk_verify = mz_zip_get_pk_verify(dos_date, file_info->crc, file_info->flag);
+ }
+#endif
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint32(stream, &value32);
+ file_info->compressed_size = value32;
+ }
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint32(stream, &value32);
+ file_info->uncompressed_size = value32;
+ }
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(stream, &file_info->filename_size);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(stream, &file_info->extrafield_size);
+ if (!local) {
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(stream, &file_info->comment_size);
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint16(stream, &value16);
+ file_info->disk_number = value16;
+ }
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(stream, &file_info->internal_fa);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(stream, &file_info->external_fa);
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint32(stream, &value32);
+ file_info->disk_offset = value32;
+ }
+ }
+ }
+
+ if (err == MZ_OK)
+ err = mz_stream_seek(file_extra_stream, 0, MZ_SEEK_SET);
+
+ /* Copy variable length data to memory stream for later retrieval */
+ if ((err == MZ_OK) && (file_info->filename_size > 0))
+ err = mz_stream_copy(file_extra_stream, stream, file_info->filename_size);
+ mz_stream_write_uint8(file_extra_stream, 0);
+ extrafield_pos = mz_stream_tell(file_extra_stream);
+
+ if ((err == MZ_OK) && (file_info->extrafield_size > 0))
+ err = mz_stream_copy(file_extra_stream, stream, file_info->extrafield_size);
+ mz_stream_write_uint8(file_extra_stream, 0);
+
+ comment_pos = mz_stream_tell(file_extra_stream);
+ if ((err == MZ_OK) && (file_info->comment_size > 0))
+ err = mz_stream_copy(file_extra_stream, stream, file_info->comment_size);
+ mz_stream_write_uint8(file_extra_stream, 0);
+
+ linkname_pos = mz_stream_tell(file_extra_stream);
+ /* Overwrite if we encounter UNIX1 extra block */
+ mz_stream_write_uint8(file_extra_stream, 0);
+
+ if ((err == MZ_OK) && (file_info->extrafield_size > 0)) {
+ /* Seek to and parse the extra field */
+ err = mz_stream_seek(file_extra_stream, extrafield_pos, MZ_SEEK_SET);
+
+ while ((err == MZ_OK) && (field_pos + 4 <= file_info->extrafield_size)) {
+ err = mz_zip_extrafield_read(file_extra_stream, &field_type, &field_length);
+ if (err != MZ_OK)
+ break;
+ field_pos += 4;
+
+ /* Don't allow field length to exceed size of remaining extrafield */
+ if (field_length > (file_info->extrafield_size - field_pos))
+ field_length = (uint16_t)(file_info->extrafield_size - field_pos);
+
+ /* Read ZIP64 extra field */
+ if ((field_type == MZ_ZIP_EXTENSION_ZIP64) && (field_length >= 8)) {
+ if ((err == MZ_OK) && (file_info->uncompressed_size == UINT32_MAX)) {
+ err = mz_stream_read_int64(file_extra_stream, &file_info->uncompressed_size);
+ if (file_info->uncompressed_size < 0)
+ err = MZ_FORMAT_ERROR;
+ }
+ if ((err == MZ_OK) && (file_info->compressed_size == UINT32_MAX)) {
+ err = mz_stream_read_int64(file_extra_stream, &file_info->compressed_size);
+ if (file_info->compressed_size < 0)
+ err = MZ_FORMAT_ERROR;
+ }
+ if ((err == MZ_OK) && (file_info->disk_offset == UINT32_MAX)) {
+ err = mz_stream_read_int64(file_extra_stream, &file_info->disk_offset);
+ if (file_info->disk_offset < 0)
+ err = MZ_FORMAT_ERROR;
+ }
+ if ((err == MZ_OK) && (file_info->disk_number == UINT16_MAX))
+ err = mz_stream_read_uint32(file_extra_stream, &file_info->disk_number);
+ }
+ /* Read NTFS extra field */
+ else if ((field_type == MZ_ZIP_EXTENSION_NTFS) && (field_length > 4)) {
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(file_extra_stream, &reserved);
+ field_length_read = 4;
+
+ while ((err == MZ_OK) && (field_length_read + 4 <= field_length)) {
+ err = mz_stream_read_uint16(file_extra_stream, &ntfs_attrib_id);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(file_extra_stream, &ntfs_attrib_size);
+ field_length_read += 4;
+
+ if ((err == MZ_OK) && (ntfs_attrib_id == 0x01) && (ntfs_attrib_size == 24)) {
+ err = mz_stream_read_uint64(file_extra_stream, &ntfs_time);
+ mz_zip_ntfs_to_unix_time(ntfs_time, &file_info->modified_date);
+
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint64(file_extra_stream, &ntfs_time);
+ mz_zip_ntfs_to_unix_time(ntfs_time, &file_info->accessed_date);
+ }
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint64(file_extra_stream, &ntfs_time);
+ mz_zip_ntfs_to_unix_time(ntfs_time, &file_info->creation_date);
+ }
+ } else if ((err == MZ_OK) && (field_length_read + ntfs_attrib_size <= field_length)) {
+ err = mz_stream_seek(file_extra_stream, ntfs_attrib_size, MZ_SEEK_CUR);
+ }
+
+ field_length_read += ntfs_attrib_size;
+ }
+ }
+ /* Read UNIX1 extra field */
+ else if ((field_type == MZ_ZIP_EXTENSION_UNIX1) && (field_length >= 12)) {
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint32(file_extra_stream, &value32);
+ if (err == MZ_OK && file_info->accessed_date == 0)
+ file_info->accessed_date = value32;
+ }
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint32(file_extra_stream, &value32);
+ if (err == MZ_OK && file_info->modified_date == 0)
+ file_info->modified_date = value32;
+ }
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(file_extra_stream, &value16); /* User id */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(file_extra_stream, &value16); /* Group id */
+
+ /* Copy linkname to end of file extra stream so we can return null
+ terminated string */
+ linkname_size = field_length - 12;
+ if ((err == MZ_OK) && (linkname_size > 0)) {
+ linkname = (char *)malloc(linkname_size);
+ if (linkname) {
+ if (mz_stream_read(file_extra_stream, linkname, linkname_size) != linkname_size)
+ err = MZ_READ_ERROR;
+ if (err == MZ_OK) {
+ saved_pos = mz_stream_tell(file_extra_stream);
+
+ mz_stream_seek(file_extra_stream, linkname_pos, MZ_SEEK_SET);
+ mz_stream_write(file_extra_stream, linkname, linkname_size);
+ mz_stream_write_uint8(file_extra_stream, 0);
+
+ mz_stream_seek(file_extra_stream, saved_pos, MZ_SEEK_SET);
+ }
+ free(linkname);
+ }
+ }
+ }
+#ifdef HAVE_WZAES
+ /* Read AES extra field */
+ else if ((field_type == MZ_ZIP_EXTENSION_AES) && (field_length == 7)) {
+ uint8_t value8 = 0;
+ /* Verify version info */
+ err = mz_stream_read_uint16(file_extra_stream, &value16);
+ /* Support AE-1 and AE-2 */
+ if (value16 != 1 && value16 != 2)
+ err = MZ_FORMAT_ERROR;
+ file_info->aes_version = value16;
+ if (err == MZ_OK)
+ err = mz_stream_read_uint8(file_extra_stream, &value8);
+ if ((char)value8 != 'A')
+ err = MZ_FORMAT_ERROR;
+ if (err == MZ_OK)
+ err = mz_stream_read_uint8(file_extra_stream, &value8);
+ if ((char)value8 != 'E')
+ err = MZ_FORMAT_ERROR;
+ /* Get AES encryption strength and actual compression method */
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint8(file_extra_stream, &value8);
+ file_info->aes_encryption_mode = value8;
+ }
+ if (err == MZ_OK) {
+ err = mz_stream_read_uint16(file_extra_stream, &value16);
+ file_info->compression_method = value16;
+ }
+ }
+#endif
+ else if (field_length > 0) {
+ err = mz_stream_seek(file_extra_stream, field_length, MZ_SEEK_CUR);
+ }
+
+ field_pos += field_length;
+ }
+ }
+
+ /* Get pointers to variable length data */
+ mz_stream_mem_get_buffer(file_extra_stream, (const void **)&file_info->filename);
+ mz_stream_mem_get_buffer_at(file_extra_stream, extrafield_pos, (const void **)&file_info->extrafield);
+ mz_stream_mem_get_buffer_at(file_extra_stream, comment_pos, (const void **)&file_info->comment);
+ mz_stream_mem_get_buffer_at(file_extra_stream, linkname_pos, (const void **)&file_info->linkname);
+
+ /* Set to empty string just in-case */
+ if (!file_info->filename)
+ file_info->filename = "";
+ if (!file_info->extrafield)
+ file_info->extrafield_size = 0;
+ if (!file_info->comment)
+ file_info->comment = "";
+ if (!file_info->linkname)
+ file_info->linkname = "";
+
+ if (err == MZ_OK) {
+ mz_zip_print("Zip - Entry - Read header - %s (local %" PRId8 ")\n",
+ file_info->filename, local);
+ mz_zip_print("Zip - Entry - Read header compress (ucs %" PRId64 " cs %" PRId64 " crc 0x%08" PRIx32 ")\n",
+ file_info->uncompressed_size, file_info->compressed_size, file_info->crc);
+ if (!local) {
+ mz_zip_print("Zip - Entry - Read header disk (disk %" PRIu32 " offset %" PRId64 ")\n",
+ file_info->disk_number, file_info->disk_offset);
+ }
+ mz_zip_print("Zip - Entry - Read header variable (fnl %" PRId32 " efs %" PRId32 " cms %" PRId32 ")\n",
+ file_info->filename_size, file_info->extrafield_size, file_info->comment_size);
+ }
+
+ return err;
+}
+
+static int32_t mz_zip_entry_read_descriptor(void *stream, uint8_t zip64, uint32_t *crc32, int64_t *compressed_size, int64_t *uncompressed_size) {
+ uint32_t value32 = 0;
+ int64_t value64 = 0;
+ int32_t err = MZ_OK;
+
+ err = mz_stream_read_uint32(stream, &value32);
+ if (value32 != MZ_ZIP_MAGIC_DATADESCRIPTOR)
+ err = MZ_FORMAT_ERROR;
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(stream, &value32);
+ if (err == MZ_OK && crc32)
+ *crc32 = value32;
+ if (err == MZ_OK) {
+ /* If zip 64 extension is enabled then read as 8 byte */
+ if (!zip64) {
+ err = mz_stream_read_uint32(stream, &value32);
+ value64 = value32;
+ } else {
+ err = mz_stream_read_int64(stream, &value64);
+ if (value64 < 0)
+ err = MZ_FORMAT_ERROR;
+ }
+ if (err == MZ_OK && compressed_size)
+ *compressed_size = value64;
+ }
+ if (err == MZ_OK) {
+ if (!zip64) {
+ err = mz_stream_read_uint32(stream, &value32);
+ value64 = value32;
+ } else {
+ err = mz_stream_read_int64(stream, &value64);
+ if (value64 < 0)
+ err = MZ_FORMAT_ERROR;
+ }
+ if (err == MZ_OK && uncompressed_size)
+ *uncompressed_size = value64;
+ }
+
+ return err;
+}
+
+static int32_t mz_zip_entry_write_crc_sizes(void *stream, uint8_t zip64, uint8_t mask, mz_zip_file *file_info) {
+ int32_t err = MZ_OK;
+
+ if (mask)
+ err = mz_stream_write_uint32(stream, 0);
+ else
+ err = mz_stream_write_uint32(stream, file_info->crc); /* crc */
+
+ /* For backwards-compatibility with older zip applications we set all sizes to UINT32_MAX
+ * when zip64 is needed, instead of only setting sizes larger than UINT32_MAX. */
+
+ if (err == MZ_OK) {
+ if (zip64) /* compr size */
+ err = mz_stream_write_uint32(stream, UINT32_MAX);
+ else
+ err = mz_stream_write_uint32(stream, (uint32_t)file_info->compressed_size);
+ }
+ if (err == MZ_OK) {
+ if (mask) /* uncompr size */
+ err = mz_stream_write_uint32(stream, 0);
+ else if (zip64)
+ err = mz_stream_write_uint32(stream, UINT32_MAX);
+ else
+ err = mz_stream_write_uint32(stream, (uint32_t)file_info->uncompressed_size);
+ }
+ return err;
+}
+
+static int32_t mz_zip_entry_needs_zip64(mz_zip_file *file_info, uint8_t local, uint8_t *zip64) {
+ uint32_t max_uncompressed_size = UINT32_MAX;
+ uint8_t needs_zip64 = 0;
+
+ if (!zip64)
+ return MZ_PARAM_ERROR;
+
+ *zip64 = 0;
+
+ if (local) {
+ /* At local header we might not know yet whether compressed size will overflow unsigned
+ 32-bit integer which might happen for high entropy data so we give it some cushion */
+
+ max_uncompressed_size -= MZ_ZIP_UNCOMPR_SIZE64_CUSHION;
+ }
+
+ needs_zip64 = (file_info->uncompressed_size >= max_uncompressed_size) ||
+ (file_info->compressed_size >= UINT32_MAX);
+
+ if (!local) {
+ /* Disk offset and number only used in central directory header */
+ needs_zip64 |= (file_info->disk_offset >= UINT32_MAX) ||
+ (file_info->disk_number >= UINT16_MAX);
+ }
+
+ if (file_info->zip64 == MZ_ZIP64_AUTO) {
+ /* If uncompressed size is unknown, assume zip64 for 64-bit data descriptors */
+ if (local && file_info->uncompressed_size == 0) {
+ /* Don't use zip64 for local header directory entries */
+ if (mz_zip_attrib_is_dir(file_info->external_fa, file_info->version_madeby) != MZ_OK) {
+ *zip64 = 1;
+ }
+ }
+ *zip64 |= needs_zip64;
+ } else if (file_info->zip64 == MZ_ZIP64_FORCE) {
+ *zip64 = 1;
+ } else if (file_info->zip64 == MZ_ZIP64_DISABLE) {
+ /* Zip64 extension is required to zip file */
+ if (needs_zip64)
+ return MZ_PARAM_ERROR;
+ }
+
+ return MZ_OK;
+}
+
+static int32_t mz_zip_entry_write_header(void *stream, uint8_t local, mz_zip_file *file_info) {
+ uint64_t ntfs_time = 0;
+ uint32_t reserved = 0;
+ uint32_t dos_date = 0;
+ uint16_t extrafield_size = 0;
+ uint16_t field_type = 0;
+ uint16_t field_length = 0;
+ uint16_t field_length_zip64 = 0;
+ uint16_t field_length_ntfs = 0;
+ uint16_t field_length_aes = 0;
+ uint16_t field_length_unix1 = 0;
+ uint16_t filename_size = 0;
+ uint16_t filename_length = 0;
+ uint16_t linkname_size = 0;
+ uint16_t version_needed = 0;
+ int32_t comment_size = 0;
+ int32_t err = MZ_OK;
+ int32_t err_mem = MZ_OK;
+ uint8_t zip64 = 0;
+ uint8_t skip_aes = 0;
+ uint8_t mask = 0;
+ uint8_t write_end_slash = 0;
+ const char *filename = NULL;
+ char masked_name[64];
+ void *file_extra_stream = NULL;
+
+ if (!file_info)
+ return MZ_PARAM_ERROR;
+
+ if ((local) && (file_info->flag & MZ_ZIP_FLAG_MASK_LOCAL_INFO))
+ mask = 1;
+
+ /* Determine if zip64 extra field is necessary */
+ err = mz_zip_entry_needs_zip64(file_info, local, &zip64);
+ if (err != MZ_OK)
+ return err;
+
+ /* Start calculating extra field sizes */
+ if (zip64) {
+ /* Both compressed and uncompressed sizes must be included (at least in local header) */
+ field_length_zip64 = 8 + 8;
+ if ((!local) && (file_info->disk_offset >= UINT32_MAX))
+ field_length_zip64 += 8;
+
+ extrafield_size += 4;
+ extrafield_size += field_length_zip64;
+ }
+
+ /* Calculate extra field size and check for duplicates */
+ if (file_info->extrafield_size > 0) {
+ mz_stream_mem_create(&file_extra_stream);
+ mz_stream_mem_set_buffer(file_extra_stream, (void *)file_info->extrafield,
+ file_info->extrafield_size);
+
+ do {
+ err_mem = mz_stream_read_uint16(file_extra_stream, &field_type);
+ if (err_mem == MZ_OK)
+ err_mem = mz_stream_read_uint16(file_extra_stream, &field_length);
+ if (err_mem != MZ_OK)
+ break;
+
+ /* Prefer incoming aes extensions over ours */
+ if (field_type == MZ_ZIP_EXTENSION_AES)
+ skip_aes = 1;
+
+ /* Prefer our zip64, ntfs, unix1 extension over incoming */
+ if (field_type != MZ_ZIP_EXTENSION_ZIP64 && field_type != MZ_ZIP_EXTENSION_NTFS &&
+ field_type != MZ_ZIP_EXTENSION_UNIX1)
+ extrafield_size += 4 + field_length;
+
+ if (err_mem == MZ_OK)
+ err_mem = mz_stream_seek(file_extra_stream, field_length, MZ_SEEK_CUR);
+ } while (err_mem == MZ_OK);
+ }
+
+#ifdef HAVE_WZAES
+ if (!skip_aes) {
+ if ((file_info->flag & MZ_ZIP_FLAG_ENCRYPTED) && (file_info->aes_version)) {
+ field_length_aes = 1 + 1 + 1 + 2 + 2;
+ extrafield_size += 4 + field_length_aes;
+ }
+ }
+#else
+ MZ_UNUSED(field_length_aes);
+ MZ_UNUSED(skip_aes);
+#endif
+ /* NTFS timestamps */
+ if ((file_info->modified_date != 0) &&
+ (file_info->accessed_date != 0) &&
+ (file_info->creation_date != 0) && (!mask)) {
+ field_length_ntfs = 8 + 8 + 8 + 4 + 2 + 2;
+ extrafield_size += 4 + field_length_ntfs;
+ }
+
+ /* Unix1 symbolic links */
+ if (file_info->linkname && *file_info->linkname != 0) {
+ linkname_size = (uint16_t)strlen(file_info->linkname);
+ field_length_unix1 = 12 + linkname_size;
+ extrafield_size += 4 + field_length_unix1;
+ }
+
+ if (local)
+ err = mz_stream_write_uint32(stream, MZ_ZIP_MAGIC_LOCALHEADER);
+ else {
+ err = mz_stream_write_uint32(stream, MZ_ZIP_MAGIC_CENTRALHEADER);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, file_info->version_madeby);
+ }
+
+ /* Calculate version needed to extract */
+ if (err == MZ_OK) {
+ version_needed = file_info->version_needed;
+ if (version_needed == 0) {
+ version_needed = 20;
+ if (zip64)
+ version_needed = 45;
+#ifdef HAVE_WZAES
+ if ((file_info->flag & MZ_ZIP_FLAG_ENCRYPTED) && (file_info->aes_version))
+ version_needed = 51;
+#endif
+#if defined(HAVE_LZMA) || defined(HAVE_LIBCOMP)
+ if ((file_info->compression_method == MZ_COMPRESS_METHOD_LZMA) ||
+ (file_info->compression_method == MZ_COMPRESS_METHOD_XZ))
+ version_needed = 63;
+#endif
+ }
+ err = mz_stream_write_uint16(stream, version_needed);
+ }
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, file_info->flag);
+ if (err == MZ_OK) {
+#ifdef HAVE_WZAES
+ if ((file_info->flag & MZ_ZIP_FLAG_ENCRYPTED) && (file_info->aes_version))
+ err = mz_stream_write_uint16(stream, MZ_COMPRESS_METHOD_AES);
+ else
+#endif
+ err = mz_stream_write_uint16(stream, file_info->compression_method);
+ }
+ if (err == MZ_OK) {
+ if (file_info->modified_date != 0 && !mask)
+ dos_date = mz_zip_time_t_to_dos_date(file_info->modified_date);
+ err = mz_stream_write_uint32(stream, dos_date);
+ }
+
+ if (err == MZ_OK)
+ err = mz_zip_entry_write_crc_sizes(stream, zip64, mask, file_info);
+
+ if (mask) {
+ snprintf(masked_name, sizeof(masked_name), "%" PRIx32 "_%" PRIx64,
+ file_info->disk_number, file_info->disk_offset);
+ filename = masked_name;
+ } else {
+ filename = file_info->filename;
+ }
+
+ filename_length = (uint16_t)strlen(filename);
+ filename_size += filename_length;
+
+ if ((mz_zip_attrib_is_dir(file_info->external_fa, file_info->version_madeby) == MZ_OK) &&
+ ((filename[filename_length - 1] != '/') && (filename[filename_length - 1] != '\\'))) {
+ filename_size += 1;
+ write_end_slash = 1;
+ }
+
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, filename_size);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, extrafield_size);
+
+ if (!local) {
+ if (file_info->comment) {
+ comment_size = (int32_t)strlen(file_info->comment);
+ if (comment_size > UINT16_MAX)
+ comment_size = UINT16_MAX;
+ }
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, (uint16_t)comment_size);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, (uint16_t)file_info->disk_number);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, file_info->internal_fa);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(stream, file_info->external_fa);
+ if (err == MZ_OK) {
+ if (file_info->disk_offset >= UINT32_MAX)
+ err = mz_stream_write_uint32(stream, UINT32_MAX);
+ else
+ err = mz_stream_write_uint32(stream, (uint32_t)file_info->disk_offset);
+ }
+ }
+
+ if (err == MZ_OK) {
+ const char *backslash = NULL;
+ const char *next = filename;
+ int32_t left = filename_length;
+
+ /* Ensure all slashes are written as forward slashes according to 4.4.17.1 */
+ while ((err == MZ_OK) && (backslash = strrchr(next, '\\'))) {
+ int32_t part_length = (int32_t)(backslash - next);
+
+ if (mz_stream_write(stream, next, part_length) != part_length ||
+ mz_stream_write(stream, "/", 1) != 1)
+ err = MZ_WRITE_ERROR;
+
+ left -= part_length + 1;
+ next = backslash + 1;
+ }
+
+ if (err == MZ_OK && left > 0) {
+ if (mz_stream_write(stream, next, left) != left)
+ err = MZ_WRITE_ERROR;
+ }
+
+ /* Ensure that directories have a slash appended to them for compatibility */
+ if (err == MZ_OK && write_end_slash)
+ err = mz_stream_write_uint8(stream, '/');
+ }
+
+ /* Write ZIP64 extra field first so we can update sizes later if data descriptor not used */
+ if ((err == MZ_OK) && (zip64)) {
+ err = mz_zip_extrafield_write(stream, MZ_ZIP_EXTENSION_ZIP64, field_length_zip64);
+ if (err == MZ_OK) {
+ if (mask)
+ err = mz_stream_write_int64(stream, 0);
+ else
+ err = mz_stream_write_int64(stream, file_info->uncompressed_size);
+ }
+ if (err == MZ_OK)
+ err = mz_stream_write_int64(stream, file_info->compressed_size);
+ if ((err == MZ_OK) && (!local) && (file_info->disk_offset >= UINT32_MAX))
+ err = mz_stream_write_int64(stream, file_info->disk_offset);
+ if ((err == MZ_OK) && (!local) && (file_info->disk_number >= UINT16_MAX))
+ err = mz_stream_write_uint32(stream, file_info->disk_number);
+ }
+ /* Write NTFS extra field */
+ if ((err == MZ_OK) && (field_length_ntfs > 0)) {
+ err = mz_zip_extrafield_write(stream, MZ_ZIP_EXTENSION_NTFS, field_length_ntfs);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(stream, reserved);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, 0x01);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, field_length_ntfs - 8);
+ if (err == MZ_OK) {
+ mz_zip_unix_to_ntfs_time(file_info->modified_date, &ntfs_time);
+ err = mz_stream_write_uint64(stream, ntfs_time);
+ }
+ if (err == MZ_OK) {
+ mz_zip_unix_to_ntfs_time(file_info->accessed_date, &ntfs_time);
+ err = mz_stream_write_uint64(stream, ntfs_time);
+ }
+ if (err == MZ_OK) {
+ mz_zip_unix_to_ntfs_time(file_info->creation_date, &ntfs_time);
+ err = mz_stream_write_uint64(stream, ntfs_time);
+ }
+ }
+ /* Write UNIX extra block extra field */
+ if ((err == MZ_OK) && (field_length_unix1 > 0)) {
+ err = mz_zip_extrafield_write(stream, MZ_ZIP_EXTENSION_UNIX1, field_length_unix1);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(stream, (uint32_t)file_info->accessed_date);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(stream, (uint32_t)file_info->modified_date);
+ if (err == MZ_OK) /* User id */
+ err = mz_stream_write_uint16(stream, 0);
+ if (err == MZ_OK) /* Group id */
+ err = mz_stream_write_uint16(stream, 0);
+ if (err == MZ_OK && linkname_size > 0) {
+ if (mz_stream_write(stream, file_info->linkname, linkname_size) != linkname_size)
+ err = MZ_WRITE_ERROR;
+ }
+ }
+#ifdef HAVE_WZAES
+ /* Write AES extra field */
+ if ((err == MZ_OK) && (!skip_aes) && (file_info->flag & MZ_ZIP_FLAG_ENCRYPTED) && (file_info->aes_version)) {
+ err = mz_zip_extrafield_write(stream, MZ_ZIP_EXTENSION_AES, field_length_aes);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, file_info->aes_version);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint8(stream, 'A');
+ if (err == MZ_OK)
+ err = mz_stream_write_uint8(stream, 'E');
+ if (err == MZ_OK)
+ err = mz_stream_write_uint8(stream, file_info->aes_encryption_mode);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, file_info->compression_method);
+ }
+#endif
+
+ if (file_info->extrafield_size > 0) {
+ err_mem = mz_stream_mem_seek(file_extra_stream, 0, MZ_SEEK_SET);
+ while (err == MZ_OK && err_mem == MZ_OK) {
+ err_mem = mz_stream_read_uint16(file_extra_stream, &field_type);
+ if (err_mem == MZ_OK)
+ err_mem = mz_stream_read_uint16(file_extra_stream, &field_length);
+ if (err_mem != MZ_OK)
+ break;
+
+ /* Prefer our zip 64, ntfs, unix1 extensions over incoming */
+ if (field_type == MZ_ZIP_EXTENSION_ZIP64 || field_type == MZ_ZIP_EXTENSION_NTFS ||
+ field_type == MZ_ZIP_EXTENSION_UNIX1) {
+ err_mem = mz_stream_seek(file_extra_stream, field_length, MZ_SEEK_CUR);
+ continue;
+ }
+
+ err = mz_stream_write_uint16(stream, field_type);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, field_length);
+ if (err == MZ_OK)
+ err = mz_stream_copy(stream, file_extra_stream, field_length);
+ }
+
+ mz_stream_mem_delete(&file_extra_stream);
+ }
+
+ if (err == MZ_OK && !local && file_info->comment) {
+ if (mz_stream_write(stream, file_info->comment, file_info->comment_size) != file_info->comment_size)
+ err = MZ_WRITE_ERROR;
+ }
+
+ return err;
+}
+
+static int32_t mz_zip_entry_write_descriptor(void *stream, uint8_t zip64, uint32_t crc32, int64_t compressed_size, int64_t uncompressed_size) {
+ int32_t err = MZ_OK;
+
+ err = mz_stream_write_uint32(stream, MZ_ZIP_MAGIC_DATADESCRIPTOR);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(stream, crc32);
+
+ /* Store data descriptor as 8 bytes if zip 64 extension enabled */
+ if (err == MZ_OK) {
+ /* Zip 64 extension is enabled when uncompressed size is > UINT32_MAX */
+ if (!zip64)
+ err = mz_stream_write_uint32(stream, (uint32_t)compressed_size);
+ else
+ err = mz_stream_write_int64(stream, compressed_size);
+ }
+ if (err == MZ_OK) {
+ if (!zip64)
+ err = mz_stream_write_uint32(stream, (uint32_t)uncompressed_size);
+ else
+ err = mz_stream_write_int64(stream, uncompressed_size);
+ }
+
+ return err;
+}
+
+static int32_t mz_zip_read_cd(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+ uint64_t number_entry_cd64 = 0;
+ uint64_t number_entry_cd = 0;
+ int64_t eocd_pos = 0;
+ int64_t eocd_pos64 = 0;
+ int64_t value64i = 0;
+ uint16_t value16 = 0;
+ uint32_t value32 = 0;
+ uint64_t value64 = 0;
+ uint16_t comment_size = 0;
+ int32_t comment_read = 0;
+ int32_t err = MZ_OK;
+
+ if (!zip)
+ return MZ_PARAM_ERROR;
+
+ /* Read and cache central directory records */
+ err = mz_zip_search_eocd(zip->stream, &eocd_pos);
+ if (err == MZ_OK) {
+ /* The signature, already checked */
+ err = mz_stream_read_uint32(zip->stream, &value32);
+ /* Number of this disk */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(zip->stream, &value16);
+ /* Number of the disk with the start of the central directory */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(zip->stream, &value16);
+ zip->disk_number_with_cd = value16;
+ /* Total number of entries in the central dir on this disk */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(zip->stream, &value16);
+ zip->number_entry = value16;
+ /* Total number of entries in the central dir */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(zip->stream, &value16);
+ number_entry_cd = value16;
+ if (number_entry_cd != zip->number_entry)
+ err = MZ_FORMAT_ERROR;
+ /* Size of the central directory */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(zip->stream, &value32);
+ if (err == MZ_OK)
+ zip->cd_size = value32;
+ /* Offset of start of central directory with respect to the starting disk number */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(zip->stream, &value32);
+ if (err == MZ_OK)
+ zip->cd_offset = value32;
+ /* Zip file global comment length */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(zip->stream, &comment_size);
+ if ((err == MZ_OK) && (comment_size > 0)) {
+ zip->comment = (char *)malloc(comment_size + 1);
+ if (zip->comment) {
+ comment_read = mz_stream_read(zip->stream, zip->comment, comment_size);
+ /* Don't fail if incorrect comment length read, not critical */
+ if (comment_read < 0)
+ comment_read = 0;
+ zip->comment[comment_read] = 0;
+ }
+ }
+
+ if ((err == MZ_OK) && ((number_entry_cd == UINT16_MAX) || (zip->cd_offset == UINT32_MAX))) {
+ /* Format should be Zip64, as the central directory or file size is too large */
+ if (mz_zip_search_zip64_eocd(zip->stream, eocd_pos, &eocd_pos64) == MZ_OK) {
+ eocd_pos = eocd_pos64;
+
+ err = mz_stream_seek(zip->stream, eocd_pos, MZ_SEEK_SET);
+ /* The signature, already checked */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(zip->stream, &value32);
+ /* Size of zip64 end of central directory record */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint64(zip->stream, &value64);
+ /* Version made by */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(zip->stream, &zip->version_madeby);
+ /* Version needed to extract */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(zip->stream, &value16);
+ /* Number of this disk */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(zip->stream, &value32);
+ /* Number of the disk with the start of the central directory */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(zip->stream, &zip->disk_number_with_cd);
+ /* Total number of entries in the central directory on this disk */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint64(zip->stream, &zip->number_entry);
+ /* Total number of entries in the central directory */
+ if (err == MZ_OK)
+ err = mz_stream_read_uint64(zip->stream, &number_entry_cd64);
+ if (zip->number_entry != number_entry_cd64)
+ err = MZ_FORMAT_ERROR;
+ /* Size of the central directory */
+ if (err == MZ_OK) {
+ err = mz_stream_read_int64(zip->stream, &zip->cd_size);
+ if (zip->cd_size < 0)
+ err = MZ_FORMAT_ERROR;
+ }
+ /* Offset of start of central directory with respect to the starting disk number */
+ if (err == MZ_OK) {
+ err = mz_stream_read_int64(zip->stream, &zip->cd_offset);
+ if (zip->cd_offset < 0)
+ err = MZ_FORMAT_ERROR;
+ }
+ } else if ((zip->number_entry == UINT16_MAX) || (number_entry_cd != zip->number_entry) ||
+ (zip->cd_size == UINT16_MAX) || (zip->cd_offset == UINT32_MAX)) {
+ err = MZ_FORMAT_ERROR;
+ }
+ }
+ }
+
+ if (err == MZ_OK) {
+ mz_zip_print("Zip - Read cd (disk %" PRId32 " entries %" PRId64 " offset %" PRId64 " size %" PRId64 ")\n",
+ zip->disk_number_with_cd, zip->number_entry, zip->cd_offset, zip->cd_size);
+
+ /* Verify central directory signature exists at offset */
+ err = mz_stream_seek(zip->stream, zip->cd_offset, MZ_SEEK_SET);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(zip->stream, &zip->cd_signature);
+ if ((err == MZ_OK) && (zip->cd_signature != MZ_ZIP_MAGIC_CENTRALHEADER)) {
+ /* If cd exists in large file and no zip-64 support, error for recover */
+ if (eocd_pos > UINT32_MAX && eocd_pos64 == 0)
+ err = MZ_FORMAT_ERROR;
+ /* If cd not found attempt to seek backward to find it */
+ if (err == MZ_OK)
+ err = mz_stream_seek(zip->stream, eocd_pos - zip->cd_size, MZ_SEEK_SET);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint32(zip->stream, &zip->cd_signature);
+ if ((err == MZ_OK) && (zip->cd_signature == MZ_ZIP_MAGIC_CENTRALHEADER)) {
+ /* If found compensate for incorrect locations */
+ value64i = zip->cd_offset;
+ zip->cd_offset = eocd_pos - zip->cd_size;
+ /* Assume disk has prepended data */
+ zip->disk_offset_shift = zip->cd_offset - value64i;
+ }
+ }
+ }
+
+ if (err == MZ_OK) {
+ if (eocd_pos < zip->cd_offset) {
+ /* End of central dir should always come after central dir */
+ err = MZ_FORMAT_ERROR;
+ } else if ((uint64_t)eocd_pos < (uint64_t)zip->cd_offset + zip->cd_size) {
+ /* Truncate size of cd if incorrect size or offset provided */
+ zip->cd_size = eocd_pos - zip->cd_offset;
+ }
+ }
+
+ return err;
+}
+
+static int32_t mz_zip_write_cd(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+ int64_t zip64_eocd_pos_inzip = 0;
+ int64_t disk_number = 0;
+ int64_t disk_size = 0;
+ int32_t comment_size = 0;
+ int32_t err = MZ_OK;
+
+ if (!zip)
+ return MZ_PARAM_ERROR;
+
+ if (mz_stream_get_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, &disk_number) == MZ_OK)
+ zip->disk_number_with_cd = (uint32_t)disk_number;
+ if (mz_stream_get_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_SIZE, &disk_size) == MZ_OK && disk_size > 0)
+ zip->disk_number_with_cd += 1;
+ mz_stream_set_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, -1);
+ if ((zip->disk_number_with_cd > 0) && (zip->open_mode & MZ_OPEN_MODE_APPEND)) {
+ // Overwrite existing central directory if using split disks
+ mz_stream_seek(zip->stream, 0, MZ_SEEK_SET);
+ }
+
+ zip->cd_offset = mz_stream_tell(zip->stream);
+ mz_stream_seek(zip->cd_mem_stream, 0, MZ_SEEK_END);
+ zip->cd_size = (uint32_t)mz_stream_tell(zip->cd_mem_stream);
+ mz_stream_seek(zip->cd_mem_stream, 0, MZ_SEEK_SET);
+
+ err = mz_stream_copy(zip->stream, zip->cd_mem_stream, (int32_t)zip->cd_size);
+
+ mz_zip_print("Zip - Write cd (disk %" PRId32 " entries %" PRId64 " offset %" PRId64 " size %" PRId64 ")\n",
+ zip->disk_number_with_cd, zip->number_entry, zip->cd_offset, zip->cd_size);
+
+ if (zip->cd_size == 0 && zip->number_entry > 0) {
+ // Zip does not contain central directory, open with recovery option
+ return MZ_FORMAT_ERROR;
+ }
+
+ /* Write the ZIP64 central directory header */
+ if (zip->cd_offset >= UINT32_MAX || zip->number_entry >= UINT16_MAX) {
+ zip64_eocd_pos_inzip = mz_stream_tell(zip->stream);
+
+ err = mz_stream_write_uint32(zip->stream, MZ_ZIP_MAGIC_ENDHEADER64);
+
+ /* Size of this 'zip64 end of central directory' */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint64(zip->stream, (uint64_t)44);
+ /* Version made by */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(zip->stream, zip->version_madeby);
+ /* Version needed */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(zip->stream, (uint16_t)45);
+ /* Number of this disk */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(zip->stream, zip->disk_number_with_cd);
+ /* Number of the disk with the start of the central directory */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(zip->stream, zip->disk_number_with_cd);
+ /* Total number of entries in the central dir on this disk */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint64(zip->stream, zip->number_entry);
+ /* Total number of entries in the central dir */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint64(zip->stream, zip->number_entry);
+ /* Size of the central directory */
+ if (err == MZ_OK)
+ err = mz_stream_write_int64(zip->stream, zip->cd_size);
+ /* Offset of start of central directory with respect to the starting disk number */
+ if (err == MZ_OK)
+ err = mz_stream_write_int64(zip->stream, zip->cd_offset);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(zip->stream, MZ_ZIP_MAGIC_ENDLOCHEADER64);
+
+ /* Number of the disk with the start of the central directory */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(zip->stream, zip->disk_number_with_cd);
+ /* Relative offset to the end of zip64 central directory */
+ if (err == MZ_OK)
+ err = mz_stream_write_int64(zip->stream, zip64_eocd_pos_inzip);
+ /* Number of the disk with the start of the central directory */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(zip->stream, zip->disk_number_with_cd + 1);
+ }
+
+ /* Write the central directory header */
+
+ /* Signature */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(zip->stream, MZ_ZIP_MAGIC_ENDHEADER);
+ /* Number of this disk */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(zip->stream, (uint16_t)zip->disk_number_with_cd);
+ /* Number of the disk with the start of the central directory */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(zip->stream, (uint16_t)zip->disk_number_with_cd);
+ /* Total number of entries in the central dir on this disk */
+ if (err == MZ_OK) {
+ if (zip->number_entry >= UINT16_MAX)
+ err = mz_stream_write_uint16(zip->stream, UINT16_MAX);
+ else
+ err = mz_stream_write_uint16(zip->stream, (uint16_t)zip->number_entry);
+ }
+ /* Total number of entries in the central dir */
+ if (err == MZ_OK) {
+ if (zip->number_entry >= UINT16_MAX)
+ err = mz_stream_write_uint16(zip->stream, UINT16_MAX);
+ else
+ err = mz_stream_write_uint16(zip->stream, (uint16_t)zip->number_entry);
+ }
+ /* Size of the central directory */
+ if (err == MZ_OK)
+ err = mz_stream_write_uint32(zip->stream, (uint32_t)zip->cd_size);
+ /* Offset of start of central directory with respect to the starting disk number */
+ if (err == MZ_OK) {
+ if (zip->cd_offset >= UINT32_MAX)
+ err = mz_stream_write_uint32(zip->stream, UINT32_MAX);
+ else
+ err = mz_stream_write_uint32(zip->stream, (uint32_t)zip->cd_offset);
+ }
+
+ /* Write global comment */
+ if (zip->comment) {
+ comment_size = (int32_t)strlen(zip->comment);
+ if (comment_size > UINT16_MAX)
+ comment_size = UINT16_MAX;
+ }
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(zip->stream, (uint16_t)comment_size);
+ if (err == MZ_OK) {
+ if (mz_stream_write(zip->stream, zip->comment, comment_size) != comment_size)
+ err = MZ_READ_ERROR;
+ }
+ return err;
+}
+
+static int32_t mz_zip_recover_cd(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+ mz_zip_file local_file_info;
+ void *local_file_info_stream = NULL;
+ void *cd_mem_stream = NULL;
+ uint64_t number_entry = 0;
+ int64_t descriptor_pos = 0;
+ int64_t next_header_pos = 0;
+ int64_t disk_offset = 0;
+ int64_t disk_number = 0;
+ int64_t compressed_pos = 0;
+ int64_t compressed_end_pos = 0;
+ int64_t compressed_size = 0;
+ int64_t uncompressed_size = 0;
+ uint8_t descriptor_magic[4] = MZ_ZIP_MAGIC_DATADESCRIPTORU8;
+ uint8_t local_header_magic[4] = MZ_ZIP_MAGIC_LOCALHEADERU8;
+ uint8_t central_header_magic[4] = MZ_ZIP_MAGIC_CENTRALHEADERU8;
+ uint32_t crc32 = 0;
+ int32_t disk_number_with_cd = 0;
+ int32_t err = MZ_OK;
+ uint8_t zip64 = 0;
+ uint8_t eof = 0;
+
+ mz_zip_print("Zip - Recover - Start\n");
+
+ mz_zip_get_cd_mem_stream(handle, &cd_mem_stream);
+
+ /* Determine if we are on a split disk or not */
+ mz_stream_set_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, 0);
+ if (mz_stream_tell(zip->stream) < 0) {
+ mz_stream_set_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, -1);
+ mz_stream_seek(zip->stream, 0, MZ_SEEK_SET);
+ } else
+ disk_number_with_cd = 1;
+
+ if (mz_stream_is_open(cd_mem_stream) != MZ_OK)
+ err = mz_stream_mem_open(cd_mem_stream, NULL, MZ_OPEN_MODE_CREATE);
+
+ mz_stream_mem_create(&local_file_info_stream);
+ mz_stream_mem_open(local_file_info_stream, NULL, MZ_OPEN_MODE_CREATE);
+
+ if (err == MZ_OK) {
+ err = mz_stream_find(zip->stream, (const void *)local_header_magic, sizeof(local_header_magic),
+ INT64_MAX, &next_header_pos);
+ }
+
+ while (err == MZ_OK && !eof) {
+ /* Get current offset and disk number for central dir record */
+ disk_offset = mz_stream_tell(zip->stream);
+ mz_stream_get_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, &disk_number);
+
+ /* Read local headers */
+ memset(&local_file_info, 0, sizeof(local_file_info));
+ err = mz_zip_entry_read_header(zip->stream, 1, &local_file_info, local_file_info_stream);
+ if (err != MZ_OK)
+ break;
+
+ local_file_info.disk_offset = disk_offset;
+ if (disk_number < 0)
+ disk_number = 0;
+ local_file_info.disk_number = (uint32_t)disk_number;
+
+ compressed_pos = mz_stream_tell(zip->stream);
+
+ if ((err == MZ_OK) && (local_file_info.compressed_size > 0)) {
+ mz_stream_seek(zip->stream, local_file_info.compressed_size, MZ_SEEK_CUR);
+ }
+
+ for (;;) {
+ /* Search for the next local header */
+ err = mz_stream_find(zip->stream, (const void *)local_header_magic, sizeof(local_header_magic),
+ INT64_MAX, &next_header_pos);
+
+ if (err == MZ_EXIST_ERROR) {
+ mz_stream_seek(zip->stream, compressed_pos, MZ_SEEK_SET);
+
+ /* Search for central dir if no local header found */
+ err = mz_stream_find(zip->stream, (const void *)central_header_magic, sizeof(central_header_magic),
+ INT64_MAX, &next_header_pos);
+
+ if (err == MZ_EXIST_ERROR) {
+ /* Get end of stream if no central header found */
+ mz_stream_seek(zip->stream, 0, MZ_SEEK_END);
+ next_header_pos = mz_stream_tell(zip->stream);
+ }
+
+ eof = 1;
+ }
+
+ if (local_file_info.flag & MZ_ZIP_FLAG_DATA_DESCRIPTOR || local_file_info.compressed_size == 0) {
+ /* Search backwards for the descriptor, seeking too far back will be incorrect if compressed size is small */
+ err = mz_stream_find_reverse(zip->stream, (const void *)descriptor_magic, sizeof(descriptor_magic),
+ MZ_ZIP_SIZE_MAX_DATA_DESCRIPTOR, &descriptor_pos);
+ if (err == MZ_OK) {
+ if (mz_zip_extrafield_contains(local_file_info.extrafield,
+ local_file_info.extrafield_size, MZ_ZIP_EXTENSION_ZIP64, NULL) == MZ_OK)
+ zip64 = 1;
+
+ err = mz_zip_entry_read_descriptor(zip->stream, zip64, &crc32,
+ &compressed_size, &uncompressed_size);
+
+ if (err == MZ_OK) {
+ if (local_file_info.crc == 0)
+ local_file_info.crc = crc32;
+ if (local_file_info.compressed_size == 0)
+ local_file_info.compressed_size = compressed_size;
+ if (local_file_info.uncompressed_size == 0)
+ local_file_info.uncompressed_size = uncompressed_size;
+ }
+
+ compressed_end_pos = descriptor_pos;
+ } else if (eof) {
+ compressed_end_pos = next_header_pos;
+ } else if (local_file_info.flag & MZ_ZIP_FLAG_DATA_DESCRIPTOR) {
+ /* Wrong local file entry found, keep searching */
+ next_header_pos += 1;
+ mz_stream_seek(zip->stream, next_header_pos, MZ_SEEK_SET);
+ continue;
+ }
+ } else {
+ compressed_end_pos = next_header_pos;
+ }
+
+ break;
+ }
+
+ compressed_size = compressed_end_pos - compressed_pos;
+
+ if (compressed_size > UINT32_MAX) {
+ /* Update sizes if 4GB file is written with no ZIP64 support */
+ if (local_file_info.uncompressed_size < UINT32_MAX) {
+ local_file_info.compressed_size = compressed_size;
+ local_file_info.uncompressed_size = 0;
+ }
+ }
+
+ mz_zip_print("Zip - Recover - Entry %s (csize %" PRId64 " usize %" PRId64 " flags 0x%" PRIx16 ")\n",
+ local_file_info.filename, local_file_info.compressed_size, local_file_info.uncompressed_size,
+ local_file_info.flag);
+
+ /* Rewrite central dir with local headers and offsets */
+ err = mz_zip_entry_write_header(cd_mem_stream, 0, &local_file_info);
+ if (err == MZ_OK)
+ number_entry += 1;
+
+ err = mz_stream_seek(zip->stream, next_header_pos, MZ_SEEK_SET);
+ }
+
+ mz_stream_mem_delete(&local_file_info_stream);
+
+ mz_zip_print("Zip - Recover - Complete (cddisk %" PRId32 " entries %" PRId64 ")\n",
+ disk_number_with_cd, number_entry);
+
+ if (number_entry == 0)
+ return err;
+
+ /* Set new upper seek boundary for central dir mem stream */
+ disk_offset = mz_stream_tell(cd_mem_stream);
+ mz_stream_mem_set_buffer_limit(cd_mem_stream, (int32_t)disk_offset);
+
+ /* Set new central directory info */
+ mz_zip_set_cd_stream(handle, 0, cd_mem_stream);
+ mz_zip_set_number_entry(handle, number_entry);
+ mz_zip_set_disk_number_with_cd(handle, disk_number_with_cd);
+
+ return MZ_OK;
+}
+
+void *mz_zip_create(void **handle) {
+ mz_zip *zip = NULL;
+
+ zip = (mz_zip *)calloc(1, sizeof(mz_zip));
+ if (zip)
+ zip->data_descriptor = 1;
+ if (handle)
+ *handle = zip;
+
+ return zip;
+}
+
+void mz_zip_delete(void **handle) {
+ mz_zip *zip = NULL;
+ if (!handle)
+ return;
+ zip = (mz_zip *)*handle;
+ if (zip) {
+ free(zip);
+ }
+ *handle = NULL;
+}
+
+int32_t mz_zip_open(void *handle, void *stream, int32_t mode) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t err = MZ_OK;
+
+ if (!zip)
+ return MZ_PARAM_ERROR;
+
+ mz_zip_print("Zip - Open\n");
+
+ zip->stream = stream;
+
+ mz_stream_mem_create(&zip->cd_mem_stream);
+
+ if (mode & MZ_OPEN_MODE_WRITE) {
+ mz_stream_mem_open(zip->cd_mem_stream, NULL, MZ_OPEN_MODE_CREATE);
+ zip->cd_stream = zip->cd_mem_stream;
+ } else {
+ zip->cd_stream = stream;
+ }
+
+ if ((mode & MZ_OPEN_MODE_READ) || (mode & MZ_OPEN_MODE_APPEND)) {
+ if ((mode & MZ_OPEN_MODE_CREATE) == 0) {
+ err = mz_zip_read_cd(zip);
+ if (err != MZ_OK) {
+ mz_zip_print("Zip - Error detected reading cd (%" PRId32 ")\n", err);
+ if (zip->recover && mz_zip_recover_cd(zip) == MZ_OK)
+ err = MZ_OK;
+ }
+ }
+
+ if ((err == MZ_OK) && (mode & MZ_OPEN_MODE_APPEND)) {
+ if (zip->cd_size > 0) {
+ /* Store central directory in memory */
+ err = mz_stream_seek(zip->stream, zip->cd_offset, MZ_SEEK_SET);
+ if (err == MZ_OK)
+ err = mz_stream_copy(zip->cd_mem_stream, zip->stream, (int32_t)zip->cd_size);
+ if (err == MZ_OK)
+ err = mz_stream_seek(zip->stream, zip->cd_offset, MZ_SEEK_SET);
+ } else {
+ if (zip->cd_signature == MZ_ZIP_MAGIC_ENDHEADER) {
+ /* If tiny zip then overwrite end header */
+ err = mz_stream_seek(zip->stream, zip->cd_offset, MZ_SEEK_SET);
+ } else {
+ /* If no central directory, append new zip to end of file */
+ err = mz_stream_seek(zip->stream, 0, MZ_SEEK_END);
+ }
+ }
+
+ if (zip->disk_number_with_cd > 0) {
+ /* Move to last disk to begin appending */
+ mz_stream_set_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, zip->disk_number_with_cd - 1);
+ }
+ } else {
+ zip->cd_start_pos = zip->cd_offset;
+ }
+ }
+
+ if (err != MZ_OK) {
+ mz_zip_close(zip);
+ return err;
+ }
+
+ /* Memory streams used to store variable length file info data */
+ mz_stream_mem_create(&zip->file_info_stream);
+ mz_stream_mem_open(zip->file_info_stream, NULL, MZ_OPEN_MODE_CREATE);
+
+ mz_stream_mem_create(&zip->local_file_info_stream);
+ mz_stream_mem_open(zip->local_file_info_stream, NULL, MZ_OPEN_MODE_CREATE);
+
+ zip->open_mode = mode;
+
+ return err;
+}
+
+int32_t mz_zip_close(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t err = MZ_OK;
+
+ if (!zip)
+ return MZ_PARAM_ERROR;
+
+ mz_zip_print("Zip - Close\n");
+
+ if (mz_zip_entry_is_open(handle) == MZ_OK)
+ err = mz_zip_entry_close(handle);
+
+ if ((err == MZ_OK) && (zip->open_mode & MZ_OPEN_MODE_WRITE))
+ err = mz_zip_write_cd(handle);
+
+ if (zip->cd_mem_stream) {
+ mz_stream_close(zip->cd_mem_stream);
+ mz_stream_delete(&zip->cd_mem_stream);
+ }
+
+ if (zip->file_info_stream) {
+ mz_stream_mem_close(zip->file_info_stream);
+ mz_stream_mem_delete(&zip->file_info_stream);
+ }
+ if (zip->local_file_info_stream) {
+ mz_stream_mem_close(zip->local_file_info_stream);
+ mz_stream_mem_delete(&zip->local_file_info_stream);
+ }
+
+ if (zip->comment) {
+ free(zip->comment);
+ zip->comment = NULL;
+ }
+
+ zip->stream = NULL;
+ zip->cd_stream = NULL;
+
+ return err;
+}
+
+int32_t mz_zip_get_comment(void *handle, const char **comment) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip || !comment)
+ return MZ_PARAM_ERROR;
+ if (!zip->comment)
+ return MZ_EXIST_ERROR;
+ *comment = zip->comment;
+ return MZ_OK;
+}
+
+int32_t mz_zip_set_comment(void *handle, const char *comment) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t comment_size = 0;
+ if (!zip || !comment)
+ return MZ_PARAM_ERROR;
+ if (zip->comment)
+ free(zip->comment);
+ comment_size = (int32_t)strlen(comment);
+ if (comment_size > UINT16_MAX)
+ return MZ_PARAM_ERROR;
+ zip->comment = (char *)calloc(comment_size + 1, sizeof(char));
+ if (!zip->comment)
+ return MZ_MEM_ERROR;
+ strncpy(zip->comment, comment, comment_size);
+ return MZ_OK;
+}
+
+int32_t mz_zip_get_version_madeby(void *handle, uint16_t *version_madeby) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip || !version_madeby)
+ return MZ_PARAM_ERROR;
+ *version_madeby = zip->version_madeby;
+ return MZ_OK;
+}
+
+int32_t mz_zip_set_version_madeby(void *handle, uint16_t version_madeby) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip)
+ return MZ_PARAM_ERROR;
+ zip->version_madeby = version_madeby;
+ return MZ_OK;
+}
+
+int32_t mz_zip_set_recover(void *handle, uint8_t recover) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip)
+ return MZ_PARAM_ERROR;
+ zip->recover = recover;
+ return MZ_OK;
+}
+
+int32_t mz_zip_set_data_descriptor(void *handle, uint8_t data_descriptor) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip)
+ return MZ_PARAM_ERROR;
+ zip->data_descriptor = data_descriptor;
+ return MZ_OK;
+}
+
+int32_t mz_zip_get_stream(void *handle, void **stream) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip || !stream)
+ return MZ_PARAM_ERROR;
+ *stream = zip->stream;
+ if (!*stream)
+ return MZ_EXIST_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_zip_set_cd_stream(void *handle, int64_t cd_start_pos, void *cd_stream) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip || !cd_stream)
+ return MZ_PARAM_ERROR;
+ zip->cd_offset = 0;
+ zip->cd_stream = cd_stream;
+ zip->cd_start_pos = cd_start_pos;
+ return MZ_OK;
+}
+
+int32_t mz_zip_get_cd_mem_stream(void *handle, void **cd_mem_stream) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip || !cd_mem_stream)
+ return MZ_PARAM_ERROR;
+ *cd_mem_stream = zip->cd_mem_stream;
+ if (!*cd_mem_stream)
+ return MZ_EXIST_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_zip_set_number_entry(void *handle, uint64_t number_entry) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip)
+ return MZ_PARAM_ERROR;
+ zip->number_entry = number_entry;
+ return MZ_OK;
+}
+
+int32_t mz_zip_get_number_entry(void *handle, uint64_t *number_entry) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip || !number_entry)
+ return MZ_PARAM_ERROR;
+ *number_entry = zip->number_entry;
+ return MZ_OK;
+}
+
+int32_t mz_zip_set_disk_number_with_cd(void *handle, uint32_t disk_number_with_cd) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip)
+ return MZ_PARAM_ERROR;
+ zip->disk_number_with_cd = disk_number_with_cd;
+ return MZ_OK;
+}
+
+int32_t mz_zip_get_disk_number_with_cd(void *handle, uint32_t *disk_number_with_cd) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip || !disk_number_with_cd)
+ return MZ_PARAM_ERROR;
+ *disk_number_with_cd = zip->disk_number_with_cd;
+ return MZ_OK;
+}
+
+static int32_t mz_zip_entry_close_int(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+
+ if (zip->crypt_stream)
+ mz_stream_delete(&zip->crypt_stream);
+ zip->crypt_stream = NULL;
+ if (zip->compress_stream)
+ mz_stream_delete(&zip->compress_stream);
+ zip->compress_stream = NULL;
+
+ zip->entry_opened = 0;
+
+ return MZ_OK;
+}
+
+static int32_t mz_zip_entry_open_int(void *handle, uint8_t raw, int16_t compress_level, const char *password) {
+ mz_zip *zip = (mz_zip *)handle;
+ int64_t max_total_in = 0;
+ int64_t header_size = 0;
+ int64_t footer_size = 0;
+ int32_t err = MZ_OK;
+ uint8_t use_crypt = 0;
+
+ if (!zip)
+ return MZ_PARAM_ERROR;
+
+ switch (zip->file_info.compression_method) {
+ case MZ_COMPRESS_METHOD_STORE:
+ case MZ_COMPRESS_METHOD_DEFLATE:
+#ifdef HAVE_BZIP2
+ case MZ_COMPRESS_METHOD_BZIP2:
+#endif
+#ifdef HAVE_LZMA
+ case MZ_COMPRESS_METHOD_LZMA:
+#endif
+#if defined(HAVE_LZMA) || defined(HAVE_LIBCOMP)
+ case MZ_COMPRESS_METHOD_XZ:
+#endif
+#ifdef HAVE_ZSTD
+ case MZ_COMPRESS_METHOD_ZSTD:
+#endif
+ err = MZ_OK;
+ break;
+ default:
+ return MZ_SUPPORT_ERROR;
+ }
+
+#ifndef HAVE_WZAES
+ if (zip->file_info.aes_version)
+ return MZ_SUPPORT_ERROR;
+#endif
+
+ zip->entry_raw = raw;
+
+ if ((zip->file_info.flag & MZ_ZIP_FLAG_ENCRYPTED) && (password)) {
+ if (zip->open_mode & MZ_OPEN_MODE_WRITE) {
+ /* Encrypt only when we are not trying to write raw and password is supplied. */
+ if (!zip->entry_raw)
+ use_crypt = 1;
+ } else if (zip->open_mode & MZ_OPEN_MODE_READ) {
+ /* Decrypt only when password is supplied. Don't error when password */
+ /* is not supplied as we may want to read the raw encrypted data. */
+ use_crypt = 1;
+ }
+ }
+
+ if ((err == MZ_OK) && (use_crypt)) {
+#ifdef HAVE_WZAES
+ if (zip->file_info.aes_version) {
+ mz_stream_wzaes_create(&zip->crypt_stream);
+ mz_stream_wzaes_set_password(zip->crypt_stream, password);
+ mz_stream_wzaes_set_encryption_mode(zip->crypt_stream, zip->file_info.aes_encryption_mode);
+ } else
+#endif
+ {
+#ifdef HAVE_PKCRYPT
+ uint8_t verify1 = (uint8_t)((zip->file_info.pk_verify >> 8) & 0xff);
+ uint8_t verify2 = (uint8_t)((zip->file_info.pk_verify) & 0xff);
+
+ mz_stream_pkcrypt_create(&zip->crypt_stream);
+ mz_stream_pkcrypt_set_password(zip->crypt_stream, password);
+ mz_stream_pkcrypt_set_verify(zip->crypt_stream, verify1, verify2);
+#endif
+ }
+ }
+
+ if (err == MZ_OK) {
+ if (!zip->crypt_stream)
+ mz_stream_raw_create(&zip->crypt_stream);
+
+ mz_stream_set_base(zip->crypt_stream, zip->stream);
+
+ err = mz_stream_open(zip->crypt_stream, NULL, zip->open_mode);
+ }
+
+ if (err == MZ_OK) {
+ if (zip->entry_raw || zip->file_info.compression_method == MZ_COMPRESS_METHOD_STORE)
+ mz_stream_raw_create(&zip->compress_stream);
+#ifdef HAVE_ZLIB
+ else if (zip->file_info.compression_method == MZ_COMPRESS_METHOD_DEFLATE)
+ mz_stream_zlib_create(&zip->compress_stream);
+#endif
+#ifdef HAVE_BZIP2
+ else if (zip->file_info.compression_method == MZ_COMPRESS_METHOD_BZIP2)
+ mz_stream_bzip_create(&zip->compress_stream);
+#endif
+#ifdef HAVE_LIBCOMP
+ else if (zip->file_info.compression_method == MZ_COMPRESS_METHOD_DEFLATE ||
+ zip->file_info.compression_method == MZ_COMPRESS_METHOD_XZ) {
+ mz_stream_libcomp_create(&zip->compress_stream);
+ mz_stream_set_prop_int64(zip->compress_stream, MZ_STREAM_PROP_COMPRESS_METHOD,
+ zip->file_info.compression_method);
+ }
+#endif
+#ifdef HAVE_LZMA
+ else if (zip->file_info.compression_method == MZ_COMPRESS_METHOD_LZMA ||
+ zip->file_info.compression_method == MZ_COMPRESS_METHOD_XZ) {
+ mz_stream_lzma_create(&zip->compress_stream);
+ mz_stream_set_prop_int64(zip->compress_stream, MZ_STREAM_PROP_COMPRESS_METHOD,
+ zip->file_info.compression_method);
+ }
+#endif
+#ifdef HAVE_ZSTD
+ else if (zip->file_info.compression_method == MZ_COMPRESS_METHOD_ZSTD)
+ mz_stream_zstd_create(&zip->compress_stream);
+#endif
+ else
+ err = MZ_PARAM_ERROR;
+ }
+
+ if (err == MZ_OK) {
+ if (zip->open_mode & MZ_OPEN_MODE_WRITE) {
+ mz_stream_set_prop_int64(zip->compress_stream, MZ_STREAM_PROP_COMPRESS_LEVEL, compress_level);
+ } else {
+ int32_t set_end_of_stream = 0;
+
+#ifndef HAVE_LIBCOMP
+ if (zip->entry_raw ||
+ zip->file_info.compression_method == MZ_COMPRESS_METHOD_STORE ||
+ zip->file_info.flag & MZ_ZIP_FLAG_ENCRYPTED)
+#endif
+ {
+ max_total_in = zip->file_info.compressed_size;
+ mz_stream_set_prop_int64(zip->crypt_stream, MZ_STREAM_PROP_TOTAL_IN_MAX, max_total_in);
+
+ if (mz_stream_get_prop_int64(zip->crypt_stream, MZ_STREAM_PROP_HEADER_SIZE, &header_size) == MZ_OK)
+ max_total_in -= header_size;
+ if (mz_stream_get_prop_int64(zip->crypt_stream, MZ_STREAM_PROP_FOOTER_SIZE, &footer_size) == MZ_OK)
+ max_total_in -= footer_size;
+
+ mz_stream_set_prop_int64(zip->compress_stream, MZ_STREAM_PROP_TOTAL_IN_MAX, max_total_in);
+ }
+
+ switch (zip->file_info.compression_method) {
+ case MZ_COMPRESS_METHOD_LZMA:
+ case MZ_COMPRESS_METHOD_XZ:
+ set_end_of_stream = (zip->file_info.flag & MZ_ZIP_FLAG_LZMA_EOS_MARKER);
+ break;
+ case MZ_COMPRESS_METHOD_ZSTD:
+ set_end_of_stream = 1;
+ break;
+ }
+
+ if (set_end_of_stream) {
+ mz_stream_set_prop_int64(zip->compress_stream, MZ_STREAM_PROP_TOTAL_IN_MAX, zip->file_info.compressed_size);
+ mz_stream_set_prop_int64(zip->compress_stream, MZ_STREAM_PROP_TOTAL_OUT_MAX, zip->file_info.uncompressed_size);
+ }
+ }
+
+ mz_stream_set_base(zip->compress_stream, zip->crypt_stream);
+
+ err = mz_stream_open(zip->compress_stream, NULL, zip->open_mode);
+ }
+
+ if (err == MZ_OK) {
+ zip->entry_opened = 1;
+ zip->entry_crc32 = 0;
+ } else {
+ mz_zip_entry_close_int(handle);
+ }
+
+ return err;
+}
+
+int32_t mz_zip_entry_is_open(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip)
+ return MZ_PARAM_ERROR;
+ if (zip->entry_opened == 0)
+ return MZ_EXIST_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_zip_entry_read_open(void *handle, uint8_t raw, const char *password) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t err = MZ_OK;
+ int32_t err_shift = MZ_OK;
+
+#if defined(MZ_ZIP_NO_ENCRYPTION)
+ if (password)
+ return MZ_SUPPORT_ERROR;
+#endif
+ if (!zip || !zip->entry_scanned)
+ return MZ_PARAM_ERROR;
+ if ((zip->open_mode & MZ_OPEN_MODE_READ) == 0)
+ return MZ_PARAM_ERROR;
+
+ mz_zip_print("Zip - Entry - Read open (raw %" PRId32 ")\n", raw);
+
+ err = mz_zip_entry_seek_local_header(handle);
+ if (err == MZ_OK)
+ err = mz_zip_entry_read_header(zip->stream, 1, &zip->local_file_info, zip->local_file_info_stream);
+
+ if (err == MZ_FORMAT_ERROR && zip->disk_offset_shift > 0) {
+ /* Perhaps we didn't compensated correctly for incorrect cd offset */
+ err_shift = mz_stream_seek(zip->stream, zip->file_info.disk_offset, MZ_SEEK_SET);
+ if (err_shift == MZ_OK)
+ err_shift = mz_zip_entry_read_header(zip->stream, 1, &zip->local_file_info, zip->local_file_info_stream);
+ if (err_shift == MZ_OK) {
+ zip->disk_offset_shift = 0;
+ err = err_shift;
+ }
+ }
+
+#ifdef MZ_ZIP_NO_DECOMPRESSION
+ if (!raw && zip->file_info.compression_method != MZ_COMPRESS_METHOD_STORE)
+ err = MZ_SUPPORT_ERROR;
+#endif
+ if (err == MZ_OK)
+ err = mz_zip_entry_open_int(handle, raw, 0, password);
+
+ return err;
+}
+
+int32_t mz_zip_entry_write_open(void *handle, const mz_zip_file *file_info, int16_t compress_level, uint8_t raw, const char *password) {
+ mz_zip *zip = (mz_zip *)handle;
+ int64_t filename_pos = -1;
+ int64_t extrafield_pos = 0;
+ int64_t comment_pos = 0;
+ int64_t linkname_pos = 0;
+ int64_t disk_number = 0;
+ uint8_t is_dir = 0;
+ int32_t err = MZ_OK;
+
+#if defined(MZ_ZIP_NO_ENCRYPTION)
+ if (password)
+ return MZ_SUPPORT_ERROR;
+#endif
+ if (!zip || !file_info || !file_info->filename)
+ return MZ_PARAM_ERROR;
+
+ if (mz_zip_entry_is_open(handle) == MZ_OK) {
+ err = mz_zip_entry_close(handle);
+ if (err != MZ_OK)
+ return err;
+ }
+
+ memcpy(&zip->file_info, file_info, sizeof(mz_zip_file));
+
+ mz_zip_print("Zip - Entry - Write open - %s (level %" PRId16 " raw %" PRId8 ")\n",
+ zip->file_info.filename, compress_level, raw);
+
+ mz_stream_seek(zip->file_info_stream, 0, MZ_SEEK_SET);
+ mz_stream_write(zip->file_info_stream, file_info, sizeof(mz_zip_file));
+
+ /* Copy filename, extrafield, and comment internally */
+ filename_pos = mz_stream_tell(zip->file_info_stream);
+ if (file_info->filename)
+ mz_stream_write(zip->file_info_stream, file_info->filename, (int32_t)strlen(file_info->filename));
+ mz_stream_write_uint8(zip->file_info_stream, 0);
+
+ extrafield_pos = mz_stream_tell(zip->file_info_stream);
+ if (file_info->extrafield)
+ mz_stream_write(zip->file_info_stream, file_info->extrafield, file_info->extrafield_size);
+ mz_stream_write_uint8(zip->file_info_stream, 0);
+
+ comment_pos = mz_stream_tell(zip->file_info_stream);
+ if (file_info->comment)
+ mz_stream_write(zip->file_info_stream, file_info->comment, file_info->comment_size);
+ mz_stream_write_uint8(zip->file_info_stream, 0);
+
+ linkname_pos = mz_stream_tell(zip->file_info_stream);
+ if (file_info->linkname)
+ mz_stream_write(zip->file_info_stream, file_info->linkname, (int32_t)strlen(file_info->linkname));
+ mz_stream_write_uint8(zip->file_info_stream, 0);
+
+ mz_stream_mem_get_buffer_at(zip->file_info_stream, filename_pos, (const void **)&zip->file_info.filename);
+ mz_stream_mem_get_buffer_at(zip->file_info_stream, extrafield_pos, (const void **)&zip->file_info.extrafield);
+ mz_stream_mem_get_buffer_at(zip->file_info_stream, comment_pos, (const void **)&zip->file_info.comment);
+ mz_stream_mem_get_buffer_at(zip->file_info_stream, linkname_pos, (const void **)&zip->file_info.linkname);
+
+ if (zip->file_info.compression_method == MZ_COMPRESS_METHOD_DEFLATE) {
+ if ((compress_level == 8) || (compress_level == 9))
+ zip->file_info.flag |= MZ_ZIP_FLAG_DEFLATE_MAX;
+ if (compress_level == 2)
+ zip->file_info.flag |= MZ_ZIP_FLAG_DEFLATE_FAST;
+ if (compress_level == 1)
+ zip->file_info.flag |= MZ_ZIP_FLAG_DEFLATE_SUPER_FAST;
+ }
+#if defined(HAVE_LZMA) || defined(HAVE_LIBCOMP)
+ else if (zip->file_info.compression_method == MZ_COMPRESS_METHOD_LZMA ||
+ zip->file_info.compression_method == MZ_COMPRESS_METHOD_XZ)
+ zip->file_info.flag |= MZ_ZIP_FLAG_LZMA_EOS_MARKER;
+#endif
+
+ if (mz_zip_attrib_is_dir(zip->file_info.external_fa, zip->file_info.version_madeby) == MZ_OK)
+ is_dir = 1;
+
+ if (!is_dir) {
+ if (zip->data_descriptor)
+ zip->file_info.flag |= MZ_ZIP_FLAG_DATA_DESCRIPTOR;
+ if (password)
+ zip->file_info.flag |= MZ_ZIP_FLAG_ENCRYPTED;
+ }
+
+ mz_stream_get_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, &disk_number);
+ zip->file_info.disk_number = (uint32_t)disk_number;
+ zip->file_info.disk_offset = mz_stream_tell(zip->stream);
+
+ if (zip->file_info.flag & MZ_ZIP_FLAG_ENCRYPTED) {
+#ifdef HAVE_PKCRYPT
+ /* Pre-calculated CRC value is required for PKWARE traditional encryption */
+ uint32_t dos_date = mz_zip_time_t_to_dos_date(zip->file_info.modified_date);
+ zip->file_info.pk_verify = mz_zip_get_pk_verify(dos_date, zip->file_info.crc, zip->file_info.flag);
+#endif
+#ifdef HAVE_WZAES
+ if (zip->file_info.aes_version && zip->file_info.aes_encryption_mode == 0)
+ zip->file_info.aes_encryption_mode = MZ_AES_ENCRYPTION_MODE_256;
+#endif
+ }
+
+ zip->file_info.crc = 0;
+ zip->file_info.compressed_size = 0;
+
+ if ((compress_level == 0) || (is_dir))
+ zip->file_info.compression_method = MZ_COMPRESS_METHOD_STORE;
+
+#ifdef MZ_ZIP_NO_COMPRESSION
+ if (zip->file_info.compression_method != MZ_COMPRESS_METHOD_STORE)
+ err = MZ_SUPPORT_ERROR;
+#endif
+ if (err == MZ_OK)
+ err = mz_zip_entry_write_header(zip->stream, 1, &zip->file_info);
+ if (err == MZ_OK)
+ err = mz_zip_entry_open_int(handle, raw, compress_level, password);
+
+ return err;
+}
+
+int32_t mz_zip_entry_read(void *handle, void *buf, int32_t len) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t read = 0;
+
+ if (!zip || mz_zip_entry_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (UINT_MAX == UINT16_MAX && len > UINT16_MAX) /* zlib limitation */
+ return MZ_PARAM_ERROR;
+ if (len == 0)
+ return MZ_PARAM_ERROR;
+
+ if (zip->file_info.compressed_size == 0)
+ return 0;
+
+ /* Read entire entry even if uncompressed_size = 0, otherwise */
+ /* aes encryption validation will fail if compressed_size > 0 */
+ read = mz_stream_read(zip->compress_stream, buf, len);
+ if (read > 0)
+ zip->entry_crc32 = mz_crypt_crc32_update(zip->entry_crc32, buf, read);
+
+ mz_zip_print("Zip - Entry - Read - %" PRId32 " (max %" PRId32 ")\n", read, len);
+
+ return read;
+}
+
+int32_t mz_zip_entry_write(void *handle, const void *buf, int32_t len) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t written = 0;
+
+ if (!zip || mz_zip_entry_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ written = mz_stream_write(zip->compress_stream, buf, len);
+ if (written > 0)
+ zip->entry_crc32 = mz_crypt_crc32_update(zip->entry_crc32, buf, written);
+
+ mz_zip_print("Zip - Entry - Write - %" PRId32 " (max %" PRId32 ")\n", written, len);
+
+ return written;
+}
+
+int32_t mz_zip_entry_read_close(void *handle, uint32_t *crc32, int64_t *compressed_size,
+ int64_t *uncompressed_size) {
+ mz_zip *zip = (mz_zip *)handle;
+ int64_t total_in = 0;
+ int32_t err = MZ_OK;
+ uint8_t zip64 = 0;
+
+ if (!zip || mz_zip_entry_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+
+ mz_stream_close(zip->compress_stream);
+
+ mz_zip_print("Zip - Entry - Read Close\n");
+
+ if (crc32)
+ *crc32 = zip->file_info.crc;
+ if (compressed_size)
+ *compressed_size = zip->file_info.compressed_size;
+ if (uncompressed_size)
+ *uncompressed_size = zip->file_info.uncompressed_size;
+
+ mz_stream_get_prop_int64(zip->compress_stream, MZ_STREAM_PROP_TOTAL_IN, &total_in);
+
+ if ((zip->file_info.flag & MZ_ZIP_FLAG_DATA_DESCRIPTOR) &&
+ ((zip->file_info.flag & MZ_ZIP_FLAG_MASK_LOCAL_INFO) == 0) &&
+ (crc32 || compressed_size || uncompressed_size)) {
+ /* Check to see if data descriptor is zip64 bit format or not */
+ if (mz_zip_extrafield_contains(zip->local_file_info.extrafield,
+ zip->local_file_info.extrafield_size, MZ_ZIP_EXTENSION_ZIP64, NULL) == MZ_OK)
+ zip64 = 1;
+
+ err = mz_zip_entry_seek_local_header(handle);
+
+ /* Seek to end of compressed stream since we might have over-read during compression */
+ if (err == MZ_OK)
+ err = mz_stream_seek(zip->stream, MZ_ZIP_SIZE_LD_ITEM +
+ (int64_t)zip->local_file_info.filename_size +
+ (int64_t)zip->local_file_info.extrafield_size +
+ total_in, MZ_SEEK_CUR);
+
+ /* Read data descriptor */
+ if (err == MZ_OK)
+ err = mz_zip_entry_read_descriptor(zip->stream, zip64,
+ crc32, compressed_size, uncompressed_size);
+ }
+
+ /* If entire entry was not read verification will fail */
+ if ((err == MZ_OK) && (total_in == zip->file_info.compressed_size) && (!zip->entry_raw)) {
+#ifdef HAVE_WZAES
+ /* AES zip version AE-1 will expect a valid crc as well */
+ if (zip->file_info.aes_version <= 0x0001)
+#endif
+ {
+ if (zip->entry_crc32 != zip->file_info.crc) {
+ mz_zip_print("Zip - Entry - Crc failed (actual 0x%08" PRIx32 " expected 0x%08" PRIx32 ")\n",
+ zip->entry_crc32, zip->file_info.crc);
+
+ err = MZ_CRC_ERROR;
+ }
+ }
+ }
+
+ mz_zip_entry_close_int(handle);
+
+ return err;
+}
+
+int32_t mz_zip_entry_write_close(void *handle, uint32_t crc32, int64_t compressed_size,
+ int64_t uncompressed_size) {
+ mz_zip *zip = (mz_zip *)handle;
+ int64_t end_disk_number = 0;
+ int32_t err = MZ_OK;
+ uint8_t zip64 = 0;
+
+ if (!zip || mz_zip_entry_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+
+ mz_stream_close(zip->compress_stream);
+
+ if (!zip->entry_raw)
+ crc32 = zip->entry_crc32;
+
+ mz_zip_print("Zip - Entry - Write Close (crc 0x%08" PRIx32 " cs %" PRId64 " ucs %" PRId64 ")\n",
+ crc32, compressed_size, uncompressed_size);
+
+ /* If sizes are not set, then read them from the compression stream */
+ if (compressed_size < 0)
+ mz_stream_get_prop_int64(zip->compress_stream, MZ_STREAM_PROP_TOTAL_OUT, &compressed_size);
+ if (uncompressed_size < 0)
+ mz_stream_get_prop_int64(zip->compress_stream, MZ_STREAM_PROP_TOTAL_IN, &uncompressed_size);
+
+ if (zip->file_info.flag & MZ_ZIP_FLAG_ENCRYPTED) {
+ mz_stream_set_base(zip->crypt_stream, zip->stream);
+ err = mz_stream_close(zip->crypt_stream);
+
+ mz_stream_get_prop_int64(zip->crypt_stream, MZ_STREAM_PROP_TOTAL_OUT, &compressed_size);
+ }
+
+ mz_zip_entry_needs_zip64(&zip->file_info, 1, &zip64);
+
+ if ((err == MZ_OK) && (zip->file_info.flag & MZ_ZIP_FLAG_DATA_DESCRIPTOR)) {
+ /* Determine if we need to write data descriptor in zip64 format,
+ if local extrafield was saved with zip64 extrafield */
+
+ if (zip->file_info.flag & MZ_ZIP_FLAG_MASK_LOCAL_INFO)
+ err = mz_zip_entry_write_descriptor(zip->stream,
+ zip64, 0, compressed_size, 0);
+ else
+ err = mz_zip_entry_write_descriptor(zip->stream,
+ zip64, crc32, compressed_size, uncompressed_size);
+ }
+
+ /* Write file info to central directory */
+
+ mz_zip_print("Zip - Entry - Write cd (ucs %" PRId64 " cs %" PRId64 " crc 0x%08" PRIx32 ")\n",
+ uncompressed_size, compressed_size, crc32);
+
+ zip->file_info.crc = crc32;
+ zip->file_info.compressed_size = compressed_size;
+ zip->file_info.uncompressed_size = uncompressed_size;
+
+ if (err == MZ_OK)
+ err = mz_zip_entry_write_header(zip->cd_mem_stream, 0, &zip->file_info);
+
+ /* Update local header with crc32 and sizes */
+ if ((err == MZ_OK) && ((zip->file_info.flag & MZ_ZIP_FLAG_DATA_DESCRIPTOR) == 0) &&
+ ((zip->file_info.flag & MZ_ZIP_FLAG_MASK_LOCAL_INFO) == 0)) {
+ /* Save the disk number and position we are to seek back after updating local header */
+ int64_t end_pos = mz_stream_tell(zip->stream);
+ mz_stream_get_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, &end_disk_number);
+
+ err = mz_zip_entry_seek_local_header(handle);
+
+ if (err == MZ_OK) {
+ /* Seek to crc32 and sizes offset in local header */
+ err = mz_stream_set_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, zip->file_info.disk_number);
+ if (err == MZ_OK)
+ err = mz_stream_seek(zip->stream, zip->file_info.disk_offset + MZ_ZIP_OFFSET_CRC_SIZES, MZ_SEEK_SET);
+ }
+
+ if (err == MZ_OK)
+ err = mz_zip_entry_write_crc_sizes(zip->stream, zip64, 0, &zip->file_info);
+
+ /* Seek to and update zip64 extension sizes */
+ if ((err == MZ_OK) && (zip64)) {
+ int64_t filename_size = zip->file_info.filename_size;
+
+ if (filename_size == 0)
+ filename_size = strlen(zip->file_info.filename);
+
+ /* Since we write zip64 extension first we know its offset */
+ err = mz_stream_seek(zip->stream, 2 + 2 + filename_size + 4, MZ_SEEK_CUR);
+
+ if (err == MZ_OK)
+ err = mz_stream_write_uint64(zip->stream, zip->file_info.uncompressed_size);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint64(zip->stream, zip->file_info.compressed_size);
+ }
+
+ mz_stream_set_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, end_disk_number);
+ mz_stream_seek(zip->stream, end_pos, MZ_SEEK_SET);
+ }
+
+ zip->number_entry += 1;
+
+ mz_zip_entry_close_int(handle);
+
+ return err;
+}
+
+int32_t mz_zip_entry_seek_local_header(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+ int64_t disk_size = 0;
+ uint32_t disk_number = zip->file_info.disk_number;
+
+ if (disk_number == zip->disk_number_with_cd) {
+ mz_stream_get_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_SIZE, &disk_size);
+ if ((disk_size == 0) || ((zip->open_mode & MZ_OPEN_MODE_WRITE) == 0))
+ disk_number = (uint32_t)-1;
+ }
+
+ mz_stream_set_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, disk_number);
+
+ mz_zip_print("Zip - Entry - Seek local (disk %" PRId32 " offset %" PRId64 ")\n",
+ disk_number, zip->file_info.disk_offset);
+
+ /* Guard against seek overflows */
+ if ((zip->disk_offset_shift > 0) &&
+ (zip->file_info.disk_offset > (INT64_MAX - zip->disk_offset_shift)))
+ return MZ_FORMAT_ERROR;
+
+ return mz_stream_seek(zip->stream, zip->file_info.disk_offset + zip->disk_offset_shift, MZ_SEEK_SET);
+}
+
+int32_t mz_zip_entry_get_compress_stream(void *handle, void **compress_stream) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip || !compress_stream)
+ return MZ_PARAM_ERROR;
+ *compress_stream = zip->compress_stream;
+ if (!*compress_stream)
+ return MZ_EXIST_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_zip_entry_close(void *handle) {
+ return mz_zip_entry_close_raw(handle, UINT64_MAX, 0);
+}
+
+int32_t mz_zip_entry_close_raw(void *handle, int64_t uncompressed_size, uint32_t crc32) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t err = MZ_OK;
+
+ if (!zip || mz_zip_entry_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+
+ if (zip->open_mode & MZ_OPEN_MODE_WRITE)
+ err = mz_zip_entry_write_close(handle, crc32, UINT64_MAX, uncompressed_size);
+ else
+ err = mz_zip_entry_read_close(handle, NULL, NULL, NULL);
+
+ return err;
+}
+
+int32_t mz_zip_entry_is_dir(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t filename_length = 0;
+
+ if (!zip || !zip->entry_scanned)
+ return MZ_PARAM_ERROR;
+ if (mz_zip_attrib_is_dir(zip->file_info.external_fa, zip->file_info.version_madeby) == MZ_OK)
+ return MZ_OK;
+
+ filename_length = (int32_t)strlen(zip->file_info.filename);
+ if (filename_length > 0) {
+ if ((zip->file_info.filename[filename_length - 1] == '/') ||
+ (zip->file_info.filename[filename_length - 1] == '\\'))
+ return MZ_OK;
+ }
+ return MZ_EXIST_ERROR;
+}
+
+int32_t mz_zip_entry_is_symlink(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+
+ if (!zip || !zip->entry_scanned)
+ return MZ_PARAM_ERROR;
+ if (mz_zip_attrib_is_symlink(zip->file_info.external_fa, zip->file_info.version_madeby) != MZ_OK)
+ return MZ_EXIST_ERROR;
+
+ return MZ_OK;
+}
+
+int32_t mz_zip_entry_get_info(void *handle, mz_zip_file **file_info) {
+ mz_zip *zip = (mz_zip *)handle;
+
+ if (!zip)
+ return MZ_PARAM_ERROR;
+
+ if ((zip->open_mode & MZ_OPEN_MODE_WRITE) == 0) {
+ if (!zip->entry_scanned)
+ return MZ_PARAM_ERROR;
+ }
+
+ *file_info = &zip->file_info;
+ return MZ_OK;
+}
+
+int32_t mz_zip_entry_get_local_info(void *handle, mz_zip_file **local_file_info) {
+ mz_zip *zip = (mz_zip *)handle;
+ if (!zip || mz_zip_entry_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ *local_file_info = &zip->local_file_info;
+ return MZ_OK;
+}
+
+int32_t mz_zip_entry_set_extrafield(void *handle, const uint8_t *extrafield, uint16_t extrafield_size) {
+ mz_zip *zip = (mz_zip *)handle;
+
+ if (!zip || mz_zip_entry_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+
+ zip->file_info.extrafield = extrafield;
+ zip->file_info.extrafield_size = extrafield_size;
+ return MZ_OK;
+}
+
+static int32_t mz_zip_goto_next_entry_int(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t err = MZ_OK;
+
+ if (!zip)
+ return MZ_PARAM_ERROR;
+
+ zip->entry_scanned = 0;
+
+ mz_stream_set_prop_int64(zip->cd_stream, MZ_STREAM_PROP_DISK_NUMBER, -1);
+
+ err = mz_stream_seek(zip->cd_stream, zip->cd_current_pos, MZ_SEEK_SET);
+ if (err == MZ_OK)
+ err = mz_zip_entry_read_header(zip->cd_stream, 0, &zip->file_info, zip->file_info_stream);
+ if (err == MZ_OK)
+ zip->entry_scanned = 1;
+ return err;
+}
+
+int64_t mz_zip_get_entry(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+
+ if (!zip)
+ return MZ_PARAM_ERROR;
+
+ return zip->cd_current_pos;
+}
+
+int32_t mz_zip_goto_entry(void *handle, int64_t cd_pos) {
+ mz_zip *zip = (mz_zip *)handle;
+
+ if (!zip)
+ return MZ_PARAM_ERROR;
+
+ if (cd_pos < zip->cd_start_pos || cd_pos > zip->cd_start_pos + zip->cd_size)
+ return MZ_PARAM_ERROR;
+
+ zip->cd_current_pos = cd_pos;
+
+ return mz_zip_goto_next_entry_int(handle);
+}
+
+int32_t mz_zip_goto_first_entry(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+
+ if (!zip)
+ return MZ_PARAM_ERROR;
+
+ zip->cd_current_pos = zip->cd_start_pos;
+
+ return mz_zip_goto_next_entry_int(handle);
+}
+
+int32_t mz_zip_goto_next_entry(void *handle) {
+ mz_zip *zip = (mz_zip *)handle;
+
+ if (!zip)
+ return MZ_PARAM_ERROR;
+
+ zip->cd_current_pos += (int64_t)MZ_ZIP_SIZE_CD_ITEM + zip->file_info.filename_size +
+ zip->file_info.extrafield_size + zip->file_info.comment_size;
+
+ return mz_zip_goto_next_entry_int(handle);
+}
+
+int32_t mz_zip_locate_entry(void *handle, const char *filename, uint8_t ignore_case) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t err = MZ_OK;
+ int32_t result = 0;
+
+ if (!zip || !filename)
+ return MZ_PARAM_ERROR;
+
+ /* If we are already on the current entry, no need to search */
+ if (zip->entry_scanned && zip->file_info.filename) {
+ result = mz_zip_path_compare(zip->file_info.filename, filename, ignore_case);
+ if (result == 0)
+ return MZ_OK;
+ }
+
+ /* Search all entries starting at the first */
+ err = mz_zip_goto_first_entry(handle);
+ while (err == MZ_OK) {
+ result = mz_zip_path_compare(zip->file_info.filename, filename, ignore_case);
+ if (result == 0)
+ return MZ_OK;
+
+ err = mz_zip_goto_next_entry(handle);
+ }
+
+ return err;
+}
+
+int32_t mz_zip_locate_first_entry(void *handle, void *userdata, mz_zip_locate_entry_cb cb) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t err = MZ_OK;
+ int32_t result = 0;
+
+ /* Search first entry looking for match */
+ err = mz_zip_goto_first_entry(handle);
+ if (err != MZ_OK)
+ return err;
+
+ result = cb(handle, userdata, &zip->file_info);
+ if (result == 0)
+ return MZ_OK;
+
+ return mz_zip_locate_next_entry(handle, userdata, cb);
+}
+
+int32_t mz_zip_locate_next_entry(void *handle, void *userdata, mz_zip_locate_entry_cb cb) {
+ mz_zip *zip = (mz_zip *)handle;
+ int32_t err = MZ_OK;
+ int32_t result = 0;
+
+ /* Search next entries looking for match */
+ err = mz_zip_goto_next_entry(handle);
+ while (err == MZ_OK) {
+ result = cb(handle, userdata, &zip->file_info);
+ if (result == 0)
+ return MZ_OK;
+
+ err = mz_zip_goto_next_entry(handle);
+ }
+
+ return err;
+}
+
+/***************************************************************************/
+
+int32_t mz_zip_attrib_is_dir(uint32_t attrib, int32_t version_madeby) {
+ uint32_t posix_attrib = 0;
+ uint8_t system = MZ_HOST_SYSTEM(version_madeby);
+ int32_t err = MZ_OK;
+
+ err = mz_zip_attrib_convert(system, attrib, MZ_HOST_SYSTEM_UNIX, &posix_attrib);
+ if (err == MZ_OK) {
+ if ((posix_attrib & 0170000) == 0040000) /* S_ISDIR */
+ return MZ_OK;
+ }
+
+ return MZ_EXIST_ERROR;
+}
+
+int32_t mz_zip_attrib_is_symlink(uint32_t attrib, int32_t version_madeby) {
+ uint32_t posix_attrib = 0;
+ uint8_t system = MZ_HOST_SYSTEM(version_madeby);
+ int32_t err = MZ_OK;
+
+ err = mz_zip_attrib_convert(system, attrib, MZ_HOST_SYSTEM_UNIX, &posix_attrib);
+ if (err == MZ_OK) {
+ if ((posix_attrib & 0170000) == 0120000) /* S_ISLNK */
+ return MZ_OK;
+ }
+
+ return MZ_EXIST_ERROR;
+}
+
+int32_t mz_zip_attrib_convert(uint8_t src_sys, uint32_t src_attrib, uint8_t target_sys, uint32_t *target_attrib) {
+ if (!target_attrib)
+ return MZ_PARAM_ERROR;
+
+ *target_attrib = 0;
+
+ if ((src_sys == MZ_HOST_SYSTEM_MSDOS) || (src_sys == MZ_HOST_SYSTEM_WINDOWS_NTFS)) {
+ if ((target_sys == MZ_HOST_SYSTEM_MSDOS) || (target_sys == MZ_HOST_SYSTEM_WINDOWS_NTFS)) {
+ *target_attrib = src_attrib;
+ return MZ_OK;
+ }
+ if ((target_sys == MZ_HOST_SYSTEM_UNIX) || (target_sys == MZ_HOST_SYSTEM_OSX_DARWIN) || (target_sys == MZ_HOST_SYSTEM_RISCOS))
+ return mz_zip_attrib_win32_to_posix(src_attrib, target_attrib);
+ } else if ((src_sys == MZ_HOST_SYSTEM_UNIX) || (src_sys == MZ_HOST_SYSTEM_OSX_DARWIN) || (src_sys == MZ_HOST_SYSTEM_RISCOS)) {
+ /* If high bytes are set, it contains unix specific attributes */
+ if ((src_attrib >> 16) != 0)
+ src_attrib >>= 16;
+
+ if ((target_sys == MZ_HOST_SYSTEM_UNIX) || (target_sys == MZ_HOST_SYSTEM_OSX_DARWIN) || (target_sys == MZ_HOST_SYSTEM_RISCOS)) {
+ *target_attrib = src_attrib;
+ return MZ_OK;
+ }
+ if ((target_sys == MZ_HOST_SYSTEM_MSDOS) || (target_sys == MZ_HOST_SYSTEM_WINDOWS_NTFS))
+ return mz_zip_attrib_posix_to_win32(src_attrib, target_attrib);
+ }
+
+ return MZ_SUPPORT_ERROR;
+}
+
+int32_t mz_zip_attrib_posix_to_win32(uint32_t posix_attrib, uint32_t *win32_attrib) {
+ if (!win32_attrib)
+ return MZ_PARAM_ERROR;
+
+ *win32_attrib = 0;
+
+ /* S_IWUSR | S_IWGRP | S_IWOTH | S_IXUSR | S_IXGRP | S_IXOTH */
+ if ((posix_attrib & 0000333) == 0 && (posix_attrib & 0000444) != 0)
+ *win32_attrib |= 0x01; /* FILE_ATTRIBUTE_READONLY */
+ /* S_IFLNK */
+ if ((posix_attrib & 0170000) == 0120000)
+ *win32_attrib |= 0x400; /* FILE_ATTRIBUTE_REPARSE_POINT */
+ /* S_IFDIR */
+ else if ((posix_attrib & 0170000) == 0040000)
+ *win32_attrib |= 0x10; /* FILE_ATTRIBUTE_DIRECTORY */
+ /* S_IFREG */
+ else
+ *win32_attrib |= 0x80; /* FILE_ATTRIBUTE_NORMAL */
+
+ return MZ_OK;
+}
+
+int32_t mz_zip_attrib_win32_to_posix(uint32_t win32_attrib, uint32_t *posix_attrib) {
+ if (!posix_attrib)
+ return MZ_PARAM_ERROR;
+
+ *posix_attrib = 0000444; /* S_IRUSR | S_IRGRP | S_IROTH */
+ /* FILE_ATTRIBUTE_READONLY */
+ if ((win32_attrib & 0x01) == 0)
+ *posix_attrib |= 0000222; /* S_IWUSR | S_IWGRP | S_IWOTH */
+ /* FILE_ATTRIBUTE_REPARSE_POINT */
+ if ((win32_attrib & 0x400) == 0x400)
+ *posix_attrib |= 0120000; /* S_IFLNK */
+ /* FILE_ATTRIBUTE_DIRECTORY */
+ else if ((win32_attrib & 0x10) == 0x10)
+ *posix_attrib |= 0040111; /* S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH */
+ else
+ *posix_attrib |= 0100000; /* S_IFREG */
+
+ return MZ_OK;
+}
+
+/***************************************************************************/
+
+int32_t mz_zip_extrafield_find(void *stream, uint16_t type, int32_t max_seek, uint16_t *length) {
+ int32_t err = MZ_OK;
+ uint16_t field_type = 0;
+ uint16_t field_length = 0;
+
+ if (max_seek < 4)
+ return MZ_EXIST_ERROR;
+
+ do {
+ err = mz_stream_read_uint16(stream, &field_type);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(stream, &field_length);
+ if (err != MZ_OK)
+ break;
+
+ if (type == field_type) {
+ if (length)
+ *length = field_length;
+ return MZ_OK;
+ }
+
+ max_seek -= field_length - 4;
+ if (max_seek < 0)
+ return MZ_EXIST_ERROR;
+
+ err = mz_stream_seek(stream, field_length, MZ_SEEK_CUR);
+ } while (err == MZ_OK);
+
+ return MZ_EXIST_ERROR;
+}
+
+int32_t mz_zip_extrafield_contains(const uint8_t *extrafield, int32_t extrafield_size,
+ uint16_t type, uint16_t *length) {
+ void *file_extra_stream = NULL;
+ int32_t err = MZ_OK;
+
+ if (!extrafield || !extrafield_size)
+ return MZ_PARAM_ERROR;
+
+ mz_stream_mem_create(&file_extra_stream);
+ mz_stream_mem_set_buffer(file_extra_stream, (void *)extrafield, extrafield_size);
+
+ err = mz_zip_extrafield_find(file_extra_stream, type, extrafield_size, length);
+
+ mz_stream_mem_delete(&file_extra_stream);
+
+ return err;
+}
+
+int32_t mz_zip_extrafield_read(void *stream, uint16_t *type, uint16_t *length) {
+ int32_t err = MZ_OK;
+ if (!type || !length)
+ return MZ_PARAM_ERROR;
+ err = mz_stream_read_uint16(stream, type);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(stream, length);
+ return err;
+}
+
+int32_t mz_zip_extrafield_write(void *stream, uint16_t type, uint16_t length) {
+ int32_t err = MZ_OK;
+ err = mz_stream_write_uint16(stream, type);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(stream, length);
+ return err;
+}
+
+/***************************************************************************/
+
+static int32_t mz_zip_invalid_date(const struct tm *ptm) {
+#define datevalue_in_range(min, max, value) ((min) <= (value) && (value) <= (max))
+ return (!datevalue_in_range(0, 127 + 80, ptm->tm_year) || /* 1980-based year, allow 80 extra */
+ !datevalue_in_range(0, 11, ptm->tm_mon) ||
+ !datevalue_in_range(1, 31, ptm->tm_mday) ||
+ !datevalue_in_range(0, 23, ptm->tm_hour) ||
+ !datevalue_in_range(0, 59, ptm->tm_min) ||
+ !datevalue_in_range(0, 59, ptm->tm_sec));
+#undef datevalue_in_range
+}
+
+static void mz_zip_dosdate_to_raw_tm(uint64_t dos_date, struct tm *ptm) {
+ uint64_t date = (uint64_t)(dos_date >> 16);
+
+ ptm->tm_mday = (uint16_t)(date & 0x1f);
+ ptm->tm_mon = (uint16_t)(((date & 0x1E0) / 0x20) - 1);
+ ptm->tm_year = (uint16_t)(((date & 0x0FE00) / 0x0200) + 80);
+ ptm->tm_hour = (uint16_t)((dos_date & 0xF800) / 0x800);
+ ptm->tm_min = (uint16_t)((dos_date & 0x7E0) / 0x20);
+ ptm->tm_sec = (uint16_t)(2 * (dos_date & 0x1f));
+ ptm->tm_isdst = -1;
+}
+
+int32_t mz_zip_dosdate_to_tm(uint64_t dos_date, struct tm *ptm) {
+ if (!ptm)
+ return MZ_PARAM_ERROR;
+
+ mz_zip_dosdate_to_raw_tm(dos_date, ptm);
+
+ if (mz_zip_invalid_date(ptm)) {
+ /* Invalid date stored, so don't return it */
+ memset(ptm, 0, sizeof(struct tm));
+ return MZ_FORMAT_ERROR;
+ }
+ return MZ_OK;
+}
+
+time_t mz_zip_dosdate_to_time_t(uint64_t dos_date) {
+ struct tm ptm;
+ mz_zip_dosdate_to_raw_tm(dos_date, &ptm);
+ return mktime(&ptm);
+}
+
+int32_t mz_zip_time_t_to_tm(time_t unix_time, struct tm *ptm) {
+ struct tm ltm;
+ if (!ptm)
+ return MZ_PARAM_ERROR;
+ if (!localtime_r(&unix_time, <m)) { /* Returns a 1900-based year */
+ /* Invalid date stored, so don't return it */
+ memset(ptm, 0, sizeof(struct tm));
+ return MZ_INTERNAL_ERROR;
+ }
+ memcpy(ptm, <m, sizeof(struct tm));
+ return MZ_OK;
+}
+
+uint32_t mz_zip_time_t_to_dos_date(time_t unix_time) {
+ struct tm ptm;
+ mz_zip_time_t_to_tm(unix_time, &ptm);
+ return mz_zip_tm_to_dosdate((const struct tm *)&ptm);
+}
+
+uint32_t mz_zip_tm_to_dosdate(const struct tm *ptm) {
+ struct tm fixed_tm;
+
+ /* Years supported: */
+
+ /* [00, 79] (assumed to be between 2000 and 2079) */
+ /* [80, 207] (assumed to be between 1980 and 2107, typical output of old */
+ /* software that does 'year-1900' to get a double digit year) */
+ /* [1980, 2107] (due to format limitations, only years 1980-2107 can be stored.) */
+
+ memcpy(&fixed_tm, ptm, sizeof(struct tm));
+ if (fixed_tm.tm_year >= 1980) /* range [1980, 2107] */
+ fixed_tm.tm_year -= 1980;
+ else if (fixed_tm.tm_year >= 80) /* range [80, 207] */
+ fixed_tm.tm_year -= 80;
+ else /* range [00, 79] */
+ fixed_tm.tm_year += 20;
+
+ if (mz_zip_invalid_date(&fixed_tm))
+ return 0;
+
+ return (((uint32_t)fixed_tm.tm_mday + (32 * ((uint32_t)fixed_tm.tm_mon + 1)) + (512 * (uint32_t)fixed_tm.tm_year)) << 16) |
+ (((uint32_t)fixed_tm.tm_sec / 2) + (32 * (uint32_t)fixed_tm.tm_min) + (2048 * (uint32_t)fixed_tm.tm_hour));
+}
+
+int32_t mz_zip_ntfs_to_unix_time(uint64_t ntfs_time, time_t *unix_time) {
+ *unix_time = (time_t)((ntfs_time - 116444736000000000LL) / 10000000);
+ return MZ_OK;
+}
+
+int32_t mz_zip_unix_to_ntfs_time(time_t unix_time, uint64_t *ntfs_time) {
+ *ntfs_time = ((uint64_t)unix_time * 10000000) + 116444736000000000LL;
+ return MZ_OK;
+}
+
+/***************************************************************************/
+
+int32_t mz_zip_path_compare(const char *path1, const char *path2, uint8_t ignore_case) {
+ do {
+ if ((*path1 == '\\' && *path2 == '/') ||
+ (*path2 == '\\' && *path1 == '/')) {
+ /* Ignore comparison of path slashes */
+ } else if (ignore_case) {
+ if (tolower(*path1) != tolower(*path2))
+ break;
+ } else if (*path1 != *path2) {
+ break;
+ }
+
+ path1 += 1;
+ path2 += 1;
+ } while (*path1 != 0 && *path2 != 0);
+
+ if (ignore_case)
+ return (int32_t)(tolower(*path1) - tolower(*path2));
+
+ return (int32_t)(*path1 - *path2);
+}
+
+/***************************************************************************/
+
+const char* mz_zip_get_compression_method_string(int32_t compression_method)
+{
+ const char *method = "?";
+ switch (compression_method) {
+ case MZ_COMPRESS_METHOD_STORE:
+ method = "stored";
+ break;
+ case MZ_COMPRESS_METHOD_DEFLATE:
+ method = "deflate";
+ break;
+ case MZ_COMPRESS_METHOD_BZIP2:
+ method = "bzip2";
+ break;
+ case MZ_COMPRESS_METHOD_LZMA:
+ method = "lzma";
+ break;
+ case MZ_COMPRESS_METHOD_XZ:
+ method = "xz";
+ break;
+ case MZ_COMPRESS_METHOD_ZSTD:
+ method = "zstd";
+ break;
+ }
+ return method;
+}
+
+/***************************************************************************/
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_zip.h b/ios/CodePush/SSZipArchive/minizip/mz_zip.h
new file mode 100644
index 000000000..65be301af
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_zip.h
@@ -0,0 +1,262 @@
+/* mz_zip.h -- Zip manipulation
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+ Copyright (C) 2009-2010 Mathias Svensson
+ Modifications for Zip64 support
+ http://result42.com
+ Copyright (C) 1998-2010 Gilles Vollant
+ https://www.winimage.com/zLibDll/minizip.html
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_ZIP_H
+#define MZ_ZIP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+typedef struct mz_zip_file_s {
+ uint16_t version_madeby; /* version made by */
+ uint16_t version_needed; /* version needed to extract */
+ uint16_t flag; /* general purpose bit flag */
+ uint16_t compression_method; /* compression method */
+ time_t modified_date; /* last modified date in unix time */
+ time_t accessed_date; /* last accessed date in unix time */
+ time_t creation_date; /* creation date in unix time */
+ uint32_t crc; /* crc-32 */
+ int64_t compressed_size; /* compressed size */
+ int64_t uncompressed_size; /* uncompressed size */
+ uint16_t filename_size; /* filename length */
+ uint16_t extrafield_size; /* extra field length */
+ uint16_t comment_size; /* file comment length */
+ uint32_t disk_number; /* disk number start */
+ int64_t disk_offset; /* relative offset of local header */
+ uint16_t internal_fa; /* internal file attributes */
+ uint32_t external_fa; /* external file attributes */
+
+ const char *filename; /* filename utf8 null-terminated string */
+ const uint8_t *extrafield; /* extrafield data */
+ const char *comment; /* comment utf8 null-terminated string */
+ const char *linkname; /* sym-link filename utf8 null-terminated string */
+
+ uint16_t zip64; /* zip64 extension mode */
+ uint16_t aes_version; /* winzip aes extension if not 0 */
+ uint8_t aes_encryption_mode; /* winzip aes encryption mode */
+ uint16_t pk_verify; /* pkware encryption verifier */
+
+} mz_zip_file, mz_zip_entry;
+
+/***************************************************************************/
+
+typedef int32_t (*mz_zip_locate_entry_cb)(void *handle, void *userdata, mz_zip_file *file_info);
+
+/***************************************************************************/
+
+void * mz_zip_create(void **handle);
+/* Create zip instance for opening */
+
+void mz_zip_delete(void **handle);
+/* Delete zip object */
+
+int32_t mz_zip_open(void *handle, void *stream, int32_t mode);
+/* Create a zip file, no delete file in zip functionality */
+
+int32_t mz_zip_close(void *handle);
+/* Close the zip file */
+
+int32_t mz_zip_get_comment(void *handle, const char **comment);
+/* Get a pointer to the global comment */
+
+int32_t mz_zip_set_comment(void *handle, const char *comment);
+/* Sets the global comment used for writing zip file */
+
+int32_t mz_zip_get_version_madeby(void *handle, uint16_t *version_madeby);
+/* Get the version made by */
+
+int32_t mz_zip_set_version_madeby(void *handle, uint16_t version_madeby);
+/* Sets the version made by used for writing zip file */
+
+int32_t mz_zip_set_recover(void *handle, uint8_t recover);
+/* Sets the ability to recover the central dir by reading local file headers */
+
+int32_t mz_zip_set_data_descriptor(void *handle, uint8_t data_descriptor);
+/* Sets the use of data descriptor flag when writing zip entries */
+
+int32_t mz_zip_get_stream(void *handle, void **stream);
+/* Get a pointer to the stream used to open */
+
+int32_t mz_zip_set_cd_stream(void *handle, int64_t cd_start_pos, void *cd_stream);
+/* Sets the stream to use for reading the central dir */
+
+int32_t mz_zip_get_cd_mem_stream(void *handle, void **cd_mem_stream);
+/* Get a pointer to the stream used to store the central dir in memory */
+
+int32_t mz_zip_set_number_entry(void *handle, uint64_t number_entry);
+/* Sets the total number of entries */
+
+int32_t mz_zip_get_number_entry(void *handle, uint64_t *number_entry);
+/* Get the total number of entries */
+
+int32_t mz_zip_set_disk_number_with_cd(void *handle, uint32_t disk_number_with_cd);
+/* Sets the disk number containing the central directory record */
+
+int32_t mz_zip_get_disk_number_with_cd(void *handle, uint32_t *disk_number_with_cd);
+/* Get the disk number containing the central directory record */
+
+/***************************************************************************/
+
+int32_t mz_zip_entry_is_open(void *handle);
+/* Check to see if entry is open for read/write */
+
+int32_t mz_zip_entry_read_open(void *handle, uint8_t raw, const char *password);
+/* Open for reading the current file in the zip file */
+
+int32_t mz_zip_entry_read(void *handle, void *buf, int32_t len);
+/* Read bytes from the current file in the zip file */
+
+int32_t mz_zip_entry_read_close(void *handle, uint32_t *crc32, int64_t *compressed_size,
+ int64_t *uncompressed_size);
+/* Close the current file for reading and get data descriptor values */
+
+int32_t mz_zip_entry_write_open(void *handle, const mz_zip_file *file_info,
+ int16_t compress_level, uint8_t raw, const char *password);
+/* Open for writing the current file in the zip file */
+
+int32_t mz_zip_entry_write(void *handle, const void *buf, int32_t len);
+/* Write bytes from the current file in the zip file */
+
+int32_t mz_zip_entry_write_close(void *handle, uint32_t crc32, int64_t compressed_size,
+ int64_t uncompressed_size);
+/* Close the current file for writing and set data descriptor values */
+
+int32_t mz_zip_entry_seek_local_header(void *handle);
+/* Seeks to the local header for the entry */
+
+int32_t mz_zip_entry_get_compress_stream(void *handle, void **compress_stream);
+/* Get a pointer to the compression stream used for the current entry */
+
+int32_t mz_zip_entry_close_raw(void *handle, int64_t uncompressed_size, uint32_t crc32);
+/* Close the current file in the zip file where raw is compressed data */
+
+int32_t mz_zip_entry_close(void *handle);
+/* Close the current file in the zip file */
+
+/***************************************************************************/
+
+int32_t mz_zip_entry_is_dir(void *handle);
+/* Checks to see if the entry is a directory */
+
+int32_t mz_zip_entry_is_symlink(void *handle);
+/* Checks to see if the entry is a symbolic link */
+
+int32_t mz_zip_entry_get_info(void *handle, mz_zip_file **file_info);
+/* Get info about the current file, only valid while current entry is open */
+
+int32_t mz_zip_entry_get_local_info(void *handle, mz_zip_file **local_file_info);
+/* Get local info about the current file, only valid while current entry is being read */
+
+int32_t mz_zip_entry_set_extrafield(void *handle, const uint8_t *extrafield, uint16_t extrafield_size);
+/* Sets or updates the extra field for the entry to be used before writing cd */
+
+int64_t mz_zip_get_entry(void *handle);
+/* Return offset of the current entry in the zip file */
+
+int32_t mz_zip_goto_entry(void *handle, int64_t cd_pos);
+/* Go to specified entry in the zip file */
+
+int32_t mz_zip_goto_first_entry(void *handle);
+/* Go to the first entry in the zip file */
+
+int32_t mz_zip_goto_next_entry(void *handle);
+/* Go to the next entry in the zip file or MZ_END_OF_LIST if reaching the end */
+
+int32_t mz_zip_locate_entry(void *handle, const char *filename, uint8_t ignore_case);
+/* Locate the file with the specified name in the zip file or MZ_END_LIST if not found */
+
+int32_t mz_zip_locate_first_entry(void *handle, void *userdata, mz_zip_locate_entry_cb cb);
+/* Locate the first matching entry based on a match callback */
+
+int32_t mz_zip_locate_next_entry(void *handle, void *userdata, mz_zip_locate_entry_cb cb);
+/* Locate the next matching entry based on a match callback */
+
+/***************************************************************************/
+
+int32_t mz_zip_attrib_is_dir(uint32_t attrib, int32_t version_madeby);
+/* Checks to see if the attribute is a directory based on platform */
+
+int32_t mz_zip_attrib_is_symlink(uint32_t attrib, int32_t version_madeby);
+/* Checks to see if the attribute is a symbolic link based on platform */
+
+int32_t mz_zip_attrib_convert(uint8_t src_sys, uint32_t src_attrib, uint8_t target_sys,
+ uint32_t *target_attrib);
+/* Converts file attributes from one host system to another */
+
+int32_t mz_zip_attrib_posix_to_win32(uint32_t posix_attrib, uint32_t *win32_attrib);
+/* Converts posix file attributes to win32 file attributes */
+
+int32_t mz_zip_attrib_win32_to_posix(uint32_t win32_attrib, uint32_t *posix_attrib);
+/* Converts win32 file attributes to posix file attributes */
+
+/***************************************************************************/
+
+int32_t mz_zip_extrafield_find(void *stream, uint16_t type, int32_t max_seek, uint16_t *length);
+/* Seeks to extra field by its type and returns its length */
+
+int32_t mz_zip_extrafield_contains(const uint8_t *extrafield, int32_t extrafield_size,
+ uint16_t type, uint16_t *length);
+/* Gets whether an extrafield exists and its size */
+
+int32_t mz_zip_extrafield_read(void *stream, uint16_t *type, uint16_t *length);
+/* Reads an extrafield header from a stream */
+
+int32_t mz_zip_extrafield_write(void *stream, uint16_t type, uint16_t length);
+/* Writes an extrafield header to a stream */
+
+/***************************************************************************/
+
+int32_t mz_zip_dosdate_to_tm(uint64_t dos_date, struct tm *ptm);
+/* Convert dos date/time format to struct tm */
+
+time_t mz_zip_dosdate_to_time_t(uint64_t dos_date);
+/* Convert dos date/time format to time_t */
+
+int32_t mz_zip_time_t_to_tm(time_t unix_time, struct tm *ptm);
+/* Convert time_t to time struct */
+
+uint32_t mz_zip_time_t_to_dos_date(time_t unix_time);
+/* Convert time_t to dos date/time format */
+
+uint32_t mz_zip_tm_to_dosdate(const struct tm *ptm);
+/* Convert struct tm to dos date/time format */
+
+int32_t mz_zip_ntfs_to_unix_time(uint64_t ntfs_time, time_t *unix_time);
+/* Convert ntfs time to unix time */
+
+int32_t mz_zip_unix_to_ntfs_time(time_t unix_time, uint64_t *ntfs_time);
+/* Convert unix time to ntfs time */
+
+/***************************************************************************/
+
+int32_t mz_zip_path_compare(const char *path1, const char *path2, uint8_t ignore_case);
+/* Compare two paths without regard to slashes */
+
+/***************************************************************************/
+
+const
+char* mz_zip_get_compression_method_string(int32_t compression_method);
+/* Gets a string representing the compression method */
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZIP_H */
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.c b/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.c
new file mode 100644
index 000000000..05390cc6a
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.c
@@ -0,0 +1,1942 @@
+/* mz_zip_rw.c -- Zip reader/writer
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#include "mz.h"
+#include "mz_crypt.h"
+#include "mz_os.h"
+#include "mz_strm.h"
+#include "mz_strm_buf.h"
+#include "mz_strm_mem.h"
+#include "mz_strm_os.h"
+#include "mz_strm_split.h"
+#include "mz_strm_wzaes.h"
+#include "mz_zip.h"
+
+#include "mz_zip_rw.h"
+
+/***************************************************************************/
+
+#define MZ_DEFAULT_PROGRESS_INTERVAL (1000u)
+
+#define MZ_ZIP_CD_FILENAME ("__cdcd__")
+
+/***************************************************************************/
+
+typedef struct mz_zip_reader_s {
+ void *zip_handle;
+ void *file_stream;
+ void *buffered_stream;
+ void *split_stream;
+ void *mem_stream;
+ void *hash;
+ uint16_t hash_algorithm;
+ uint16_t hash_digest_size;
+ mz_zip_file *file_info;
+ const char *pattern;
+ uint8_t pattern_ignore_case;
+ const char *password;
+ void *overwrite_userdata;
+ mz_zip_reader_overwrite_cb
+ overwrite_cb;
+ void *password_userdata;
+ mz_zip_reader_password_cb
+ password_cb;
+ void *progress_userdata;
+ mz_zip_reader_progress_cb
+ progress_cb;
+ uint32_t progress_cb_interval_ms;
+ void *entry_userdata;
+ mz_zip_reader_entry_cb
+ entry_cb;
+ uint8_t raw;
+ uint8_t buffer[UINT16_MAX];
+ int32_t encoding;
+ uint8_t sign_required;
+ uint8_t cd_verified;
+ uint8_t cd_zipped;
+ uint8_t entry_verified;
+ uint8_t recover;
+} mz_zip_reader;
+
+/***************************************************************************/
+
+int32_t mz_zip_reader_is_open(void *handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ if (!reader)
+ return MZ_PARAM_ERROR;
+ if (!reader->zip_handle)
+ return MZ_PARAM_ERROR;
+ return MZ_OK;
+}
+
+int32_t mz_zip_reader_open(void *handle, void *stream) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+
+ reader->cd_verified = 0;
+ reader->cd_zipped = 0;
+
+ mz_zip_create(&reader->zip_handle);
+ mz_zip_set_recover(reader->zip_handle, reader->recover);
+
+ err = mz_zip_open(reader->zip_handle, stream, MZ_OPEN_MODE_READ);
+
+ if (err != MZ_OK) {
+ mz_zip_reader_close(handle);
+ return err;
+ }
+
+ mz_zip_reader_unzip_cd(reader);
+ return MZ_OK;
+}
+
+int32_t mz_zip_reader_open_file(void *handle, const char *path) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+
+ mz_zip_reader_close(handle);
+
+ mz_stream_os_create(&reader->file_stream);
+ mz_stream_buffered_create(&reader->buffered_stream);
+ mz_stream_split_create(&reader->split_stream);
+
+ mz_stream_set_base(reader->buffered_stream, reader->file_stream);
+ mz_stream_set_base(reader->split_stream, reader->buffered_stream);
+
+ err = mz_stream_open(reader->split_stream, path, MZ_OPEN_MODE_READ);
+ if (err == MZ_OK)
+ err = mz_zip_reader_open(handle, reader->split_stream);
+ return err;
+}
+
+int32_t mz_zip_reader_open_file_in_memory(void *handle, const char *path) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ void *file_stream = NULL;
+ int64_t file_size = 0;
+ int32_t err = 0;
+
+ mz_zip_reader_close(handle);
+
+ mz_stream_os_create(&file_stream);
+
+ err = mz_stream_os_open(file_stream, path, MZ_OPEN_MODE_READ);
+
+ if (err != MZ_OK) {
+ mz_stream_os_delete(&file_stream);
+ mz_zip_reader_close(handle);
+ return err;
+ }
+
+ mz_stream_os_seek(file_stream, 0, MZ_SEEK_END);
+ file_size = mz_stream_os_tell(file_stream);
+ mz_stream_os_seek(file_stream, 0, MZ_SEEK_SET);
+
+ if ((file_size <= 0) || (file_size > UINT32_MAX)) {
+ /* Memory size is too large or too small */
+
+ mz_stream_os_close(file_stream);
+ mz_stream_os_delete(&file_stream);
+ mz_zip_reader_close(handle);
+ return MZ_MEM_ERROR;
+ }
+
+ mz_stream_mem_create(&reader->mem_stream);
+ mz_stream_mem_set_grow_size(reader->mem_stream, (int32_t)file_size);
+ mz_stream_mem_open(reader->mem_stream, NULL, MZ_OPEN_MODE_CREATE);
+
+ err = mz_stream_copy(reader->mem_stream, file_stream, (int32_t)file_size);
+
+ mz_stream_os_close(file_stream);
+ mz_stream_os_delete(&file_stream);
+
+ if (err == MZ_OK)
+ err = mz_zip_reader_open(handle, reader->mem_stream);
+ if (err != MZ_OK)
+ mz_zip_reader_close(handle);
+
+ return err;
+}
+
+int32_t mz_zip_reader_open_buffer(void *handle, uint8_t *buf, int32_t len, uint8_t copy) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+
+ mz_zip_reader_close(handle);
+
+ mz_stream_mem_create(&reader->mem_stream);
+
+ if (copy) {
+ mz_stream_mem_set_grow_size(reader->mem_stream, len);
+ mz_stream_mem_open(reader->mem_stream, NULL, MZ_OPEN_MODE_CREATE);
+ mz_stream_mem_write(reader->mem_stream, buf, len);
+ mz_stream_mem_seek(reader->mem_stream, 0, MZ_SEEK_SET);
+ } else {
+ mz_stream_mem_open(reader->mem_stream, NULL, MZ_OPEN_MODE_READ);
+ mz_stream_mem_set_buffer(reader->mem_stream, buf, len);
+ }
+
+ if (err == MZ_OK)
+ err = mz_zip_reader_open(handle, reader->mem_stream);
+
+ return err;
+}
+
+int32_t mz_zip_reader_close(void *handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+
+ if (reader->zip_handle) {
+ err = mz_zip_close(reader->zip_handle);
+ mz_zip_delete(&reader->zip_handle);
+ }
+
+ if (reader->split_stream) {
+ mz_stream_split_close(reader->split_stream);
+ mz_stream_split_delete(&reader->split_stream);
+ }
+
+ if (reader->buffered_stream)
+ mz_stream_buffered_delete(&reader->buffered_stream);
+
+ if (reader->file_stream)
+ mz_stream_os_delete(&reader->file_stream);
+
+ if (reader->mem_stream) {
+ mz_stream_close(reader->mem_stream);
+ mz_stream_delete(&reader->mem_stream);
+ }
+
+ return err;
+}
+
+/***************************************************************************/
+
+int32_t mz_zip_reader_unzip_cd(void *handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ mz_zip_file *cd_info = NULL;
+ void *cd_mem_stream = NULL;
+ void *new_cd_stream = NULL;
+ void *file_extra_stream = NULL;
+ uint64_t number_entry = 0;
+ int32_t err = MZ_OK;
+
+ err = mz_zip_reader_goto_first_entry(handle);
+ if (err != MZ_OK)
+ return err;
+ err = mz_zip_reader_entry_get_info(handle, &cd_info);
+ if (err != MZ_OK)
+ return err;
+
+ if (strcmp(cd_info->filename, MZ_ZIP_CD_FILENAME) != 0)
+ return mz_zip_reader_goto_first_entry(handle);
+
+ err = mz_zip_reader_entry_open(handle);
+ if (err != MZ_OK)
+ return err;
+
+ mz_stream_mem_create(&file_extra_stream);
+ mz_stream_mem_set_buffer(file_extra_stream, (void *)cd_info->extrafield, cd_info->extrafield_size);
+
+ err = mz_zip_extrafield_find(file_extra_stream, MZ_ZIP_EXTENSION_CDCD, INT32_MAX, NULL);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint64(file_extra_stream, &number_entry);
+
+ mz_stream_mem_delete(&file_extra_stream);
+
+ if (err != MZ_OK)
+ return err;
+
+ mz_zip_get_cd_mem_stream(reader->zip_handle, &cd_mem_stream);
+ if (mz_stream_mem_is_open(cd_mem_stream) != MZ_OK)
+ mz_stream_mem_open(cd_mem_stream, NULL, MZ_OPEN_MODE_CREATE);
+
+ err = mz_stream_seek(cd_mem_stream, 0, MZ_SEEK_SET);
+ if (err == MZ_OK)
+ err = mz_stream_copy_stream(cd_mem_stream, NULL, handle, mz_zip_reader_entry_read,
+ (int32_t)cd_info->uncompressed_size);
+
+ if (err == MZ_OK) {
+ reader->cd_zipped = 1;
+
+ mz_zip_set_cd_stream(reader->zip_handle, 0, cd_mem_stream);
+ mz_zip_set_number_entry(reader->zip_handle, number_entry);
+
+ err = mz_zip_reader_goto_first_entry(handle);
+ }
+
+ reader->cd_verified = reader->entry_verified;
+
+ mz_stream_mem_delete(&new_cd_stream);
+ return err;
+}
+
+/***************************************************************************/
+
+static int32_t mz_zip_reader_locate_entry_cb(void *handle, void *userdata, mz_zip_file *file_info) {
+ mz_zip_reader *reader = (mz_zip_reader *)userdata;
+ int32_t result = 0;
+ MZ_UNUSED(handle);
+ result = mz_path_compare_wc(file_info->filename, reader->pattern, reader->pattern_ignore_case);
+ return result;
+}
+
+int32_t mz_zip_reader_goto_first_entry(void *handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+
+ if (mz_zip_reader_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+
+ if (mz_zip_entry_is_open(reader->zip_handle) == MZ_OK)
+ mz_zip_reader_entry_close(handle);
+
+ if (!reader->pattern)
+ err = mz_zip_goto_first_entry(reader->zip_handle);
+ else
+ err = mz_zip_locate_first_entry(reader->zip_handle, reader, mz_zip_reader_locate_entry_cb);
+
+ reader->file_info = NULL;
+ if (err == MZ_OK)
+ err = mz_zip_entry_get_info(reader->zip_handle, &reader->file_info);
+
+ return err;
+}
+
+int32_t mz_zip_reader_goto_next_entry(void *handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+
+ if (mz_zip_reader_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+
+ if (mz_zip_entry_is_open(reader->zip_handle) == MZ_OK)
+ mz_zip_reader_entry_close(handle);
+
+ if (!reader->pattern)
+ err = mz_zip_goto_next_entry(reader->zip_handle);
+ else
+ err = mz_zip_locate_next_entry(reader->zip_handle, reader, mz_zip_reader_locate_entry_cb);
+
+ reader->file_info = NULL;
+ if (err == MZ_OK)
+ err = mz_zip_entry_get_info(reader->zip_handle, &reader->file_info);
+
+ return err;
+}
+
+int32_t mz_zip_reader_locate_entry(void *handle, const char *filename, uint8_t ignore_case) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+
+ if (mz_zip_entry_is_open(reader->zip_handle) == MZ_OK)
+ mz_zip_reader_entry_close(handle);
+
+ err = mz_zip_locate_entry(reader->zip_handle, filename, ignore_case);
+
+ reader->file_info = NULL;
+ if (err == MZ_OK)
+ err = mz_zip_entry_get_info(reader->zip_handle, &reader->file_info);
+
+ return err;
+}
+
+/***************************************************************************/
+
+int32_t mz_zip_reader_entry_open(void *handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+ const char *password = NULL;
+ char password_buf[120];
+
+ reader->entry_verified = 0;
+
+ if (mz_zip_reader_is_open(reader) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (!reader->file_info)
+ return MZ_PARAM_ERROR;
+
+ /* If the entry isn't open for reading, open it */
+ if (mz_zip_entry_is_open(reader->zip_handle) == MZ_OK)
+ return MZ_OK;
+
+ password = reader->password;
+
+ /* Check if we need a password and ask for it if we need to */
+ if (!password && reader->password_cb && (reader->file_info->flag & MZ_ZIP_FLAG_ENCRYPTED)) {
+ reader->password_cb(handle, reader->password_userdata, reader->file_info,
+ password_buf, sizeof(password_buf));
+
+ password = password_buf;
+ }
+
+ err = mz_zip_entry_read_open(reader->zip_handle, reader->raw, password);
+#ifndef MZ_ZIP_NO_CRYPTO
+ if (err != MZ_OK)
+ return err;
+
+ if (mz_zip_reader_entry_get_first_hash(handle, &reader->hash_algorithm, &reader->hash_digest_size) == MZ_OK) {
+ mz_crypt_sha_create(&reader->hash);
+ if (reader->hash_algorithm == MZ_HASH_SHA1)
+ mz_crypt_sha_set_algorithm(reader->hash, MZ_HASH_SHA1);
+ else if (reader->hash_algorithm == MZ_HASH_SHA256)
+ mz_crypt_sha_set_algorithm(reader->hash, MZ_HASH_SHA256);
+ else
+ err = MZ_SUPPORT_ERROR;
+
+ if (err == MZ_OK)
+ mz_crypt_sha_begin(reader->hash);
+#ifdef MZ_ZIP_SIGNING
+ if (err == MZ_OK) {
+ if (mz_zip_reader_entry_has_sign(handle) == MZ_OK) {
+ err = mz_zip_reader_entry_sign_verify(handle);
+ if (err == MZ_OK)
+ reader->entry_verified = 1;
+ } else if (reader->sign_required && !reader->cd_verified)
+ err = MZ_SIGN_ERROR;
+ }
+#endif
+ } else if (reader->sign_required && !reader->cd_verified)
+ err = MZ_SIGN_ERROR;
+#endif
+
+ return err;
+}
+
+int32_t mz_zip_reader_entry_close(void *handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+ int32_t err_close = MZ_OK;
+#ifndef MZ_ZIP_NO_CRYPTO
+ int32_t err_hash = MZ_OK;
+ uint8_t computed_hash[MZ_HASH_MAX_SIZE];
+ uint8_t expected_hash[MZ_HASH_MAX_SIZE];
+
+ if (reader->hash) {
+ mz_crypt_sha_end(reader->hash, computed_hash, sizeof(computed_hash));
+ mz_crypt_sha_delete(&reader->hash);
+
+ err_hash = mz_zip_reader_entry_get_hash(handle, reader->hash_algorithm, expected_hash,
+ reader->hash_digest_size);
+
+ if (err_hash == MZ_OK) {
+ /* Verify expected hash against computed hash */
+ if (memcmp(computed_hash, expected_hash, reader->hash_digest_size) != 0)
+ err = MZ_CRC_ERROR;
+ }
+ }
+#endif
+
+ err_close = mz_zip_entry_close(reader->zip_handle);
+ if (err == MZ_OK)
+ err = err_close;
+ return err;
+}
+
+int32_t mz_zip_reader_entry_read(void *handle, void *buf, int32_t len) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t read = 0;
+ read = mz_zip_entry_read(reader->zip_handle, buf, len);
+#ifndef MZ_ZIP_NO_CRYPTO
+ if (read > 0 && reader->hash)
+ mz_crypt_sha_update(reader->hash, buf, read);
+#endif
+ return read;
+}
+
+int32_t mz_zip_reader_entry_has_sign(void *handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+
+ if (!reader || mz_zip_entry_is_open(reader->zip_handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+
+ return mz_zip_extrafield_contains(reader->file_info->extrafield,
+ reader->file_info->extrafield_size, MZ_ZIP_EXTENSION_SIGN, NULL);
+}
+
+#if !defined(MZ_ZIP_NO_CRYPTO) && defined(MZ_ZIP_SIGNING)
+int32_t mz_zip_reader_entry_sign_verify(void *handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ void *file_extra_stream = NULL;
+ int32_t err = MZ_OK;
+ uint8_t *signature = NULL;
+ uint16_t signature_size = 0;
+ uint8_t hash[MZ_HASH_MAX_SIZE];
+
+ if (!reader || mz_zip_entry_is_open(reader->zip_handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+
+ mz_stream_mem_create(&file_extra_stream);
+ mz_stream_mem_set_buffer(file_extra_stream, (void *)reader->file_info->extrafield,
+ reader->file_info->extrafield_size);
+
+ err = mz_zip_extrafield_find(file_extra_stream, MZ_ZIP_EXTENSION_SIGN, INT32_MAX, &signature_size);
+ if ((err == MZ_OK) && (signature_size > 0)) {
+ signature = (uint8_t *)malloc(signature_size);
+ if (mz_stream_read(file_extra_stream, signature, signature_size) != signature_size)
+ err = MZ_READ_ERROR;
+ }
+
+ mz_stream_mem_delete(&file_extra_stream);
+
+ if (err == MZ_OK) {
+ /* Get most secure hash to verify signature against */
+ err = mz_zip_reader_entry_get_hash(handle, reader->hash_algorithm, hash, reader->hash_digest_size);
+ }
+
+ if (err == MZ_OK) {
+ /* Verify the pkcs signature */
+ err = mz_crypt_sign_verify(hash, reader->hash_digest_size, signature, signature_size);
+ }
+
+ if (signature)
+ free(signature);
+
+ return err;
+}
+#endif
+
+int32_t mz_zip_reader_entry_get_hash(void *handle, uint16_t algorithm, uint8_t *digest, int32_t digest_size) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ void *file_extra_stream = NULL;
+ int32_t err = MZ_OK;
+ int32_t return_err = MZ_EXIST_ERROR;
+ uint16_t cur_algorithm = 0;
+ uint16_t cur_digest_size = 0;
+
+ mz_stream_mem_create(&file_extra_stream);
+ mz_stream_mem_set_buffer(file_extra_stream, (void *)reader->file_info->extrafield,
+ reader->file_info->extrafield_size);
+
+ do {
+ err = mz_zip_extrafield_find(file_extra_stream, MZ_ZIP_EXTENSION_HASH, INT32_MAX, NULL);
+ if (err != MZ_OK)
+ break;
+
+ err = mz_stream_read_uint16(file_extra_stream, &cur_algorithm);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(file_extra_stream, &cur_digest_size);
+ if ((err == MZ_OK) && (cur_algorithm == algorithm) && (cur_digest_size <= digest_size) &&
+ (cur_digest_size <= MZ_HASH_MAX_SIZE)) {
+ /* Read hash digest */
+ if (mz_stream_read(file_extra_stream, digest, digest_size) == cur_digest_size)
+ return_err = MZ_OK;
+ break;
+ } else {
+ err = mz_stream_seek(file_extra_stream, cur_digest_size, MZ_SEEK_CUR);
+ }
+ } while (err == MZ_OK);
+
+ mz_stream_mem_delete(&file_extra_stream);
+
+ return return_err;
+}
+
+int32_t mz_zip_reader_entry_get_first_hash(void *handle, uint16_t *algorithm, uint16_t *digest_size) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ void *file_extra_stream = NULL;
+ int32_t err = MZ_OK;
+ uint16_t cur_algorithm = 0;
+ uint16_t cur_digest_size = 0;
+
+ if (!reader || !algorithm)
+ return MZ_PARAM_ERROR;
+
+ mz_stream_mem_create(&file_extra_stream);
+ mz_stream_mem_set_buffer(file_extra_stream, (void *)reader->file_info->extrafield,
+ reader->file_info->extrafield_size);
+
+ err = mz_zip_extrafield_find(file_extra_stream, MZ_ZIP_EXTENSION_HASH, INT32_MAX, NULL);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(file_extra_stream, &cur_algorithm);
+ if (err == MZ_OK)
+ err = mz_stream_read_uint16(file_extra_stream, &cur_digest_size);
+
+ if (algorithm)
+ *algorithm = cur_algorithm;
+ if (digest_size)
+ *digest_size = cur_digest_size;
+
+ mz_stream_mem_delete(&file_extra_stream);
+
+ return err;
+}
+
+int32_t mz_zip_reader_entry_get_info(void *handle, mz_zip_file **file_info) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+ if (!file_info || mz_zip_reader_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ *file_info = reader->file_info;
+ if (!*file_info)
+ return MZ_EXIST_ERROR;
+ return err;
+}
+
+int32_t mz_zip_reader_entry_is_dir(void *handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ if (mz_zip_reader_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ return mz_zip_entry_is_dir(reader->zip_handle);
+}
+
+int32_t mz_zip_reader_entry_save_process(void *handle, void *stream, mz_stream_write_cb write_cb) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+ int32_t read = 0;
+ int32_t written = 0;
+
+ if (mz_zip_reader_is_open(reader) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (!reader->file_info || !write_cb)
+ return MZ_PARAM_ERROR;
+
+ /* If the entry isn't open for reading, open it */
+ if (mz_zip_entry_is_open(reader->zip_handle) != MZ_OK)
+ err = mz_zip_reader_entry_open(handle);
+
+ if (err != MZ_OK)
+ return err;
+
+ /* Unzip entry in zip file */
+ read = mz_zip_reader_entry_read(handle, reader->buffer, sizeof(reader->buffer));
+
+ if (read == 0) {
+ /* If we are done close the entry */
+ err = mz_zip_reader_entry_close(handle);
+ if (err != MZ_OK)
+ return err;
+
+ return MZ_END_OF_STREAM;
+ }
+
+ if (read > 0) {
+ /* Write the data to the specified stream */
+ written = write_cb(stream, reader->buffer, read);
+ if (written != read)
+ return MZ_WRITE_ERROR;
+ }
+
+ return read;
+}
+
+int32_t mz_zip_reader_entry_save(void *handle, void *stream, mz_stream_write_cb write_cb) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ uint64_t current_time = 0;
+ uint64_t update_time = 0;
+ int64_t current_pos = 0;
+ int64_t update_pos = 0;
+ int32_t err = MZ_OK;
+ int32_t written = 0;
+
+ if (mz_zip_reader_is_open(reader) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (!reader->file_info)
+ return MZ_PARAM_ERROR;
+
+ /* Update the progress at the beginning */
+ if (reader->progress_cb)
+ reader->progress_cb(handle, reader->progress_userdata, reader->file_info, current_pos);
+
+ /* Write data to stream until done */
+ while (err == MZ_OK) {
+ written = mz_zip_reader_entry_save_process(handle, stream, write_cb);
+ if (written == MZ_END_OF_STREAM)
+ break;
+ if (written > 0)
+ current_pos += written;
+ if (written < 0)
+ err = written;
+
+ /* Update progress if enough time have passed */
+ current_time = mz_os_ms_time();
+ if ((current_time - update_time) > reader->progress_cb_interval_ms) {
+ if (reader->progress_cb)
+ reader->progress_cb(handle, reader->progress_userdata, reader->file_info, current_pos);
+
+ update_pos = current_pos;
+ update_time = current_time;
+ }
+ }
+
+ /* Update the progress at the end */
+ if (reader->progress_cb && update_pos != current_pos)
+ reader->progress_cb(handle, reader->progress_userdata, reader->file_info, current_pos);
+
+ return err;
+}
+
+int32_t mz_zip_reader_entry_save_file(void *handle, const char *path) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ void *stream = NULL;
+ uint32_t target_attrib = 0;
+ int32_t err_attrib = 0;
+ int32_t err = MZ_OK;
+ int32_t err_cb = MZ_OK;
+ char pathwfs[512];
+ char directory[512];
+
+ if (mz_zip_reader_is_open(reader) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (!reader->file_info || !path)
+ return MZ_PARAM_ERROR;
+
+ /* Convert to forward slashes for unix which doesn't like backslashes */
+ strncpy(pathwfs, path, sizeof(pathwfs) - 1);
+ pathwfs[sizeof(pathwfs) - 1] = 0;
+ mz_path_convert_slashes(pathwfs, MZ_PATH_SLASH_UNIX);
+
+ if (reader->entry_cb)
+ reader->entry_cb(handle, reader->entry_userdata, reader->file_info, pathwfs);
+
+ strncpy(directory, pathwfs, sizeof(directory) - 1);
+ directory[sizeof(directory) - 1] = 0;
+ mz_path_remove_filename(directory);
+
+ /* If it is a directory entry then create a directory instead of writing file */
+ if ((mz_zip_entry_is_dir(reader->zip_handle) == MZ_OK) &&
+ (mz_zip_entry_is_symlink(reader->zip_handle) != MZ_OK)) {
+ err = mz_dir_make(directory);
+ return err;
+ }
+
+ /* Check if file exists and ask if we want to overwrite */
+ if (reader->overwrite_cb && mz_os_file_exists(pathwfs) == MZ_OK) {
+ err_cb = reader->overwrite_cb(handle, reader->overwrite_userdata, reader->file_info, pathwfs);
+ if (err_cb != MZ_OK)
+ return err;
+ /* We want to overwrite the file so we delete the existing one */
+ mz_os_unlink(pathwfs);
+ }
+
+ /* If symbolic link then properly construct destination path and link path */
+ if ((mz_zip_entry_is_symlink(reader->zip_handle) == MZ_OK) &&
+ (mz_path_has_slash(pathwfs) == MZ_OK)) {
+ mz_path_remove_slash(pathwfs);
+ mz_path_remove_filename(directory);
+ }
+
+ /* Create the output directory if it doesn't already exist */
+ if (mz_os_is_dir(directory) != MZ_OK) {
+ err = mz_dir_make(directory);
+ if (err != MZ_OK)
+ return err;
+ }
+
+ /* If it is a symbolic link then create symbolic link instead of writing file */
+ if (mz_zip_entry_is_symlink(reader->zip_handle) == MZ_OK) {
+ if (reader->file_info->linkname && *reader->file_info->linkname != 0) {
+ /* Create symbolic link from UNIX1 extrafield */
+ err = mz_os_make_symlink(pathwfs, reader->file_info->linkname);
+ } else if (reader->file_info->uncompressed_size < UINT16_MAX) {
+ /* Create symbolic link from zip entry contents */
+ mz_stream_mem_create(&stream);
+ err = mz_stream_mem_open(stream, NULL, MZ_OPEN_MODE_CREATE);
+
+ if (err == MZ_OK)
+ err = mz_zip_reader_entry_save(handle, stream, mz_stream_write);
+
+ if (err == MZ_OK)
+ err = mz_stream_write_uint8(stream, 0);
+
+ if (err == MZ_OK) {
+ const char *linkname = NULL;
+ if (mz_stream_mem_get_buffer(stream, (const void **)&linkname) == MZ_OK)
+ err = mz_os_make_symlink(pathwfs, linkname);
+ }
+
+ mz_stream_mem_close(stream);
+ mz_stream_mem_delete(&stream);
+ }
+
+ /* Don't check return value because we aren't validating symbolic link target */
+ return err;
+ }
+
+ /* Create the file on disk so we can save to it */
+ mz_stream_os_create(&stream);
+ err = mz_stream_os_open(stream, pathwfs, MZ_OPEN_MODE_CREATE);
+
+ if (err == MZ_OK)
+ err = mz_zip_reader_entry_save(handle, stream, mz_stream_write);
+
+ mz_stream_close(stream);
+ mz_stream_delete(&stream);
+
+ if (err == MZ_OK) {
+ /* Set the time of the file that has been created */
+ mz_os_set_file_date(pathwfs, reader->file_info->modified_date,
+ reader->file_info->accessed_date, reader->file_info->creation_date);
+ }
+
+ if (err == MZ_OK) {
+ /* Set file attributes for the correct system */
+ err_attrib = mz_zip_attrib_convert(MZ_HOST_SYSTEM(reader->file_info->version_madeby),
+ reader->file_info->external_fa, MZ_VERSION_MADEBY_HOST_SYSTEM, &target_attrib);
+
+ if (err_attrib == MZ_OK)
+ mz_os_set_file_attribs(pathwfs, target_attrib);
+ }
+
+ return err;
+}
+
+int32_t mz_zip_reader_entry_save_buffer(void *handle, void *buf, int32_t len) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ void *mem_stream = NULL;
+ int32_t err = MZ_OK;
+
+ if (mz_zip_reader_is_open(reader) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (!reader->file_info || reader->file_info->uncompressed_size > INT32_MAX)
+ return MZ_PARAM_ERROR;
+ if (len != (int32_t)reader->file_info->uncompressed_size)
+ return MZ_BUF_ERROR;
+
+ /* Create a memory stream backed by our buffer and save to it */
+ mz_stream_mem_create(&mem_stream);
+ mz_stream_mem_set_buffer(mem_stream, buf, len);
+
+ err = mz_stream_mem_open(mem_stream, NULL, MZ_OPEN_MODE_READ);
+ if (err == MZ_OK)
+ err = mz_zip_reader_entry_save(handle, mem_stream, mz_stream_mem_write);
+
+ mz_stream_mem_delete(&mem_stream);
+ return err;
+}
+
+int32_t mz_zip_reader_entry_save_buffer_length(void *handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+
+ if (mz_zip_reader_is_open(reader) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (!reader->file_info || reader->file_info->uncompressed_size > INT32_MAX)
+ return MZ_PARAM_ERROR;
+
+ /* Get the maximum size required for the save buffer */
+ return (int32_t)reader->file_info->uncompressed_size;
+}
+
+/***************************************************************************/
+
+int32_t mz_zip_reader_save_all(void *handle, const char *destination_dir) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ int32_t err = MZ_OK;
+ uint8_t *utf8_string = NULL;
+ char path[512];
+ char utf8_name[256];
+ char resolved_name[256];
+
+ err = mz_zip_reader_goto_first_entry(handle);
+
+ if (err == MZ_END_OF_LIST)
+ return err;
+
+ while (err == MZ_OK) {
+ /* Construct output path */
+ path[0] = 0;
+
+ strncpy(utf8_name, reader->file_info->filename, sizeof(utf8_name) - 1);
+ utf8_name[sizeof(utf8_name) - 1] = 0;
+
+ if ((reader->encoding > 0) && (reader->file_info->flag & MZ_ZIP_FLAG_UTF8) == 0) {
+ utf8_string = mz_os_utf8_string_create(reader->file_info->filename, reader->encoding);
+ if (utf8_string) {
+ strncpy(utf8_name, (char *)utf8_string, sizeof(utf8_name) - 1);
+ utf8_name[sizeof(utf8_name) - 1] = 0;
+ mz_os_utf8_string_delete(&utf8_string);
+ }
+ }
+
+ err = mz_path_resolve(utf8_name, resolved_name, sizeof(resolved_name));
+ if (err != MZ_OK)
+ break;
+
+ if (destination_dir)
+ mz_path_combine(path, destination_dir, sizeof(path));
+
+ mz_path_combine(path, resolved_name, sizeof(path));
+
+ /* Save file to disk */
+ err = mz_zip_reader_entry_save_file(handle, path);
+
+ if (err == MZ_OK)
+ err = mz_zip_reader_goto_next_entry(handle);
+ }
+
+ if (err == MZ_END_OF_LIST)
+ return MZ_OK;
+
+ return err;
+}
+
+/***************************************************************************/
+
+void mz_zip_reader_set_pattern(void *handle, const char *pattern, uint8_t ignore_case) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ reader->pattern = pattern;
+ reader->pattern_ignore_case = ignore_case;
+}
+
+void mz_zip_reader_set_password(void *handle, const char *password) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ reader->password = password;
+}
+
+void mz_zip_reader_set_raw(void *handle, uint8_t raw) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ reader->raw = raw;
+}
+
+int32_t mz_zip_reader_get_raw(void *handle, uint8_t *raw) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ if (!raw)
+ return MZ_PARAM_ERROR;
+ *raw = reader->raw;
+ return MZ_OK;
+}
+
+int32_t mz_zip_reader_get_zip_cd(void *handle, uint8_t *zip_cd) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ if (!zip_cd)
+ return MZ_PARAM_ERROR;
+ *zip_cd = reader->cd_zipped;
+ return MZ_OK;
+}
+
+int32_t mz_zip_reader_get_comment(void *handle, const char **comment) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ if (mz_zip_reader_is_open(reader) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (!comment)
+ return MZ_PARAM_ERROR;
+ return mz_zip_get_comment(reader->zip_handle, comment);
+}
+
+int32_t mz_zip_reader_set_recover(void *handle, uint8_t recover) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ if (!reader)
+ return MZ_PARAM_ERROR;
+ reader->recover = recover;
+ return MZ_OK;
+}
+
+void mz_zip_reader_set_encoding(void *handle, int32_t encoding) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ reader->encoding = encoding;
+}
+
+void mz_zip_reader_set_sign_required(void *handle, uint8_t sign_required) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ reader->sign_required = sign_required;
+}
+
+void mz_zip_reader_set_overwrite_cb(void *handle, void *userdata, mz_zip_reader_overwrite_cb cb) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ reader->overwrite_cb = cb;
+ reader->overwrite_userdata = userdata;
+}
+
+void mz_zip_reader_set_password_cb(void *handle, void *userdata, mz_zip_reader_password_cb cb) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ reader->password_cb = cb;
+ reader->password_userdata = userdata;
+}
+
+void mz_zip_reader_set_progress_cb(void *handle, void *userdata, mz_zip_reader_progress_cb cb) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ reader->progress_cb = cb;
+ reader->progress_userdata = userdata;
+}
+
+void mz_zip_reader_set_progress_interval(void *handle, uint32_t milliseconds) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ reader->progress_cb_interval_ms = milliseconds;
+}
+
+void mz_zip_reader_set_entry_cb(void *handle, void *userdata, mz_zip_reader_entry_cb cb) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ reader->entry_cb = cb;
+ reader->entry_userdata = userdata;
+}
+
+int32_t mz_zip_reader_get_zip_handle(void *handle, void **zip_handle) {
+ mz_zip_reader *reader = (mz_zip_reader *)handle;
+ if (!zip_handle)
+ return MZ_PARAM_ERROR;
+ *zip_handle = reader->zip_handle;
+ if (!*zip_handle)
+ return MZ_EXIST_ERROR;
+ return MZ_OK;
+}
+
+/***************************************************************************/
+
+void *mz_zip_reader_create(void **handle) {
+ mz_zip_reader *reader = NULL;
+
+ reader = (mz_zip_reader *)calloc(1, sizeof(mz_zip_reader));
+ if (reader) {
+ reader->recover = 1;
+ reader->progress_cb_interval_ms = MZ_DEFAULT_PROGRESS_INTERVAL;
+ }
+ if (handle)
+ *handle = reader;
+
+ return reader;
+}
+
+void mz_zip_reader_delete(void **handle) {
+ mz_zip_reader *reader = NULL;
+ if (!handle)
+ return;
+ reader = (mz_zip_reader *)*handle;
+ if (reader) {
+ mz_zip_reader_close(reader);
+ free(reader);
+ }
+ *handle = NULL;
+}
+
+/***************************************************************************/
+
+typedef struct mz_zip_writer_s {
+ void *zip_handle;
+ void *file_stream;
+ void *buffered_stream;
+ void *split_stream;
+ void *sha256;
+ void *mem_stream;
+ void *file_extra_stream;
+ mz_zip_file file_info;
+ void *overwrite_userdata;
+ mz_zip_writer_overwrite_cb
+ overwrite_cb;
+ void *password_userdata;
+ mz_zip_writer_password_cb
+ password_cb;
+ void *progress_userdata;
+ mz_zip_writer_progress_cb
+ progress_cb;
+ uint32_t progress_cb_interval_ms;
+ void *entry_userdata;
+ mz_zip_writer_entry_cb
+ entry_cb;
+ const char *password;
+ const char *comment;
+ uint8_t *cert_data;
+ int32_t cert_data_size;
+ const char *cert_pwd;
+ uint16_t compress_method;
+ int16_t compress_level;
+ uint8_t follow_links;
+ uint8_t store_links;
+ uint8_t zip_cd;
+ uint8_t aes;
+ uint8_t raw;
+ uint8_t buffer[UINT16_MAX];
+} mz_zip_writer;
+
+/***************************************************************************/
+
+int32_t mz_zip_writer_zip_cd(void *handle) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ mz_zip_file cd_file;
+ uint64_t number_entry = 0;
+ int64_t cd_mem_length = 0;
+ int32_t err = MZ_OK;
+ int32_t extrafield_size = 0;
+ void *file_extra_stream = NULL;
+ void *cd_mem_stream = NULL;
+
+ memset(&cd_file, 0, sizeof(cd_file));
+
+ mz_zip_get_number_entry(writer->zip_handle, &number_entry);
+ mz_zip_get_cd_mem_stream(writer->zip_handle, &cd_mem_stream);
+ mz_stream_seek(cd_mem_stream, 0, MZ_SEEK_END);
+ cd_mem_length = (uint32_t)mz_stream_tell(cd_mem_stream);
+ mz_stream_seek(cd_mem_stream, 0, MZ_SEEK_SET);
+
+ cd_file.filename = MZ_ZIP_CD_FILENAME;
+ cd_file.modified_date = time(NULL);
+ cd_file.version_madeby = MZ_VERSION_MADEBY;
+ cd_file.compression_method = writer->compress_method;
+ cd_file.uncompressed_size = (int32_t)cd_mem_length;
+ cd_file.flag = MZ_ZIP_FLAG_UTF8;
+
+ if (writer->password)
+ cd_file.flag |= MZ_ZIP_FLAG_ENCRYPTED;
+
+ mz_stream_mem_create(&file_extra_stream);
+ mz_stream_mem_open(file_extra_stream, NULL, MZ_OPEN_MODE_CREATE);
+
+ mz_zip_extrafield_write(file_extra_stream, MZ_ZIP_EXTENSION_CDCD, 8);
+
+ mz_stream_write_uint64(file_extra_stream, number_entry);
+
+ mz_stream_mem_get_buffer(file_extra_stream, (const void **)&cd_file.extrafield);
+ mz_stream_mem_get_buffer_length(file_extra_stream, &extrafield_size);
+ cd_file.extrafield_size = (uint16_t)extrafield_size;
+
+ err = mz_zip_writer_entry_open(handle, &cd_file);
+ if (err == MZ_OK) {
+ mz_stream_copy_stream(handle, mz_zip_writer_entry_write, cd_mem_stream,
+ NULL, (int32_t)cd_mem_length);
+
+ mz_stream_seek(cd_mem_stream, 0, MZ_SEEK_SET);
+ mz_stream_mem_set_buffer_limit(cd_mem_stream, 0);
+
+ err = mz_zip_writer_entry_close(writer);
+ }
+
+ mz_stream_mem_delete(&file_extra_stream);
+
+ return err;
+}
+
+/***************************************************************************/
+
+int32_t mz_zip_writer_is_open(void *handle) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ if (!writer || !writer->zip_handle)
+ return MZ_PARAM_ERROR;
+ return MZ_OK;
+}
+
+static int32_t mz_zip_writer_open_int(void *handle, void *stream, int32_t mode) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ int32_t err = MZ_OK;
+
+ mz_zip_create(&writer->zip_handle);
+ err = mz_zip_open(writer->zip_handle, stream, mode);
+
+ if (err != MZ_OK) {
+ mz_zip_writer_close(handle);
+ return err;
+ }
+
+ return MZ_OK;
+}
+
+int32_t mz_zip_writer_open(void *handle, void *stream, uint8_t append) {
+ int32_t mode = MZ_OPEN_MODE_WRITE;
+
+ if (append) {
+ mode |= MZ_OPEN_MODE_APPEND;
+ } else {
+ mode |= MZ_OPEN_MODE_CREATE;
+ }
+
+ return mz_zip_writer_open_int(handle, stream, mode);
+}
+
+int32_t mz_zip_writer_open_file(void *handle, const char *path, int64_t disk_size, uint8_t append) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ int32_t mode = MZ_OPEN_MODE_READWRITE;
+ int32_t err = MZ_OK;
+ int32_t err_cb = 0;
+ char directory[320];
+
+ mz_zip_writer_close(handle);
+
+ if (mz_os_file_exists(path) != MZ_OK) {
+ /* If the file doesn't exist, we don't append file */
+ mode |= MZ_OPEN_MODE_CREATE;
+
+ /* Create destination directory if it doesn't already exist */
+ if (strchr(path, '/') || strrchr(path, '\\')) {
+ strncpy(directory, path, sizeof(directory) - 1);
+ directory[sizeof(directory) - 1] = 0;
+ mz_path_remove_filename(directory);
+ if (mz_os_file_exists(directory) != MZ_OK)
+ mz_dir_make(directory);
+ }
+ } else if (append) {
+ mode |= MZ_OPEN_MODE_APPEND;
+ } else {
+ if (writer->overwrite_cb)
+ err_cb = writer->overwrite_cb(handle, writer->overwrite_userdata, path);
+
+ if (err_cb == MZ_INTERNAL_ERROR)
+ return err;
+
+ if (err_cb == MZ_OK)
+ mode |= MZ_OPEN_MODE_CREATE;
+ else
+ mode |= MZ_OPEN_MODE_APPEND;
+ }
+
+ mz_stream_os_create(&writer->file_stream);
+ mz_stream_buffered_create(&writer->buffered_stream);
+ mz_stream_split_create(&writer->split_stream);
+
+ mz_stream_set_base(writer->buffered_stream, writer->file_stream);
+ mz_stream_set_base(writer->split_stream, writer->buffered_stream);
+
+ mz_stream_split_set_prop_int64(writer->split_stream, MZ_STREAM_PROP_DISK_SIZE, disk_size);
+
+ err = mz_stream_open(writer->split_stream, path, mode);
+ if (err == MZ_OK)
+ err = mz_zip_writer_open_int(handle, writer->split_stream, mode);
+
+ return err;
+}
+
+int32_t mz_zip_writer_open_file_in_memory(void *handle, const char *path) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ void *file_stream = NULL;
+ int64_t file_size = 0;
+ int32_t err = 0;
+
+ mz_zip_writer_close(handle);
+
+ mz_stream_os_create(&file_stream);
+
+ err = mz_stream_os_open(file_stream, path, MZ_OPEN_MODE_READ);
+
+ if (err != MZ_OK) {
+ mz_stream_os_delete(&file_stream);
+ mz_zip_writer_close(handle);
+ return err;
+ }
+
+ mz_stream_os_seek(file_stream, 0, MZ_SEEK_END);
+ file_size = mz_stream_os_tell(file_stream);
+ mz_stream_os_seek(file_stream, 0, MZ_SEEK_SET);
+
+ if ((file_size <= 0) || (file_size > UINT32_MAX)) {
+ /* Memory size is too large or too small */
+
+ mz_stream_os_close(file_stream);
+ mz_stream_os_delete(&file_stream);
+ mz_zip_writer_close(handle);
+ return MZ_MEM_ERROR;
+ }
+
+ mz_stream_mem_create(&writer->mem_stream);
+ mz_stream_mem_set_grow_size(writer->mem_stream, (int32_t)file_size);
+ mz_stream_mem_open(writer->mem_stream, NULL, MZ_OPEN_MODE_CREATE);
+
+ err = mz_stream_copy(writer->mem_stream, file_stream, (int32_t)file_size);
+
+ mz_stream_os_close(file_stream);
+ mz_stream_os_delete(&file_stream);
+
+ if (err == MZ_OK)
+ err = mz_zip_writer_open(handle, writer->mem_stream, 1);
+ if (err != MZ_OK)
+ mz_zip_writer_close(handle);
+
+ return err;
+}
+
+int32_t mz_zip_writer_close(void *handle) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ int32_t err = MZ_OK;
+
+ if (writer->zip_handle) {
+ mz_zip_set_version_madeby(writer->zip_handle, MZ_VERSION_MADEBY);
+ if (writer->comment)
+ mz_zip_set_comment(writer->zip_handle, writer->comment);
+ if (writer->zip_cd)
+ mz_zip_writer_zip_cd(writer);
+
+ err = mz_zip_close(writer->zip_handle);
+ mz_zip_delete(&writer->zip_handle);
+ }
+
+ if (writer->split_stream) {
+ mz_stream_split_close(writer->split_stream);
+ mz_stream_split_delete(&writer->split_stream);
+ }
+
+ if (writer->buffered_stream)
+ mz_stream_buffered_delete(&writer->buffered_stream);
+
+ if (writer->file_stream)
+ mz_stream_os_delete(&writer->file_stream);
+
+ if (writer->mem_stream) {
+ mz_stream_mem_close(writer->mem_stream);
+ mz_stream_mem_delete(&writer->mem_stream);
+ }
+
+ return err;
+}
+
+/***************************************************************************/
+
+int32_t mz_zip_writer_entry_open(void *handle, mz_zip_file *file_info) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ int32_t err = MZ_OK;
+ const char *password = NULL;
+ char password_buf[120];
+
+ /* Copy file info to access data upon close */
+ memcpy(&writer->file_info, file_info, sizeof(mz_zip_file));
+
+ if (writer->entry_cb)
+ writer->entry_cb(handle, writer->entry_userdata, &writer->file_info);
+
+ password = writer->password;
+
+ /* Check if we need a password and ask for it if we need to */
+ if (!password && writer->password_cb && (writer->file_info.flag & MZ_ZIP_FLAG_ENCRYPTED)) {
+ writer->password_cb(handle, writer->password_userdata, &writer->file_info,
+ password_buf, sizeof(password_buf));
+ password = password_buf;
+ }
+
+#ifndef MZ_ZIP_NO_CRYPTO
+ if (mz_zip_attrib_is_dir(writer->file_info.external_fa, writer->file_info.version_madeby) != MZ_OK) {
+ /* Start calculating sha256 */
+ mz_crypt_sha_create(&writer->sha256);
+ mz_crypt_sha_set_algorithm(writer->sha256, MZ_HASH_SHA256);
+ mz_crypt_sha_begin(writer->sha256);
+ }
+#endif
+
+ /* Open entry in zip */
+ err = mz_zip_entry_write_open(writer->zip_handle, &writer->file_info, writer->compress_level,
+ writer->raw, password);
+
+ return err;
+}
+
+#if !defined(MZ_ZIP_NO_CRYPTO) && defined(MZ_ZIP_SIGNING)
+int32_t mz_zip_writer_entry_sign(void *handle, uint8_t *message, int32_t message_size,
+ uint8_t *cert_data, int32_t cert_data_size, const char *cert_pwd) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ int32_t err = MZ_OK;
+ int32_t signature_size = 0;
+ uint8_t *signature = NULL;
+
+ if (!writer || !cert_data || cert_data_size <= 0)
+ return MZ_PARAM_ERROR;
+ if (mz_zip_entry_is_open(writer->zip_handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+
+ /* Sign message with certificate */
+ err = mz_crypt_sign(message, message_size, cert_data, cert_data_size, cert_pwd,
+ &signature, &signature_size);
+
+ if (err == MZ_OK && signature) {
+ /* Write signature zip extra field */
+ err = mz_zip_extrafield_write(writer->file_extra_stream, MZ_ZIP_EXTENSION_SIGN,
+ (uint16_t)signature_size);
+
+ if (err == MZ_OK) {
+ if (mz_stream_write(writer->file_extra_stream, signature, signature_size) != signature_size)
+ err = MZ_WRITE_ERROR;
+ }
+
+ free(signature);
+ }
+
+ return err;
+}
+#endif
+
+int32_t mz_zip_writer_entry_close(void *handle) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ int32_t err = MZ_OK;
+#ifndef MZ_ZIP_NO_CRYPTO
+ const uint8_t *extrafield = NULL;
+ int32_t extrafield_size = 0;
+ int16_t field_length_hash = 0;
+ uint8_t sha256[MZ_HASH_SHA256_SIZE];
+
+ if (writer->sha256) {
+ mz_crypt_sha_end(writer->sha256, sha256, sizeof(sha256));
+ mz_crypt_sha_delete(&writer->sha256);
+
+ /* Copy extrafield so we can append our own fields before close */
+ mz_stream_mem_create(&writer->file_extra_stream);
+ mz_stream_mem_open(writer->file_extra_stream, NULL, MZ_OPEN_MODE_CREATE);
+
+ /* Write sha256 hash to extrafield */
+ field_length_hash = 4 + MZ_HASH_SHA256_SIZE;
+ err = mz_zip_extrafield_write(writer->file_extra_stream, MZ_ZIP_EXTENSION_HASH, field_length_hash);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(writer->file_extra_stream, MZ_HASH_SHA256);
+ if (err == MZ_OK)
+ err = mz_stream_write_uint16(writer->file_extra_stream, MZ_HASH_SHA256_SIZE);
+ if (err == MZ_OK) {
+ if (mz_stream_write(writer->file_extra_stream, sha256, sizeof(sha256)) != MZ_HASH_SHA256_SIZE)
+ err = MZ_WRITE_ERROR;
+ }
+
+#ifdef MZ_ZIP_SIGNING
+ if ((err == MZ_OK) && (writer->cert_data) && (writer->cert_data_size > 0)) {
+ /* Sign entry if not zipping cd or if it is cd being zipped */
+ if (!writer->zip_cd || strcmp(writer->file_info.filename, MZ_ZIP_CD_FILENAME) == 0) {
+ err = mz_zip_writer_entry_sign(handle, sha256, sizeof(sha256),
+ writer->cert_data, writer->cert_data_size, writer->cert_pwd);
+ }
+ }
+#endif
+
+ if ((writer->file_info.extrafield) && (writer->file_info.extrafield_size > 0))
+ mz_stream_mem_write(writer->file_extra_stream, writer->file_info.extrafield,
+ writer->file_info.extrafield_size);
+
+ /* Update extra field for central directory after adding extra fields */
+ mz_stream_mem_get_buffer(writer->file_extra_stream, (const void **)&extrafield);
+ mz_stream_mem_get_buffer_length(writer->file_extra_stream, &extrafield_size);
+
+ mz_zip_entry_set_extrafield(writer->zip_handle, extrafield, (uint16_t)extrafield_size);
+ }
+#endif
+
+ if (err == MZ_OK) {
+ if (writer->raw)
+ err = mz_zip_entry_close_raw(writer->zip_handle, writer->file_info.uncompressed_size,
+ writer->file_info.crc);
+ else
+ err = mz_zip_entry_close(writer->zip_handle);
+ }
+
+ if (writer->file_extra_stream)
+ mz_stream_mem_delete(&writer->file_extra_stream);
+
+ return err;
+}
+
+int32_t mz_zip_writer_entry_write(void *handle, const void *buf, int32_t len) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ int32_t written = 0;
+ written = mz_zip_entry_write(writer->zip_handle, buf, len);
+#ifndef MZ_ZIP_NO_CRYPTO
+ if (written > 0 && writer->sha256)
+ mz_crypt_sha_update(writer->sha256, buf, written);
+#endif
+ return written;
+}
+/***************************************************************************/
+
+int32_t mz_zip_writer_add_process(void *handle, void *stream, mz_stream_read_cb read_cb) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ int32_t read = 0;
+ int32_t written = 0;
+ int32_t err = MZ_OK;
+
+ if (mz_zip_writer_is_open(writer) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ /* If the entry isn't open for writing, open it */
+ if (mz_zip_entry_is_open(writer->zip_handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (!read_cb)
+ return MZ_PARAM_ERROR;
+
+ read = read_cb(stream, writer->buffer, sizeof(writer->buffer));
+ if (read == 0)
+ return MZ_END_OF_STREAM;
+ if (read < 0) {
+ err = read;
+ return err;
+ }
+
+ written = mz_zip_writer_entry_write(handle, writer->buffer, read);
+ if (written != read)
+ return MZ_WRITE_ERROR;
+
+ return written;
+}
+
+int32_t mz_zip_writer_add(void *handle, void *stream, mz_stream_read_cb read_cb) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ uint64_t current_time = 0;
+ uint64_t update_time = 0;
+ int64_t current_pos = 0;
+ int64_t update_pos = 0;
+ int32_t err = MZ_OK;
+ int32_t written = 0;
+
+ /* Update the progress at the beginning */
+ if (writer->progress_cb)
+ writer->progress_cb(handle, writer->progress_userdata, &writer->file_info, current_pos);
+
+ /* Write data to stream until done */
+ while (err == MZ_OK) {
+ written = mz_zip_writer_add_process(handle, stream, read_cb);
+ if (written == MZ_END_OF_STREAM)
+ break;
+ if (written > 0)
+ current_pos += written;
+ if (written < 0)
+ err = written;
+
+ /* Update progress if enough time have passed */
+ current_time = mz_os_ms_time();
+ if ((current_time - update_time) > writer->progress_cb_interval_ms) {
+ if (writer->progress_cb)
+ writer->progress_cb(handle, writer->progress_userdata, &writer->file_info, current_pos);
+
+ update_pos = current_pos;
+ update_time = current_time;
+ }
+ }
+
+ /* Update the progress at the end */
+ if (writer->progress_cb && update_pos != current_pos)
+ writer->progress_cb(handle, writer->progress_userdata, &writer->file_info, current_pos);
+
+ return err;
+}
+
+int32_t mz_zip_writer_add_info(void *handle, void *stream, mz_stream_read_cb read_cb, mz_zip_file *file_info) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ int32_t err = MZ_OK;
+
+ if (mz_zip_writer_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (!file_info)
+ return MZ_PARAM_ERROR;
+
+ /* Add to zip */
+ err = mz_zip_writer_entry_open(handle, file_info);
+ if (err != MZ_OK)
+ return err;
+
+ if (stream) {
+ if (mz_zip_attrib_is_dir(writer->file_info.external_fa, writer->file_info.version_madeby) != MZ_OK) {
+ err = mz_zip_writer_add(handle, stream, read_cb);
+ if (err != MZ_OK)
+ return err;
+ }
+ }
+
+ err = mz_zip_writer_entry_close(handle);
+
+ return err;
+}
+
+int32_t mz_zip_writer_add_buffer(void *handle, void *buf, int32_t len, mz_zip_file *file_info) {
+ void *mem_stream = NULL;
+ int32_t err = MZ_OK;
+
+ if (mz_zip_writer_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (!buf)
+ return MZ_PARAM_ERROR;
+
+ /* Create a memory stream backed by our buffer and add from it */
+ mz_stream_mem_create(&mem_stream);
+ mz_stream_mem_set_buffer(mem_stream, buf, len);
+
+ err = mz_stream_mem_open(mem_stream, NULL, MZ_OPEN_MODE_READ);
+ if (err == MZ_OK)
+ err = mz_zip_writer_add_info(handle, mem_stream, mz_stream_mem_read, file_info);
+
+ mz_stream_mem_delete(&mem_stream);
+ return err;
+}
+
+int32_t mz_zip_writer_add_file(void *handle, const char *path, const char *filename_in_zip) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ mz_zip_file file_info;
+ uint32_t target_attrib = 0;
+ uint32_t src_attrib = 0;
+ int32_t err = MZ_OK;
+ uint8_t src_sys = 0;
+ void *stream = NULL;
+ char link_path[1024];
+ const char *filename = filename_in_zip;
+
+ if (mz_zip_writer_is_open(handle) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (!path)
+ return MZ_PARAM_ERROR;
+
+ if (!filename) {
+ err = mz_path_get_filename(path, &filename);
+ if (err != MZ_OK)
+ return err;
+ }
+
+ memset(&file_info, 0, sizeof(file_info));
+
+ /* The path name saved, should not include a leading slash. */
+ /* If it did, windows/xp and dynazip couldn't read the zip file. */
+
+ while (filename[0] == '\\' || filename[0] == '/')
+ filename += 1;
+
+ /* Get information about the file on disk so we can store it in zip */
+
+ file_info.version_madeby = MZ_VERSION_MADEBY;
+ file_info.compression_method = writer->compress_method;
+ file_info.filename = filename;
+ file_info.uncompressed_size = mz_os_get_file_size(path);
+ file_info.flag = MZ_ZIP_FLAG_UTF8;
+
+ if (writer->zip_cd)
+ file_info.flag |= MZ_ZIP_FLAG_MASK_LOCAL_INFO;
+ if (writer->aes)
+ file_info.aes_version = MZ_AES_VERSION;
+
+ mz_os_get_file_date(path, &file_info.modified_date, &file_info.accessed_date,
+ &file_info.creation_date);
+ mz_os_get_file_attribs(path, &src_attrib);
+
+ src_sys = MZ_HOST_SYSTEM(file_info.version_madeby);
+
+ if ((src_sys != MZ_HOST_SYSTEM_MSDOS) && (src_sys != MZ_HOST_SYSTEM_WINDOWS_NTFS)) {
+ /* High bytes are OS specific attributes, low byte is always DOS attributes */
+ if (mz_zip_attrib_convert(src_sys, src_attrib, MZ_HOST_SYSTEM_MSDOS, &target_attrib) == MZ_OK)
+ file_info.external_fa = target_attrib;
+ file_info.external_fa |= (src_attrib << 16);
+ } else {
+ file_info.external_fa = src_attrib;
+ }
+
+ if (writer->store_links && mz_os_is_symlink(path) == MZ_OK) {
+ err = mz_os_read_symlink(path, link_path, sizeof(link_path));
+ if (err == MZ_OK)
+ file_info.linkname = link_path;
+ } else if (mz_os_is_dir(path) != MZ_OK) {
+ mz_stream_os_create(&stream);
+ err = mz_stream_os_open(stream, path, MZ_OPEN_MODE_READ);
+ }
+
+ if (err == MZ_OK)
+ err = mz_zip_writer_add_info(handle, stream, mz_stream_read, &file_info);
+
+ if (stream) {
+ mz_stream_close(stream);
+ mz_stream_delete(&stream);
+ }
+
+ return err;
+}
+
+int32_t mz_zip_writer_add_path(void *handle, const char *path, const char *root_path,
+ uint8_t include_path, uint8_t recursive) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ DIR *dir = NULL;
+ struct dirent *entry = NULL;
+ int32_t err = MZ_OK;
+ int16_t is_dir = 0;
+ const char *filename = NULL;
+ const char *filenameinzip = path;
+ char *wildcard_ptr = NULL;
+ char full_path[1024];
+ char path_dir[1024];
+
+ if (strrchr(path, '*')) {
+ strncpy(path_dir, path, sizeof(path_dir) - 1);
+ path_dir[sizeof(path_dir) - 1] = 0;
+ mz_path_remove_filename(path_dir);
+ wildcard_ptr = path_dir + strlen(path_dir) + 1;
+ root_path = path = path_dir;
+ } else {
+ if (mz_os_is_dir(path) == MZ_OK)
+ is_dir = 1;
+
+ /* Construct the filename that our file will be stored in the zip as */
+ if (!root_path)
+ root_path = path;
+
+ /* Should the file be stored with any path info at all? */
+ if (!include_path) {
+ if (!is_dir && root_path == path) {
+ if (mz_path_get_filename(filenameinzip, &filename) == MZ_OK)
+ filenameinzip = filename;
+ } else {
+ filenameinzip += strlen(root_path);
+ }
+ }
+
+ if (!writer->store_links && !writer->follow_links) {
+ if (mz_os_is_symlink(path) == MZ_OK)
+ return err;
+ }
+
+ if (*filenameinzip != 0)
+ err = mz_zip_writer_add_file(handle, path, filenameinzip);
+
+ if (!is_dir)
+ return err;
+
+ if (writer->store_links) {
+ if (mz_os_is_symlink(path) == MZ_OK)
+ return err;
+ }
+ }
+
+ dir = mz_os_open_dir(path);
+
+ if (!dir)
+ return MZ_EXIST_ERROR;
+
+ while ((entry = mz_os_read_dir(dir))) {
+ if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
+ continue;
+
+ full_path[0] = 0;
+ mz_path_combine(full_path, path, sizeof(full_path));
+ mz_path_combine(full_path, entry->d_name, sizeof(full_path));
+
+ if (!recursive && mz_os_is_dir(full_path) == MZ_OK)
+ continue;
+
+ if ((wildcard_ptr) && (mz_path_compare_wc(entry->d_name, wildcard_ptr, 1) != MZ_OK))
+ continue;
+
+ err = mz_zip_writer_add_path(handle, full_path, root_path, include_path, recursive);
+ if (err != MZ_OK)
+ break;
+ }
+
+ mz_os_close_dir(dir);
+ return err;
+}
+
+int32_t mz_zip_writer_copy_from_reader(void *handle, void *reader) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ mz_zip_file *file_info = NULL;
+ int64_t compressed_size = 0;
+ int64_t uncompressed_size = 0;
+ uint32_t crc32 = 0;
+ int32_t err = MZ_OK;
+ uint8_t original_raw = 0;
+ void *reader_zip_handle = NULL;
+ void *writer_zip_handle = NULL;
+
+ if (mz_zip_reader_is_open(reader) != MZ_OK)
+ return MZ_PARAM_ERROR;
+ if (mz_zip_writer_is_open(writer) != MZ_OK)
+ return MZ_PARAM_ERROR;
+
+ err = mz_zip_reader_entry_get_info(reader, &file_info);
+
+ if (err != MZ_OK)
+ return err;
+
+ mz_zip_reader_get_zip_handle(reader, &reader_zip_handle);
+ mz_zip_writer_get_zip_handle(writer, &writer_zip_handle);
+
+ /* Open entry for raw reading */
+ err = mz_zip_entry_read_open(reader_zip_handle, 1, NULL);
+
+ if (err == MZ_OK) {
+ /* Write entry raw, save original raw value */
+ original_raw = writer->raw;
+ writer->raw = 1;
+
+ err = mz_zip_writer_entry_open(writer, file_info);
+
+ if ((err == MZ_OK) &&
+ (mz_zip_attrib_is_dir(writer->file_info.external_fa, writer->file_info.version_madeby) != MZ_OK)) {
+ err = mz_zip_writer_add(writer, reader_zip_handle, mz_zip_entry_read);
+ }
+
+ if (err == MZ_OK) {
+ err = mz_zip_entry_read_close(reader_zip_handle, &crc32, &compressed_size, &uncompressed_size);
+ if (err == MZ_OK)
+ err = mz_zip_entry_write_close(writer_zip_handle, crc32, compressed_size, uncompressed_size);
+ }
+
+ if (mz_zip_entry_is_open(reader_zip_handle) == MZ_OK)
+ mz_zip_entry_close(reader_zip_handle);
+
+ if (mz_zip_entry_is_open(writer_zip_handle) == MZ_OK)
+ mz_zip_entry_close(writer_zip_handle);
+
+ writer->raw = original_raw;
+ }
+
+ return err;
+}
+
+/***************************************************************************/
+
+void mz_zip_writer_set_password(void *handle, const char *password) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->password = password;
+}
+
+void mz_zip_writer_set_comment(void *handle, const char *comment) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->comment = comment;
+}
+
+void mz_zip_writer_set_raw(void *handle, uint8_t raw) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->raw = raw;
+}
+
+int32_t mz_zip_writer_get_raw(void *handle, uint8_t *raw) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ if (!raw)
+ return MZ_PARAM_ERROR;
+ *raw = writer->raw;
+ return MZ_OK;
+}
+
+void mz_zip_writer_set_aes(void *handle, uint8_t aes) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->aes = aes;
+}
+
+void mz_zip_writer_set_compress_method(void *handle, uint16_t compress_method) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->compress_method = compress_method;
+}
+
+void mz_zip_writer_set_compress_level(void *handle, int16_t compress_level) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->compress_level = compress_level;
+}
+
+void mz_zip_writer_set_follow_links(void *handle, uint8_t follow_links) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->follow_links = follow_links;
+}
+
+void mz_zip_writer_set_store_links(void *handle, uint8_t store_links) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->store_links = store_links;
+}
+
+void mz_zip_writer_set_zip_cd(void *handle, uint8_t zip_cd) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->zip_cd = zip_cd;
+}
+
+int32_t mz_zip_writer_set_certificate(void *handle, const char *cert_path, const char *cert_pwd) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ void *cert_stream = NULL;
+ uint8_t *cert_data = NULL;
+ int32_t cert_data_size = 0;
+ int32_t err = MZ_OK;
+
+ if (!cert_path)
+ return MZ_PARAM_ERROR;
+
+ cert_data_size = (int32_t)mz_os_get_file_size(cert_path);
+
+ if (cert_data_size == 0)
+ return MZ_PARAM_ERROR;
+
+ if (writer->cert_data) {
+ free(writer->cert_data);
+ writer->cert_data = NULL;
+ }
+
+ cert_data = (uint8_t *)malloc(cert_data_size);
+
+ /* Read pkcs12 certificate from disk */
+ mz_stream_os_create(&cert_stream);
+ err = mz_stream_os_open(cert_stream, cert_path, MZ_OPEN_MODE_READ);
+ if (err == MZ_OK) {
+ if (mz_stream_os_read(cert_stream, cert_data, cert_data_size) != cert_data_size)
+ err = MZ_READ_ERROR;
+ mz_stream_os_close(cert_stream);
+ }
+ mz_stream_os_delete(&cert_stream);
+
+ if (err == MZ_OK) {
+ writer->cert_data = cert_data;
+ writer->cert_data_size = cert_data_size;
+ writer->cert_pwd = cert_pwd;
+ } else {
+ free(cert_data);
+ }
+
+ return err;
+}
+
+void mz_zip_writer_set_overwrite_cb(void *handle, void *userdata, mz_zip_writer_overwrite_cb cb) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->overwrite_cb = cb;
+ writer->overwrite_userdata = userdata;
+}
+
+void mz_zip_writer_set_password_cb(void *handle, void *userdata, mz_zip_writer_password_cb cb) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->password_cb = cb;
+ writer->password_userdata = userdata;
+}
+
+void mz_zip_writer_set_progress_cb(void *handle, void *userdata, mz_zip_writer_progress_cb cb) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->progress_cb = cb;
+ writer->progress_userdata = userdata;
+}
+
+void mz_zip_writer_set_progress_interval(void *handle, uint32_t milliseconds) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->progress_cb_interval_ms = milliseconds;
+}
+
+void mz_zip_writer_set_entry_cb(void *handle, void *userdata, mz_zip_writer_entry_cb cb) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ writer->entry_cb = cb;
+ writer->entry_userdata = userdata;
+}
+
+int32_t mz_zip_writer_get_zip_handle(void *handle, void **zip_handle) {
+ mz_zip_writer *writer = (mz_zip_writer *)handle;
+ if (!zip_handle)
+ return MZ_PARAM_ERROR;
+ *zip_handle = writer->zip_handle;
+ if (!*zip_handle)
+ return MZ_EXIST_ERROR;
+ return MZ_OK;
+}
+
+/***************************************************************************/
+
+void *mz_zip_writer_create(void **handle) {
+ mz_zip_writer *writer = NULL;
+
+ writer = (mz_zip_writer *)calloc(1, sizeof(mz_zip_writer));
+ if (writer) {
+#if defined(HAVE_WZAES)
+ writer->aes = 1;
+#endif
+#if defined(HAVE_ZLIB) || defined(HAVE_LIBCOMP)
+ writer->compress_method = MZ_COMPRESS_METHOD_DEFLATE;
+#elif defined(HAVE_BZIP2)
+ writer->compress_method = MZ_COMPRESS_METHOD_BZIP2;
+#elif defined(HAVE_LZMA)
+ writer->compress_method = MZ_COMPRESS_METHOD_LZMA;
+#else
+ writer->compress_method = MZ_COMPRESS_METHOD_STORE;
+#endif
+ writer->compress_level = MZ_COMPRESS_LEVEL_BEST;
+ writer->progress_cb_interval_ms = MZ_DEFAULT_PROGRESS_INTERVAL;
+ }
+ if (handle)
+ *handle = writer;
+
+ return writer;
+}
+
+void mz_zip_writer_delete(void **handle) {
+ mz_zip_writer *writer = NULL;
+ if (!handle)
+ return;
+ writer = (mz_zip_writer *)*handle;
+ if (writer) {
+ mz_zip_writer_close(writer);
+
+ if (writer->cert_data)
+ free(writer->cert_data);
+
+ writer->cert_data = NULL;
+ writer->cert_data_size = 0;
+
+ free(writer);
+ }
+ *handle = NULL;
+}
+
+/***************************************************************************/
diff --git a/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.h b/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.h
new file mode 100644
index 000000000..195b50780
--- /dev/null
+++ b/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.h
@@ -0,0 +1,285 @@
+/* mz_zip_rw.h -- Zip reader/writer
+ part of the minizip-ng project
+
+ Copyright (C) Nathan Moinvaziri
+ https://github.com/zlib-ng/minizip-ng
+
+ This program is distributed under the terms of the same license as zlib.
+ See the accompanying LICENSE file for the full text of the license.
+*/
+
+#ifndef MZ_ZIP_RW_H
+#define MZ_ZIP_RW_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************/
+
+typedef int32_t (*mz_zip_reader_overwrite_cb)(void *handle, void *userdata, mz_zip_file *file_info, const char *path);
+typedef int32_t (*mz_zip_reader_password_cb)(void *handle, void *userdata, mz_zip_file *file_info, char *password, int32_t max_password);
+typedef int32_t (*mz_zip_reader_progress_cb)(void *handle, void *userdata, mz_zip_file *file_info, int64_t position);
+typedef int32_t (*mz_zip_reader_entry_cb)(void *handle, void *userdata, mz_zip_file *file_info, const char *path);
+
+/***************************************************************************/
+
+int32_t mz_zip_reader_is_open(void *handle);
+/* Checks to see if the zip file is open */
+
+int32_t mz_zip_reader_open(void *handle, void *stream);
+/* Opens zip file from stream */
+
+int32_t mz_zip_reader_open_file(void *handle, const char *path);
+/* Opens zip file from a file path */
+
+int32_t mz_zip_reader_open_file_in_memory(void *handle, const char *path);
+/* Opens zip file from a file path into memory for faster access */
+
+int32_t mz_zip_reader_open_buffer(void *handle, uint8_t *buf, int32_t len, uint8_t copy);
+/* Opens zip file from memory buffer */
+
+int32_t mz_zip_reader_close(void *handle);
+/* Closes the zip file */
+
+/***************************************************************************/
+
+int32_t mz_zip_reader_unzip_cd(void *handle);
+/* Unzip the central directory */
+
+/***************************************************************************/
+
+int32_t mz_zip_reader_goto_first_entry(void *handle);
+/* Goto the first entry in the zip file that matches the pattern */
+
+int32_t mz_zip_reader_goto_next_entry(void *handle);
+/* Goto the next entry in the zip file that matches the pattern */
+
+int32_t mz_zip_reader_locate_entry(void *handle, const char *filename, uint8_t ignore_case);
+/* Locates an entry by filename */
+
+int32_t mz_zip_reader_entry_open(void *handle);
+/* Opens an entry for reading */
+
+int32_t mz_zip_reader_entry_close(void *handle);
+/* Closes an entry */
+
+int32_t mz_zip_reader_entry_read(void *handle, void *buf, int32_t len);
+/* Reads and entry after being opened */
+
+int32_t mz_zip_reader_entry_has_sign(void *handle);
+/* Checks to see if the entry has a signature */
+
+int32_t mz_zip_reader_entry_sign_verify(void *handle);
+/* Verifies a signature stored with the entry */
+
+int32_t mz_zip_reader_entry_get_hash(void *handle, uint16_t algorithm, uint8_t *digest, int32_t digest_size);
+/* Gets a hash algorithm from the entry's extra field */
+
+int32_t mz_zip_reader_entry_get_first_hash(void *handle, uint16_t *algorithm, uint16_t *digest_size);
+/* Gets the most secure hash algorithm from the entry's extra field */
+
+int32_t mz_zip_reader_entry_get_info(void *handle, mz_zip_file **file_info);
+/* Gets the current entry file info */
+
+int32_t mz_zip_reader_entry_is_dir(void *handle);
+/* Gets the current entry is a directory */
+
+int32_t mz_zip_reader_entry_save(void *handle, void *stream, mz_stream_write_cb write_cb);
+/* Save the current entry to a stream */
+
+int32_t mz_zip_reader_entry_save_process(void *handle, void *stream, mz_stream_write_cb write_cb);
+/* Saves a portion of the current entry to a stream callback */
+
+int32_t mz_zip_reader_entry_save_file(void *handle, const char *path);
+/* Save the current entry to a file */
+
+int32_t mz_zip_reader_entry_save_buffer(void *handle, void *buf, int32_t len);
+/* Save the current entry to a memory buffer */
+
+int32_t mz_zip_reader_entry_save_buffer_length(void *handle);
+/* Gets the length of the buffer required to save */
+
+/***************************************************************************/
+
+int32_t mz_zip_reader_save_all(void *handle, const char *destination_dir);
+/* Save all files into a directory */
+
+/***************************************************************************/
+
+void mz_zip_reader_set_pattern(void *handle, const char *pattern, uint8_t ignore_case);
+/* Sets the match pattern for entries in the zip file, if null all entries are matched */
+
+void mz_zip_reader_set_password(void *handle, const char *password);
+/* Sets the password required for extraction */
+
+void mz_zip_reader_set_raw(void *handle, uint8_t raw);
+/* Sets whether or not it should save the entry raw */
+
+int32_t mz_zip_reader_get_raw(void *handle, uint8_t *raw);
+/* Gets whether or not it should save the entry raw */
+
+int32_t mz_zip_reader_get_zip_cd(void *handle, uint8_t *zip_cd);
+/* Gets whether or not the archive has a zipped central directory */
+
+int32_t mz_zip_reader_get_comment(void *handle, const char **comment);
+/* Gets the comment for the central directory */
+
+int32_t mz_zip_reader_set_recover(void *handle, uint8_t recover);
+/* Sets the ability to recover the central dir by reading local file headers */
+
+void mz_zip_reader_set_encoding(void *handle, int32_t encoding);
+/* Sets whether or not it should support a special character encoding in zip file names. */
+
+void mz_zip_reader_set_sign_required(void *handle, uint8_t sign_required);
+/* Sets whether or not it a signature is required */
+
+void mz_zip_reader_set_overwrite_cb(void *handle, void *userdata, mz_zip_reader_overwrite_cb cb);
+/* Callback for what to do when a file is being overwritten */
+
+void mz_zip_reader_set_password_cb(void *handle, void *userdata, mz_zip_reader_password_cb cb);
+/* Callback for when a password is required and hasn't been set */
+
+void mz_zip_reader_set_progress_cb(void *handle, void *userdata, mz_zip_reader_progress_cb cb);
+/* Callback for extraction progress */
+
+void mz_zip_reader_set_progress_interval(void *handle, uint32_t milliseconds);
+/* Let at least milliseconds pass between calls to progress callback */
+
+void mz_zip_reader_set_entry_cb(void *handle, void *userdata, mz_zip_reader_entry_cb cb);
+/* Callback for zip file entries */
+
+int32_t mz_zip_reader_get_zip_handle(void *handle, void **zip_handle);
+/* Gets the underlying zip instance handle */
+
+void* mz_zip_reader_create(void **handle);
+/* Create new instance of zip reader */
+
+void mz_zip_reader_delete(void **handle);
+/* Delete instance of zip reader */
+
+/***************************************************************************/
+
+typedef int32_t (*mz_zip_writer_overwrite_cb)(void *handle, void *userdata, const char *path);
+typedef int32_t (*mz_zip_writer_password_cb)(void *handle, void *userdata, mz_zip_file *file_info, char *password, int32_t max_password);
+typedef int32_t (*mz_zip_writer_progress_cb)(void *handle, void *userdata, mz_zip_file *file_info, int64_t position);
+typedef int32_t (*mz_zip_writer_entry_cb)(void *handle, void *userdata, mz_zip_file *file_info);
+
+/***************************************************************************/
+
+int32_t mz_zip_writer_is_open(void *handle);
+/* Checks to see if the zip file is open */
+
+int32_t mz_zip_writer_open(void *handle, void *stream, uint8_t append);
+/* Opens zip file from stream */
+
+int32_t mz_zip_writer_open_file(void *handle, const char *path, int64_t disk_size, uint8_t append);
+/* Opens zip file from a file path */
+
+int32_t mz_zip_writer_open_file_in_memory(void *handle, const char *path);
+/* Opens zip file from a file path into memory for faster access */
+
+int32_t mz_zip_writer_close(void *handle);
+/* Closes the zip file */
+
+/***************************************************************************/
+
+int32_t mz_zip_writer_entry_open(void *handle, mz_zip_file *file_info);
+/* Opens an entry in the zip file for writing */
+
+int32_t mz_zip_writer_entry_close(void *handle);
+/* Closes entry in zip file */
+
+int32_t mz_zip_writer_entry_write(void *handle, const void *buf, int32_t len);
+/* Writes data into entry for zip */
+
+/***************************************************************************/
+
+int32_t mz_zip_writer_add(void *handle, void *stream, mz_stream_read_cb read_cb);
+/* Writes all data to the currently open entry in the zip */
+
+int32_t mz_zip_writer_add_process(void *handle, void *stream, mz_stream_read_cb read_cb);
+/* Writes a portion of data to the currently open entry in the zip */
+
+int32_t mz_zip_writer_add_info(void *handle, void *stream, mz_stream_read_cb read_cb, mz_zip_file *file_info);
+/* Adds an entry to the zip based on the info */
+
+int32_t mz_zip_writer_add_buffer(void *handle, void *buf, int32_t len, mz_zip_file *file_info);
+/* Adds an entry to the zip with a memory buffer */
+
+int32_t mz_zip_writer_add_file(void *handle, const char *path, const char *filename_in_zip);
+/* Adds an entry to the zip from a file */
+
+int32_t mz_zip_writer_add_path(void *handle, const char *path, const char *root_path, uint8_t include_path,
+ uint8_t recursive);
+/* Enumerates a directory or pattern and adds entries to the zip */
+
+int32_t mz_zip_writer_copy_from_reader(void *handle, void *reader);
+/* Adds an entry from a zip reader instance */
+
+/***************************************************************************/
+
+void mz_zip_writer_set_password(void *handle, const char *password);
+/* Password to use for encrypting files in the zip */
+
+void mz_zip_writer_set_comment(void *handle, const char *comment);
+/* Comment to use for the archive */
+
+void mz_zip_writer_set_raw(void *handle, uint8_t raw);
+/* Sets whether or not we should write the entry raw */
+
+int32_t mz_zip_writer_get_raw(void *handle, uint8_t *raw);
+/* Gets whether or not we should write the entry raw */
+
+void mz_zip_writer_set_aes(void *handle, uint8_t aes);
+/* Use aes encryption when adding files in zip */
+
+void mz_zip_writer_set_compress_method(void *handle, uint16_t compress_method);
+/* Sets the compression method when adding files in zip */
+
+void mz_zip_writer_set_compress_level(void *handle, int16_t compress_level);
+/* Sets the compression level when adding files in zip */
+
+void mz_zip_writer_set_follow_links(void *handle, uint8_t follow_links);
+/* Follow symbolic links when traversing directories and files to add */
+
+void mz_zip_writer_set_store_links(void *handle, uint8_t store_links);
+/* Store symbolic links in zip file */
+
+void mz_zip_writer_set_zip_cd(void *handle, uint8_t zip_cd);
+/* Sets whether or not central directory should be zipped */
+
+int32_t mz_zip_writer_set_certificate(void *handle, const char *cert_path, const char *cert_pwd);
+/* Sets the certificate and timestamp url to use for signing when adding files in zip */
+
+void mz_zip_writer_set_overwrite_cb(void *handle, void *userdata, mz_zip_writer_overwrite_cb cb);
+/* Callback for what to do when zip file already exists */
+
+void mz_zip_writer_set_password_cb(void *handle, void *userdata, mz_zip_writer_password_cb cb);
+/* Callback for ask if a password is required for adding */
+
+void mz_zip_writer_set_progress_cb(void *handle, void *userdata, mz_zip_writer_progress_cb cb);
+/* Callback for compression progress */
+
+void mz_zip_writer_set_progress_interval(void *handle, uint32_t milliseconds);
+/* Let at least milliseconds pass between calls to progress callback */
+
+void mz_zip_writer_set_entry_cb(void *handle, void *userdata, mz_zip_writer_entry_cb cb);
+/* Callback for zip file entries */
+
+int32_t mz_zip_writer_get_zip_handle(void *handle, void **zip_handle);
+/* Gets the underlying zip handle */
+
+void* mz_zip_writer_create(void **handle);
+/* Create new instance of zip writer */
+
+void mz_zip_writer_delete(void **handle);
+/* Delete instance of zip writer */
+
+/***************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/mztools.c b/ios/CodePush/SSZipArchive/minizip/mztools.c
deleted file mode 100644
index 80d50e008..000000000
--- a/ios/CodePush/SSZipArchive/minizip/mztools.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- Additional tools for Minizip
- Code: Xavier Roche '2004
- License: Same as ZLIB (www.gzip.org)
-*/
-
-/* Code */
-#include
-#include
-#include
-#include "zlib.h"
-#include "unzip.h"
-#include "mztools.h"
-
-#define READ_8(adr) ((unsigned char)*(adr))
-#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) )
-#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) )
-
-#define WRITE_8(buff, n) do { \
- *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \
-} while(0)
-#define WRITE_16(buff, n) do { \
- WRITE_8((unsigned char*)(buff), n); \
- WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \
-} while(0)
-#define WRITE_32(buff, n) do { \
- WRITE_16((unsigned char*)(buff), (n) & 0xffff); \
- WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \
-} while(0)
-
-extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered)
-const char* file;
-const char* fileOut;
-const char* fileOutTmp;
-uLong* nRecovered;
-uLong* bytesRecovered;
-{
- int err = Z_OK;
- FILE* fpZip = fopen(file, "rb");
- FILE* fpOut = fopen(fileOut, "wb");
- FILE* fpOutCD = fopen(fileOutTmp, "wb");
- if (fpZip != NULL && fpOut != NULL) {
- int entries = 0;
- uLong totalBytes = 0;
- char header[30];
- char filename[256];
- char extra[1024];
- int offset = 0;
- int offsetCD = 0;
- while ( fread(header, 1, 30, fpZip) == 30 ) {
- int currentOffset = offset;
-
- /* File entry */
- if (READ_32(header) == 0x04034b50) {
- unsigned int version = READ_16(header + 4);
- unsigned int gpflag = READ_16(header + 6);
- unsigned int method = READ_16(header + 8);
- unsigned int filetime = READ_16(header + 10);
- unsigned int filedate = READ_16(header + 12);
- unsigned int crc = READ_32(header + 14); /* crc */
- unsigned int cpsize = READ_32(header + 18); /* compressed size */
- unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */
- unsigned int fnsize = READ_16(header + 26); /* file name length */
- unsigned int extsize = READ_16(header + 28); /* extra field length */
- filename[0] = extra[0] = '\0';
-
- /* Header */
- if (fwrite(header, 1, 30, fpOut) == 30) {
- offset += 30;
- } else {
- err = Z_ERRNO;
- break;
- }
-
- /* Filename */
- if (fnsize > 0) {
- if (fread(filename, 1, fnsize, fpZip) == fnsize) {
- if (fwrite(filename, 1, fnsize, fpOut) == fnsize) {
- offset += fnsize;
- } else {
- err = Z_ERRNO;
- break;
- }
- } else {
- err = Z_ERRNO;
- break;
- }
- } else {
- err = Z_STREAM_ERROR;
- break;
- }
-
- /* Extra field */
- if (extsize > 0) {
- if (fread(extra, 1, extsize, fpZip) == extsize) {
- if (fwrite(extra, 1, extsize, fpOut) == extsize) {
- offset += extsize;
- } else {
- err = Z_ERRNO;
- break;
- }
- } else {
- err = Z_ERRNO;
- break;
- }
- }
-
- /* Data */
- {
- int dataSize = cpsize;
- if (dataSize == 0) {
- dataSize = uncpsize;
- }
- if (dataSize > 0) {
- char* data = malloc(dataSize);
- if (data != NULL) {
- if ((int)fread(data, 1, dataSize, fpZip) == dataSize) {
- if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) {
- offset += dataSize;
- totalBytes += dataSize;
- } else {
- err = Z_ERRNO;
- }
- } else {
- err = Z_ERRNO;
- }
- free(data);
- if (err != Z_OK) {
- break;
- }
- } else {
- err = Z_MEM_ERROR;
- break;
- }
- }
- }
-
- /* Central directory entry */
- {
- char centralDirectoryEntryHeader[46];
- //char* comment = "";
- //int comsize = (int) strlen(comment);
- WRITE_32(centralDirectoryEntryHeader, 0x02014b50);
- WRITE_16(centralDirectoryEntryHeader + 4, version);
- WRITE_16(centralDirectoryEntryHeader + 6, version);
- WRITE_16(centralDirectoryEntryHeader + 8, gpflag);
- WRITE_16(centralDirectoryEntryHeader + 10, method);
- WRITE_16(centralDirectoryEntryHeader + 12, filetime);
- WRITE_16(centralDirectoryEntryHeader + 14, filedate);
- WRITE_32(centralDirectoryEntryHeader + 16, crc);
- WRITE_32(centralDirectoryEntryHeader + 20, cpsize);
- WRITE_32(centralDirectoryEntryHeader + 24, uncpsize);
- WRITE_16(centralDirectoryEntryHeader + 28, fnsize);
- WRITE_16(centralDirectoryEntryHeader + 30, extsize);
- WRITE_16(centralDirectoryEntryHeader + 32, 0 /*comsize*/);
- WRITE_16(centralDirectoryEntryHeader + 34, 0); /* disk # */
- WRITE_16(centralDirectoryEntryHeader + 36, 0); /* int attrb */
- WRITE_32(centralDirectoryEntryHeader + 38, 0); /* ext attrb */
- WRITE_32(centralDirectoryEntryHeader + 42, currentOffset);
- /* Header */
- if (fwrite(centralDirectoryEntryHeader, 1, 46, fpOutCD) == 46) {
- offsetCD += 46;
-
- /* Filename */
- if (fnsize > 0) {
- if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) {
- offsetCD += fnsize;
- } else {
- err = Z_ERRNO;
- break;
- }
- } else {
- err = Z_STREAM_ERROR;
- break;
- }
-
- /* Extra field */
- if (extsize > 0) {
- if (fwrite(extra, 1, extsize, fpOutCD) == extsize) {
- offsetCD += extsize;
- } else {
- err = Z_ERRNO;
- break;
- }
- }
-
- /* Comment field */
- /*
- if (comsize > 0) {
- if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) {
- offsetCD += comsize;
- } else {
- err = Z_ERRNO;
- break;
- }
- }
- */
-
- } else {
- err = Z_ERRNO;
- break;
- }
- }
-
- /* Success */
- entries++;
-
- } else {
- break;
- }
- }
-
- /* Final central directory */
- {
- int entriesZip = entries;
- char finalCentralDirectoryHeader[22];
- //char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools";
- //int comsize = (int) strlen(comment);
- if (entriesZip > 0xffff) {
- entriesZip = 0xffff;
- }
- WRITE_32(finalCentralDirectoryHeader, 0x06054b50);
- WRITE_16(finalCentralDirectoryHeader + 4, 0); /* disk # */
- WRITE_16(finalCentralDirectoryHeader + 6, 0); /* disk # */
- WRITE_16(finalCentralDirectoryHeader + 8, entriesZip); /* hack */
- WRITE_16(finalCentralDirectoryHeader + 10, entriesZip); /* hack */
- WRITE_32(finalCentralDirectoryHeader + 12, offsetCD); /* size of CD */
- WRITE_32(finalCentralDirectoryHeader + 16, offset); /* offset to CD */
- WRITE_16(finalCentralDirectoryHeader + 20, 0 /*comsize*/); /* comment */
-
- /* Header */
- if (fwrite(finalCentralDirectoryHeader, 1, 22, fpOutCD) == 22) {
-
- /* Comment field */
- /*
- if (comsize > 0) {
- if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) {
- err = Z_ERRNO;
- }
- }
- */
- } else {
- err = Z_ERRNO;
- }
- }
-
- /* Final merge (file + central directory) */
- fclose(fpOutCD);
- if (err == Z_OK) {
- fpOutCD = fopen(fileOutTmp, "rb");
- if (fpOutCD != NULL) {
- int nRead;
- char buffer[8192];
- while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) {
- if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) {
- err = Z_ERRNO;
- break;
- }
- }
- fclose(fpOutCD);
- }
- }
-
- /* Close */
- fclose(fpZip);
- fclose(fpOut);
-
- /* Wipe temporary file */
- (void)remove(fileOutTmp);
-
- /* Number of recovered entries */
- if (err == Z_OK) {
- if (nRecovered != NULL) {
- *nRecovered = entries;
- }
- if (bytesRecovered != NULL) {
- *bytesRecovered = totalBytes;
- }
- }
- } else {
- err = Z_STREAM_ERROR;
- }
- return err;
-}
diff --git a/ios/CodePush/SSZipArchive/minizip/mztools.h b/ios/CodePush/SSZipArchive/minizip/mztools.h
deleted file mode 100644
index 88b34592b..000000000
--- a/ios/CodePush/SSZipArchive/minizip/mztools.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- Additional tools for Minizip
- Code: Xavier Roche '2004
- License: Same as ZLIB (www.gzip.org)
-*/
-
-#ifndef _zip_tools_H
-#define _zip_tools_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef _ZLIB_H
-#include "zlib.h"
-#endif
-
-#include "unzip.h"
-
-/* Repair a ZIP file (missing central directory)
- file: file to recover
- fileOut: output file after recovery
- fileOutTmp: temporary file name used for recovery
-*/
-extern int ZEXPORT unzRepair(const char* file,
- const char* fileOut,
- const char* fileOutTmp,
- uLong* nRecovered,
- uLong* bytesRecovered);
-
-#endif
diff --git a/ios/CodePush/SSZipArchive/minizip/unzip.c b/ios/CodePush/SSZipArchive/minizip/unzip.c
deleted file mode 100644
index 09d13d178..000000000
--- a/ios/CodePush/SSZipArchive/minizip/unzip.c
+++ /dev/null
@@ -1,1839 +0,0 @@
-/* unzip.c -- IO for uncompress .zip files using zlib
- Version 1.1, February 14h, 2010
- part of the MiniZip project
-
- Copyright (C) 1998-2010 Gilles Vollant
- http://www.winimage.com/zLibDll/minizip.html
- Modifications of Unzip for Zip64
- Copyright (C) 2007-2008 Even Rouault
- Modifications for Zip64 support on both zip and unzip
- Copyright (C) 2009-2010 Mathias Svensson
- http://result42.com
- Modifications for AES, PKWARE disk spanning
- Copyright (C) 2010-2014 Nathan Moinvaziri
-
- This program is distributed under the terms of the same license as zlib.
- See the accompanying LICENSE file for the full text of the license.
- */
-
-
-#include
-#include
-#include
-
-/*#ifndef NOUNCRYPT
- # define NOUNCRYPT
- #endif*/
-
-#include "zlib.h"
-#include "unzip.h"
-
-#include "Common.h"
-
-#ifdef STDC
-# include
-# include
-# include
-#endif
-#ifdef NO_ERRNO_H
-extern int errno;
-#else
-# include
-#endif
-
-#ifdef HAVE_AES
-# define AES_METHOD (99)
-# define AES_PWVERIFYSIZE (2)
-# define AES_MAXSALTLENGTH (16)
-# define AES_AUTHCODESIZE (10)
-# define AES_HEADERSIZE (11)
-# define AES_KEYSIZE(mode) (64 + (mode * 64))
-
-# include "aes.h"
-# include "fileenc.h"
-#endif
-#ifndef NOUNCRYPT
-# include "crypt.h"
-#endif
-
-#ifndef local
-# define local static
-#endif
-/* compile with -Dlocal if your debugger can't find static symbols */
-
-#define DISKHEADERMAGIC (0x08074b50)
-#define LOCALHEADERMAGIC (0x04034b50)
-#define CENTRALHEADERMAGIC (0x02014b50)
-#define ENDHEADERMAGIC (0x06054b50)
-#define ZIP64ENDHEADERMAGIC (0x06064b50)
-#define ZIP64ENDLOCHEADERMAGIC (0x07064b50)
-
-#define SIZECENTRALDIRITEM (0x2e)
-#define SIZECENTRALHEADERLOCATOR (0x14) /* 20 */
-#define SIZEZIPLOCALHEADER (0x1e)
-
-#ifndef BUFREADCOMMENT
-# define BUFREADCOMMENT (0x400)
-#endif
-
-#ifndef UNZ_BUFSIZE
-# define UNZ_BUFSIZE (64 * 1024)
-#endif
-#ifndef UNZ_MAXFILENAMEINZIP
-# define UNZ_MAXFILENAMEINZIP (256)
-#endif
-
-#ifndef ALLOC
-# define ALLOC(size) (malloc(size))
-#endif
-#ifndef TRYFREE
-# define TRYFREE(p) {if (p) free(p); }
-#endif
-
-const char unz_copyright[] =
- " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
-
-/* unz_file_info_interntal contain internal info about a file in zipfile*/
-typedef struct unz_file_info64_internal_s {
- ZPOS64_T offset_curfile; /* relative offset of local header 8 bytes */
- ZPOS64_T byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx) */
-#ifdef HAVE_AES
- uLong aes_encryption_mode;
- uLong aes_compression_method;
- uLong aes_version;
-#endif
-} unz_file_info64_internal;
-
-/* file_in_zip_read_info_s contain internal information about a file in zipfile */
-typedef struct {
- Bytef *read_buffer; /* internal buffer for compressed data */
- z_stream stream; /* zLib stream structure for inflate */
-
-#ifdef HAVE_BZIP2
- bz_stream bstream; /* bzLib stream structure for bziped */
-#endif
-#ifdef HAVE_AES
- fcrypt_ctx aes_ctx;
-#endif
-
- ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek */
- uLong stream_initialised; /* flag set if stream structure is initialised */
-
- ZPOS64_T offset_local_extrafield; /* offset of the local extra field */
- uInt size_local_extrafield; /* size of the local extra field */
- ZPOS64_T pos_local_extrafield; /* position in the local extra field in read */
- ZPOS64_T total_out_64;
-
- uLong crc32; /* crc32 of all data uncompressed */
- uLong crc32_wait; /* crc32 we must obtain after decompress all */
- ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */
- ZPOS64_T rest_read_uncompressed; /* number of byte to be obtained after decomp */
-
- zlib_filefunc64_32_def z_filefunc;
-
- voidpf filestream; /* io structore of the zipfile */
- uLong compression_method; /* compression method (0==store) */
- ZPOS64_T byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx) */
- int raw;
-} file_in_zip64_read_info_s;
-
-/* unz64_s contain internal information about the zipfile */
-typedef struct {
- zlib_filefunc64_32_def z_filefunc;
- voidpf filestream; /* io structure of the current zipfile */
- voidpf filestream_with_CD; /* io structure of the disk with the central directory */
- unz_global_info64 gi; /* public global information */
- ZPOS64_T byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx)*/
- ZPOS64_T num_file; /* number of the current file in the zipfile*/
- ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/
- ZPOS64_T current_file_ok; /* flag about the usability of the current file*/
- ZPOS64_T central_pos; /* position of the beginning of the central dir*/
- uLong number_disk; /* number of the current disk, used for spanning ZIP*/
- ZPOS64_T size_central_dir; /* size of the central directory */
- ZPOS64_T offset_central_dir; /* offset of start of central directory with
- respect to the starting disk number */
-
- unz_file_info64 cur_file_info; /* public info about the current file in zip*/
- unz_file_info64_internal cur_file_info_internal;
- /* private info about it*/
- file_in_zip64_read_info_s *pfile_in_zip_read;
- /* structure about the current file if we are decompressing it */
- int isZip64; /* is the current file zip64 */
-#ifndef NOUNCRYPT
- unsigned long keys[3]; /* keys defining the pseudo-random sequence */
- const unsigned long *pcrc_32_tab;
-#endif
-} unz64_s;
-
-/* Translate date/time from Dos format to tm_unz (readable more easily) */
-local void unz64local_DosDateToTmuDate(ZPOS64_T ulDosDate, tm_unz *ptm)
-{
- ZPOS64_T uDate = (ZPOS64_T)(ulDosDate >> 16);
-
- ptm->tm_mday = (uInt)(uDate & 0x1f);
- ptm->tm_mon = (uInt)((((uDate) & 0x1E0) / 0x20) - 1);
- ptm->tm_year = (uInt)(((uDate & 0x0FE00) / 0x0200) + 1980);
- ptm->tm_hour = (uInt)((ulDosDate & 0xF800) / 0x800);
- ptm->tm_min = (uInt)((ulDosDate & 0x7E0) / 0x20);
- ptm->tm_sec = (uInt)(2 * (ulDosDate & 0x1f));
-
-#define unz64local_in_range(min, max, value) ((min) <= (value) && (value) <= (max))
- if (!unz64local_in_range(0, 11, ptm->tm_mon) ||
- !unz64local_in_range(1, 31, ptm->tm_mday) ||
- !unz64local_in_range(0, 23, ptm->tm_hour) ||
- !unz64local_in_range(0, 59, ptm->tm_min) ||
- !unz64local_in_range(0, 59, ptm->tm_sec))
- /* Invalid date stored, so don't return it. */
- memset(ptm, 0, sizeof(tm_unz));
-#undef unz64local_in_range
-}
-
-/* Read a byte from a gz_stream; Return EOF for end of file. */
-local int unz64local_getByte(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, int *pi)
-{
- unsigned char c;
- int err = (int)ZREAD64(*pzlib_filefunc_def, filestream, &c, 1);
- if (err == 1) {
- *pi = (int)c;
- return UNZ_OK;
- }
- if (ZERROR64(*pzlib_filefunc_def, filestream))
- return UNZ_ERRNO;
- return UNZ_EOF;
-}
-
-local int unz64local_getShort OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));
-local int unz64local_getShort(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)
-{
- uLong x;
- int i = 0;
- int err;
-
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x = (uLong)i;
- if (err == UNZ_OK)
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x |= ((uLong)i) << 8;
-
- if (err == UNZ_OK)
- *pX = x;
- else
- *pX = 0;
- return err;
-}
-
-local int unz64local_getLong OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));
-local int unz64local_getLong(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)
-{
- uLong x;
- int i = 0;
- int err;
-
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x = (uLong)i;
- if (err == UNZ_OK)
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x |= ((uLong)i) << 8;
- if (err == UNZ_OK)
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x |= ((uLong)i) << 16;
- if (err == UNZ_OK)
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((uLong)i) << 24;
-
- if (err == UNZ_OK)
- *pX = x;
- else
- *pX = 0;
- return err;
-}
-
-local int unz64local_getLong64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, ZPOS64_T * pX));
-local int unz64local_getLong64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)
-{
- ZPOS64_T x;
- int i = 0;
- int err;
-
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x = (ZPOS64_T)i;
- if (err == UNZ_OK)
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x |= ((ZPOS64_T)i) << 8;
- if (err == UNZ_OK)
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x |= ((ZPOS64_T)i) << 16;
- if (err == UNZ_OK)
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x |= ((ZPOS64_T)i) << 24;
- if (err == UNZ_OK)
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x |= ((ZPOS64_T)i) << 32;
- if (err == UNZ_OK)
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x |= ((ZPOS64_T)i) << 40;
- if (err == UNZ_OK)
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x |= ((ZPOS64_T)i) << 48;
- if (err == UNZ_OK)
- err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
- x |= ((ZPOS64_T)i) << 56;
-
- if (err == UNZ_OK)
- *pX = x;
- else
- *pX = 0;
- return err;
-}
-
-/* Locate the Central directory of a zip file (at the end, just before the global comment) */
-local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream));
-local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream)
-{
- unsigned char *buf;
- ZPOS64_T file_size;
- ZPOS64_T back_read = 4;
- ZPOS64_T max_back = 0xffff; /* maximum size of global comment */
- ZPOS64_T pos_found = 0;
- uLong read_size;
- ZPOS64_T read_pos;
- int i;
-
- buf = (unsigned char *)ALLOC(BUFREADCOMMENT + 4);
- if (buf == NULL)
- return 0;
-
- if (ZSEEK64(*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0) {
- TRYFREE(buf);
- return 0;
- }
-
- file_size = ZTELL64(*pzlib_filefunc_def, filestream);
-
- if (max_back > file_size)
- max_back = file_size;
-
- while (back_read < max_back) {
- if (back_read + BUFREADCOMMENT > max_back)
- back_read = max_back;
- else
- back_read += BUFREADCOMMENT;
-
- read_pos = file_size - back_read;
- read_size = ((BUFREADCOMMENT + 4) < (file_size - read_pos)) ?
- (BUFREADCOMMENT + 4) : (uLong)(file_size - read_pos);
-
- if (ZSEEK64(*pzlib_filefunc_def, filestream, read_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
- break;
- if (ZREAD64(*pzlib_filefunc_def, filestream, buf, read_size) != read_size)
- break;
-
- for (i = (int)read_size - 3; (i--) > 0; )
- if (((*(buf + i)) == (ENDHEADERMAGIC & 0xff)) &&
- ((*(buf + i + 1)) == (ENDHEADERMAGIC >> 8 & 0xff)) &&
- ((*(buf + i + 2)) == (ENDHEADERMAGIC >> 16 & 0xff)) &&
- ((*(buf + i + 3)) == (ENDHEADERMAGIC >> 24 & 0xff))) {
- pos_found = read_pos + i;
- break;
- }
-
- if (pos_found != 0)
- break;
- }
- TRYFREE(buf);
- return pos_found;
-}
-
-/* Locate the Central directory 64 of a zipfile (at the end, just before the global comment) */
-local ZPOS64_T unz64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream,
- const ZPOS64_T endcentraloffset));
-local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream,
- const ZPOS64_T endcentraloffset)
-{
- ZPOS64_T offset;
- uLong uL;
-
- /* Zip64 end of central directory locator */
- if (ZSEEK64(*pzlib_filefunc_def, filestream, endcentraloffset - SIZECENTRALHEADERLOCATOR, ZLIB_FILEFUNC_SEEK_SET) != 0)
- return 0;
-
- /* read locator signature */
- if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
- return 0;
- if (uL != ZIP64ENDLOCHEADERMAGIC)
- return 0;
- /* number of the disk with the start of the zip64 end of central directory */
- if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
- return 0;
- /* relative offset of the zip64 end of central directory record */
- if (unz64local_getLong64(pzlib_filefunc_def, filestream, &offset) != UNZ_OK)
- return 0;
- /* total number of disks */
- if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
- return 0;
- /* Goto end of central directory record */
- if (ZSEEK64(*pzlib_filefunc_def, filestream, offset, ZLIB_FILEFUNC_SEEK_SET) != 0)
- return 0;
- /* the signature */
- if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
- return 0;
- if (uL != ZIP64ENDHEADERMAGIC)
- return 0;
-
- return offset;
-}
-
-local unzFile unzOpenInternal(const void *path, zlib_filefunc64_32_def *pzlib_filefunc64_32_def)
-{
- unz64_s us;
- unz64_s *s;
- ZPOS64_T central_pos;
- uLong uL;
- voidpf filestream = NULL;
- ZPOS64_T number_entry_CD;
- int err = UNZ_OK;
-
- if (unz_copyright[0] != ' ')
- return NULL;
-
- us.filestream = NULL;
- us.filestream_with_CD = NULL;
- us.z_filefunc.zseek32_file = NULL;
- us.z_filefunc.ztell32_file = NULL;
- if (pzlib_filefunc64_32_def == NULL)
- fill_fopen64_filefunc(&us.z_filefunc.zfile_func64);
- else
- us.z_filefunc = *pzlib_filefunc64_32_def;
-
- us.filestream = ZOPEN64(us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING);
-
- if (us.filestream == NULL)
- return NULL;
-
- us.filestream_with_CD = us.filestream;
- us.isZip64 = 0;
-
- /* Use unz64local_SearchCentralDir first. Only based on the result
- is it necessary to locate the unz64local_SearchCentralDir64 */
- central_pos = unz64local_SearchCentralDir(&us.z_filefunc, us.filestream);
- if (central_pos) {
- if (ZSEEK64(us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
- err = UNZ_ERRNO;
-
- /* the signature, already checked */
- if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- /* number of this disk */
- if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- us.number_disk = uL;
- /* number of the disk with the start of the central directory */
- if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- us.gi.number_disk_with_CD = uL;
- /* total number of entries in the central directory on this disk */
- if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- us.gi.number_entry = uL;
- /* total number of entries in the central directory */
- if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- number_entry_CD = uL;
- if (number_entry_CD != us.gi.number_entry)
- err = UNZ_BADZIPFILE;
- /* size of the central directory */
- if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- us.size_central_dir = uL;
- /* offset of start of central directory with respect to the starting disk number */
- if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- us.offset_central_dir = uL;
- /* zipfile comment length */
- if (unz64local_getShort(&us.z_filefunc, us.filestream, &us.gi.size_comment) != UNZ_OK)
- err = UNZ_ERRNO;
-
- if ((err == UNZ_OK) &&
- ((us.gi.number_entry == 0xffff) || (us.size_central_dir == 0xffff) || (us.offset_central_dir == 0xffffffff))) {
- /* Format should be Zip64, as the central directory or file size is too large */
- central_pos = unz64local_SearchCentralDir64(&us.z_filefunc, us.filestream, central_pos);
- if (central_pos) {
- ZPOS64_T uL64;
-
- us.isZip64 = 1;
-
- if (ZSEEK64(us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
- err = UNZ_ERRNO;
-
- /* the signature, already checked */
- if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- /* size of zip64 end of central directory record */
- if (unz64local_getLong64(&us.z_filefunc, us.filestream, &uL64) != UNZ_OK)
- err = UNZ_ERRNO;
- /* version made by */
- if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- /* version needed to extract */
- if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- /* number of this disk */
- if (unz64local_getLong(&us.z_filefunc, us.filestream, &us.number_disk) != UNZ_OK)
- err = UNZ_ERRNO;
- /* number of the disk with the start of the central directory */
- if (unz64local_getLong(&us.z_filefunc, us.filestream, &us.gi.number_disk_with_CD) != UNZ_OK)
- err = UNZ_ERRNO;
- /* total number of entries in the central directory on this disk */
- if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.gi.number_entry) != UNZ_OK)
- err = UNZ_ERRNO;
- /* total number of entries in the central directory */
- if (unz64local_getLong64(&us.z_filefunc, us.filestream, &number_entry_CD) != UNZ_OK)
- err = UNZ_ERRNO;
- if (number_entry_CD != us.gi.number_entry)
- err = UNZ_BADZIPFILE;
- /* size of the central directory */
- if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.size_central_dir) != UNZ_OK)
- err = UNZ_ERRNO;
- /* offset of start of central directory with respect to the starting disk number */
- if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.offset_central_dir) != UNZ_OK)
- err = UNZ_ERRNO;
- } else
- err = UNZ_BADZIPFILE;
- }
- } else
- err = UNZ_ERRNO;
-
- if ((err == UNZ_OK) && (central_pos < us.offset_central_dir + us.size_central_dir))
- err = UNZ_BADZIPFILE;
-
- if (err != UNZ_OK) {
- ZCLOSE64(us.z_filefunc, us.filestream);
- return NULL;
- }
-
- if (us.gi.number_disk_with_CD == 0) {
- /* If there is only one disk open another stream so we don't have to seek between the CD
- and the file headers constantly */
- filestream = ZOPEN64(us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING);
- if (filestream != NULL)
- us.filestream = filestream;
- }
-
- /* Hack for zip files that have no respect for zip64
- if ((central_pos > 0xffffffff) && (us.offset_central_dir < 0xffffffff))
- us.offset_central_dir = central_pos - us.size_central_dir;*/
-
- us.byte_before_the_zipfile = central_pos - (us.offset_central_dir + us.size_central_dir);
- us.central_pos = central_pos;
- us.pfile_in_zip_read = NULL;
-
- s = (unz64_s *)ALLOC(sizeof(unz64_s));
- if (s != NULL) {
- *s = us;
- unzGoToFirstFile((unzFile)s);
- }
- return (unzFile)s;
-}
-
-extern unzFile ZEXPORT unzOpen2(const char *path, zlib_filefunc_def *pzlib_filefunc32_def)
-{
- if (pzlib_filefunc32_def != NULL) {
- zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
- fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);
- return unzOpenInternal(path, &zlib_filefunc64_32_def_fill);
- }
- return unzOpenInternal(path, NULL);
-}
-
-extern unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def)
-{
- if (pzlib_filefunc_def != NULL) {
- zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
- zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
- zlib_filefunc64_32_def_fill.ztell32_file = NULL;
- zlib_filefunc64_32_def_fill.zseek32_file = NULL;
- return unzOpenInternal(path, &zlib_filefunc64_32_def_fill);
- }
- return unzOpenInternal(path, NULL);
-}
-
-extern unzFile ZEXPORT unzOpen(const char *path)
-{
- return unzOpenInternal(path, NULL);
-}
-
-extern unzFile ZEXPORT unzOpen64(const void *path)
-{
- return unzOpenInternal(path, NULL);
-}
-
-extern int ZEXPORT unzClose(unzFile file)
-{
- unz64_s *s;
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
-
- if (s->pfile_in_zip_read != NULL)
- unzCloseCurrentFile(file);
-
- if ((s->filestream != NULL) && (s->filestream != s->filestream_with_CD))
- ZCLOSE64(s->z_filefunc, s->filestream);
- if (s->filestream_with_CD != NULL)
- ZCLOSE64(s->z_filefunc, s->filestream_with_CD);
-
- s->filestream = NULL;
- s->filestream_with_CD = NULL;
- TRYFREE(s);
- return UNZ_OK;
-}
-
-/* Goto to the next available disk for spanned archives */
-local int unzGoToNextDisk OF((unzFile file));
-local int unzGoToNextDisk(unzFile file)
-{
- unz64_s *s;
- file_in_zip64_read_info_s *pfile_in_zip_read_info;
- uLong number_disk_next = 0;
-
- s = (unz64_s *)file;
- if (s == NULL)
- return UNZ_PARAMERROR;
- pfile_in_zip_read_info = s->pfile_in_zip_read;
- number_disk_next = s->number_disk;
-
- if ((pfile_in_zip_read_info != NULL) && (pfile_in_zip_read_info->rest_read_uncompressed > 0))
- /* We are currently reading a file and we need the next sequential disk */
- number_disk_next += 1;
- else
- /* Goto the disk for the current file */
- number_disk_next = s->cur_file_info.disk_num_start;
-
- if (number_disk_next != s->number_disk) {
- /* Switch disks */
- if ((s->filestream != NULL) && (s->filestream != s->filestream_with_CD))
- ZCLOSE64(s->z_filefunc, s->filestream);
-
- if (number_disk_next == s->gi.number_disk_with_CD) {
- s->filestream = s->filestream_with_CD;
- } else {
- s->filestream = ZOPENDISK64(s->z_filefunc, s->filestream_with_CD, (unsigned int)number_disk_next,
- ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING);
- }
-
- if (s->filestream == NULL)
- return UNZ_ERRNO;
-
- s->number_disk = number_disk_next;
- }
-
- return UNZ_OK;
-}
-
-extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info *pglobal_info32)
-{
- unz64_s *s;
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- /* to do : check if number_entry is not truncated */
- pglobal_info32->number_entry = (uLong)s->gi.number_entry;
- pglobal_info32->size_comment = s->gi.size_comment;
- pglobal_info32->number_disk_with_CD = s->gi.number_disk_with_CD;
- return UNZ_OK;
-}
-
-extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64 *pglobal_info)
-{
- unz64_s *s;
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- *pglobal_info = s->gi;
- return UNZ_OK;
-}
-
-extern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uLong comment_size)
-{
- unz64_s *s;
- uLong bytes_to_read = comment_size;
- if (file == NULL)
- return (int)UNZ_PARAMERROR;
- s = (unz64_s *)file;
-
- if (bytes_to_read > s->gi.size_comment)
- bytes_to_read = s->gi.size_comment;
-
- if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, s->central_pos + 22, ZLIB_FILEFUNC_SEEK_SET) != 0)
- return UNZ_ERRNO;
-
- if (bytes_to_read > 0) {
- *comment = 0;
- if (ZREAD64(s->z_filefunc, s->filestream_with_CD, comment, bytes_to_read) != bytes_to_read)
- return UNZ_ERRNO;
- }
-
- if ((comment != NULL) && (comment_size > s->gi.size_comment))
- *(comment + s->gi.size_comment) = 0;
- return (int)bytes_to_read;
-}
-
-/* Get Info about the current file in the zipfile, with internal only info */
-local int unz64local_GetCurrentFileInfoInternal(unzFile file, unz_file_info64 *pfile_info,
- unz_file_info64_internal *pfile_info_internal, char *filename, uLong filename_size, void *extrafield,
- uLong extrafield_size, char *comment, uLong comment_size)
-{
- unz64_s *s;
- unz_file_info64 file_info;
- unz_file_info64_internal file_info_internal;
- ZPOS64_T bytes_to_read;
- int err = UNZ_OK;
- uLong uMagic;
- long lSeek = 0;
- ZPOS64_T current_pos = 0;
- uLong acc = 0;
- uLong uL;
- ZPOS64_T uL64;
-
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
-
- if (ZSEEK64(s->z_filefunc, s->filestream_with_CD,
- s->pos_in_central_dir + s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
- err = UNZ_ERRNO;
-
- /* Check the magic */
- if (err == UNZ_OK) {
- if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uMagic) != UNZ_OK)
- err = UNZ_ERRNO;
- else if (uMagic != CENTRALHEADERMAGIC)
- err = UNZ_BADZIPFILE;
- }
-
- /* Read central directory header */
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.version) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.version_needed) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.flag) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.compression_method) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.dosDate) != UNZ_OK)
- err = UNZ_ERRNO;
- unz64local_DosDateToTmuDate(file_info.dosDate, &file_info.tmu_date);
- if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.crc) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- file_info.compressed_size = uL;
- if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- file_info.uncompressed_size = uL;
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_filename) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_file_extra) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_file_comment) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.disk_num_start) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.internal_fa) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.external_fa) != UNZ_OK)
- err = UNZ_ERRNO;
- /* Relative offset of local header */
- if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
-
- file_info.size_file_extra_internal = 0;
- file_info.disk_offset = uL;
- file_info_internal.offset_curfile = uL;
-#ifdef HAVE_AES
- file_info_internal.aes_compression_method = 0;
- file_info_internal.aes_encryption_mode = 0;
- file_info_internal.aes_version = 0;
-#endif
-
- lSeek += file_info.size_filename;
-
- if ((err == UNZ_OK) && (filename != NULL)) {
- if (file_info.size_filename < filename_size) {
- *(filename + file_info.size_filename) = 0;
- bytes_to_read = file_info.size_filename;
- } else
- bytes_to_read = filename_size;
-
- if ((file_info.size_filename > 0) && (filename_size > 0))
- if (ZREAD64(s->z_filefunc, s->filestream_with_CD, filename, (uLong)bytes_to_read) != bytes_to_read)
- err = UNZ_ERRNO;
- lSeek -= (uLong)bytes_to_read;
- }
-
- /* Read extrafield */
- if ((err == UNZ_OK) && (extrafield != NULL)) {
- if (file_info.size_file_extra < extrafield_size)
- bytes_to_read = file_info.size_file_extra;
- else
- bytes_to_read = extrafield_size;
-
- if (lSeek != 0) {
- if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)
- lSeek = 0;
- else
- err = UNZ_ERRNO;
- }
-
- if ((file_info.size_file_extra > 0) && (extrafield_size > 0))
- if (ZREAD64(s->z_filefunc, s->filestream_with_CD, extrafield, (uLong)bytes_to_read) != bytes_to_read)
- err = UNZ_ERRNO;
- lSeek += file_info.size_file_extra - (uLong)bytes_to_read;
- } else
- lSeek += file_info.size_file_extra;
-
- if ((err == UNZ_OK) && (file_info.size_file_extra != 0)) {
- if (lSeek != 0) {
- if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)
- lSeek = 0;
- else
- err = UNZ_ERRNO;
- }
-
- /* We are going to parse the extra field so we need to move back */
- current_pos = ZTELL64(s->z_filefunc, s->filestream_with_CD);
- if (current_pos < file_info.size_file_extra)
- err = UNZ_ERRNO;
- current_pos -= file_info.size_file_extra;
- if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, current_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
- err = UNZ_ERRNO;
-
- while ((err != UNZ_ERRNO) && (acc < file_info.size_file_extra)) {
- uLong headerid;
- uLong datasize;
-
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &headerid) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &datasize) != UNZ_OK)
- err = UNZ_ERRNO;
-
- /* ZIP64 extra fields */
- if (headerid == 0x0001) {
- /* Subtract size of ZIP64 field, since ZIP64 is handled internally */
- file_info.size_file_extra_internal += 2 + 2 + datasize;
-
- if (file_info.uncompressed_size == 0xffffffff) {
- if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &file_info.uncompressed_size) != UNZ_OK)
- err = UNZ_ERRNO;
- }
- if (file_info.compressed_size == 0xffffffff) {
- if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &file_info.compressed_size) != UNZ_OK)
- err = UNZ_ERRNO;
- }
- if (file_info_internal.offset_curfile == 0xffffffff) {
- /* Relative Header offset */
- if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &uL64) != UNZ_OK)
- err = UNZ_ERRNO;
- file_info_internal.offset_curfile = uL64;
- file_info.disk_offset = uL64;
- }
- if (file_info.disk_num_start == 0xffffffff) {
- /* Disk Start Number */
- if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.disk_num_start) != UNZ_OK)
- err = UNZ_ERRNO;
- }
- }
-#ifdef HAVE_AES
- /* AES header */
- else if (headerid == 0x9901) {
- /* Subtract size of AES field, since AES is handled internally */
- file_info.size_file_extra_internal += 2 + 2 + datasize;
-
- /* Verify version info */
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- /* Support AE-1 and AE-2 */
- if (uL != 1 && uL != 2)
- err = UNZ_ERRNO;
- file_info_internal.aes_version = uL;
- if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, (int *)&uL) != UNZ_OK)
- err = UNZ_ERRNO;
- if ((char)uL != 'A')
- err = UNZ_ERRNO;
- if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, (int *)&uL) != UNZ_OK)
- err = UNZ_ERRNO;
- if ((char)uL != 'E')
- err = UNZ_ERRNO;
- /* Get AES encryption strength and actual compression method */
- if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, (int *)&uL) != UNZ_OK)
- err = UNZ_ERRNO;
- file_info_internal.aes_encryption_mode = uL;
- if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- file_info_internal.aes_compression_method = uL;
- }
-#endif
- else {
- if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, datasize, ZLIB_FILEFUNC_SEEK_CUR) != 0)
- err = UNZ_ERRNO;
- }
-
- acc += 2 + 2 + datasize;
- }
- }
-
- if (file_info.disk_num_start == s->gi.number_disk_with_CD)
- file_info_internal.byte_before_the_zipfile = s->byte_before_the_zipfile;
- else
- file_info_internal.byte_before_the_zipfile = 0;
-
- if ((err == UNZ_OK) && (comment != NULL)) {
- if (file_info.size_file_comment < comment_size) {
- *(comment + file_info.size_file_comment) = 0;
- bytes_to_read = file_info.size_file_comment;
- } else
- bytes_to_read = comment_size;
-
- if (lSeek != 0) {
- if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) != 0)
- err = UNZ_ERRNO;
- }
-
- if ((file_info.size_file_comment > 0) && (comment_size > 0))
- if (ZREAD64(s->z_filefunc, s->filestream_with_CD, comment, (uLong)bytes_to_read) != bytes_to_read)
- err = UNZ_ERRNO;
- lSeek += file_info.size_file_comment - (uLong)bytes_to_read;
- } else
- lSeek += file_info.size_file_comment;
-
- if ((err == UNZ_OK) && (pfile_info != NULL))
- *pfile_info = file_info;
-
- if ((err == UNZ_OK) && (pfile_info_internal != NULL))
- *pfile_info_internal = file_info_internal;
-
- return err;
-}
-
-extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, unz_file_info *pfile_info, char *filename,
- uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)
-{
- unz_file_info64 file_info64;
- int err;
-
- err = unz64local_GetCurrentFileInfoInternal(file, &file_info64, NULL, filename, filename_size,
- extrafield, extrafield_size, comment, comment_size);
-
- if ((err == UNZ_OK) && (pfile_info != NULL)) {
- pfile_info->version = file_info64.version;
- pfile_info->version_needed = file_info64.version_needed;
- pfile_info->flag = file_info64.flag;
- pfile_info->compression_method = file_info64.compression_method;
- pfile_info->dosDate = file_info64.dosDate;
- pfile_info->crc = file_info64.crc;
-
- pfile_info->size_filename = file_info64.size_filename;
- pfile_info->size_file_extra = file_info64.size_file_extra - file_info64.size_file_extra_internal;
- pfile_info->size_file_comment = file_info64.size_file_comment;
-
- pfile_info->disk_num_start = file_info64.disk_num_start;
- pfile_info->internal_fa = file_info64.internal_fa;
- pfile_info->external_fa = file_info64.external_fa;
-
- pfile_info->tmu_date = file_info64.tmu_date,
-
- pfile_info->compressed_size = (uLong)file_info64.compressed_size;
- pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;
-
- }
- return err;
-}
-
-extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 *pfile_info, char *filename,
- uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)
-{
- return unz64local_GetCurrentFileInfoInternal(file, pfile_info, NULL, filename, filename_size,
- extrafield, extrafield_size, comment, comment_size);
-}
-
-/* Read the local header of the current zipfile. Check the coherency of the local header and info in the
- end of central directory about this file store in *piSizeVar the size of extra info in local header
- (filename and size of extra field data) */
-local int unz64local_CheckCurrentFileCoherencyHeader(unz64_s *s, uInt *piSizeVar, ZPOS64_T *poffset_local_extrafield,
- uInt *psize_local_extrafield)
-{
- uLong uMagic, uL, uFlags;
- uLong size_filename;
- uLong size_extra_field;
- int err = UNZ_OK;
- int compression_method = 0;
-
- *piSizeVar = 0;
- *poffset_local_extrafield = 0;
- *psize_local_extrafield = 0;
-
- err = unzGoToNextDisk((unzFile)s);
- if (err != UNZ_OK)
- return err;
-
- if (ZSEEK64(s->z_filefunc, s->filestream, s->cur_file_info_internal.offset_curfile +
- s->cur_file_info_internal.byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
- return UNZ_ERRNO;
-
- if (err == UNZ_OK) {
- if (unz64local_getLong(&s->z_filefunc, s->filestream, &uMagic) != UNZ_OK)
- err = UNZ_ERRNO;
- else if (uMagic != LOCALHEADERMAGIC)
- err = UNZ_BADZIPFILE;
- }
-
- if (unz64local_getShort(&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getShort(&s->z_filefunc, s->filestream, &uFlags) != UNZ_OK)
- err = UNZ_ERRNO;
- if (unz64local_getShort(&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
- err = UNZ_ERRNO;
- else if ((err == UNZ_OK) && (uL != s->cur_file_info.compression_method))
- err = UNZ_BADZIPFILE;
-
- compression_method = (int)s->cur_file_info.compression_method;
-#ifdef HAVE_AES
- if (compression_method == AES_METHOD)
- compression_method = (int)s->cur_file_info_internal.aes_compression_method;
-#endif
-
- if ((err == UNZ_OK) && (compression_method != 0) &&
-#ifdef HAVE_BZIP2
- (compression_method != Z_BZIP2ED) &&
-#endif
- (compression_method != Z_DEFLATED))
- err = UNZ_BADZIPFILE;
-
- if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* date/time */
- err = UNZ_ERRNO;
- if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* crc */
- err = UNZ_ERRNO;
- else if ((err == UNZ_OK) && (uL != s->cur_file_info.crc) && ((uFlags & 8) == 0))
- err = UNZ_BADZIPFILE;
- if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* size compr */
- err = UNZ_ERRNO;
- else if ((uL != 0xffffffff) && (err == UNZ_OK) && (uL != s->cur_file_info.compressed_size) && ((uFlags & 8) == 0))
- err = UNZ_BADZIPFILE;
- if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* size uncompr */
- err = UNZ_ERRNO;
- else if ((uL != 0xffffffff) && (err == UNZ_OK) && (uL != s->cur_file_info.uncompressed_size) && ((uFlags & 8) == 0))
- err = UNZ_BADZIPFILE;
- if (unz64local_getShort(&s->z_filefunc, s->filestream, &size_filename) != UNZ_OK)
- err = UNZ_ERRNO;
- else if ((err == UNZ_OK) && (size_filename != s->cur_file_info.size_filename))
- err = UNZ_BADZIPFILE;
-
- *piSizeVar += (uInt)size_filename;
-
- if (unz64local_getShort(&s->z_filefunc, s->filestream, &size_extra_field) != UNZ_OK)
- err = UNZ_ERRNO;
- *poffset_local_extrafield = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename;
- *psize_local_extrafield = (uInt)size_extra_field;
-
- *piSizeVar += (uInt)size_extra_field;
-
- return err;
-}
-
-/*
- Open for reading data the current file in the zipfile.
- If there is no error and the file is opened, the return value is UNZ_OK.
- */
-extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int *method, int *level, int raw, const char *password)
-{
- int err = UNZ_OK;
- int compression_method;
- uInt iSizeVar;
- unz64_s *s;
- file_in_zip64_read_info_s *pfile_in_zip_read_info;
- ZPOS64_T offset_local_extrafield;
- uInt size_local_extrafield;
-#ifndef NOUNCRYPT
- char source[12];
-#else
- if (password != NULL)
- return UNZ_PARAMERROR;
-#endif
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- if (!s->current_file_ok)
- return UNZ_PARAMERROR;
-
- if (s->pfile_in_zip_read != NULL)
- unzCloseCurrentFile(file);
-
- if (unz64local_CheckCurrentFileCoherencyHeader(s, &iSizeVar, &offset_local_extrafield, &size_local_extrafield) != UNZ_OK)
- return UNZ_BADZIPFILE;
-
- pfile_in_zip_read_info = (file_in_zip64_read_info_s *)ALLOC(sizeof(file_in_zip64_read_info_s));
- if (pfile_in_zip_read_info == NULL)
- return UNZ_INTERNALERROR;
-
- pfile_in_zip_read_info->read_buffer = (Bytef *)ALLOC(UNZ_BUFSIZE);
- pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
- pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
- pfile_in_zip_read_info->pos_local_extrafield = 0;
- pfile_in_zip_read_info->raw = raw;
-
- if (pfile_in_zip_read_info->read_buffer == NULL) {
- TRYFREE(pfile_in_zip_read_info);
- return UNZ_INTERNALERROR;
- }
-
- pfile_in_zip_read_info->stream_initialised = 0;
-
- compression_method = (int)s->cur_file_info.compression_method;
-#ifdef HAVE_AES
- if (compression_method == AES_METHOD)
- compression_method = (int)s->cur_file_info_internal.aes_compression_method;
-#endif
-
- if (method != NULL)
- *method = compression_method;
-
- if (level != NULL) {
- *level = 6;
- switch (s->cur_file_info.flag & 0x06) {
- case 6: *level = 1; break;
- case 4: *level = 2; break;
- case 2: *level = 9; break;
- }
- }
-
- if ((compression_method != 0) &&
-#ifdef HAVE_BZIP2
- (compression_method != Z_BZIP2ED) &&
-#endif
- (compression_method != Z_DEFLATED))
- err = UNZ_BADZIPFILE;
-
- pfile_in_zip_read_info->crc32_wait = s->cur_file_info.crc;
- pfile_in_zip_read_info->crc32 = 0;
- pfile_in_zip_read_info->total_out_64 = 0;
- pfile_in_zip_read_info->compression_method = compression_method;
- pfile_in_zip_read_info->filestream = s->filestream;
- pfile_in_zip_read_info->z_filefunc = s->z_filefunc;
- if (s->number_disk == s->gi.number_disk_with_CD)
- pfile_in_zip_read_info->byte_before_the_zipfile = s->byte_before_the_zipfile;
- else
- pfile_in_zip_read_info->byte_before_the_zipfile = 0;
- pfile_in_zip_read_info->stream.total_out = 0;
- pfile_in_zip_read_info->stream.total_in = 0;
- pfile_in_zip_read_info->stream.next_in = NULL;
-
- if (!raw) {
- if (compression_method == Z_BZIP2ED) {
-#ifdef HAVE_BZIP2
- pfile_in_zip_read_info->bstream.bzalloc = (void *(*)(void *, int, int)) 0;
- pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
- pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
- pfile_in_zip_read_info->bstream.state = (voidpf)0;
-
- pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
- pfile_in_zip_read_info->stream.zfree = (free_func)0;
- pfile_in_zip_read_info->stream.opaque = (voidpf)0;
- pfile_in_zip_read_info->stream.next_in = (voidpf)0;
- pfile_in_zip_read_info->stream.avail_in = 0;
-
- err = BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0);
- if (err == Z_OK)
- pfile_in_zip_read_info->stream_initialised = Z_BZIP2ED;
- else {
- TRYFREE(pfile_in_zip_read_info);
- return err;
- }
-#else
- pfile_in_zip_read_info->raw = 1;
-#endif
- } else if (compression_method == Z_DEFLATED) {
- pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
- pfile_in_zip_read_info->stream.zfree = (free_func)0;
- pfile_in_zip_read_info->stream.opaque = (voidpf)s;
- pfile_in_zip_read_info->stream.next_in = 0;
- pfile_in_zip_read_info->stream.avail_in = 0;
-
- err = inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
- if (err == Z_OK)
- pfile_in_zip_read_info->stream_initialised = Z_DEFLATED;
- else {
- TRYFREE(pfile_in_zip_read_info);
- return err;
- }
- /* windowBits is passed < 0 to tell that there is no zlib header.
- * Note that in this case inflate *requires* an extra "dummy" byte
- * after the compressed stream in order to complete decompression and
- * return Z_STREAM_END.
- * In unzip, i don't wait absolutely Z_STREAM_END because I known the
- * size of both compressed and uncompressed data
- */
- }
- }
-
- pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size;
- pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size;
- pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar;
- pfile_in_zip_read_info->stream.avail_in = (uInt)0;
-
- s->pfile_in_zip_read = pfile_in_zip_read_info;
-
-#ifndef NOUNCRYPT
- if ((password != NULL) && ((s->cur_file_info.flag & 1) != 0)) {
- if (ZSEEK64(s->z_filefunc, s->filestream,
- s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile,
- ZLIB_FILEFUNC_SEEK_SET) != 0)
- return UNZ_INTERNALERROR;
-#ifdef HAVE_AES
- if (s->cur_file_info.compression_method == AES_METHOD) {
- unsigned char passverify[AES_PWVERIFYSIZE];
- unsigned char saltvalue[AES_MAXSALTLENGTH];
- uInt saltlength;
-
- if ((s->cur_file_info_internal.aes_encryption_mode < 1) ||
- (s->cur_file_info_internal.aes_encryption_mode > 3))
- return UNZ_INTERNALERROR;
-
- saltlength = SALT_LENGTH(s->cur_file_info_internal.aes_encryption_mode);
-
- if (ZREAD64(s->z_filefunc, s->filestream, saltvalue, saltlength) != saltlength)
- return UNZ_INTERNALERROR;
- if (ZREAD64(s->z_filefunc, s->filestream, passverify, AES_PWVERIFYSIZE) != AES_PWVERIFYSIZE)
- return UNZ_INTERNALERROR;
-
- fcrypt_init((int)s->cur_file_info_internal.aes_encryption_mode, (unsigned char *)password, (unsigned int)strlen(password), saltvalue,
- passverify, &s->pfile_in_zip_read->aes_ctx);
-
- pfile_in_zip_read_info->rest_read_compressed -= saltlength + AES_PWVERIFYSIZE;
- pfile_in_zip_read_info->rest_read_compressed -= AES_AUTHCODESIZE;
-
- s->pfile_in_zip_read->pos_in_zipfile += saltlength + AES_PWVERIFYSIZE;
- } else
-#endif
- {
- int i;
- s->pcrc_32_tab = (const unsigned long *)get_crc_table();
- init_keys(password, s->keys, s->pcrc_32_tab);
-
- if (ZREAD64(s->z_filefunc, s->filestream, source, 12) < 12)
- return UNZ_INTERNALERROR;
-
- for (i = 0; i < 12; i++)
- zdecode(s->keys, s->pcrc_32_tab, source[i]);
-
- pfile_in_zip_read_info->rest_read_compressed -= 12;
-
- s->pfile_in_zip_read->pos_in_zipfile += 12;
- }
- }
-#endif
-
- return UNZ_OK;
-}
-
-extern int ZEXPORT unzOpenCurrentFile(unzFile file)
-{
- return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
-}
-
-extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char *password)
-{
- return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
-}
-
-extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int *method, int *level, int raw)
-{
- return unzOpenCurrentFile3(file, method, level, raw, NULL);
-}
-
-/* Read bytes from the current file.
- buf contain buffer where data must be copied
- len the size of buf.
-
- return the number of byte copied if some bytes are copied
- return 0 if the end of file was reached
- return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */
-extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned len)
-{
- int err = UNZ_OK;
- uInt read = 0;
- unz64_s *s;
- file_in_zip64_read_info_s *pfile_in_zip_read_info;
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- pfile_in_zip_read_info = s->pfile_in_zip_read;
-
- if (pfile_in_zip_read_info == NULL)
- return UNZ_PARAMERROR;
- if (pfile_in_zip_read_info->read_buffer == NULL)
- return UNZ_END_OF_LIST_OF_FILE;
- if (len == 0)
- return 0;
-
- pfile_in_zip_read_info->stream.next_out = (Bytef *)buf;
- pfile_in_zip_read_info->stream.avail_out = (uInt)len;
-
- if (pfile_in_zip_read_info->raw) {
- if (len > pfile_in_zip_read_info->rest_read_compressed + pfile_in_zip_read_info->stream.avail_in)
- pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_compressed +
- pfile_in_zip_read_info->stream.avail_in;
- } else {
-
- // NOTE:
- // This bit of code seems to try to set the amount of space in the output buffer based on the
- // value stored in the headers stored in the .zip file. However, if those values are incorrect
- // it may result in a loss of data when uncompresssing that file. The compressed data is still
- // legit and will deflate without knowing the uncompressed code so this tidbit is unnecessary and
- // may cause issues for some .zip files.
- //
- // It's removed in here to fix those issues.
- //
- // See: https://github.com/ZipArchive/ziparchive/issues/16
- //
-
- /*
-
-
- FIXME: Upgrading to minizip 1.1 caused issues here, Uncommented the code that was commented before. 11/24/2015
- */
-
- if (len > pfile_in_zip_read_info->rest_read_uncompressed)
- pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
-
-
-
- }
-
- while (pfile_in_zip_read_info->stream.avail_out > 0) {
- if (pfile_in_zip_read_info->stream.avail_in == 0) {
- uInt bytes_to_read = UNZ_BUFSIZE;
- uInt bytes_not_read = 0;
- uInt bytes_read = 0;
- uInt total_bytes_read = 0;
-
- if (pfile_in_zip_read_info->stream.next_in != NULL)
- bytes_not_read = (uInt)(pfile_in_zip_read_info->read_buffer + UNZ_BUFSIZE -
- pfile_in_zip_read_info->stream.next_in);
- bytes_to_read -= bytes_not_read;
- if (bytes_not_read > 0)
- memcpy(pfile_in_zip_read_info->read_buffer, pfile_in_zip_read_info->stream.next_in, bytes_not_read);
- if (pfile_in_zip_read_info->rest_read_compressed < bytes_to_read)
- bytes_to_read = (uInt)pfile_in_zip_read_info->rest_read_compressed;
-
- while (total_bytes_read != bytes_to_read) {
- if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,
- pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile,
- ZLIB_FILEFUNC_SEEK_SET) != 0)
- return UNZ_ERRNO;
-
- bytes_read = (int)ZREAD64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,
- pfile_in_zip_read_info->read_buffer + bytes_not_read + total_bytes_read,
- bytes_to_read - total_bytes_read);
-
- total_bytes_read += bytes_read;
- pfile_in_zip_read_info->pos_in_zipfile += bytes_read;
-
- if (bytes_read == 0) {
- if (ZERROR64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream))
- return UNZ_ERRNO;
-
- err = unzGoToNextDisk(file);
- if (err != UNZ_OK)
- return err;
-
- pfile_in_zip_read_info->pos_in_zipfile = 0;
- pfile_in_zip_read_info->filestream = s->filestream;
- }
- }
-
-#ifndef NOUNCRYPT
- if ((s->cur_file_info.flag & 1) != 0) {
-#ifdef HAVE_AES
- if (s->cur_file_info.compression_method == AES_METHOD) {
- fcrypt_decrypt(pfile_in_zip_read_info->read_buffer, bytes_to_read, &s->pfile_in_zip_read->aes_ctx);
- } else
-#endif
- {
- uInt i;
- for (i = 0; i < total_bytes_read; i++)
- pfile_in_zip_read_info->read_buffer[i] =
- zdecode(s->keys, s->pcrc_32_tab, pfile_in_zip_read_info->read_buffer[i]);
- }
- }
-#endif
-
- pfile_in_zip_read_info->rest_read_compressed -= total_bytes_read;
- pfile_in_zip_read_info->stream.next_in = (Bytef *)pfile_in_zip_read_info->read_buffer;
- pfile_in_zip_read_info->stream.avail_in = (uInt)bytes_not_read + total_bytes_read;
- }
-
- if ((pfile_in_zip_read_info->compression_method == 0) || (pfile_in_zip_read_info->raw)) {
- uInt copy, i;
-
- if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
- (pfile_in_zip_read_info->rest_read_compressed == 0))
- return (read == 0) ? UNZ_EOF : read;
-
- if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in)
- copy = pfile_in_zip_read_info->stream.avail_out;
- else
- copy = pfile_in_zip_read_info->stream.avail_in;
-
- for (i = 0; i < copy; i++)
- *(pfile_in_zip_read_info->stream.next_out + i) =
- *(pfile_in_zip_read_info->stream.next_in + i);
-
- pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + copy;
- pfile_in_zip_read_info->rest_read_uncompressed -= copy;
- pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
- pfile_in_zip_read_info->stream.next_out, copy);
-
- pfile_in_zip_read_info->stream.avail_in -= copy;
- pfile_in_zip_read_info->stream.avail_out -= copy;
- pfile_in_zip_read_info->stream.next_out += copy;
- pfile_in_zip_read_info->stream.next_in += copy;
- pfile_in_zip_read_info->stream.total_out += copy;
- read += copy;
- } else if (pfile_in_zip_read_info->compression_method == Z_BZIP2ED) {
-#ifdef HAVE_BZIP2
- uLong total_out_before, total_out_after;
- const Bytef *buf_before;
- uLong out_bytes;
-
- pfile_in_zip_read_info->bstream.next_in = (char *)pfile_in_zip_read_info->stream.next_in;
- pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in;
- pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in;
- pfile_in_zip_read_info->bstream.total_in_hi32 = 0;
- pfile_in_zip_read_info->bstream.next_out = (char *)pfile_in_zip_read_info->stream.next_out;
- pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out;
- pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;
- pfile_in_zip_read_info->bstream.total_out_hi32 = 0;
-
- total_out_before = pfile_in_zip_read_info->bstream.total_out_lo32;
- buf_before = (const Bytef *)pfile_in_zip_read_info->bstream.next_out;
-
- err = BZ2_bzDecompress(&pfile_in_zip_read_info->bstream);
-
- total_out_after = pfile_in_zip_read_info->bstream.total_out_lo32;
- out_bytes = total_out_after - total_out_before;
-
- pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + out_bytes;
- pfile_in_zip_read_info->rest_read_uncompressed -= out_bytes;
- pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, buf_before, (uInt)(out_bytes));
-
- read += (uInt)(total_out_after - total_out_before);
-
- pfile_in_zip_read_info->stream.next_in = (Bytef *)pfile_in_zip_read_info->bstream.next_in;
- pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in;
- pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32;
- pfile_in_zip_read_info->stream.next_out = (Bytef *)pfile_in_zip_read_info->bstream.next_out;
- pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;
- pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;
-
- if (err == BZ_STREAM_END)
- return (read == 0) ? UNZ_EOF : read;
- if (err != BZ_OK)
- break;
-#endif
- } else {
- ZPOS64_T total_out_before, total_out_after;
- const Bytef *buf_before;
- ZPOS64_T out_bytes;
- int flush = Z_SYNC_FLUSH;
-
- total_out_before = pfile_in_zip_read_info->stream.total_out;
- buf_before = pfile_in_zip_read_info->stream.next_out;
-
- /*
- if ((pfile_in_zip_read_info->rest_read_uncompressed ==
- pfile_in_zip_read_info->stream.avail_out) &&
- (pfile_in_zip_read_info->rest_read_compressed == 0))
- flush = Z_FINISH;
- */
- err = inflate(&pfile_in_zip_read_info->stream, flush);
-
- if ((err >= 0) && (pfile_in_zip_read_info->stream.msg != NULL))
- err = Z_DATA_ERROR;
-
- total_out_after = pfile_in_zip_read_info->stream.total_out;
- out_bytes = total_out_after - total_out_before;
-
- pfile_in_zip_read_info->total_out_64 += out_bytes;
- pfile_in_zip_read_info->rest_read_uncompressed -= out_bytes;
- pfile_in_zip_read_info->crc32 =
- crc32(pfile_in_zip_read_info->crc32, buf_before, (uInt)(out_bytes));
-
- read += (uInt)(total_out_after - total_out_before);
-
- if (err == Z_STREAM_END)
- return (read == 0) ? UNZ_EOF : read;
- if (err != Z_OK)
- break;
- }
- }
-
- if (err == Z_OK)
- return read;
- return err;
-}
-
-extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file)
-{
- unz64_s *s;
- file_in_zip64_read_info_s *pfile_in_zip_read_info;
- s = (unz64_s *)file;
- if (file == NULL)
- return 0; /* UNZ_PARAMERROR */
- pfile_in_zip_read_info = s->pfile_in_zip_read;
- if (pfile_in_zip_read_info == NULL)
- return 0; /* UNZ_PARAMERROR */
- return pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile;
-}
-
-extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, unsigned len)
-{
- unz64_s *s;
- file_in_zip64_read_info_s *pfile_in_zip_read_info;
- uInt read_now;
- ZPOS64_T size_to_read;
-
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- pfile_in_zip_read_info = s->pfile_in_zip_read;
-
- if (pfile_in_zip_read_info == NULL)
- return UNZ_PARAMERROR;
-
- size_to_read = pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield;
-
- if (buf == NULL)
- return (int)size_to_read;
-
- if (len > size_to_read)
- read_now = (uInt)size_to_read;
- else
- read_now = (uInt)len;
-
- if (read_now == 0)
- return 0;
-
- if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,
- pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield,
- ZLIB_FILEFUNC_SEEK_SET) != 0)
- return UNZ_ERRNO;
-
- if (ZREAD64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, buf, read_now) != read_now)
- return UNZ_ERRNO;
-
- return (int)read_now;
-}
-
-extern int ZEXPORT unzCloseCurrentFile(unzFile file)
-{
- int err = UNZ_OK;
-
- unz64_s *s;
- file_in_zip64_read_info_s *pfile_in_zip_read_info;
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- pfile_in_zip_read_info = s->pfile_in_zip_read;
-
- if (pfile_in_zip_read_info == NULL)
- return UNZ_PARAMERROR;
-
-#ifdef HAVE_AES
- if (s->cur_file_info.compression_method == AES_METHOD) {
- unsigned char authcode[AES_AUTHCODESIZE];
- unsigned char rauthcode[AES_AUTHCODESIZE];
-
- if (ZREAD64(s->z_filefunc, s->filestream, authcode, AES_AUTHCODESIZE) != AES_AUTHCODESIZE)
- return UNZ_ERRNO;
-
- if (fcrypt_end(rauthcode, &s->pfile_in_zip_read->aes_ctx) != AES_AUTHCODESIZE)
- err = UNZ_CRCERROR;
- if (memcmp(authcode, rauthcode, AES_AUTHCODESIZE) != 0)
- err = UNZ_CRCERROR;
- }
- /* AES zip version AE-1 will expect a valid crc as well */
- if ((s->cur_file_info.compression_method != AES_METHOD) ||
- (s->cur_file_info_internal.aes_version == 0x0001))
-#endif
- {
- if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
- (!pfile_in_zip_read_info->raw)) {
- if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
- err = UNZ_CRCERROR;
- }
- }
-
- TRYFREE(pfile_in_zip_read_info->read_buffer);
- pfile_in_zip_read_info->read_buffer = NULL;
- if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
- inflateEnd(&pfile_in_zip_read_info->stream);
-#ifdef HAVE_BZIP2
- else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
- BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream);
-#endif
-
- pfile_in_zip_read_info->stream_initialised = 0;
- TRYFREE(pfile_in_zip_read_info);
-
- s->pfile_in_zip_read = NULL;
-
- return err;
-}
-
-extern int ZEXPORT unzGoToFirstFile2(unzFile file, unz_file_info64 *pfile_info, char *filename,
- uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)
-{
- int err = UNZ_OK;
- unz64_s *s;
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- s->pos_in_central_dir = s->offset_central_dir;
- s->num_file = 0;
- err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal,
- filename, filename_size, extrafield, extrafield_size, comment, comment_size);
- s->current_file_ok = (err == UNZ_OK);
- if ((err == UNZ_OK) && (pfile_info != NULL))
- memcpy(pfile_info, &s->cur_file_info, sizeof(unz_file_info64));
- return err;
-}
-
-extern int ZEXPORT unzGoToFirstFile(unzFile file)
-{
- return unzGoToFirstFile2(file, NULL, NULL, 0, NULL, 0, NULL, 0);
-}
-
-extern int ZEXPORT unzGoToNextFile2(unzFile file, unz_file_info64 *pfile_info, char *filename,
- uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)
-{
- unz64_s *s;
- int err;
-
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- if (!s->current_file_ok)
- return UNZ_END_OF_LIST_OF_FILE;
- if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */
- if (s->num_file + 1 == s->gi.number_entry)
- return UNZ_END_OF_LIST_OF_FILE;
- s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
- s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment;
- s->num_file++;
- err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal,
- filename, filename_size, extrafield, extrafield_size, comment, comment_size);
- s->current_file_ok = (err == UNZ_OK);
- if ((err == UNZ_OK) && (pfile_info != NULL))
- memcpy(pfile_info, &s->cur_file_info, sizeof(unz_file_info64));
- return err;
-}
-
-extern int ZEXPORT unzGoToNextFile(unzFile file)
-{
- return unzGoToNextFile2(file, NULL, NULL, 0, NULL, 0, NULL, 0);
-}
-
-extern int ZEXPORT unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func)
-{
- unz64_s *s;
- int err;
- unz_file_info64 cur_file_info_saved;
- unz_file_info64_internal cur_file_info_internal_saved;
- ZPOS64_T num_file_saved;
- ZPOS64_T pos_in_central_dir_saved;
- char current_filename[UNZ_MAXFILENAMEINZIP + 1];
-
- if (file == NULL)
- return UNZ_PARAMERROR;
- if (strlen(filename) >= UNZ_MAXFILENAMEINZIP)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- if (!s->current_file_ok)
- return UNZ_END_OF_LIST_OF_FILE;
-
- /* Save the current state */
- num_file_saved = s->num_file;
- pos_in_central_dir_saved = s->pos_in_central_dir;
- cur_file_info_saved = s->cur_file_info;
- cur_file_info_internal_saved = s->cur_file_info_internal;
-
- err = unzGoToFirstFile2(file, NULL, current_filename, sizeof(current_filename) - 1, NULL, 0, NULL, 0);
-
- while (err == UNZ_OK) {
- if (filename_compare_func != NULL)
- err = filename_compare_func(file, current_filename, filename);
- else
- err = strcmp(current_filename, filename);
- if (err == 0)
- return UNZ_OK;
- err = unzGoToNextFile2(file, NULL, current_filename, sizeof(current_filename) - 1, NULL, 0, NULL, 0);
- }
-
- /* We failed, so restore the state of the 'current file' to where we were. */
- s->num_file = num_file_saved;
- s->pos_in_central_dir = pos_in_central_dir_saved;
- s->cur_file_info = cur_file_info_saved;
- s->cur_file_info_internal = cur_file_info_internal_saved;
- return err;
-}
-
-extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos *file_pos)
-{
- unz64_file_pos file_pos64;
- int err = unzGetFilePos64(file, &file_pos64);
- if (err == UNZ_OK) {
- file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
- file_pos->num_of_file = (uLong)file_pos64.num_of_file;
- }
- return err;
-}
-
-extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos *file_pos)
-{
- unz64_file_pos file_pos64;
-
- if (file_pos == NULL)
- return UNZ_PARAMERROR;
- file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
- file_pos64.num_of_file = file_pos->num_of_file;
- return unzGoToFilePos64(file, &file_pos64);
-}
-
-extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos *file_pos)
-{
- unz64_s *s;
-
- if (file == NULL || file_pos == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- if (!s->current_file_ok)
- return UNZ_END_OF_LIST_OF_FILE;
-
- file_pos->pos_in_zip_directory = s->pos_in_central_dir;
- file_pos->num_of_file = s->num_file;
-
- return UNZ_OK;
-}
-
-extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos *file_pos)
-{
- unz64_s *s;
- int err;
-
- if (file == NULL || file_pos == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
-
- /* jump to the right spot */
- s->pos_in_central_dir = file_pos->pos_in_zip_directory;
- s->num_file = file_pos->num_of_file;
-
- /* set the current file */
- err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
- /* return results */
- s->current_file_ok = (err == UNZ_OK);
- return err;
-}
-
-extern uLong ZEXPORT unzGetOffset(unzFile file)
-{
- ZPOS64_T offset64;
-
- if (file == NULL)
- return 0; /* UNZ_PARAMERROR; */
- offset64 = unzGetOffset64(file);
- return (uLong)offset64;
-}
-
-extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)
-{
- unz64_s *s;
-
- if (file == NULL)
- return 0; /* UNZ_PARAMERROR; */
- s = (unz64_s *)file;
- if (!s->current_file_ok)
- return 0;
- if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
- if (s->num_file == s->gi.number_entry)
- return 0;
- return s->pos_in_central_dir;
-}
-
-extern int ZEXPORT unzSetOffset(unzFile file, uLong pos)
-{
- return unzSetOffset64(file, pos);
-}
-
-extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)
-{
- unz64_s *s;
- int err;
-
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
-
- s->pos_in_central_dir = pos;
- s->num_file = s->gi.number_entry; /* hack */
- err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
- s->current_file_ok = (err == UNZ_OK);
- return err;
-}
-
-extern z_off_t ZEXPORT unztell(unzFile file)
-{
- unz64_s *s;
- file_in_zip64_read_info_s *pfile_in_zip_read_info;
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- pfile_in_zip_read_info = s->pfile_in_zip_read;
- if (pfile_in_zip_read_info == NULL)
- return UNZ_PARAMERROR;
- return (z_off_t)pfile_in_zip_read_info->stream.total_out;
-}
-
-extern ZPOS64_T ZEXPORT unztell64(unzFile file)
-{
-
- unz64_s *s;
- file_in_zip64_read_info_s *pfile_in_zip_read_info;
- if (file == NULL)
- return (ZPOS64_T)-1;
- s = (unz64_s *)file;
- pfile_in_zip_read_info = s->pfile_in_zip_read;
-
- if (pfile_in_zip_read_info == NULL)
- return (ZPOS64_T)-1;
-
- return pfile_in_zip_read_info->total_out_64;
-}
-
-extern int ZEXPORT unzeof(unzFile file)
-{
- unz64_s *s;
- file_in_zip64_read_info_s *pfile_in_zip_read_info;
- if (file == NULL)
- return UNZ_PARAMERROR;
- s = (unz64_s *)file;
- pfile_in_zip_read_info = s->pfile_in_zip_read;
-
- if (pfile_in_zip_read_info == NULL)
- return UNZ_PARAMERROR;
-
- if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
- return 1;
- return 0;
-}
-
diff --git a/ios/CodePush/SSZipArchive/minizip/unzip.h b/ios/CodePush/SSZipArchive/minizip/unzip.h
deleted file mode 100644
index 02c4c5819..000000000
--- a/ios/CodePush/SSZipArchive/minizip/unzip.h
+++ /dev/null
@@ -1,248 +0,0 @@
-/* unzip.h -- IO for uncompress .zip files using zlib
- Version 1.1, February 14h, 2010
- part of the MiniZip project
-
- Copyright (C) 1998-2010 Gilles Vollant
- http://www.winimage.com/zLibDll/minizip.html
- Modifications of Unzip for Zip64
- Copyright (C) 2007-2008 Even Rouault
- Modifications for Zip64 support on both zip and unzip
- Copyright (C) 2009-2010 Mathias Svensson
- http://result42.com
-
- This program is distributed under the terms of the same license as zlib.
- See the accompanying LICENSE file for the full text of the license.
-*/
-
-#include "Common.h"
-
-#ifndef _UNZ_H
-#define _UNZ_H
-
-#define HAVE_AES
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef _ZLIB_H
-#include "zlib.h"
-#endif
-
-#ifndef _ZLIBIOAPI_H
-#include "ioapi.h"
-#endif
-
-#ifdef HAVE_BZIP2
-#include "bzlib.h"
-#endif
-
-#define Z_BZIP2ED 12
-
-#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
-/* like the STRICT of WIN32, we define a pointer that cannot be converted
- from (void*) without cast */
-typedef struct TagunzFile__ { int unused; } unzFile__;
-typedef unzFile__ *unzFile;
-#else
-typedef voidp unzFile;
-#endif
-
-
-#define UNZ_OK (0)
-#define UNZ_END_OF_LIST_OF_FILE (-100)
-#define UNZ_ERRNO (Z_ERRNO)
-#define UNZ_EOF (0)
-#define UNZ_PARAMERROR (-102)
-#define UNZ_BADZIPFILE (-103)
-#define UNZ_INTERNALERROR (-104)
-#define UNZ_CRCERROR (-105)
-
-
-/***************************************************************************/
-/* Opening and close a zip file */
-
-extern unzFile ZEXPORT unzOpen OF((const char *path));
-extern unzFile ZEXPORT unzOpen64 OF((const void *path));
-/* Open a Zip file.
-
- path should contain the full pathname (by example, on a Windows XP computer
- "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip".
- return NULL if zipfile cannot be opened or doesn't exist
- return unzFile handle if no error
-
- NOTE: The "64" function take a const void* pointer, because the path is just the value passed to the
- open64_file_func callback. Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path
- is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* does not describe the reality */
-
-extern unzFile ZEXPORT unzOpen2 OF((const char *path, zlib_filefunc_def* pzlib_filefunc_def));
-/* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write operations */
-extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, zlib_filefunc64_def* pzlib_filefunc_def));
-/* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write 64-bit operations */
-
-extern int ZEXPORT unzClose OF((unzFile file));
-/* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile,
- these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
-
- return UNZ_OK if there is no error */
-
-extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info));
-extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, unz_global_info64 *pglobal_info));
-/* Write info about the ZipFile in the *pglobal_info structure.
-
- return UNZ_OK if no error */
-
-extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *comment, uLong comment_size));
-/* Get the global comment string of the ZipFile, in the comment buffer.
-
- uSizeBuf is the size of the szComment buffer.
- return the number of byte copied or an error code <0 */
-
-/***************************************************************************/
-/* Reading the content of the current zipfile, you can open it, read data from it, and close it
- (you can close it before reading all the file) */
-
-extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
-/* Open for reading data the current file in the zipfile.
-
- return UNZ_OK if no error */
-
-extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password));
-/* Open for reading data the current file in the zipfile.
- password is a crypting password
-
- return UNZ_OK if no error */
-
-extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw));
-/* Same as unzOpenCurrentFile, but open for read raw the file (not uncompress)
- if raw==1 *method will receive method of compression, *level will receive level of compression
-
- NOTE: you can set level parameter as NULL (if you did not want known level,
- but you CANNOT set method parameter as NULL */
-
-extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password));
-/* Same as unzOpenCurrentFile, but takes extra parameter password for encrypted files */
-
-extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len));
-/* Read bytes from the current file (opened by unzOpenCurrentFile)
- buf contain buffer where data must be copied
- len the size of buf.
-
- return the number of byte copied if somes bytes are copied
- return 0 if the end of file was reached
- return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */
-
-extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *filename,
- uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
-extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
- uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
-/* Get Info about the current file
-
- pfile_info if != NULL, the *pfile_info structure will contain somes info about the current file
- filename if != NULL, the file name string will be copied in filename
- filename_size is the size of the filename buffer
- extrafield if != NULL, the extra field information from the central header will be copied in to
- extrafield_size is the size of the extraField buffer
- comment if != NULL, the comment string of the file will be copied in to
- comment_size is the size of the comment buffer */
-
-extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file));
-
-extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len));
-/* Read extra field from the current file (opened by unzOpenCurrentFile)
- This is the local-header version of the extra field (sometimes, there is
- more info in the local-header version than in the central-header)
-
- if buf == NULL, it return the size of the local extra field
- if buf != NULL, len is the size of the buffer, the extra header is copied in buf.
-
- return number of bytes copied in buf, or (if <0) the error code */
-
-extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
-/* Close the file in zip opened with unzOpenCurrentFile
-
- return UNZ_CRCERROR if all the file was read but the CRC is not good */
-
-/***************************************************************************/
-/* Browse the directory of the zipfile */
-
-typedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2);
-typedef int (*unzIteratorFunction)(unzFile file);
-typedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename,
- uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size);
-
-extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
-/* Set the current file of the zipfile to the first file.
-
- return UNZ_OK if no error */
-
-extern int ZEXPORT unzGoToFirstFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
- uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
-/* Set the current file of the zipfile to the first file and retrieves the current info on success.
- Not as seek intensive as unzGoToFirstFile + unzGetCurrentFileInfo.
-
- return UNZ_OK if no error */
-
-extern int ZEXPORT unzGoToNextFile OF((unzFile file));
-/* Set the current file of the zipfile to the next file.
-
- return UNZ_OK if no error
- return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */
-
-extern int ZEXPORT unzGoToNextFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
- uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
-/* Set the current file of the zipfile to the next file and retrieves the current
- info on success. Does less seeking around than unzGotoNextFile + unzGetCurrentFileInfo.
-
- return UNZ_OK if no error
- return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */
-
-extern int ZEXPORT unzLocateFile OF((unzFile file, const char *filename, unzFileNameComparer filename_compare_func));
-/* Try locate the file szFileName in the zipfile. For custom filename comparison pass in comparison function.
-
- return UNZ_OK if the file is found (it becomes the current file)
- return UNZ_END_OF_LIST_OF_FILE if the file is not found */
-
-/***************************************************************************/
-/* Raw access to zip file */
-
-typedef struct unz_file_pos_s
-{
- uLong pos_in_zip_directory; /* offset in zip file directory */
- uLong num_of_file; /* # of file */
-} unz_file_pos;
-
-extern int ZEXPORT unzGetFilePos OF((unzFile file, unz_file_pos* file_pos));
-extern int ZEXPORT unzGoToFilePos OF((unzFile file, unz_file_pos* file_pos));
-
-typedef struct unz64_file_pos_s
-{
- ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */
- ZPOS64_T num_of_file; /* # of file */
-} unz64_file_pos;
-
-extern int ZEXPORT unzGetFilePos64 OF((unzFile file, unz64_file_pos* file_pos));
-extern int ZEXPORT unzGoToFilePos64 OF((unzFile file, const unz64_file_pos* file_pos));
-
-extern uLong ZEXPORT unzGetOffset OF((unzFile file));
-extern ZPOS64_T ZEXPORT unzGetOffset64 OF((unzFile file));
-/* Get the current file offset */
-
-extern int ZEXPORT unzSetOffset OF((unzFile file, uLong pos));
-extern int ZEXPORT unzSetOffset64 OF((unzFile file, ZPOS64_T pos));
-/* Set the current file offset */
-
-extern z_off_t ZEXPORT unztell OF((unzFile file));
-extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file));
-/* return current position in uncompressed data */
-
-extern int ZEXPORT unzeof OF((unzFile file));
-/* return 1 if the end of file was reached, 0 elsewhere */
-
-/***************************************************************************/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _UNZ_H */
diff --git a/ios/CodePush/SSZipArchive/minizip/zip.c b/ios/CodePush/SSZipArchive/minizip/zip.c
deleted file mode 100644
index 3a3b16b9e..000000000
--- a/ios/CodePush/SSZipArchive/minizip/zip.c
+++ /dev/null
@@ -1,1910 +0,0 @@
-/* zip.c -- IO on .zip files using zlib
- Version 1.1, February 14h, 2010
- part of the MiniZip project
-
- Copyright (C) 1998-2010 Gilles Vollant
- http://www.winimage.com/zLibDll/minizip.html
- Modifications for Zip64 support
- Copyright (C) 2009-2010 Mathias Svensson
- http://result42.com
- Modifications for AES, PKWARE disk spanning
- Copyright (C) 2010-2014 Nathan Moinvaziri
-
- This program is distributed under the terms of the same license as zlib.
- See the accompanying LICENSE file for the full text of the license.
- */
-
-#include
-#include
-#include
-#include
-#include "zlib.h"
-#include "zip.h"
-
-#ifdef STDC
-# include
-# include
-# include
-#endif
-#ifdef NO_ERRNO_H
-extern int errno;
-#else
-# include
-#endif
-
-#ifdef HAVE_AES
-# define AES_METHOD (99)
-# define AES_PWVERIFYSIZE (2)
-# define AES_AUTHCODESIZE (10)
-# define AES_MAXSALTLENGTH (16)
-# define AES_VERSION (0x0001)
-# define AES_ENCRYPTIONMODE (0x03)
-
-# include "aes.h"
-# include "fileenc.h"
-# include "prng.h"
-# include "entropy.h"
-#endif
-
-#ifndef NOCRYPT
-# define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
-# include "crypt.h"
-#endif
-
-#ifndef local
-# define local static
-#endif
-/* compile with -Dlocal if your debugger can't find static symbols */
-
-#define SIZEDATA_INDATABLOCK (4096 - (4 * 4))
-
-#define DISKHEADERMAGIC (0x08074b50)
-#define LOCALHEADERMAGIC (0x04034b50)
-#define CENTRALHEADERMAGIC (0x02014b50)
-#define ENDHEADERMAGIC (0x06054b50)
-#define ZIP64ENDHEADERMAGIC (0x06064b50)
-#define ZIP64ENDLOCHEADERMAGIC (0x07064b50)
-
-#define FLAG_LOCALHEADER_OFFSET (0x06)
-#define CRC_LOCALHEADER_OFFSET (0x0e)
-
-#define SIZECENTRALHEADER (0x2e) /* 46 */
-#define SIZECENTRALHEADERLOCATOR (0x14) /* 20 */
-#define SIZECENTRALDIRITEM (0x2e)
-#define SIZEZIPLOCALHEADER (0x1e)
-
-#ifndef BUFREADCOMMENT
-# define BUFREADCOMMENT (0x400)
-#endif
-#ifndef VERSIONMADEBY
-# define VERSIONMADEBY (0x0) /* platform dependent */
-#endif
-
-#ifndef Z_BUFSIZE
-# define Z_BUFSIZE (64 * 1024)
-#endif
-#ifndef Z_MAXFILENAMEINZIP
-# define Z_MAXFILENAMEINZIP (256)
-#endif
-
-#ifndef ALLOC
-# define ALLOC(size) (malloc(size))
-#endif
-#ifndef TRYFREE
-# define TRYFREE(p) {if (p) free(p); }
-#endif
-
-/* NOT sure that this work on ALL platform */
-#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32))
-
-#ifndef DEF_MEM_LEVEL
-# if MAX_MEM_LEVEL >= 8
-# define DEF_MEM_LEVEL 8
-# else
-# define DEF_MEM_LEVEL MAX_MEM_LEVEL
-# endif
-#endif
-
-const char zip_copyright[] = " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
-
-typedef struct linkedlist_datablock_internal_s {
- struct linkedlist_datablock_internal_s *next_datablock;
- uLong avail_in_this_block;
- uLong filled_in_this_block;
- uLong unused; /* for future use and alignment */
- unsigned char data[SIZEDATA_INDATABLOCK];
-} linkedlist_datablock_internal;
-
-typedef struct linkedlist_data_s {
- linkedlist_datablock_internal *first_block;
- linkedlist_datablock_internal *last_block;
-} linkedlist_data;
-
-typedef struct {
- z_stream stream; /* zLib stream structure for inflate */
-#ifdef HAVE_BZIP2
- bz_stream bstream; /* bzLib stream structure for bziped */
-#endif
-#ifdef HAVE_AES
- fcrypt_ctx aes_ctx;
- prng_ctx aes_rng[1];
-#endif
- int stream_initialised; /* 1 is stream is initialized */
- uInt pos_in_buffered_data; /* last written byte in buffered_data */
-
- ZPOS64_T pos_local_header; /* offset of the local header of the file currently writing */
- char *central_header; /* central header data for the current file */
- uLong size_centralextra;
- uLong size_centralheader; /* size of the central header for cur file */
- uLong size_centralextrafree; /* Extra bytes allocated to the central header but that are not used */
- uLong size_comment;
- uLong flag; /* flag of the file currently writing */
-
- int method; /* compression method written to file.*/
- int compression_method; /* compression method to use */
- int raw; /* 1 for directly writing raw data */
- Byte buffered_data[Z_BUFSIZE]; /* buffer contain compressed data to be writ*/
- uLong dosDate;
- uLong crc32;
- int zip64; /* Add ZIP64 extended information in the extra field */
- uLong number_disk; /* number of current disk used for spanning ZIP */
- ZPOS64_T pos_zip64extrainfo;
- ZPOS64_T total_compressed;
- ZPOS64_T total_uncompressed;
-#ifndef NOCRYPT
- unsigned long keys[3]; /* keys defining the pseudo-random sequence */
- const unsigned long *pcrc_32_tab;
- int crypt_header_size;
-#endif
-} curfile64_info;
-
-typedef struct {
- zlib_filefunc64_32_def z_filefunc;
- voidpf filestream; /* io structure of the zipfile */
- voidpf filestream_with_CD; /* io structure of the zipfile with the central dir */
- linkedlist_data central_dir; /* datablock with central dir in construction*/
- int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/
- int append; /* append mode */
- curfile64_info ci; /* info on the file currently writing */
-
- ZPOS64_T begin_pos; /* position of the beginning of the zipfile */
- ZPOS64_T add_position_when_writting_offset;
- ZPOS64_T number_entry;
- ZPOS64_T disk_size; /* size of each disk */
- uLong number_disk; /* number of the current disk, used for spanning ZIP */
- uLong number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP */
-#ifndef NO_ADDFILEINEXISTINGZIP
- char *globalcomment;
-#endif
-} zip64_internal;
-
-/* Allocate a new data block */
-local linkedlist_datablock_internal *allocate_new_datablock OF(());
-local linkedlist_datablock_internal *allocate_new_datablock()
-{
- linkedlist_datablock_internal *ldi;
-
- ldi = (linkedlist_datablock_internal *)ALLOC(sizeof(linkedlist_datablock_internal));
-
- if (ldi != NULL) {
- ldi->next_datablock = NULL;
- ldi->filled_in_this_block = 0;
- ldi->avail_in_this_block = SIZEDATA_INDATABLOCK;
- }
- return ldi;
-}
-
-/* Free data block in linked list */
-local void free_datablock OF((linkedlist_datablock_internal * ldi));
-local void free_datablock(linkedlist_datablock_internal *ldi)
-{
- while (ldi != NULL) {
- linkedlist_datablock_internal *ldinext = ldi->next_datablock;
- TRYFREE(ldi);
- ldi = ldinext;
- }
-}
-
-/* Initialize linked list */
-local void init_linkedlist OF((linkedlist_data * ll));
-local void init_linkedlist(linkedlist_data *ll)
-{
- ll->first_block = ll->last_block = NULL;
-}
-
-/* Free entire linked list and all data blocks */
-local void free_linkedlist OF((linkedlist_data * ll));
-local void free_linkedlist(linkedlist_data *ll)
-{
- free_datablock(ll->first_block);
- ll->first_block = ll->last_block = NULL;
-}
-
-/* Add data to linked list data block */
-local int add_data_in_datablock OF((linkedlist_data * ll, const void *buf, uLong len));
-local int add_data_in_datablock(linkedlist_data *ll, const void *buf, uLong len)
-{
- linkedlist_datablock_internal *ldi;
- const unsigned char *from_copy;
-
- if (ll == NULL)
- return ZIP_INTERNALERROR;
-
- if (ll->last_block == NULL) {
- ll->first_block = ll->last_block = allocate_new_datablock();
- if (ll->first_block == NULL)
- return ZIP_INTERNALERROR;
- }
-
- ldi = ll->last_block;
- from_copy = (unsigned char *)buf;
-
- while (len > 0) {
- uInt copy_this;
- uInt i;
- unsigned char *to_copy;
-
- if (ldi->avail_in_this_block == 0) {
- ldi->next_datablock = allocate_new_datablock();
- if (ldi->next_datablock == NULL)
- return ZIP_INTERNALERROR;
- ldi = ldi->next_datablock;
- ll->last_block = ldi;
- }
-
- if (ldi->avail_in_this_block < len)
- copy_this = (uInt)ldi->avail_in_this_block;
- else
- copy_this = (uInt)len;
-
- to_copy = &(ldi->data[ldi->filled_in_this_block]);
-
- for (i = 0; i < copy_this; i++)
- *(to_copy + i) = *(from_copy + i);
-
- ldi->filled_in_this_block += copy_this;
- ldi->avail_in_this_block -= copy_this;
- from_copy += copy_this;
- len -= copy_this;
- }
- return ZIP_OK;
-}
-
-local uLong zip64local_TmzDateToDosDate OF((const tm_zip * ptm));
-local uLong zip64local_TmzDateToDosDate(const tm_zip *ptm)
-{
- uLong year;
-#define zip64local_in_range(min, max, value) ((min) <= (value) && (value) <= (max))
- /* Years supported:
- * [00, 79] (assumed to be between 2000 and 2079)
- * [80, 207] (assumed to be between 1980 and 2107, typical output of old
- software that does 'year-1900' to get a double digit year)
- * [1980, 2107]
- Due to the date format limitations, only years between 1980 and 2107 can be stored.
- */
- if (!(zip64local_in_range(1980, 2107, ptm->tm_year) || zip64local_in_range(0, 207, ptm->tm_year)) ||
- !zip64local_in_range(0, 11, ptm->tm_mon) ||
- !zip64local_in_range(1, 31, ptm->tm_mday) ||
- !zip64local_in_range(0, 23, ptm->tm_hour) ||
- !zip64local_in_range(0, 59, ptm->tm_min) ||
- !zip64local_in_range(0, 59, ptm->tm_sec))
- return 0;
-#undef zip64local_in_range
-
- year = (uLong)ptm->tm_year;
- if (year >= 1980) /* range [1980, 2107] */
- year -= 1980;
- else if (year >= 80) /* range [80, 99] */
- year -= 80;
- else /* range [00, 79] */
- year += 20;
-
- return
- (uLong)(((ptm->tm_mday) + (32 * (ptm->tm_mon + 1)) + (512 * year)) << 16) |
- ((ptm->tm_sec / 2) + (32 * ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
-}
-
-/* Inputs a long in LSB order to the given file: nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) */
-local int zip64local_putValue OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream,
- ZPOS64_T x, int nbByte));
-local int zip64local_putValue(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream,
- ZPOS64_T x, int nbByte)
-{
- unsigned char buf[8];
- int n;
- for (n = 0; n < nbByte; n++) {
- buf[n] = (unsigned char)(x & 0xff);
- x >>= 8;
- }
- if (x != 0) {
- /* data overflow - hack for ZIP64 (X Roche) */
- for (n = 0; n < nbByte; n++) {
- buf[n] = 0xff;
- }
- }
-
- if (ZWRITE64(*pzlib_filefunc_def, filestream, buf, nbByte) != (uLong)nbByte)
- return ZIP_ERRNO;
-
- return ZIP_OK;
-}
-
-local void zip64local_putValue_inmemory OF((void *dest, ZPOS64_T x, int nbByte));
-local void zip64local_putValue_inmemory(void *dest, ZPOS64_T x, int nbByte)
-{
- unsigned char *buf = (unsigned char *)dest;
- int n;
- for (n = 0; n < nbByte; n++) {
- buf[n] = (unsigned char)(x & 0xff);
- x >>= 8;
- }
-
- if (x != 0) {
- /* data overflow - hack for ZIP64 */
- for (n = 0; n < nbByte; n++) {
- buf[n] = 0xff;
- }
- }
-}
-
-local int zip64local_getByte OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, int *pi));
-local int zip64local_getByte(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, int *pi)
-{
- unsigned char c;
- int err = (int)ZREAD64(*pzlib_filefunc_def, filestream, &c, 1);
- if (err == 1) {
- *pi = (int)c;
- return ZIP_OK;
- }
- if (ZERROR64(*pzlib_filefunc_def, filestream))
- return ZIP_ERRNO;
- return ZIP_EOF;
-}
-
-local int zip64local_getShort OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));
-local int zip64local_getShort(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)
-{
- uLong x;
- int i = 0;
- int err;
-
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x = (uLong)i;
- if (err == ZIP_OK)
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((uLong)i) << 8;
-
- if (err == ZIP_OK)
- *pX = x;
- else
- *pX = 0;
- return err;
-}
-
-local int zip64local_getLong OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));
-local int zip64local_getLong(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)
-{
- uLong x;
- int i = 0;
- int err;
-
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x = (uLong)i;
- if (err == ZIP_OK)
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((uLong)i) << 8;
- if (err == ZIP_OK)
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((uLong)i) << 16;
- if (err == ZIP_OK)
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((uLong)i) << 24;
-
- if (err == ZIP_OK)
- *pX = x;
- else
- *pX = 0;
- return err;
-}
-
-local int zip64local_getLong64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, ZPOS64_T * pX));
-local int zip64local_getLong64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)
-{
- ZPOS64_T x;
- int i = 0;
- int err;
-
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x = (ZPOS64_T)i;
- if (err == ZIP_OK)
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((ZPOS64_T)i) << 8;
- if (err == ZIP_OK)
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((ZPOS64_T)i) << 16;
- if (err == ZIP_OK)
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((ZPOS64_T)i) << 24;
- if (err == ZIP_OK)
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((ZPOS64_T)i) << 32;
- if (err == ZIP_OK)
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((ZPOS64_T)i) << 40;
- if (err == ZIP_OK)
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((ZPOS64_T)i) << 48;
- if (err == ZIP_OK)
- err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
- x += ((ZPOS64_T)i) << 56;
-
- if (err == ZIP_OK)
- *pX = x;
- else
- *pX = 0;
-
- return err;
-}
-
-/* Gets the amount of bytes left to write to the current disk for spanning archives */
-local int zipGetDiskSizeAvailable OF((zipFile file, ZPOS64_T * size_available));
-local int zipGetDiskSizeAvailable(zipFile file, ZPOS64_T *size_available)
-{
- zip64_internal *zi;
- ZPOS64_T current_disk_size;
-
- zi = (zip64_internal *)file;
- ZSEEK64(zi->z_filefunc, zi->filestream, 0, ZLIB_FILEFUNC_SEEK_END);
- current_disk_size = ZTELL64(zi->z_filefunc, zi->filestream);
- *size_available = zi->disk_size - current_disk_size;
- return ZIP_OK;
-}
-
-/* Goes to a specific disk number for spanning archives */
-local int zipGoToSpecificDisk OF((zipFile file, int number_disk, int open_existing));
-local int zipGoToSpecificDisk(zipFile file, int number_disk, int open_existing)
-{
- zip64_internal *zi;
- int err = ZIP_OK;
-
- zi = (zip64_internal *)file;
- if (zi->disk_size == 0)
- return err;
-
- if ((zi->filestream != NULL) && (zi->filestream != zi->filestream_with_CD))
- ZCLOSE64(zi->z_filefunc, zi->filestream);
-
- zi->filestream = ZOPENDISK64(zi->z_filefunc, zi->filestream_with_CD, number_disk, (open_existing == 1) ?
- (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING) :
- (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE));
-
- if (zi->filestream == NULL)
- err = ZIP_ERRNO;
-
- return err;
-}
-
-/* Goes to the first disk in a spanned archive */
-local int zipGoToFirstDisk OF((zipFile file));
-local int zipGoToFirstDisk(zipFile file)
-{
- zip64_internal *zi;
- int number_disk_next;
- int err = ZIP_OK;
-
- zi = (zip64_internal *)file;
-
- if (zi->disk_size == 0)
- return err;
- number_disk_next = 0;
- if (zi->number_disk_with_CD > 0)
- number_disk_next = (int)zi->number_disk_with_CD - 1;
- err = zipGoToSpecificDisk(file, number_disk_next, (zi->append == APPEND_STATUS_ADDINZIP));
- if ((err == ZIP_ERRNO) && (zi->append == APPEND_STATUS_ADDINZIP))
- err = zipGoToSpecificDisk(file, number_disk_next, 0);
- if (err == ZIP_OK)
- zi->number_disk = number_disk_next;
- ZSEEK64(zi->z_filefunc, zi->filestream, 0, ZLIB_FILEFUNC_SEEK_END);
- return err;
-}
-
-/* Goes to the next disk in a spanned archive */
-local int zipGoToNextDisk OF((zipFile file));
-local int zipGoToNextDisk(zipFile file)
-{
- zip64_internal *zi;
- ZPOS64_T size_available_in_disk;
- int err = ZIP_OK;
- int number_disk_next;
-
- zi = (zip64_internal *)file;
-
- if (zi->disk_size == 0)
- return err;
-
- number_disk_next = (int)zi->number_disk + 1;
-
- do {
- err = zipGoToSpecificDisk(file, number_disk_next, (zi->append == APPEND_STATUS_ADDINZIP));
- if ((err == ZIP_ERRNO) && (zi->append == APPEND_STATUS_ADDINZIP))
- err = zipGoToSpecificDisk(file, number_disk_next, 0);
- if (err != ZIP_OK)
- break;
- err = zipGetDiskSizeAvailable(file, &size_available_in_disk);
- if (err != ZIP_OK)
- break;
- zi->number_disk = number_disk_next;
- zi->number_disk_with_CD = zi->number_disk + 1;
-
- number_disk_next += 1;
- } while (size_available_in_disk <= 0);
-
- return err;
-}
-
-/* Locate the Central directory of a zipfile (at the end, just before the global comment) */
-local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream));
-local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream)
-{
- unsigned char *buf;
- ZPOS64_T file_size;
- ZPOS64_T back_read = 4;
- ZPOS64_T max_back = 0xffff; /* maximum size of global comment */
- ZPOS64_T pos_found = 0;
- uLong read_size;
- ZPOS64_T read_pos;
- int i;
-
- buf = (unsigned char *)ALLOC(BUFREADCOMMENT + 4);
- if (buf == NULL)
- return 0;
-
- if (ZSEEK64(*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0) {
- TRYFREE(buf);
- return 0;
- }
-
- file_size = ZTELL64(*pzlib_filefunc_def, filestream);
-
- if (max_back > file_size)
- max_back = file_size;
-
- while (back_read < max_back) {
- if (back_read + BUFREADCOMMENT > max_back)
- back_read = max_back;
- else
- back_read += BUFREADCOMMENT;
-
- read_pos = file_size - back_read;
- read_size = ((BUFREADCOMMENT + 4) < (file_size - read_pos)) ?
- (BUFREADCOMMENT + 4) : (uLong)(file_size - read_pos);
-
- if (ZSEEK64(*pzlib_filefunc_def, filestream, read_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
- break;
- if (ZREAD64(*pzlib_filefunc_def, filestream, buf, read_size) != read_size)
- break;
-
- for (i = (int)read_size - 3; (i--) > 0; )
- if ((*(buf + i)) == (ENDHEADERMAGIC & 0xff) &&
- (*(buf + i + 1)) == (ENDHEADERMAGIC >> 8 & 0xff) &&
- (*(buf + i + 2)) == (ENDHEADERMAGIC >> 16 & 0xff) &&
- (*(buf + i + 3)) == (ENDHEADERMAGIC >> 24 & 0xff)) {
- pos_found = read_pos + i;
- break;
- }
-
- if (pos_found != 0)
- break;
- }
- TRYFREE(buf);
- return pos_found;
-}
-
-/* Locate the Central directory 64 of a zipfile (at the end, just before the global comment) */
-local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream,
- const ZPOS64_T endcentraloffset));
-local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream,
- const ZPOS64_T endcentraloffset)
-{
- ZPOS64_T offset;
- uLong uL;
-
- /* Zip64 end of central directory locator */
- if (ZSEEK64(*pzlib_filefunc_def, filestream, endcentraloffset - SIZECENTRALHEADERLOCATOR, ZLIB_FILEFUNC_SEEK_SET) != 0)
- return 0;
-
- /* read locator signature */
- if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
- return 0;
- if (uL != ZIP64ENDLOCHEADERMAGIC)
- return 0;
- /* number of the disk with the start of the zip64 end of central directory */
- if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
- return 0;
- /* relative offset of the zip64 end of central directory record */
- if (zip64local_getLong64(pzlib_filefunc_def, filestream, &offset) != ZIP_OK)
- return 0;
- /* total number of disks */
- if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
- return 0;
- /* Goto end of central directory record */
- if (ZSEEK64(*pzlib_filefunc_def, filestream, offset, ZLIB_FILEFUNC_SEEK_SET) != 0)
- return 0;
- /* the signature */
- if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
- return 0;
- if (uL != ZIP64ENDHEADERMAGIC)
- return 0;
-
- return offset;
-}
-
-extern zipFile ZEXPORT zipOpen4(const void *pathname, int append, ZPOS64_T disk_size, zipcharpc *globalcomment,
- zlib_filefunc64_32_def *pzlib_filefunc64_32_def)
-{
- zip64_internal ziinit;
- zip64_internal *zi;
-#ifndef NO_ADDFILEINEXISTINGZIP
- ZPOS64_T byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx)*/
- ZPOS64_T size_central_dir = 0; /* size of the central directory */
- ZPOS64_T offset_central_dir = 0; /* offset of start of central directory */
- ZPOS64_T number_entry_CD = 0; /* total number of entries in the central dir */
- ZPOS64_T number_entry;
- ZPOS64_T central_pos;
- ZPOS64_T size_central_dir_to_read;
- uLong uL;
- uLong size_comment = 0;
- size_t buf_size = SIZEDATA_INDATABLOCK;
- void *buf_read;
-#endif
- int err = ZIP_OK;
- int mode;
-
- ziinit.z_filefunc.zseek32_file = NULL;
- ziinit.z_filefunc.ztell32_file = NULL;
- if (pzlib_filefunc64_32_def == NULL)
- fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64);
- else
- ziinit.z_filefunc = *pzlib_filefunc64_32_def;
-
- if (append == APPEND_STATUS_CREATE)
- mode = (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE);
- else
- mode = (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING);
-
- ziinit.filestream = ZOPEN64(ziinit.z_filefunc, pathname, mode);
- if (ziinit.filestream == NULL)
- return NULL;
-
- if (append == APPEND_STATUS_CREATEAFTER) {
- /* Don't support spanning ZIP with APPEND_STATUS_CREATEAFTER */
- if (disk_size > 0)
- return NULL;
-
- ZSEEK64(ziinit.z_filefunc, ziinit.filestream, 0, SEEK_END);
- }
-
- ziinit.filestream_with_CD = ziinit.filestream;
- ziinit.append = append;
- ziinit.number_disk = 0;
- ziinit.number_disk_with_CD = 0;
- ziinit.disk_size = disk_size;
- ziinit.begin_pos = ZTELL64(ziinit.z_filefunc, ziinit.filestream);
- ziinit.in_opened_file_inzip = 0;
- ziinit.ci.stream_initialised = 0;
- ziinit.number_entry = 0;
- ziinit.add_position_when_writting_offset = 0;
- init_linkedlist(&(ziinit.central_dir));
-
- zi = (zip64_internal *)ALLOC(sizeof(zip64_internal));
- if (zi == NULL) {
- ZCLOSE64(ziinit.z_filefunc, ziinit.filestream);
- return NULL;
- }
-
-#ifndef NO_ADDFILEINEXISTINGZIP
- /* Add file in a zipfile */
- ziinit.globalcomment = NULL;
- if (append == APPEND_STATUS_ADDINZIP) {
- /* Read and Cache Central Directory Records */
- central_pos = zip64local_SearchCentralDir(&ziinit.z_filefunc, ziinit.filestream);
- /* disable to allow appending to empty ZIP archive (must be standard zip, not zip64)
- if (central_pos == 0)
- err = ZIP_ERRNO;
- */
-
- if (err == ZIP_OK) {
- /* read end of central directory info */
- if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
- err = ZIP_ERRNO;
-
- /* the signature, already checked */
- if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
- err = ZIP_ERRNO;
- /* number of this disk */
- if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk) != ZIP_OK)
- err = ZIP_ERRNO;
- /* number of the disk with the start of the central directory */
- if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk_with_CD) != ZIP_OK)
- err = ZIP_ERRNO;
- /* total number of entries in the central dir on this disk */
- number_entry = 0;
- if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
- err = ZIP_ERRNO;
- else
- number_entry = uL;
- /* total number of entries in the central dir */
- number_entry_CD = 0;
- if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
- err = ZIP_ERRNO;
- else
- number_entry_CD = uL;
- if (number_entry_CD != number_entry)
- err = ZIP_BADZIPFILE;
- /* size of the central directory */
- size_central_dir = 0;
- if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
- err = ZIP_ERRNO;
- else
- size_central_dir = uL;
- /* offset of start of central directory with respect to the starting disk number */
- offset_central_dir = 0;
- if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
- err = ZIP_ERRNO;
- else
- offset_central_dir = uL;
- /* zipfile global comment length */
- if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &size_comment) != ZIP_OK)
- err = ZIP_ERRNO;
-
- if ((err == ZIP_OK) && ((number_entry_CD == 0xffff) || (offset_central_dir == 0xffffffff))) {
- /* Format should be Zip64, as the central directory or file size is too large */
- central_pos = zip64local_SearchCentralDir64(&ziinit.z_filefunc, ziinit.filestream, central_pos);
-
- if (central_pos) {
- ZPOS64_T sizeEndOfCentralDirectory;
-
- if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
- err = ZIP_ERRNO;
-
- /* the signature, already checked */
- if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
- err = ZIP_ERRNO;
- /* size of zip64 end of central directory record */
- if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &sizeEndOfCentralDirectory) != ZIP_OK)
- err = ZIP_ERRNO;
- /* version made by */
- if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
- err = ZIP_ERRNO;
- /* version needed to extract */
- if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
- err = ZIP_ERRNO;
- /* number of this disk */
- if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk) != ZIP_OK)
- err = ZIP_ERRNO;
- /* number of the disk with the start of the central directory */
- if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk_with_CD) != ZIP_OK)
- err = ZIP_ERRNO;
- /* total number of entries in the central directory on this disk */
- if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &number_entry) != ZIP_OK)
- err = ZIP_ERRNO;
- /* total number of entries in the central directory */
- if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &number_entry_CD) != ZIP_OK)
- err = ZIP_ERRNO;
- if (number_entry_CD != number_entry)
- err = ZIP_BADZIPFILE;
- /* size of the central directory */
- if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &size_central_dir) != ZIP_OK)
- err = ZIP_ERRNO;
- /* offset of start of central directory with respect to the starting disk number */
- if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &offset_central_dir) != ZIP_OK)
- err = ZIP_ERRNO;
- } else
- err = ZIP_BADZIPFILE;
- }
- }
-
- if ((err == ZIP_OK) && (central_pos < offset_central_dir + size_central_dir))
- err = ZIP_BADZIPFILE;
-
- if (err != ZIP_OK) {
- ZCLOSE64(ziinit.z_filefunc, ziinit.filestream);
- TRYFREE(zi);
- return NULL;
- }
-
- if (size_comment > 0) {
- ziinit.globalcomment = (char *)ALLOC(size_comment + 1);
- if (ziinit.globalcomment) {
- size_comment = ZREAD64(ziinit.z_filefunc, ziinit.filestream, ziinit.globalcomment, size_comment);
- ziinit.globalcomment[size_comment] = 0;
- }
- }
-
- byte_before_the_zipfile = central_pos - (offset_central_dir + size_central_dir);
- ziinit.add_position_when_writting_offset = byte_before_the_zipfile;
-
- /* Store central directory in memory */
- size_central_dir_to_read = size_central_dir;
- buf_size = SIZEDATA_INDATABLOCK;
- buf_read = (void *)ALLOC(buf_size);
-
- if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream,
- offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
- err = ZIP_ERRNO;
-
- while ((size_central_dir_to_read > 0) && (err == ZIP_OK)) {
- ZPOS64_T read_this = SIZEDATA_INDATABLOCK;
- if (read_this > size_central_dir_to_read)
- read_this = size_central_dir_to_read;
-
- if (ZREAD64(ziinit.z_filefunc, ziinit.filestream, buf_read, (uLong)read_this) != read_this)
- err = ZIP_ERRNO;
-
- if (err == ZIP_OK)
- err = add_data_in_datablock(&ziinit.central_dir, buf_read, (uLong)read_this);
-
- size_central_dir_to_read -= read_this;
- }
- TRYFREE(buf_read);
-
- ziinit.begin_pos = byte_before_the_zipfile;
- ziinit.number_entry = number_entry_CD;
-
- if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream,
- offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
- err = ZIP_ERRNO;
- }
-
- if (globalcomment)
- *globalcomment = ziinit.globalcomment;
-#endif
-
- if (err != ZIP_OK) {
-#ifndef NO_ADDFILEINEXISTINGZIP
- TRYFREE(ziinit.globalcomment);
-#endif
- TRYFREE(zi);
- return NULL;
- }
-
- *zi = ziinit;
- zipGoToFirstDisk((zipFile)zi);
- return (zipFile)zi;
-}
-
-extern zipFile ZEXPORT zipOpen2(const char *pathname, int append, zipcharpc *globalcomment,
- zlib_filefunc_def *pzlib_filefunc32_def)
-{
- if (pzlib_filefunc32_def != NULL) {
- zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
- fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);
- return zipOpen4(pathname, append, 0, globalcomment, &zlib_filefunc64_32_def_fill);
- }
- return zipOpen4(pathname, append, 0, globalcomment, NULL);
-}
-
-extern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc *globalcomment,
- zlib_filefunc64_def *pzlib_filefunc_def)
-{
- if (pzlib_filefunc_def != NULL) {
- zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
- zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
- zlib_filefunc64_32_def_fill.ztell32_file = NULL;
- zlib_filefunc64_32_def_fill.zseek32_file = NULL;
- return zipOpen4(pathname, append, 0, globalcomment, &zlib_filefunc64_32_def_fill);
- }
- return zipOpen4(pathname, append, 0, globalcomment, NULL);
-}
-
-extern zipFile ZEXPORT zipOpen3(const char *pathname, int append, ZPOS64_T disk_size, zipcharpc *globalcomment,
- zlib_filefunc_def *pzlib_filefunc32_def)
-{
- if (pzlib_filefunc32_def != NULL) {
- zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
- fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);
- return zipOpen4(pathname, append, disk_size, globalcomment, &zlib_filefunc64_32_def_fill);
- }
- return zipOpen4(pathname, append, disk_size, globalcomment, NULL);
-}
-
-extern zipFile ZEXPORT zipOpen3_64(const void *pathname, int append, ZPOS64_T disk_size, zipcharpc *globalcomment,
- zlib_filefunc64_def *pzlib_filefunc_def)
-{
- if (pzlib_filefunc_def != NULL) {
- zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
- zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
- zlib_filefunc64_32_def_fill.ztell32_file = NULL;
- zlib_filefunc64_32_def_fill.zseek32_file = NULL;
- return zipOpen4(pathname, append, disk_size, globalcomment, &zlib_filefunc64_32_def_fill);
- }
- return zipOpen4(pathname, append, disk_size, globalcomment, NULL);
-}
-
-extern zipFile ZEXPORT zipOpen(const char *pathname, int append)
-{
- return zipOpen3((const void *)pathname, append, 0, NULL, NULL);
-}
-
-extern zipFile ZEXPORT zipOpen64(const void *pathname, int append)
-{
- return zipOpen3(pathname, append, 0, NULL, NULL);
-}
-
-extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
- const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
- uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits, int memLevel,
- int strategy, const char *password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase, int zip64)
-{
- zip64_internal *zi;
- uInt size_filename;
- uInt size_comment = 0;
- uInt i;
- int err = ZIP_OK;
- ZPOS64_T size_available;
- ZPOS64_T size_needed;
-
-#ifdef NOCRYPT
- (crcForCrypting);
- if (password != NULL)
- return ZIP_PARAMERROR;
-#endif
-
- if (file == NULL)
- return ZIP_PARAMERROR;
-
- if ((method != 0) &&
-#ifdef HAVE_BZIP2
- (method != Z_BZIP2ED) &&
-#endif
- (method != Z_DEFLATED))
- return ZIP_PARAMERROR;
-
- zi = (zip64_internal *)file;
-
- if (zi->in_opened_file_inzip == 1) {
- err = zipCloseFileInZip(file);
- if (err != ZIP_OK)
- return err;
- }
-
- if (filename == NULL)
- filename = "-";
- if (comment != NULL)
- size_comment = (uInt)strlen(comment);
-
- size_filename = (uInt)strlen(filename);
-
- if (zipfi == NULL)
- zi->ci.dosDate = 0;
- else {
- if (zipfi->dosDate != 0)
- zi->ci.dosDate = zipfi->dosDate;
- else
- zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date);
- }
-
- zi->ci.method = method;
- zi->ci.compression_method = method;
- zi->ci.crc32 = 0;
- zi->ci.stream_initialised = 0;
- zi->ci.pos_in_buffered_data = 0;
- zi->ci.raw = raw;
- zi->ci.flag = flagBase;
- if ((level == 8) || (level == 9))
- zi->ci.flag |= 2;
- if (level == 2)
- zi->ci.flag |= 4;
- if (level == 1)
- zi->ci.flag |= 6;
- if (password != NULL) {
- zi->ci.flag |= 1;
-#ifdef HAVE_AES
- zi->ci.method = AES_METHOD;
-#endif
- }
-
- if (zi->disk_size > 0) {
- if ((zi->number_disk == 0) && (zi->number_entry == 0))
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)DISKHEADERMAGIC, 4);
-
- /* Make sure enough space available on current disk for local header */
- zipGetDiskSizeAvailable((zipFile)zi, &size_available);
- size_needed = 30 + size_filename + size_extrafield_local;
- if (zi->ci.zip64)
- size_needed += 20;
-#ifdef HAVE_AES
- if (zi->ci.method == AES_METHOD)
- size_needed += 11;
-#endif
- if (size_available < size_needed)
- zipGoToNextDisk((zipFile)zi);
- }
-
- zi->ci.pos_local_header = ZTELL64(zi->z_filefunc, zi->filestream);
- zi->ci.size_comment = size_comment;
- zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global;
- zi->ci.size_centralextra = size_extrafield_global;
- zi->ci.size_centralextrafree = 32; /* Extra space reserved for ZIP64 extra info */
-#ifdef HAVE_AES
- if (zi->ci.method == AES_METHOD)
- zi->ci.size_centralextrafree += 11; /* Extra space reserved for AES extra info */
-#endif
- zi->ci.central_header = (char *)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralextrafree + size_comment);
- zi->ci.number_disk = zi->number_disk;
-
- /* Write central directory header */
- zip64local_putValue_inmemory(zi->ci.central_header, (uLong)CENTRALHEADERMAGIC, 4);
- zip64local_putValue_inmemory(zi->ci.central_header + 4, (uLong)versionMadeBy, 2);
- zip64local_putValue_inmemory(zi->ci.central_header + 6, (uLong)20, 2);
- zip64local_putValue_inmemory(zi->ci.central_header + 8, (uLong)zi->ci.flag, 2);
- zip64local_putValue_inmemory(zi->ci.central_header + 10, (uLong)zi->ci.method, 2);
- zip64local_putValue_inmemory(zi->ci.central_header + 12, (uLong)zi->ci.dosDate, 4);
- zip64local_putValue_inmemory(zi->ci.central_header + 16, (uLong)0, 4); /*crc*/
- zip64local_putValue_inmemory(zi->ci.central_header + 20, (uLong)0, 4); /*compr size*/
- zip64local_putValue_inmemory(zi->ci.central_header + 24, (uLong)0, 4); /*uncompr size*/
- zip64local_putValue_inmemory(zi->ci.central_header + 28, (uLong)size_filename, 2);
- zip64local_putValue_inmemory(zi->ci.central_header + 30, (uLong)size_extrafield_global, 2);
- zip64local_putValue_inmemory(zi->ci.central_header + 32, (uLong)size_comment, 2);
- zip64local_putValue_inmemory(zi->ci.central_header + 34, (uLong)zi->ci.number_disk, 2); /*disk nm start*/
-
- if (zipfi == NULL)
- zip64local_putValue_inmemory(zi->ci.central_header + 36, (uLong)0, 2);
- else
- zip64local_putValue_inmemory(zi->ci.central_header + 36, (uLong)zipfi->internal_fa, 2);
- if (zipfi == NULL)
- zip64local_putValue_inmemory(zi->ci.central_header + 38, (uLong)0, 4);
- else
- zip64local_putValue_inmemory(zi->ci.central_header + 38, (uLong)zipfi->external_fa, 4);
- if (zi->ci.pos_local_header >= 0xffffffff)
- zip64local_putValue_inmemory(zi->ci.central_header + 42, (uLong)0xffffffff, 4);
- else
- zip64local_putValue_inmemory(zi->ci.central_header + 42,
- (uLong)zi->ci.pos_local_header - zi->add_position_when_writting_offset, 4);
-
- for (i = 0; i < size_filename; i++)
- zi->ci.central_header[SIZECENTRALHEADER + i] = filename[i];
- for (i = 0; i < size_extrafield_global; i++)
- zi->ci.central_header[SIZECENTRALHEADER + size_filename + i] =
- ((const char *)extrafield_global)[i];
- /* Store comment at the end for later repositioning */
- for (i = 0; i < size_comment; i++)
- zi->ci.central_header[zi->ci.size_centralheader +
- zi->ci.size_centralextrafree + i] = comment[i];
-
- if (zi->ci.central_header == NULL)
- return ZIP_INTERNALERROR;
-
- zi->ci.zip64 = zip64;
- zi->ci.total_compressed = 0;
- zi->ci.total_uncompressed = 0;
- zi->ci.pos_zip64extrainfo = 0;
-
- /* Write the local header */
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)LOCALHEADERMAGIC, 4);
-
- if (err == ZIP_OK) {
- if (zi->ci.zip64)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2); /* version needed to extract */
- else
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)20, 2); /* version needed to extract */
- }
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.flag, 2);
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.method, 2);
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.dosDate, 4);
-
- /* CRC & compressed size & uncompressed size will be filled in later and rewritten later */
-
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4); /* crc 32, unknown */
- if (err == ZIP_OK) {
- if (zi->ci.zip64)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xFFFFFFFF, 4); /* compressed size, unknown */
- else
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4); /* compressed size, unknown */
- }
- if (err == ZIP_OK) {
- if (zi->ci.zip64) /* uncompressed size, unknown */
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xFFFFFFFF, 4);
- else /* uncompressed size, unknown */
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4);
- }
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_filename, 2);
- if (err == ZIP_OK) {
- ZPOS64_T size_extrafield = size_extrafield_local;
- if (zi->ci.zip64)
- size_extrafield += 20;
-#ifdef HAVE_AES
- if (zi->ci.method == AES_METHOD)
- size_extrafield += 11;
-#endif
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_extrafield, 2);
- }
- if ((err == ZIP_OK) && (size_filename > 0)) {
- if (ZWRITE64(zi->z_filefunc, zi->filestream, filename, size_filename) != size_filename)
- err = ZIP_ERRNO;
- }
- if ((err == ZIP_OK) && (size_extrafield_local > 0)) {
- if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local)
- err = ZIP_ERRNO;
- }
-
- /* Write the Zip64 extended info */
- if ((err == ZIP_OK) && (zi->ci.zip64)) {
- short headerid = 1;
- short datasize = 16;
- ZPOS64_T compressed_size = 0;
- ZPOS64_T uncompressed_size = 0;
-
- /* Remember position of Zip64 extended info for the local file header.
- (needed when we update size after done with file) */
- zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc, zi->filestream);
-
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)headerid, 2);
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)datasize, 2);
-
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)uncompressed_size, 8);
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)compressed_size, 8);
- }
-#ifdef HAVE_AES
- /* Write the AES extended info */
- if ((err == ZIP_OK) && (zi->ci.method == AES_METHOD)) {
- int headerid = 0x9901;
- short datasize = 7;
-
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, headerid, 2);
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, datasize, 2);
-
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, AES_VERSION, 2);
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, 'A', 1);
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, 'E', 1);
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, AES_ENCRYPTIONMODE, 1);
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->ci.compression_method, 2);
- }
-#endif
-
-#ifdef HAVE_BZIP2
- zi->ci.bstream.avail_in = (uInt)0;
- zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
- zi->ci.bstream.next_out = (char *)zi->ci.buffered_data;
- zi->ci.bstream.total_in_hi32 = 0;
- zi->ci.bstream.total_in_lo32 = 0;
- zi->ci.bstream.total_out_hi32 = 0;
- zi->ci.bstream.total_out_lo32 = 0;
-#endif
-
- zi->ci.stream.avail_in = (uInt)0;
- zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
- zi->ci.stream.next_out = zi->ci.buffered_data;
- zi->ci.stream.total_in = 0;
- zi->ci.stream.total_out = 0;
- zi->ci.stream.data_type = Z_BINARY;
-
- if ((err == ZIP_OK) && (!zi->ci.raw)) {
- if (method == Z_DEFLATED) {
- zi->ci.stream.zalloc = (alloc_func)0;
- zi->ci.stream.zfree = (free_func)0;
- zi->ci.stream.opaque = (voidpf)zi;
-
- if (windowBits > 0)
- windowBits = -windowBits;
-
- err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy);
-
- if (err == Z_OK)
- zi->ci.stream_initialised = Z_DEFLATED;
- } else if (method == Z_BZIP2ED) {
-#ifdef HAVE_BZIP2
- zi->ci.bstream.bzalloc = 0;
- zi->ci.bstream.bzfree = 0;
- zi->ci.bstream.opaque = (voidpf)0;
-
- err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0, 35);
- if (err == BZ_OK)
- zi->ci.stream_initialised = Z_BZIP2ED;
-#endif
- }
- }
-
-#ifndef NOCRYPT
- zi->ci.crypt_header_size = 0;
- if ((err == Z_OK) && ((zi->ci.flag & 1) != 0)) {
-#ifdef HAVE_AES
- if (zi->ci.method == AES_METHOD) {
- unsigned char passverify[AES_PWVERIFYSIZE];
- unsigned char saltvalue[AES_MAXSALTLENGTH];
- uInt saltlength;
-
- if ((AES_ENCRYPTIONMODE < 1) || (AES_ENCRYPTIONMODE > 3))
- return Z_ERRNO;
-
- saltlength = SALT_LENGTH(AES_ENCRYPTIONMODE);
-
- prng_init(entropy_fun, zi->ci.aes_rng);
- prng_rand(saltvalue, saltlength, zi->ci.aes_rng);
- prng_end(zi->ci.aes_rng);
-
- fcrypt_init(AES_ENCRYPTIONMODE, (unsigned char *)password, (unsigned int)strlen(password), saltvalue, passverify, &zi->ci.aes_ctx);
-
- if (ZWRITE64(zi->z_filefunc, zi->filestream, saltvalue, saltlength) != saltlength)
- err = ZIP_ERRNO;
- if (ZWRITE64(zi->z_filefunc, zi->filestream, passverify, AES_PWVERIFYSIZE) != AES_PWVERIFYSIZE)
- err = ZIP_ERRNO;
-
- zi->ci.crypt_header_size = saltlength + AES_PWVERIFYSIZE + AES_AUTHCODESIZE;
- } else
-#endif
- {
- unsigned char bufHead[RAND_HEAD_LEN];
- unsigned int sizeHead;
-
- zi->ci.pcrc_32_tab = (const unsigned long *)get_crc_table();
- /*init_keys(password, zi->ci.keys, zi->ci.pcrc_32_tab);*/
-
- sizeHead = crypthead(password, bufHead, RAND_HEAD_LEN, zi->ci.keys, zi->ci.pcrc_32_tab, crcForCrypting);
- zi->ci.crypt_header_size = sizeHead;
-
- if (ZWRITE64(zi->z_filefunc, zi->filestream, bufHead, sizeHead) != sizeHead)
- err = ZIP_ERRNO;
- }
- }
-#endif
-
- if (err == Z_OK)
- zi->in_opened_file_inzip = 1;
- return err;
-}
-
-extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char *filename, const zip_fileinfo *zipfi,
- const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
- uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits,
- int memLevel, int strategy, const char *password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase)
-{
- return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
- extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel,
- strategy, password, crcForCrypting, versionMadeBy, flagBase, 0);
-}
-
-extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char *filename, const zip_fileinfo *zipfi,
- const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
- uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits,
- int memLevel, int strategy, const char *password, uLong crcForCrypting)
-{
- return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
- extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel,
- strategy, password, crcForCrypting, VERSIONMADEBY, 0, 0);
-}
-
-extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
- const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
- uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits,
- int memLevel, int strategy, const char *password, uLong crcForCrypting, int zip64)
-{
- return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
- extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel, strategy,
- password, crcForCrypting, VERSIONMADEBY, 0, zip64);
-}
-
-extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char *filename, const zip_fileinfo *zipfi,
- const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
- uInt size_extrafield_global, const char *comment, int method, int level, int raw)
-{
- return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
- extrafield_global, size_extrafield_global, comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL,
- Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, 0);
-}
-
-extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
- const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
- uInt size_extrafield_global, const char *comment, int method, int level, int raw, int zip64)
-{
- return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
- extrafield_global, size_extrafield_global, comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL,
- Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, zip64);
-}
-
-extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
- const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
- uInt size_extrafield_global, const char *comment, int method, int level, int zip64)
-{
- return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
- extrafield_global, size_extrafield_global, comment, method, level, 0, -MAX_WBITS, DEF_MEM_LEVEL,
- Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, zip64);
-}
-
-extern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char *filename, const zip_fileinfo *zipfi,
- const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
- uInt size_extrafield_global, const char *comment, int method, int level)
-{
- return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
- extrafield_global, size_extrafield_global, comment, method, level, 0, -MAX_WBITS, DEF_MEM_LEVEL,
- Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, 0);
-}
-
-/* Flushes the write buffer to disk */
-local int zip64FlushWriteBuffer OF((zip64_internal * zi));
-local int zip64FlushWriteBuffer(zip64_internal *zi)
-{
- int err = ZIP_OK;
- uInt written = 0;
- uInt total_written = 0;
- uInt write = 0;
- uInt max_write = 0;
- ZPOS64_T size_available = 0;
-
- if ((zi->ci.flag & 1) != 0) {
-#ifndef NOCRYPT
-#ifdef HAVE_AES
- if (zi->ci.method == AES_METHOD) {
- fcrypt_encrypt(zi->ci.buffered_data, zi->ci.pos_in_buffered_data, &zi->ci.aes_ctx);
- } else
-#endif
- {
- uInt i;
- int t;
- for (i = 0; i < zi->ci.pos_in_buffered_data; i++)
- zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i], t);
- }
-#endif
- }
-
- write = zi->ci.pos_in_buffered_data;
-
- do {
- max_write = write;
-
- if (zi->disk_size > 0) {
- err = zipGetDiskSizeAvailable((zipFile)zi, &size_available);
- if (err != ZIP_OK)
- return err;
-
- if (size_available == 0) {
- err = zipGoToNextDisk((zipFile)zi);
- if (err != ZIP_OK)
- return err;
- }
-
- if (size_available < (ZPOS64_T)max_write)
- max_write = (uInt)size_available;
- }
-
- written = (unsigned int)ZWRITE64(zi->z_filefunc, zi->filestream, zi->ci.buffered_data + total_written, max_write);
-
- if (ZERROR64(zi->z_filefunc, zi->filestream)) {
- err = ZIP_ERRNO;
- break;
- }
-
- total_written += written;
- write -= written;
- } while (write > 0);
-
- zi->ci.total_compressed += zi->ci.pos_in_buffered_data;
-
-#ifdef HAVE_BZIP2
- if (zi->ci.compression_method == Z_BZIP2ED) {
- zi->ci.total_uncompressed += zi->ci.bstream.total_in_lo32;
- zi->ci.bstream.total_in_lo32 = 0;
- zi->ci.bstream.total_in_hi32 = 0;
- } else
-#endif
- {
- zi->ci.total_uncompressed += zi->ci.stream.total_in;
- zi->ci.stream.total_in = 0;
- }
-
- zi->ci.pos_in_buffered_data = 0;
-
- return err;
-}
-
-extern int ZEXPORT zipWriteInFileInZip(zipFile file, const void *buf, unsigned int len)
-{
- zip64_internal *zi;
- int err = ZIP_OK;
-
- if (file == NULL)
- return ZIP_PARAMERROR;
- zi = (zip64_internal *)file;
-
- if (zi->in_opened_file_inzip == 0)
- return ZIP_PARAMERROR;
-
- zi->ci.crc32 = crc32(zi->ci.crc32, buf, (uInt)len);
-
-#ifdef HAVE_BZIP2
- if ((zi->ci.compression_method == Z_BZIP2ED) && (!zi->ci.raw)) {
- zi->ci.bstream.next_in = (void *)buf;
- zi->ci.bstream.avail_in = len;
- err = BZ_RUN_OK;
-
- while ((err == BZ_RUN_OK) && (zi->ci.bstream.avail_in > 0)) {
- if (zi->ci.bstream.avail_out == 0) {
- if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
- err = ZIP_ERRNO;
- zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
- zi->ci.bstream.next_out = (char *)zi->ci.buffered_data;
- } else {
- uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32;
- uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32;
-
- err = BZ2_bzCompress(&zi->ci.bstream, BZ_RUN);
-
- zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo);
- }
- }
-
- if (err == BZ_RUN_OK)
- err = ZIP_OK;
- } else
-#endif
- {
- zi->ci.stream.next_in = (Bytef *)buf;
- zi->ci.stream.avail_in = len;
-
- while ((err == ZIP_OK) && (zi->ci.stream.avail_in > 0)) {
- if (zi->ci.stream.avail_out == 0) {
- if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
- err = ZIP_ERRNO;
- zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
- zi->ci.stream.next_out = zi->ci.buffered_data;
- }
-
- if (err != ZIP_OK)
- break;
-
- if ((zi->ci.compression_method == Z_DEFLATED) && (!zi->ci.raw)) {
- uLong total_out_before = zi->ci.stream.total_out;
- err = deflate(&zi->ci.stream, Z_NO_FLUSH);
- zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - total_out_before);
- } else {
- uInt copy_this, i;
- if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
- copy_this = zi->ci.stream.avail_in;
- else
- copy_this = zi->ci.stream.avail_out;
-
- for (i = 0; i < copy_this; i++)
- *(((char *)zi->ci.stream.next_out) + i) =
- *(((const char *)zi->ci.stream.next_in) + i);
-
- zi->ci.stream.avail_in -= copy_this;
- zi->ci.stream.avail_out -= copy_this;
- zi->ci.stream.next_in += copy_this;
- zi->ci.stream.next_out += copy_this;
- zi->ci.stream.total_in += copy_this;
- zi->ci.stream.total_out += copy_this;
- zi->ci.pos_in_buffered_data += copy_this;
- }
- }
- }
-
- return err;
-}
-
-extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uLong uncompressed_size, uLong crc32)
-{
- return zipCloseFileInZipRaw64(file, uncompressed_size, crc32);
-}
-
-extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompressed_size, uLong crc32)
-{
- zip64_internal *zi;
- ZPOS64_T compressed_size;
- uLong invalidValue = 0xffffffff;
- uLong i = 0;
- short datasize = 0;
- int err = ZIP_OK;
-
- if (file == NULL)
- return ZIP_PARAMERROR;
- zi = (zip64_internal *)file;
-
- if (zi->in_opened_file_inzip == 0)
- return ZIP_PARAMERROR;
- zi->ci.stream.avail_in = 0;
-
- if (!zi->ci.raw) {
- if (zi->ci.compression_method == Z_DEFLATED) {
- while (err == ZIP_OK) {
- uLong total_out_before;
- if (zi->ci.stream.avail_out == 0) {
- if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
- err = ZIP_ERRNO;
- zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
- zi->ci.stream.next_out = zi->ci.buffered_data;
- }
- total_out_before = zi->ci.stream.total_out;
- err = deflate(&zi->ci.stream, Z_FINISH);
- zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - total_out_before);
- }
- } else if (zi->ci.compression_method == Z_BZIP2ED) {
-#ifdef HAVE_BZIP2
- err = BZ_FINISH_OK;
- while (err == BZ_FINISH_OK) {
- uLong total_out_before;
- if (zi->ci.bstream.avail_out == 0) {
- if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
- err = ZIP_ERRNO;
- zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
- zi->ci.bstream.next_out = (char *)zi->ci.buffered_data;
- }
- total_out_before = zi->ci.bstream.total_out_lo32;
- err = BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH);
- if (err == BZ_STREAM_END)
- err = Z_STREAM_END;
- zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - total_out_before);
- }
-
- if (err == BZ_FINISH_OK)
- err = ZIP_OK;
-#endif
- }
- }
-
- if (err == Z_STREAM_END)
- err = ZIP_OK; /* this is normal */
-
- if ((zi->ci.pos_in_buffered_data > 0) && (err == ZIP_OK)) {
- if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
- err = ZIP_ERRNO;
- }
-
-#ifdef HAVE_AES
- if (zi->ci.method == AES_METHOD) {
- unsigned char authcode[AES_AUTHCODESIZE];
-
- fcrypt_end(authcode, &zi->ci.aes_ctx);
-
- if (ZWRITE64(zi->z_filefunc, zi->filestream, authcode, AES_AUTHCODESIZE) != AES_AUTHCODESIZE)
- err = ZIP_ERRNO;
- }
-#endif
-
- if (!zi->ci.raw) {
- if (zi->ci.compression_method == Z_DEFLATED) {
- int tmp_err = deflateEnd(&zi->ci.stream);
- if (err == ZIP_OK)
- err = tmp_err;
- zi->ci.stream_initialised = 0;
- }
-#ifdef HAVE_BZIP2
- else if (zi->ci.compression_method == Z_BZIP2ED) {
- int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream);
- if (err == ZIP_OK)
- err = tmperr;
- zi->ci.stream_initialised = 0;
- }
-#endif
-
- crc32 = (uLong)zi->ci.crc32;
- uncompressed_size = zi->ci.total_uncompressed;
- }
-
- compressed_size = zi->ci.total_compressed;
-#ifndef NOCRYPT
- compressed_size += zi->ci.crypt_header_size;
-#endif
-
- /* Update current item crc and sizes */
- if (compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) {
- zip64local_putValue_inmemory(zi->ci.central_header + 4, (uLong)45, 2); /* version made by */
- zip64local_putValue_inmemory(zi->ci.central_header + 6, (uLong)45, 2); /* version needed */
- }
- zip64local_putValue_inmemory(zi->ci.central_header + 16, crc32, 4); /* crc */
- if (compressed_size >= 0xffffffff)
- zip64local_putValue_inmemory(zi->ci.central_header + 20, invalidValue, 4); /* compr size */
- else
- zip64local_putValue_inmemory(zi->ci.central_header + 20, compressed_size, 4); /* compr size */
- if (zi->ci.stream.data_type == Z_ASCII)
- zip64local_putValue_inmemory(zi->ci.central_header + 36, (uLong)Z_ASCII, 2); /* internal file attrib */
- if (uncompressed_size >= 0xffffffff)
- zip64local_putValue_inmemory(zi->ci.central_header + 24, invalidValue, 4); /* uncompr size */
- else
- zip64local_putValue_inmemory(zi->ci.central_header + 24, uncompressed_size, 4); /* uncompr size */
-
- /* Add ZIP64 extra info field for uncompressed size */
- if (uncompressed_size >= 0xffffffff)
- datasize += 8;
- /* Add ZIP64 extra info field for compressed size */
- if (compressed_size >= 0xffffffff)
- datasize += 8;
- /* Add ZIP64 extra info field for relative offset to local file header of current file */
- if (zi->ci.pos_local_header >= 0xffffffff)
- datasize += 8;
-
- /* Add Extra Information Header for 'ZIP64 information' */
- if (datasize > 0) {
- char *p = zi->ci.central_header + zi->ci.size_centralheader;
-
- if ((uLong)(datasize + 4) > zi->ci.size_centralextrafree)
- return ZIP_BADZIPFILE;
-
- zip64local_putValue_inmemory(p, 0x0001, 2);
- p += 2;
- zip64local_putValue_inmemory(p, datasize, 2);
- p += 2;
-
- if (uncompressed_size >= 0xffffffff) {
- zip64local_putValue_inmemory(p, uncompressed_size, 8);
- p += 8;
- }
- if (compressed_size >= 0xffffffff) {
- zip64local_putValue_inmemory(p, compressed_size, 8);
- p += 8;
- }
- if (zi->ci.pos_local_header >= 0xffffffff) {
- zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8);
- p += 8;
- }
-
- zi->ci.size_centralextrafree -= datasize + 4;
- zi->ci.size_centralheader += datasize + 4;
- zi->ci.size_centralextra += datasize + 4;
-
- zip64local_putValue_inmemory(zi->ci.central_header + 30, (uLong)zi->ci.size_centralextra, 2);
- }
-
-#ifdef HAVE_AES
- /* Write the AES extended info */
- if (zi->ci.method == AES_METHOD) {
- char *p = zi->ci.central_header + zi->ci.size_centralheader;
-
- datasize = 7;
-
- if ((uLong)(datasize + 4) > zi->ci.size_centralextrafree)
- return ZIP_BADZIPFILE;
-
- zip64local_putValue_inmemory(p, 0x9901, 2);
- p += 2;
- zip64local_putValue_inmemory(p, datasize, 2);
- p += 2;
- zip64local_putValue_inmemory(p, AES_VERSION, 2);
- p += 2;
- zip64local_putValue_inmemory(p, 'A', 1);
- p += 1;
- zip64local_putValue_inmemory(p, 'E', 1);
- p += 1;
- zip64local_putValue_inmemory(p, AES_ENCRYPTIONMODE, 1);
- p += 1;
- zip64local_putValue_inmemory(p, zi->ci.compression_method, 2);
- p += 2;
-
- zi->ci.size_centralextrafree -= datasize + 4;
- zi->ci.size_centralheader += datasize + 4;
- zi->ci.size_centralextra += datasize + 4;
-
- zip64local_putValue_inmemory(zi->ci.central_header + 30, (uLong)zi->ci.size_centralextra, 2);
- }
-#endif
- /* Restore comment to correct position */
- for (i = 0; i < zi->ci.size_comment; i++)
- zi->ci.central_header[zi->ci.size_centralheader + i] =
- zi->ci.central_header[zi->ci.size_centralheader + zi->ci.size_centralextrafree + i];
- zi->ci.size_centralheader += zi->ci.size_comment;
-
- if (err == ZIP_OK)
- err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader);
-
- free(zi->ci.central_header);
-
- if (err == ZIP_OK) {
- /* Update the LocalFileHeader with the new values. */
- ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream);
- uLong cur_number_disk = zi->number_disk;
-
- /* Local file header is stored on previous disk, switch to make edits */
- if (zi->ci.number_disk != cur_number_disk)
- err = zipGoToSpecificDisk(file, (int)zi->ci.number_disk, 1);
-
- if (ZSEEK64(zi->z_filefunc, zi->filestream, zi->ci.pos_local_header + 14, ZLIB_FILEFUNC_SEEK_SET) != 0)
- err = ZIP_ERRNO;
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, crc32, 4); /* crc 32, unknown */
-
- if (uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff) {
- if (zi->ci.pos_zip64extrainfo > 0) {
- /* Update the size in the ZIP64 extended field. */
- if (ZSEEK64(zi->z_filefunc, zi->filestream, zi->ci.pos_zip64extrainfo + 4, ZLIB_FILEFUNC_SEEK_SET) != 0)
- err = ZIP_ERRNO;
-
- if (err == ZIP_OK) /* compressed size, unknown */
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8);
- if (err == ZIP_OK) /* uncompressed size, unknown */
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8);
- } else
- err = ZIP_BADZIPFILE; /* Caller passed zip64 = 0, so no room for zip64 info -> fatal */
- } else {
- if (err == ZIP_OK) /* compressed size, unknown */
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 4);
- if (err == ZIP_OK) /* uncompressed size, unknown */
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 4);
- }
-
- /* Now switch back again to the disk we were on before */
- if (zi->ci.number_disk != cur_number_disk)
- err = zipGoToSpecificDisk(file, (int)cur_number_disk, 1);
-
- if (ZSEEK64(zi->z_filefunc, zi->filestream, cur_pos_inzip, ZLIB_FILEFUNC_SEEK_SET) != 0)
- err = ZIP_ERRNO;
- }
-
- zi->number_entry++;
- zi->in_opened_file_inzip = 0;
-
- return err;
-}
-
-extern int ZEXPORT zipCloseFileInZip(zipFile file)
-{
- return zipCloseFileInZipRaw(file, 0, 0);
-}
-
-extern int ZEXPORT zipClose(zipFile file, const char *global_comment)
-{
- zip64_internal *zi;
- int err = 0;
- uLong size_centraldir = 0;
- uInt size_global_comment = 0;
- ZPOS64_T centraldir_pos_inzip;
- ZPOS64_T pos = 0;
- uLong write = 0;
-
- if (file == NULL)
- return ZIP_PARAMERROR;
-
- zi = (zip64_internal *)file;
-
- if (zi->in_opened_file_inzip == 1)
- err = zipCloseFileInZip(file);
-
-#ifndef NO_ADDFILEINEXISTINGZIP
- if (global_comment == NULL)
- global_comment = zi->globalcomment;
-#endif
-
- if (zi->filestream != zi->filestream_with_CD) {
- if (ZCLOSE64(zi->z_filefunc, zi->filestream) != 0)
- if (err == ZIP_OK)
- err = ZIP_ERRNO;
- if (zi->disk_size > 0)
- zi->number_disk_with_CD = zi->number_disk + 1;
- zi->filestream = zi->filestream_with_CD;
- }
-
- centraldir_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream);
-
- if (err == ZIP_OK) {
- linkedlist_datablock_internal *ldi = zi->central_dir.first_block;
- while (ldi != NULL) {
- if ((err == ZIP_OK) && (ldi->filled_in_this_block > 0)) {
- write = ZWRITE64(zi->z_filefunc, zi->filestream, ldi->data, ldi->filled_in_this_block);
- if (write != ldi->filled_in_this_block)
- err = ZIP_ERRNO;
- }
-
- size_centraldir += ldi->filled_in_this_block;
- ldi = ldi->next_datablock;
- }
- }
-
- free_linkedlist(&(zi->central_dir));
-
- pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;
-
- /* Write the ZIP64 central directory header */
- if (pos >= 0xffffffff || zi->number_entry > 0xffff) {
- ZPOS64_T zip64eocd_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream);
- uLong zip64datasize = 44;
-
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ZIP64ENDHEADERMAGIC, 4);
-
- /* size of this 'zip64 end of central directory' */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)zip64datasize, 8);
- /* version made by */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2);
- /* version needed */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2);
- /* number of this disk */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4);
- /* number of the disk with the start of the central directory */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4);
- /* total number of entries in the central dir on this disk */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8);
- /* total number of entries in the central dir */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8);
- /* size of the central directory */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)size_centraldir, 8);
-
- if (err == ZIP_OK) {
- /* offset of start of central directory with respect to the starting disk number */
- ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)pos, 8);
- }
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ZIP64ENDLOCHEADERMAGIC, 4);
-
- /* number of the disk with the start of the central directory */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4);
- /*relative offset to the Zip64EndOfCentralDirectory */
- if (err == ZIP_OK) {
- ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writting_offset;
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, pos, 8);
- }
- /* number of the disk with the start of the central directory */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD + 1, 4);
- }
-
- /* Write the central directory header */
-
- /* signature */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ENDHEADERMAGIC, 4);
- /* number of this disk */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 2);
- /* number of the disk with the start of the central directory */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 2);
- /* total number of entries in the central dir on this disk */
- if (err == ZIP_OK) {
- if (zi->number_entry >= 0xffff)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffff, 2); /* use value in ZIP64 record */
- else
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_entry, 2);
- }
- /* total number of entries in the central dir */
- if (err == ZIP_OK) {
- if (zi->number_entry >= 0xffff)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffff, 2); /* use value in ZIP64 record */
- else
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_entry, 2);
- }
- /* size of the central directory */
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_centraldir, 4);
- /* offset of start of central directory with respect to the starting disk number */
- if (err == ZIP_OK) {
- ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;
- if (pos >= 0xffffffff)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffffffff, 4);
- else
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)pos, 4);
- }
-
- /* Write global comment */
-
- if (global_comment != NULL)
- size_global_comment = (uInt)strlen(global_comment);
- if (err == ZIP_OK)
- err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_global_comment, 2);
- if (err == ZIP_OK && size_global_comment > 0) {
- if (ZWRITE64(zi->z_filefunc, zi->filestream, global_comment, size_global_comment) != size_global_comment)
- err = ZIP_ERRNO;
- }
-
- if ((ZCLOSE64(zi->z_filefunc, zi->filestream) != 0) && (err == ZIP_OK))
- err = ZIP_ERRNO;
-
-#ifndef NO_ADDFILEINEXISTINGZIP
- TRYFREE(zi->globalcomment);
-#endif
- TRYFREE(zi);
-
- return err;
-}
-
diff --git a/ios/CodePush/SSZipArchive/minizip/zip.h b/ios/CodePush/SSZipArchive/minizip/zip.h
deleted file mode 100644
index 10bbf26c2..000000000
--- a/ios/CodePush/SSZipArchive/minizip/zip.h
+++ /dev/null
@@ -1,202 +0,0 @@
-/* zip.h -- IO on .zip files using zlib
- Version 1.1, February 14h, 2010
- part of the MiniZip project
-
- Copyright (C) 1998-2010 Gilles Vollant
- http://www.winimage.com/zLibDll/minizip.html
- Modifications for Zip64 support
- Copyright (C) 2009-2010 Mathias Svensson
- http://result42.com
-
- This program is distributed under the terms of the same license as zlib.
- See the accompanying LICENSE file for the full text of the license.
-*/
-
-#ifndef _ZIP_H
-#define _ZIP_H
-
-#define HAVE_AES
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef _ZLIB_H
-# include "zlib.h"
-#endif
-
-#ifndef _ZLIBIOAPI_H
-# include "ioapi.h"
-#endif
-
-#ifdef HAVE_BZIP2
-# include "bzlib.h"
-#endif
-
-#define Z_BZIP2ED 12
-
-#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
-/* like the STRICT of WIN32, we define a pointer that cannot be converted
- from (void*) without cast */
-typedef struct TagzipFile__ { int unused; } zipFile__;
-typedef zipFile__ *zipFile;
-#else
-typedef voidp zipFile;
-#endif
-
-#define ZIP_OK (0)
-#define ZIP_EOF (0)
-#define ZIP_ERRNO (Z_ERRNO)
-#define ZIP_PARAMERROR (-102)
-#define ZIP_BADZIPFILE (-103)
-#define ZIP_INTERNALERROR (-104)
-
-#ifndef DEF_MEM_LEVEL
-# if MAX_MEM_LEVEL >= 8
-# define DEF_MEM_LEVEL 8
-# else
-# define DEF_MEM_LEVEL MAX_MEM_LEVEL
-# endif
-#endif
-/* default memLevel */
-
-/* tm_zip contain date/time info */
-typedef struct tm_zip_s
-{
- uInt tm_sec; /* seconds after the minute - [0,59] */
- uInt tm_min; /* minutes after the hour - [0,59] */
- uInt tm_hour; /* hours since midnight - [0,23] */
- uInt tm_mday; /* day of the month - [1,31] */
- uInt tm_mon; /* months since January - [0,11] */
- uInt tm_year; /* years - [1980..2044] */
-} tm_zip;
-
-typedef struct
-{
- tm_zip tmz_date; /* date in understandable format */
- uLong dosDate; /* if dos_date == 0, tmu_date is used */
- uLong internal_fa; /* internal file attributes 2 bytes */
- uLong external_fa; /* external file attributes 4 bytes */
-} zip_fileinfo;
-
-typedef const char* zipcharpc;
-
-#define APPEND_STATUS_CREATE (0)
-#define APPEND_STATUS_CREATEAFTER (1)
-#define APPEND_STATUS_ADDINZIP (2)
-
-/***************************************************************************/
-/* Writing a zip file */
-
-extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
-extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append));
-/* Create a zipfile.
-
- pathname should contain the full pathname (by example, on a Windows XP computer
- "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip".
-
- return NULL if zipfile cannot be opened
- return zipFile handle if no error
-
- If the file pathname exist and append == APPEND_STATUS_CREATEAFTER, the zip
- will be created at the end of the file. (useful if the file contain a self extractor code)
- If the file pathname exist and append == APPEND_STATUS_ADDINZIP, we will add files in existing
- zip (be sure you don't add file that doesn't exist)
-
- NOTE: There is no delete function into a zipfile. If you want delete file into a zipfile,
- you must open a zipfile, and create another. Of course, you can use RAW reading and writing to copy
- the file you did not want delete. */
-
-extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, int append, zipcharpc* globalcomment,
- zlib_filefunc_def* pzlib_filefunc_def));
-
-extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, int append, zipcharpc* globalcomment,
- zlib_filefunc64_def* pzlib_filefunc_def));
-
-extern zipFile ZEXPORT zipOpen3 OF((const char *pathname, int append, ZPOS64_T disk_size,
- zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc_def));
-/* Same as zipOpen2 but allows specification of spanned zip size */
-
-extern zipFile ZEXPORT zipOpen3_64 OF((const void *pathname, int append, ZPOS64_T disk_size,
- zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def));
-
-extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
- const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
- uInt size_extrafield_global, const char* comment, int method, int level));
-/* Open a file in the ZIP for writing.
-
- filename : the filename in zip (if NULL, '-' without quote will be used
- *zipfi contain supplemental information
- extrafield_local buffer to store the local header extra field data, can be NULL
- size_extrafield_local size of extrafield_local buffer
- extrafield_global buffer to store the global header extra field data, can be NULL
- size_extrafield_global size of extrafield_local buffer
- comment buffer for comment string
- method contain the compression method (0 for store, Z_DEFLATED for deflate)
- level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
- zip64 is set to 1 if a zip64 extended information block should be added to the local file header.
- this MUST be '1' if the uncompressed size is >= 0xffffffff. */
-
-extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
- const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
- uInt size_extrafield_global, const char* comment, int method, int level, int zip64));
-/* Same as zipOpenNewFileInZip with zip64 support */
-
-extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
- const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
- uInt size_extrafield_global, const char* comment, int method, int level, int raw));
-/* Same as zipOpenNewFileInZip, except if raw=1, we write raw file */
-
-extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
- const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
- uInt size_extrafield_global, const char* comment, int method, int level, int raw, int zip64));
-/* Same as zipOpenNewFileInZip3 with zip64 support */
-
-extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
- const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
- uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel,
- int strategy, const char* password, uLong crcForCrypting));
-/* Same as zipOpenNewFileInZip2, except
- windowBits, memLevel, strategy : see parameter strategy in deflateInit2
- password : crypting password (NULL for no crypting)
- crcForCrypting : crc of file to compress (needed for crypting) */
-
-extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
- const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
- uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel,
- int strategy, const char* password, uLong crcForCrypting, int zip64));
-/* Same as zipOpenNewFileInZip3 with zip64 support */
-
-extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
- const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
- uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel,
- int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase));
-/* Same as zipOpenNewFileInZip3 except versionMadeBy & flag fields */
-
-extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
- const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
- uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel,
- int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase, int zip64));
-/* Same as zipOpenNewFileInZip4 with zip64 support */
-
-extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, const void* buf, unsigned len));
-/* Write data in the zipfile */
-
-extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
-/* Close the current file in the zipfile */
-
-extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, uLong uncompressed_size, uLong crc32));
-extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, ZPOS64_T uncompressed_size, uLong crc32));
-/* Close the current file in the zipfile, for file opened with parameter raw=1 in zipOpenNewFileInZip2
- uncompressed_size and crc32 are value for the uncompressed size */
-
-extern int ZEXPORT zipClose OF((zipFile file, const char* global_comment));
-/* Close the zipfile */
-
-/***************************************************************************/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _ZIP_H */