private static void AdjustUdata(this SyncDownRecord syncDownRecord)
        {
            if (syncDownRecord.udata == null)
            {
                return;
            }

            using (var ms = new MemoryStream())
            {
                UdataSerializer.WriteObject(ms, syncDownRecord.udata);
                syncDownRecord.Udata = ms.ToArray().Base64UrlEncode();
            }
        }
        private Tuple <SyncDownRecord, SyncDownRecordMetaData> GenerateRecord(PasswordRecord record,
                                                                              KeyType keyType,
                                                                              long revision)
        {
            var sdr = new SyncDownRecord
            {
                RecordUid          = record.Uid,
                Version            = 2,
                Revision           = revision,
                ClientModifiedTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
                Shared             = keyType == KeyType.DataKey
            };
            var data = record.ExtractRecordData();

            using (var ms = new MemoryStream())
            {
                _dataSerializer.WriteObject(ms, data);
                sdr.Data = CryptoUtils.EncryptAesV1(ms.ToArray(), record.RecordKey).Base64UrlEncode();
            }

            if (record.Attachments.Count > 0)
            {
                var extra = record.ExtractRecordExtra();
                using (var ms = new MemoryStream())
                {
                    _extraSerializer.WriteObject(ms, extra);
                    sdr.Extra = CryptoUtils.EncryptAesV1(ms.ToArray(), record.RecordKey).Base64UrlEncode();
                }
            }

            SyncDownRecordMetaData sdrmd = null;

            if (keyType == KeyType.DataKey || keyType == KeyType.PrivateKey)
            {
                sdrmd = new SyncDownRecordMetaData
                {
                    RecordUid     = record.Uid,
                    Owner         = keyType == KeyType.DataKey,
                    CanShare      = keyType == KeyType.DataKey,
                    CanEdit       = keyType == KeyType.DataKey,
                    RecordKeyType = (int)keyType
                };
                sdrmd.RecordKey =
                    (keyType == KeyType.DataKey
                        ? CryptoUtils.EncryptAesV1(record.RecordKey, DataKey)
                        : CryptoUtils.EncryptRsa(record.RecordKey, PublicKey)).Base64UrlEncode();
            }

            return(new Tuple <SyncDownRecord, SyncDownRecordMetaData>(sdr, sdrmd));
        }