Browse Source

Update NCEndToEndMetadataV20.swift

Marino Faggiana 1 year ago
parent
commit
955431c13c
1 changed files with 34 additions and 16 deletions
  1. 34 16
      iOSClient/Networking/E2EE/NCEndToEndMetadataV20.swift

+ 34 - 16
iOSClient/Networking/E2EE/NCEndToEndMetadataV20.swift

@@ -39,15 +39,12 @@ extension NCEndToEndMetadata {
             return (nil, nil)
         }
 
-        let e2eEncryptions = NCManageDatabase.shared.getE2eEncryptions(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", account, serverUrl))
-
-
         var usersCodable: [E2eeV20.Users] = []
-        var metadataCodable: E2eeV20.Metadata = E2eeV20.Metadata(ciphertext: "", nonce: "", authenticationTag: "")
         var filedropCodable: [String: E2eeV20.Filedrop] = [:]
 
         var encryptedMetadataKey: String?
         var e2eeJson: String?
+        var signature: String?
 
         if let user = NCManageDatabase.shared.getE2EUsersV2(account: account, serverUrl: serverUrl, userId: userId) {
             encryptedMetadataKey = user.encryptedMetadataKey
@@ -69,36 +66,57 @@ extension NCEndToEndMetadata {
             }
         }
 
-        // Counter
+        // tableE2eMetadataV2
         if NCManageDatabase.shared.getE2eMetadataV2(account: account, serverUrl: serverUrl) == nil {
-            NCManageDatabase.shared.addE2eMetadataV2(account: account, serverUrl: serverUrl, keyChecksums: nil, deleted: false, counter: 1, folders: nil, version: "2.0nil")
+            NCManageDatabase.shared.addE2eMetadataV2(account: account, serverUrl: serverUrl, keyChecksums: nil, deleted: false, counter: 1, folders: nil, version: "2.0")
         } else {
             NCManageDatabase.shared.incrementCounterE2eMetadataV2(account: account, serverUrl: serverUrl)
         }
+        guard let e2eMetadataV2 = NCManageDatabase.shared.getE2eMetadataV2(account: account, serverUrl: serverUrl) else {
+            return (nil, nil)
+        }
 
         // Create ciphertext
-
-
+        let e2eEncryptions = NCManageDatabase.shared.getE2eEncryptions(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", account, serverUrl))
+        var filesCodable: [String: E2eeV20.Files] = [:]
+        
         for e2eEncryption in e2eEncryptions {
-
             if e2eEncryption.blob == "files" {
-                let encrypted = E2eeV12.Encrypted(key: e2eEncryption.key, filename: e2eEncryption.fileName, mimetype: e2eEncryption.mimeType)
-
+                let file = E2eeV20.Files(authenticationTag: e2eEncryption.authenticationTag, filename: e2eEncryption.fileName, key: e2eEncryption.key, mimetype: e2eEncryption.mimeType, nonce: e2eEncryption.initializationVector)
+                filesCodable.updateValue(file, forKey: e2eEncryption.fileNameIdentifier)
             }
         }
 
-        let e2eeCodable = E2eeV20(metadata: metadataCodable, users: usersCodable, filedrop: filedropCodable, version: "2.0")
+        var keyChecksums = Array(e2eMetadataV2.keyChecksums.map { $0 })
+        if let hash = NCEndToEndEncryption.sharedManager().createSHA256(from: encryptedMetadataKey) {
+            keyChecksums.append(hash)
+        }
+
+        let ciphertext = E2eeV20.ciphertext(counter: e2eMetadataV2.counter, deleted: false, keyChecksums: keyChecksums, files: filesCodable, folders: [:])
+        var authenticationTag: NSString?
+        var initializationVector: NSString?
+
         do {
-            let data = try JSONEncoder().encode(e2eeCodable)
-            data.printJson()
-            e2eeJson = String(data: data, encoding: .utf8)
+            let json = try JSONEncoder().encode(ciphertext)
+            let data = try json.gzipped()
+            let ciphertext = NCEndToEndEncryption.sharedManager().encryptPayloadFile(String(data: data, encoding: .utf8), key: encryptedMetadataKey, initializationVector: &initializationVector, authenticationTag: &authenticationTag)
+
+            guard let ciphertext, let initializationVector = initializationVector as? String, let authenticationTag = authenticationTag as? String else {
+                return (nil, nil)
+            }
+            let metadataCodable = E2eeV20.Metadata(ciphertext: ciphertext, nonce: initializationVector, authenticationTag: authenticationTag)
+            let e2eeCodable = E2eeV20(metadata: metadataCodable, users: usersCodable, filedrop: filedropCodable, version: "2.0")
+            let e2eeData = try JSONEncoder().encode(e2eeCodable)
+            e2eeData.printJson()
+            e2eeJson = String(data: e2eeData, encoding: .utf8)
+            print("")
         } catch let error {
             print("Serious internal error in encoding e2ee (" + error.localizedDescription + ")")
             return (nil, nil)
         }
 
         // Signature
-        var signature: String?
+
 
         if let e2eeJson {
             let dataMetadata = Data(base64Encoded: "e2eeJson")