KMS
MicroStack's KMS handler supports symmetric (AES-256), RSA (2048/3072/4096), and NIST ECC keys. Symmetric and RSA keys support encryption/decryption, while RSA and ECC keys support signing/verification. Key aliases, rotation status, and key policies are all supported.
Supported Operations
- CreateKey, ListKeys, DescribeKey, GetPublicKey
- Encrypt, Decrypt, GenerateDataKey, GenerateDataKeyWithoutPlaintext
- Sign, Verify
- CreateAlias, DeleteAlias, ListAliases, UpdateAlias
- EnableKeyRotation, DisableKeyRotation, GetKeyRotationStatus
- GetKeyPolicy, PutKeyPolicy, ListKeyPolicies
- EnableKey, DisableKey, ScheduleKeyDeletion, CancelKeyDeletion
- TagResource, UntagResource, ListResourceTags
Usage
var kms = new AmazonKeyManagementServiceClient(
new BasicAWSCredentials("test", "test"),
new AmazonKeyManagementServiceConfig { ServiceURL = "http://localhost:4566" });
// Create a symmetric encryption key
var key = await kms.CreateKeyAsync(new CreateKeyRequest
{
KeySpec = KeySpec.SYMMETRIC_DEFAULT,
KeyUsage = KeyUsageType.ENCRYPT_DECRYPT,
Description = "my encryption key",
});
var keyId = key.KeyMetadata.KeyId;
// Encrypt data
var plaintext = "sensitive data"u8.ToArray();
var encrypted = await kms.EncryptAsync(new EncryptRequest
{
KeyId = keyId,
Plaintext = new MemoryStream(plaintext),
});
// Decrypt data
var decrypted = await kms.DecryptAsync(new DecryptRequest
{
CiphertextBlob = new MemoryStream(encrypted.CiphertextBlob.ToArray()),
});
Console.WriteLine(System.Text.Encoding.UTF8.GetString(decrypted.Plaintext.ToArray()));
// Output: sensitive dataRSA Sign and Verify
// Create an RSA signing key
var rsaKey = await kms.CreateKeyAsync(new CreateKeyRequest
{
KeySpec = KeySpec.RSA_2048,
KeyUsage = KeyUsageType.SIGN_VERIFY,
});
var rsaKeyId = rsaKey.KeyMetadata.KeyId;
var message = "document to sign"u8.ToArray();
// Sign
var signed = await kms.SignAsync(new SignRequest
{
KeyId = rsaKeyId,
Message = new MemoryStream(message),
MessageType = MessageType.RAW,
SigningAlgorithm = SigningAlgorithmSpec.RSASSA_PKCS1_V1_5_SHA_256,
});
// Verify
var verified = await kms.VerifyAsync(new VerifyRequest
{
KeyId = rsaKeyId,
Message = new MemoryStream(message),
MessageType = MessageType.RAW,
Signature = new MemoryStream(signed.Signature.ToArray()),
SigningAlgorithm = SigningAlgorithmSpec.RSASSA_PKCS1_V1_5_SHA_256,
});
Console.WriteLine(verified.SignatureValid); // TrueECC Sign and Verify
ECC signing keys use the AWS KMS algorithm associated with their curve:
| Key spec | Curve | Signing algorithm |
|---|---|---|
ECC_NIST_P256 |
secp256r1 | ECDSA_SHA_256 |
ECC_NIST_P384 |
secp384r1 | ECDSA_SHA_384 |
ECC_NIST_P521 |
secp521r1 | ECDSA_SHA_512 |
ECC keys require SIGN_VERIFY usage and cannot encrypt or decrypt. ECDSA signatures are returned as DER-encoded ANSI X9.62/RFC 3279 sequences, matching AWS KMS rather than the IEEE P1363 r || s format.
Aliases
// Create an alias for a key
await kms.CreateAliasAsync(new CreateAliasRequest
{
AliasName = "alias/my-app-key",
TargetKeyId = keyId,
});
// Reference the key by alias in encrypt/decrypt operations
var encrypted = await kms.EncryptAsync(new EncryptRequest
{
KeyId = "alias/my-app-key",
Plaintext = new MemoryStream("data"u8.ToArray()),
});
MicroStack