// in U.S. Federal Information Processing Standards Publication 46-3.
package des
-// Used to perform an initial permutation of a
-// 64-bit input block
-var initialPermutation = [64]uint8{
- 58, 50, 42, 34, 26, 18, 10, 2,
- 60, 52, 44, 36, 28, 20, 12, 4,
- 62, 54, 46, 38, 30, 22, 14, 6,
- 64, 56, 48, 40, 32, 24, 16, 8,
- 57, 49, 41, 33, 25, 17, 9, 1,
- 59, 51, 43, 35, 27, 19, 11, 3,
- 61, 53, 45, 37, 29, 21, 13, 5,
- 63, 55, 47, 39, 31, 23, 15, 7}
+// Used to perform an initial permutation of a 64-bit input block.
+var initialPermutation = [64]byte{
+ 6, 14, 22, 30, 38, 46, 54, 62,
+ 4, 12, 20, 28, 36, 44, 52, 60,
+ 2, 10, 18, 26, 34, 42, 50, 58,
+ 0, 8, 16, 24, 32, 40, 48, 56,
+ 7, 15, 23, 31, 39, 47, 55, 63,
+ 5, 13, 21, 29, 37, 45, 53, 61,
+ 3, 11, 19, 27, 35, 43, 51, 59,
+ 1, 9, 17, 25, 33, 41, 49, 57,
+}
-// Used to perform a final permutation of a
-// 64-bit preoutput block
-// This is the inverse of initialPermutation
-var finalPermutation = [64]uint8{
- 40, 8, 48, 16, 56, 24, 64, 32,
- 39, 7, 47, 15, 55, 23, 63, 31,
- 38, 6, 46, 14, 54, 22, 62, 30,
- 37, 5, 45, 13, 53, 21, 61, 29,
- 36, 4, 44, 12, 52, 20, 60, 28,
- 35, 3, 43, 11, 51, 19, 59, 27,
- 34, 2, 42, 10, 50, 18, 58, 26,
- 33, 1, 41, 9, 49, 17, 57, 25}
+// Used to perform a final permutation of a 4-bit preoutput block. This is the
+// inverse of initialPermutation
+var finalPermutation = [64]byte{
+ 24, 56, 16, 48, 8, 40, 0, 32,
+ 25, 57, 17, 49, 9, 41, 1, 33,
+ 26, 58, 18, 50, 10, 42, 2, 34,
+ 27, 59, 19, 51, 11, 43, 3, 35,
+ 28, 60, 20, 52, 12, 44, 4, 36,
+ 29, 61, 21, 53, 13, 45, 5, 37,
+ 30, 62, 22, 54, 14, 46, 6, 38,
+ 31, 63, 23, 55, 15, 47, 7, 39,
+}
-// Used to expand an input block of 32 bits,
-// producing an output block of 48 bits.
-var expansionFunction = [48]uint8{
- 32, 1, 2, 3, 4, 5,
- 4, 5, 6, 7, 8, 9,
- 8, 9, 10, 11, 12, 13,
- 12, 13, 14, 15, 16, 17,
- 16, 17, 18, 19, 20, 21,
- 20, 21, 22, 23, 24, 25,
- 24, 25, 26, 27, 28, 29,
- 28, 29, 30, 31, 32, 1}
+// Used to expand an input block of 32 bits, producing an output block of 48
+// bits.
+var expansionFunction = [48]byte{
+ 0, 31, 30, 29, 28, 27, 28, 27,
+ 26, 25, 24, 23, 24, 23, 22, 21,
+ 20, 19, 20, 19, 18, 17, 16, 15,
+ 16, 15, 14, 13, 12, 11, 12, 11,
+ 10, 9, 8, 7, 8, 7, 6, 5,
+ 4, 3, 4, 3, 2, 1, 0, 31,
+}
// Yields a 32-bit output from a 32-bit input
-var permutationFunction = [32]uint8{
- 16, 7, 20, 21,
- 29, 12, 28, 17,
- 1, 15, 23, 26,
- 5, 18, 31, 10,
- 2, 8, 24, 14,
- 32, 27, 3, 9,
- 19, 13, 30, 6,
- 22, 11, 4, 25}
+var permutationFunction = [32]byte{
+ 16, 25, 12, 11, 3, 20, 4, 15,
+ 31, 17, 9, 6, 27, 14, 1, 22,
+ 30, 24, 8, 18, 0, 5, 29, 23,
+ 13, 19, 2, 26, 10, 21, 28, 7,
+}
// Used in the key schedule to select 56 bits
// from a 64-bit input.
-var permutedChoice1 = [56]uint8{
- // left
- 57, 49, 41, 33, 25, 17, 9,
- 1, 58, 50, 42, 34, 26, 18,
- 10, 2, 59, 51, 43, 35, 27,
- 19, 11, 3, 60, 52, 44, 36,
- // right
- 63, 55, 47, 39, 31, 23, 15,
- 7, 62, 54, 46, 38, 30, 22,
- 14, 6, 61, 53, 45, 37, 29,
- 21, 13, 5, 28, 20, 12, 4}
+var permutedChoice1 = [56]byte{
+ 7, 15, 23, 31, 39, 47, 55, 63,
+ 6, 14, 22, 30, 38, 46, 54, 62,
+ 5, 13, 21, 29, 37, 45, 53, 61,
+ 4, 12, 20, 28, 1, 9, 17, 25,
+ 33, 41, 49, 57, 2, 10, 18, 26,
+ 34, 42, 50, 58, 3, 11, 19, 27,
+ 35, 43, 51, 59, 36, 44, 52, 60,
+}
-// Used in the key schedule to produce
-// each subkey by selecting 48 bits
-// from the 56-bit input
-var permutedChoice2 = [48]uint8{
- 14, 17, 11, 24, 1, 5,
- 3, 28, 15, 6, 21, 10,
- 23, 19, 12, 4, 26, 8,
- 16, 7, 27, 20, 13, 2,
- 41, 52, 31, 37, 47, 55,
- 30, 40, 51, 45, 33, 48,
- 44, 49, 39, 56, 34, 53,
- 46, 42, 50, 36, 29, 32}
+// Used in the key schedule to produce each subkey by selecting 48 bits from
+// the 56-bit input
+var permutedChoice2 = [48]byte{
+ 42, 39, 45, 32, 55, 51, 53, 28,
+ 41, 50, 35, 46, 33, 37, 44, 52,
+ 30, 48, 40, 49, 29, 36, 43, 54,
+ 15, 4, 25, 19, 9, 1, 26, 16,
+ 5, 11, 23, 8, 12, 7, 17, 0,
+ 22, 3, 10, 14, 6, 20, 27, 24,
+}
// 8 S-boxes composed of 4 rows and 16 columns
// Used in the DES cipher function
var sBoxes = [8][4][16]uint8{
// S-box 1
{
- [16]uint8{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
- [16]uint8{0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
- [16]uint8{4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
- [16]uint8{15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}},
+ {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
+ {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
+ {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
+ {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13},
+ },
// S-box 2
{
- [16]uint8{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10},
- [16]uint8{3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5},
- [16]uint8{0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15},
- [16]uint8{13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}},
+ {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10},
+ {3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5},
+ {0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15},
+ {13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9},
+ },
// S-box 3
{
- [16]uint8{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8},
- [16]uint8{13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1},
- [16]uint8{13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7},
- [16]uint8{1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}},
+ {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8},
+ {13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1},
+ {13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7},
+ {1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12},
+ },
// S-box 4
{
- [16]uint8{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15},
- [16]uint8{13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9},
- [16]uint8{10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4},
- [16]uint8{3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14}},
+ {7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15},
+ {13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9},
+ {10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4},
+ {3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14},
+ },
// S-box 5
{
- [16]uint8{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9},
- [16]uint8{14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6},
- [16]uint8{4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14},
- [16]uint8{11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}},
+ {2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9},
+ {14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6},
+ {4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14},
+ {11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3},
+ },
// S-box 6
{
- [16]uint8{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11},
- [16]uint8{10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8},
- [16]uint8{9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6},
- [16]uint8{4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13}},
+ {12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11},
+ {10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8},
+ {9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6},
+ {4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13},
+ },
// S-box 7
{
- [16]uint8{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1},
- [16]uint8{13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6},
- [16]uint8{1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2},
- [16]uint8{6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}},
+ {4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1},
+ {13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6},
+ {1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2},
+ {6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12},
+ },
// S-box 8
{
- [16]uint8{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7},
- [16]uint8{1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2},
- [16]uint8{7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8},
- [16]uint8{2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}}}
+ {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7},
+ {1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2},
+ {7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8},
+ {2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11},
+ },
+}
// Size of left rotation per round in each half of the key schedule
var ksRotations = [16]uint8{1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}
-// Copyright 2010 The Go Authors. All rights reserved.
+// Copyright 2011 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 des
import (
+ "bytes"
"testing"
)
func TestWeakKeys(t *testing.T) {
for i, tt := range weakKeyTests {
var encrypt = func(in []byte) (out []byte) {
- c := &DESCipher{tt.key, [16]uint64{}}
- ksGenerateSubkeys(c)
+ c, _ := NewCipher(tt.key)
out = make([]byte, len(in))
- encryptBlock(c.subkeys, out, in)
+ encryptBlock(c.subkeys[:], out, in)
return
}
result := encrypt(tt.in)
result = encrypt(result)
- for j, v := range result {
- if v != tt.in[j] {
- t.Errorf("weak key test %d: result[%d] = %#x, want %#x", i, j, v, tt.in[j])
- break
- }
+ if !bytes.Equal(result, tt.in) {
+ t.Errorf("#%d: result: %x want: %x", i, result, tt.in)
}
}
}
func TestSemiWeakKeyPairs(t *testing.T) {
for i, tt := range semiWeakKeyTests {
var encrypt = func(key, in []byte) (out []byte) {
- c := &DESCipher{key, [16]uint64{}}
- ksGenerateSubkeys(c)
+ c, _ := NewCipher(key)
out = make([]byte, len(in))
- encryptBlock(c.subkeys, out, in)
+ encryptBlock(c.subkeys[:], out, in)
return
}
result := encrypt(tt.key, tt.in)
result = encrypt(tt.out, result)
- for j, v := range result {
- if v != tt.in[j] {
- t.Errorf("semi weak key test %d: result[%d] = %#x, want %#x", i, j, v, tt.in[j])
- break
- }
+ if !bytes.Equal(result, tt.in) {
+ t.Errorf("#%d: result: %x want: %x", i, result, tt.in)
}
}
}
func TestDESEncryptBlock(t *testing.T) {
for i, tt := range encryptDESTests {
- c := &DESCipher{tt.key, [16]uint64{}}
- ksGenerateSubkeys(c)
+ c, _ := NewCipher(tt.key)
out := make([]byte, len(tt.in))
- encryptBlock(c.subkeys, out, tt.in)
+ encryptBlock(c.subkeys[:], out, tt.in)
- for j, v := range out {
- if v != tt.out[j] {
- t.Errorf("encryptBlock %d: out[%d] = %#x, want %#x", i, j, v, tt.out[j])
- break
- }
+ if !bytes.Equal(out, tt.out) {
+ t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
}
}
}
func TestDESDecryptBlock(t *testing.T) {
for i, tt := range encryptDESTests {
- c := &DESCipher{tt.key, [16]uint64{}}
- ksGenerateSubkeys(c)
+ c, _ := NewCipher(tt.key)
plain := make([]byte, len(tt.in))
- decryptBlock(c.subkeys, plain, tt.out)
+ decryptBlock(c.subkeys[:], plain, tt.out)
- for j, v := range plain {
- if v != tt.in[j] {
- t.Errorf("decryptBlock %d: plain[%d] = %#x, want %#x", i, j, v, tt.in[j])
- break
- }
+ if !bytes.Equal(plain, tt.in) {
+ t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
}
}
}
func TestEncryptTripleDES(t *testing.T) {
for i, tt := range encryptTripleDESTests {
- cipher1, _ := NewDESCipher(tt.key[0:8])
- cipher2, _ := NewDESCipher(tt.key[8:16])
- cipher3, _ := NewDESCipher(tt.key[16:])
- c := &TripleDESCipher{tt.key, cipher1, cipher2, cipher3}
-
+ c, _ := NewTripleDESCipher(tt.key)
out := make([]byte, len(tt.in))
c.Encrypt(out, tt.in)
- for j, v := range out {
- if v != tt.out[j] {
- t.Errorf("encrypt %d: out[%d] = %#x, want %#x", i, j, v, tt.out[j])
- break
- }
+ if !bytes.Equal(out, tt.out) {
+ t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
}
}
}
func TestDecryptTripleDES(t *testing.T) {
for i, tt := range encryptTripleDESTests {
- cipher1, _ := NewDESCipher(tt.key[0:8])
- cipher2, _ := NewDESCipher(tt.key[8:16])
- cipher3, _ := NewDESCipher(tt.key[16:])
- c := &TripleDESCipher{tt.key, cipher1, cipher2, cipher3}
+ c, _ := NewTripleDESCipher(tt.key)
plain := make([]byte, len(tt.in))
c.Decrypt(plain, tt.out)
- for j, v := range plain {
- if v != tt.in[j] {
- t.Errorf("decrypt %d: plain[%d] = %#x, want %#x", i, j, v, tt.in[j])
- break
- }
+ if !bytes.Equal(plain, tt.in) {
+ t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
}
}
}
// Defined in Pub 800-20
func TestVariablePlaintextKnownAnswer(t *testing.T) {
for i, tt := range tableA1Tests {
- cipher1, _ := NewDESCipher(tableA1Key[0:8])
- cipher2, _ := NewDESCipher(tableA1Key[8:16])
- cipher3, _ := NewDESCipher(tableA1Key[16:])
- c := &TripleDESCipher{tableA1Key, cipher1, cipher2, cipher3}
+ c, _ := NewTripleDESCipher(tableA1Key)
out := make([]byte, len(tt.in))
c.Encrypt(out, tt.in)
- for j, v := range out {
- if v != tt.out[j] {
- t.Errorf("variable plaintext known answer test %d: out[%d] = %#x, want %#x",
- i, j, v, tt.out[j])
- break
- }
+ if !bytes.Equal(out, tt.out) {
+ t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
}
}
}
// Defined in Pub 800-20
func TestVariableCiphertextKnownAnswer(t *testing.T) {
for i, tt := range tableA1Tests {
- cipher1, _ := NewDESCipher(tableA1Key[0:8])
- cipher2, _ := NewDESCipher(tableA1Key[8:16])
- cipher3, _ := NewDESCipher(tableA1Key[16:])
- c := &TripleDESCipher{tableA1Key, cipher1, cipher2, cipher3}
+ c, _ := NewTripleDESCipher(tableA1Key)
- out := make([]byte, len(tt.out))
- c.Decrypt(out, tt.out)
+ plain := make([]byte, len(tt.out))
+ c.Decrypt(plain, tt.out)
- for j, v := range out {
- if v != tt.in[j] {
- t.Errorf("variable ciphertext known answer test %d: in[%d] = %#x, want %#x",
- i, j, v, tt.in[j])
- break
- }
+ if !bytes.Equal(plain, tt.in) {
+ t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
}
}
}
// 0x01... key produces the original plaintext
func TestInversePermutationKnownAnswer(t *testing.T) {
for i, tt := range tableA1Tests {
- cipher1, _ := NewDESCipher(tableA1Key[0:8])
- cipher2, _ := NewDESCipher(tableA1Key[8:16])
- cipher3, _ := NewDESCipher(tableA1Key[16:])
- c := &TripleDESCipher{tableA1Key, cipher1, cipher2, cipher3}
+ c, _ := NewTripleDESCipher(tableA1Key)
- out := make([]byte, len(tt.in))
- c.Encrypt(out, tt.out)
+ plain := make([]byte, len(tt.in))
+ c.Encrypt(plain, tt.out)
- for j, v := range out {
- if v != tt.in[j] {
- t.Errorf("inverse permutation known answer test %d: in[%d] = %#x, want %#x",
- i, j, v, tt.in[j])
- break
- }
+ if !bytes.Equal(plain, tt.in) {
+ t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
}
}
}
// 0x01... key produces the corresponding ciphertext
func TestInitialPermutationKnownAnswer(t *testing.T) {
for i, tt := range tableA1Tests {
- cipher1, _ := NewDESCipher(tableA1Key[0:8])
- cipher2, _ := NewDESCipher(tableA1Key[8:16])
- cipher3, _ := NewDESCipher(tableA1Key[16:])
- c := &TripleDESCipher{tableA1Key, cipher1, cipher2, cipher3}
+ c, _ := NewTripleDESCipher(tableA1Key)
out := make([]byte, len(tt.in))
c.Decrypt(out, tt.in)
- for j, v := range out {
- if v != tt.out[j] {
- t.Errorf("initial permutation known answer test %d: out[%d] = %#x, want %#x",
- i, j, v, tt.out[j])
- break
- }
+ if !bytes.Equal(out, tt.out) {
+ t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
}
}
}
// Defined in Pub 800-20
func TestVariableKeyKnownAnswerEncrypt(t *testing.T) {
for i, tt := range tableA2Tests {
- cipher1, _ := NewDESCipher(tt.key[0:8])
- cipher2, _ := NewDESCipher(tt.key[8:16])
- cipher3, _ := NewDESCipher(tt.key[16:])
- c := &TripleDESCipher{tt.key, cipher1, cipher2, cipher3}
+ c, _ := NewTripleDESCipher(tt.key)
out := make([]byte, len(tableA2Plaintext))
c.Encrypt(out, tableA2Plaintext)
- for j, v := range out {
- if v != tt.out[j] {
- t.Errorf("variable key known answer encrypt test %d: out[%d] = %#x, want %#x",
- i, j, v, tt.out[j])
- break
- }
+ if !bytes.Equal(out, tt.out) {
+ t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
}
}
}
// Defined in Pub 800-20
func TestVariableKeyKnownAnswerDecrypt(t *testing.T) {
for i, tt := range tableA2Tests {
- cipher1, _ := NewDESCipher(tt.key[0:8])
- cipher2, _ := NewDESCipher(tt.key[8:16])
- cipher3, _ := NewDESCipher(tt.key[16:])
- c := &TripleDESCipher{tt.key, cipher1, cipher2, cipher3}
+ c, _ := NewTripleDESCipher(tt.key)
out := make([]byte, len(tt.out))
c.Decrypt(out, tt.out)
- for j, v := range out {
- if v != tableA2Plaintext[j] {
- t.Errorf("variable key known answer decrypt test %d: out[%d] = %#x, want %#x",
- i, j, v, tableA2Plaintext[j])
- break
- }
+ if !bytes.Equal(out, tableA2Plaintext) {
+ t.Errorf("#%d: result: %x want: %x", i, out, tableA2Plaintext)
}
}
}
// Defined in Pub 800-20
func TestPermutationOperationKnownAnswerEncrypt(t *testing.T) {
for i, tt := range tableA3Tests {
- cipher1, _ := NewDESCipher(tt.key[0:8])
- cipher2, _ := NewDESCipher(tt.key[8:16])
- cipher3, _ := NewDESCipher(tt.key[16:])
- c := &TripleDESCipher{tt.key, cipher1, cipher2, cipher3}
+ c, _ := NewTripleDESCipher(tt.key)
out := make([]byte, len(tableA3Plaintext))
c.Encrypt(out, tableA3Plaintext)
- for j, v := range out {
- if v != tt.out[j] {
- t.Errorf("permutation operation known answer encrypt test %d: out[%d] = %#x, want %#x",
- i, j, v, tt.out[j])
- break
- }
+ if !bytes.Equal(out, tt.out) {
+ t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
}
}
}
// Defined in Pub 800-20
func TestPermutationOperationKnownAnswerDecrypt(t *testing.T) {
for i, tt := range tableA3Tests {
- cipher1, _ := NewDESCipher(tt.key[0:8])
- cipher2, _ := NewDESCipher(tt.key[8:16])
- cipher3, _ := NewDESCipher(tt.key[16:])
- c := &TripleDESCipher{tt.key, cipher1, cipher2, cipher3}
+ c, _ := NewTripleDESCipher(tt.key)
out := make([]byte, len(tt.out))
c.Decrypt(out, tt.out)
- for j, v := range out {
- if v != tableA3Plaintext[j] {
- t.Errorf("permutation operation known answer decrypt test %d: out[%d] = %#x, want %#x",
- i, j, v, tableA3Plaintext[j])
- break
- }
+ if !bytes.Equal(out, tableA3Plaintext) {
+ t.Errorf("#%d: result: %x want: %x", i, out, tableA3Plaintext)
}
}
}
// Defined in Pub 800-20
func TestSubstitutionTableKnownAnswerEncrypt(t *testing.T) {
for i, tt := range tableA4Tests {
- cipher1, _ := NewDESCipher(tt.key[0:8])
- cipher2, _ := NewDESCipher(tt.key[8:16])
- cipher3, _ := NewDESCipher(tt.key[16:])
- c := &TripleDESCipher{tt.key, cipher1, cipher2, cipher3}
+ c, _ := NewTripleDESCipher(tt.key)
out := make([]byte, len(tt.in))
c.Encrypt(out, tt.in)
- for j, v := range out {
- if v != tt.out[j] {
- t.Errorf("substitution table known answer encrypt test %d: out[%d] = %#x, want %#x",
- i, j, v, tt.out[j])
- break
- }
+ if !bytes.Equal(out, tt.out) {
+ t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
}
}
}
// Defined in Pub 800-20
func TestSubstitutionTableKnownAnswerDecrypt(t *testing.T) {
for i, tt := range tableA4Tests {
- cipher1, _ := NewDESCipher(tt.key[0:8])
- cipher2, _ := NewDESCipher(tt.key[8:16])
- cipher3, _ := NewDESCipher(tt.key[16:])
- c := &TripleDESCipher{tt.key, cipher1, cipher2, cipher3}
+ c, _ := NewTripleDESCipher(tt.key)
out := make([]byte, len(tt.out))
c.Decrypt(out, tt.out)
- for j, v := range out {
- if v != tt.in[j] {
- t.Errorf("substitution table known answer decrypt test %d: out[%d] = %#x, want %#x",
- i, j, v, tt.in[j])
- break
- }
+ if !bytes.Equal(out, tt.in) {
+ t.Errorf("#%d: result: %x want: %x", i, out, tt.in)
}
}
}