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

     1  // Copyright 2013 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 cipher_test
     6  
     7  import (
     8  	"bytes"
     9  	"crypto/aes"
    10  	"crypto/cipher"
    11  	"crypto/des"
    12  	"testing"
    13  )
    14  
    15  func TestCryptBlocks(t *testing.T) {
    16  	buf := make([]byte, 16)
    17  	block, _ := aes.NewCipher(buf)
    18  
    19  	mode := cipher.NewCBCDecrypter(block, buf)
    20  	mustPanic(t, "crypto/cipher: input not full blocks", func() { mode.CryptBlocks(buf, buf[:3]) })
    21  	mustPanic(t, "crypto/cipher: output smaller than input", func() { mode.CryptBlocks(buf[:3], buf) })
    22  
    23  	mode = cipher.NewCBCEncrypter(block, buf)
    24  	mustPanic(t, "crypto/cipher: input not full blocks", func() { mode.CryptBlocks(buf, buf[:3]) })
    25  	mustPanic(t, "crypto/cipher: output smaller than input", func() { mode.CryptBlocks(buf[:3], buf) })
    26  }
    27  
    28  func mustPanic(t *testing.T, msg string, f func()) {
    29  	defer func() {
    30  		err := recover()
    31  		if err == nil {
    32  			t.Errorf("function did not panic, wanted %q", msg)
    33  		} else if err != msg {
    34  			t.Errorf("got panic %v, wanted %q", err, msg)
    35  		}
    36  	}()
    37  	f()
    38  }
    39  
    40  func TestEmptyPlaintext(t *testing.T) {
    41  	var key [16]byte
    42  	a, err := aes.NewCipher(key[:16])
    43  	if err != nil {
    44  		t.Fatal(err)
    45  	}
    46  	d, err := des.NewCipher(key[:8])
    47  	if err != nil {
    48  		t.Fatal(err)
    49  	}
    50  
    51  	s := 16
    52  	pt := make([]byte, s)
    53  	ct := make([]byte, s)
    54  	for i := 0; i < 16; i++ {
    55  		pt[i], ct[i] = byte(i), byte(i)
    56  	}
    57  
    58  	assertEqual := func(name string, got, want []byte) {
    59  		if !bytes.Equal(got, want) {
    60  			t.Fatalf("%s: got %v, want %v", name, got, want)
    61  		}
    62  	}
    63  
    64  	for _, b := range []cipher.Block{a, d} {
    65  		iv := make([]byte, b.BlockSize())
    66  		cbce := cipher.NewCBCEncrypter(b, iv)
    67  		cbce.CryptBlocks(ct, pt[:0])
    68  		assertEqual("CBC encrypt", ct, pt)
    69  
    70  		cbcd := cipher.NewCBCDecrypter(b, iv)
    71  		cbcd.CryptBlocks(ct, pt[:0])
    72  		assertEqual("CBC decrypt", ct, pt)
    73  
    74  		cfbe := cipher.NewCFBEncrypter(b, iv)
    75  		cfbe.XORKeyStream(ct, pt[:0])
    76  		assertEqual("CFB encrypt", ct, pt)
    77  
    78  		cfbd := cipher.NewCFBDecrypter(b, iv)
    79  		cfbd.XORKeyStream(ct, pt[:0])
    80  		assertEqual("CFB decrypt", ct, pt)
    81  
    82  		ctr := cipher.NewCTR(b, iv)
    83  		ctr.XORKeyStream(ct, pt[:0])
    84  		assertEqual("CTR", ct, pt)
    85  
    86  		ofb := cipher.NewOFB(b, iv)
    87  		ofb.XORKeyStream(ct, pt[:0])
    88  		assertEqual("OFB", ct, pt)
    89  	}
    90  }