3 changed files with 96 additions and 1 deletions
@ -0,0 +1,90 @@ |
|||||||
|
using Amazon; |
||||||
|
using Amazon.KeyManagementService; |
||||||
|
using Amazon.KeyManagementService.Model; |
||||||
|
using System.IO; |
||||||
|
using System.Security.Cryptography; |
||||||
|
using System.Threading.Tasks; |
||||||
|
|
||||||
|
namespace Bit.CryptoAgent.Services |
||||||
|
{ |
||||||
|
public class AwsKmsRsaKeyService : IRsaKeyService |
||||||
|
{ |
||||||
|
private readonly CryptoAgentSettings _settings; |
||||||
|
|
||||||
|
private AmazonKeyManagementServiceClient _kmsClient; |
||||||
|
|
||||||
|
public AwsKmsRsaKeyService( |
||||||
|
CryptoAgentSettings settings) |
||||||
|
{ |
||||||
|
_settings = settings; |
||||||
|
_kmsClient = new AmazonKeyManagementServiceClient(settings.RsaKey.AwsAccessKeyId, |
||||||
|
settings.RsaKey.AwsAccessKeySecret, RegionEndpoint.GetBySystemName(settings.RsaKey.AwsRegion)); |
||||||
|
} |
||||||
|
|
||||||
|
public async Task<byte[]> EncryptAsync(byte[] data) |
||||||
|
{ |
||||||
|
using var dataStream = new MemoryStream(data); |
||||||
|
var request = new EncryptRequest |
||||||
|
{ |
||||||
|
KeyId = _settings.RsaKey.AwsKeyId, |
||||||
|
Plaintext = dataStream |
||||||
|
}; |
||||||
|
var response = await _kmsClient.EncryptAsync(request); |
||||||
|
return response.CiphertextBlob.ToArray(); |
||||||
|
} |
||||||
|
|
||||||
|
public async Task<byte[]> DecryptAsync(byte[] data) |
||||||
|
{ |
||||||
|
using var dataStream = new MemoryStream(data); |
||||||
|
var request = new DecryptRequest |
||||||
|
{ |
||||||
|
KeyId = _settings.RsaKey.AwsKeyId, |
||||||
|
CiphertextBlob = dataStream |
||||||
|
}; |
||||||
|
var response = await _kmsClient.DecryptAsync(request); |
||||||
|
return response.Plaintext.ToArray(); |
||||||
|
} |
||||||
|
|
||||||
|
public async Task<byte[]> SignAsync(byte[] data) |
||||||
|
{ |
||||||
|
using var dataStream = new MemoryStream(data); |
||||||
|
var request = new SignRequest |
||||||
|
{ |
||||||
|
KeyId = _settings.RsaKey.AwsKeyId, |
||||||
|
SigningAlgorithm = SigningAlgorithmSpec.RSASSA_PKCS1_V1_5_SHA_256, |
||||||
|
Message = dataStream, |
||||||
|
MessageType = MessageType.RAW |
||||||
|
}; |
||||||
|
var response = await _kmsClient.SignAsync(request); |
||||||
|
return response.Signature.ToArray(); |
||||||
|
} |
||||||
|
|
||||||
|
public async Task<bool> VerifyAsync(byte[] data, byte[] signature) |
||||||
|
{ |
||||||
|
using var dataStream = new MemoryStream(data); |
||||||
|
using var signatureStream = new MemoryStream(data); |
||||||
|
var request = new VerifyRequest |
||||||
|
{ |
||||||
|
KeyId = _settings.RsaKey.AwsKeyId, |
||||||
|
SigningAlgorithm = SigningAlgorithmSpec.RSASSA_PKCS1_V1_5_SHA_256, |
||||||
|
Message = dataStream, |
||||||
|
MessageType = MessageType.RAW, |
||||||
|
Signature = signatureStream |
||||||
|
}; |
||||||
|
var response = await _kmsClient.VerifyAsync(request); |
||||||
|
return response.SignatureValid; |
||||||
|
} |
||||||
|
|
||||||
|
public async Task<byte[]> GetPublicKeyAsync() |
||||||
|
{ |
||||||
|
var request = new GetPublicKeyRequest |
||||||
|
{ |
||||||
|
KeyId = _settings.RsaKey.AwsKeyId |
||||||
|
}; |
||||||
|
var response = await _kmsClient.GetPublicKeyAsync(request); |
||||||
|
var rsa = RSA.Create(); |
||||||
|
rsa.ImportSubjectPublicKeyInfo(response.PublicKey.ToArray(), out _); |
||||||
|
return rsa.ExportRSAPublicKey(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue