File: tea_test.go

package info (click to toggle)
golang-go.crypto 1:0.0~git20161012.0.5f31782-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 3,280 kB
  • sloc: asm: 5,761; ansic: 152; makefile: 11
file content (93 lines) | stat: -rw-r--r-- 2,768 bytes parent folder | download | duplicates (17)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package tea

import (
	"bytes"
	"testing"
)

// A sample test key for when we just want to initialize a cipher
var testKey = []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}

// Test that the block size for tea is correct
func TestBlocksize(t *testing.T) {
	c, err := NewCipher(testKey)
	if err != nil {
		t.Fatalf("NewCipher returned error: %s", err)
	}

	if result := c.BlockSize(); result != BlockSize {
		t.Errorf("cipher.BlockSize returned %d, but expected %d", result, BlockSize)
	}
}

// Test that invalid key sizes return an error
func TestInvalidKeySize(t *testing.T) {
	var key [KeySize + 1]byte

	if _, err := NewCipher(key[:]); err == nil {
		t.Errorf("invalid key size %d didn't result in an error.", len(key))
	}

	if _, err := NewCipher(key[:KeySize-1]); err == nil {
		t.Errorf("invalid key size %d didn't result in an error.", KeySize-1)
	}
}

// Test Vectors
type teaTest struct {
	rounds     int
	key        []byte
	plaintext  []byte
	ciphertext []byte
}

var teaTests = []teaTest{
	// These were sourced from https://github.com/froydnj/ironclad/blob/master/testing/test-vectors/tea.testvec
	{
		numRounds,
		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
		[]byte{0x41, 0xea, 0x3a, 0x0a, 0x94, 0xba, 0xa9, 0x40},
	},
	{
		numRounds,
		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
		[]byte{0x31, 0x9b, 0xbe, 0xfb, 0x01, 0x6a, 0xbd, 0xb2},
	},
	{
		16,
		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
		[]byte{0xed, 0x28, 0x5d, 0xa1, 0x45, 0x5b, 0x33, 0xc1},
	},
}

// Test encryption
func TestCipherEncrypt(t *testing.T) {
	// Test encryption with standard 64 rounds
	for i, test := range teaTests {
		c, err := NewCipherWithRounds(test.key, test.rounds)
		if err != nil {
			t.Fatalf("#%d: NewCipher returned error: %s", i, err)
		}

		var ciphertext [BlockSize]byte
		c.Encrypt(ciphertext[:], test.plaintext)

		if !bytes.Equal(ciphertext[:], test.ciphertext) {
			t.Errorf("#%d: incorrect ciphertext. Got %x, wanted %x", i, ciphertext, test.ciphertext)
		}

		var plaintext2 [BlockSize]byte
		c.Decrypt(plaintext2[:], ciphertext[:])

		if !bytes.Equal(plaintext2[:], test.plaintext) {
			t.Errorf("#%d: incorrect plaintext. Got %x, wanted %x", i, plaintext2, test.plaintext)
		}
	}
}