1*e7b1675dSTing-Kang Chang// Copyright 2020 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 fakekms_test 18*e7b1675dSTing-Kang Chang 19*e7b1675dSTing-Kang Changimport ( 20*e7b1675dSTing-Kang Chang "bytes" 21*e7b1675dSTing-Kang Chang "testing" 22*e7b1675dSTing-Kang Chang 23*e7b1675dSTing-Kang Chang "github.com/google/tink/go/testing/fakekms" 24*e7b1675dSTing-Kang Chang) 25*e7b1675dSTing-Kang Chang 26*e7b1675dSTing-Kang Changconst keyURI = "fake-kms://CM2b3_MDElQKSAowdHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUuY3J5cHRvLnRpbmsuQWVzR2NtS2V5EhIaEIK75t5L-adlUwVhWvRuWUwYARABGM2b3_MDIAE" 27*e7b1675dSTing-Kang Changconst anotherKeyURI = "fake-kms://CLHW_5cHElQKSAowdHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUuY3J5cHRvLnRpbmsuQWVzR2NtS2V5EhIaEIZ-2h9InfZTbbkJjaJBsVgYARABGLHW_5cHIAE" 28*e7b1675dSTing-Kang Chang 29*e7b1675dSTing-Kang Changfunc TestValidKeyURIs(t *testing.T) { 30*e7b1675dSTing-Kang Chang newKeyURI, err := fakekms.NewKeyURI() 31*e7b1675dSTing-Kang Chang if err != nil { 32*e7b1675dSTing-Kang Chang t.Fatal(err) 33*e7b1675dSTing-Kang Chang } 34*e7b1675dSTing-Kang Chang var testCases = []string{ 35*e7b1675dSTing-Kang Chang keyURI, 36*e7b1675dSTing-Kang Chang anotherKeyURI, 37*e7b1675dSTing-Kang Chang newKeyURI, 38*e7b1675dSTing-Kang Chang } 39*e7b1675dSTing-Kang Chang for _, tc := range testCases { 40*e7b1675dSTing-Kang Chang t.Run(tc, func(t *testing.T) { 41*e7b1675dSTing-Kang Chang client, err := fakekms.NewClient(tc) 42*e7b1675dSTing-Kang Chang if err != nil { 43*e7b1675dSTing-Kang Chang t.Fatalf("testutil.NewFakeKMSClient(keyURI) failed: %v", err) 44*e7b1675dSTing-Kang Chang } 45*e7b1675dSTing-Kang Chang if !client.Supported(tc) { 46*e7b1675dSTing-Kang Chang t.Fatalf("client.Supported(keyURI) is false, want true") 47*e7b1675dSTing-Kang Chang } 48*e7b1675dSTing-Kang Chang primitive, err := client.GetAEAD(tc) 49*e7b1675dSTing-Kang Chang if err != nil { 50*e7b1675dSTing-Kang Chang t.Fatalf("client.GetAEAD(keyURI) failed: %v", err) 51*e7b1675dSTing-Kang Chang } 52*e7b1675dSTing-Kang Chang 53*e7b1675dSTing-Kang Chang plaintext := []byte("some data to encrypt") 54*e7b1675dSTing-Kang Chang aad := []byte("extra data to authenticate") 55*e7b1675dSTing-Kang Chang ciphertext, err := primitive.Encrypt(plaintext, aad) 56*e7b1675dSTing-Kang Chang if err != nil { 57*e7b1675dSTing-Kang Chang t.Fatalf("primitive.Encrypt(plaintext, aad) failed: %v", err) 58*e7b1675dSTing-Kang Chang } 59*e7b1675dSTing-Kang Chang decrypted, err := primitive.Decrypt(ciphertext, aad) 60*e7b1675dSTing-Kang Chang if err != nil { 61*e7b1675dSTing-Kang Chang t.Fatalf("primitive.Decrypt(ciphertext, aad) failed: %v", err) 62*e7b1675dSTing-Kang Chang } 63*e7b1675dSTing-Kang Chang if !bytes.Equal(plaintext, decrypted) { 64*e7b1675dSTing-Kang Chang t.Fatalf("decrypted data doesn't match plaintext, got: %q, want: %q", decrypted, plaintext) 65*e7b1675dSTing-Kang Chang } 66*e7b1675dSTing-Kang Chang }) 67*e7b1675dSTing-Kang Chang } 68*e7b1675dSTing-Kang Chang} 69*e7b1675dSTing-Kang Chang 70*e7b1675dSTing-Kang Changfunc TestBadUriPrefix(t *testing.T) { 71*e7b1675dSTing-Kang Chang _, err := fakekms.NewClient("bad-prefix://encodedkeyset") 72*e7b1675dSTing-Kang Chang if err == nil { 73*e7b1675dSTing-Kang Chang t.Fatalf("fakekms.NewClient('bad-prefix://encodedkeyset') succeeded, want fail") 74*e7b1675dSTing-Kang Chang } 75*e7b1675dSTing-Kang Chang} 76*e7b1675dSTing-Kang Chang 77*e7b1675dSTing-Kang Changfunc TestValidPrefix(t *testing.T) { 78*e7b1675dSTing-Kang Chang uriPrefix := "fake-kms://CM2b" // is a prefix of keyURI 79*e7b1675dSTing-Kang Chang client, err := fakekms.NewClient(uriPrefix) 80*e7b1675dSTing-Kang Chang if err != nil { 81*e7b1675dSTing-Kang Chang t.Fatalf("fakekms.NewClient(uriPrefix) failed: %v", err) 82*e7b1675dSTing-Kang Chang } 83*e7b1675dSTing-Kang Chang if !client.Supported(keyURI) { 84*e7b1675dSTing-Kang Chang t.Fatalf("client with URI prefix %s should support key URI %s", uriPrefix, keyURI) 85*e7b1675dSTing-Kang Chang } 86*e7b1675dSTing-Kang Chang _, err = client.GetAEAD(keyURI) 87*e7b1675dSTing-Kang Chang if err != nil { 88*e7b1675dSTing-Kang Chang t.Fatalf("client.GetAEAD(anotherKeyURI) failed: %v", err) 89*e7b1675dSTing-Kang Chang } 90*e7b1675dSTing-Kang Chang} 91*e7b1675dSTing-Kang Chang 92*e7b1675dSTing-Kang Changfunc TestInvalidPrefix(t *testing.T) { 93*e7b1675dSTing-Kang Chang uriPrefix := "fake-kms://CM2x" // is not a prefix of keyURI 94*e7b1675dSTing-Kang Chang client, err := fakekms.NewClient(uriPrefix) 95*e7b1675dSTing-Kang Chang if err != nil { 96*e7b1675dSTing-Kang Chang t.Fatalf("fakekms.NewClient(uriPrefix) failed: %v", err) 97*e7b1675dSTing-Kang Chang } 98*e7b1675dSTing-Kang Chang if client.Supported(keyURI) { 99*e7b1675dSTing-Kang Chang t.Fatalf("client with URI prefix %s should not support key URI %s", uriPrefix, keyURI) 100*e7b1675dSTing-Kang Chang } 101*e7b1675dSTing-Kang Chang _, err = client.GetAEAD(keyURI) 102*e7b1675dSTing-Kang Chang if err == nil { 103*e7b1675dSTing-Kang Chang t.Fatalf("client.GetAEAD(keyURI) succeeded, want fail") 104*e7b1675dSTing-Kang Chang } 105*e7b1675dSTing-Kang Chang} 106*e7b1675dSTing-Kang Chang 107*e7b1675dSTing-Kang Changfunc TestGetAeadFailsWithBadKeysetEncoding(t *testing.T) { 108*e7b1675dSTing-Kang Chang client, err := fakekms.NewClient("fake-kms://bad") 109*e7b1675dSTing-Kang Chang if err != nil { 110*e7b1675dSTing-Kang Chang t.Fatalf("fakekms.NewClient('fake-kms://bad') failed: %v", err) 111*e7b1675dSTing-Kang Chang } 112*e7b1675dSTing-Kang Chang _, err = client.GetAEAD("fake-kms://badencoding") 113*e7b1675dSTing-Kang Chang if err == nil { 114*e7b1675dSTing-Kang Chang t.Fatalf("client.GetAEAD('fake-kms://badencoding') succeeded, want fail") 115*e7b1675dSTing-Kang Chang } 116*e7b1675dSTing-Kang Chang} 117