private async Task <bool> ContactCentralApiAsync(CentralApiSubmitTransferDto model) { var encryptedData = this.SignAndEncryptData(model); var client = new HttpClient(); var response = await client.PostAsJsonAsync( string.Format(CentralApiTransferSubmitUrlFormat, this.bankConfiguration.CentralApiAddress), encryptedData); return(response != null && response.IsSuccessStatusCode); }
private string SignAndEncryptData(CentralApiSubmitTransferDto model) { using (var rsa = RSA.Create()) { RsaExtensions.FromXmlString(rsa, this.bankConfiguration.Key); var aesParams = CryptographyExtensions.GenerateKey(); var key = Convert.FromBase64String(aesParams[0]); var iv = Convert.FromBase64String(aesParams[1]); var serializedModel = JsonConvert.SerializeObject(model); var dataObject = new { Model = serializedModel, Timestamp = DateTime.UtcNow }; var data = JsonConvert.SerializeObject(dataObject); var signature = Convert.ToBase64String(rsa .SignData(Encoding.UTF8.GetBytes(data), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1)); string encryptedKey; string encryptedIv; using (var encryptionRsa = RSA.Create()) { RsaExtensions.FromXmlString(encryptionRsa, this.bankConfiguration.CentralApiPublicKey); encryptedKey = Convert.ToBase64String(encryptionRsa.Encrypt(key, RSAEncryptionPadding.Pkcs1)); encryptedIv = Convert.ToBase64String(encryptionRsa.Encrypt(iv, RSAEncryptionPadding.Pkcs1)); } var encryptedData = Convert.ToBase64String(CryptographyExtensions.Encrypt(data, key, iv)); var json = new { BankName = this.bankConfiguration.BankName, BankSwiftCode = this.bankConfiguration.UniqueIdentifier, BankCountry = this.bankConfiguration.Country, EncryptedKey = encryptedKey, EncryptedIv = encryptedIv, Data = encryptedData, Signature = signature }; var jsonRequest = JsonConvert.SerializeObject(json); var encryptedRequest = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonRequest)); return(encryptedRequest); } }