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