github.com/mattn/go@v0.0.0-20171011075504-07f7db3ea99f/src/crypto/aes/aes_test.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package aes
     6  
     7  import (
     8  	"testing"
     9  )
    10  
    11  // See const.go for overview of math here.
    12  
    13  // Test that powx is initialized correctly.
    14  // (Can adapt this code to generate it too.)
    15  func TestPowx(t *testing.T) {
    16  	p := 1
    17  	for i := 0; i < len(powx); i++ {
    18  		if powx[i] != byte(p) {
    19  			t.Errorf("powx[%d] = %#x, want %#x", i, powx[i], p)
    20  		}
    21  		p <<= 1
    22  		if p&0x100 != 0 {
    23  			p ^= poly
    24  		}
    25  	}
    26  }
    27  
    28  // Multiply b and c as GF(2) polynomials modulo poly
    29  func mul(b, c uint32) uint32 {
    30  	i := b
    31  	j := c
    32  	s := uint32(0)
    33  	for k := uint32(1); k < 0x100 && j != 0; k <<= 1 {
    34  		// Invariant: k == 1<<n, i == b * xⁿ
    35  
    36  		if j&k != 0 {
    37  			// s += i in GF(2); xor in binary
    38  			s ^= i
    39  			j ^= k // turn off bit to end loop early
    40  		}
    41  
    42  		// i *= x in GF(2) modulo the polynomial
    43  		i <<= 1
    44  		if i&0x100 != 0 {
    45  			i ^= poly
    46  		}
    47  	}
    48  	return s
    49  }
    50  
    51  // Test all mul inputs against bit-by-bit n² algorithm.
    52  func TestMul(t *testing.T) {
    53  	for i := uint32(0); i < 256; i++ {
    54  		for j := uint32(0); j < 256; j++ {
    55  			// Multiply i, j bit by bit.
    56  			s := uint8(0)
    57  			for k := uint(0); k < 8; k++ {
    58  				for l := uint(0); l < 8; l++ {
    59  					if i&(1<<k) != 0 && j&(1<<l) != 0 {
    60  						s ^= powx[k+l]
    61  					}
    62  				}
    63  			}
    64  			if x := mul(i, j); x != uint32(s) {
    65  				t.Fatalf("mul(%#x, %#x) = %#x, want %#x", i, j, x, s)
    66  			}
    67  		}
    68  	}
    69  }
    70  
    71  // Check that S-boxes are inverses of each other.
    72  // They have more structure that we could test,
    73  // but if this sanity check passes, we'll assume
    74  // the cut and paste from the FIPS PDF worked.
    75  func TestSboxes(t *testing.T) {
    76  	for i := 0; i < 256; i++ {
    77  		if j := sbox0[sbox1[i]]; j != byte(i) {
    78  			t.Errorf("sbox0[sbox1[%#x]] = %#x", i, j)
    79  		}
    80  		if j := sbox1[sbox0[i]]; j != byte(i) {
    81  			t.Errorf("sbox1[sbox0[%#x]] = %#x", i, j)
    82  		}
    83  	}
    84  }
    85  
    86  // Test that encryption tables are correct.
    87  // (Can adapt this code to generate them too.)
    88  func TestTe(t *testing.T) {
    89  	for i := 0; i < 256; i++ {
    90  		s := uint32(sbox0[i])
    91  		s2 := mul(s, 2)
    92  		s3 := mul(s, 3)
    93  		w := s2<<24 | s<<16 | s<<8 | s3
    94  		te := [][256]uint32{te0, te1, te2, te3}
    95  		for j := 0; j < 4; j++ {
    96  			if x := te[j][i]; x != w {
    97  				t.Fatalf("te[%d][%d] = %#x, want %#x", j, i, x, w)
    98  			}
    99  			w = w<<24 | w>>8
   100  		}
   101  	}
   102  }
   103  
   104  // Test that decryption tables are correct.
   105  // (Can adapt this code to generate them too.)
   106  func TestTd(t *testing.T) {
   107  	for i := 0; i < 256; i++ {
   108  		s := uint32(sbox1[i])
   109  		s9 := mul(s, 0x9)
   110  		sb := mul(s, 0xb)
   111  		sd := mul(s, 0xd)
   112  		se := mul(s, 0xe)
   113  		w := se<<24 | s9<<16 | sd<<8 | sb
   114  		td := [][256]uint32{td0, td1, td2, td3}
   115  		for j := 0; j < 4; j++ {
   116  			if x := td[j][i]; x != w {
   117  				t.Fatalf("td[%d][%d] = %#x, want %#x", j, i, x, w)
   118  			}
   119  			w = w<<24 | w>>8
   120  		}
   121  	}
   122  }
   123  
   124  // Test vectors are from FIPS 197:
   125  //	http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf
   126  
   127  // Appendix A of FIPS 197: Key expansion examples
   128  type KeyTest struct {
   129  	key []byte
   130  	enc []uint32
   131  	dec []uint32 // decryption expansion; not in FIPS 197, computed from C implementation.
   132  }
   133  
   134  var keyTests = []KeyTest{
   135  	{
   136  		// A.1.  Expansion of a 128-bit Cipher Key
   137  		[]byte{0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c},
   138  		[]uint32{
   139  			0x2b7e1516, 0x28aed2a6, 0xabf71588, 0x09cf4f3c,
   140  			0xa0fafe17, 0x88542cb1, 0x23a33939, 0x2a6c7605,
   141  			0xf2c295f2, 0x7a96b943, 0x5935807a, 0x7359f67f,
   142  			0x3d80477d, 0x4716fe3e, 0x1e237e44, 0x6d7a883b,
   143  			0xef44a541, 0xa8525b7f, 0xb671253b, 0xdb0bad00,
   144  			0xd4d1c6f8, 0x7c839d87, 0xcaf2b8bc, 0x11f915bc,
   145  			0x6d88a37a, 0x110b3efd, 0xdbf98641, 0xca0093fd,
   146  			0x4e54f70e, 0x5f5fc9f3, 0x84a64fb2, 0x4ea6dc4f,
   147  			0xead27321, 0xb58dbad2, 0x312bf560, 0x7f8d292f,
   148  			0xac7766f3, 0x19fadc21, 0x28d12941, 0x575c006e,
   149  			0xd014f9a8, 0xc9ee2589, 0xe13f0cc8, 0xb6630ca6,
   150  		},
   151  		[]uint32{
   152  			0xd014f9a8, 0xc9ee2589, 0xe13f0cc8, 0xb6630ca6,
   153  			0xc7b5a63, 0x1319eafe, 0xb0398890, 0x664cfbb4,
   154  			0xdf7d925a, 0x1f62b09d, 0xa320626e, 0xd6757324,
   155  			0x12c07647, 0xc01f22c7, 0xbc42d2f3, 0x7555114a,
   156  			0x6efcd876, 0xd2df5480, 0x7c5df034, 0xc917c3b9,
   157  			0x6ea30afc, 0xbc238cf6, 0xae82a4b4, 0xb54a338d,
   158  			0x90884413, 0xd280860a, 0x12a12842, 0x1bc89739,
   159  			0x7c1f13f7, 0x4208c219, 0xc021ae48, 0x969bf7b,
   160  			0xcc7505eb, 0x3e17d1ee, 0x82296c51, 0xc9481133,
   161  			0x2b3708a7, 0xf262d405, 0xbc3ebdbf, 0x4b617d62,
   162  			0x2b7e1516, 0x28aed2a6, 0xabf71588, 0x9cf4f3c,
   163  		},
   164  	},
   165  	{
   166  		// A.2.  Expansion of a 192-bit Cipher Key
   167  		[]byte{
   168  			0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
   169  			0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b,
   170  		},
   171  		[]uint32{
   172  			0x8e73b0f7, 0xda0e6452, 0xc810f32b, 0x809079e5,
   173  			0x62f8ead2, 0x522c6b7b, 0xfe0c91f7, 0x2402f5a5,
   174  			0xec12068e, 0x6c827f6b, 0x0e7a95b9, 0x5c56fec2,
   175  			0x4db7b4bd, 0x69b54118, 0x85a74796, 0xe92538fd,
   176  			0xe75fad44, 0xbb095386, 0x485af057, 0x21efb14f,
   177  			0xa448f6d9, 0x4d6dce24, 0xaa326360, 0x113b30e6,
   178  			0xa25e7ed5, 0x83b1cf9a, 0x27f93943, 0x6a94f767,
   179  			0xc0a69407, 0xd19da4e1, 0xec1786eb, 0x6fa64971,
   180  			0x485f7032, 0x22cb8755, 0xe26d1352, 0x33f0b7b3,
   181  			0x40beeb28, 0x2f18a259, 0x6747d26b, 0x458c553e,
   182  			0xa7e1466c, 0x9411f1df, 0x821f750a, 0xad07d753,
   183  			0xca400538, 0x8fcc5006, 0x282d166a, 0xbc3ce7b5,
   184  			0xe98ba06f, 0x448c773c, 0x8ecc7204, 0x01002202,
   185  		},
   186  		nil,
   187  	},
   188  	{
   189  		// A.3.  Expansion of a 256-bit Cipher Key
   190  		[]byte{
   191  			0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
   192  			0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4,
   193  		},
   194  		[]uint32{
   195  			0x603deb10, 0x15ca71be, 0x2b73aef0, 0x857d7781,
   196  			0x1f352c07, 0x3b6108d7, 0x2d9810a3, 0x0914dff4,
   197  			0x9ba35411, 0x8e6925af, 0xa51a8b5f, 0x2067fcde,
   198  			0xa8b09c1a, 0x93d194cd, 0xbe49846e, 0xb75d5b9a,
   199  			0xd59aecb8, 0x5bf3c917, 0xfee94248, 0xde8ebe96,
   200  			0xb5a9328a, 0x2678a647, 0x98312229, 0x2f6c79b3,
   201  			0x812c81ad, 0xdadf48ba, 0x24360af2, 0xfab8b464,
   202  			0x98c5bfc9, 0xbebd198e, 0x268c3ba7, 0x09e04214,
   203  			0x68007bac, 0xb2df3316, 0x96e939e4, 0x6c518d80,
   204  			0xc814e204, 0x76a9fb8a, 0x5025c02d, 0x59c58239,
   205  			0xde136967, 0x6ccc5a71, 0xfa256395, 0x9674ee15,
   206  			0x5886ca5d, 0x2e2f31d7, 0x7e0af1fa, 0x27cf73c3,
   207  			0x749c47ab, 0x18501dda, 0xe2757e4f, 0x7401905a,
   208  			0xcafaaae3, 0xe4d59b34, 0x9adf6ace, 0xbd10190d,
   209  			0xfe4890d1, 0xe6188d0b, 0x046df344, 0x706c631e,
   210  		},
   211  		nil,
   212  	},
   213  }
   214  
   215  // Test key expansion against FIPS 197 examples.
   216  func TestExpandKey(t *testing.T) {
   217  L:
   218  	for i, tt := range keyTests {
   219  		enc := make([]uint32, len(tt.enc))
   220  		var dec []uint32
   221  		if tt.dec != nil {
   222  			dec = make([]uint32, len(tt.dec))
   223  		}
   224  		// This test could only test Go version of expandKey because asm
   225  		// version might use different memory layout for expanded keys
   226  		// This is OK because we don't expose expanded keys to the outside
   227  		expandKeyGo(tt.key, enc, dec)
   228  		for j, v := range enc {
   229  			if v != tt.enc[j] {
   230  				t.Errorf("key %d: enc[%d] = %#x, want %#x", i, j, v, tt.enc[j])
   231  				continue L
   232  			}
   233  		}
   234  		if dec != nil {
   235  			for j, v := range dec {
   236  				if v != tt.dec[j] {
   237  					t.Errorf("key %d: dec[%d] = %#x, want %#x", i, j, v, tt.dec[j])
   238  					continue L
   239  				}
   240  			}
   241  		}
   242  	}
   243  }
   244  
   245  // Appendix B, C of FIPS 197: Cipher examples, Example vectors.
   246  type CryptTest struct {
   247  	key []byte
   248  	in  []byte
   249  	out []byte
   250  }
   251  
   252  var encryptTests = []CryptTest{
   253  	{
   254  		// Appendix B.
   255  		[]byte{0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c},
   256  		[]byte{0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d, 0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34},
   257  		[]byte{0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb, 0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32},
   258  	},
   259  	{
   260  		// Appendix C.1.  AES-128
   261  		[]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f},
   262  		[]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
   263  		[]byte{0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30, 0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a},
   264  	},
   265  	{
   266  		// Appendix C.2.  AES-192
   267  		[]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   268  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   269  		},
   270  		[]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
   271  		[]byte{0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0, 0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91},
   272  	},
   273  	{
   274  		// Appendix C.3.  AES-256
   275  		[]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   276  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   277  		},
   278  		[]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
   279  		[]byte{0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf, 0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89},
   280  	},
   281  }
   282  
   283  // Test Cipher Encrypt method against FIPS 197 examples.
   284  func TestCipherEncrypt(t *testing.T) {
   285  	for i, tt := range encryptTests {
   286  		c, err := NewCipher(tt.key)
   287  		if err != nil {
   288  			t.Errorf("NewCipher(%d bytes) = %s", len(tt.key), err)
   289  			continue
   290  		}
   291  		out := make([]byte, len(tt.in))
   292  		c.Encrypt(out, tt.in)
   293  		for j, v := range out {
   294  			if v != tt.out[j] {
   295  				t.Errorf("Cipher.Encrypt %d: out[%d] = %#x, want %#x", i, j, v, tt.out[j])
   296  				break
   297  			}
   298  		}
   299  	}
   300  }
   301  
   302  // Test Cipher Decrypt against FIPS 197 examples.
   303  func TestCipherDecrypt(t *testing.T) {
   304  	for i, tt := range encryptTests {
   305  		c, err := NewCipher(tt.key)
   306  		if err != nil {
   307  			t.Errorf("NewCipher(%d bytes) = %s", len(tt.key), err)
   308  			continue
   309  		}
   310  		plain := make([]byte, len(tt.in))
   311  		c.Decrypt(plain, tt.out)
   312  		for j, v := range plain {
   313  			if v != tt.in[j] {
   314  				t.Errorf("decryptBlock %d: plain[%d] = %#x, want %#x", i, j, v, tt.in[j])
   315  				break
   316  			}
   317  		}
   318  	}
   319  }
   320  
   321  // Test short input/output.
   322  // Assembly used to not notice.
   323  // See issue 7928.
   324  func TestShortBlocks(t *testing.T) {
   325  	bytes := func(n int) []byte { return make([]byte, n) }
   326  
   327  	c, _ := NewCipher(bytes(16))
   328  
   329  	mustPanic(t, "crypto/aes: input not full block", func() { c.Encrypt(bytes(1), bytes(1)) })
   330  	mustPanic(t, "crypto/aes: input not full block", func() { c.Decrypt(bytes(1), bytes(1)) })
   331  	mustPanic(t, "crypto/aes: input not full block", func() { c.Encrypt(bytes(100), bytes(1)) })
   332  	mustPanic(t, "crypto/aes: input not full block", func() { c.Decrypt(bytes(100), bytes(1)) })
   333  	mustPanic(t, "crypto/aes: output not full block", func() { c.Encrypt(bytes(1), bytes(100)) })
   334  	mustPanic(t, "crypto/aes: output not full block", func() { c.Decrypt(bytes(1), bytes(100)) })
   335  }
   336  
   337  func mustPanic(t *testing.T, msg string, f func()) {
   338  	defer func() {
   339  		err := recover()
   340  		if err == nil {
   341  			t.Errorf("function did not panic, wanted %q", msg)
   342  		} else if err != msg {
   343  			t.Errorf("got panic %v, wanted %q", err, msg)
   344  		}
   345  	}()
   346  	f()
   347  }
   348  
   349  func BenchmarkEncrypt(b *testing.B) {
   350  	tt := encryptTests[0]
   351  	c, err := NewCipher(tt.key)
   352  	if err != nil {
   353  		b.Fatal("NewCipher:", err)
   354  	}
   355  	out := make([]byte, len(tt.in))
   356  	b.SetBytes(int64(len(out)))
   357  	b.ResetTimer()
   358  	for i := 0; i < b.N; i++ {
   359  		c.Encrypt(out, tt.in)
   360  	}
   361  }
   362  
   363  func BenchmarkDecrypt(b *testing.B) {
   364  	tt := encryptTests[0]
   365  	c, err := NewCipher(tt.key)
   366  	if err != nil {
   367  		b.Fatal("NewCipher:", err)
   368  	}
   369  	out := make([]byte, len(tt.out))
   370  	b.SetBytes(int64(len(out)))
   371  	b.ResetTimer()
   372  	for i := 0; i < b.N; i++ {
   373  		c.Decrypt(out, tt.out)
   374  	}
   375  }
   376  
   377  func BenchmarkExpand(b *testing.B) {
   378  	tt := encryptTests[0]
   379  	n := len(tt.key) + 28
   380  	c := &aesCipher{make([]uint32, n), make([]uint32, n)}
   381  	b.ResetTimer()
   382  	for i := 0; i < b.N; i++ {
   383  		expandKey(tt.key, c.enc, c.dec)
   384  	}
   385  }