DeviceBridge/Management/EncryptionSetup.cs (33 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Security.Cryptography; using System.Threading; using System.Threading.Tasks; using DeviceBridge.Common; using DeviceBridge.Providers; using DeviceBridge.Services; using NLog; namespace DeviceBridge.Management { /// <summary> /// Encryption setup is responsible for creating encryption keys, and re-encrypting sensitive data in the database. /// </summary> public class EncryptionSetup { /// <summary> /// Creates and saves a new encryption key in the database. /// Reencrypts all callback URL's in the database. /// </summary> /// <returns>Empty task.</returns> public async Task Reencrypt() { Logger logger = LogManager.GetCurrentClassLogger(); logger.Info("Starting re-encryption."); var kvUrl = Environment.GetEnvironmentVariable("KV_URL"); var secretsService = new SecretsProvider(kvUrl); var sqlConnectionString = Utils.GetSqlConnectionString(logger, secretsService); var secretsProvider = new SecretsProvider(kvUrl); var encryptionService = new EncryptionService(logger, secretsProvider); var storageProvider = new StorageProvider(sqlConnectionString, encryptionService); var subs = await storageProvider.ListAllSubscriptionsOrderedByDeviceId(logger); // Generate new key await secretsProvider.PutEncryptionKey(logger, System.Text.Encoding.ASCII.GetString(Aes.Create().Key)); foreach (var sub in subs) { await storageProvider.CreateOrUpdateDeviceSubscription(logger, sub.DeviceId, sub.SubscriptionType, sub.CallbackUrl, CancellationToken.None); } logger.Info("Re-encryption complete."); } } }