diff --git a/apis/cmk/cmk-ui.yaml b/apis/cmk/cmk-ui.yaml index fbc7d691..afe0a221 100644 --- a/apis/cmk/cmk-ui.yaml +++ b/apis/cmk/cmk-ui.yaml @@ -79,19 +79,27 @@ paths: - Keys summary: Create a new Key description: | - Generate and store a new Key or register a key from customer held keystore. - - For `Hold Your Own Key (HYOK)`, a native key identifier needs to be provided. In this case no new key - material is generated but the key is enrolled within KMS CMK. + Create a new cryptographic key. The API supports two key management models: + + **BYOK (Bring Your Own Key)** + - Key material is imported into CMK-managed keystore + + **HYOK (Hold Your Own Key)** + - Key remains in customer's keystore, CMK connects to it + + Use the `type` field to specify which key model to use. requestBody: - description: Key request body + description: Key request body - see examples for BYOK and HYOK formats required: true content: application/json: schema: $ref: "#/components/schemas/Key" examples: - KeyRequest: - $ref: "#/components/examples/KeyRequest" + BYOKKeyRequest: + $ref: "#/components/examples/BYOKKeyRequest" + HYOKKeyRequest: + $ref: "#/components/examples/HYOKKeyRequest" responses: "201": description: Created @@ -99,6 +107,11 @@ paths: application/json: schema: $ref: "#/components/schemas/Key" + examples: + BYOKKeyResponse: + $ref: "#/components/examples/BYOKKeyResponse" + HYOKKeyResponse: + $ref: "#/components/examples/HYOKKeyResponse" "400": $ref: "#/components/responses/400" "403": @@ -3079,26 +3092,95 @@ components: message: Requested feature is not implemented. id: 635e791c-7ea2-4fd8-9be6-3bab61b2e779 examples: - KeyRequest: + BYOKKeyRequest: + summary: Create a BYOK (Bring Your Own Key) key + description: | + BYOK key creation request. The key material will be imported into CMK-managed keystore, initially with status PENDING_IMPORT. + Region is required to specify where the key will be created. value: - name: example_key_name - type: HYOK + name: byok_example_key + type: BYOK keyConfigurationID: 12345678-90ab-cdef-1234-567890abcdef - description: This key is used for DB key store encryption. - enabled: true + description: BYOK key for database encryption algorithm: AES256 - provider: AWS region: eu-central-1 - AWSBYOKRequest: + HYOKKeyRequest: + summary: Create a HYOK (Hold Your Own Key) key + description: | + HYOK key creation request. The key remains in customer's keystore. + NativeID is the customer-provided key identifier, and accessDetails configure + how CMK connects to the customer's keystore. value: - name: byok_key_name - type: BYOK + name: hyok_example_key + type: HYOK keyConfigurationID: 12345678-90ab-cdef-1234-567890abcdef - description: This key is used for DB key store encryption. - algorithm: AES256 + description: HYOK key connected to customer AWS KMS + nativeID: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab provider: AWS - region: eu-central-1 + accessDetails: + management: + accessAccountID: "111122223333" + accessUserID: "arn:aws:iam::111122223333:user/cmk-service" + endpoint: "https://kms.us-east-2.amazonaws.com" + crypto: + us-east-2: + accessAccountID: "111122223333" + accessUserID: "arn:aws:iam::111122223333:user/cmk-crypto" + endpoint: "https://kms.us-east-2.amazonaws.com" SystemPatchUpdatingLink: value: keyConfigurationID: 12345678-90ab-cdef-1234-567890abcdef retry: false + BYOKKeyResponse: + summary: BYOK key creation response + description: | + Response after creating a BYOK key. Key is in PENDING_IMPORT state until key material is imported. + value: + id: 98765432-10fe-dcba-9876-543210fedcba + name: byok_example_key + type: BYOK + keyConfigurationID: 12345678-90ab-cdef-1234-567890abcdef + description: BYOK key for database encryption + algorithm: AES256 + region: eu-central-1 + isPrimary: false + enabled: false + state: PENDING_IMPORT + underWorkflow: false + metadata: + createdAt: "2026-07-31T10:30:00Z" + updatedAt: "2026-07-31T10:30:00Z" + HYOKKeyResponse: + summary: HYOK key creation response + description: | + Response after registering a HYOK key. Key is ENABLED if successfully connected to customer keystore. + value: + id: 98765432-10fe-dcba-9876-543210fedcba + name: hyok_example_key + type: HYOK + keyConfigurationID: 12345678-90ab-cdef-1234-567890abcdef + description: HYOK key connected to customer AWS KMS + algorithm: AES256 + provider: AWS + isPrimary: false + enabled: true + nativeID: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab + state: ENABLED + region: eu-central-1 + underWorkflow: false + accessDetails: + management: + accessAccountID: "111122223333" + accessUserID: "arn:aws:iam::111122223333:user/cmk-service" + endpoint: "https://kms.us-east-2.amazonaws.com" + crypto: + us-east-2: + accessAccountID: "111122223333" + accessUserID: "arn:aws:iam::111122223333:user/cmk-crypto" + endpoint: "https://kms.us-east-2.amazonaws.com" + isEditable: false + metadata: + createdAt: "2026-07-31T10:30:00Z" + updatedAt: "2026-07-31T10:30:00Z" + totalVersions: 1 + primaryVersion: 1 diff --git a/internal/api/cmkapi/cmkapi.go b/internal/api/cmkapi/cmkapi.go index b5f185f1..ac390bc0 100644 --- a/internal/api/cmkapi/cmkapi.go +++ b/internal/api/cmkapi/cmkapi.go @@ -7040,204 +7040,214 @@ func (sh *strictHandler) TransitionWorkflow(w http.ResponseWriter, r *http.Reque // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/api/transform/key/key.go b/internal/api/transform/key/key.go index 2311e209..2b84c9ba 100644 --- a/internal/api/transform/key/key.go +++ b/internal/api/transform/key/key.go @@ -84,16 +84,10 @@ func ToAPI(k model.Key) (*cmkapi.Key, error) { apiKey.Algorithm = &algorithm } - if k.Provider != "" { - apiKey.Provider = &k.Provider - } - if k.Region != "" { apiKey.Region = &k.Region } - apiKey.NativeID = k.NativeID - apiKey.Name = k.Name if k.Description != "" { apiKey.Description = &k.Description @@ -118,6 +112,10 @@ func ToAPI(k model.Key) (*cmkapi.Key, error) { } apiKey.AccessDetails = accessDetails + apiKey.NativeID = k.NativeID + if k.Provider != "" { + apiKey.Provider = &k.Provider + } } apiKey.IsPrimary = &k.IsPrimary diff --git a/internal/api/transform/key/key_test.go b/internal/api/transform/key/key_test.go index e4354485..cebcbfba 100644 --- a/internal/api/transform/key/key_test.go +++ b/internal/api/transform/key/key_test.go @@ -209,116 +209,124 @@ func TestTransformKeyFromAPI(t *testing.T) { } func TestTransformKeyToAPI(t *testing.T) { - description := "Test key" - nativeID := "native-id-1234" id := uuid.New() keyConfigID := uuid.New() + description := "Test key" - managementAccessData := AccessDataTest{ - AccessAccountID: "123456789012", - AccessUserID: "123456789012:user/test-user", - } - managementAccessJSON, err := json.Marshal(managementAccessData) - assert.NoError(t, err) - - cryptoAccessData := map[string]AccessDataTest{ - "serviceA": { - AccessAccountID: "12344", - AccessUserID: "123456789012:user/serviceA", - }, - "serviceB": { - AccessAccountID: "12345", - AccessUserID: "123456789012:user/serviceB", - }, - } - cryptoAccessJSON, err := json.Marshal(cryptoAccessData) - assert.NoError(t, err) - - modelHYOKKeyRequestMut := testutils.NewMutator(func() model.Key { - return model.Key{ - ID: id, - Name: "test-key", - KeyType: string(cmkapi.KeyTypeHYOK), - KeyConfigurationID: keyConfigID, - Description: description, - NativeID: &nativeID, - State: cmkapi.KeyStateENABLED, - IsPrimary: false, - ManagementAccessData: managementAccessJSON, - CryptoAccessData: cryptoAccessJSON, - EditableRegions: map[string]bool{ - "serviceA": true, - "serviceB": false, - }, - } - }) - - HYOKKeyRequestMut := testutils.NewMutator(func() cmkapi.Key { - return cmkapi.Key{ - Id: AnyPtr(uuid.MustParse(id.String())), - Name: "test-key", - Type: cmkapi.KeyTypeHYOK, - KeyConfigurationID: keyConfigID, - Description: &description, - NativeID: &nativeID, - State: AnyPtr(cmkapi.KeyStateENABLED), - IsPrimary: ptr.PointTo(false), - AccessDetails: &cmkapi.KeyAccessDetails{ - Management: ptr.PointTo(map[string]any{ - accessAccountIDField: "123456789012", - accessUserIDField: "123456789012:user/test-user", + tests := []struct { + name string + key model.Key + expected cmkapi.Key + }{ + { + name: "Transform to HYOK Key", + key: model.Key{ + ID: id, + Name: "test-key", + KeyType: string(cmkapi.KeyTypeHYOK), + KeyConfigurationID: keyConfigID, + Description: description, + NativeID: ptr.PointTo("native-id-1234"), + State: cmkapi.KeyStateENABLED, + IsPrimary: false, + ManagementAccessData: mustMarshal(AccessDataTest{ + AccessAccountID: "123456789012", + AccessUserID: "123456789012:user/test-user", }), - Crypto: ptr.PointTo(map[string]map[string]any{ + CryptoAccessData: mustMarshal(map[string]AccessDataTest{ "serviceA": { - accessAccountIDField: "12344", - accessUserIDField: "123456789012:user/serviceA", - manager.IsEditableCryptoAccess: true, + AccessAccountID: "12344", + AccessUserID: "123456789012:user/serviceA", }, "serviceB": { - accessAccountIDField: "12345", - accessUserIDField: "123456789012:user/serviceB", - manager.IsEditableCryptoAccess: false, + AccessAccountID: "12345", + AccessUserID: "123456789012:user/serviceB", }, }), + EditableRegions: map[string]bool{ + "serviceA": true, + "serviceB": false, + }, }, - Metadata: &cmkapi.KeyMetadata{ - CreatedAt: AnyPtr(time.Time{}), - UpdatedAt: AnyPtr(time.Time{}), + expected: cmkapi.Key{ + Id: &id, + Name: "test-key", + Type: cmkapi.KeyTypeHYOK, + KeyConfigurationID: keyConfigID, + Description: &description, + NativeID: ptr.PointTo("native-id-1234"), + State: ptr.PointTo(cmkapi.KeyStateENABLED), + IsPrimary: ptr.PointTo(false), + AccessDetails: &cmkapi.KeyAccessDetails{ + Management: ptr.PointTo(map[string]any{ + accessAccountIDField: "123456789012", + accessUserIDField: "123456789012:user/test-user", + }), + Crypto: ptr.PointTo(map[string]map[string]any{ + "serviceA": { + accessAccountIDField: "12344", + accessUserIDField: "123456789012:user/serviceA", + manager.IsEditableCryptoAccess: true, + }, + "serviceB": { + accessAccountIDField: "12345", + accessUserIDField: "123456789012:user/serviceB", + manager.IsEditableCryptoAccess: false, + }, + }), + }, + Metadata: &cmkapi.KeyMetadata{ + CreatedAt: &time.Time{}, + UpdatedAt: &time.Time{}, + }, + UnderWorkflow: ptr.PointTo(false), }, - UnderWorkflow: ptr.PointTo(false), - } - }) - - tests := []struct { - name string - key model.Key - expected cmkapi.Key - expectErr bool - err error - }{ + }, { - name: "T212KeyToAPISuccess", - key: modelHYOKKeyRequestMut(), - expected: HYOKKeyRequestMut(), - expectErr: false, + name: "Transform to BYOK key", + key: model.Key{ + ID: id, + Name: "byok-key", + KeyType: string(cmkapi.KeyTypeBYOK), + KeyConfigurationID: keyConfigID, + Description: description, + Algorithm: string(cmkapi.KeyAlgorithmAES256), + Region: regionEUWest1, + State: cmkapi.KeyStateENABLED, + IsPrimary: true, + }, + expected: cmkapi.Key{ + Id: &id, + Name: "byok-key", + Type: cmkapi.KeyTypeBYOK, + KeyConfigurationID: keyConfigID, + Description: &description, + Algorithm: ptr.PointTo(cmkapi.KeyAlgorithmAES256), + Region: ptr.PointTo(regionEUWest1), + State: ptr.PointTo(cmkapi.KeyStateENABLED), + IsPrimary: ptr.PointTo(true), + Metadata: &cmkapi.KeyMetadata{ + CreatedAt: &time.Time{}, + UpdatedAt: &time.Time{}, + }, + UnderWorkflow: ptr.PointTo(false), + }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { apiKey, err := key.ToAPI(tt.key) - if tt.expectErr { - assert.EqualError(t, err, tt.err.Error()) - assert.Nil(t, apiKey) - } else { - assert.NoError(t, err) - assert.Equal(t, tt.expected, *apiKey) - } + assert.NoError(t, err) + assert.Equal(t, tt.expected, *apiKey) }) } } -// AnyPtr returns a pointer to the given value of any type. -func AnyPtr[T any](v T) *T { - return &v +func mustMarshal(v any) []byte { + b, err := json.Marshal(v) + if err != nil { + panic(err) + } + return b }