Browse Source

e2e encrypted file

Marino Faggiana 7 years ago
parent
commit
c95245c48e

+ 6 - 1
iOSClient/Main/CCMain.m

@@ -1586,6 +1586,7 @@
     BOOL useSubFolder = [[arguments objectAtIndex:2] boolValue];
     NSString *session = [arguments objectAtIndex:3];
     
+    NSString *fileName;
     NSString *autoUploadPath = [[NCManageDatabase sharedInstance] getAccountAutoUploadPath:app.activeUrl];
     NSString *directoryID = [[NCManageDatabase sharedInstance] getDirectoryID:serverUrl];
     if (!directoryID) return;
@@ -1599,7 +1600,11 @@
     
     for (PHAsset *asset in assets) {
         
-        NSString *fileName = [CCUtility createFileName:[asset valueForKey:@"filename"] fileDate:asset.creationDate fileType:asset.mediaType keyFileName:k_keyFileNameMask keyFileNameType:k_keyFileNameType];
+        if ([CCUtility isFolderEncrypted:self.serverUrl account:app.activeAccount]) {
+            fileName = [CCUtility generateEncryptedFileName];
+        } else {
+            fileName = [CCUtility createFileName:[asset valueForKey:@"filename"] fileDate:asset.creationDate fileType:asset.mediaType keyFileName:k_keyFileNameMask keyFileNameType:k_keyFileNameType];
+        }
         
         NSDate *assetDate = asset.creationDate;
         NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

+ 16 - 4
iOSClient/Security/NCEndToEndEncryption.m

@@ -38,6 +38,8 @@
 #import <openssl/err.h>
 #import <openssl/bn.h>
 #import <openssl/md5.h>
+#import <openssl/rand.h>
+
 
 #define addName(field, value) X509_NAME_add_entry_by_txt(name, field, MBSTRING_ASC, (unsigned char *)value, -1, -1, 0); NSLog(@"%s: %s", field, value);
 
@@ -545,7 +547,7 @@ cleanup:
     NSString* authenticationTag;
 
     NSData *plainData = [[NSFileManager defaultManager] contentsAtPath:[NSString stringWithFormat:@"%@/%@", activeUrl, fileID]];
-    NSData *keyData = [[NSData alloc] initWithBase64EncodedString:@"WANM0gRv+DhaexIsI0T3Lg==" options:0];
+    NSData *keyData = [self generateKey:AES_KEY_128_LENGTH];
     NSData *ivData = [self generateIV:AES_IVEC_LENGTH];
     
     BOOL result = [self encryptData:plainData cipherData:&cipherData keyData:keyData keyLen:AES_KEY_128_LENGTH ivData:ivData tagData:&tagData];
@@ -786,14 +788,24 @@ cleanup:
     return output;
 }
 
-- (NSData *)generateIV:(int)ivLength
+- (NSData *)generateIV:(int)length
 {
-    NSMutableData  *ivData = [NSMutableData dataWithLength:ivLength];
-    (void)SecRandomCopyBytes(kSecRandomDefault, ivLength, ivData.mutableBytes);
+    NSMutableData  *ivData = [NSMutableData dataWithLength:length];
+    (void)SecRandomCopyBytes(kSecRandomDefault, length, ivData.mutableBytes);
     
     return ivData;
 }
 
+- (NSData *)generateKey:(int)length
+{
+    NSMutableData *keyData = [NSMutableData dataWithLength:length];
+    unsigned char *pKeyData = [keyData mutableBytes];
+
+    RAND_bytes(pKeyData, length);
+    
+    return keyData;
+}
+
 - (NSString *)getMD5:(NSString *)input
 {
     // Create pointer to the string as UTF8

+ 5 - 0
iOSClient/Utility/CCUtility.h

@@ -181,6 +181,11 @@
 
 + (NSArray *)createNameSubFolder:(PHFetchResult *)assets;
 
+// ===== E2E Encrypted =====
+
++ (NSString *)generateEncryptedFileName;
++ (BOOL)isFolderEncrypted:(NSString *)serverUrl account:(NSString *)account;
+
 // ===== CCMetadata =====
 
 + (tableMetadata *)createMetadataWithAccount:(NSString *)account date:(NSDate *)date directory:(BOOL)directory fileID:(NSString *)fileID directoryID:(NSString *)directoryID fileName:(NSString *)fileName etag:(NSString *)etag size:(double)size status:(double)status;

+ 25 - 0
iOSClient/Utility/CCUtility.m

@@ -892,6 +892,31 @@
     return (NSArray *)datesSubFolder;
 }
 
+#pragma --------------------------------------------------------------------------------------------
+#pragma mark ===== E2E Encrypted =====
+#pragma --------------------------------------------------------------------------------------------
+
++ (NSString *)generateEncryptedFileName
+{
+    NSString *UUID = [[NSUUID UUID] UUIDString];
+    
+    return [[UUID stringByReplacingOccurrencesOfString:@"-" withString:@""] lowercaseString];
+}
+
++ (BOOL)isFolderEncrypted:(NSString *)serverUrl account:(NSString *)account
+{
+    NSArray *metadatas = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND directory = 1 AND encrypted = 1", account] sorted:@"directoryID" ascending:false];
+    
+    for (tableMetadata *metadata in metadatas) {
+        
+        NSString *serverUrlEncrypted = [NSString stringWithFormat:@"%@/%@", [[NCManageDatabase sharedInstance] getServerUrl:metadata.directoryID], metadata.fileName];
+        if ([serverUrl containsString:serverUrlEncrypted])
+            return true;
+    }
+    
+    return false;
+}
+
 #pragma --------------------------------------------------------------------------------------------
 #pragma mark ===== CCMetadata =====
 #pragma --------------------------------------------------------------------------------------------