1*e7b1675dSTing-Kang Chang// Copyright 2019 Google LLC 2*e7b1675dSTing-Kang Chang// 3*e7b1675dSTing-Kang Chang// Licensed under the Apache License, Version 2.0 (the "License"); 4*e7b1675dSTing-Kang Chang// you may not use this file except in compliance with the License. 5*e7b1675dSTing-Kang Chang// You may obtain a copy of the License at 6*e7b1675dSTing-Kang Chang// 7*e7b1675dSTing-Kang Chang// http://www.apache.org/licenses/LICENSE-2.0 8*e7b1675dSTing-Kang Chang// 9*e7b1675dSTing-Kang Chang// Unless required by applicable law or agreed to in writing, software 10*e7b1675dSTing-Kang Chang// distributed under the License is distributed on an "AS IS" BASIS, 11*e7b1675dSTing-Kang Chang// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*e7b1675dSTing-Kang Chang// See the License for the specific language governing permissions and 13*e7b1675dSTing-Kang Chang// limitations under the License. 14*e7b1675dSTing-Kang Chang// 15*e7b1675dSTing-Kang Chang//////////////////////////////////////////////////////////////////////////////// 16*e7b1675dSTing-Kang Chang 17*e7b1675dSTing-Kang Changpackage keyset_test 18*e7b1675dSTing-Kang Chang 19*e7b1675dSTing-Kang Changimport ( 20*e7b1675dSTing-Kang Chang "strings" 21*e7b1675dSTing-Kang Chang "testing" 22*e7b1675dSTing-Kang Chang 23*e7b1675dSTing-Kang Chang "github.com/google/tink/go/keyset" 24*e7b1675dSTing-Kang Chang "github.com/google/tink/go/mac" 25*e7b1675dSTing-Kang Chang "github.com/google/tink/go/testkeyset" 26*e7b1675dSTing-Kang Chang "github.com/google/tink/go/testutil" 27*e7b1675dSTing-Kang Chang 28*e7b1675dSTing-Kang Chang tinkpb "github.com/google/tink/go/proto/tink_go_proto" 29*e7b1675dSTing-Kang Chang) 30*e7b1675dSTing-Kang Chang 31*e7b1675dSTing-Kang Changfunc TestKeysetManagerBasic(t *testing.T) { 32*e7b1675dSTing-Kang Chang // Create a keyset that contains a single HmacKey. 33*e7b1675dSTing-Kang Chang ksm := keyset.NewManager() 34*e7b1675dSTing-Kang Chang kt := mac.HMACSHA256Tag128KeyTemplate() 35*e7b1675dSTing-Kang Chang keyID, err := ksm.Add(kt) 36*e7b1675dSTing-Kang Chang if err != nil { 37*e7b1675dSTing-Kang Chang t.Errorf("cannot add key: %s", err) 38*e7b1675dSTing-Kang Chang } 39*e7b1675dSTing-Kang Chang err = ksm.SetPrimary(keyID) 40*e7b1675dSTing-Kang Chang if err != nil { 41*e7b1675dSTing-Kang Chang t.Errorf("cannot set primary key: %s", err) 42*e7b1675dSTing-Kang Chang } 43*e7b1675dSTing-Kang Chang h, err := ksm.Handle() 44*e7b1675dSTing-Kang Chang if err != nil { 45*e7b1675dSTing-Kang Chang t.Errorf("cannot get keyset handle: %s", err) 46*e7b1675dSTing-Kang Chang } 47*e7b1675dSTing-Kang Chang ks := testkeyset.KeysetMaterial(h) 48*e7b1675dSTing-Kang Chang if len(ks.Key) != 1 { 49*e7b1675dSTing-Kang Chang t.Fatal("expect the number of keys in the keyset is 1") 50*e7b1675dSTing-Kang Chang } 51*e7b1675dSTing-Kang Chang if ks.Key[0].KeyId != ks.PrimaryKeyId || 52*e7b1675dSTing-Kang Chang ks.Key[0].KeyData.TypeUrl != testutil.HMACTypeURL || 53*e7b1675dSTing-Kang Chang ks.Key[0].Status != tinkpb.KeyStatusType_ENABLED || 54*e7b1675dSTing-Kang Chang ks.Key[0].OutputPrefixType != tinkpb.OutputPrefixType_TINK { 55*e7b1675dSTing-Kang Chang t.Errorf("incorrect key information: %s", ks.Key[0]) 56*e7b1675dSTing-Kang Chang } 57*e7b1675dSTing-Kang Chang} 58*e7b1675dSTing-Kang Chang 59*e7b1675dSTing-Kang Changfunc TestExistingKeyset(t *testing.T) { 60*e7b1675dSTing-Kang Chang // Create a keyset that contains a single HmacKey. 61*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManager() 62*e7b1675dSTing-Kang Chang kt := mac.HMACSHA256Tag128KeyTemplate() 63*e7b1675dSTing-Kang Chang keyID1, err := ksm1.Add(kt) 64*e7b1675dSTing-Kang Chang if err != nil { 65*e7b1675dSTing-Kang Chang t.Errorf("cannot add key: %s", err) 66*e7b1675dSTing-Kang Chang } 67*e7b1675dSTing-Kang Chang err = ksm1.SetPrimary(keyID1) 68*e7b1675dSTing-Kang Chang if err != nil { 69*e7b1675dSTing-Kang Chang t.Errorf("cannot set primary key: %s", err) 70*e7b1675dSTing-Kang Chang } 71*e7b1675dSTing-Kang Chang h1, err := ksm1.Handle() 72*e7b1675dSTing-Kang Chang if err != nil { 73*e7b1675dSTing-Kang Chang t.Errorf("cannot get keyset handle: %s", err) 74*e7b1675dSTing-Kang Chang } 75*e7b1675dSTing-Kang Chang ks1 := testkeyset.KeysetMaterial(h1) 76*e7b1675dSTing-Kang Chang 77*e7b1675dSTing-Kang Chang ksm2 := keyset.NewManagerFromHandle(h1) 78*e7b1675dSTing-Kang Chang keyID2, err := ksm2.Add(kt) 79*e7b1675dSTing-Kang Chang if err != nil { 80*e7b1675dSTing-Kang Chang t.Errorf("cannot add key: %s", err) 81*e7b1675dSTing-Kang Chang } 82*e7b1675dSTing-Kang Chang err = ksm2.SetPrimary(keyID2) 83*e7b1675dSTing-Kang Chang if err != nil { 84*e7b1675dSTing-Kang Chang t.Errorf("cannot set primary key: %s", err) 85*e7b1675dSTing-Kang Chang } 86*e7b1675dSTing-Kang Chang h2, err := ksm2.Handle() 87*e7b1675dSTing-Kang Chang if err != nil { 88*e7b1675dSTing-Kang Chang t.Errorf("cannot get keyset handle: %s", err) 89*e7b1675dSTing-Kang Chang } 90*e7b1675dSTing-Kang Chang ks2 := testkeyset.KeysetMaterial(h2) 91*e7b1675dSTing-Kang Chang 92*e7b1675dSTing-Kang Chang if len(ks2.Key) != 2 { 93*e7b1675dSTing-Kang Chang t.Errorf("expect the number of keys to be 2, got %d", len(ks2.Key)) 94*e7b1675dSTing-Kang Chang } 95*e7b1675dSTing-Kang Chang if ks1.Key[0].String() != ks2.Key[0].String() { 96*e7b1675dSTing-Kang Chang t.Errorf("expect the first key in two keysets to be the same") 97*e7b1675dSTing-Kang Chang } 98*e7b1675dSTing-Kang Chang if ks2.Key[1].KeyId != ks2.PrimaryKeyId { 99*e7b1675dSTing-Kang Chang t.Errorf("expect the second key to be primary") 100*e7b1675dSTing-Kang Chang } 101*e7b1675dSTing-Kang Chang} 102*e7b1675dSTing-Kang Chang 103*e7b1675dSTing-Kang Changfunc TestKeysetManagerFull(t *testing.T) { 104*e7b1675dSTing-Kang Chang // Test a full keyset manager cycle: add, get info, set primary. 105*e7b1675dSTing-Kang Chang ksm := keyset.NewManager() 106*e7b1675dSTing-Kang Chang kt := mac.HMACSHA256Tag128KeyTemplate() 107*e7b1675dSTing-Kang Chang _, err := ksm.Add(kt) 108*e7b1675dSTing-Kang Chang if err != nil { 109*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got %s", err) 110*e7b1675dSTing-Kang Chang } 111*e7b1675dSTing-Kang Chang h1, err := ksm.Handle() 112*e7b1675dSTing-Kang Chang if err != nil { 113*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got %s", err) 114*e7b1675dSTing-Kang Chang } 115*e7b1675dSTing-Kang Chang info := h1.KeysetInfo() 116*e7b1675dSTing-Kang Chang if len(info.KeyInfo) != 1 { 117*e7b1675dSTing-Kang Chang t.Errorf("Expected one key but got %d", len(info.KeyInfo)) 118*e7b1675dSTing-Kang Chang } 119*e7b1675dSTing-Kang Chang newPrimaryKey := info.KeyInfo[0].KeyId 120*e7b1675dSTing-Kang Chang err = ksm.SetPrimary(newPrimaryKey) 121*e7b1675dSTing-Kang Chang if err != nil { 122*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got %s", err) 123*e7b1675dSTing-Kang Chang } 124*e7b1675dSTing-Kang Chang // validate this is a valid keyset 125*e7b1675dSTing-Kang Chang ks1 := testkeyset.KeysetMaterial(h1) 126*e7b1675dSTing-Kang Chang err = keyset.Validate(ks1) 127*e7b1675dSTing-Kang Chang if err != nil { 128*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got %s", err) 129*e7b1675dSTing-Kang Chang } 130*e7b1675dSTing-Kang Chang} 131*e7b1675dSTing-Kang Chang 132*e7b1675dSTing-Kang Changfunc TestKeysetManagerAdd(t *testing.T) { 133*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManager() 134*e7b1675dSTing-Kang Chang kt := mac.HMACSHA256Tag128KeyTemplate() 135*e7b1675dSTing-Kang Chang keyID, err := ksm1.Add(kt) 136*e7b1675dSTing-Kang Chang if err != nil { 137*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got %s", err) 138*e7b1675dSTing-Kang Chang } 139*e7b1675dSTing-Kang Chang h, err := ksm1.Handle() 140*e7b1675dSTing-Kang Chang if err != nil { 141*e7b1675dSTing-Kang Chang t.Errorf("Cannot get keyset handle: %s", err) 142*e7b1675dSTing-Kang Chang } 143*e7b1675dSTing-Kang Chang ks := testkeyset.KeysetMaterial(h) 144*e7b1675dSTing-Kang Chang if len(ks.Key) != 1 { 145*e7b1675dSTing-Kang Chang t.Errorf("Expected one key but got %d", len(ks.Key)) 146*e7b1675dSTing-Kang Chang } 147*e7b1675dSTing-Kang Chang if ks.Key[0].KeyId != keyID { 148*e7b1675dSTing-Kang Chang t.Errorf("Expected added keyID to be %d but got %d", keyID, ks.Key[0].KeyId) 149*e7b1675dSTing-Kang Chang } 150*e7b1675dSTing-Kang Chang if ks.Key[0].Status != tinkpb.KeyStatusType_ENABLED { 151*e7b1675dSTing-Kang Chang t.Errorf("Expected key to be enabled but got %s", ks.Key[0].Status.String()) 152*e7b1675dSTing-Kang Chang } 153*e7b1675dSTing-Kang Chang // no primary key set 154*e7b1675dSTing-Kang Chang if ks.PrimaryKeyId != 0 { 155*e7b1675dSTing-Kang Chang t.Errorf("Expected no primary key but got %d", ks.PrimaryKeyId) 156*e7b1675dSTing-Kang Chang } 157*e7b1675dSTing-Kang Chang} 158*e7b1675dSTing-Kang Chang 159*e7b1675dSTing-Kang Changfunc TestKeysetManagerAddWithNilKeysetTemplateFails(t *testing.T) { 160*e7b1675dSTing-Kang Chang // ops with nil template should fail 161*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManager() 162*e7b1675dSTing-Kang Chang _, err := ksm1.Add(nil) 163*e7b1675dSTing-Kang Chang if err == nil { 164*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Add succeeded, but want error") 165*e7b1675dSTing-Kang Chang } 166*e7b1675dSTing-Kang Chang} 167*e7b1675dSTing-Kang Chang 168*e7b1675dSTing-Kang Changfunc TestKeysetManagerAddWithInvalidTypeUrlFails(t *testing.T) { 169*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManager() 170*e7b1675dSTing-Kang Chang kt := &tinkpb.KeyTemplate{ 171*e7b1675dSTing-Kang Chang TypeUrl: "invalid type", 172*e7b1675dSTing-Kang Chang OutputPrefixType: tinkpb.OutputPrefixType_TINK, 173*e7b1675dSTing-Kang Chang } 174*e7b1675dSTing-Kang Chang _, err := ksm1.Add(kt) 175*e7b1675dSTing-Kang Chang if err == nil { 176*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Add succeeded, want error") 177*e7b1675dSTing-Kang Chang } 178*e7b1675dSTing-Kang Chang} 179*e7b1675dSTing-Kang Chang 180*e7b1675dSTing-Kang Changfunc TestKeysetManagerAddWithUnknownOutputPrefixTypeFails(t *testing.T) { 181*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManager() 182*e7b1675dSTing-Kang Chang kt := mac.HMACSHA256Tag128KeyTemplate() 183*e7b1675dSTing-Kang Chang kt.OutputPrefixType = tinkpb.OutputPrefixType_UNKNOWN_PREFIX 184*e7b1675dSTing-Kang Chang _, err := ksm1.Add(kt) 185*e7b1675dSTing-Kang Chang if err == nil { 186*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Add(kt) where kt has an unknown prefix succeeded, want error") 187*e7b1675dSTing-Kang Chang } 188*e7b1675dSTing-Kang Chang} 189*e7b1675dSTing-Kang Chang 190*e7b1675dSTing-Kang Changfunc TestKeysetManagerEnable(t *testing.T) { 191*e7b1675dSTing-Kang Chang keyID := uint32(42) 192*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 193*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_DISABLED, keyID, tinkpb.OutputPrefixType_TINK) 194*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key}) 195*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 196*e7b1675dSTing-Kang Chang if err != nil { 197*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 198*e7b1675dSTing-Kang Chang } 199*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 200*e7b1675dSTing-Kang Chang // enable key 201*e7b1675dSTing-Kang Chang err = ksm1.Enable(keyID) 202*e7b1675dSTing-Kang Chang if err != nil { 203*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 204*e7b1675dSTing-Kang Chang } 205*e7b1675dSTing-Kang Chang h2, _ := ksm1.Handle() 206*e7b1675dSTing-Kang Chang ks2 := testkeyset.KeysetMaterial(h2) 207*e7b1675dSTing-Kang Chang if len(ks2.Key) != 1 { 208*e7b1675dSTing-Kang Chang t.Fatalf("Expected only one key, got %d", len(ks2.Key)) 209*e7b1675dSTing-Kang Chang } 210*e7b1675dSTing-Kang Chang if ks2.Key[0].KeyId != keyID { 211*e7b1675dSTing-Kang Chang t.Errorf("Expected keyID %d, got %d", keyID, ks2.Key[0].KeyId) 212*e7b1675dSTing-Kang Chang } 213*e7b1675dSTing-Kang Chang if ks2.Key[0].Status != tinkpb.KeyStatusType_ENABLED { 214*e7b1675dSTing-Kang Chang t.Errorf("Expected key to be enabled, but got %s", ks2.Key[0].Status.String()) 215*e7b1675dSTing-Kang Chang } 216*e7b1675dSTing-Kang Chang} 217*e7b1675dSTing-Kang Chang 218*e7b1675dSTing-Kang Changfunc TestKeysetManagerEnableWithUnknownStatus(t *testing.T) { 219*e7b1675dSTing-Kang Chang keyID := uint32(42) 220*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 221*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_UNKNOWN_STATUS, keyID, tinkpb.OutputPrefixType_TINK) 222*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key}) 223*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 224*e7b1675dSTing-Kang Chang if err != nil { 225*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 226*e7b1675dSTing-Kang Chang } 227*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 228*e7b1675dSTing-Kang Chang // enable key 229*e7b1675dSTing-Kang Chang err = ksm1.Enable(keyID) 230*e7b1675dSTing-Kang Chang if err == nil { 231*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Enable where key has unknown status succeeded, want error") 232*e7b1675dSTing-Kang Chang } 233*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "cannot enable") { 234*e7b1675dSTing-Kang Chang t.Errorf("Expected 'cannot enable' message, got %s", err) 235*e7b1675dSTing-Kang Chang } 236*e7b1675dSTing-Kang Chang} 237*e7b1675dSTing-Kang Chang 238*e7b1675dSTing-Kang Changfunc TestKeysetManagerEnableWithDestroyed(t *testing.T) { 239*e7b1675dSTing-Kang Chang keyID := uint32(42) 240*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", nil, tinkpb.KeyData_SYMMETRIC) 241*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_DESTROYED, keyID, tinkpb.OutputPrefixType_TINK) 242*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key}) 243*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 244*e7b1675dSTing-Kang Chang if err != nil { 245*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 246*e7b1675dSTing-Kang Chang } 247*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 248*e7b1675dSTing-Kang Chang // enable key 249*e7b1675dSTing-Kang Chang err = ksm1.Enable(keyID) 250*e7b1675dSTing-Kang Chang if err == nil { 251*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Enable where key was destroyed succeeded, want error") 252*e7b1675dSTing-Kang Chang } 253*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "cannot enable") { 254*e7b1675dSTing-Kang Chang t.Errorf("Expected 'cannot enable' message, got %s", err) 255*e7b1675dSTing-Kang Chang } 256*e7b1675dSTing-Kang Chang} 257*e7b1675dSTing-Kang Chang 258*e7b1675dSTing-Kang Changfunc TestKeysetManagerEnableWithMissingKey(t *testing.T) { 259*e7b1675dSTing-Kang Chang keyID := uint32(42) 260*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 261*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_UNKNOWN_STATUS, keyID, tinkpb.OutputPrefixType_TINK) 262*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key}) 263*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 264*e7b1675dSTing-Kang Chang if err != nil { 265*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 266*e7b1675dSTing-Kang Chang } 267*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 268*e7b1675dSTing-Kang Chang // enable key 269*e7b1675dSTing-Kang Chang err = ksm1.Enable(uint32(43)) 270*e7b1675dSTing-Kang Chang if err == nil { 271*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Enable where key doesn't exist succeeded, want error") 272*e7b1675dSTing-Kang Chang } 273*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "not found") { 274*e7b1675dSTing-Kang Chang t.Errorf("Expected 'not found' message, got %s", err) 275*e7b1675dSTing-Kang Chang } 276*e7b1675dSTing-Kang Chang} 277*e7b1675dSTing-Kang Chang 278*e7b1675dSTing-Kang Changfunc TestKeysetManagerSetPrimary(t *testing.T) { 279*e7b1675dSTing-Kang Chang keyID := uint32(42) 280*e7b1675dSTing-Kang Chang newKeyID := uint32(43) 281*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 282*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, keyID, tinkpb.OutputPrefixType_TINK) 283*e7b1675dSTing-Kang Chang key2 := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, newKeyID, tinkpb.OutputPrefixType_TINK) 284*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key, key2}) 285*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 286*e7b1675dSTing-Kang Chang if err != nil { 287*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 288*e7b1675dSTing-Kang Chang } 289*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 290*e7b1675dSTing-Kang Chang // set primary key 291*e7b1675dSTing-Kang Chang err = ksm1.SetPrimary(newKeyID) 292*e7b1675dSTing-Kang Chang if err != nil { 293*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 294*e7b1675dSTing-Kang Chang } 295*e7b1675dSTing-Kang Chang h2, err := ksm1.Handle() 296*e7b1675dSTing-Kang Chang if err != nil { 297*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 298*e7b1675dSTing-Kang Chang } 299*e7b1675dSTing-Kang Chang ks2 := testkeyset.KeysetMaterial(h2) 300*e7b1675dSTing-Kang Chang if len(ks2.Key) != 2 { 301*e7b1675dSTing-Kang Chang t.Errorf("Expected two keys, got %d", len(ks2.Key)) 302*e7b1675dSTing-Kang Chang } 303*e7b1675dSTing-Kang Chang if ks2.PrimaryKeyId != newKeyID { 304*e7b1675dSTing-Kang Chang t.Errorf("Expected new key to be primary, got %d", ks2.PrimaryKeyId) 305*e7b1675dSTing-Kang Chang } 306*e7b1675dSTing-Kang Chang} 307*e7b1675dSTing-Kang Chang 308*e7b1675dSTing-Kang Changfunc TestKeysetManagerSetPrimaryWithDisabledKey(t *testing.T) { 309*e7b1675dSTing-Kang Chang keyID := uint32(42) 310*e7b1675dSTing-Kang Chang newKeyID := uint32(43) 311*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 312*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, keyID, tinkpb.OutputPrefixType_TINK) 313*e7b1675dSTing-Kang Chang // create a disabled key 314*e7b1675dSTing-Kang Chang key2 := testutil.NewKey(keyData, tinkpb.KeyStatusType_DISABLED, newKeyID, tinkpb.OutputPrefixType_TINK) 315*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key, key2}) 316*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 317*e7b1675dSTing-Kang Chang if err != nil { 318*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 319*e7b1675dSTing-Kang Chang } 320*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 321*e7b1675dSTing-Kang Chang // set primary key 322*e7b1675dSTing-Kang Chang err = ksm1.SetPrimary(newKeyID) 323*e7b1675dSTing-Kang Chang if err == nil { 324*e7b1675dSTing-Kang Chang t.Errorf("ksm1.SetPrimary on disabled key succeeded, want error") 325*e7b1675dSTing-Kang Chang } 326*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "not enabled") { 327*e7b1675dSTing-Kang Chang t.Errorf("Expected 'not enabled' message, got %s", err) 328*e7b1675dSTing-Kang Chang } 329*e7b1675dSTing-Kang Chang} 330*e7b1675dSTing-Kang Chang 331*e7b1675dSTing-Kang Changfunc TestKeysetManagerSetPrimaryWithDestroyedKey(t *testing.T) { 332*e7b1675dSTing-Kang Chang keyID := uint32(42) 333*e7b1675dSTing-Kang Chang newKeyID := uint32(43) 334*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 335*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, keyID, tinkpb.OutputPrefixType_TINK) 336*e7b1675dSTing-Kang Chang // create a destroyed key 337*e7b1675dSTing-Kang Chang key2 := testutil.NewKey(keyData, tinkpb.KeyStatusType_DESTROYED, newKeyID, tinkpb.OutputPrefixType_TINK) 338*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key, key2}) 339*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 340*e7b1675dSTing-Kang Chang if err != nil { 341*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 342*e7b1675dSTing-Kang Chang } 343*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 344*e7b1675dSTing-Kang Chang // set primary key 345*e7b1675dSTing-Kang Chang err = ksm1.SetPrimary(newKeyID) 346*e7b1675dSTing-Kang Chang if err == nil { 347*e7b1675dSTing-Kang Chang t.Errorf("ksm1.SetPrimary on destroyed key succeeded, want error") 348*e7b1675dSTing-Kang Chang } 349*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "not enabled") { 350*e7b1675dSTing-Kang Chang t.Errorf("Expected 'not enabled' message, got %s", err) 351*e7b1675dSTing-Kang Chang } 352*e7b1675dSTing-Kang Chang} 353*e7b1675dSTing-Kang Chang 354*e7b1675dSTing-Kang Changfunc TestKeysetManagerSetPrimaryWithUnknownStatusKey(t *testing.T) { 355*e7b1675dSTing-Kang Chang keyID := uint32(42) 356*e7b1675dSTing-Kang Chang newKeyID := uint32(43) 357*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 358*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, keyID, tinkpb.OutputPrefixType_TINK) 359*e7b1675dSTing-Kang Chang // create an unknown status key 360*e7b1675dSTing-Kang Chang key2 := testutil.NewKey(keyData, tinkpb.KeyStatusType_UNKNOWN_STATUS, newKeyID, tinkpb.OutputPrefixType_TINK) 361*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key, key2}) 362*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 363*e7b1675dSTing-Kang Chang if err != nil { 364*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 365*e7b1675dSTing-Kang Chang } 366*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 367*e7b1675dSTing-Kang Chang // set primary key 368*e7b1675dSTing-Kang Chang err = ksm1.SetPrimary(newKeyID) 369*e7b1675dSTing-Kang Chang if err == nil { 370*e7b1675dSTing-Kang Chang t.Errorf("ksm1.SetPrimary on unknown key succeeded, want error") 371*e7b1675dSTing-Kang Chang } 372*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "not enabled") { 373*e7b1675dSTing-Kang Chang t.Errorf("Expected 'not enabled' message, got %s", err) 374*e7b1675dSTing-Kang Chang } 375*e7b1675dSTing-Kang Chang} 376*e7b1675dSTing-Kang Chang 377*e7b1675dSTing-Kang Changfunc TestKeysetManagerSetPrimaryWithMissingKey(t *testing.T) { 378*e7b1675dSTing-Kang Chang keyID := uint32(42) 379*e7b1675dSTing-Kang Chang newKeyID := uint32(43) 380*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 381*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, keyID, tinkpb.OutputPrefixType_TINK) 382*e7b1675dSTing-Kang Chang // create an unknown status key 383*e7b1675dSTing-Kang Chang key2 := testutil.NewKey(keyData, tinkpb.KeyStatusType_UNKNOWN_STATUS, newKeyID, tinkpb.OutputPrefixType_TINK) 384*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key, key2}) 385*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 386*e7b1675dSTing-Kang Chang if err != nil { 387*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 388*e7b1675dSTing-Kang Chang } 389*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 390*e7b1675dSTing-Kang Chang // set primary key 391*e7b1675dSTing-Kang Chang err = ksm1.SetPrimary(uint32(44)) 392*e7b1675dSTing-Kang Chang if err == nil { 393*e7b1675dSTing-Kang Chang t.Errorf("ksm1.SetPrimary on missing key succeeded, want error") 394*e7b1675dSTing-Kang Chang } 395*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "not found") { 396*e7b1675dSTing-Kang Chang t.Errorf("Expected 'not found' message, got %s", err) 397*e7b1675dSTing-Kang Chang } 398*e7b1675dSTing-Kang Chang} 399*e7b1675dSTing-Kang Chang 400*e7b1675dSTing-Kang Changfunc TestKeysetManagerDisable(t *testing.T) { 401*e7b1675dSTing-Kang Chang primaryKeyID := uint32(42) 402*e7b1675dSTing-Kang Chang otherKeyID := uint32(43) 403*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 404*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, primaryKeyID, tinkpb.OutputPrefixType_TINK) 405*e7b1675dSTing-Kang Chang key2 := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, otherKeyID, tinkpb.OutputPrefixType_TINK) 406*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(primaryKeyID, []*tinkpb.Keyset_Key{key, key2}) 407*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 408*e7b1675dSTing-Kang Chang if err != nil { 409*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 410*e7b1675dSTing-Kang Chang } 411*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 412*e7b1675dSTing-Kang Chang // disable key 413*e7b1675dSTing-Kang Chang err = ksm1.Disable(otherKeyID) 414*e7b1675dSTing-Kang Chang if err != nil { 415*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 416*e7b1675dSTing-Kang Chang } 417*e7b1675dSTing-Kang Chang h2, err := ksm1.Handle() 418*e7b1675dSTing-Kang Chang if err != nil { 419*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 420*e7b1675dSTing-Kang Chang } 421*e7b1675dSTing-Kang Chang ks2 := testkeyset.KeysetMaterial(h2) 422*e7b1675dSTing-Kang Chang if ks2.PrimaryKeyId != primaryKeyID { 423*e7b1675dSTing-Kang Chang t.Errorf("Expected same key to be primary, got %d", ks2.PrimaryKeyId) 424*e7b1675dSTing-Kang Chang } 425*e7b1675dSTing-Kang Chang if len(ks2.Key) != 2 { 426*e7b1675dSTing-Kang Chang t.Errorf("Expected two keys, got %d", len(ks2.Key)) 427*e7b1675dSTing-Kang Chang t.FailNow() 428*e7b1675dSTing-Kang Chang } 429*e7b1675dSTing-Kang Chang if ks2.Key[1].Status != tinkpb.KeyStatusType_DISABLED { 430*e7b1675dSTing-Kang Chang t.Errorf("Expected key to be disabled, got %s", ks2.Key[1].Status.String()) 431*e7b1675dSTing-Kang Chang } 432*e7b1675dSTing-Kang Chang} 433*e7b1675dSTing-Kang Chang 434*e7b1675dSTing-Kang Changfunc TestKeysetManagerDisableWithPrimaryKey(t *testing.T) { 435*e7b1675dSTing-Kang Chang primaryKeyID := uint32(42) 436*e7b1675dSTing-Kang Chang otherKeyID := uint32(43) 437*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 438*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, primaryKeyID, tinkpb.OutputPrefixType_TINK) 439*e7b1675dSTing-Kang Chang key2 := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, otherKeyID, tinkpb.OutputPrefixType_TINK) 440*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(primaryKeyID, []*tinkpb.Keyset_Key{key, key2}) 441*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 442*e7b1675dSTing-Kang Chang if err != nil { 443*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 444*e7b1675dSTing-Kang Chang } 445*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 446*e7b1675dSTing-Kang Chang // disable key 447*e7b1675dSTing-Kang Chang err = ksm1.Disable(primaryKeyID) 448*e7b1675dSTing-Kang Chang if err == nil { 449*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Disable on primary key succeeded, want error") 450*e7b1675dSTing-Kang Chang } 451*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "cannot disable the primary key") { 452*e7b1675dSTing-Kang Chang t.Errorf("Expected 'cannot disable the primary key' message, got %s", err) 453*e7b1675dSTing-Kang Chang } 454*e7b1675dSTing-Kang Chang h2, err := ksm1.Handle() 455*e7b1675dSTing-Kang Chang if err != nil { 456*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 457*e7b1675dSTing-Kang Chang } 458*e7b1675dSTing-Kang Chang ks2 := testkeyset.KeysetMaterial(h2) 459*e7b1675dSTing-Kang Chang if ks2.PrimaryKeyId != primaryKeyID { 460*e7b1675dSTing-Kang Chang t.Errorf("Expected same key to be primary, got %d", ks2.PrimaryKeyId) 461*e7b1675dSTing-Kang Chang } 462*e7b1675dSTing-Kang Chang} 463*e7b1675dSTing-Kang Chang 464*e7b1675dSTing-Kang Changfunc TestKeysetManagerDisableWithDestroyedKey(t *testing.T) { 465*e7b1675dSTing-Kang Chang primaryKeyID := uint32(42) 466*e7b1675dSTing-Kang Chang otherKeyID := uint32(43) 467*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 468*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, primaryKeyID, tinkpb.OutputPrefixType_TINK) 469*e7b1675dSTing-Kang Chang // destroyed key 470*e7b1675dSTing-Kang Chang key2 := testutil.NewKey(keyData, tinkpb.KeyStatusType_DESTROYED, otherKeyID, tinkpb.OutputPrefixType_TINK) 471*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(primaryKeyID, []*tinkpb.Keyset_Key{key, key2}) 472*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 473*e7b1675dSTing-Kang Chang if err != nil { 474*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 475*e7b1675dSTing-Kang Chang } 476*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 477*e7b1675dSTing-Kang Chang // disable key 478*e7b1675dSTing-Kang Chang err = ksm1.Disable(otherKeyID) 479*e7b1675dSTing-Kang Chang if err == nil { 480*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Disable on destroyed key succeeded, want error") 481*e7b1675dSTing-Kang Chang } 482*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "cannot disable") { 483*e7b1675dSTing-Kang Chang t.Errorf("Expected 'cannot disable' message, got %s", err) 484*e7b1675dSTing-Kang Chang } 485*e7b1675dSTing-Kang Chang} 486*e7b1675dSTing-Kang Chang 487*e7b1675dSTing-Kang Changfunc TestKeysetManagerDisableWithMissingKey(t *testing.T) { 488*e7b1675dSTing-Kang Chang primaryKeyID := uint32(42) 489*e7b1675dSTing-Kang Chang otherKeyID := uint32(43) 490*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 491*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, primaryKeyID, tinkpb.OutputPrefixType_TINK) 492*e7b1675dSTing-Kang Chang key2 := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, otherKeyID, tinkpb.OutputPrefixType_TINK) 493*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(primaryKeyID, []*tinkpb.Keyset_Key{key, key2}) 494*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 495*e7b1675dSTing-Kang Chang if err != nil { 496*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 497*e7b1675dSTing-Kang Chang } 498*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 499*e7b1675dSTing-Kang Chang // disable key 500*e7b1675dSTing-Kang Chang err = ksm1.Disable(uint32(44)) 501*e7b1675dSTing-Kang Chang if err == nil { 502*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Disable on missing key succeeded, want error") 503*e7b1675dSTing-Kang Chang } 504*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "not found") { 505*e7b1675dSTing-Kang Chang t.Errorf("Expected 'not found' message, got %s", err) 506*e7b1675dSTing-Kang Chang } 507*e7b1675dSTing-Kang Chang} 508*e7b1675dSTing-Kang Chang 509*e7b1675dSTing-Kang Changfunc TestKeysetManagerDelete(t *testing.T) { 510*e7b1675dSTing-Kang Chang keyID := uint32(42) 511*e7b1675dSTing-Kang Chang otherKeyID := uint32(43) 512*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 513*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, keyID, tinkpb.OutputPrefixType_TINK) 514*e7b1675dSTing-Kang Chang key2 := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, otherKeyID, tinkpb.OutputPrefixType_TINK) 515*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key, key2}) 516*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 517*e7b1675dSTing-Kang Chang if err != nil { 518*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 519*e7b1675dSTing-Kang Chang } 520*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 521*e7b1675dSTing-Kang Chang // delete key 522*e7b1675dSTing-Kang Chang err = ksm1.Delete(otherKeyID) 523*e7b1675dSTing-Kang Chang if err != nil { 524*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 525*e7b1675dSTing-Kang Chang } 526*e7b1675dSTing-Kang Chang h2, _ := ksm1.Handle() 527*e7b1675dSTing-Kang Chang ks2 := testkeyset.KeysetMaterial(h2) 528*e7b1675dSTing-Kang Chang if len(ks2.Key) != 1 { 529*e7b1675dSTing-Kang Chang t.Errorf("Expected only one key but got %d", len(ks2.Key)) 530*e7b1675dSTing-Kang Chang t.Fail() 531*e7b1675dSTing-Kang Chang } 532*e7b1675dSTing-Kang Chang if ks2.Key[0].KeyId != ks2.PrimaryKeyId || ks2.Key[0].KeyId != keyID { 533*e7b1675dSTing-Kang Chang t.Errorf("Expected keyID %d to be present but got %d", keyID, ks2.Key[0].KeyId) 534*e7b1675dSTing-Kang Chang } 535*e7b1675dSTing-Kang Chang if ks2.Key[0].Status != tinkpb.KeyStatusType_ENABLED { 536*e7b1675dSTing-Kang Chang t.Errorf("Expected key to be enabled but got %s", ks2.Key[0].Status.String()) 537*e7b1675dSTing-Kang Chang } 538*e7b1675dSTing-Kang Chang} 539*e7b1675dSTing-Kang Chang 540*e7b1675dSTing-Kang Changfunc TestKeysetManagerDeleteWithPrimaryKey(t *testing.T) { 541*e7b1675dSTing-Kang Chang keyID := uint32(42) 542*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 543*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, keyID, tinkpb.OutputPrefixType_TINK) 544*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key}) 545*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 546*e7b1675dSTing-Kang Chang if err != nil { 547*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 548*e7b1675dSTing-Kang Chang } 549*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 550*e7b1675dSTing-Kang Chang // delete key 551*e7b1675dSTing-Kang Chang err = ksm1.Delete(keyID) 552*e7b1675dSTing-Kang Chang if err == nil { 553*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Delete succeeded but expected error") 554*e7b1675dSTing-Kang Chang } 555*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "primary key") { 556*e7b1675dSTing-Kang Chang t.Errorf("Expected 'primary key' message but got %s", err) 557*e7b1675dSTing-Kang Chang } 558*e7b1675dSTing-Kang Chang} 559*e7b1675dSTing-Kang Chang 560*e7b1675dSTing-Kang Changfunc TestKeysetManagerDeleteWithMissingKey(t *testing.T) { 561*e7b1675dSTing-Kang Chang keyID := uint32(42) 562*e7b1675dSTing-Kang Chang keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_SYMMETRIC) 563*e7b1675dSTing-Kang Chang key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, keyID, tinkpb.OutputPrefixType_TINK) 564*e7b1675dSTing-Kang Chang ks1 := testutil.NewKeyset(keyID, []*tinkpb.Keyset_Key{key}) 565*e7b1675dSTing-Kang Chang h1, err := testkeyset.NewHandle(ks1) 566*e7b1675dSTing-Kang Chang if err != nil { 567*e7b1675dSTing-Kang Chang t.Errorf("Expected no error but got error %s", err) 568*e7b1675dSTing-Kang Chang } 569*e7b1675dSTing-Kang Chang ksm1 := keyset.NewManagerFromHandle(h1) 570*e7b1675dSTing-Kang Chang // delete key 571*e7b1675dSTing-Kang Chang err = ksm1.Delete(uint32(43)) 572*e7b1675dSTing-Kang Chang if err == nil { 573*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Delete succeeded but expected error") 574*e7b1675dSTing-Kang Chang } 575*e7b1675dSTing-Kang Chang if !strings.Contains(err.Error(), "not found") { 576*e7b1675dSTing-Kang Chang t.Errorf("Expected 'not found' message but got %s", err) 577*e7b1675dSTing-Kang Chang } 578*e7b1675dSTing-Kang Chang} 579*e7b1675dSTing-Kang Chang 580*e7b1675dSTing-Kang Changfunc TestKeysetManagerWithEmptyManager(t *testing.T) { 581*e7b1675dSTing-Kang Chang // all ops with empty manager should fail 582*e7b1675dSTing-Kang Chang ksm1 := &keyset.Manager{} 583*e7b1675dSTing-Kang Chang _, err := ksm1.Add(mac.HMACSHA256Tag128KeyTemplate()) 584*e7b1675dSTing-Kang Chang if err == nil { 585*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Add succeeded on empty manager, want error") 586*e7b1675dSTing-Kang Chang } 587*e7b1675dSTing-Kang Chang err = ksm1.SetPrimary(0) 588*e7b1675dSTing-Kang Chang if err == nil { 589*e7b1675dSTing-Kang Chang t.Errorf("ksm1.SetPrimary succeeded on empty manager, want error") 590*e7b1675dSTing-Kang Chang } 591*e7b1675dSTing-Kang Chang err = ksm1.Enable(0) 592*e7b1675dSTing-Kang Chang if err == nil { 593*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Enable succeeded on empty manager, want error") 594*e7b1675dSTing-Kang Chang } 595*e7b1675dSTing-Kang Chang err = ksm1.Delete(0) 596*e7b1675dSTing-Kang Chang if err == nil { 597*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Delete succeeded on empty manager, want error") 598*e7b1675dSTing-Kang Chang } 599*e7b1675dSTing-Kang Chang err = ksm1.Disable(0) 600*e7b1675dSTing-Kang Chang if err == nil { 601*e7b1675dSTing-Kang Chang t.Errorf("ksm1.Disable succeeded on empty manager, want error") 602*e7b1675dSTing-Kang Chang } 603*e7b1675dSTing-Kang Chang} 604