public byte[] AddMetadataHeader(VaultMetadata metadata, byte[] encryptedVaultBytes)
        {
            byte[] metadataBytes = CreateVaultMetadataHeader(metadata);
            byte[] finalBytes    = new byte[metadataBytes.Length + encryptedVaultBytes.Length + this.HeaderSeperator.Length];

            metadataBytes.CopyTo(finalBytes, 0);
            HeaderSeperator.CopyTo(finalBytes, metadataBytes.Length);
            encryptedVaultBytes.CopyTo(finalBytes, metadataBytes.Length + HeaderSeperator.Length);

            return(finalBytes);
        }
        private byte[] CreateVaultMetadataHeader(VaultMetadata vaultMetadata)
        {
            int versionBytesCount   = sizeof(long);
            var versionBytes        = BitConverter.GetBytes(vaultMetadata.Version);
            var createLocationBytes = BitConverter.GetBytes((int)vaultMetadata.CreateLocation);

            var headerBytes = new byte[TotalHeaderLength];

            versionBytes.CopyTo(headerBytes, 0);
            createLocationBytes.CopyTo(headerBytes, versionBytesCount);

            return(headerBytes);
        }
        public VaultMetadata GetVaultFileMetadata(byte[] vaultFileBytesWithMetadata)
        {
            int versionBytesCount        = sizeof(long);
            int createLocationBytesCount = sizeof(int);

            byte[] metadataBytes = GetVaultFileMetadataHeader(vaultFileBytesWithMetadata);
            var    result        = new VaultMetadata();

            if (metadataBytes != null)
            {
                var versionBytes        = metadataBytes.Take(versionBytesCount).ToArray();
                var createLocationBytes = metadataBytes.Skip(versionBytesCount).Take(createLocationBytesCount).ToArray();
                result.Version        = BitConverter.ToInt64(versionBytes, 0);
                result.CreateLocation = (VaultCreateLocation)BitConverter.ToInt32(createLocationBytes, 0);
            }

            return(result);
        }