/// <summary> /// Unlocks (i.e. decrypts) the archive with the given <see cref="UserKey"/>. /// </summary> /// <param name="userKey">The <see cref="UserKey"/> to use to unlock the archive.</param> public void Unlock(UserKey userKey) { ArgCheck.NotNull(userKey, nameof(userKey)); // Setting the ArchiveKey property puts the archive into the "unlocked" state. // Wait to set the property until after everything is properly unlocked. var archiveKey = this.DecryptArchiveKey(userKey); this.FileIndex = this.ArchiveMetadata.EncryptedFileIndex is null || this.ArchiveMetadata.EncryptedFileIndex.IsEmpty() ? new FileIndex() : FileIndex.DecryptFrom(this.ArchiveMetadata.EncryptedFileIndex, archiveKey, this.ArchiveMetadata.SecuritySettings); this.ArchiveKey = archiveKey; }