lin
2025-06-05 ed3dd9d3e7519a82bb871d5eedb24a2fa0c91f47
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
// Copyright 2013 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 cipher_test
 
import (
   "bytes"
   "crypto/aes"
   "crypto/cipher"
   "crypto/des"
   "testing"
)
 
func TestCryptBlocks(t *testing.T) {
   buf := make([]byte, 16)
   block, _ := aes.NewCipher(buf)
 
   mode := cipher.NewCBCDecrypter(block, buf)
   mustPanic(t, "crypto/cipher: input not full blocks", func() { mode.CryptBlocks(buf, buf[:3]) })
   mustPanic(t, "crypto/cipher: output smaller than input", func() { mode.CryptBlocks(buf[:3], buf) })
 
   mode = cipher.NewCBCEncrypter(block, buf)
   mustPanic(t, "crypto/cipher: input not full blocks", func() { mode.CryptBlocks(buf, buf[:3]) })
   mustPanic(t, "crypto/cipher: output smaller than input", func() { mode.CryptBlocks(buf[:3], buf) })
}
 
func mustPanic(t *testing.T, msg string, f func()) {
   defer func() {
       err := recover()
       if err == nil {
           t.Errorf("function did not panic, wanted %q", msg)
       } else if err != msg {
           t.Errorf("got panic %v, wanted %q", err, msg)
       }
   }()
   f()
}
 
func TestEmptyPlaintext(t *testing.T) {
   var key [16]byte
   a, err := aes.NewCipher(key[:16])
   if err != nil {
       t.Fatal(err)
   }
   d, err := des.NewCipher(key[:8])
   if err != nil {
       t.Fatal(err)
   }
 
   s := 16
   pt := make([]byte, s)
   ct := make([]byte, s)
   for i := 0; i < 16; i++ {
       pt[i], ct[i] = byte(i), byte(i)
   }
 
   assertEqual := func(name string, got, want []byte) {
       if !bytes.Equal(got, want) {
           t.Fatalf("%s: got %v, want %v", name, got, want)
       }
   }
 
   for _, b := range []cipher.Block{a, d} {
       iv := make([]byte, b.BlockSize())
       cbce := cipher.NewCBCEncrypter(b, iv)
       cbce.CryptBlocks(ct, pt[:0])
       assertEqual("CBC encrypt", ct, pt)
 
       cbcd := cipher.NewCBCDecrypter(b, iv)
       cbcd.CryptBlocks(ct, pt[:0])
       assertEqual("CBC decrypt", ct, pt)
 
       cfbe := cipher.NewCFBEncrypter(b, iv)
       cfbe.XORKeyStream(ct, pt[:0])
       assertEqual("CFB encrypt", ct, pt)
 
       cfbd := cipher.NewCFBDecrypter(b, iv)
       cfbd.XORKeyStream(ct, pt[:0])
       assertEqual("CFB decrypt", ct, pt)
 
       ctr := cipher.NewCTR(b, iv)
       ctr.XORKeyStream(ct, pt[:0])
       assertEqual("CTR", ct, pt)
 
       ofb := cipher.NewOFB(b, iv)
       ofb.XORKeyStream(ct, pt[:0])
       assertEqual("OFB", ct, pt)
   }
}