in sdk/PowerBI.Api/Extensions/AsymmetricHigherKeyEncryptionHelper.cs [20:51]
internal static string Encrypt(byte[] plainTextBytes, byte[] modulusBytes, byte[] exponentBytes)
{
// Generate ephemeral keys for encryption (32 bytes), hmac (64 bytes)
var keyEnc = GetRandomBytes(AES_KEY_SIZE_BYTES);
var keyMac = GetRandomBytes(HMAC_KEY_SIZE_BYTES);
// Encrypt message using ephemeral keys and Authenticated Encryption
var ciphertext = AuthenticatedEncryption.Encrypt(keyEnc, keyMac, plainTextBytes);
// Encrypt ephemeral keys using RSA
var keys = new byte[KEY_LENGTHS_PREFIX + keyEnc.Length + keyMac.Length];
// Prefixing length of Keys. Symmetric Key length followed by HMAC key length
keys[0] = (byte)KeyLengths.KeyLength32;
keys[1] = (byte)KeyLengths.KeyLength64;
Buffer.BlockCopy(keyEnc, 0, keys, 2, keyEnc.Length);
Buffer.BlockCopy(keyMac, 0, keys, keyEnc.Length + 2, keyMac.Length);
byte[] encryptedKeys;
using (var rsa = RSA.Create())
{
var rsaKeyInfo = rsa.ExportParameters(false);
rsaKeyInfo.Modulus = modulusBytes;
rsaKeyInfo.Exponent = exponentBytes;
rsa.ImportParameters(rsaKeyInfo);
encryptedKeys = rsa.Encrypt(keys, RSAEncryptionPadding.OaepSHA256);
}
// prepare final payload
return Convert.ToBase64String(encryptedKeys) + Convert.ToBase64String(ciphertext);
}