Skip to content

Commit 953110c

Browse files
Merge pull request #303 from microsoft/users/elizafan/cloudagentsupportkmsv2
Modifications on key structure, WrapKey, UnWrapKey, RotateKey and related functions and test cases to support KMSv2
2 parents 55aee56 + 6d33183 commit 953110c

File tree

5 files changed

+292
-24
lines changed

5 files changed

+292
-24
lines changed

services/security/keyvault/key/client.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type Service interface {
2020
Decrypt(context.Context, string, string, string, *keyvault.KeyOperationsParameters) (*keyvault.KeyOperationResult, error)
2121
WrapKey(context.Context, string, string, string, *keyvault.KeyOperationsParameters) (*keyvault.KeyOperationResult, error)
2222
UnwrapKey(context.Context, string, string, string, *keyvault.KeyOperationsParameters) (*keyvault.KeyOperationResult, error)
23+
RotateKey(context.Context, string, string, string) (*keyvault.KeyOperationResult, error)
2324
ImportKey(context.Context, string, string, string, *keyvault.Key) (*keyvault.Key, error)
2425
ExportKey(context.Context, string, string, string, *keyvault.Key) (*keyvault.Key, error)
2526
Sign(context.Context, string, string, string, *keyvault.KeySignParameters) (*keyvault.KeyOperationResult, error)
@@ -90,6 +91,11 @@ func (c *KeyClient) UnwrapKey(ctx context.Context, group, vaultName, name string
9091
return c.internal.UnwrapKey(ctx, group, vaultName, name, parameters)
9192
}
9293

94+
// RotateKey
95+
func (c *KeyClient) RotateKey(ctx context.Context, group, vaultName, name string) (result *keyvault.KeyOperationResult, err error) {
96+
return c.internal.RotateKey(ctx, group, vaultName, name)
97+
}
98+
9399
// Sign
94100
func (c *KeyClient) Sign(ctx context.Context, group, vaultName, name string, parameters *keyvault.KeySignParameters) (result *keyvault.KeyOperationResult, err error) {
95101
return c.internal.Sign(ctx, group, vaultName, name, parameters)

services/security/keyvault/key/key.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ func getKey(sec *wssdcloudsecurity.Key, vaultName string, getCustomValue func(*w
2222
}
2323

2424
key := keyvault.Key{
25-
ID: &sec.Id,
26-
Name: &sec.Name,
27-
Version: &sec.Status.Version.Number,
25+
ID: &sec.Id,
26+
Name: &sec.Name,
27+
Version: &sec.Status.Version.Number,
28+
KeyAge: sec.KeyAge,
29+
KeyVersion: &sec.KeyVersion,
2830
KeyProperties: &keyvault.KeyProperties{
2931
Statuses: status.GetStatuses(sec.GetStatus()),
3032
KeyType: getKeyType(sec.Type),
@@ -65,18 +67,19 @@ func getKey(sec *wssdcloudsecurity.Key, vaultName string, getCustomValue func(*w
6567
return key, nil
6668
}
6769

70+
// KeyVersion optional in getWssdKeyByVaultName function
6871
func getWssdKeyByVaultName(name string, groupName,
69-
vaultName string, opType wssdcloudcommon.Operation) (*wssdcloudsecurity.Key, error) {
72+
vaultName, keyVersion string, opType wssdcloudcommon.Operation) (*wssdcloudsecurity.Key, error) {
7073
key := &wssdcloudsecurity.Key{
71-
Name: name,
72-
VaultName: vaultName,
73-
GroupName: groupName,
74-
Type: wssdcloudcommon.JsonWebKeyType_EC,
75-
Size: wssdcloudcommon.KeySize_K_UNKNOWN,
76-
KeyOps: []wssdcloudcommon.KeyOperation{},
77-
Status: status.InitStatus(),
74+
Name: name,
75+
VaultName: vaultName,
76+
GroupName: groupName,
77+
Type: wssdcloudcommon.JsonWebKeyType_EC,
78+
Size: wssdcloudcommon.KeySize_K_UNKNOWN,
79+
KeyOps: []wssdcloudcommon.KeyOperation{},
80+
Status: status.InitStatus(),
81+
KeyVersion: keyVersion,
7882
}
79-
8083
// No Update support
8184
return key, nil
8285
}

services/security/keyvault/key/wssd.go

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func newKeyClient(subID string, authorizer auth.Authorizer) (*client, error) {
3333

3434
// Get
3535
func (c *client) Get(ctx context.Context, group, vaultName, name string) (*[]keyvault.Key, error) {
36-
request, err := getKeyRequestByVaultName(wssdcloudcommon.Operation_GET, group, vaultName, name)
36+
request, err := getKeyRequestByVaultName(wssdcloudcommon.Operation_GET, group, vaultName, name, "")
3737
if err != nil {
3838
return nil, err
3939
}
@@ -44,9 +44,9 @@ func (c *client) Get(ctx context.Context, group, vaultName, name string) (*[]key
4444
return getKeysFromResponse(response, vaultName, nil)
4545
}
4646

47-
// get
48-
func (c *client) get(ctx context.Context, group, vaultName, name string) ([]*wssdcloudsecurity.Key, error) {
49-
request, err := getKeyRequestByVaultName(wssdcloudcommon.Operation_GET, group, vaultName, name)
47+
// keyVersion optional in get function
48+
func (c *client) get(ctx context.Context, group, vaultName, name, keyVersion string) ([]*wssdcloudsecurity.Key, error) {
49+
request, err := getKeyRequestByVaultName(wssdcloudcommon.Operation_GET, group, vaultName, name, keyVersion)
5050
if err != nil {
5151
return nil, err
5252
}
@@ -384,6 +384,20 @@ func (c *client) UnwrapKey(ctx context.Context, group, vaultName, name string, p
384384
return
385385
}
386386

387+
func (c *client) RotateKey(ctx context.Context, group, vaultName, name string) (result *keyvault.KeyOperationResult, err error) {
388+
request, err := c.getKeyOperationRequestRotate(ctx, group, vaultName, name, wssdcloudcommon.ProviderAccessOperation_Key_Rotate)
389+
if err != nil {
390+
return
391+
}
392+
393+
response, err := c.KeyAgentClient.Operate(ctx, request)
394+
if err != nil {
395+
return
396+
}
397+
result, err = getDataFromResponse(response)
398+
return
399+
}
400+
387401
func (c *client) Sign(ctx context.Context, group, vaultName, name string, param *keyvault.KeySignParameters) (result *keyvault.KeyOperationResult, err error) {
388402
request, err := c.getKeyOperationRequestSigning(ctx, group, vaultName, name, param, wssdcloudcommon.ProviderAccessOperation_Key_Sign)
389403
if err != nil {
@@ -425,12 +439,13 @@ func getKeysFromResponse(response *wssdcloudsecurity.KeyResponse, vaultName stri
425439
return &tmp, nil
426440
}
427441

428-
func getKeyRequestByVaultName(opType wssdcloudcommon.Operation, groupName, vaultName, name string) (*wssdcloudsecurity.KeyRequest, error) {
442+
// KeyVersion optional in getKeyRequestByVaultName
443+
func getKeyRequestByVaultName(opType wssdcloudcommon.Operation, groupName, vaultName, name, keyVersion string) (*wssdcloudsecurity.KeyRequest, error) {
429444
request := &wssdcloudsecurity.KeyRequest{
430445
OperationType: opType,
431446
Keys: []*wssdcloudsecurity.Key{},
432447
}
433-
key, err := getWssdKeyByVaultName(name, groupName, vaultName, opType)
448+
key, err := getWssdKeyByVaultName(name, groupName, vaultName, keyVersion, opType)
434449
if err != nil {
435450
return nil, err
436451
}
@@ -453,7 +468,8 @@ func getKeyRequest(opType wssdcloudcommon.Operation, groupName, vaultName, name
453468

454469
func getDataFromResponse(response *wssdcloudsecurity.KeyOperationResponse) (result *keyvault.KeyOperationResult, err error) {
455470
result = &keyvault.KeyOperationResult{
456-
Result: &response.Data,
471+
Result: &response.Data,
472+
KeyVersion: &response.KeyVersion,
457473
}
458474
return result, nil
459475
}
@@ -491,7 +507,28 @@ func (c *client) getKeyOperationRequest(ctx context.Context,
491507
Algorithm: algo,
492508
}
493509

494-
key, err := c.get(ctx, groupName, vaultName, name)
510+
key, err := c.get(ctx, groupName, vaultName, name, param.KeyVersion)
511+
if err != nil {
512+
return nil, err
513+
}
514+
515+
if len(key) == 0 {
516+
return nil, errors.Wrapf(errors.NotFound, "Key[%s] Vault[%s]", name, vaultName)
517+
}
518+
519+
request.Key = key[0]
520+
return request, nil
521+
}
522+
523+
func (c *client) getKeyOperationRequestRotate(ctx context.Context,
524+
groupName, vaultName, name string,
525+
opType wssdcloudcommon.ProviderAccessOperation,
526+
) (*wssdcloudsecurity.KeyOperationRequest, error) {
527+
request := &wssdcloudsecurity.KeyOperationRequest{
528+
OperationType: opType,
529+
}
530+
531+
key, err := c.get(ctx, groupName, vaultName, name, "")
495532
if err != nil {
496533
return nil, err
497534
}
@@ -533,7 +570,7 @@ func (c *client) getKeyOperationRequestSigning(ctx context.Context,
533570
SignVerifyParams: &signVerifyParam,
534571
}
535572

536-
key, err := c.get(ctx, groupName, vaultName, name)
573+
key, err := c.get(ctx, groupName, vaultName, name, "")
537574
if err != nil {
538575
return nil, err
539576
}
@@ -580,7 +617,7 @@ func (c *client) getKeyOperationRequestVerify(ctx context.Context,
580617
SignVerifyParams: &signVerifyParam,
581618
}
582619

583-
key, err := c.get(ctx, groupName, vaultName, name)
620+
key, err := c.get(ctx, groupName, vaultName, name, "")
584621
if err != nil {
585622
return nil, err
586623
}

0 commit comments

Comments
 (0)