xref: /aosp_15_r20/external/tink/go/keyset/manager_test.go (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
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