1*e7b1675dSTing-Kang Chang// Copyright 2018 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 testutil_test 18*e7b1675dSTing-Kang Chang 19*e7b1675dSTing-Kang Changimport ( 20*e7b1675dSTing-Kang Chang "bytes" 21*e7b1675dSTing-Kang Chang "encoding/hex" 22*e7b1675dSTing-Kang Chang "testing" 23*e7b1675dSTing-Kang Chang 24*e7b1675dSTing-Kang Chang "github.com/google/tink/go/subtle/random" 25*e7b1675dSTing-Kang Chang "github.com/google/tink/go/testutil" 26*e7b1675dSTing-Kang Chang "github.com/google/tink/go/tink" 27*e7b1675dSTing-Kang Chang) 28*e7b1675dSTing-Kang Chang 29*e7b1675dSTing-Kang Changfunc TestDummyAEAD(t *testing.T) { 30*e7b1675dSTing-Kang Chang // Assert that DummyAEAD implements the AEAD interface. 31*e7b1675dSTing-Kang Chang var _ tink.AEAD = (*testutil.DummyAEAD)(nil) 32*e7b1675dSTing-Kang Chang 33*e7b1675dSTing-Kang Chang // try to encrypt/decrypt some data 34*e7b1675dSTing-Kang Chang data := []byte{0, 1, 1, 2, 3, 5} 35*e7b1675dSTing-Kang Chang associatedData := []byte{3, 1, 4, 1, 5} 36*e7b1675dSTing-Kang Chang 37*e7b1675dSTing-Kang Chang dummy := &testutil.DummyAEAD{Name: "name"} 38*e7b1675dSTing-Kang Chang cipher, err := dummy.Encrypt(data, associatedData) 39*e7b1675dSTing-Kang Chang if err != nil { 40*e7b1675dSTing-Kang Chang t.Fatalf("DummyAEAD.Encrypt(%+v, %+v) gave error: %v", data, associatedData, err) 41*e7b1675dSTing-Kang Chang } 42*e7b1675dSTing-Kang Chang decrypt, err := dummy.Decrypt(cipher, associatedData) 43*e7b1675dSTing-Kang Chang if err != nil { 44*e7b1675dSTing-Kang Chang t.Fatalf("DummyAEAD.Decrypt(ciphertext, %+v) gave errr: %v", associatedData, err) 45*e7b1675dSTing-Kang Chang } 46*e7b1675dSTing-Kang Chang if !bytes.Equal(data, decrypt) { 47*e7b1675dSTing-Kang Chang t.Errorf("DummyAEAD round-tripped data %+v back to %+v", data, decrypt) 48*e7b1675dSTing-Kang Chang } 49*e7b1675dSTing-Kang Chang} 50*e7b1675dSTing-Kang Chang 51*e7b1675dSTing-Kang Changfunc TestDummySigner(t *testing.T) { 52*e7b1675dSTing-Kang Chang var _ tink.Signer = testutil.NewDummySigner("name") 53*e7b1675dSTing-Kang Chang} 54*e7b1675dSTing-Kang Chang 55*e7b1675dSTing-Kang Changfunc TestDummyVerifier(t *testing.T) { 56*e7b1675dSTing-Kang Chang var _ tink.Verifier = testutil.NewDummyVerifier("name") 57*e7b1675dSTing-Kang Chang} 58*e7b1675dSTing-Kang Chang 59*e7b1675dSTing-Kang Changfunc TestDummySignerVerifier(t *testing.T) { 60*e7b1675dSTing-Kang Chang signer := testutil.NewDummySigner("") 61*e7b1675dSTing-Kang Chang verifier := testutil.NewDummyVerifier("") 62*e7b1675dSTing-Kang Chang 63*e7b1675dSTing-Kang Chang data := []byte{2, 7, 1, 8, 2, 8} 64*e7b1675dSTing-Kang Chang if err := verifier.Verify(nil, data); err == nil { 65*e7b1675dSTing-Kang Chang t.Errorf("DummyVerifier.Verify(invalid signature, %+v) succeeded; want error", data) 66*e7b1675dSTing-Kang Chang } 67*e7b1675dSTing-Kang Chang 68*e7b1675dSTing-Kang Chang sig, err := signer.Sign(data) 69*e7b1675dSTing-Kang Chang if err != nil { 70*e7b1675dSTing-Kang Chang t.Fatalf("DummySigner.Sign(%+v) gave error: %v", data, err) 71*e7b1675dSTing-Kang Chang } 72*e7b1675dSTing-Kang Chang if err := verifier.Verify(sig, data); err != nil { 73*e7b1675dSTing-Kang Chang t.Errorf("DummyVerifier.Verify(valid signature, %+v) gave error: %v", data, err) 74*e7b1675dSTing-Kang Chang } 75*e7b1675dSTing-Kang Chang} 76*e7b1675dSTing-Kang Chang 77*e7b1675dSTing-Kang Changfunc TestDummyMAC(t *testing.T) { 78*e7b1675dSTing-Kang Chang // Assert that DummyMAC implements the MAC interface. 79*e7b1675dSTing-Kang Chang var _ tink.MAC = (*testutil.DummyMAC)(nil) 80*e7b1675dSTing-Kang Chang // try to compute mac 81*e7b1675dSTing-Kang Chang data := []byte{1, 2, 3, 4, 5} 82*e7b1675dSTing-Kang Chang dummyMAC := &testutil.DummyMAC{Name: "Mac12347"} 83*e7b1675dSTing-Kang Chang digest, err := dummyMAC.ComputeMAC(data) 84*e7b1675dSTing-Kang Chang if err != nil { 85*e7b1675dSTing-Kang Chang t.Errorf("unexpected error: %s", err) 86*e7b1675dSTing-Kang Chang } 87*e7b1675dSTing-Kang Chang if !bytes.Equal(append(data, dummyMAC.Name...), digest) { 88*e7b1675dSTing-Kang Chang t.Errorf("incorrect digest") 89*e7b1675dSTing-Kang Chang } 90*e7b1675dSTing-Kang Chang if err := dummyMAC.VerifyMAC(nil, nil); err != nil { 91*e7b1675dSTing-Kang Chang t.Errorf("unexpected result of VerifyMAC") 92*e7b1675dSTing-Kang Chang } 93*e7b1675dSTing-Kang Chang} 94*e7b1675dSTing-Kang Chang 95*e7b1675dSTing-Kang Changfunc fillByteArray(b byte, length int) []byte { 96*e7b1675dSTing-Kang Chang result := []byte{} 97*e7b1675dSTing-Kang Chang for i := 0; i < length; i++ { 98*e7b1675dSTing-Kang Chang result = append(result, b) 99*e7b1675dSTing-Kang Chang } 100*e7b1675dSTing-Kang Chang return result 101*e7b1675dSTing-Kang Chang} 102*e7b1675dSTing-Kang Chang 103*e7b1675dSTing-Kang Changfunc TestUniformString(t *testing.T) { 104*e7b1675dSTing-Kang Chang if err := testutil.ZTestUniformString(fillByteArray(0xaa, 32)); err != nil { 105*e7b1675dSTing-Kang Chang t.Errorf("Expected repeated 0xaa string to pass: %v", err) 106*e7b1675dSTing-Kang Chang } 107*e7b1675dSTing-Kang Chang if err := testutil.ZTestUniformString(fillByteArray(0x00, 32)); err == nil { 108*e7b1675dSTing-Kang Chang t.Errorf("Expected to fail uniform distribution test for 32 zero bytes") 109*e7b1675dSTing-Kang Chang } 110*e7b1675dSTing-Kang Chang if err := testutil.ZTestUniformString(random.GetRandomBytes(32)); err != nil { 111*e7b1675dSTing-Kang Chang t.Errorf("Expected random string to pass randomness test: %v", err) 112*e7b1675dSTing-Kang Chang } 113*e7b1675dSTing-Kang Chang} 114*e7b1675dSTing-Kang Chang 115*e7b1675dSTing-Kang Changfunc TestCrossCorrelationUniformString(t *testing.T) { 116*e7b1675dSTing-Kang Chang if err := testutil.ZTestCrosscorrelationUniformStrings(fillByteArray(0xaa, 32), 117*e7b1675dSTing-Kang Chang fillByteArray(0x99, 32)); err != nil { 118*e7b1675dSTing-Kang Chang t.Errorf("Expected 0xaa and 0x99 repeated 32 times each to have no cross correlation: %v", err) 119*e7b1675dSTing-Kang Chang } 120*e7b1675dSTing-Kang Chang if err := testutil.ZTestCrosscorrelationUniformStrings(fillByteArray(0xaa, 32), 121*e7b1675dSTing-Kang Chang fillByteArray(0xaa, 32)); err == nil { 122*e7b1675dSTing-Kang Chang t.Errorf("Expected 0xaa repeated 32 times to be cross correlated with itself") 123*e7b1675dSTing-Kang Chang } 124*e7b1675dSTing-Kang Chang if err := testutil.ZTestCrosscorrelationUniformStrings(random.GetRandomBytes(32), 125*e7b1675dSTing-Kang Chang random.GetRandomBytes(32)); err != nil { 126*e7b1675dSTing-Kang Chang t.Errorf("Expected random 32 byte strings to not be crosscorrelated: %v", err) 127*e7b1675dSTing-Kang Chang } 128*e7b1675dSTing-Kang Chang} 129*e7b1675dSTing-Kang Chang 130*e7b1675dSTing-Kang Changfunc TestAutocorrelationUniformString(t *testing.T) { 131*e7b1675dSTing-Kang Chang if err := testutil.ZTestAutocorrelationUniformString(fillByteArray(0xaa, 32)); err == nil { 132*e7b1675dSTing-Kang Chang t.Errorf("Expected repeated string to show autocorrelation") 133*e7b1675dSTing-Kang Chang } 134*e7b1675dSTing-Kang Chang if err := testutil.ZTestAutocorrelationUniformString([]byte( 135*e7b1675dSTing-Kang Chang "This is a text that is only ascii characters and therefore " + 136*e7b1675dSTing-Kang Chang "not random. It needs quite a few characters before it has " + 137*e7b1675dSTing-Kang Chang "enough to find a pattern, though, as it is text.")); err == nil { 138*e7b1675dSTing-Kang Chang t.Errorf("Expected longish English ASCII test to be autocorrelated") 139*e7b1675dSTing-Kang Chang } 140*e7b1675dSTing-Kang Chang if err := testutil.ZTestAutocorrelationUniformString(random.GetRandomBytes(32)); err != nil { 141*e7b1675dSTing-Kang Chang t.Errorf("Expected random 32 byte string to show not autocorrelation: %v", err) 142*e7b1675dSTing-Kang Chang } 143*e7b1675dSTing-Kang Chang} 144*e7b1675dSTing-Kang Chang 145*e7b1675dSTing-Kang Changfunc TestGenerateMutations(t *testing.T) { 146*e7b1675dSTing-Kang Chang original := random.GetRandomBytes(8) 147*e7b1675dSTing-Kang Chang mutations := testutil.GenerateMutations(original) 148*e7b1675dSTing-Kang Chang seen := make(map[string]bool) 149*e7b1675dSTing-Kang Chang for i, mutation := range mutations { 150*e7b1675dSTing-Kang Chang if bytes.Compare(original, mutation) == 0 { 151*e7b1675dSTing-Kang Chang t.Errorf("Expected mutation %x to differ from original %x", mutation, original) 152*e7b1675dSTing-Kang Chang } 153*e7b1675dSTing-Kang Chang mutationHex := hex.EncodeToString(mutation) 154*e7b1675dSTing-Kang Chang if seen[mutationHex] { 155*e7b1675dSTing-Kang Chang t.Errorf("Mutation %d (%s) matches an earlier mutation", i, mutationHex) 156*e7b1675dSTing-Kang Chang } 157*e7b1675dSTing-Kang Chang seen[mutationHex] = true 158*e7b1675dSTing-Kang Chang } 159*e7b1675dSTing-Kang Chang} 160