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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// // Copyright 2010 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/rand"
// "encoding/hex"
// "testing"
// )
// // cfbTests contains the test vectors from
// // https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section
// // F.3.13.
// var cfbTests = []struct {
// key, iv, plaintext, ciphertext string
// }{
// {
// "2b7e151628aed2a6abf7158809cf4f3c",
// "000102030405060708090a0b0c0d0e0f",
// "6bc1bee22e409f96e93d7e117393172a",
// "3b3fd92eb72dad20333449f8e83cfb4a",
// },
// {
// "2b7e151628aed2a6abf7158809cf4f3c",
// "3B3FD92EB72DAD20333449F8E83CFB4A",
// "ae2d8a571e03ac9c9eb76fac45af8e51",
// "c8a64537a0b3a93fcde3cdad9f1ce58b",
// },
// {
// "2b7e151628aed2a6abf7158809cf4f3c",
// "C8A64537A0B3A93FCDE3CDAD9F1CE58B",
// "30c81c46a35ce411e5fbc1191a0a52ef",
// "26751f67a3cbb140b1808cf187a4f4df",
// },
// {
// "2b7e151628aed2a6abf7158809cf4f3c",
// "26751F67A3CBB140B1808CF187A4F4DF",
// "f69f2445df4f9b17ad2b417be66c3710",
// "c04b05357c5d1c0eeac4c66f9ff7f2e6",
// },
// }
// func TestCFBVectors(t *testing.T) {
// for i, test := range cfbTests {
// key, err := hex.DecodeString(test.key)
// if err != nil {
// t.Fatal(err)
// }
// iv, err := hex.DecodeString(test.iv)
// if err != nil {
// t.Fatal(err)
// }
// plaintext, err := hex.DecodeString(test.plaintext)
// if err != nil {
// t.Fatal(err)
// }
// expected, err := hex.DecodeString(test.ciphertext)
// if err != nil {
// t.Fatal(err)
// }
// block, err := aes.NewCipher(key)
// if err != nil {
// t.Fatal(err)
// }
// ciphertext := make([]byte, len(plaintext))
// cfb := cipher.NewCFBEncrypter(block, iv)
// cfb.xor_key_stream(ciphertext, plaintext)
// if !bytes.Equal(ciphertext, expected) {
// t.Errorf("#%d: wrong output: got %x, expected %x", i, ciphertext, expected)
// }
// cfbdec := cipher.NewCFBDecrypter(block, iv)
// plaintextCopy := make([]byte, len(ciphertext))
// cfbdec.xor_key_stream(plaintextCopy, ciphertext)
// if !bytes.Equal(plaintextCopy, plaintext) {
// t.Errorf("#%d: wrong plaintext: got %x, expected %x", i, plaintextCopy, plaintext)
// }
// }
// }
// func TestCFBInverse(t *testing.T) {
// block, err := aes.NewCipher(commonKey128)
// if err != nil {
// t.Error(err)
// return
// }
// plaintext := []byte("this is the plaintext. this is the plaintext.")
// iv := make([]byte, block.block_size())
// rand.Reader.Read(iv)
// cfb := cipher.NewCFBEncrypter(block, iv)
// ciphertext := make([]byte, len(plaintext))
// copy(ciphertext, plaintext)
// cfb.xor_key_stream(ciphertext, ciphertext)
// cfbdec := cipher.NewCFBDecrypter(block, iv)
// plaintextCopy := make([]byte, len(plaintext))
// copy(plaintextCopy, ciphertext)
// cfbdec.xor_key_stream(plaintextCopy, plaintextCopy)
// if !bytes.Equal(plaintextCopy, plaintext) {
// t.Errorf("got: %x, want: %x", plaintextCopy, plaintext)
// }
// }