ToolUp.Encryption.AwsKms
0.22.0
Prefix Reserved
dotnet add package ToolUp.Encryption.AwsKms --version 0.22.0
NuGet\Install-Package ToolUp.Encryption.AwsKms -Version 0.22.0
<PackageReference Include="ToolUp.Encryption.AwsKms" Version="0.22.0" />
<PackageVersion Include="ToolUp.Encryption.AwsKms" Version="0.22.0" />
<PackageReference Include="ToolUp.Encryption.AwsKms" />
paket add ToolUp.Encryption.AwsKms --version 0.22.0
#r "nuget: ToolUp.Encryption.AwsKms, 0.22.0"
#:package ToolUp.Encryption.AwsKms@0.22.0
#addin nuget:?package=ToolUp.Encryption.AwsKms&version=0.22.0
#tool nuget:?package=ToolUp.Encryption.AwsKms&version=0.22.0
ToolUp.Encryption.AwsKms
AWS KMS-backed IBlobEncryptionKeyResolver for ToolUp.Platform
(Phase 22a). Envelope encryption: the deployment's KMS customer master
key (CMK) never leaves AWS. Each blob is encrypted with its own AES-256
data key (DEK) minted by GenerateDataKey; the CMK-wrapped DEK
ciphertext is stamped into the blob envelope's KeyId, and a later read
unwraps it via Decrypt. The resolver holds no key state between calls
(GP 12 rule 4).
Mirrors src/Storage/<Provider>/ packaging. Server-only companion.
Quick start
open Amazon.KeyManagementService
open ToolUp.Encryption.AwsKms
let kms = new AmazonKeyManagementServiceClient() // region + creds from the env
let resolver = AwsKmsKeyResolver.create kms "arn:aws:kms:eu-west-2:...:key/<cmk>"
// wire via ServerApp.withEncryptedBlobStorage resolver
Per-scope CMKs (multi-tenant key custody):
let resolver = AwsKmsKeyResolver.createPerScope kms (fun scope -> cmkArnFor scope.ScopeId)
Behaviour
ResolveKey scope→GenerateDataKey(CMK, AES_256); returns the plaintext DEK + aKeyIdofaws-kms:v1:{base64(wrappedDEK)}.ResolveKeyById keyId→ unwrap +Decrypt. A disabled / pending- deletion / deleted CMK surfaces asKeyResolutionError.KeyDestroyed(HTTP 410 Gone at the API boundary — crypto-shred); an unknown key asKeyNotFound; transient failures asStorageFailure.
Verification
The resolver requires a live KMS CMK (no offline fake — KMS has no
local emulator and IAmazonKeyManagementService is not practically
mockable). Verify against a real CMK:
- Create a symmetric KMS key; grant the deployment role
kms:GenerateDataKey+kms:Decrypt. ResolveKey→ encrypt a blob →ResolveKeyByIdround-trips the DEK.- Disable the CMK →
ResolveKeyByIdreturnsKeyDestroyed.
Follow-ups (Phase 22a)
- Azure Key Vault + GCP KMS mirror resolvers (
src/Encryption/{AzureKeyVault,GoogleCloudKms}/). - The Phase 40 KMS-signing flavour (
IArtefactSignerbacked by KMS asymmetricSign, key never in process memory).
License
Apache-2.0.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- AWSSDK.Core (>= 4.0.7.1)
- AWSSDK.KeyManagementService (>= 4.0.4.4)
- FSharp.Core (>= 10.1.300)
- ToolUp.Platform.Core (>= 0.22.0)
- ToolUp.Platform.Server (>= 0.22.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.